// Do not use this file or parts of it without the permission of the owner.
// Copyright 2008-2010 Bulik László, All rights reserved.
Ajax=function(c){var ajax=this;this.form='';this.url='';this.method='';this.query={};this.cache=false;this.timeout=20000;this.retries=0;this.autoAbort=true;this.evalJS=false;this.onSuccess=function(responseText){};this.onError=function(errorCode){};var running=false;var client=null;var timer=null;var retries=0;var uploadFrame=null;var responseText='';var responseXml=null;var initClient=function(){try{client=new XMLHttpRequest()}catch(e){try{client=new ActiveXObject("Msxml2.XMLHTTP")}catch(e){try{client=new ActiveXObject("Microsoft.XMLHTTP")}catch(e){ajax.onError(1)}}}client.onreadystatechange=onRequestChange;return client};var deleteClient=function(){if(client!=null){client.onreadystatechange=function(){};client.abort();client=null}};var initVars=function(c){if(typeof(c)!='object')return;if(typeof(c.method)=='string'&&(c.method.toUpperCase()=='GET'||c.method.toUpperCase()=='POST'))ajax.method=c.method;if(typeof(c.form)=='object'||typeof(c.form)=='string')ajax.form=c.form;if(typeof(c.url)=='string')ajax.url=c.url;if(typeof(c.query)=='object')ajax.query=c.query;if(typeof(c.cache)=='boolean')ajax.cache=c.cache;if(typeof(c.timeout)=='number')ajax.timeout=c.timeout;if(typeof(c.retries)=='number')ajax.retries=c.retries;if(typeof(c.autoAbort)=='boolean')ajax.autoAbort=c.autoAbort;if(typeof(c.evalJS)=='boolean')ajax.evalJS=c.evalJS;if(typeof(c.onSuccess)=='function')ajax.onSuccess=c.onSuccess;if(typeof(c.onError)=='function')ajax.onError=c.onError;var form=ajax.form;if(typeof(form)=='string'&&form!='')form=document.getElementById(form);if(typeof(form)=='object'){if(ajax.url==''&&typeof(form.action)=='string')ajax.url=form.action;if(ajax.method==''&&typeof(form.method)=='string')ajax.method=form.method}};var assertVars=function(){if(typeof(ajax.method)=='string'&&(ajax.method.toUpperCase()=='GET'||ajax.method.toUpperCase()=='POST')&&(typeof(ajax.form)=='object'||typeof(ajax.form)=='string')&&typeof(ajax.url)=='string'&&typeof(ajax.query)=='object'&&typeof(ajax.cache)=='boolean'&&typeof(ajax.timeout)=='number'&&ajax.timeout>=0&&typeof(ajax.retries)=='number'&&ajax.retries>=0&&typeof(ajax.autoAbort)=='boolean'&&typeof(ajax.evalJS)=='boolean'&&typeof(ajax.onSuccess)=='function'&&typeof(ajax.onError)=='function')return true;return false};var 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};var isFileUpload=function(){var form=ajax.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};var captureForm=function(){var form=ajax.form;if(typeof(form)=='string'&&form!='')form=document.getElementById(form);if(form==''||form==null)return;var qu=ajax.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}}};var evalJS=function(response){var script='';response=response.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,function(){script+=arguments[1]+'\n';return''});if(window.execScript)window.execScript(script);else if(window.eval)window.eval(script);else eval(script)};var onRequestChange=function(){if(client.readyState==4||client.readyState=='complete'){clearTimeout(timer);if(client.status==200){responseText=client.responseText;responseXml=client.responseXml;ajax.onSuccess(responseText,responseXml);if(ajax.evalJS)evalJS(responseText)}else ajax.onError(4,client.status);deleteClient();running=false}};var requestHttp=function(){deleteClient();if(retries>=0){if(retries!=ajax.retries)ajax.onError(2);--retries;if(!assertVars()){ajax.onError(0);running=false;return}var qu='';for(var p in ajax.query)qu+=((qu!='')?'&':'')+encodeURIComponent(p)+'='+encodeURIComponent(ajax.query[p]);var url=realUrl(ajax.url);if(!ajax.cache)url=ajax.url+((ajax.url.indexOf('?')<0)?'?':'&')+Math.floor(new Date().getTime()/1000);var cl=initClient();if(ajax.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)}timer=setTimeout(requestHttp,ajax.timeout)}else{running=false;ajax.onError(3)}};var onUploadComplete=function(){var iframe=uploadFrame;if(iframe==null||window.frames[iframe.getAttribute('id')].location.href=='about:blank')return;clearInterval(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;responseText=responseText;responseXml=null;uploadFrame=null;ajax.onSuccess(responseText,null);setTimeout(function(){running=false;iframe.parentNode.removeChild(iframe)},1000)};var uploadStatusCheck=function(){var iframe=uploadFrame;if(iframe.readyState=='complete'){clearInterval(timer);iframe.parentNode.removeChild(iframe);uploadFrame=null;ajax.onError(3);running=false}};var requestFrame=function(){var inputs=[];var qu=ajax.query;var input;var form=ajax.form;if(typeof(form)=='string'&&form!='')form=document.getElementById(form);if(typeof(form)!='object'){ajax.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',realUrl(ajax.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',onUploadComplete,false);else if(iframe.attachEvent)iframe.attachEvent('onload',onUploadComplete);document.body.appendChild(iframe);window.frames[newTarget].name=newTarget;uploadFrame=iframe;form.submit();timer=setInterval(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){initVars(c)};this.getResponse=function(){return responseText};this.getResponseXml=function(){return responseXml};this.request=function(c){var autoAbort=ajax.autoAbort;if(typeof(c)=='object'&&typeof(c.autoAbort)=='boolean')autoAbort=c.autoAbort;if((!autoAbort||uploadFrame!=null)&&running)return;if(running){deleteClient();clearTimeout(timer)}running=true;initVars(c);captureForm();retries=ajax.retries;if(ajax.method=='')ajax.method='get';if(isFileUpload())requestFrame();else requestHttp()};initVars(c)};
