/**
 * BlackLight - A server side webpage framework
 *
 * @package BlackLight
 * @author Icewind <icewind (at) derideal (dot) com>
 * @copyright 2009
 * @license http://www.gnu.org/licenses/gpl.html GNU Public License
 * @url http://blacklight.metalwarp.com
 * @version 0.1
 */

var READY_STATE_UNINITIALIZED=0;
var READY_STATE_LOADING=1;
var READY_STATE_LOADED=2;
var READY_STATE_INTERACTIVE=3;
var READY_STATE_COMPLETE=4;

BLXMLLoader=function(caller){
	this.caller=caller;
	this.method="";
	this.type="";
	this.request="";
	this.callBack=null;
	this.errorCallBack=this.defaultError;
}

BLXMLLoader.prototype={
	/**
	 * Loads an XML document
	 * @param string url
	 * @param string request
	 * @none
	 */
	async:true,
	load:function(url,request){
		request=(request)?request:"";
		method=(this.method)?this.method:"GET";
		contentType=(!this.type && method=="POST")?"application/x-www-form-urlencoded":this.type;
		if(window.XDomainRequest){
			req=new XDomainRequest();
		}else if(window.XMLHttpRequest){
			req=new XMLHttpRequest();
		}else if(window.ActiveXObject){
			req=new ActiveXObject('Microsoft.XMLHTTP')
		}
		if (req){
			try{
				var loader=this;
				req.onreadystatechange=function(){
					loader.onReadyState.call(loader,req)
				}
				req.open(method,url,this.async);
				if (contentType){
					req.setRequestHeader("Content-Type",contentType);
				}
				if(method=="POST"){
					req.setRequestHeader("Content-length", request.length);
					req.setRequestHeader("Connection", "close");
				}
				req.send(request);
			}catch (err){
				this.errorCallBack.call(this.caller,req);
			}
		}
	},
	onReadyState:function(req){
		var ready=req.readyState;
		if (ready==READY_STATE_COMPLETE){
			var HttpStatus=req.status;
			if (HttpStatus==200 || HttpStatus==0){
				//alert("response: "+this.req.responseText);
				this.callBack.call(this.caller,req);
			}else{
				this.errorCallBack.call(this.caller,req);
			}
		}
	},
	defaultError:function(req){
		new BLError(SL_ERROR_ERROR,"Error fetching data!"
		+"\n\n<br/><br/>ReadyState: "+req.readyState
		+"\n<br/>Status: "+req.status
		+"\n<br/>Headers: "+req.getAllResponseHeaders()
		+"\n<br/>File: "+req.url
		+"\n<br/>Response:  "+req.responseText);
	},
	/**
	 * Sets the request method
	 * @param string method
	 * @none
	 */
	setMethod:function(method){
		this.method=method;
	},
	/**
	 * Sets the content type
	 * @param string type
	 * @none
	 */
	setType:function(type){
		this.type=type;
	},
	/**
	 * Sets the callback function
	 * @param function callBack
	 * @none
	 */
	setCallBack:function(callBack){
		this.callBack=callBack;
	},
	/**
	 * Sets the error callback function
	 * @param function errorCallBack
	 * @none
	 */
	setErrorCallBack:function(errorCallBack){
		this.errorCallBack=errorCallBack;
	}
}

testClass=function(){
}

testClass.prototype={
	testFunc:function(){
		this.test="test";
		test=new BLXMLLoader(this);
		test.setCallBack(this.callBack);
		test.load(parseUri('%root%/data/sites/index.xml'));
	},
	callBack:function(req){
		alert(this.test);
		alert(req.responseText);
	}
}
test=new testClass()
test.testFunc
// mainLoadStack.append(test.testFunc,test);
