/*
	fps_treeview - 2008 flashpitols - Berlik Levente
*/

var fps_treeview_lastobj = null;		// az utolso kattintott objektum a faban (li->a onclick-kor)
var fps_treeview_last_highlight = null; // az utolso kiemelt objektum a faban (nem faban katt-kor, expand fgv)
var fps_treeview_branch_id = 0 			// ha nincs ID rendelve a li-hez ez a szamlalo osztja ki

// a fa elem highlight RGB szine
var fps_treeview_r = 255;
var fps_treeview_g = 255;
var fps_treeview_b = 128;

// a CEL RGB szin amibe "halvanyuljon" at a highlight
var fps_treeview_r_target = 255;
var fps_treeview_g_target = 255;
var fps_treeview_b_target = 255;

var fps_treeview_highlight_speed = 50;	// 50ms-es highlight animacio
var fps_treeview_scroll_speed = 5;		// 5ms-es scroll animacio
var fps_treeview_scroll_acceleration = 5; // minel kisebb, annal gyorsabban gyorsul a gorgetes

var fps_treeview_animation_id = null;	// ebben tarolodik az eppen folyo animacio ID, hogy ne utkozzenek

// browser: id
function fps_treeview_collapseall(browser) {
	if (!gete(browser)) return;
	var browser = gete(browser);

	var uls = browser.getElementsByTagName("ul");
	for (var i = 0; i < uls.length; i++) {
		var obj = uls[i];
		obj.parentNode.firstChild.className = obj.parentNode.firstChild.className.replace(/collapse/, "expand");
		if (obj.parentNode.firstChild.firstChild.tagName == 'SPAN') {
			var myimg = obj.parentNode.firstChild.firstChild;
			if (myimg.className.match(/open/) || myimg.className.match(/closed/)) {
				myimg.className = myimg.className.replace(/open/, "closed");
			}
		}
		obj.style.display = 'none';
	}
	fps_treeview_last_highlight = null;
}

// browser: UL id
function fps_treeview_expandall(browser) {
	if (!gete(browser)) return;
	var browser = gete(browser);

	var uls = browser.getElementsByTagName("ul");
	for (var i = 0; i < uls.length; i++) {
		var obj = uls[i];
		obj.parentNode.firstChild.className = obj.parentNode.firstChild.className.replace(/expand/, "collapse");
		if (obj.parentNode.firstChild.firstChild.tagName == 'SPAN') {
			var myimg = obj.parentNode.firstChild.firstChild;
			if (myimg.className.match(/open/) || myimg.className.match(/closed/)) {
				myimg.className = myimg.className.replace(/closed/, "open");
			}
		}
		obj.style.display = 'block';
	}
	fps_treeview_last_highlight = null;
}

// browser: fo UL id, id: a LI id, amelyet ki szeretnenk nyitni
function fps_treeview_expand(browser, id) {
	if (!gete(browser)) return;
	if (!gete(id)) return;
	if (gete(id).tagName != 'LI') return;
	var myli = gete(id);
	var browser = gete(browser);

	var gogo = 1;
	while (gogo == 1) {
		myli.parentNode.style.display = 'block';
		myli.firstChild.className = myli.firstChild.className.replace(/expand/, "collapse");
		if (myli.lastChild && myli.lastChild.tagName == 'UL') myli.lastChild.style.display = 'block';
		if (myli.firstChild.firstChild.tagName == 'SPAN') {
			var myimg = myli.firstChild.firstChild;
			if (myimg.className.match(/open/) || myimg.className.match(/closed/)) {
				myimg.className = myimg.className.replace(/closed/, "open");
			}
		}
		if (myli.parentNode == browser) gogo = 0;
		myli = myli.parentNode.parentNode;
	}

	fps_treeview_scrollto(id, browser);
}

// kb latoterbe rakja az ID-ju LI elemet [a browser nemkotelezo Objektumban], konkkretabban a benne levo A tagot
function fps_treeview_scrollto(id, browser) {
	if (fps_treeview_animation_id) return;
	if (typeof browser == 'undefined') browser = fps_treeview_findroot(gete(id));

	var browser_height = browser.offsetHeight;
	var old_scrolltop = browser.scrollTop;
	gete(id).firstChild.focus();
	gete(id).firstChild.blur();
	var new_scrolltop = browser.scrollTop;

	var new_target = 0;
	if (old_scrolltop < new_scrolltop) {
		new_target = new_scrolltop + browser_height/2;
		if (new_target > browser.scrollHeight) new_target = browser.scrollHeight;
	} else if (old_scrolltop > new_scrolltop){
		new_target = new_scrolltop - browser_height/2;
		if (new_target < 0) new_target = 0;
	} else {
		// azonos, a scroll animacio nem fogja meghivni a setTimeout-ot, siman highlightolja
		new_target = new_scrolltop;
	}

	fps_treeview_animation_id = id;	// elmentjuk, hogy ezt animaljuk
	fps_treeview_animate_scroll(browser.id, old_scrolltop, new_target);
}

// ez vegzi a scroll animaciot: fo browser(UL) elem ID-ja, regi pozicio, uj pozicio, az cel LI elem ID-je
function fps_treeview_animate_scroll(browser, oldpos, newpos) {
	var dir;
	// dinamikus lepeskoz
	var step = Math.abs(parseInt((newpos-oldpos) / fps_treeview_scroll_acceleration));

	if (oldpos < newpos) {
		oldpos += step;
		dir = 1;
	} else if (oldpos > newpos) {
		oldpos -= step;
		dir = 0;
	} else {
		// itt nincs animacio
		oldpos = newpos;
	}

	if (oldpos > gete(browser).scrollHeight) oldpos = gete(browser).scrollHeight;
	if (oldpos < 0) oldpos = 0;
	gete(browser).scrollTop = oldpos;
	if (((dir == 1 && oldpos < newpos) || (dir == 0 && oldpos > newpos)) && step != 0) {
		setTimeout('fps_treeview_animate_scroll("'+browser+'", '+oldpos+', '+newpos+');', fps_treeview_scroll_speed);
	} else {
		if (fps_treeview_last_highlight != fps_treeview_animation_id) fps_treeview_highlight(fps_treeview_animation_id, fps_treeview_r, fps_treeview_g, fps_treeview_b);
		fps_treeview_last_highlight = fps_treeview_animation_id;
		fps_treeview_animation_id = null;	// kunullazzuk az animID-t
	}
}

// egy LI id firstChild A-jat highlightolja
function fps_treeview_highlight(id, r, g, b) {
	if (!gete(id)) return;
	gete(id).firstChild.style.backgroundColor = 'rgb('+r+', '+g+', '+b+')';

	if (r < fps_treeview_r_target) { r += 10; if (r > fps_treeview_r_target) r = fps_treeview_r_target; }
	if (r > fps_treeview_r_target) { r -= 10; if (r < fps_treeview_r_target) r = fps_treeview_r_target; }

	if (g < fps_treeview_g_target) { g += 10; if (g > fps_treeview_g_target) g = fps_treeview_g_target; }
	if (g > fps_treeview_g_target) { g -= 10; if (g < fps_treeview_g_target) g = fps_treeview_g_target; }

	if (b < fps_treeview_b_target) { b += 10; if (b > fps_treeview_b_target) b = fps_treeview_b_target; }
	if (b > fps_treeview_b_target) { b -= 10; if (b < fps_treeview_b_target) b = fps_treeview_b_target; }

	if (r != fps_treeview_r_target || g != fps_treeview_g_target || b != fps_treeview_b_target) {
		gete(id).firstChild.style.fontWeight = 'bold';
		setTimeout('fps_treeview_highlight("'+id+'", '+r+', '+g+', '+b+');', fps_treeview_highlight_speed);
	} else {
		gete(id).firstChild.style.backgroundColor = 'transparent';
		gete(id).firstChild.style.fontWeight = 'normal';
	}
}

// megkeresi egy beadott LI/UL-nek a root UL-jet
function fps_treeview_findroot(obj) {
	if (obj.tagName == 'UL') {
		while (obj.parentNode.tagName == 'LI') obj = obj.parentNode.parentNode;
		return obj;
	} else if (obj.tagName == 'LI') {
		while (obj.parentNode.tagName == 'UL' && obj.parentNode.parentNode.tagName == 'LI') obj = obj.parentNode.parentNode;
		return obj.parentNode;
	}
	return null;
}

// kitorli a megadott LI id lastChild UL-jebol az osszes elemet
function fps_treeview_delete_all(id, emptycontent) {
	if (!gete(id)) return;	// nincs ilyen LI

	var root = gete(id);
	var myul = gete(id).lastChild;
	if (myul.tagName != 'UL') return;

	if (typeof emptycontent == 'undefined') {
		emptycontent = "<a href=\"javascript: void(0);\" onclick=\"this.blur();\" title=\"Empty\">"+
							"<img src=\"image/ico_unknown.gif\" alt=\"\" /><b>Empty</b>"+
						"</a>";
	}

	while (myul.childNodes.length) myul.removeChild(myul.firstChild);

	var newli = document.createElement('li');
	newli.innerHTML = emptycontent;
	myul.appendChild(newli);

	fps_treeview_build(root, 1);	// most objektum-ot adunk be neki
	fps_treeview_scrollto(id);
}

// kitorol egy elemet, LI id kell, vagy tobb LI id vesszovel elvalasztva, szokozok nelkul
// emptycontent: elhagyhato, ebben add meg a HTML-t ami akkor irodik be, ha a fa aga uresse valik
function fps_treeview_delete(id, emptycontent) {

	if (typeof emptycontent == 'undefined') {
		emptycontent = "<a href=\"javascript: void(0);\" onclick=\"this.blur();\" title=\"Empty\">"+
							"<img src=\"image/ico_unknown.gif\" alt=\"\" /><b>Empty</b>"+
						"</a>";
	}

	var ids = id.split(",");
	if (ids.length > 0) {
		var obj_save_parent = gete(ids[0]).parentNode;	// ez sajna az ul lesz
		for (var i = 0; i < ids.length; i++) {
			if (!gete(ids[i])) continue;
			var obj = gete(ids[i]);

			// ha o az utolso elem az UL-jeben berakunk valamit, hogy ez mar ures
			if (obj.parentNode.childNodes.length == 1) {
				// az UL-jenek a LI-je kell
				var topli = obj.parentNode.parentNode;
				if (topli.tagName == 'LI') {
					// hozzaadjuk az "ez ures" LI-t
					var myul = obj.parentNode;
					var newli = document.createElement('li');
					newli.innerHTML = emptycontent;
					myul.appendChild(newli);
				}
			}

			obj.parentNode.removeChild(obj);
		}
		// megkeressuk az uber root-ot, es majd az egeszet updateljuk
		var uber_root = fps_treeview_findroot(obj_save_parent);
		fps_treeview_build(uber_root, 1);
	}
}

/// id: LI id aminek a firstChild A-janak a tartalmat ujrairja, newcontent: a szoveg
/// az elso span-t ami varhatolag az ikon meghagyja, a tobbit az ujra csereli.
function fps_treeview_modify(id, newcontent) {
	if (!gete(id)) return;
	var obj = gete(id);
	if (obj.tagName != 'LI') return;
	var ih = obj.firstChild.firstChild.innerHTML = newcontent;
	fps_treeview_last_highlight = null; // azert, hogy ha ugyanazt modositjuk is jelezze ujra
	fps_treeview_scrollto(obj.id);
}

/// id: LI id, aminek a lastChild UL-jebe belefuz egy LI-t newcontent tartalommal, newid ID-vel
function fps_treeview_append(id, newcontent, newid) {
	if (!gete(id)) return;
	var obj = gete(id);
	if (obj.tagName != 'LI') return;

	var myul = obj.lastChild;

	// megnezi van-e benne "idegen" elem, pl ha ures volt a galeria akkor a "galeria ures" elem, ezeknek az ID-je "treebranch_{n}"
	var lis = myul.childNodes;
	for (var i = 0; i < lis.length; i++) {
		var l = lis[i];
		if (l.id.match(/^treebranch_[0-9]+$/)) l.parentNode.removeChild(l);
	}

	var newli = document.createElement('li');
	newli.innerHTML = newcontent;
	myul.appendChild(newli);
	newli.setAttribute("id", newid);

	//var uber_root = fps_treeview_findroot(obj);
	fps_treeview_build(myul, 1);
	fps_treeview_scrollto(newid);
}

/// berakja a LI elemet a faban a newpos pozicioba, pl galeria kep sorrend valtoztataskor
function fps_treeview_set_pos(id, newpos) {
	if (!gete(id)) return;
	if (gete(id).tagName != 'LI') return;
	var myli = gete(id);
	var myparent = myli.parentNode;
	myparent.removeChild(myli);
	if (myparent.childNodes[newpos]) {
		var that_kid = myparent.childNodes[newpos];
		that_kid.parentNode.insertBefore(myli, that_kid);
	} else {
		myparent.appendChild(myli);
	}
	fps_treeview_build(myparent, 1);	// olcsositas miatt most csak ezt az agat (sz)epitjuk ujra
	fps_treeview_last_highlight = null; // azert, hogy ha ugyanazt huzigatjuk is jelezze ujra
	fps_treeview_scrollto(id);
}

/*
	fps_treeview_build(Szulo-UL tag ID-je vagy maga az objektum, [1, ha ne csukja be az alszintek UL-jeit]);

	MEGKOTESEK:
	- alapbol igy kell kinezni a li tartalmanak, a linknek mindig az elsonek kell lennie, a linken belul pedig az icon-spannek kell elol lennie:
		<li [id=\"pic_$id\"]>	// ID-t nem art adni, gondolom te is azonositani akarod valahogy az elemeket
			<a href=\"javascript: void(0);\" title=\"\">
				<span class=\"folder_closed\">$szoveg</span>
			</a>
			<!-- blahblah mas elemek -->
			<ul><li>hozza tartozo alelemek.....</ul>
		</li>

	- ha ures li kell, pl "a galeria ures":
		<li>	// NINCS ID ALAPBOL, HA MEGIS SZUKSEGED VAN RA, A TORLESEROL NEKED KELL GONDOSKODNI!!!!
		<a href=\"javascript: void(0);\" onclick=\"this.blur();\" title=\"".__("A galéria üres.")."\">
			<img src=\"image/ico_unknown.gif\" alt=\"\" /><b>".__("A galéria üres.")."</b>
		</a>

	- ha a fenti kep-span neveben van open, vagy closed, az kattintaskor cserelgetve lesz (nyitott mappa, csukott mappa)

*/

function fps_treeview_build(browser, dontcollapse) {

	if (typeof browser == 'string') {
		if (!gete(browser)) return;
		var browser = gete(browser);
	}

	if (typeof dontcollapse == 'undefined') dontcollapse = 0;

	if (dontcollapse == 0) {
		// UL-k
		var uls = browser.getElementsByTagName("ul");
		for (var i = 0; i < uls.length; i++) uls[i].style.display = 'none';
	}

	// LI-k
	var lis = browser.getElementsByTagName("li");
	for (var i = 0; i < lis.length; i++) {
		var obj = lis[i];

		if (obj.tagName != 'LI') { alert (i+': ez nem LI'); return; }

		var myclass = 'tv_expand';

		// ha nincs elozo elem, es a szulo elem(UL) szuloje nem LI, akkor ez nagy valoszinuseggel a fo-fo gyoker, ha megsem az, akkor szar a DOM
		if (!obj.previousSibling && obj.parentNode.parentNode.tagName != 'LI') {
			if (obj.nextSibling) {
				myclass = 'tv_expand_base';
			} else {
				myclass = 'tv_expand_single';
				obj.className = 'tv_last_branch';
			}
		} else {
			// ha van kovetkezo LI elem
			if (obj.nextSibling) {
				if (obj.lastChild.tagName != 'UL') {
					// ha legalsobb szintu elem, es mar nincs benne UL, azt nem lehet tovabb nyitni
					myclass = 'tv_tbranch';
				}
			} else {
				// nincs utana elem, vagyis ez az utolsi LI, nem kell hatter vonalka neki
				obj.className = 'tv_last_branch';

				//if (obj.previousSibling) {
					if (obj.lastChild.tagName == 'UL') {
						// ha utolso elem, de ez is lenyilos
						myclass = 'tv_expand_bottom';
					} else {
						// ha utolso elem, de van elotte elem
						myclass = 'tv_tbranch_bottom';
					}
				/*} else {
					// egyeduli elem, se elotte, se mogotte
					// ha mast nem lesz kep a faban hasznalva akkor fixme
				}*/
			}
		}

		if (obj.id == '') { obj.setAttribute('id', 'treebranch_'+fps_treeview_branch_id); fps_treeview_branch_id++; }
		obj.firstChild.className = myclass;

		// csak akkor, ha nem legalsobb szintu
		if (obj.lastChild.tagName == 'UL') {
			if (obj.firstChild.tagName == 'A') {
				obj.firstChild.onclick = function () {
					this.blur();
					if (this.parentNode.lastChild.tagName != 'UL') { alert('a lastChild nem UL'); return; }
					var myul = this.parentNode.lastChild;
					var myli = this.parentNode;

					var change_icon = false;
					if (this.firstChild.tagName == 'SPAN') {
						var myimg = this.firstChild;
						if (this.firstChild.className.match(/open/) || this.firstChild.className.match(/closed/)) {
							change_icon = true;
						}
					}

					if (myul.style.display == 'none') {
						// ha megnyitjuk
						if (change_icon) myimg.className = myimg.className.replace(/closed/, "open");
						this.className = this.className.replace(/expand/, "collapse");
						myul.style.display = 'block';
					} else {
						// ha bezarjuk
						if (change_icon) myimg.className = myimg.className.replace(/open/, "closed");
						// akkor az osszes alarendeltet is
						var uls = myli.getElementsByTagName("ul");
						for (var i = 0; i < uls.length; i++) {
							var subul = uls[i];
							// a +/- ikon (-)-ra
							subul.parentNode.firstChild.className = subul.parentNode.firstChild.className.replace(/collapse/, "expand");
							// a mappa ikon zartra
							subul.parentNode.firstChild.firstChild.className = subul.parentNode.firstChild.firstChild.className.replace(/open/, "closed");
							// a tartalom nemlaccosra
							subul.style.display = 'none';
							// szerintem
						}

						//if (fps_treeview_lastobj == this) return false;	// bezaraskor ne hivodjon meg a link alatti JS, ha...
						return false;
					}

					if (fps_treeview_lastobj == this) return false; // ha ugyan arra klikkelgetunk ne hivodjon meg a link alatti JS
					fps_treeview_lastobj = this;

					return true;
				}
			}
		}

	}

} // eof build
