
var _ajax_browser_err;

/* required for delayed execution */
var ajax_delay_timer    = 0;
var ajax_delay_callback = 0;
var ajax_delay_form     = 0;

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

_ajax_browser_err  = 'Din webläsare stöder inte funktionen.\n\n';
_ajax_browser_err += 'Uppgradera till Mozilla Firefox eller\n';
_ajax_browser_err += 'senaste versionen av Internet Explorer';

/* helper to parse xml response */
function xml_get_data(obj)
{
   var xml, tmp, ret;
   var errno = 0;
   var error = '';
   
   try
   {
      xml = obj.responseXML;
      tmp = xml.getElementsByTagName('result');
      errno = parseInt(tmp.item(0).getAttribute('errno'));
      if(isNaN(errno)) throw 'Kunde inte läsa response (errno)';
      error = tmp.item(0).getAttribute('error');
      if(typeof error == 'undefined') throw 'Kunde inte läsa response (error)';
   }
   catch(e)
   {
      alert('Ett fel uppstod:\n\n'+ e);
      return false;
   }
   
   if(errno)
   {
      alert('Ett fel uppstod ('+ errno +'):\n'+ error);
      return false;
   }
   
   if(error != '') alert('Varning:\n'+ error);
   
   return xml;
}

/* helper to parse json response */
function json_get_data(obj)
{
   var ret;
   
   try
   {
      if(!obj.responseText) return false;
      
      eval('ret = ('+ obj.responseText +')');
      
      if(isNaN(ret.errno)) throw 'Kunde inte läsa response (errno)';
      if(typeof ret.error == 'undefined') throw 'Kunde inte läsa response (error)';
      if(typeof ret.data == 'undefined') throw 'Kunde inte läsa response (data)';
   }
   catch(e)
   {
      alert('Ett fel uppstod:\n\n'+ e);
      return false;
   }
   
   if(ret.errno > 0)
   {
      alert('Ett fel uppstod ('+ ret.errno +'):\n'+ ret.error);
      return false;
   }
   
   if(ret.error != '') alert('Varning:\n'+ ret.error);
   
   return ret.data;
}

function req_open_delayed(delay, uri, callback, async, frm)
{
   var cmd;
   
   if(ajax_delay_timer) clearTimeout(ajax_delay_timer);
   
   if(typeof async == 'undefined') async = AJAX_ASYNC;
   if(typeof callback != 'function') callback = AJAX_EVAL;
   if(typeof delay == 'undefined') delay = 200;
   
   ajax_delay_callback = callback;
   ajax_delay_form     = frm;
   
   cmd  = 'req_open(\'';
   cmd += uri;
   cmd += '\', ajax_delay_callback, ';
   cmd += async + ', ajax_delay_form)';
   
   //alert(cmd + ' / ' + delay);
   
   ajax_delay_timer = setInterval(cmd, delay);
   return ajax_delay_timer;
}

function req_open(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(ajax_delay_timer) clearTimeout(ajax_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(_ajax_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;
}

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

function serializeForm(frm)
{
   var els = frm.elements;
   var len = els.length;
   var qs  = '';
   var dbg = '';
   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);
            dbg += '\n'+requestAddField(e.name, e.value);
            break;
         case 'select-one':
            if(e.selectedIndex >= 0)
            {
               qs += requestAddField(e.name, e.options[e.selectedIndex].value);
               dbg += '\n'+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);
                  dbg += '\n'+requestAddField(e.name, e.options[j].value);
               }
            }
            break;
         case 'checkbox':
         case 'radio':
            if(e.checked)
            {
               qs += requestAddField(e.name, e.value);
               dbg += '\n'+requestAddField(e.name, e.value);
            }
            break;
      }
   }
   
   //alert(dbg);
   if(qs.length) return qs;
   
   alert('ouups');
   return null;
}

