/* Copyright 2008 Simply Extras Ltd */
function GOSAjax(url){var $this=this;var callback_id=0;function _new_callback_id(){callback_id++;return callback_id}$this.ajax_url=url;$this.get_num_pending_requests=function(){var i=0;for(k in $this.callbacks){if(parseInt(k).toString()==k){i++}}return i};$this._callback=false;$this._callback_args=[];$this.register_callback=function(callback){$this._callback=callback};$this.get_request_obj=function(){var e;try{return new XMLHttpRequest()}catch(e){}try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(e){}try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(e){}try{return new ActiveXObject("Microsoft.XMLHTTP.4.0")}catch(e){}try{return window.createRequest()}catch(e){}return null};function _argument_hash(remote_function,time,a_arguments){if(a_arguments===undefined){a_arguments=new Array()}var encoded="";var i;var hash={};hash.f=remote_function;hash.t=time;if(a_arguments.constructor===Array){for(i=0;i<a_arguments.length;i++){if(typeof (a_arguments[i])==="object"){for(var p in a_arguments[i]){hash[p]=a_arguments[i][p]}}else{hash["a["+i+"]"]=a_arguments[i]}}}else{for(var p in a_arguments){hash[p]=a_arguments[p]}}return hash}function encode_arguments(remote_function,time,a_arguments){return GOSLib.Hash.URI_encode(_argument_hash(remote_function,time,a_arguments))}$this.callbacks=new Array();$this.call=function(remote_function,remote_arguments,js_callback,request_timeout){if(typeof (request_timeout)=="undefined"){request_timeout=GOSAjax.default_timeout}var args=GOSLib.arguments_to_array(arguments).slice(4);var post_data;var request;var i;var id=_new_callback_id();$this.callbacks[id]=new Array();$this.callbacks[id]["callback"]=js_callback;$this.callbacks[id]["callback_args"]=args;$this.callbacks[id]["request"]=0;$this.callbacks[id]["timer"]=setTimeout(function(){$this.handle_timeout(id)},request_timeout);$this.callbacks[id]["timedout"]=0;if(document.body){document.body.style.cursor="wait"}post_data=encode_arguments(remote_function,new Date().getTime(),remote_arguments);$this.callbacks[id]["request"]=$this.get_request_obj();if(!$this.callbacks[id]["request"]){clearTimeout($this.callbacks[id]["timer"]);alert("Sorry, your browser does not appear to support asynchronous requests.");return false}request=$this.callbacks[id]["request"];request.open("POST",$this.ajax_url,true);try{request.setRequestHeader("Method","POST "+$this.ajax_url+" HTTP/1.1");request.setRequestHeader("Content-Type","application/x-www-form-urlencoded")}catch(e){if(document.body){document.body.style.cursor="default"}clearTimeout($this.callbacks[id]["timer"]);alert("Sorry, your browser does not appear to support asynchronous requests using POST.");return false}request.onreadystatechange=function(){$this.handle_response(id)};request.send(post_data);return true};$this.debug_write_form=function(remote_function,remote_arguments,js_callback,request_timeout){if(typeof (request_timeout)=="undefined"){request_timeout=GOSAjax.default_timeout}var doc=document.getElementsByTagName("body").item(0);var form_element=document.createElement("form");var input_element;var t=new Date().getTime();var i;form_element.setAttribute("action",$this.ajax_url);form_element.setAttribute("method","post");var hash=_argument_hash(remote_function,t,remote_arguments);for(var a in hash){GOSLib.Debug.puts(a+": "+hash[a]);input_element=document.createElement("input");input_element.setAttribute("type","hidden");input_element.setAttribute("name",a);input_element.setAttribute("value",hash[a]);form_element.appendChild(input_element)}input_element=document.createElement("input");input_element.setAttribute("type","submit");input_element.setAttribute("value",remote_function);input_element.style.margin=0;input_element.style.padding=0;form_element.appendChild(input_element);form_element.style.margin=0;form_element.style.padding=0;form_element.style.display="inline";GOSLib.Debug.append(form_element);return form_element};function _clean(id){delete $this.callbacks[id]}function _call_callback(id,string_or_XML_response,request_status,bool_is_xml,args){if(args===undefined){args=[]}callback=$this.callbacks[id]["callback"];if(typeof (callback)=="function"){callback.apply($this,[string_or_XML_response,request_status,bool_is_xml].concat(args))}else{eval("h_"+callback+"(string_or_XML_response, request_status, bool_is_xml)")}_clean(id);callback=$this._callback;if(!callback){return }if(typeof (callback)=="function"){callback.apply($this,[string_or_XML_response,request_status,bool_is_xml].concat($this._callback_args))}else{eval("h_"+callback+"(string_or_XML_response, request_status, bool_is_xml)")}}var _validate_XML=function(responseXML){if(!responseXML){return false}if(!responseXML.documentElement){return false}if(responseXML.childNodes.length==1&&responseXML.firstChild.tagName=="parsererror"){return false}return true};var _get_XML_error=function(responseXML){if(!responseXML){return false}if(!responseXML.documentElement){return false}if(responseXML.childNodes.length==1&&responseXML.firstChild.tagName=="parsererror"){return"ERROR:"+GOSLib.DOM.hack_textContent(responseXML.firstChild)}return false};$this.handle_response=function(id){var request=$this.callbacks[id]["request"];if($this.callbacks[id]["timedout"]==1){if(request.readyState==1||request.readyState==2||request.readyState==3){request.abort()}_call_callback(id,"",-1,0);return }if(request.readyState!=4){return }clearTimeout($this.callbacks[id]["timer"]);if(request.status==200){if(_validate_XML(request.responseXML)){_call_callback(id,request.responseXML,1,true,$this.callbacks[id]["callback_args"])}else{if(_get_XML_error(request.responseXML)){_call_callback(id,_get_XML_error(request.responseXML),1,false,$this.callbacks[id]["callback_args"])}else{_call_callback(id,request.responseText,1,false,$this.callbacks[id]["callback_args"])}}}else{_call_callback(id,request.responseText,0,false,$this.callbacks[id]["callback_args"])}};$this.handle_timeout=function(id){$this.callbacks[id]["timedout"]=1;$this.handle_response(id)}}GOSAjax.default_timeout=15000;GOSAjax.get_response_error=function(A){if(A){return A.substring(6,A.length)}else{return"Empty response"}};GOSAjax.done=function(A){if(document.body){document.body.style.cursor="default"}if(A!=""){alert(A)}};