/**
* @author Hugo Ferreira da Silva
* @link http://www.hufersil.com.br/ HUFERSIL.WEBDESIGN
*/

function Ajax () {
	this.obj = false;
	this.listeners = [];
	this.parameters =[];
	this.method = 'POST';
	this.id = new Date().getTime();
}

Ajax.prototype.createObj = function () {
	var xmlhttp = false;
	try{
		xmlhttp = new XMLHttpRequest();
	}catch(ee){
		try{
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		}catch(e){
			try{
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			}catch(E){
				xmlhttp = false;
			}
		}
	}
	return xmlhttp;
}

Ajax.prototype.addParameter = function(name, value) {
	this.parameters.push( escape(name)+'='+escape(value) );
}

Ajax.prototype.removeParameter = function (n) {
	n=escape(n);
	var l=[];
	for(var i=0;i<this.parameters.length; i++) {
		var p=this.parameters[i].split('=')[0];
		if(p!=n) {
			l.push(this.parameters[i]);
		}
	}
	this.parameters=l;
}

Ajax.prototype.send = function(url,data) {
	var params = this.parameters.join('&');
	if(this.method.toLowerCase() == 'get') {
		url = url + '?' + params;
		data = null;
	} else {
		if(data == undefined) {
			data = params;
		}
	}

	var ref=this;
	this.obj = this.createObj();
	this.obj.open(this.method, url, true);
	if(this.method.toLowerCase()=='post') {
		this.obj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	}
	this.obj.onreadystatechange = function () {
		ref.callback();
	}
	this.obj.send( data );
}

Ajax.prototype.callback = function () {
	if(this.obj.readyState == 2) {
		this._dispatch( 'loading' );
	}
	if(this.obj.readyState == 4) {
		this._dispatch( 'load' );
	}
}

Ajax.prototype.addListener = function (lis) {
	this.listeners.push( lis );
}

Ajax.prototype.removeListener = function (lis) {
	var n=[];
	for(var i=0;i<this.listeners.length; i++) {
		if(this.listeners[i] != lis) {
			n.push( this.listeners[i] );
		}
	}
	this.listeners = n;
}

Ajax.prototype._dispatch = function (evtType) {
	for(var i=0; i<this.listeners.length; i++) {
		if(this.listeners[i].type == evtType) {
			this.listeners[i].execute( this.obj );
		}
	}
}

Ajax.prototype.DOMXML = function ( str ) {
	var step=null;
	if(window.ActiveXObject) {
		step=new ActiveXObject("Microsoft.XMLDOM");
		step.loadXML( str );
	} else if(typeof(DOMParser) != 'undefined') {
		step=new DOMParser().parseFromString( str, 'text/xml' );
	}
	return step;
}
Ajax.prototype.resetParameters = function () {
	this.parameters=new Array();
}
Ajax.prototype.resetListeners = function () {
	this.listeners=new Array();
}
Ajax.prototype.addForm = function ( theForm ) {
	var list=theForm.elements;
	for(var i=0; i<list.length; i++) {
		switch(list[i].type.toLowerCase()) {
			case "select-one":
			case "hidden":
			case "text":
			case "textarea":
				this.addParameter(list[i].name, list[i].value);
			break;
			case "radio":
			case "checkbox":
				if(list[i].checked == true) {
					this.addParameter(list[i].name, list[i].value);
				}
			break;
		}
	}
}

Ajax.prototype.getNodeByName = function ( node, nodename) {
	for(node; node!=null; node=node.nextSibling) {
		if(node.nodeName == nodename) {
			return node;
		}
	}
	return false;
}

Ajax.prototype.getNodelistByName = function(node, nodename) {
	var list = new Array();
	for(node; node!=null; node=node.nextSibling) {
		if(node.nodeName == nodename) {
			list.push(node);
		}
	}
	return list;
}