var _BT = (function (){ //browser type
	var cfr = function (s){return navigator.userAgent.indexOf(s)!= -1}
	var t = 'Other';
	if(cfr("MSIE")) t="IE";
	else if(cfr("Gecko/")) t="Moz";
	else if(cfr("Opera/")) t="Op";
	return t;
	})();

var browser = {type : _BT,
isIE:(_BT=="IE"),isMoz:(_BT=="Moz"),isOpera:(_BT=="Op"),isNoIE:(_BT!="IE")}
var isIE=browser.isIE, isMoz= browser.isMoz;

var jsXML = {
	getXMLHttpRequest : function(){
		return (typeof(XMLHttpRequest) != 'undefined')? new XMLHttpRequest():createObject("Msxml2.XMLHTTP", "Microsoft.XMLHTTP");
	},
	setPost : function (req) {
		req.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");
	},
	sendSync : function(url,body,setHeadersCallback){
		var req = this.getXMLHttpRequest();
		method=(arguments[3])?arguments[3]:"POST";
		req.open(method, url, false);
		if (method=="POST") jsXML.setPost(req);
		if(setHeadersCallback!=null && (typeof(setHeadersCallback)=='function')) setHeadersCallback(req);
		req.send(body);
		return req.responseText;
	},
	sendAsync : function (method,url,body,action,onfault,onwait,setHeadersCallback) {
		var req = this.getXMLHttpRequest();
		var onreadystate = function (){
			if (req.readyState == 4) {
				try{
					if (req.status && req.status == 200) {				
						if(action!=null) action(req.responseText,req);
					}
					else {
						if(onfault!=null) onfault(req.statusText);
					}
				}
				catch(e){/*prevent NS_ERROR_NOT_AVAILABLE*/}
			}
			else {
				if(onwait!=null) onwait(req.readyState);
			}
		}
		req.onreadystatechange = onreadystate;
		req.open(method, url, true);
		if (method=="POST") jsXML.setPost(req);
		if(setHeadersCallback!=null && (typeof(setHeadersCallback)=='function')) setHeadersCallback(req);
		if(body==null) body='';
		req.send(body);
	},
	sendSyncPost : function(url,body){return this.sendSync(url,body,'POST')},
	sendSyncGet : function(url,body){return this.sendSync(url,body,'GET')},
	sendAsyncGet : function (url,body,action,onfault,onwait) {
		this.sendAsync("GET",url,body,action,onfault,onwait);
	},
	sendAsyncPost : function (url,body,action,onfault,onwait) {
		this.sendAsync("POST",url,body,action,onfault,onwait);
	},
	direct : function (url,body) {//richiesta sincrona valutata direttamente come xml
		return	jsXML.parseXMLDocument(jsXML.sendSync(url,body,arguments[2]||'POST'));
	},
	/*
	deserialize attributes in obj
		onDeserializeCallback [unnamed argument] -> (currentObj , propertyName , propertyValue)
	*/
	deserialize : function (xmlNode/*,onDeserializeCallback*/) {
		var obj = {};
		var onDeserializeCallback = arguments[1]||null;
		for(var i=0;i<xmlNode.attributes.length;i++){
			var a = xmlNode.attributes[i];
			var name = a.nodeName, value = a.nodeValue;		
			obj[name] = value;
			if(onDeserializeCallback && typeof(onDeserializeCallback)=='function') {
				onDeserializeCallback(obj,name,value);
			}
		}
		return obj;
	},
	//deserialize nodelist in obj array
	deserializeList : function (xmlNodeList/*,onDeserializeCallback*/){
		var r = [];
		var onDeserializeCallback = arguments[1]||null;
		for(var i=0;i<xmlNodeList.length;i++){
			r.push(this.deserialize(xmlNodeList[i],onDeserializeCallback));
		}
		return r;
	},
	insertAfter : function (newElement,targetElement) {
		var parent = targetElement.parentNode;
		if(parent.lastChild == targetElement) {parent.appendChild(newElement);}
		else parent.insertBefore(newElement, targetElement.nextSibling);
	},
	moveNode : function (targetNode,destNode,direction){
		var p = targetNode.parentNode;
		if(p==destNode.parentNode){
			var c=targetNode.cloneNode(true);
			if(direction=="before") {p.insertBefore(c, destNode)}
			else this.insertAfter(c,destNode);
			p.removeChild(targetNode);
		}
		else throw "nodes not have same parent"
	},
	moveBefore : function (targetNode,destNode){this.moveNode(targetNode,destNode,"before")},
	moveAfter : function (targetNode,destNode){this.moveNode(targetNode,destNode,"after")},
	/*
	jsXML.parseXMLDocument :legge il documento 
	*/
	parseXMLDocument : function (xmlText,ns) {
		var space = (ns)?ns:'';
		var doc = jsXML.createDOMDocument(space,'root');
		doc.loadXML (xmlText);
		return doc;
	},
	/*
	jsXML.openDOMDocument : carica il documento in modo sincrono
	*/
	openDOMDocument : function (url) {
		var doc = this.createDOMDocument ("","root");
		doc.async = false;
		doc.load(url);
		return doc;
	},
	/*crea un nuovo documento vuoto*/
	newDOMInstance : function(){
		if(browser.isNoIE) return this.standardDomInstance("","", null);
		else return this.IEDomInstance();
	},
	/*
	jsXML.newDOMDocument : 	crea un nuovo documento 
	*/
	newDOMDocument : function(){	
		var rootname = (arguments[0]==null)?'root':arguments[0];
		return jsXML.createDOMDocument('',rootname);
	},
	/*
	jsXML.createDOMDocument : funzione completa di creazione di un nuovo documento 
	*/
	createDOMDocument : function(strNamespaceURI, strRootTagName) {
	    var objDOM = null;
	    if(browser.isNoIE)  {
	        objDOM = this.standardDomInstance(strNamespaceURI, strRootTagName, null);
			if(!objDOM.load) objDOM.addEventListener("load", _Document_onload, false);
	    }
		else{
	        objDOM = this.IEDomInstance();
	        if (strRootTagName && strRootTagName!='') {
	            if (strNamespaceURI) 
	                objDOM.loadXML("<a0:" + strRootTagName + " xmlns:a0=\"" + strNamespaceURI + "\" />");
	            else 
	                objDOM.loadXML("<" + strRootTagName + "/>");
	        }
	    }
	    return objDOM;
	},
	//funziona in tutti i browser al posto di element.xml
	getXML : function (node){ 
		return (browser.isIE)?node.xml:_Node_getXML.call(node);
	},
	//funziona in tutti i browser al posto di element.text
	getText : function (node){
		return ('text' in node)?node.text: _Node_getText.call(node);
	},
	setText : function (node,text){
		if ('text' in node) node.text = text;
		else _Node_setText.call(node,text);
	},
	IEDomInstance : function (){ return createObject("Msxml2.DOMDocument","Microsoft.XmlDom")},
	standardDomInstance : function (){return document.implementation.createDocument(arguments[0], arguments[1], arguments[2])}
}; // jsXML

//-----------------------------------------------------------------
// IE Initialization
//-----------------------------------------------------------------
if (browser.isIE) {
	function createObject(){ // crea oggetto activeX tentando diversi ProgID quanti sono i parametri
		var progIdArray = arguments;
		for(var i=0;i<progIdArray.length;i++){
			try {return new ActiveXObject(progIdArray[i])}catch (ex) {}
		}
		return null;
	}
	
} //End: if

//-----------------------------------------------------------------
// Mozilla/Opera Initialization
//-----------------------------------------------------------------
if (browser.isNoIE) {
//Start internal functions
function _Document_load(strURL) {	
	this.loadXML (jsXML.sendSync(strURL,'','GET'));

//	this.parseError = 0; //set the parseError to 0
//	changeReadyState(this, 1); //change the readyState
//	try {this.__load__(strURL);/*call the original load method*/} 
//	catch (objException) { this.parseError = -9999999; //set the parseError attribute
//	changeReadyState(this, 4); /*change the readystate*/} 
	
}
//function _Document_onload() {handleOnLoad(this) }//handle the onload event

function handleOnLoad(objDOMDocument) {
	if (!objDOMDocument.documentElement || objDOMDocument.documentElement.tagName == "parsererror")
	      objDOMDocument.parseError = -9999999; //check for a parsing error
    //changeReadyState(objDOMDocument, 4); //change the readyState
}
/*
function changeReadyState(objDOMDocument, iReadyState) {
	    objDOMDocument.readyState = iReadyState; //change the readyState
	    if (objDOMDocument.onreadystatechange != null && typeof objDOMDocument.onreadystatechange == "function")
	        objDOMDocument.onreadystatechange();
}*/
function _Node_getText() {
		var s = "";
		for(var i=0;i<this.childNodes.length;i++){
			if(this.childNodes[i].nodeType == 3) s += this.childNodes[i].nodeValue; //#text
			else if(this.childNodes[i].nodeType == 4) {
				// s += this.childNodes[i].firstChild.nodeValue; //CDATA
				 s += this.childNodes[i].nodeValue;
			 }
		}
	return s;
}
function _Node_setText(value) {
	var i = this.childNodes.length;
	while(--i>=0) this.removeChild(this.childNodes[i]);
	this.appendChild(this.ownerDocument.createTextNode(value))
}

function _Node_getXML() {
	return new XMLSerializer().serializeToString(this)
}
//End internal functions

	//loadXML
    Document.prototype.loadXML = function(strXML) {
        //change the readystate
        // changeReadyState(this, 1);
        //create a DOMParser
        var objDOMParser = new DOMParser();
        //create new document from string
        var objDoc = objDOMParser.parseFromString(strXML, "text/xml");
        //remove all nodes from the document
		while (this.hasChildNodes()){
			this.removeChild(this.lastChild);
		}
        for (var i=0; i < objDoc.childNodes.length; i++) {
            var objImportedNode = this.importNode(objDoc.childNodes[i], true);
            this.appendChild(objImportedNode);
        } 
        handleOnLoad(this);
    } 

	//transformNodeToObject
	Document.prototype.transformNodeToObject = function(stylesheet, outputObject){
		var xsltProcessor = new XSLTProcessor();
		xsltProcessor.importStylesheet(stylesheet);
		var fragment = xsltProcessor.transformToFragment(this, document);
		outputObject.loadXML(jsXML.getXML(fragment));
	}
	Element.prototype.transformNodeToObject = function(stylesheet, outputObject){
        var oDoc = document.implementation.createDocument("", "", null);
		oDoc.loadXML(jsXML.getXML(this));
		oDoc.transformNodeToObject(stylesheet,outputObject);
    }
	
	//transformNode
	Document.prototype.transformNode = function(stylesheet){
		var xsltProcessor = new XSLTProcessor();
		xsltProcessor.importStylesheet(stylesheet);
		var fragment = xsltProcessor.transformToFragment(this, document);
		return jsXML.getXML(fragment)
    }

	Element.prototype.transformNode = function(stylesheet){
        var oDoc = document.implementation.createDocument("", "", null);
		oDoc.loadXML(jsXML.getXML(this));
		return oDoc.transformNode(stylesheet)
    }
	
    //add the readystate attribute for a Document
    Document.prototype.readyState = "0";

    //save a reference to the original load() method
    Document.prototype.__load__ = Document.prototype.load;

    //create our own load() method
    Document.prototype.load = _Document_load;

    //add the onreadystatechange attribute
    Document.prototype.onreadystatechange = null;

    //add the parseError attribute
    Document.prototype.parseError = 0;

	//Mozilla can emulate properties
	if(browser.isMoz) {
		//Node.text
		Node.prototype.__defineGetter__("text", _Node_getText);
		Node.prototype.__defineSetter__("text", _Node_setText);
		
		//Node.xml
		Node.prototype.__defineGetter__("xml", _Node_getXML);
    }
	
	if (browser.isNoIE && !browser.isMoz) {
		Node.prototype.xml = "node.xml not supported in Opera use jsXML.getXML(node) instead!";
	}	
// ---- / XPATH -------------------------------------------------------
    if(browser.isMoz) {
		XMLDocument.prototype.selectNodes = function(xpathExpression, contextNode){
			var NSResolver = this.createNSResolver(this.documentElement);
			var oResult = this.evaluate(xpathExpression,
	                    (contextNode?contextNode:this),
	                    NSResolver,
	                    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
			var nodeList = [];
			for(var i=0; i< oResult.snapshotLength; i++) {
				nodeList.push(oResult.snapshotItem(i));
			}
	        return nodeList;
	    }
		XMLDocument.prototype.selectSingleNode = function(sExpr, contextNode){
			var nodeList = this.selectNodes(sExpr, contextNode);
			if (nodeList.length>0) return nodeList[0];
		}
		   //selectNodes
		Element.prototype.selectNodes = function(sExpr) {
			return this.ownerDocument.selectNodes(sExpr,this);
		}
		//selectSingleNode
		Element.prototype.selectSingleNode = function(sExpr) {
			return this.ownerDocument.selectSingleNode(sExpr,this);
		}
	} 
	

// ----  XPATH / -------------------------------------------------------
} //End: if noIE


//parser valori data da sql
function XMLGetDate (sDate) {
	if(sDate=="0.00.00") return "";
	var ws = sDate.indexOf(" ");
	return sDate.substring(0,ws);
}

function XMLGetTime (sDate) {
	if(sDate=="0.00.00") return "";
	var ws = sDate.indexOf(" ");
	sDate =sDate.substr(ws + 1);
	sDate =sDate.substring(0,sDate.lastIndexOf("."));
	sDate = sDate.replace("\.",":");
	return sDate;
}
