/**
*JAsafelloX - (AJAX Framework) Version 0.1.0.0
*(Just Another Simple Ajax Framework Enviroment Linked Layer Over XML)
*
*Copyright 2006 - Jose Santiago Caama¤o Hermida
*
*
*(GNU License)
*
*
*Objects In this File
*   -JAsafelloX()
*   -------------
*     Main class AJAX Framework
*
*    Methods:
*      get(httpUrl,[requestHandler[,errorHandler[,params]]])
*      post(httpUrl,[requestHandler[,errorHandler[,params]]])
*      getXMLHttpRequest()
*      toSring()
*
*    Sample Usage:
*      new JAsafelloX().get("sriptPage.cgi?id=0");
*    

* 
*   -Parameters()
*   -------------
*     Container for store parameters
*
*    Methods:
*      getParameterName(index)
*      getParameterValue(index)
*      get(keyName)
*      put(name,value)
*      contains(keyName)
*      remove(keyName)
*      lenght()
*
*    Sample Usage:
*     ....
*     function requestHandler(xmlResponse,textResponse){...}
*     function errorHandler(xhRequest){...}
*     ....
*     ....
*     var params= new Parameters();
*     params.put("id","0");
*     new JAsafelloX().post("sriptPage.cgi",requestHandler,errorHandler,params);
*/
var isExploter=false;

function JAsafelloX()
{
	var xhRequest=null;
	

	/**ï
	*Devuelve una instancia del XMLHttpRequest del objeto
	*/
	this.getXMLHttpRequest=function()
	{
		return 	xhRequest;
	}
	
	/**
	*Hacemos una peticion a una url a traves del metodo GET
	*/
	this.get=function(httpUrl,callbackFunction,errorFunction,parameters)
	{
		this._init(callbackFunction,errorFunction);
		if(parameters!=null)
			httpUrl=this._makeUrl(httpUrl,parameters);
		this._openURL("GET",httpUrl);
	}
	
	/**
	* Hacemos una peticion a una URL a trav‚s del metodo Post
	*/
	this.post=function(httpUrl,callbackFunction,errorFunction,parameters)
	{
		//
		this._init(callbackFunction,errorFunction);
		if(parameters!=null)
			httpUrl=this._makeUrl(httpUrl,parameters);
		this._openURL("POST",httpUrl);
	}
	
	/**
	*Overridden toString method.
	*/
	this.toString = function()
	{return "JAsafelloX - AJAX Framework Class";}
	
	/**************************************
				METODOS INTERNOS
	**************************************/
	/**Interno
	*Inicializamos el Objeto JAsafelloX
	*/
	this._init=function(callbackFunction,errorFunction)
	{
		//Creamos el XMLHttpRequest
		if(window.XMLHttpRequest)
		{
			xhRequest = new XMLHttpRequest();
			xhRequest.callbackFunction = callbackFunction;
			isExploter=false;
		}
		else
		{
			try 
			{xhRequest=new ActiveXObject("Msxml2.XMLHTTP");}
			catch (e)
			{
				try
				{xhRequest=new ActiveXObject("Microsoft.XMLHTTP");}
				catch (e){}
			}
			isExploter=true;
		}
		
		//ASignamos salida estandar y salida de error
		xhRequest.onreadystatechange=function(evt)
		{
			if(xhRequest.readyState==4)
			{
				if(xhRequest.status==200||xhRequest.status==304)
				{
					if(callbackFunction!=null)
					{
						var rXML=null;
						
						if(isExploter)
						{
							rXML=new ActiveXObject('Microsoft.XMLDOM');
							rXML.loadXML(xhRequest.responseText);
						}
						else
							rXML=xhRequest.responseXML;
						callbackFunction(rXML,xhRequest.responseText);
					}
					else
					{
						alert('Status:'+xhRequest.status+'-'+xhRequest.statusText+'\n'
								+xhRequest.responseText);
					}
				}
				else
				{
					if(errorFunction!=null)
					{
						errorFunction(xhRequest);
					}
					else
					{
						alert('Error!\nStatus:'+xhRequest.status+'-'+xhRequest.statusText);
					}
				}
			}
		};
	}
	
	/**Interno.
	*Abrimos na URL
	*/
	this._openURL=function(httpMethod,httpUrl)
	{
		//alert('open:'+httpMethod+':'+httpUrl);
		xhRequest.open(httpMethod,httpUrl,true);
		isExploter?xhRequest.send():xhRequest.send("");
	}
	
	/**Interno
	*Construimos los parametros de la url
	*/
	this._makeUrl=function(httpUrl,parameters)
	{
		var strUrl=httpUrl;
		names=parameters.getParameterNames();
		for(i=0;i<parameters.length();i++)
		{
			strUrl +=(i==0)?"?":"&";
			strUrl +=escape(names[i])+"=";
			strUrl +=escape(parameters.get(names[i]));
		}
		//alert(strUrl);
		return strUrl;			
	}
}

function Parameters(){
	var len = 0;
	var keys = new Array();
	var values = new Array();
	
	this.getParameterNames=function()
	{
		return keys;
	}
	
	this.getParameterName=function(index)
	{
		return keys[index];
	}
	
	this.getParameterValue=function(index)
	{
		return values[index];
	}
	
	this.get = function(key)
	{
		var val = null;
		for(var i=0; i<len; i++)
		{
			if(keys[i] == key)
			{
				val = values[i];
				break;
			}
		}
		return val;
	}
	
	this.put = function(key, value)
	{
		keys[len] = key;
		values[len++] = value;
	}
	
	this.length = function()
	{
		return len;
	}
	
	this.contains = function(key)
	{
		var con = false;
		for(var i=0; i<len; i++)
		{
			if(keys[i] == key)
			{
				con = true;
				break;
			}
		}
		return con;
	}
	
	this.remove = function(key)
	{
		var keyArr = new Array();
		var valArr = new Array();
		var l = 0;
		for(var i=0; i<len; i++)
		{
			if(keys[i] != key)
			{
				keyArr[l] = keys[i];
				valArr[l++] = values[i];
			}
		}		
		keys = keyArr;
		values = valArr;
		len = l;
	}
    
}

