/**
** AnAA - Ajax Framework
** v1.1 getFromValues loop foutje
*/	

function asack() {
  this.responseStatus  = Array(2);
  this.response        = "res";
  this.responseJSON    = "rjson";
  this.responseXML     = "rxml";
  this.method          = "POST";
  this.URLString       = "";
  this.encodeURIString = true;
  this.vars            = new Object();

  this.setVar = function(name, value){ this.vars[name] = Array(value, false); };
  this.encVar = function(name, value, returnvars) {
    if (true == returnvars) {
      return Array(encodeURIComponent(name), encodeURIComponent(value));
    } else {
      this.vars[encodeURIComponent(name)] = Array(encodeURIComponent(value), true);
    }
  }

  this.testf=function(f) { alert(f); }

  this.processURLString = function(string, encode) {
    encoded = encodeURIComponent('&');
    regexp = new RegExp('&' + "|" + encoded);
    varArray = string.split(regexp);
    for (i = 0; i < varArray.length; i++){
      urlVars = varArray[i].split("=");
      if (true == encode){
        this.encVar(urlVars[0], urlVars[1]);
      } else {
        this.setVar(urlVars[0], urlVars[1]);
      }
    }
  }

  this.createURLString = function(urlstring) {

    if (this.encodeURIString && this.URLString.length) {
      this.processURLString(this.URLString, true);
    }

    if(urlstring) {
      if(this.URLString.length) {
        this.URLString += '&' + urlstring;
      } else {
        this.URLString = urlstring;
      }
    }

    // prevents caching of URLString
    this.setVar("rndval", new Date().getTime());

    urlstringtemp = new Array();
    for (key in this.vars) {
      if (false == this.vars[key][1] && true == this.encodeURIString) {
        encoded = this.encVar(key, this.vars[key][0], true);
        delete this.vars[key];
        this.vars[encoded[0]] = Array(encoded[1], true);
        key = encoded[0];
      }
      urlstringtemp[urlstringtemp.length] = key + "=" + this.vars[key][0];
    }
    if (urlstring){
      this.URLString += '&' + urlstringtemp.join('&');
    } else {
      this.URLString += urlstringtemp.join('&');
    }
  }


//
// Ajax functies //
//


//
// AACreate
//
  this.AACreate = function() {
    var request = false;
        try { request = new ActiveXObject('Msxml2.XMLHTTP'); }
          catch (err2) { try { request = new ActiveXObject('Microsoft.XMLHTTP'); }
            catch (err3) { try { request = new XMLHttpRequest(); } catch (err1) { request = false; } }
	        }
    return request;
  }


//
// AARead()
//
  this.AARead = function(url,fun) { 
    var self = this;

    try { this.xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") } catch (e) { }
    this.xhr.open(this.method, url, true);
    this.xhr.send(null); 

    this.xhr.onreadystatechange = function() { 
      if(self.xhr.readyState == 4) {
        if(self.xhr.status == 200) {
          self.response = self.xhr.responseText;
          try { self.responseJSON = eval("(" + self.xhr.responseText +")"); } catch(e) { self.responseJSON=false; }
          try { self.responseXML  = self.xhr.responseXML; } catch(e) { self.responseXML=false; }

          self.responseStatus[0]  = self.xhr.status;
          self.responseStatus[1]  = self.xhr.statusText;

          if(self.responseStatus[0] == "200") {
            if(fun != null) { fun(); }
            //fun();
            //self.onCompletion();
          }

        }
      } 
    }; 

  } 


// 
// AAWrite(url,data,fun)
// url:  the script
//  data: the string to pass to the script
//  it is a list of pairs x=y separated by &
//
  this.AAWrite = function(url, data, fun) {
    var self = this;

    this.xhr.open("POST", url, true);
    try { this.xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") } catch (e) { }
    this.xhr.send(data);

    this.xhr.onreadystatechange = function() {
      if(self.xhr.readyState == 4) {
        if(self.xhr.status == 200) {
          self.response = self.xhr.responseText;
          try { self.responseJSON = eval("(" + self.response +")"); } catch(e) { self.responseJSON=false; }
          try { self.responseXML  = self.xhr.responseXML; } catch(e) { self.responseXML=false; }

          self.responseStatus[0]  = self.xhr.status;
          self.responseStatus[1]  = self.xhr.statusText;

          if(self.responseStatus[0] == "200") {
            //alert(fun);
            if(fun != null) { fun(); }
          }
        }
      } 
    };
  }

  // 
  // AAHead()
  //
  this.AAHead = function(url, key, fun, element) {
    var self = this;

    self.xhr.onreadystatechange = function() {
      if(self.xhr.readyState == 4) {
        var value;
        if (self.xhr.status == 200) {
           value = self.xhr.getResponseHeader(key);
        } else {
          if(self.xhr.status==404)
            value = url + " doesn't exist!";
          else
            value = "Error, status is " + self.xhr.status;
        }
        fun(value, element);
      }
    }
    this.xhr.open("HEAD", url, true);
    this.xhr.send(null);
  }

  //
  // getFormDifValues()
  //
  this.getFormDifValues = function(theForm) {
    var elts = theForm.elements;
    var args = new Array(); var i=0;

    for(anItem=0; anItem<elts.length; anItem++) {

      switch(elts[anItem].type) {
        case 'text':
        case 'hidden':
          var def = elts[anItem].defaultValue;
          var nw  = elts[anItem].value;
          if(def!=nw) { args[i++] = elts[anItem].name + '=' + encodeURIComponent(def + '|' + elts[anItem].value); }
/*
          if(elts[anItem].name=='field[flags]') { 
             var x = elts[anItem];
             for(anItem2 in x) { alert(anItem2 + ' / ' + x[anItem2]); }
          }
*/
        break;

        case 'radio':
          if(elts[anItem].checked) { 
            var def = elts[anItem].defaultValue;
            var nw  = elts[anItem].value; 
            if(def!=nw) { args[i++] = elts[anItem].name + '=' + encodeURIComponent(def + '|' + elts[anItem].value); }
          }
        break;

        case 'select-one':
          for(var i2=0; i2<elts[anItem].options.length; i2++) {
            if(elts[anItem].options[i2].defaultSelected) { var def = elts[anItem].options[i2].value; }
          }
          var nw  = elts[anItem].value; 
          if(def!=nw) { args[i++] = elts[anItem].name + '=' + encodeURIComponent(def + '|' + elts[anItem].value); }
        break;

        case 'textarea':
          var def = elts[anItem].defaultValue;
          var nw = elts[anItem].value; 
          if(def!=nw) { args[i++] = elts[anItem].name + '=' + encodeURIComponent(def + '|' + elts[anItem].value); }
        break;
      }
    }

    return args.join('&');

  }

  //
  // getFormValues()
  //
  this.getFormValues = function(theForm) {
    var elts = theForm.elements;
    var args = new Array(); var i=0;

    for(anItem=0; anItem<elts.length; anItem++) {
      switch(elts[anItem].type) {
        case 'text':
        case 'hidden':
          args[i++] = elts[anItem].name + '=' + encodeURIComponent(elts[anItem].value);
        break;

        case 'radio':
          if(elts[anItem].checked) { args[i++] = elts[anItem].name + '=' + elts[anItem].value; }
        break;

        case 'select-one':
          args[i++] = elts[anItem].name + '=' + encodeURIComponent(elts[anItem].value);
        break;

        case 'textarea':
          args[i++] = elts[anItem].name + '=' + encodeURIComponent(elts[anItem].value);
        break;


 
        //default: alert(elts[anItem].type + ' / ' + elts[anItem].value + ' / ' + elts[anItem].checked); break;
      }
    } 
    //alert(args.join('&'));
    return args.join('&');
  }



  // Init sack
  this.xhr = this.AACreate();
}
