//drjs.xml.js - Dependencies: ajax
//XSL Functions

try {
	//Cheating at FF, so the # anchor bug wont affect us
	XSLTProcessor._styleSheetFix = null;
	XSLTProcessor.prototype._importStylesheet = XSLTProcessor.prototype.importStylesheet;
	XSLTProcessor.prototype.importStylesheet = function(oStylesheet){
        if (!this.constructor._styleSheetFix){
                var oXMLHttpRequest = new XMLHttpRequest();
                oXMLHttpRequest.open('GET', _drjsPath + 'stylesheet.xsl', false);
                oXMLHttpRequest.send(null);
                this.constructor._styleSheetFix = oXMLHttpRequest.responseXML;
        }
		this.constructor._styleSheetFix.replaceChild(oStylesheet.documentElement.cloneNode(true), this.constructor._styleSheetFix.documentElement);
        return this._importStylesheet(this.constructor._styleSheetFix);
	}
} catch(e){}

var XSLBinder = {
	Apply: function(xslrequest) {
		var str = "";
		if(window.ActiveXObject) {
			var xmlObj = new ActiveXObject("Msxml2.DOMDocument");
			xmlObj.loadXML(xslrequest.XMLResponse);
			var xsltObj = new ActiveXObject("Msxml2.FreeThreadedDOMDocument");
			xsltObj.loadXML(xslrequest.XSLResponse);
			var xslTemplate = new ActiveXObject("Msxml2.XSLTemplate");
			xslTemplate.stylesheet = xsltObj;
			var xslProc = xslTemplate.createProcessor();
			if(xslrequest.Parameters!=null) {
				for(var i=0; i<xslrequest.Parameters.Values.length; i++) {
					xslProc.addParameter(xslrequest.Parameters.Values[i][0], xslrequest.Parameters.Values[i][1]);
				}
			}
			xslProc.input = xmlObj;
			xslProc.transform();
			str = xslProc.output;
			
			var re = new RegExp("&#xA;","gim");
			str = str.replace(re, "");
			str = str.substr(str.indexOf("?>")+2);		
			xslrequest.ResponseText = str;
			$(xslrequest.Target).SetContent(str);
		} else {
			var vv = new DOMParser();
			var xsl2 = vv.parseFromString(xslrequest.XSLResponse, "text/xml");
			var xml2 = vv.parseFromString(xslrequest.XMLResponse, "text/xml");
			var xslp = new XSLTProcessor();
			if(xslrequest.Parameters!=null) {
				for(var i=0; i<xslrequest.Parameters.Values.length; i++) {
					xslp.setParameter(null, xslrequest.Parameters.Values[i][0], xslrequest.Parameters.Values[i][1]);
				}
			}
			xslp.importStylesheet(xsl2);
			var fobj = xslp.transformToFragment(xml2, document);
			if(xslrequest.Target!=null) {
				try {
					$(xslrequest.Target).innerHTML = "";
					$(xslrequest.Target).removeChild($(xslrequest.Target).firstChild);
				} catch(e) {}
				$(xslrequest.Target).appendChild(fobj);
			}
			var html = $(xslrequest.Target).innerHTML;
			html = html.replace(/&lt;/g, "<").replace(/&gt;/g, ">");
			html = html.replace(/&amp;lt;/g, "<").replace(/&amp;gt;/g, ">");
			html = html.replace(/<script[^>]*>([\\S\\s]*?)<\/script>/g, "");
			$(xslrequest.Target).SetContent(html);
		}
		if(xslrequest.Callback!=null) {
			xslrequest.Callback(xslrequest);
		}
	},
	Bind: function(xmlRequest, xslRequest, parameters, callback, target) {
		XSLBinderRequestQueue.AddRequest(new XSLBinderRequest(xmlRequest, xslRequest, parameters, callback, target));
	}
};

var XSLBinderRequest = Class.Create();
XSLBinderRequest.AddMethods({
	Callback: null,
	Parameters: null,
	ResponseText: null,
	Target: null,
	XMLRequest: null,
	XMLResponse: null,
	XSLRequest: null,
	XSLResponse: null,
	_constructor: function(xmlRequest, xslRequest, parameters, callback, target) {
		if(typeof(xmlRequest)=="string") {
			this.XMLResponse = xmlRequest;
		} else {
			this.XMLRequest = xmlRequest;
			this.XMLRequest.UseQueueEvents = false;
		}
		if(typeof(xslRequest)=="string") {
			this.XSLResponse = xslRequest;
		} else {
			this.XSLRequest = xslRequest;
			this.XSLRequest.UseQueueEvents = false;
		}
		this.Parameters = parameters;
		this.Callback = callback;
		this.Target = target;
	}
});

var XSLBinderRequestQueue = {
	currentRequest: null,
	currentRequestDone: 2,	//0-None loaded, 1-Only XML loaded, 2-All loaded, 4-Only XSL loaded
	currentXML: null,
	currentXSL: null,
	posXML: null,
	posXSL: null,
	requests: [],
	OnXMLRequestLoad: null,
	OnXSLRequestLoad: null,
	AddRequest: function(binderRequest) {	
		this.requests.push(binderRequest);
		this.checkQueue();
	},
	CallbackFunction: function(request, pos) {
		if (request != null) { // alterado moises: if request == null ver > nextRequest: function(), linha 169
			if(pos==XSLBinderRequestQueue.posXML) {
				XSLBinderRequestQueue.currentRequest.XMLResponse = request.ResponseText;
				if(XSLBinderRequestQueue.currentRequestDone==0) {
					XSLBinderRequestQueue.currentRequestDone = 1;
				} else if(XSLBinderRequestQueue.currentRequestDone==4) {
					XSLBinderRequestQueue.currentRequestDone = 2;
				}
				if((typeof(XSLBinderRequestQueue.OnXMLRequestLoad)=="function" || typeof(XSLBinderRequestQueue.OnXMLRequestLoad)=="object") && XSLBinderRequestQueue.OnXMLRequestLoad!=null) {
					XSLBinderRequestQueue.OnXMLRequestLoad(request);
				}
			} else if(pos==XSLBinderRequestQueue.posXSL) {
				XSLBinderRequestQueue.currentRequest.XSLResponse = request.ResponseText;
				if(XSLBinderRequestQueue.currentRequestDone==0) {
					XSLBinderRequestQueue.currentRequestDone = 4;
				} else if(XSLBinderRequestQueue.currentRequestDone==1) {
					XSLBinderRequestQueue.currentRequestDone = 2;
				}
			}
		}
		if(XSLBinderRequestQueue.currentRequestDone==2) {
			XSLBinder.Apply(XSLBinderRequestQueue.currentRequest);
			XSLBinderRequestQueue.currentRequest = null;
			XSLBinderRequestQueue.checkQueue();
		}
	},
	checkQueue: function() {
		if(this.currentRequest==null) {
			this.nextRequest();
		}
	},
	nextRequest: function() {
		if(this.requests.length>0) {
			this.currentRequest = this.requests[0];
			this.requests = this.requests.removePos(0);
			this.currentRequestDone = 0;
			if(this.currentRequest.XMLRequest!=null || this.currentRequest.XSLRequest!=null) {
				if(this.currentRequest.XMLRequest!=null) {
					this.currentRequest.XMLRequest.Callback = this.CallbackFunction;
					this.posXML = AjaxRequestQueue.AddRequest(this.currentRequest.XMLRequest.Copy());
				} else {
					this.currentRequestDone = 1;
				}
				if(this.currentRequest.XSLRequest!=null) {
					this.currentRequest.XSLRequest.Callback = this.CallbackFunction;
					this.posXSL = AjaxRequestQueue.AddRequest(this.currentRequest.XSLRequest.Copy());
				} else {
					this.currentRequestDone = 4;
				}
			} else {
				XSLBinderRequestQueue.currentRequestDone = 2;
				this.CallbackFunction(null, -1);
			}
		}
	}
};

var XSLParameters = Class.Create();
XSLParameters.AddMethods({
	Values: [],
	_constructor: function() {
		this.Values = [];
	},
	AddParam: function(name, value) {
		if(name!=null && value!=null && typeof(name)!="undefined" && typeof(value)!="undefined") {
			this.Values.push([name, value]);
		}
	}
});

drjs.loadComplete(drjs.files.xsl);