﻿
var $ = function (id) { 
return "string" == typeof id ? document.getElementById(id) : id; 
}; 

var Class = { 
create: function() { 
return function() { 
this.initialize.apply(this, arguments); 
} 
} 
} 

Object.extend = function(destination, source) { 
    for (var property in source) { 
        destination[property] = source[property]; 
    } 
    return destination; 
} 


Object.toQueryString = function(obj)
{ 
 
     var result = '';
 
     if( typeof obj == "object")
     {
        for(i in obj)
        {
           if(typeof obj[i] != "function")
           {
               if(result == '')
               {
                  result = "?"+item.toString() + "=" + obj[i]; 
               }
               else
               {
                  result += "&"+item.toString() + "=" + obj[i];
               }
            }
  
        }
     
      }
      return result;
  
}

Object.jsonToString = function(obj)
{
   if(typeof obj == "object")
   {
      var result = [];
      for(i in obj)
      { 
          if(typeof obj[i] != "function")
          {
             result.push(i +"="+obj[i]);
             
          } 
      } 
      return result.join('&'); 
   } 
   else
   {
      return obj.toString();
   }
   
}


String.format = function() { 
   
    if( arguments.length == 0 ) 
        return null; 
        

    var str = arguments[0]; 

    for(var i=1;i<arguments.length;i++) { 
    
        
        if(typeof arguments[i]=="object")
        {
           
           for(arg in arguments[i])
           {                          
              var re = new RegExp('\\{' + (arg) + '\\}','gm'); 
              str = str.replace(re, arguments[i][arg]); 
              
           }
           
        }
        else
        {
           var re = new RegExp('\\{' + (i-1) + '\\}','gm'); 
           str = str.replace(re, arguments[i]); 
        }
    } 
    
    return str; 
} 






function Each(list,fun){  
    for (var i = 0, len = list.length; i < len; i++) { fun(list[i], i); } 
}; 


var Try = {
  these: function() {
    var returnValue;

    for (var i = 0, length = arguments.length; i < length; i++) {
      var lambda = arguments[i];
      try {
        returnValue = lambda();
        break;
      } catch (e) { }
    }

    return returnValue;
  }
};

var Ajax = {
  getTransport: function() {
    return Try.these(
      function() {return new XMLHttpRequest()},
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
    ) || false;
  }
};
var AjaxRequest = Class.create(); 

AjaxRequest.prototype = {

  initialize: function(url,options) {
    
    this.options = {
      method:       'post',
      asynchronous: true,
      contentType:  'application/x-www-form-urlencoded',
      encoding:     'UTF-8',
      parameters:   ''
    };
    
    Object.extend(this.options, options || { });

    this.options.method = this.options.method.toLowerCase();
    this.transport = Ajax.getTransport();
    //this.request(url);
  },

  request: function(url,paras) {
    this.url = url;  

    var params = paras.toString();  
    
    try {

      this.transport.open(this.options.method.toUpperCase(), this.url,
        this.options.asynchronous);

      this.transport.onreadystatechange = this.onStateChange(this);
      this.setRequestHeaders();


      this.body = this.options.method == 'post' ?  params : null;
     
      this.transport.send(this.body);
  
      /* Force Firefox to handle ready state 4 for synchronous requests */
      if (!this.options.asynchronous && this.transport.overrideMimeType)
        this.onStateChange();

    }
    catch (e) {
      throw e;
    }
  },

  onStateChange: function(o) {
    return function()
    {
       var readyState = o.transport.readyState; 
       if (readyState == 4)
          o.respondToReadyState(o.transport.readyState);
     } 
  },

  setRequestHeaders: function() {
    var headers = {
      'X-Requested-With': 'XMLHttpRequest',
      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
    };
    
    headers['Content-type'] = this.options.contentType +
        (this.options.encoding ? '; charset=' + this.options.encoding : '');
    headers["Content-length"] = this.options.parameters.length;

    for (var name in headers)
      this.transport.setRequestHeader(name, headers[name]);
  },

  success: function() {
    var status = this.getStatus();
    return !status || (status >= 200 && status < 300);
  },

  getStatus: function() {
    try {
      return this.transport.status || 0;
    } catch (e) { return 0 }
  },

  respondToReadyState: function(readyState) {
    var state = AjaxRequest.Events[readyState];

    if (state == 'Complete'){    
        (this.callback||this.options['on' + (this.success() ? 'Success' : 'Failure')]||function(){})(this.transport.responseText,this.transport.responseXML);
        }


  },


  getHeader: function(name) {
    try {
      return this.transport.getResponseHeader(name) || null;
    } catch (e) { return null }
  }
};




AjaxRequest.Events =['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];


