
/**
 * 
 */
var jpPopupTip; 
var jpPopupTimer;

function jpShowPopupTipTimeout(url,dx,dy) {
	var x = event.clientX + 25;
	var y = event.clientY + 17;
	jpPopupTimer = window.setTimeout("jpShowPopupTip('" + url + "'," + dx + "," + dy + "," + x + "," + y + ")", 700);	
}

function jpShowPopupTip(url,dx,dy,x,y) {
	if (!jpPopupTip)
		jpPopupTip = window.createPopup();
	var jpPopupBody = jpPopupTip.document.body; 
    jpPopupBody.style.backgroundColor = "lightyellow";
    jpPopupBody.style.border = "solid black 1px";
    
	jpPopupBody.innerHTML = jpGetRemoteHTML(url); 

	if (!x)
		x = event.clientX;
	if (!y)
    	y = event.clientY;
	jpPopupTip.show(x, y, dx, dy, document.body);
	if(dx != jpPopupBody.scrollWidth || dy != jpPopupBody.scrollHeight)
		jpPopupTip.show(x, y, jpPopupBody.scrollWidth, jpPopupBody.scrollHeight, document.body);
}

function jpHidePopupTip() {
	if (jpPopupTimer) {
		window.clearTimeout(jpPopupTimer);
		jpPopupTimer = null;
	}

	if (jpPopupTip && jpPopupTip.isOpen) {
		jpPopupTip.hide();
		jpPopupTip = null;
	}
}

function jpGetRemoteHTML(url) {
	var xmlhttp = XmlHttp.create();
	var html;
	xmlhttp.open("GET", url,false);
	xmlhttp.send(null)
	if (xmlhttp.readyState==4) {
		html = xmlhttp.responseText;
	}
 	return html;
}

function jpGetRemoteHTMLAsync(url,docHandler) {
	var xmlHttp = XmlHttp.create();
	var html;
	xmlHttp.open("GET", url,true);
	xmlHttp.onreadystatechange = function () {
		if (xmlHttp.readyState == 4) {
			docHandler(xmlHttp.responseText);
		}
	};

	window.setTimeout(function () {
		xmlHttp.send(null);
	}, 10);
}

function jpXmlRpcPost(sSrc,obj) {
	var xmlHttp = XmlHttp.create();
	var html;
	xmlHttp.open("POST", sSrc, false);
   	xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	var value = '';
	if(obj instanceof String)
		value = obj;
	else
		value = formToParams(obj);
	
	xmlHttp.send(value);

	if (xmlHttp.readyState==4) {
		html = xmlHttp.responseText;
	}

	return html;
	// show error in status bar
	//if (errors)
	//	window.status = 'ERROR!';
}

function jpXmlRpcPostAsync(sSrc,obj,docHandler) {
	var xmlHttp = XmlHttp.create();
	var html;
	xmlHttp.open("POST", sSrc, true);
   	xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
	var value = '';
	if(obj instanceof String)
		value = obj;
	else
		value = formToParams(obj);
	
	xmlHttp.onreadystatechange = function () {
		if (xmlHttp.readyState == 4) {
			docHandler(xmlHttp.responseText);
		}
	};

	window.setTimeout(function () {
		xmlHttp.send(value);
	}, 10);
}

function formToParams(formObj){
	var elems = formObj.elements;
	var params = '';
	for(var i = 0; i < elems.length; i++){
		if(i > 0 && params.length > 0)
			params += '&';
		params += elems[i].name + '=' + elems[i].value;
	}
	return params;
}

function jpXmlRpcGet(sSrc,docHandler) {
	_getXmlItems(sSrc,handleXmlFileItems,docHandler);
}


function jpXmlRpcGetFirstNode(sSrc,docHandler) {
	_getXmlItems(sSrc,handleXmlFileItem,docHandler);
}

function _getXmlItemsNew(sSrc,requestHandle,docHandler) {
	var doc = XmlDocument.create();
	doc.load(sSrc);
	docHandler(doc);

	// show error in status bar
	//if (errors)
	//	window.status = 'ERROR!';
}


function _getXmlItems(sSrc,requestHandle,docHandler) {
	var xmlHttp = XmlHttp.create();
	xmlHttp.open("GET", sSrc, true);
	xmlHttp.onreadystatechange = function () {
		if (xmlHttp.readyState == 4) {
			requestHandle(xmlHttp.responseXML,docHandler);
		}
	};

	window.setTimeout(function () {
		xmlHttp.send(null);
	}, 10);


	// show error in status bar
	//if (errors)
	//	window.status = 'ERROR!';
}

function handleXml(response, handler, isList){
	
//	alert("handleXml "+response);
	
	var xmlDoc = null;
	if (typeof DOMParser != 'undefined') {
		var parser = new DOMParser();
		xmlDoc = parser.parseFromString(response, "text/xml");
	}
	else if (typeof ActiveXObject != 'undefined') {
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async="false";
		xmlDoc.loadXML(response);
	}
	if(isList)
		handleXmlFileItems(xmlDoc,handler);
	else
		handleXmlFileItem(xmlDoc,handler);
}

function handleXmlFileItems(oXmlDoc,docHandler) {

//	alert("handleXmlFileItems "+oXmlDoc.xml);

	if( oXmlDoc == null || oXmlDoc.documentElement == null) {
		docHandler(null);
//		alert(oXmlDoc.xml);
	} else {
		var count = xmlDocumentCountAttr(oXmlDoc)
		var items = xmlDocumentToArray(oXmlDoc);
		docHandler(items,count);
	}
}

function handleXmlFileItem(oXmlDoc,docHandler) {
	if( oXmlDoc == null || oXmlDoc.documentElement == null) {
		docHandler(null);
//		alert(oXmlDoc.xml);
	} 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';
}

function getDomDocumentPrefix() {
	if (getDomDocumentPrefix.prefix)
		return getDomDocumentPrefix.prefix;
	
	var prefixes = ["MSXML3", "MSXML2", "MSXML", "Microsoft"];
	var o;
	for (var i = 0; i < prefixes.length; i++) {
		try {
			// try to create the objects
			o = new ActiveXObject(prefixes[i] + ".DomDocument");
			return getDomDocumentPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}
	
	throw new Error("Could not find an installed XML parser");
}

function getXmlHttpPrefix() {
	if (getXmlHttpPrefix.prefix)
		return getXmlHttpPrefix.prefix;
	
	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for (var i = 0; i < prefixes.length; i++) {
		try {
			// try to create the objects
			o = new ActiveXObject(prefixes[i] + ".XmlHttp");
			return getXmlHttpPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}
	
	throw new Error("Could not find an installed XML parser");
}

// XmlHttp factory
function XmlHttp() {}

XmlHttp.create = function () {
	try {
		if (window.XMLHttpRequest) {
			var req = new XMLHttpRequest();
			
			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			if (req.readyState == null) {
				req.readyState = 1;
				req.addEventListener("load", function () {
					req.readyState = 4;
					if (typeof req.onreadystatechange == "function")
						req.onreadystatechange();
				}, false);
			}
			
			return req;
		}
		if (window.ActiveXObject) {
			return new ActiveXObject(getXmlHttpPrefix() + ".XmlHttp");
		}
	}
	catch (ex) {}
	// fell through
	throw new Error("Your browser does not support XmlHttp objects");
};

// XmlDocument factory
function XmlDocument() {}

XmlDocument.create = function () {
	try {
		// DOM2
		if (document.implementation && document.implementation.createDocument) {
			var doc = document.implementation.createDocument("", "", null);
			
			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			if (doc.readyState == null) {
				doc.readyState = 1;
				doc.addEventListener("load", function () {
					doc.readyState = 4;
					if (typeof doc.onreadystatechange == "function")
						doc.onreadystatechange();
				}, false);
			}
			
			return doc;
		}
		if (window.ActiveXObject)
			return new ActiveXObject(getDomDocumentPrefix() + ".DomDocument");
	}
	catch (ex) {}
	throw new Error("Your browser does not support XmlDocument objects");
};

// Create the loadXML method and xml getter for Mozilla
if (window.DOMParser &&
	window.XMLSerializer &&
	window.Node && Node.prototype && Node.prototype.__defineGetter__) {

	// XMLDocument did not extend the Document interface in some versions
	// of Mozilla. Extend both!
	XMLDocument.prototype.loadXML = 
	Document.prototype.loadXML = function (s) {
		
		// parse the string to a new doc	
		var doc2 = (new DOMParser()).parseFromString(s, "text/xml");
		
		// remove all initial children
		while (this.hasChildNodes())
			this.removeChild(this.lastChild);
			
		// insert and import nodes
		for (var i = 0; i < doc2.childNodes.length; i++) {
			this.appendChild(this.importNode(doc2.childNodes[i], true));
		}
	};
	
	
	/*
	 * xml getter
	 *
	 * This serializes the DOM tree to an XML String
	 *
	 * Usage: var sXml = oNode.xml
	 *
	 */
	// XMLDocument did not extend the Document interface in some versions
	// of Mozilla. Extend both!
	XMLDocument.prototype.__defineGetter__("xml", function () {
		return (new XMLSerializer()).serializeToString(this);
	});
	Document.prototype.__defineGetter__("xml", function () {
		return (new XMLSerializer()).serializeToString(this);
	});
}