/* 
  This program is free software. It comes without any warranty, to
  the extent permitted by applicable law. You can redistribute it
  and/or modify it under the terms of the Do What The Fuck You Want
  To Public License, Version 2, as published by Sam Hocevar. See
  http://sam.zoy.org/wtfpl/COPYING for more details.
*/

/*
  httpobj: javascript class using XMLHttpRequest to send and retrieve info.
  See /httpobj to get an example of the usage.
*/
//v.1.0
function httpobj() {
  // Get XMLHttpRequest object
  this.obj = this.getobj()
  if (!this.obj) {
    alert('Your browser does not support HTTP Requests! Get a new one (a browser, that is. Not a request).')
    delete this
    return false
  }
  
  // Define default variables
  this.param = {}
  this.method = 'POST'
  
  // Fix for later on
  this.obj.topelem = this
}

httpobj.prototype.getobj = function() {
  // Try to get the XMLHttpRequest object
  try { return new XMLHttpRequest() } catch (e) {}
  try { return new ActiveXObject('Msxml2.XMLHTTP.6.0') } catch(e) {}
  try { return new ActiveXObject('Msxml2.XMLHTTP.3.0') } catch(e) {}
  try { return new ActiveXObject('Msxml2.XMLHTTP') } catch(e) {}
  try { return new ActiveXObject('Microsoft.XMLHTTP') }
  catch(e) {
    return false // FAILURE
  }
}

httpobj.prototype.send = function() {
  /*
    send(): Sends parametres (param) to url (url) and sets up function to
    react on retrievement
  */
  
  if (!this.url) {
    // Exit function if either url or the function to be called is undefined
    delete this
    return false
  }
  
  // Transform param into string type ?foo=bar&hmm=aha
  this.text_params = ''
  if (this.param) {
    for (var x in this.param)
      this.text_params += '&' + x + '=' + this.param[x]
    this.text_params = this.text_params.substr(1)
  }
  
  if (this.method.toLowerCase() == 'get') {
    // In case of GET method, use '?'
    var after_url
    if (!this.param)
      after_url = ''
    else
      after_url = '?' + this.text_params
    
    this.obj.open('GET', this.url + after_url, true)
    this.obj.send(null)
  }
  else {
    // In case of POST method, use RequestHeader
    this.obj.open('POST', this.url, true)
    this.obj.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')
    this.obj.setRequestHeader('Content-length', this.text_params.length)
    this.obj.setRequestHeader('Connection', 'close')
    this.obj.send(this.text_params)
  }
  
  // What to do when something happens
  this.obj.onreadystatechange = function() {
    // Only do something when it's complete
    if (this.readyState == 4 || this.readyState == 'complete') {
      // Define 3 variables to be used with the user-defined function (func)
      var text, params, state
      text = this.responseText
      params = this.topelem.param // this.topelem = this.obj.topelem = this
      
      // State 0 is good, state 1 is bad
      state = 0
      if (this.status != 200) {
        state = 1
        text = ''
      }
      
      // Call user-defined function
      if (this.topelem.func)
        eval(this.topelem.func)
      delete this
    }
  }
  return true // It has a chance of working..
}