/*
<ChangeLog>
 <Versions>
  <Version> 
   <Version>1.0</Version> 
   <DateTime>17.12.2008 17:34:42</DateTime>
   <Author>Marek Skotnica</Author> 
   <Description>Dokumentace v manualu. Mel by to byt nejrychlejsi a nejmensi navrh.</Description> 
  </Version> 
 </Versions>
</ChangeLog>
*/

/// <reference path="Karsa.js />
/// <reference path="json2.js />

var KarsaAjax = {
    ///<summary>KarsaAjax object declaration. Dont forget to init KarsaAjax.ajaxPagePath in header of page.</summary>
    
    ajaxPagePath : 'AjaxPage.aspx' , 
    ///<value>Absolute path to AjaxPage.aspx </value>
    
    GetHTTPObject: function() {
    ///<summary>GetInstance of HTTP object</summary>
    ///<returns type="domElement">Instance of HTTPObject</returns>
     var http;
        try {
          http = new XMLHttpRequest;
            GetHTTPObject = function() {
              return new XMLHttpRequest;
            };
        }
        catch(e) {
          var msxml = [
            'MSXML2.XMLHTTP.3.0',
            'MSXML2.XMLHTTP',
            'Microsoft.XMLHTTP'
          ];
          for (var i=0, len = msxml.length; i < len; ++i) {
            try {
              http = new ActiveXObject(msxml[i]);
              GetHTTPObject = function() {
                return new ActiveXObject(msxml[i]);
              };
              break;
            }
            catch(e) {}
          }
        }
        return http;	
    }, 
    
    
    
    CallbackArgs:function(methodName, args){
        this.Method = methodName;
        this.Args = args;
    }, 
    
    JSONReplacer:function(key, value){
        return value;
    }, 
    
    JSONReviver:function (key, value) {
        var type;
        if (value && typeof value === 'object') {
            type = value.type;
            if (typeof type === 'string' && typeof window[type] === 'function') {
                return new (window[type])(value);
            }
        }
        return value;
    }, 
    
    CommonCallSupport : function(methodName, args){
        return this.GetCallback(JSON.stringify(new this.CallbackArgs(methodName, args), this.JSONReplacer));
    }, 
    
    ServiceCall : function(methodName, args){
        return JSON.parse(this.CommonCallSupport(methodName, args), this.JSONReviver );
    }, 
    
    ControlCall : function(controlName, args){
        return this.GetCallback(JSON.stringify(new this.CallbackArgs(controlName, args), this.JSONReplacer));
    }, 
    
    DirectCall : function(url, callbackArguments, method){
        ///<summary>simple ajax call when we need to call .aspx page</summary>
        ///<param name="url" type = "string" >ajax call url</param>
        ///<param name="callbackArguments" type = "string" >callback string</param>
        ///<param name="method" type = "string" >Optional method parameter. Default value is 'POST'.</param>
        ///<returns type="string">Callback page html code</returns>
        if(method==null){method = 'POST'; }
        if(url==null){url = this.ajaxPagePath;}
        var xmlHttp = this.GetHTTPObject();
        if (xmlHttp) 
        {
            xmlHttp.abort();
            xmlHttp.open(method, url, false);
            xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            //xmlHttp.setRequestHeader("Content-length", callbackArguments.length);
            //xmlHttp.setRequestHeader("Connection", "close");
            xmlHttp.send(callbackArguments);
            return xmlHttp.responseText;
        }
    }, 
    
    GetCallback : function(callbackArguments){            
        ///<summary>call ajax refresh with direct string callback arguments</summary>
        ///<param name="callbackArguments" type = "string">ajax callback arguments separated by ';'. Ex. "controlname=SampleAjaxControll.ascx;data1=hello;data2=world"</param>
        ///<returns type="string">Callback control html code</returns>
        return this.DirectCall(this.ajaxPagePath, callbackArguments);
    } , 
    
    RefreshDiv : function(divID, html){  
            $(divID).innerHTML = html;
    } 
    
}
