Codebase.load("http://codebase.gd-ks.com/js/Object.js");

// Purpose:
//    1. XBrow + degradation
//    2. Custom XHR events
//    3. Remote calls
//    4. CINToG

// Custom Events:
//    onLoading, onLoaded, onInteractive, onComplete, onSuccess, onError

function Ajax(){}

Ajax.PROXY="/proxy.php";

Ajax.getXHR=(window.XMLHttpRequest ? function(){ return new XMLHttpRequest(); } : function(){ return new ActiveXObject("Microsoft.XMLHTTP"); });

// CINTG wrapper for ugly traditional XMLHttpRequest calls
Ajax.Request=function(args)
             {
                var request=Ajax.getXHR();
                var url=args.url;
                var data=(Object.keyExists(args, "data") ? args.data : {});
                var method=(Object.keyExists(args, "method") ? args.method.toUpperCase() : "GET");
                var async=(Object.keyExists(args, "async") ? args.async : true);
                
                if(async)
                {
                   request.onreadystatechange=(Object.keyExists(args, "callback") ? args.callback : function()
                                                                                                    {
                                                                                                       switch(request.readyState)
                                                                                                       {
                                                                                                          case 1 : if(Object.keyExists(args, "onLoading")) args.onLoading.call(this, {"request": request});
                                                                                                             break;
                                                                                                          case 2 : if(Object.keyExists(args, "onLoaded")) args.onLoaded.call(this, {"request": request});
                                                                                                             break;
                                                                                                          case 3 : if(Object.keyExists(args, "onInteractive")) args.onInteractive.call(this, {"request": request});
                                                                                                             break;
                                                                                                          case 4 : if(Object.keyExists(args, "onComplete")) args.onComplete.call(this, {"request": request});
                                                                                                                   if(request.status==200 && Object.keyExists(args, "onSuccess")) args.onSuccess.call(this, {"request": request});
                                                                                                                   if(request.status!=200 && Object.keyExists(args, "onError")) args.onError.call(this, {"request": request});
                                                                                                             break;
                                                                                                       }
                                                                                                    });
                }
                
                var params="";
                
                for(var name in data)
                {
                   if(Object.isArray(data[name]))
                   {
                      for(var i=0; i<data[name].length; i++)
                      {
                         params+=name + "[]=" + data[name][i] + "&";
                      }
                   }
                   else
                   {
                      params+=name + "=" + data[name] + "&";
                   }
                }
                
                // Take off last '&'
                params=params.substring(0, params.length-1);
                
                // Handle gets and posts
                if(method=="GET")
                {
                   url+=(url.indexOf("?")==-1 ? "?" : "&") + params;
                   url+=(url.indexOf("?")==-1 ? "?" : "&") + "xhr_unique=" + new Date().getTime();
                   
                   request.open("GET", (url.indexOf("http://")!=-1 ? Codebase.PROXY + "?url=" : "") + url, async);
                   
                   request.send(null);
                }
                else if(method=="POST")
                {
                   url=(url.indexOf("http://")!=-1 ? Codebase.PROXY + "?url=" + encodeURIComponent(url) : url);
                   
                   request.open("POST", url, async);
                   
                   request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                   
                   request.send(params);
                }
                
                delete url;
                delete data;
                delete method;
                delete async;
                delete params;
                
                // Handle events for non async calls
                if(!async)
                {
                   if(Object.keyExists(args, "onComplete")) args.onComplete.call(this, {"request": request});
                   if(request.status==200 && Object.keyExists(args, "onSuccess")) args.onSuccess.call(this, {"request": request});
                   if(request.status!=200 && Object.keyExists(args, "onError")) args.onError.call(this, {"request": request});
                }
                
                return request;
             };