/*Se requiere que la páigna incluya el prototype.js*/

/*En esta clase encerramos los elemento para invocar procesos Ajax con prototype lo más simple posible*/
function precesadorNET(url,method){
 this.URL=url;
 this.METHOD=method?method:'POST';
 this.ENCODING='iso-8859-1';
 var owner=this;
 /*Esta funsion llena un combo select y le crea un meodo reFill(); que lo vacia y lo vuelve a cargar si necesidad de volver a llamar este método 
 @param _select referencia al elemento select
 @param params parametros que se desea enviar en la solisitud
 @param afterFunction funcion que se ejecuta inmediatamente despues de que se lleno el combo
 */
 this.fillSelect=function(_select,params,afterFillFunction,execute){
	 _select.refillManager=new selectRefillManager(_select,owner);
	 _select.refillManager.afterFillFunction=afterFillFunction;//le asignamos la funsion after si existe.
	 _select.refillManager.parameters=params;//parametros de la solisitud si existen
	 _select.refill=new Function("this.refillManager.selectRefill();");//asingamos la funsion de refill
	 if(execute!=false){
		 _select.refill.call(_select);
	 }
	 
 }
 this.toJsonObject=function(stringJson){
	 //alert(stringJson);
	 try{
	 return eval("("+stringJson+")");
	 }
	 catch(err){
	   alert("No sepuede interpretar la cadena JSON:\n\n"+stringJson+"\n\nError Reportado:\n\n"+err);
	 }
 }
 this.getDependencesValuesAsString=function(dependencesValuesOwner){
    if(!dependencesValuesOwner.ownerElementsValues){
	  return "";
	}
	var each;
    var requestString="";
	var elements=dependencesValuesOwner.ownerElementsValues;
	var element;
	var value;
	var i;
	for(i=0;i<elements.length;i++){
	   element=elements[i];
	   value=element.element.value;
	  if(element.excludeValue!=value){
	     requestString+="&"+element.name+"="+value;
	  }
	}
	if(requestString.length>0){
	  requestString=requestString.substring(1)
	}
	return requestString;
 }
 this.addDependenceValue=function(dependencesValuesOwner,elementNeeded,excludeIfValueIs,requestName){
	 if(!dependencesValuesOwner.ownerElementsValues){
	    dependencesValuesOwner.ownerElementsValues=new Array();
	 }
	 if(!requestName){
		 requestName=elementNeeded.id;
	 }
	 dependencesValuesOwner.ownerElementsValues[dependencesValuesOwner.ownerElementsValues.length]={element:elementNeeded,
	                                                                                                excludeValue:excludeIfValueIs,
																									name:requestName
																								   };
 }
 this.convertObjectToRequestString=function(objet){
    var each;
	var requestString="";
	var value;
	var i
	if(typeof object =="string"){
	  return object;
	}
	for(each in objet){
	  if(objet[each]instanceof Array){
	    value="";
	    for(i=0;i<objet[each].length;i++){
		  value+=","+objet[each];
		}
		value=value.substring(1);
	  }
	  else{
	   value=objet[each];
	  }
	  requestString+="&"+each+"="+value;
	}
	return requestString.substring(1);
 }
 this.makeRequest=function(_manager){
	 var parameters;
	 var dependencesValues;
	 if(_manager.ownerElementsValues){
		 if(typeof _manager.parameters == "string"){
			 parameters=""+_manager.parameters;
		 }
		 else{
			 parameters=owner.convertObjectToRequestString(_manager.parameters);
		 }
		 dependencesValues=owner.getDependencesValuesAsString(_manager);
		 if(dependencesValues.length>0){
			 if(parameters.length>0){
				parameters+='&';
			 }
			 parameters +=dependencesValues;
		 }
	 }
     else{
	  parameters=_manager.parameters;
	 }	 
	 //alert(parameters);
	 var ajaxRequest= new Ajax.Request(owner.URL,{
										 method:owner.METHOD,
										 encoding:owner.ENCODING,
										 parameters:parameters,
										 //onCreate:function(){alert(this.parameters+'\n'+this.url);}, 
										 onComplete:_manager.onComplete,
										 onSuccess:_manager.onSuccess
									   });
 }
/*********************Objeto ReffilManager *********************/ 
 function selectRefillManager(_select,owner){
	     var manager=this;
		 this.afterFillFunction;
		 this.parameters;
 
		 this.selectRefill=function(){
			 owner.makeRequest(manager);
			 
		 }
		 this.onSuccess=function(response){
			 var selectedValue=_select.value;
			 var items=new Array();
			 var elementName;
			 var option;
			 var valores,textos;			 
			 var root=owner.toJsonObject(response.responseText);//convertimos la cadena JSON a un objeto.
			 while(_select.childNodes.length>0){//borramos los posibles options que existen en el combo
				 _select.removeChild(_select.firstChild);
			 }
			 var Index=0;
			 for(elementName in root){//convertimos la respuesta en un arreglo para facilitar su analisis
				items[Index]=root[elementName];
				Index++;
			 }
			 if(_select.extraOptions){//si setienen opciones extra
			     var extraOption;
			     for(Index=0;Index<_select.extraOptions.length;Index++){
				   extraOption=_select.extraOptions[Index];
				   option=document.createElement('option');
				   option.setAttribute('value',extraOption.value);
				   option.appendChild(document.createTextNode(extraOption.text));
				   _select.appendChild(option);//agregamos el option al select
				 }
			 }else{ if(items.length==0){//si no se tiene respuesta alguna
				 option=document.createElement('option');
				 option.setAttribute('value',-1);
				 option.appendChild(document.createTextNode('Sin elementos disponibles'));
				 _select.appendChild(option);//agregamos el option al select
			 }}
			 if(items.length==1){//si la respuesta solo tiene un arreglo se va a tomar como valor y texto de los options
				 valores=items[0];
				 textos=items[0];
			 }
			 else{
				 valores=items[0];
				 textos=items[1];
			 }
			 for(Index=0; Index<valores.length ;Index++){//llenamos las opsiones
				 option=document.createElement('option');
				 option.setAttribute('value',valores[Index]);
				 option.appendChild(document.createTextNode(textos[Index]));
				 if(selectedValue==valores[Index]){//si en el registro se tiene el ultimo elemento seleccionado
					option.setAttribute('selected','true');
				 }
				 _select.appendChild(option);//agregamos el option al select
			 }
			 if(_select.afterFillFunction){//si existe una fusion after
				 _select.afterFillFunction.call(_select)
			 }
		 }
		 this.addSelectDependence=function(element,excludeIfValueIs,requestName){
			 if(element.refillManager){
				 element.refillManager.afterFillFunction=manager.selectRefill;
			 }
			 element.onchange=manager.selectRefill;
			 owner.addDependenceValue(manager,element,excludeIfValueIs,requestName);
		 }
 }
/********************* (fin)Objeto ReffilManager *********************/  
 
}
