/**
 * @fileoverview Objekt pro implemetnaci technologie AJAX.
 * 
 * <p>Jednoducha zakladni AJAX komunikace s podporou GET/POST a objektoveho programovani.</p>     
 * 
 * @author Oranges.s.r.o. & Laki <info@laki.cz>
 * @version 1.1 <09-06-2009>
 */  

/**
 * Komunikacni objekt pro AJAX - ajaxObject.
 *
 * <p>
 *   Kod vychazi z kodu Ulitimate Ajax Object (<a href="http://www.hunlock.com/blogs/The_Ultimate_Ajax_Object">http://www.hunlock.com/blogs/The_Ultimate_Ajax_Object</a>). Provedeny byly jen drobne upravy a doplneno o potlaceni kesovani v prohlizeci.
 *   Pouziti kodu zustava stejne - priklady pouziti na originalni strance.
 * </p>
 * 
 * <p><b>Upozorneni:</b> bezpecnosti model IE a dalsich prohlizecu umoznuje volani AJAX obsahu pouze ze stejne domeny, z jake je obsah. Plati i pro subdomeny! Takze pozor na http://www.cfn.cz a http://cfn.cz.</p>
 *   
 * <p>Pozn. nazev ajaxObject byl zvolen s ohledem na jine nalinkovane frameworky v projektu CFN/Kinobox.</p>
 * 
 * @example Vola AJAX v objektovem kontextu a prirazuje navratovou funkci processAJAX
 *  var this.ajax = new ajaxObject("http://www.cfn.cz/ajax/xmltest.php");
 *  this.ajax.callback = events.getAJAXcallback(this.processAJAX, this);
 *  this.ajax.update("id=123");
 * 
 * @example Kratsi varianta  
 *  var this.ajax = new ajaxObject("http://www.cfn.cz/ajax/xmltest.php", events.getAJAXcallback(this.processAJAX, this));
 *  this.ajax.update("id=123");
 *  
 * @example
 *  function zpracujXML(txt, status, xml) {...} 
 *  var ajax = new ajaxObject("http://www.cfn.cz/ajax/xmltest.php", zpracujXML);
 *  ajax.update("id=123");      
 *  
 * @class ajaxObject - implementace AJAX komunikace 
 * @extends Object
 * @version 1.0   
 * @constructor
 * @param {string}   url               URL, kdete se ma nacist
 * @param {function} callbackFunction  Navratova funkce, ktera bude zavolana po nacteni pozadovaneho obsahu
 */
function ajaxObject(url, callbackFunction)
{
  var that=this;
  
  /**
   * Vlastnost, ktera znaci zda probiha prenos (read-only).
   * 
   * <p>Hodnota = false - prenos nezacal nebo byl stornovan, jinak objekt Date, s hodnotou casoveho razitka pri odeslani pozadavku. Lze vyuzit ke zjisteni doby trvani prenosu.</p>
   *    
   * @example
   *  if (ajax.updating)
   *  {
   *    var now = new Date();   
   *    alert("probiha prenos - jiz trva " + now - ajax.updating + " milisekund");
   *  }
   *  else
   *  {
   *    alert("prenos neprobiha");
   *  }              
   * 
   * @public
   */
  this.updating = false;
  
  /**
   * Metoda zrusi aktualni AJAX pozadavek/prenos
   * 
   * @public      
   */              
  this.abort = function() {
    if (that.updating) {
      that.updating=false;
      that.AJAX.abort();
      that.AJAX=null;
    }
  }
  
  /**
   * Metoda provede pozadavek na prenos dat. 
   * 
   * Od chvile zavolani teto metody probiha prenos a lze jej zastavit metodou {@link ajaxObject#abort}.
   * 
   * @example Objekt zasle GET pozadavek s parametrem id=123   
   *  this.ajax.update("id=123");
   *  this.ajax.update("id=123", "GET");    //alternativne
   *  this.ajax.update("id=123", "HAHAHA"); //taky to projde     
   *  
   * @example Objekt zasle POST pozadavek s parametrem id=123
   *  this.ajax.update("id=123", "POST")         
   *      
   * @public   
   * @param {string} passData   Definice parametru URL, jehoz obsah se bude prenaset.
   * @param {string} postMethod Volitelne - metoda prenosu. Pokud je hodnota 'POST', pak provede pozadavek odeslanim metodou POST, jinak pouzije GET
   * @return {boolean} True = uspesnost / False = neuspesnost odeslani
   * @type boolean      
   */  
  this.update = function(passData, postMethod)
  {
    if (that.updating) { return false; }
    that.AJAX = null;
    if (window.XMLHttpRequest) {
      that.AJAX = new XMLHttpRequest();
    } else {
      that.AJAX = new ActiveXObject("Microsoft.XMLHTTP");
    }
    if (that.AJAX == null) {
      return false;
    } else {
      that.AJAX.onreadystatechange = function() {
        if (that.AJAX.readyState == 4) {
          that.updating=false;
          that.callback(that.AJAX.responseText, that.AJAX.status, that.AJAX.responseXML);
          that.AJAX=null;
        }
      }
      that.updating = new Date();
      if (/post/i.test(postMethod)) {
        var uri = urlCall + '?' + that.updating.getTime();
        that.AJAX.open("POST", uri, true);
        that.AJAX.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        that.AJAX.setRequestHeader("Content-Length", passData.length);
        that.AJAX.send(passData);
      } else {
        var uri = urlCall + '?' + passData + '&timestamp=' + (that.updating.getTime());
        that.AJAX.open("GET", uri, true);
        that.AJAX.send(null);
      }
      return true;
    }
  }
  
  /**
   * Vlastnost URL obsahu, jehoz obsah bude nacten.
   *      
   * @public   
   * @type string   
   */     
  var urlCall = url;
  
  /**
   * Definice navratove funkce, ktera bude zavolana po nacteni pozadovaneho obsahu.
   * 
   * <p>Callback funkce musi byt definovana takto (vsechny parametry jsou nepovinne):</p>
   * <pre>
   *    function zpracujXML(responseText, responseStatus, responseXML) {}
   * </pre>   
   * <p>kde parametry budou obsahovat tato data:</p>
   * <pre>   
   *   responseText   - obsah nacteneho URL jako textovy retezec
   *   responseStatus - HTTP stavovy kod (200 - vse OK, 404 - nenalezeno apod.)
   *   responseXML    - DOM XML dokumentu, pokud byl vracen XML obsah
   * </pre>
   * 
   * <p>Pozn. pro jednoduche generovani callback funkce v kontextu je v objektu {@link events} definovana metoda {@link events.getAJAXcallback}.</p>
   * 
   * @example Vypis obsah nacteny AJAXem: 
   *  function zpracujText(responseText, responseStatus)
   *  {
   *    if (responseStatus == 200)
   *    {
   *      alert(responseText);
   *    }
   *  }
   *        
   * @example Zjisti, zda URL existuje:
   *  function zpracujText(responseText, responseStatus)
   *  {
   *    if (responseStatus == 404) alert("Pozadovany dokument neexistuje!");
   *  }
   *     
   * @example Nacti AJAXem XML a vypis nazev prvniho elementu v dokumentu:
   *  function zpracujText(responseText, responseStatus)
   *  {
   *    if (responseStatus == 200)
   *    {
   *      var xmldoc = responseXML;
   *      alert(xmldoc.nodes[0].tagName);
   *    }
   *  }     
   *   
   * @see events.getAJAXcallback
   * @see <a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes">http://en.wikipedia.org/wiki/List_of_HTTP_status_codes</a> Seznam HTTP stavovych kodu         
   * @public   
   * @type function  
   */
  this.callback = callbackFunction || function () { };
}
