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

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

function Ajax(){}

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();
                
                if(args.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;
                                                                                                       }
                                                                                                    });
                }
                
                args.url+=(args.url.indexOf("?")==-1 ? "?" : "&") + "xhr_unique=" + new Date().getTime();
                
                request.open(args.method, args.url, (Object.keyExists(args, "async") ? args.async : true));
                
                request.send(null);
                               
                return request;
             };
             
Ajax.Get=function(tempURL)
         {
            return (Ajax.Request({method:"GET", url:tempURL, async:false}).responseText);
         };