var xclientTimeout=10;
var xmlhttp_timeout=1000*xclientTimeout;

//alert("xclient.js");
function dump(o) {
	if (typeof(o)=="object") {
		var t="";
		var c=0;
		for(var n in o) {
			c++;
			if (typeof(o[n])=="function") t+=n+"(); "
			else t+=n+": "+o[n];
			if (c>8) {
				c=0;
				t+="\n";
			} else t+="\t";
		}
		alert(t);
	} else alert(o);
}

function xdb(n) {
	this.dsn=n;
	//read functions
	this.getNode=function(sel) {return xmlReq(this.dsn,"get",sel);}
	this.getText=function(sel) {return (r=xmlReq(this.dsn,"getText",sel))?r.xml:r}
	this.getNodes=function(sel,tag) {return xmlReq(this.dsn,"getNodes",sel,"",tag?tag:"xql").xml;}
	// write functions
	this.setAttr=function(sel,dados) {return xmlReq(this.dsn,"setAttr",sel,dados);}
	this.langSync_setAttr=function(sel,dados) {return xmlReq(this.dsn,"langSync_setAttr",sel,dados);}
	this.setText=function(sel,dados)  {return xmlReq(this.dsn,"setText",sel,"<![CDATA["+dados+"]]>");}
	this.langSync_setText=function(sel,dados)  {return xmlReq(this.dsn,"langSync_setText",sel,"<![CDATA["+dados+"]]>");}
	this.replaceNode=function(sel,dados) {return xmlReq(this.dsn,"replaceNode",sel,dados);}
	this.setNode=function(sel,dados) {return xmlReq(this.dsn,"setNode",sel,dados);}
	this.overNode=function(sel,dados) {return xmlReq(this.dsn,"overNode",sel,dados);}
	this.insertBefore=function(sel,dados) {return xmlReq(this.dsn,"insertBefore",sel,dados);}
	this.insertAfter=function(sel,dados) {return xmlReq(this.dsn,"insertAfter",sel,dados);}
	this.insertNode=function(sel,dados) {return xmlReq(this.dsn,"insertNode",sel,dados);}
	this.appendNode=function(sel,dados) {return xmlReq(this.dsn,"appendNode",sel,dados);}
	this.removeNode=function(sel) {return xmlReq(this.dsn,"removeNode",sel);}
	this._removeNode=function(sel) {return xmlReq(this.dsn,"_removeNode",sel);}
	this.moveUp=function (sel) {return xmlReq(this.dsn,"moveUp",sel);}
	this._moveUp=function (sel) {return xmlReq(this.dsn,"_moveUp",sel);}
	this.moveDown=function (sel) {return xmlReq(this.dsn,"moveDown",sel);}
	this._moveDown=function (sel) {return xmlReq(this.dsn,"_moveDown",sel);}
	this.moveNode=function (src,dest) {return xmlReq(this.dsn,"moveNode",src,"<![CDATA["+dest+"]]>");}
	this.aquireId=function (sel) {return xmlReq(this.dsn,"aquireId",sel);}
	this.delMedia=function (sel) {return xmlReq(this.dsn,"delMedia",sel);}
	this.imgInfo=function (sel) {return xmlReq(this.dsn,"imgInfo",sel);}
	return this;
}

function get_dsn(e) {
	e=unescape(e);
    var dsn=site;
	if (e.substr(0,1)=="#") {
	    var t=e.indexOf(":");
	    dsn=e.substr(1,t-1);
	    return dsns[dsn]?dsns[dsn]:site;
    }
    return site;
}

function getNode(sel) {return get_dsn(sel).getNode(sel);}
function getText(sel) {return get_dsn(sel).getText(sel);}
function getNodes(sel,tag) {return get_dsn(sel).getNodes(sel,tag);}
	// write functions
function setAttr(sel,dados) {return get_dsn(sel).setAttr(sel,dados);}
function langSync_setAttr(sel,dados) {return get_dsn(sel).langSync_setAttr(sel,dados);}
function setText(sel,dados)  {return get_dsn(sel).setText(sel,dados);}
function langSync_setText(sel,dados)  {return get_dsn(sel).langSync_setText(sel,dados);}
function replaceNode(sel,dados) {return get_dsn(sel).replaceNode(sel,dados);}
function setNode(sel,dados) {return get_dsn(sel).setNode(sel,dados);}
function overNode(sel,dados) {return get_dsn(sel).overNode(sel,dados);}
function insertBefore(sel,dados) {return get_dsn(sel).insertBefore(sel,dados);}
function insertAfter(sel,dados) {return get_dsn(sel).insertAfter(sel,dados);}
function insertNode(sel,dados) {return get_dsn(sel).insertNode(sel,dados);}
function appendNode(sel,dados) {return get_dsn(sel).appendNode(sel,dados);}
function removeNode(sel) {return get_dsn(sel).removeNode(sel);}
function _removeNode(sel) {return get_dsn(sel)._removeNode(sel);}
function moveUp (sel) {return get_dsn(sel).moveUp(sel);}
function _moveUp (sel) {return get_dsn(sel)._moveUp(sel);}
function moveDown (sel) {return get_dsn(sel).moveDown(sel);}
function _moveDown (sel) {return get_dsn(sel)._moveDown(sel);}
function aquireId (sel) {return get_dsn(sel).aquireId(sel);}
function delMedia (sel) {return get_dsn(sel).delMedia(sel);}
function imgInfo (sel) {return get_dsn(sel).imgInfo(sel);}

var bkoff=new xdb("bkoff");
var ctrl=new xdb("ctrl");
var log=new xdb("log");
var site=new xdb("site");
var news=new xdb("news");
var proto=new xdb("proto");
var db=new xdb("db");//sql?
var dsns={"bkoff":bkoff,"ctrl":ctrl,"log":log,"site":site,"news":news,"proto":proto,"db":db};

//--- core functions for xmlhttp
// tanto quanto possivel para FF e IE
function xmlhttp() {
	if (window.XMLHttpRequest)
		return new window.XMLHttpRequest;
	if (window.ActiveXObject)
		return new ActiveXObject("Microsoft.XMLHTTP");
	var t=new XMLHttpRequest();
	return t;
}

function loadXML(o,d) {
	if (window.ActiveXObject)
		o.loadXML(d);
	else
		o=new DOMParser().parseFromString(d,"text/xml");
	return o;
}

function xmldom() {
	if (window.ActiveXObject)
		return new ActiveXObject("Microsoft.XMLDOM");
	else
		return document.implementation.createDocument("","",null);
}

//Executa pedido xmlhttp ao url
function getURL(url,method) {
    if (!method) method="GET";
    var web = xmlhttp();
    web.open(method, url, 0);
    web.send("");
	//alert("getUrl.responseText->\n"+web.responseText);
    return web;
}

function getXML(url) {
   //alert("getXML('"+url+"')");
   return loadXML( xmldom(), getURL(url).responseText );
}

//make xml text for xserer request xd
function xserver_request_text(dsn,cmd,at,data,tag) {
	if (!data) data="";
	if (!tag) tag="";
	return "<"+"?xml version=\"1.0\" encoding=\"utf-8\"?><xmlreq ver=\"6.0\"><dsn>"+dsn+"</dsn><cmd>"+cmd+"</cmd><at>"+at+"</at><data>"+data+"</data><tag>"+tag+"</tag></xmlreq>";
}

//asyncronous comunication with xserver
var default_refresh_page=false;
function siteBlock(target,params,done,refresh_page) {
	try {
		if (typeof(refresh_page)=="undefined") refresh_page=default_refresh_page;
		params=params.substr(params.indexOf("?")+1);//strip old url
		if (refresh_page) {
			window.location="struct.asp?"+params;
		} else {
			target.innerHTML="Carregando...";
			$.ajax({
				type: "GET",
				async: true,
				url: "simple_page.asp",
				processData: false,
				//dataType: "html",
				data: params,
				timeout: 1000*xclientTimeout,
				//$(r).find("site_part").text()
				success: function(r,s) {
					var h=($(r).find("site_part").text());
					target.innerHTML=h;
					if (done) done();
				}
				,error: function() {ready=true;alert(" Falha de comunicação");}
			});
		}
	} catch(e) {
		if (debug||user.level<=0) throw(e);
	}
}

//!!!!JQuery BUG: prototyping Object or Element confuses jQuery because it sees new functions as jquery members and tryes to obey
//make chrome, safari, firefox xpath compatible with IE
/*function asXML(o) {
	if (!o.getNode)
        if (typeof(XPathEvaluator)!="undefined") {
            o.getNode = function (sXPath) {
                try {
                    var oEvaluator = new XPathEvaluator();
                    var oResult = oEvaluator.evaluate(sXPath, this, null,
                        XPathResult.FIRST_ORDERED_NODE_TYPE, null);
                    if (oResult != null) {
                        return oResult.singleNodeValue;
                    } else {
                        return null;
                    }
                } catch(e) {
                    alert(e.message+"\nerro xpath getNode('"+sXPath+"')\n"+this.outerHTML);
                    throw(e);
                }
            }
        } else if (o.selectSingleNode)
            o.getNode = o.selectSingleNode;
				alert("object has no selectSingleNode! "+typeof(o.selectSingleNode));

	if (!o.getNodes)
        if (typeof(XPathEvaluator)!="undefined") {
            o.getNodes = function (sXPath) {
                var oEvaluator = new XPathEvaluator();
                var oResult = oEvaluator.evaluate(sXPath, this, null,
                    XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
                var aNodes = new Array;
                if (oResult != null) {
                    var oElement = oResult.iterateNext();
                    while(oElement) {
                        aNodes.push(oElement);
                        oElement = oResult.iterateNext();
                    }
                }
                return aNodes;
            };
        } else if (o.selectNodes)
            o.getNodes = o.selectNodes;
    
    if (!o.xml&&XMLSerializer) {
        o.xml=function() {return new XMLSerializer().serializeToString(this);}
    }
    if (!Element.prototype.getText) {
        //alert("getText "+this);
        o.getText=function() {return this.text?this.text:this.textContent;};
    }
    return o;
}

//new sync. requester +browser compatible
function xmlReq(dsn,cmd,at,data,tag) {
	//return xclient(document,dsn,cmd,at,data,tag);
	//alert("new xmlReq");
	//console.warn("xmlReq: "+xserver_request_text(dsn,cmd,at,data,tag));
	var rx =loadXML(xmldom(),xserver_request_text(dsn,cmd,at,data,tag));
	var ready=false;
	var ret=null;
	$.ajax({//abr 2010, implementada utilizando JQuery
		type: "POST",
		async: false,
		url: "../site/xserver.asp",
		processData: false,
		//dataType: "xml",
		data: rx,
		timeout: 1000*xclientTimeout,
		success: function(r,s) {
			//ready=true;ret=r;return;
			var res=$(r);
			if (res.find("xmlres").attr("status")=="0") {
                asXML(r);
                ret=r.getNode("/xmlres/*");
                //ret=r.lastChild.getNode("/xmlres/*");
			} else {
				alert("Erro: "+res.text());
				//ret=""+carga;
			}
			ready=true;
		}
		,error: function(r,e) {
            ready=true;
            document.lastError=r;
            alert("Falha de comunicação sincrona \n"+cmd+"("+at+")\n"+e+"\n"+r.statusText);
        }
	});
	if (!ready) alert("O servidor não respondeu dentro do tempo especificado...");
	return ret;
}*/

//novo formulador de pedido compativel com outros browsers + jquery
/*function xmlReq(dsn,cmd,at,data,tag) {
	//alert("new xmlReq");
	var rx =loadXML(xmldom(),xserver_request_text(dsn,cmd,at,data,tag));
	var ready=false;
	var ret=null;
	$.ajax({//abr 2010, implementada utilizando JQuery
		type: "POST",
		async: false,
		url: "../site/xserver.asp",
		processData: false,
		dataType: "xml",
		data: rx,
		timeout: 1000*xclientTimeout,
		success: function(r,s) {
			//ready=true;ret=r;return;
			var res=$(r);
			if (res.find("xmlres").attr("status")=="0") {
				if (ie)
					ret=r.selectSingleNode("/xmlres/*");
				else {
					ret=r.lastChild.selectSingleNode("/xmlres/*");
				}
			} else {
				alert("Erro: "+res.text());
				//ret=""+carga;
			}
			ready=true;
		}
		,error: function() {ready=true;alert(" Falha de comunicação");}
	});
	//while((!ready)||((new Date()-t)<(1000*xclienttimeout))) {alert(new Date()-t);}
	//while(!ready);
	if (!ready) alert("O servidor não respondeu dentro do tempo especificado...");
	return ret;
}*/

//enviar pedidos ao server xml
/*function xmlReq(dsn,cmd,at,data,tag) {
	//alert("xmlReq 6.0: #"+dsn+":"+cmd+"("+at+")");
	document.body.style.cursor='wait';
	try {
		var req=xmlhttp();
		//alert("calling server:"+base_dom+folder+"site/xserver.asp",false);
		req.open("POST",base_dom+folder+"site/xserver.asp",false);
		var xmlrec=xmldom();
		//b@KOffee 6.0 protocol ---------
		//alert(data);
		xmlrec.async=false;
		xmlrec=loadXML(xmlrec,"<xmlreq ver='6.0'><dsn>"+dsn+"</dsn><cmd>"+cmd+"</cmd><at>"+at+"</at><data>"+data+"</data><tag>"+tag+"</tag></xmlreq>");
		//alert(xmlrec.xml);
		xmlrec.timeout=xclientTimeout*1000;
		xmlrec.ontimeout=function() {alert("O Servidor não respondeu no limite de tempo, os dados podem não ter sido guardados.\n\rRepita a operação.");}
		req.send(xmlrec);
		switch (req.status) {
        case 200:break;
		case 302:alert('xclient: não foi possivel enviar o pedido');break;
		default:alert('xclient status:'+req.status+"\n"+xmlrec.xml);
		}
		var res=null;
		if (window.ActiveXObject) {
			res=req.responseXML.documentElement;
		} else {res.firstChild
			res=req.responseXML.firstChild;
		}
		//alert(""+res);
		document.body.style.cursor='auto';
		if (!res) alert("xclient - xserver devolveu resultado nulo");
		else {
			//dump(res);
			//alert(res.selectSingleNode("/xmlres/@status").text);
			var resCode=typeof(res.selectSingleNode)=="undefined"?res.attributes.item(1).textContent:res.selectSingleNode("/xmlres/@status").text;
			//alert("resCode:"+resCode);
			if (resCode=="0") {
                //if (debug) alert("saved");
				return res.firstChild;//res.selectSingleNode("/xmlres").firstChild;
			} else {
				alert("xserver erro:#"+resCode+"\n"+res.textContent+"->"+at);
					//res.selectSingleNode("/xmlres").firstChild.text);
				if (resCode=="8") navigate(".");
			}
			return null;
		}
		return res;
	} catch(e) {
		document.body.style.cursor='auto';
		alert("client side: "+e.message);
		if (debug) throw(e);
	}
	document.body.style.cursor='auto';
	return null;
}*/

//enviar pedidos ao server xml (DI tested)
function xmlReq(dsn,cmd,at,data,tag) {
	//alert("xmlReq 6.0");
	document.body.style.cursor='wait';
	try {
		var req=xmlhttp();
		//alert(base_dom+folder+revision+"/site/xserver.asp");
		function abortXMLReq() {alert("O server excedeu o tempo limite de resposta...\nos dados não foram gravados.");req.abort();}
		req.open("POST",folder+"site/xserver.asp",false);
		var xmlrec=xmldom();
		//b@KOffee 6.0 protocol ---------
		//alert(data);
		xmlrec.async=false;
		xmlrec=loadXML(xmlrec,"<xmlreq ver='6.0'><dsn>"+dsn+"</dsn><cmd>"+cmd+"</cmd><at>"+at+"</at><data>"+data+"</data><tag>"+tag+"</tag></xmlreq>");
		//alert(xmlrec.xml);
    	req.timeout=xmlhttp_timeout;
    	req.ontimeout=abortXMLReq;
		req.send(xmlrec);
		switch (req.status) {
        case 200:break;
		case 302:alert('xclient: não foi possivel enviar o pedido');break;
		default:alert('xclient status:'+req.status+"\n"+xmlrec.xml);
		}
		var res=null;
		if (window.ActiveXObject) {
			res=req.responseXML.documentElement;
		} else {
			res=req.responseXML.firstChild;
		}
		//alert(""+res);
		document.body.style.cursor='auto';
		if (!res) alert("xclient - xserver devolveu resultado nulo\n"+cmd+": "+at);
		else {
			//alert(res.selectSingleNode("/xmlres/@status").text);
			if (res.selectSingleNode("/xmlres/@status").text=="0")
				return res.selectSingleNode("/xmlres").firstChild;
			else {
				alert("xserver erro:#"+res.selectSingleNode("/xmlres/@status").text+"\n"+
					res.selectSingleNode("/xmlres").firstChild.text);
				if (res.selectSingleNode("/xmlres/@status").text=="8") navigate(".");
			}
			return null;
		}
		return res;
	} catch(e) {
		document.body.style.cursor='auto';
		alert("client side: "+e.message);
		if (debug) throw(e);
	}
	document.body.style.cursor='auto';
	return null;
}

//function xmlReq(dsn,cmd,at,data,tag) {return ie?ie_xmlReq(dsn,cmd,data,tag):wk_xmlReq(dsn,cmd,data,tag);}

