/*************************************************
*
* (c)2009 domi, #colcode <domi@colcode.com>
*
* Ajax helpers
*
 ************************************************/

AJAX_EVAL     = 0;
AJAX_ASYNC    = 1;
AJAX_BLOCK    = 0;

var Ajax = new function()
{
   var _me = this;
   
   /* required for delayed execution */
   var _delay_timer    = 0;
   var _delay_callback = 0;
   var _delay_form     = 0;
   
   var _browser_err = 'Your browser does not support this\n'+
                      'feature. Upgrade to lates version.';
   
   this.getJSON = function(uri, frm)
   {
      var ret = {};      
      var req = _me.request(uri, false, AJAX_BLOCK, frm);
      
      return _me.parseJSON(req);
   }
   
   this.parseJSON = function(obj)
   {
      try
      {
         if(!obj || !obj.responseText) return false;
         
         eval('ret = ('+ obj.responseText +')');
         
         if(isNaN(ret.errno)) throw 'could not read response (errno)';
         if(typeof ret.error == 'undefined') throw 'could not read response (error)';
         if(typeof ret.data == 'undefined') throw 'could not read response (data)';
      }
      catch(e)
      {
         alert('An error occurred:\n\n'+ e);
         return false;
      }
      
      if(ret.errno > 0)
      {
         alert('Error ('+ ret.errno +'):\n'+ ret.error);
         return false;
      }
      
      if(ret.error.length > 0) alert('Warning:\n'+ ret.error);
      
      return ret.data;
   }
   
   /* works only in async mode        */
   this.requestDelayed = function(delay, uri, callback, frm)
   {
      if(_delay_timer) clearTimeout(_delay_timer);
      
      if(typeof callback != 'function') callback = _me.parseJSON;
      if(typeof delay == 'undefined') delay = 200;
      
      _delay_callback = callback;
      _delay_form     = frm;
      
      var cmd = 'Ajax.requestDelayedEx(\''+ uri +'\')';
      //alert(cmd + ' / ' + delay);
      
      _delay_timer = setInterval(cmd, delay);
      return _delay_timer;
   }
   
   this.requestDelayedEx = function(uri)
   {
      var req = Ajax.request(uri, false, AJAX_BLOCK, _delay_form);
      
      if(_delay_callback) _delay_callback(req);
   }
   
   this.request = function(uri, callback, async, frm)
   {
      var req, data;
      
      if(typeof async == 'undefined') async = AJAX_ASYNC;
      if(typeof callback != 'function') callback = AJAX_EVAL;
      //alert('callback: ' + callback);
      
      if(_delay_timer) clearTimeout(_delay_timer);
      
      /*@cc_on
       
      @if (@_jscript_version >= 5)
      try
      {
         req = new ActiveXObject("Msxml2.XMLHTTP");
      }
      catch (e)
      {
         try
         {
            req = new ActiveXObject("Microsoft.XMLHTTP");
         }
         catch (E)
         {
            req = false;
         }
      }
       
      @else
         req = false;
      @end
       
      @*/
      
      if(!req && typeof XMLHttpRequest != 'undefined')
      {
         try
         {
            req = new XMLHttpRequest();
         }
         catch (e)
         {
            req = false;
         }
      }
   
      if(!req)
      {
         alert(_browser_err);
         return;
      }
      
      if(async == AJAX_ASYNC)
      {
         req.onreadystatechange = function()
         {
            //alert('suck: ' + AJAX_ASYNC);
            if(typeof req == 'undefined' || req.readyState != 4 || req.status != 200) return;
            
            if(callback == AJAX_EVAL)
            {
               //alert('Debug: execverar\n\n' + req.responseText);
               eval(req.responseText);
            }
            else
            {
               //alert('Debug: response\n\n' + req.responseText);
               callback(req);
            }
         };
      }
      
      //alert(uri +' '+ uri.indexOf('?'));
      uri += (uri.indexOf('?') == -1)? '?quirk=' : '&quirk=';
      uri += (new Date().getTime());
      
      data = null;
      
      if(typeof(frm) == 'object')
      {
         data = serializeForm(frm);
         //alert('data:\n'+ data);
      }
      
      if(typeof(frm) == 'object' && (frm.method == 'post' || frm.method == 'POST'))
      {
         //alert('uri:'+ uri);
         req.open('POST', uri, async);
         req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
      }
      else
      {
         if(data) uri += '&' + data;
         req.open('GET', uri, async);
      }
      
      //alert('sync:' + AJAX_ASYNC);
      req.send(data);
      
      return req;
   }

   var requestAddField = function(name, value)
   {
      return encodeURIComponent(name) + "=" + encodeURIComponent(value);
   }

   var serializeForm = function(frm)
   {
      var els = frm.elements;
      var len = els.length;
      var qs  = '';
      var i, j;
      
      for(i = 0; i < len; i++)
      {
         var e = els[i];
         
         if(e.disabled) continue;
         
         if(qs.length > 0) qs += '&';
         
         switch(e.type)
         {
            case 'text':
            case 'password':
            case 'hidden':
            case 'textarea':
               qs += requestAddField(e.name, e.value);
               break;
            case 'select-one':
               if(e.selectedIndex >= 0)
               {
                  qs += requestAddField(e.name, e.options[e.selectedIndex].value);
               }
               break;
            case 'select-multiple':
               for(j = 0; j < e.options.length; j++)
               {
                  if (el.options[j].selected)
                  {
                     qs += requestAddField(e.name, e.options[j].value);
                  }
               }
               break;
            case 'checkbox':
            case 'radio':
               if(e.checked)
               {
                  qs += requestAddField(e.name, e.value);
               }
               break;
         }
      }
      
      if(qs.length) return qs;
      
      alert('ouups');
      return null;
   }   
}();

/* eof */
