/*****************************************************************************************************
/* form submitter class
/*
/* Használat:
/* ---------------------------------------------------------------------------------------------------
/* new formSubmitter(form_id, loader_div_id, a_postolando_url, optionalObject);
/*    form_id - string
/*    loader_div_id - string
/*    a_postolando_url - string
/*    optional_object - object (opcionális)
/*
/* beállítandó:
/* ---------------------------------
/* XMLPath;
/* langPrefix;
/*
/* beállítható 
/* ---------------------------------
/* method (default:'insert')
/* errorClass (default:'text_error')
/*
/* A kezelt XML struktúra
/* ----------------------------------------------------------------------------------------------------
/* Az alap az XMLPath változóban meghatározott, pl., ha XMLPath = 'doc/settings/'
/* <doc>
/*    <settings>
/*
/*       -----  ez a JS objektumban van meghatározva, kötelező ezt követni ------
/*       <doc>
/*         <errors count="hibák_száma">
/*           <error>hibás mező azonosítója</error>
/*           .....
/*         </errors>
/*         <field keyfield="yes">kulcsmező a sor azonosítóhoz</field>
/*         <field>mező azonosítója</field>
/*         ...
/*       </doc>
/*
/*       ----- kötelező szekció vége -------------------------------------------
/*
/*    </settings>
/* </doc>
/*********************************************************************************************************/


function formSubmitter(form, loader_div, url, optionalObject)
{
   var that = this;
   this.form = $(form) || null; // A feldolgozandó form.    
   this.loader_div = $(loader_div) || null; // A feldolgozást jelző div.  
   this.url = url; // A postolandó url.         
   this.langPrefix = null; // A language fájlban az üzenetek előtagja, pl. SETTINGS.error.    *** BEÁLLÍTANDÓ! ***   
   this.optionalObject = optionalObject;  // opcionálisan megadható objektum, pl. siker esetén újabb sorok hozzáfűzését végezheti. 
   this.XMLPath = ""; // A visszajövő xml-ben a hibakódok elérési útja.    *** BEÁLLÍTHATÓ! ***
   this.method = 'insert'; //A form adataival végzendő művelet.    --- BEÁLLÍTHATÓ ---   
   this.requestType = '&requestType=ajax'; //A form adataival végzendő művelet.    --- BEÁLLÍTHATÓ ---  
   this.errorClass = 'text_error'; // A hibás inputokat jelző osztály --- BEÁLLÍTHATÓ ---
   this.inputClass = null; // Az elküldendő inputok osztálya, ha nem kell mindent elküldeni.
   this.resetForm = true; // true Ha a végén alapállaptba kell állítani a formot, false, ha nem
   this.hideLoader();  
   this.setInputs();
   
   /* A language fájlban megadott változók neve, megadás: this.langPrefix + this.xxxxxx */
   this.checkData = 'checkData';
   this.OK = 'OK';
   
   if(this.checkVariablesToSet)
   {
      // form onsubmit eseményének regisztrálása
      Utils.addEvent(this.form, 'submit', function(e){that.formSubmit(e, that)});
   }
   else
   {
	   return false;
   }  
}

// beállító függvények
formSubmitter.prototype.setXMLPath = function(XMLPath){
    this.XMLPath = XMLPath;	
}

formSubmitter.prototype.setLangPrefix = function(langPrefix){
	this.langPrefix = langPrefix;
}

formSubmitter.prototype.setMethod = function(method){
    this.method = method;
}

formSubmitter.prototype.setInputClass = function(inputClass){
    this.inputClass = inputClass;
}

formSubmitter.prototype.setErrorClass = function(errorClass){
    this.errorClass = errorClass;
}

formSubmitter.prototype.checkVariablesToSet = function(){
    var that = this;
	var items = ['errorClass', 'langPrefix'];
	var checklist = {'errorClass':that.errorClass, 'langPrefix':that.langPrefix};
	for(var i=0; i<items.length; i++)
	{
		if(checklist[items[i]] == null)
		{							
			alert(Utils.printf($lang('unsetError'), [items[i]]));
			return false;
		}
	}
	if(!this.form)
	{
		alert($lang('noForm'));
		return false;
	}	
	return true;
}
// beállító függvények vége

formSubmitter.prototype.hideLoader = function()
{
   if(!this.loader_div) return;
   this.loader_div.style.visibility = 'hidden';
   this.loader_div.innerHTML = '';      
}
   
formSubmitter.prototype.showLoader = function()
{
   if(!this.loader_div) return;
   this.loader_div.style.visibility = 'visible';
   //this.loader_div.innerHTML = $lang(this.langPrefix + this.checkData);            
}
   
formSubmitter.prototype.formSubmit = function(e,that)
{     
   Utils.eventStop(e);   
   var that = that; 
   var queryString = that.formToQueryString(that.method) + that.requestType;     
   if(!that.checkVariablesToSet()) return;
   that.showLoader(); 
   var oXML = new FCKXml();            
   oXML.PostUrl(that.url, queryString, function(fckXml){  
       var err = fckXml.SelectNodes(that.XMLPath + 'doc/error');
       if(!err.length)
       {
          that.handleSuccess($lang(that.langPrefix + that.OK));  		  		  
          //siker esetén végrehjatandó tevékenységek
		  that.doAtSuccess(fckXml.SelectNodes(that.XMLPath + 'doc/fields'));		  
       }
       else
       {             
          that.handleErrors(fckXml.SelectNodes(that.XMLPath + 'doc/error'))
       }
   })                             
}
  
formSubmitter.prototype.doAtSuccess = function(fields){
	var keyfield = null;
	var val = null;
	var obj = null;
	var fieldsArr = new Array();
	var field = null;
	for(var i=0; i<fields.length; i++)
	{
		field = (fields[i].getAttribute('returned') == 'yes')? fields[i].firstChild.nodeValue : $(fields[i].firstChild.nodeValue);		
		val = (typeof field == 'object')? field.value : field;

		if(fields[i].getAttribute('keyfield') == 'yes')
		{
			keyfield = field.value;
		}
				
        obj = {'value':val, 'editable':fields[i].getAttribute('editable'),'show':fields[i].getAttribute('show')}
		fieldsArr.push(obj);
		field.value = '';
	}	
}

formSubmitter.prototype.handleErrors = function(errors)
{
   var txt = '';
   for(var i=0; i<errors.length; i++)
   {         
      txt += $lang(this.langPrefix + errors[i].firstChild.nodeValue) + '\n';
      var id = $(errors[i].getAttribute('id'));	  
      if(id && !id.className.match(this.errorClass))
      {
        id.className = id.className + ' ' + this.errorClass;
      }
	  break;
   }         
   this.hideLoader();
   alert(txt);
}
   
formSubmitter.prototype.handleSuccess = function(message)
{      
   this.hideLoader();   
   var inputs = this.form.getElementsByTagName('*');
   for(var i=0; i<inputs.length; i++)
   {
      if(inputs[i].getAttribute('type') == 'text')
      {
        inputs[i].className = inputs[i].className.replace(' ' + this.errorClass, '');
      }   
   }     
   alert(message);
   if(this.resetForm)
   {
	   this.form.reset();
   }
}

formSubmitter.prototype.setInputs = function()
{
   var that = this;
   var inputs = this.form.getElementsByTagName('*');
   for(var i=0; i<inputs.length; i++)
   {         
      if( inputs[i].getAttribute('type') == 'text' 
		  || inputs[i].getAttribute('type') == 'password'
		  || inputs[i].nodeName == 'TEXTAREA' 
		  || inputs[i].nodeName == 'SELECT')
      {
         inputs[i].onclick = function(){               
            this.className = this.className.replace(that.errorClass, '');
         }   
      }   
   }      
}

formSubmitter.prototype.formToQueryString = function(todo)
{
	var es = this.form.getElementsByTagName("*")
	var re = new Array();
	var radios = new Array();
	var checkboxes = new Array();

	re.push('todo=' + todo)
	for(var i=0; i<es.length; i++)
	{
		if(!es[i].disabled && es[i].name && es[i].type != 'radio' && es[i].type != 'checkbox') 
		{						
			re.push(encodeURIComponent(es[i].name) + "=" + ( (es[i].value==null)? '' : encodeURIComponent(es[i].value) ))
		}
		if(es[i].type == 'radio')
		{
			radios.push(es[i]);
		}
		if(es[i].type == 'checkbox')
		{
			checkboxes.push(es[i]);
		}
	}	
	
	if(radios.length)
	{		
		for(var i=0; i<radios.length; i++)
		{			
			if(radios[i].checked)
			{				
				re.push(encodeURIComponent(radios[i].name) + "=" + ( (radios[i].value==null)? '' : encodeURIComponent(radios[i].value) ));
			}
		}
	}

	if(checkboxes.length)
	{		
		for(var i=0; i<checkboxes.length; i++)
		{
			if(checkboxes[i].checked)
			{				
				re.push(encodeURIComponent(checkboxes[i].name) + "=" + ( (checkboxes[i].value==null)? '' : encodeURIComponent(checkboxes[i].value) ));
			}
			else
			{
				re.push(encodeURIComponent(checkboxes[i].name) + "=N");
			}
		}
	}
	return re.join("&");   
}