// Do NOT publish or modify this file or parts of it without the written permission of the owner.
// Copyright 2008-2009 Bulik László, All rights reserved.
Ajax=function(c){var a=this;a.form='';a.url='';a.method='get';a.query={};a.cache=false;a.timeout=20000;a.retries=0;a.autoAbort=true;a.evalJS=false;a.onSuccess=function(responseText){};a.onError=function(errorCode){};a.core={};var ac=a.core;ac.running=false;ac.client=null;ac.timer=null;ac.retries=0;ac.uploadFrame=null;ac.responseText='';ac.responseXml=null;ac.initClient=function(){var client;try{client=new XMLHttpRequest()}catch(e){try{client=new ActiveXObject("Msxml2.XMLHTTP")}catch(e){try{client=new ActiveXObject("Microsoft.XMLHTTP")}catch(e){a.onError(1)}}}ac.client=client;ac.client.onreadystatechange=ac.onRequestChange;return client};ac.deleteClient=function(){if(ac.client!=null){ac.client.onreadystatechange=function(){};ac.client.abort();delete ac.client;ac.client=null}};ac.initVars=function(c){if(typeof(c)!='object')return;if(typeof(c.method)=='string'&&(c.method.toUpperCase()=='GET'||c.method.toUpperCase()=='POST'))a.method=c.method;if(typeof(c.form)=='object'||typeof(c.form)=='string')a.form=c.form;if(typeof(c.url)=='string')a.url=c.url;if(typeof(c.query)=='object')a.query=c.query;if(typeof(c.cache)=='boolean')a.cache=c.cache;if(typeof(c.timeout)=='number')a.timeout=c.timeout;if(typeof(c.retries)=='number')a.retries=c.retries;if(typeof(c.autoAbort)=='boolean')a.autoAbort=c.autoAbort;if(typeof(c.evalJS)=='boolean')a.evalJS=c.evalJS;if(typeof(c.onSuccess)=='function')a.onSuccess=c.onSuccess;if(typeof(c.onError)=='function')a.onError=c.onError};ac.assertVars=function(){if(typeof(a.method)=='string'&&(a.method.toUpperCase()=='GET'||a.method.toUpperCase()=='POST')&&(typeof(a.form)=='object'||typeof(a.form)=='string')&&typeof(a.url)=='string'&&typeof(a.query)=='object'&&typeof(a.cache)=='boolean'&&typeof(a.timeout)=='number'&&a.timeout>=0&&typeof(a.retries)=='number'&&a.retries>=0&&typeof(a.autoAbort)=='boolean'&&typeof(a.evalJS)=='boolean'&&typeof(a.onSuccess)=='function'&&typeof(a.onError)=='function')return true;return false};ac.realUrl=function(url){if(url.substring(0,7).toLowerCase()!='http://'){if(url.substring(0,1)=='/')url='http://'+window.location.hostname+url;else url=window.location.href.substring(0,window.location.href.lastIndexOf('/')+1).toLowerCase()+url}return url};ac.isFileUpload=function(){var form=a.form;if(typeof(form)=='string'&&form!='')form=document.getElementById(form);if(typeof(form)!='object')return false;if(typeof(form.method)=='string'&&form.method.toUpperCase()=='POST'&&typeof(form.enctype)=='string'&&form.enctype.toUpperCase()=='MULTIPART/FORM-DATA')return true;return false};ac.captureForm=function(){var form=a.form;if(typeof(form)=='string'&&form!='')form=document.getElementById(form);if(form==''||form==null)return;var qu=a.query;var types=['input','select','textarea'];for(var t in types){var fields=form.getElementsByTagName(types[t]);for(var f in fields){if(typeof(fields[f].name)=='undefined'||fields[f].type=='file'||(fields[f].type=='checkbox'&&!fields[f].checked))continue;if(typeof(fields[f].value)=='undefined')qu[fields[f].name]='';else qu[fields[f].name]=fields[f].value}}};ac.evalJS=function(response){var script='';response=response.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,function(){script+=arguments[1]+'\n';return''});if(script)(window.execScript)?window.execScript(script):window.setTimeout(script,0)};ac.onRequestChange=function(){if(ac.client.readyState==4||ac.client.readyState=='complete'){clearTimeout(ac.timer);if(ac.client.status==200){ac.responseText=ac.client.responseText;ac.responseXml=ac.client.responseXml;a.onSuccess(ac.responseText,ac.responseXml);if(a.evalJS)ac.evalJS(ac.responseText)}else a.onError(4,ac.client.status);ac.deleteClient();ac.running=false}};ac.requestHttp=function(){ac.deleteClient();if(ac.retries>=0){if(ac.retries!=a.retries)a.onError(2);--ac.retries;if(!ac.assertVars()){a.onError(0);ac.running=false;return}var qu='';for(var p in a.query)qu+=((qu!='')?'&':'')+encodeURIComponent(p)+'='+encodeURIComponent(a.query[p]);var url=ac.realUrl(a.url);if(!a.cache)url=a.url+((a.url.indexOf('?')<0)?'?':'&')+Math.floor(new Date().getTime()/1000);var cl=ac.initClient();if(a.method.toUpperCase()=='GET'||qu==''){if(qu!='')url+=((url.indexOf('?')<0)?'?':'&')+qu;cl.open('get',url,true);cl.send(null)}else{cl.open('post',url,true);cl.setRequestHeader("Content-Type","application/x-www-form-urlencoded");cl.send(qu)}ac.timer=setTimeout(ac.requestHttp,a.timeout)}else{ac.running=false;a.onError(3)}};ac.onUploadComplete=function(){var iframe=ac.uploadFrame;if(iframe==null||window.frames[iframe.getAttribute('id')].location.href=='about:blank')return;clearInterval(ac.timer);var responseText;if(iframe.contentDocument)responseText=iframe.contentDocument.body.innerHTML;else if(iframe.contentWindow)responseText=iframe.contentWindow.document.body.innerHTML;else if(iframe.document)responseText=iframe.document.body.innerHTML;ac.responseText=responseText;ac.responseXml=null;ac.uploadFrame=null;a.onSuccess(responseText,null);setTimeout(function(){ac.running=false;iframe.parentNode.removeChild(iframe)},1000)};ac.uploadStatusCheck=function(){var iframe=ac.uploadFrame;if(iframe.readyState=='complete'){clearInterval(ac.timer);iframe.parentNode.removeChild(iframe);ac.uploadFrame=null;a.onError(3);ac.running=false}};ac.requestFrame=function(){var inputs=[];var qu=a.query;var input;var form=a.form;if(typeof(form)=='string'&&form!='')form=document.getElementById(form);if(typeof(form)!='object'){a.onError(0);return}for(var name in qu){input=document.createElement('input');input.setAttribute('type','hidden');input.setAttribute('name',name);input.setAttribute('value',qu[name]);form.appendChild(input);inputs.push(input)}var oldTarget=form.getAttribute('target');var newTarget='upload_'+Math.floor(new Date().getTime()/1000);form.setAttribute('target',newTarget);var oldAction=form.getAttribute('action');if(typeof(oldAction)=='undefined'||oldAction==null||oldAction=='')form.setAttribute('action',ac.realUrl(a.url));var oldOnSubmit=form.getAttribute('onsubmit');form.setAttribute('onsubmit',null);var iframe=document.createElement('iframe');iframe.setAttribute('id',newTarget);iframe.setAttribute('name',newTarget);iframe.setAttribute('src','about:blank');iframe.style.display='none';if(iframe.addEventListener)iframe.addEventListener('load',ac.onUploadComplete,false);else if(iframe.attachEvent)iframe.attachEvent('onload',ac.onUploadComplete);document.body.appendChild(iframe);window.frames[newTarget].name=newTarget;ac.uploadFrame=iframe;form.submit();ac.timer=setInterval(ac.uploadStatusCheck,2000);for(var input in inputs)inputs[input].parentNode.removeChild(inputs[input]);inputs=null;form.setAttribute('target',oldTarget);form.setAttribute('onsubmit',oldOnSubmit);form.setAttribute('action',oldAction)};this.set=function(c){ac.initVars(c)};this.getResponse=function(){return ac.responseText};this.getResponseXml=function(){return ac.responseXml};this.request=function(c){var autoAbort=a.autoAbort;if(typeof(c)=='object'&&typeof(c.autoAbort)=='boolean')autoAbort=c.autoAbort;if((!autoAbort||ac.uploadFrame!=null)&&ac.running)return;if(ac.running){ac.deleteClient();clearTimeout(ac.timer)}ac.running=true;ac.initVars(c);ac.captureForm();ac.retries=a.retries;if(ac.isFileUpload())ac.requestFrame();else ac.requestHttp()};ac.initVars(c)};
