/********* BEGIN: jt_.VuMgr *******/
jt_.VuMgr = function(dummy, vuDivWrap, vuClassName) {
	this._vuDivWrap = vuDivWrap;
	this._vuClassName = vuClassName;
	this.vuDivs = {};
	var _this = this;

		function findViews(ofNode) {
			if (ofNode.hasChildNodes()) {
				for (var i=0; i<ofNode.childNodes.length; i++) {
					if (jt_.cssClass.asObj(ofNode.childNodes[i])[vuClassName]) {
						ofNode.childNodes[i]._jt_VuMg = _this;
						_this.vuDivs[ofNode.childNodes[i].getAttribute('jt_uid')] = ofNode.childNodes[i];
					}
					findViews(ofNode.childNodes[i]);
				}
			}
		}

	findViews(vuDivWrap);
};

jt_.VuMgr.prototype.add = function(uid, txt_html, callFunc) {
	var newVu = document.createElement("div");
	this._vuDivWrap.appendChild(newVu);
	newVu.innerHTML = txt_html;
	newVu.className = this._vuClassName;
	newVu._jt_VuMg = this;
	newVu.setAttribute('jt_uid', uid);
	newVu.setAttribute('contenteditable', "true");
	this.vuDivs[uid] = newVu;
	if (callFunc) callFunc();
};

jt_.VuMgr.prototype.show = function(uid) {
	var _this = this;

		function showOne() {
			for (var prop in _this.vuDivs) {
				jt_.showNoneElm(_this.vuDivs[prop], prop == uid);
			}
		}

	if (this.vuDivs[uid]) showOne();
	else this.add(uid, "<div style='background:#f5f5dc;'><h1>new page</h1><p>your HTML here - uid:" + uid + "</p></div>", showOne);
};

jt_.VuMgr.prototype.get_html = function(uid) {
	return this.vuDivs[uid] ? this.vuDivs[uid].innerHTML : "";
};

jt_.VuMgr.prototype.set_html = function(uid, txt_html) {
	var _this = this;

		function setHTML() {
			_this.vuDivs[uid].innerHTML = txt_html;
		}

	if (this.vuDivs[uid]) setHTML();
	else this.add(uid, "your HTML here - " + uid, setHTML);
};

jt_.VuMgr.prototype.rem = function(uid) {
	if (this.vuDivs[uid]) {
		this._vuDivWrap.removeChild(this.vuDivs[uid]);
		delete this.vuDivs[uid];
	}
};
/********* END: jt_.VuMgr *******/



/********* BEGIN: jt_.NavBar *******/
jt_.NavBar = function(dummy, navDiv, callFunc, vuMgr, specs) {
	this._callFunc = callFunc;
	this._specs = jt_.NavBar.defaultSpecs;
	if (specs) {
		for (var prop in specs) this._specs[prop] = specs[prop];
	}
	this.vuMgr = vuMgr;

	this.navDiv = navDiv;
	this.linkDivs = {};
	var _this = this;
	var vu_on;

		function findLinks(ofNode) {
			if (ofNode.hasChildNodes()) {
				for (var i=0; i<ofNode.childNodes.length; i++) {
					var css = jt_.cssClass.asObj(ofNode.childNodes[i]);
					var found = css[_this._specs.css_lnk] || css[_this._specs.css_lnk_on];
					if (found) {
						jt_.addListener(ofNode.childNodes[i], "click", jt_.NavBar.click);
						ofNode.childNodes[i]._jt_NavBar = _this;
						var uid = ofNode.childNodes[i].getAttribute('jt_uid');
						_this.linkDivs[uid] = ofNode.childNodes[i];
						if (css[_this._specs.css_lnk_on]) {
							vu_on = ofNode.childNodes[i];
						}
					}
					findLinks(ofNode.childNodes[i]);
				}
			}
		}

	findLinks(navDiv);
	this.rowPathMap = jt_.PathMap(this.template(), 'jt_fid');
	for (var prop in this.linkDivs) {
		this.linkDivs[prop].jt_fldMap = jt_.FieldMap(this.linkDivs[prop], this.rowPathMap);
		if (location.hash && !vu_on) {
			if (location.hash == "#" + this.linkDivs[prop].jt_fldMap.lnkTxt.innerHTML) {
				vu_on = this.linkDivs[prop];
			}
		}
	}
	if (!vu_on) {
		vu_on = this.template();
	}
	if (vu_on) {
		this.set(vu_on);
	}
}

jt_.NavBar.prototype.template = function() {
	 // return first link element found, for cloning
	var temp;
	for (var prop in this.linkDivs) {
		temp = this.linkDivs[prop];
		break;
	}
	return temp;
}

jt_.NavBar.prototype.add = function(lnk_val) {

	var _this = this;

		function nextUniq() {
			var isUniq;
			var uid;
			while (!isUniq) {
				uid = _this._specs.uid_prfx + Math.floor(Math.random()*10000);
				isUniq = !_this.linkDivs[uid];
			}
			return uid;
		}

	jt_.showHideElm(this.template(), true);
	var newLnk = this.template().cloneNode(true);
	this.navDiv.appendChild(newLnk);
	newLnk._jt_NavBar = this;
	newLnk.jt_fldMap = jt_.FieldMap(newLnk, this.rowPathMap);
	newLnk.jt_fldMap.lnkTxt.innerHTML = lnk_val;
	jt_.addListener(newLnk, "click", jt_.NavBar.click);
	jt_.cssClass.rpl(newLnk, this._specs.css_lnk_on, this._specs.css_lnk);
	newLnk.setAttribute('jt_fid', "uid");
	var uid = nextUniq();
	newLnk.setAttribute('jt_uid', uid);
	this.linkDivs[uid] = newLnk;
	this.set(newLnk);
},

jt_.NavBar.prototype.rem = function() {
	if (this.curr_link) {
		this.curr_link.parentNode.removeChild(this.curr_link);
		var uid = this.curr_link.getAttribute('jt_uid');
		delete this.linkDivs[uid];
		if (jt_.objCount(this.linkDivs) < 2) { // hide last link as template
			jt_.showHideElm(this.template());
		}
		if (this.vuMgr) {
			this.vuMgr.rem(uid);
		}
		this.curr_link = null;
	}
}

jt_.NavBar.prototype.set = function(lnk_node) {
	for (var prop in this.linkDivs) { // set all off - "css_lnk"
		jt_.cssClass.rpl(this.linkDivs[prop], this._specs.css_lnk_on, this._specs.css_lnk);
	}
	jt_.cssClass.rpl(lnk_node, this._specs.css_lnk, this._specs.css_lnk_on); // set one on - "css_lnk_on"
	this.curr_link = lnk_node;
	if (this.vuMgr) {
		this.vuMgr.show(lnk_node.getAttribute('jt_uid'));
	}
	if (this._callFunc) {
		this._callFunc(this.curr_link);
	}
	location.hash = this.curr_link.jt_fldMap.lnkTxt.innerHTML;
}

jt_.NavBar.prototype.move_L = function() {
	if (this.curr_link) {
		var fc = jt_.firstChild(this.navDiv);
		if (fc == this.curr_link) {
			this.navDiv.appendChild(this.curr_link);
		}
		else {
			this.navDiv.insertBefore(this.curr_link, this.curr_link.previousSibling);
		}
	}
}

jt_.NavBar.prototype.move_R = function() {
	if (this.curr_link) {
		if (this.curr_link == this.navDiv.lastChild) {
			var fc = jt_.firstChild(this.navDiv);
			this.navDiv.insertBefore(this.curr_link, fc);
		}
		else {
			this.navDiv.insertBefore(this.curr_link.nextSibling, this.curr_link);
		}
	}
}

jt_.NavBar.click = function(ev) {
	var e = jt_.fixE(ev);
	var lnk_node = e.target ? e.target : e.srcElement;
	while (!lnk_node._jt_NavBar) {
		lnk_node = lnk_node.parentNode;
	}
	lnk_node._jt_NavBar.set(lnk_node);
	return false;
}

jt_.NavBar.defaultSpecs = {css_lnk: "navLink", css_lnk_on: "navLinkOn", uid_prfx: "nid_"};
/********* END: jt_.NavBar *******/
