//pił generali
/*
function doAjaxGet(_url,_data,_callback) {
	$.ajax({
			type:'GET',
			url: _url,
			data: _data,
			success: function(response){handleXmlFileItems(response, _callback)}
	});

}

function doAjaxPost(_url,_data,_callback) {
	$.ajax({
			type:'POST',
			url: _url,
			data: _data,
			success: function(response){handleXmlFileItems(response, _callback)}
	});
}
*/


//standard jp
function jpGetRemoteHTMLAsync(url,docHandler) {
	$.get(url, function(response, testStatus){
					if(response instanceof String)
						docHandler(response);
					else
						handleXml(response,docHandler,true);
			    });
}

function jpXmlRpcPostAsync(url,obj,docHandler) {
	$.post(url, $(obj).serialize(), function(response, testStatus){
					if(response instanceof String)
						docHandler(response);
					else
						handleXml(response,docHandler,true);
			    });
}



function handleXml(xmlDoc, handler, isList){
	if(isList)
		handleXmlFileItems(xmlDoc,handler);
	else
		handleXmlFileItem(xmlDoc,handler);
}

function handleXmlFileItems(oXmlDoc,docHandler) {
	if( oXmlDoc == null || oXmlDoc.documentElement == null) {
		docHandler(null);
	} else {
		var count = xmlDocumentCountAttr(oXmlDoc)
		var items = xmlDocumentToArray(oXmlDoc);
		docHandler(items,count);
	}
}

function handleXmlFileItem(oXmlDoc,docHandler) {
	if( oXmlDoc == null || oXmlDoc.documentElement == null) {
		docHandler(null);
	} else {
		var items = xmlDocumentToArray(oXmlDoc);
		var item = items.length > 0 ? items[0] : null;
		docHandler(item);
	}
}

function xmlDocumentCountAttr(xmldoc) {
	var o = new Array();
	var root = xmldoc.documentElement;
	var as = root.attributes;
	var l = as.length;
	for (var i = 0 ; i < l ; ++i) {
		if(as[i].name == 'ElemCount' || as[i].name == 'ElemOffset' || as[i].name == 'ElemLimit' || as[i].name == 'ElemSearchId'){
			o[as[i].name] = as[i].value;
		}
	}
	return o;
}

//TODO
function xmlDocumentToArray(xmldoc) {
	var o = new Array();
	var root = xmldoc.documentElement;
	var rootAttrs = root.attributes;
	var rl = rootAttrs.length;
	for (var i = 0 ; i < rl ; ++i) {
		o[rootAttrs[i].name] = rootAttrs[i].value;
	}
	var cs = root.childNodes;
	var l = cs.length;
	var inode = 0;
	for (var i = 0 ; i < l ; ++i) {
		if (cs[i].nodeType == 1) {
			o[inode++] = xmlItemToObject(cs[i]);
		}
	}
	return o;
}

function xmlItemToObject(item) {
	var o = new Object();
	o._type = getNodeName(item);
	var isCollection = false; 
	var as = item.attributes;
	if(as){
		var al = as.length;
		for (var i = 0 ; i < al ; ++i) {
			o[as[i].name] = as[i].value;
			if(as[i].name == 'isCollection')
				isCollection = as[i].value == 'true';
		}
	}
	if(isCollection)
		o = new Array();
	var es = item.childNodes;
	if(es){
		var el = es.length;
		for (var i = 0 ; i < el ; ++i) {
			if(isCollection){
				if(es[i].nodeType == 1){
					o[o.length] = xmlItemToObject(es[i]);
				}
			}
			else{
				if(es[i].nodeType == 3 || es[i].nodeType == 4){
					if(es[i].nodeType == 4 ||(es[i].nextSibling == null && es[i].previousSibling == null)){
						o['_text'] = es[i].nodeValue;
					}
				}
				else{			
					o[getNodeName(es[i])] = xmlItemToObject(es[i]);
				}
			}
		}
	}
	return o;
}

function getNodeName(node){
	if(node){
		return node.baseName ? node.baseName : node.nodeName;
	}
	return 'undefined';
}
