/**
 * Jednoduché volání přes funkci
 */
jQuery.fn.extend({
	
    /**
     * Ajaxový REQUEST, který je možné zpracovat pomocí JqueryResponse
     * @param array sendValues
     * @param array settings
     * @param callback callback
     */
	ajaxRequest: function (sendValues, settings, callback) {
  	 //data odesílání ajaxem + nastavení
     if (!sendValues) { var sendValues = {}; }
     if (!settings) { var settings = {}; }


     //výchozí data, podle kterých se provádí zpracování a routování
     sendValues['ajax'] = 'true';
     if (settings.processor) { sendValues['ajax_processor'] = settings.processor; }
     if (settings.set_break) { sendValues['ajax_set_break'] = settings.set_break; }
     sendValues['jquery_ajax_set'] = 1;
     
	 // send ajax request
	 var ajaxOptions = {};

	 //cílová url pro odeslání požadavku
	 ajaxOptions.url = window.location.toString();
	 if (settings.url) {
	  ajaxOptions.url = settings.url;  
	 }
	 else if (this.attr('href') && this.attr('href') != '#') {
	  ajaxOptions.url = this.attr('href');
	 }
	 
	 //metoda odeslání dat
	 ajaxOptions.type = 'post'; 
	 if (settings.type) {
	  ajaxOptions.type = settings.type; 
	 }
	 sendValues['ajax_data_type'] = ajaxOptions.type;
	 
	 //callback funkce
	 if (callback) {
	  ajaxOptions.success = callback;
	 }
	 
	 //data
	 ajaxOptions.data = sendValues;
	 this.ajaxStartTimer();
	 return jQuery.ajax(ajaxOptions);
    },
    
    
    /**
     * Jednorázová změna jednoho HTML bloku pomocí metody render_ajax
     * @param array sendValues
     * @param array settings
     * @param callback callback
     */
    ajaxAssign: function (sendValues, settings, callback) {
     //data odesílání ajaxem + nastavení
     if (!sendValues) { var sendValues = {}; }
     if (!settings) { var settings = {}; }
     
     //výchozí data, podle kterých se provádí zpracování a routování
     sendValues['ajax'] = 'true'; 
     if (settings.set_break) { sendValues['ajax_set_break']  = settings.set_break; }
     if (settings.render)    { sendValues['ajax_render']     = settings.render; }

     //element, se kterým se pracuje
     obj = $(this); 
     if (settings.element) {
      obj = $(settings.element);
     }
     
	 //url pro odeslání
     url = window.location.toString(); 
	 if (settings.url) {
	  url = settings.url; 
	 }
	 else if (this.attr('href') && this.attr('href') != '#') {
	  url = this.attr('href');
	 }

	 sendValues['ajax_data_type'] = 'post';
	 this.ajaxStartTimer();
	 obj.load(url, sendValues, function() { callback(); jQuery.fn.ajaxStopTimer() });
    },
    
    /**
     * Narozdíl od funkce ajaxAssignAll se vykreslování neadresuje na render metodu ale na 
     * celou stránku a poté se vezme pouze hodnota jednoho elementu
     * @param string element_id
     * @param array sendValues
     * @param array settings
     * @param callback callback
     */
    ajaxAssignAll: function (element_id, sendValues, settings, callback) {
     //data odesílání ajaxem + nastavení
     if (!sendValues) { var sendValues = {}; }
     if (!settings) { var settings = {}; }
     
     //zakázat cílování na render
     sendValues['ajax_render_target'] = 'false'; 

	 //url pro odeslání
     url = window.location.toString(); 
	 if (settings.url) {
	  url = settings.url; 
	 }
	 else if (this.attr('href') && this.attr('href') != '#') {
	  url = this.attr('href');
	 }
	 
	 //připojit za mezeru volání elementu
	 if (element_id.length > 0) {
		 settings.url = url + ' ' + element_id;
	 }
     
	 //nyní se již může zavolat klasická ajaxAssign metoda s novým nastavením
	 this.ajaxAssign(sendValues, settings, callback);
    },
    
    
    
    /**
     * Jednoduché odeslání formuláře ajaxem
     * @param array settings
     * @param string processor
     * @param callback callback
     */
    ajaxSimpleSubmit: function (settings, processor, callback) { 
	 var form;
	 var sendValues = {};
     if (!settings) { var settings = {}; }
     sendValues['ajax'] = 'true';
		
     /*
      * Funkce musí být navázána buď na událost formuláře nebo tlačítka pro odeslání
      */
	 if (this.is(":submit")) {
      //tlačítko pro odeslání, najít objekt formuláře
	  form = this.parents("form");
	  sendValues[this.attr("name")] = this.val() || "";
	 } 
	 else if (this.is("form")) {
	  //jedná se o formulář
	  form = this;
	 }
	 else {
	  //formulář není možné najít
	  return null;
	 }
    	
     //data formuláře
	 var values = form.serializeArray();
	 for (var i = 0; i < values.length; i++) {
	  var name = values[i].name;
       //pole
	   if (name in sendValues) {
		var val = sendValues[name];

		if (!(val instanceof Array)) {
		 val = [val];
		}
		
        val.push(values[i].value);
		sendValues[name] = val;
	   } 
	   else {
		//klasická hodnota
		sendValues[name] = values[i].value;
	   }
	  }
	 
	 url = window.location.toString(); 
	 if (settings.url) {
	  url = settings.url; 
	 }
	 
	 settings.type = 'post';
	 if (form.attr("method")) {
	  settings.type = form.attr("method");
	 }
	 
	 if (!processor || processor == 'ajaxAssign') {
	  this.ajaxAssign(sendValues, settings, callback);
	 }
	 else if (processor == 'ajaxRequest') {
	  this.ajaxRequest(sendValues, settings, callback);	 
	 }
	 else if (processor == 'ajaxAssignAll') {
	  element_id = settings.element_id;
	  this.ajaxAssignAll(element_id, sendValues, settings, callback);
	 }
    },
    
    /**
     * Vrací vyparsovaná data z formuláře
     * @return array
     */
    formGetParsedValues: function () {	 
	 var sendValues = {};
     var values = this.serializeArray();

	 for (var i = 0; i < values.length; i++) {
	  var name = values[i].name;
	  //pole
	  if (name in sendValues) {
	   var val = sendValues[name];

	   if (!(val instanceof Array)) {
	    val = [val];
	   }
			
	   val.push(values[i].value);
	   sendValues[name] = val;
	  } 
	  else {
	   //klasická hodnota
	   sendValues[name] = values[i].value;
	  }
	 }
	 return sendValues;
    },

    
    
    /**
     * Nastavit ajaxový požadavek jako běžící a spustit odpočítávání pro zobrazení loaderu
     */
    ajaxStartTimer: function () { 
     //nastavit kontrolní data
     $('body').data('ajaxStart', true);
      
     //za určený časový limit zavolat funkci, která se pokusí nastavit loader
     window.setTimeout(function() {
      if ($('body').data('ajaxStart') == true) {
       //pokud ajax funkce po časovém úseku stále běží, zobrazit loader
       if ($('#ajax_preloader').length > 0) {
    	//zobrazit preloader
    	$('#ajax_preloader').show();
       }    	   
      }
     }, 700);
    },
    
    
    /**
     * Zastavit odpočítávání
     */
    ajaxStopTimer: function() {
     if ($('#ajax_preloader').length > 0) {
      //skrýt loader
      $('#ajax_preloader').hide();
     }
     $('body').data('ajaxStart', false);
    }
    
});



/**
 * Obsluha výstupu JqueryResponse
 */
jQuery.extend({
    pfrs: {
        success: function (result) {
	     
         //projít všechny části s spustit podporované
         for (var type in result) {
          for (i in result[type]) {
           jQuery.pfrs.call_part(type, result[type][i]);
          }
         }
 
         //zastavit spracovávání ajaxu
         jQuery.fn.ajaxStopTimer();
        },
        
        //zavést příslušnou část pro daný typ
        call_part: function (type, obj) {
         switch (type) {
          case 'script': 
           jQuery.pfrs.call_script(obj);
           break;
          case 'redirect': 
           jQuery.pfrs.call_redirect(obj);
           break;
          case 'assign': 
           jQuery.pfrs.call_assing(obj);
           break;
          case 'create': 
           jQuery.pfrs.call_create(obj);
           break;
          case 'remove': 
           jQuery.pfrs.call_remove(obj);
           break;
          case 'jquery_call': 
           jQuery.pfrs.jquery_call(obj);
           break;
         }
        },
        
        
        //jednotlivé typy bloků
        //které se volají
        
        //script
        call_script: function (obj) {
         eval(obj.query);
        },
        
        //přesměrování
        call_redirect: function (obj) {
         setTimeout("location.href = '" + obj.destination + "';", obj.time*1000);
        },
        
        //přiřadit data
        call_assing: function (obj) {
         element = document.getElementById(obj.id);
         if (element) {
          eval('element.' + obj.part + ' = obj.value;');
         }
        },
        
        //vytvořit nový prvek
        call_create: function (obj) { 
         parent_element = document.getElementById(obj.parent);
         if (parent_element) {
          //vytvořit element
          new_element = document.createElement(obj.tag);
          new_element.setAttribute('id', obj.id);
          parent_element.appendChild(new_element);
         }
        },
        
        //odstranit požadovaný prvek
        call_remove: function (obj) {
         $('#' + obj.id).remove();
        },
        
        //spustit jquery
        jquery_call: function (obj) {
         eval('$(\'#' + obj.id + '\').' + obj.method + '(obj.params);');
        }
    }
});

//nastavení zpracování výstupu JqueryResponse po dokončení ajaxového volání
jQuery.ajaxSetup({
    success: jQuery.pfrs.success,
    dataType: "json"
});





