/*
 * (c) 2006 Robert (nospor) Nodzewski
 * email: nospor at interia dot pl
 * license http://opensource.org/licenses/lgpl-license.php GNU Lesser General Public License
 * version: 1.3
 *
 */
/*
 * Drzewko może korzystać albo biblioteki advAjax albo prototype. Do określenia biblioteki służy zmienna ajaxLib
 */
var ajaxLib = 'advajax';
//var ajaxLib = 'prototype';
function treeCreateElement(element, parent, content, id, className)
{//tworzy element w parent
	var el=element;
	if (element=='checkbox'){
		element=document.createElement('input');
		element.type='checkbox';
	}
	else if (element=='hidden'){
		element=document.createElement('input');
		element.type='hidden';
	}
	else
		element=document.createElement(element);
	parent.appendChild(element);
	if (id) {element.id=id;element.name=id;}
	if (className) 
		element.className=className;
	if (content) 
	{
		if (el!='input' && el!='checkbox' && el!='hidden') element.innerHTML=content;
		else			 element.value=content;	
	}
	return element;
}

function treeExpand(idTree, idParent, extraParameter){
	var li = document.getElementById(idTree+'_li_'+idParent);
	var uls = li.getElementsByTagName('ul');
	if (uls.length > 0){
		var ul = document.getElementById(idTree+'_ul_'+idParent);
		ul.style.display= "";
		var img = document.getElementById(idTree+'_img_'+idParent);
		img.src='./images/tree/expanded.gif';
		img.onclick = function() {treeCollapse(treeGetIdFromStart(this.id),treeGetIdFromEnd(this.id));}
		if (treeShowFoldersIcons(idTree)){
			 treeFolderImg(idTree, idParent, 'folderexpanded');	
		}	
		var actionUrl = document.getElementById(idTree+'_actionUrl').value;
		var actionParams = "tree_id="+idTree+"&tree_action=expand&tree_idnode=" + idParent;
		if (ajaxLib == 'advajax')
			advAJAX.get({
				url: actionUrl+actionParams,
				onSuccess : function(obj) {},
				onError : function(obj) {treeAJAXError(obj.status, actionUrl + actionParams); }
			});
		else {
			var myAjax = new Ajax.Request(
				actionUrl + actionParams, 
				{
					method: 'get', 
					onSuccess: function(obj) {},
					onFailure: function(obj) {treeAJAXError(obj.status, actionUrl + actionParams); }
				});
		}
	}
	else {
		var actionUrl = document.getElementById(idTree+'_actionUrl').value;
		var actionParams = "tree_id="+idTree+"&tree_action=getchildren&tree_idnode=" + idParent+(extraParameter ? '&extraParameter='+extraParameter : '');
		
		treeShowHideWait(idTree, true);
		if (ajaxLib == 'advajax')
			advAJAX.get({
				url: actionUrl + actionParams,
				onSuccess : function(obj) {treeES(idTree, idParent, obj.responseXML, obj.responseText);},
				onError : function(obj) { treeShowHideWait(idTree);treeAJAXError(obj.status, actionUrl + actionParams); }
				
			});
		else {
			var myAjax = new Ajax.Request(
				actionUrl + actionParams, 
				{
					method: 'get', 
					onSuccess: function(obj) {treeES(idTree, idParent, obj.responseXML, obj.responseText);},
					onFailure: function(obj) {treeShowHideWait(idTree);treeAJAXError(obj.status, actionUrl + actionParams); }
				});
		}
	}
}
function treeES(idTree,idParent, xml, txt ){
	treeShowHideWait(idTree);
	treeWrite(xml, idTree, idParent, txt);
	treeShowMessages(xml);
}

function treeCollapse(idTree, idParent){
	var actionUrl = document.getElementById(idTree+'_actionUrl').value;
	var actionParams = "tree_id="+idTree+"&tree_action=collapse&tree_idnode=" + idParent;
	if (ajaxLib == 'advajax')
		advAJAX.get({
			url: actionUrl+actionParams,
			onSuccess : function(obj) {},
			onError : function(obj) {treeAJAXError(obj.status, actionUrl + actionParams); }
		});
	else {
		var myAjax = new Ajax.Request(
			actionUrl + actionParams, 
			{
				method: 'get', 
				onSuccess: function(obj) {},
				onFailure: function(obj) {treeAJAXError(obj.status, actionUrl + actionParams); }
			});
	}
	_treeCollapse(idTree,idParent);
}
function _treeCollapse(idTree, idParent){
	var ul = document.getElementById(idTree+'_ul_'+idParent);
	if (ul)
		ul.style.display="none";
	img = document.getElementById(idTree+'_img_'+idParent);
	img.src='./images/tree/collapsed.gif';
	img.onclick = function() {treeExpand(treeGetIdFromStart(this.id), treeGetIdFromEnd(this.id));}
	if (treeShowFoldersIcons(idTree)){
		treeFolderImg(idTree, idParent, 'foldercollapsed');	
	}
}
function treeDelete(idTree, idNode){
	if (!confirm('Czy na pewno chcesz usunąć wybrany element?'))
		return false;
	var actionUrl = document.getElementById(idTree+'_actionUrl').value;
	var actionParams = "tree_id="+idTree+"&tree_action=delete&tree_idnode=" + idNode;
	treeShowHideWait(idTree, true);
	if (ajaxLib == 'advajax')
		advAJAX.get({
			url: actionUrl+actionParams,
			onSuccess : function(obj) {treeShowHideWait(idTree); _treeDelete(obj.responseXML, idTree,idNode, obj.responseText); treeShowMessages(obj.responseXML);},
			onError : function(obj) {treeShowHideWait(idTree);treeAJAXError(obj.status, actionUrl + actionParams); }
		});
	else {
		var myAjax = new Ajax.Request(
			actionUrl + actionParams, 
			{
				method: 'get', 
				onSuccess: function(obj) {treeShowHideWait(idTree); _treeDelete(obj.responseXML, idTree,idNode, obj.responseText); treeShowMessages(obj.responseXML);},
				onFailure: function(obj) {treeShowHideWait(idTree);treeAJAXError(obj.status, actionUrl + actionParams);}
			});
	}
	
	return true;
}

function _treeDelete(xml, idTree, idNode, txt){
	if (treeIsError(idTree, xml, txt))
		return true;
	var node = document.getElementById(idTree+'_li_'+idNode);
	if (node.parentNode.childNodes.length == 1){
		var idParent = treeGetIdFromEnd(node.parentNode.parentNode.id);
		document.getElementById(idTree+'_img_'+idParent).src = './images/tree/empty.gif';
		if (treeShowFoldersIcons(idTree)){
			treeFolderImg(idTree, idParent, 'leaf');				
		}
	}
	
	node.parentNode.removeChild(node);
	return true;
}

function treeEdit(idTree, idNode){
	var name = prompt('Podaj nową nazwę: ', treeGetNodeName(idTree, idNode));
	if (!name){
		alert('Błąd!!! Musisz podać nazwę');
		return;
	}	
	var actionUrl = document.getElementById(idTree+'_actionUrl').value;
	var actionParams = "tree_id="+idTree+"&tree_action=edit&tree_idnode=" + idNode+"&tree_value="+name;
	treeShowHideWait(idTree, true);
	if (ajaxLib == 'advajax')
		advAJAX.get({
			url: actionUrl+actionParams,
			onSuccess : function(obj) {treeShowHideWait(idTree); _treeEdit(obj.responseXML, idTree,idNode, obj.responseText);treeShowMessages(obj.responseXML); },
			onError : function(obj) { treeShowHideWait(idTree);treeAJAXError(obj.status, actionUrl + actionParams); }
		});
	else {
		var myAjax = new Ajax.Request(
			actionUrl + actionParams, 
			{
				method: 'get', 
				onSuccess: function(obj) {treeShowHideWait(idTree); _treeEdit(obj.responseXML, idTree,idNode, obj.responseText);treeShowMessages(obj.responseXML); },
				onFailure: function(obj) {treeShowHideWait(idTree);treeAJAXError(obj.status, actionUrl + actionParams);}
			});
	}
	
}
function _treeEdit(xml, idTree, idNode, txt){
	if (treeIsError(idTree, xml, txt))
		return true;
	var node = document.getElementById(idTree+'_node_'+idNode);
	node.innerHTML = treeGetTagValue(xml.getElementsByTagName('others'), 'newname');
}
function treeAddChild(idTree, idParent){
	var name = prompt('Podaj nazwę: ', '');
	if (!name){
		alert('Błąd!!! Musisz podać nazwę');
		return;
	}	
	var actionUrl = document.getElementById(idTree+'_actionUrl').value;
	var actionParams = "tree_id="+idTree+"&tree_action=addchild&tree_idnode=" + idParent+"&tree_value="+name;
	treeShowHideWait(idTree, true);
	if (ajaxLib == 'advajax')
	advAJAX.get({
		url: actionUrl+actionParams,
		onSuccess : function(obj) {treeShowHideWait(idTree); _treeAddChild(obj.responseXML, idTree,idParent, obj.responseText);treeShowMessages(obj.responseXML); },
		onError : function(obj) { treeShowHideWait(idTree);treeAJAXError(obj.status, actionUrl + actionParams); }
	});
	else {
		var myAjax = new Ajax.Request(
			actionUrl + actionParams, 
			{
				method: 'get', 
				onSuccess: function(obj) {treeShowHideWait(idTree); _treeAddChild(obj.responseXML, idTree,idParent, obj.responseText);treeShowMessages(obj.responseXML);},
				onFailure: function(obj) {treeShowHideWait(idTree);treeAJAXError(obj.status, actionUrl + actionParams);}
			});
	}
	
}
function _treeAddChild(xml, idTree, idParent, txt){
	if (treeIsError(idTree, xml, txt))
		return true;
	var _others = xml.getElementsByTagName('others');
	var _child = xml.getElementsByTagName("child").item(0);
	
	var _name = treeGetValue(_child.getElementsByTagName('name').item(0));
	var _id = _child.getAttribute('id');
	leafimg = _child.getAttribute('leafimg');
	className = _child.getAttribute('class');
	folderexpandedimg = _child.getAttribute('folderexpandedimg');
	foldercollapsedimg = _child.getAttribute('foldercollapsedimg');
	
	var _ul = document.getElementById(idTree+'_ul_'+idParent);
	if (_ul) {
		var _showFolder = treeShowFoldersIcons(idTree);
		var _li = treeMakeChild(idTree, _id, _name, _ul, true,_showFolder,_child.getElementsByTagName('actions'),null,leafimg, folderexpandedimg,foldercollapsedimg,className,_child);
		var obj = document.getElementById(idTree+'_img_'+idParent);
		obj.src = 'images/tree/expanded.gif';
		obj.onclick = function() {treeCollapse(treeGetIdFromStart(this.id), treeGetIdFromEnd(this.id));}
		if (_showFolder){
			obj = document.getElementById(idTree+'_img_folder_'+idParent);
			treeFolderImg(idTree, idParent, 'folderexpanded', obj);	
		}
	}
	treeExpand(idTree, idParent);
}
function treeWrite(xml,idTree, idParent, txt,go){
	if (treeIsError(idTree, xml, txt))
		return true;
	var parent, _idParent=null;
	var added = false, noadded = false;
	parent = document.getElementById(idTree+'_li_'+idParent);
	var children = xml.getElementsByTagName("child");
	var countChildren = children.length;
	var li, ul, img, _actions;
	var showFolder = treeShowFoldersIcons(idTree);
	var _countChildren;
	if (!go && document.getElementById(idTree+'_ul_'+idParent))
		return true;
	if (countChildren > 0){
		ul = document.getElementById(idTree+'_ul_'+idParent);
		if (!ul)
			ul = treeCreateElement('ul', parent,null, idTree+'_ul_'+idParent);
		for (i = 0; i < countChildren; i++){
			child = children.item(i);
			if (child.getAttribute('wasadded'))
				continue;
			idChild = child.getAttribute('id');
			nameChild = treeGetValue(child.getElementsByTagName('name').item(0));
			noChildren = child.getAttribute('nochildren');
			leafimg = child.getAttribute('leafimg');
			className = child.getAttribute('class');
			folderexpandedimg = child.getAttribute('folderexpandedimg');
			foldercollapsedimg = child.getAttribute('foldercollapsedimg');
			_actions = child.getElementsByTagName('actions');
			if (child.getAttribute('idparent')){
				if (child.getAttribute('idparent') != _idParent){
					_idParent = child.getAttribute('idparent');
					ul = document.getElementById(idTree+'_ul_'+_idParent);
					if (!ul) {
						parent = document.getElementById(idTree+'_li_'+_idParent);
						if (!parent) {
							noadded = true;
							continue;
						}	
						img = document.getElementById(idTree+'_img_folder_'+_idParent);
						treeFolderImg(idTree, _idParent, 'folderexpanded');	
						ul = treeCreateElement('ul', parent,null, idTree+'_ul_'+_idParent);
					}	
				}
			} else if (_idParent != null) {
				ul = document.getElementById(idTree+'_ul_'+idParent);
				_idParent = null;
			}	
			if (!ul)
				continue;
			added = true
			child.setAttribute('wasadded', '1');
			img = document.getElementById(idTree+'_img_'+_idParent);
			if (img) {
				img.src='./images/tree/expanded.gif';
				img.onclick = function() {treeCollapse(treeGetIdFromStart(this.id), treeGetIdFromEnd(this.id));}
			}	
			treeMakeChild(idTree, idChild, nameChild, ul, noChildren,showFolder, _actions, child.getAttribute('expanded'), leafimg, folderexpandedimg,foldercollapsedimg,className,child);
		}
	}
	if (!go && idParent != 'root'){
		img = document.getElementById(idTree+'_img_'+idParent);
		img.src='./images/tree/expanded.gif';
		img.onclick = function() {treeCollapse(treeGetIdFromStart(this.id), treeGetIdFromEnd(this.id));}
		if (treeShowFoldersIcons(idTree)){
			treeFolderImg(idTree, idParent, 'folderexpanded');				
		}
		
	}
	
	if (added && noadded) {
		treeWrite(xml, idTree, idParent, txt, true);
	}
}

function treeMakeChild(idTree, idChild, nameChild, ul, noChildren, showFolder, actions, expanded, leafimg,folderexpandedimg,foldercollapsedimg,className, child){
	var _li = treeCreateElement('li', ul,null, idTree+'_li_'+idChild,className);
	var _img = treeCreateElement('img', _li, null, idTree+'_img_'+idChild);
	if (!noChildren){
		if (!expanded) {
			_img.src='./images/tree/collapsed.gif';
			_img.onclick = function() {treeExpand(treeGetIdFromStart(this.id),treeGetIdFromEnd(this.id));}
		}	
		else {	
			_img.src='./images/tree/expanded.gif';
			_img.onclick = function() {treeCollapse(treeGetIdFromStart(this.id),treeGetIdFromEnd(this.id));}
		}
	}
	else	
		_img.src='./images/tree/empty.gif';
	if (actions && actions.length > 0)
		treeMakeActions(idTree, _li, actions.item(0).getElementsByTagName('before'), idChild);	
	if (showFolder){
		_img = treeCreateElement('img', _li, null, idTree+'_img_folder_'+idChild);
		if (!noChildren){
			if (foldercollapsedimg)
				_img.src=foldercollapsedimg;
			else
			_img.src='./images/tree/folder.gif';
		}	
		else {	
			if (leafimg)
				_img.src=leafimg;
			else	
				_img.src='./images/tree/emptyFolder.gif';
		}
		//wygenerowanie hiddenow na foldery
		if (foldercollapsedimg)
			treeCreateElement('hidden', _li, foldercollapsedimg, idTree+'_hidden_foldercollapsedimg_'+idChild);
		if (folderexpandedimg)
			treeCreateElement('hidden', _li, folderexpandedimg, idTree+'_hidden_folderexpandedimg_'+idChild);
		if (leafimg)
			treeCreateElement('hidden', _li, leafimg, idTree+'_hidden_leafimg_'+idChild);
	}
	var _onclick, _obj;
	if (actions && actions.length > 0)
		_obj = actions.item(0).getElementsByTagName('onclick');
	if (_obj && _obj.length > 0)
		_onclick = _obj.item(0);	
	_params = child.getElementsByTagName('param');
	if (_params && _params.length>0){
		_count = _params.length;
		for (j=0; j < _count; j++) {
			_param = _params.item(j);
			treeCreateElement('hidden', _li, treeGetValue(_param), idTree+'_hidden_param_'+_param.getAttribute('name')+'_'+idChild);
		}
	}
	if (_onclick){
		_a = treeCreateElement('a', _li, nameChild, idTree+'_node_'+idChild);
		_obj = treeGetValue(_onclick);
		_obj = _obj.replace('$IDTREE', idTree);
		_obj = _obj.replace('$ID', idChild);
		if (_onclick.getAttribute('type') == 'link')
			_a.href = _obj;
		else {
			if (!noChildren){
				
			}else{
				_a.href='show/'+idChild+'/';
			}
			//_a.onclick = function(){eval(_obj);return false;}
		}
	} else
		treeCreateElement('span', _li, nameChild, idTree+'_node_'+idChild);
	if (actions && actions.length > 0)
		treeMakeActions(idTree, _li, actions.item(0).getElementsByTagName('after'), idChild);	
	return _li;
}
function treeMakeActions(idTree, parent, actions, idChild){
	if (!actions || actions.length < 0)
		return true;
	var _count = actions.length;
	var obj, action, _name, _img, _title;
	for (j=0; j < _count; j++) {
		obj = actions.item(j);
		_name = obj.getAttribute('name');
		_title = obj.getAttribute('title');
		switch (_name){
			case 'delete':
				if (!obj.getAttribute('disabled')){
					action = treeCreateElement('a', parent, null, idTree+'_action_'+_name+'_'+idChild);
					action.href='#';
					action.title=_title ? _title : "Usuń";
					action.onclick = function() {treeDelete(treeGetIdFromStart(this.id), treeGetIdFromEnd(this.id)); return false;}
					_img = treeCreateElement('img', action, null);
				} else
					_img = treeCreateElement('img', parent, null);
				if (!obj.getAttribute('src'))
					_img.src='./images/tree/delete.png';
				else	
					_img.src=obj.getAttribute('src');
				break;
			case 'edit':
				if (!obj.getAttribute('disabled')){
					action = treeCreateElement('a', parent, null, idTree+'_action_'+_name+'_'+idChild);
					action.href='#';
					action.title=_title ? _title : "Edytuj";
					action.onclick = function() {treeEdit(treeGetIdFromStart(this.id), treeGetIdFromEnd(this.id));return false;}
					_img = treeCreateElement('img', action, null);
				} else
					_img = treeCreateElement('img', parent, null);
				if (!obj.getAttribute('src'))
					_img.src='./images/tree/edit.gif';
				else	
					_img.src=obj.getAttribute('src');
				break;
			case 'addchild':
				if (!obj.getAttribute('disabled')){
					action = treeCreateElement('a', parent, null, idTree+'_action_'+_name+'_'+idChild);
					action.href='#';
					action.title=_title ? _title : "Dodaj";
					action.onclick = function() {treeAddChild(treeGetIdFromStart(this.id), treeGetIdFromEnd(this.id));return false;}
					_img = treeCreateElement('img', action, null);
				} else
					_img = treeCreateElement('img', parent, null);
				if (!obj.getAttribute('src'))
					_img.src='./images/tree/add.gif';
				else	
					_img.src=obj.getAttribute('src');
				break;
			case 'checkbox':
				action = treeCreateElement('checkbox', parent, idChild, idTree+'_action_'+_name+'_'+idChild);
				if (_title)
					action.title=_title;
				if (obj.getAttribute('checked'))	
					action.checked = 'checked';	
				break;
		}
	}
}

function treeGetTagValue(tags, tagId){
	var _tagsCount = tags.length;
	if (_tagsCount == 0) return null;
	var _tag;
	for (_j = 0; _j < _tagsCount; _j++){
		_tag = tags.item(_j);
		if (_tag.getAttribute('id') == tagId){
			return treeGetValue(_tag);
		}
	}
	return null;
}
function treeGetValue(tag){
	var _value = tag.text;
	if (!_value)
		_value = tag.textContent;
	return _value;
}
function treeGetIdFromEnd(tekst){
	return tekst.substr(tekst.lastIndexOf('_')+1);
}
function treeGetIdFromStart(tekst){
	return tekst.substr(0,tekst.indexOf('_'));
}

function treeShowFoldersIcons(idTree){
	return document.getElementById(idTree + '_showFoldersIcons') ? true : false;
}
function treeShowMessages(xml){
	var _msg = xml.getElementsByTagName('error');
	if (_msg && _msg.length > 0)
		showMessages(_msg, 'error');
	_msg = xml.getElementsByTagName('message');
	if (_msg && _msg.length > 0)
		showMessages(_msg, 'message');
	return true;	
}

function treeAJAXError(status, url){
	var _er = new Array();
	_er[0] = 'Błąd dla url: ' + url;
	if (status == 404)
		_er[1] = 'Status: 404 - strona nie istnieje';
	else
		_er[1] = 'Status: '+ status;	
	showMessages(_er, 'error', true);
}

function treeIsError(idTree, xml, txt){
	_xmlError = true;
	if (xml){
		_tmp = xml.getElementsByTagName('tree');
		if (_tmp && _tmp.length > 0){
			_tmp = _tmp.item(0);
			if (_tmp) {
				_tmp = _tmp.getAttribute('result');
				if (_tmp == 'ok')	
					return false;
				else if(_tmp == 'notok') 
					_xmlError = false;	
			}	
		}
	}
	if (_xmlError && document.getElementById(idTree+'_debugMode'))
		alert('Błąd. Zwrócony text to:'+txt);
	return true;
}

function treeShowHideWait(idTree, show){
	_obj = document.getElementById(idTree+'_wait');
	if (!_obj)
		return;
	_obj.style.display = show ? '' : 'none';
}

function treeFolderImg(idTree, idNode, type, img){
	if (!img)
		img = document.getElementById(idTree+'_img_folder_'+idNode);
	fi = document.getElementById(idTree+'_hidden_'+type+'img_'+idNode);
	if (fi)
		img.src=fi.value;
	else {
		if (type == 'folderexpanded')
			_src = 'folderOpen.gif';
		else if (type == 'foldercollapsed')
			_src = 'folder.gif';
		else
			_src = 'emptyFolder.gif';
		img.src='./images/tree/'+_src;
	}	
}

function treeGetNodeName(idTree, idNode){
	return document.getElementById(idTree+'_node_'+idNode).innerHTML;
}

function treeGetParam(idTree, idNode, paramName){
	paramObj = document.getElementById(idTree+'_hidden_param_'+paramName+'_'+idNode);
	if (paramObj)
		return paramObj.value;
	else
		return null;	
}
