var Ajax=function()
{this.options={data:'',url:window.location.href,cdurl:window.location.href,headers:{'X-Requested-With':'XMLHttpRequest','Accept':'text/javascript, text/html, application/xml, text/xml, */*'},async:true,method:'post',urlEncoded:true,charset:'utf-8',isShowLoader:true,onShowLoader:null,onHideLoader:null,onComplete:null,onFailure:null,onException:null,onHistory:null};this.currentHash=null;this.historyInterval=null;this.running=false;this.process=0;this.initialize=function(options)
{options=options||{};for(var option in this.options)
{if(typeof(options[option])!='undefined')this.options[option]=options[option];}};this.send=function(options)
{this.running=true;this.process++;this.showLoader();options=options||{};for(var option in this.options)
{if(typeof(options[option])=='undefined')options[option]=this.options[option];}
if(options.urlEncoded&&options.method=='post')
{var charset=(options.charset)?'; charset='+options.charset:'';options.headers['Content-type']='application/x-www-form-urlencoded'+charset;}
if(options.data&&options.method=='get')
{options.url=options.url+(options.url.contains('?')?'&':'?')+options.data;options.data=null;}
var xhr=this.getXHR(),bind=this;xhr.open(options.method.toUpperCase(),options.url,options.async);xhr.onreadystatechange=function()
{if(xhr.readyState!=4)return;if(xhr.status>=200&&xhr.status<300)
{bind.process--;bind.exec(xhr.responseText);if(typeof(options.onComplete)=='function')options.onComplete(xhr);}
else if(typeof(options.onFailure)=='function')options.onFailure(xhr);xhr.onreadystatechange=function(){};if(bind.process<1)
{bind.running=false;bind.process=0;bind.hideLoader();}};for(var key in options.headers)
{try{xhr.setRequestHeader(key,options.headers[key]);}
catch(e)
{if(typeof(options.onException)=='function')options.onException(key,options.headers[key]);}}
xhr.send(options.data);return xhr;};this.exec=function(text)
{if(!text)return;if(window.execScript)window.execScript(text);else eval(text);};this.getXHR=function()
{try{return new XMLHttpRequest();}
catch(e){return new ActiveXObject('MSXML2.XMLHTTP');}};this.abort=function(xhr)
{if(!xhr)return;xhr.abort();xhr.onreadystatechange=function(){};this.process--;if(this.process<1){this.running=false;this.process=0;this.hideLoader()}
return this;};this.doit=function(func)
{var args=new Array();for(var i=1;i<arguments.length;i++)args[i]=arguments[i];return this.call(func,this.getFormValues(document.body),args);};this.call=function(func)
{var sender;if(typeof func=='object')
{sender=func[1];func=func[0];}
var params="",i=1,args=arguments;if(arguments.length==2&&typeof(arguments[1])=='object')
{args=arguments[1];i=0;}
params+="ajaxfunc="+encodeURIComponent(func);params+="&ajaxkey="+encodeURIComponent(document.body.getAttribute('key'));if(sender)params+="&ajaxsender="+encodeURIComponent(sender);for(;i<args.length;i++)params+="&ajaxargs[]="+encodeURIComponent(this.encodeObj(args[i]));return this.send({'data':params});};this.cdcall=function(func)
{var params='',i=1,args=arguments;if(arguments.length==2&&typeof(arguments[1])=='object')
{args=arguments[1];i=0;}
if(this.options.cdurl.charAt(this.options.cdurl.length-1)!='?')params='?';params+="ajaxfunc="+encodeURIComponent(func);params+="&ajaxkey="+encodeURIComponent(document.body.getAttribute('key'));for(;i<args.length;i++)params+="&ajaxargs[]="+encodeURIComponent(this.encodeObj(args[i]));var el=document.createElement('script');el.src=this.options.cdurl+params;el.type='text/javascript';document.getElementsByTagName('HEAD')[0].appendChild(el);return this;};this.encodeObj=function(param)
{if(typeof(param)=='object')
{var obj="<ajaxarray>";for(i in param)
{if(i=='constructor'||param[i]&&(typeof(param[i])=='function'))continue;obj+="<k>"+i+"</k><v>"+this.encodeObj(param[i])+"</v>";}
obj+="</ajaxarray>";return obj;}
return param;};this.submit=function(func,target,url)
{var form=this._getFormByTarget(target);var old_target=form.target;var old_action=form.action;var old_method=form.method;var old_enctype=form.encoding;url=(url)?url:this.options.url;form.action=url.replace('#','')+((url.indexOf('?')>-1)?'&':'?')+"ajaxfunc="+encodeURIComponent(func)+"&ajaxkey="+encodeURIComponent(document.body.getAttribute('key'))+"&ajaxsubmit=1&ajaxargs[]="+encodeURIComponent(this.encodeObj(target.substr(6)));form.method='post';form.target=target;form.encoding='multipart/form-data';form.submit();form.target=old_target;form.action=old_action;form.method=old_method;form.encoding=old_enctype;return this;};this.submitProgress=function(func,target,callback,url)
{var form=this._getFormByTarget(target);this.isShowLoader=false;this.submit(func,form,target,url);setTimeout(function(){this.progress(target.substr(6),callback);}.bind(this),500);return this;};this.progress=function(id,callback)
{this.doit(callback,document.getElementById('ajax_progress_key_'+id).value,id);return this;};this.showLoader=function()
{if(this.options.isShowLoader)
{if(document.body)document.body.style.cursor='wait';if(typeof(this.options.onShowLoader)=='function')this.options.onShowLoader();}
return this;};this.hideLoader=function()
{if(this.options.isShowLoader)
{if(document.body)document.body.style.cursor='default';if(typeof(this.options.onHideLoader)=='function')this.options.onHideLoader();}
return this;};this.startHistory=function()
{this.currentHash=window.location.hash;if(window.ActiveXObject)
{var el=document.createElement('iframe');el.id='ajax_historyFrame';el.style.display='none';el.inject(document.body,'top');var iframe=document.getElementById('ajax_historyFrame').contentWindow.document;iframe.open();iframe.close();iframe.location.hash=this.currentHash;if(!this.currentHash)this.currentHash='#';}
var bind=this;this.historyInterval=setInterval(function(){var hash;if(window.ActiveXObject)hash=document.getElementById('ajax_historyFrame').contentWindow.document.location.hash;else hash=window.location.hash;if(bind.currentHash!=hash)
{bind.currentHash=hash;if(window.ActiveXObject)window.location.hash=hash;if(typeof(bind.options.onHistory)=='function')
bind.options.onHistory(bind.currentHash.substr(1));}},100);return this;};this.addHistory=function(hash)
{if(window.ActiveXObject)
{var iframe=document.getElementById('ajax_historyFrame').contentWindow.document;iframe.open();iframe.close();iframe.location.hash=hash;}
window.location.hash=hash;return this;};this.stopHistory=function()
{clearInterval(this.historyInterval);this.currentHash=null;this.historyInterval=null;return this;};this.getFormValues=function(pref)
{var values=new Array();var elements=this.getFormElements();for(var i=0;i<elements.length;i++)
{var id=elements[i].id,name=elements[i].name,key,value;if(name.substr(name.length-2)=='[]')key=name.substr(0,name.length-2);else key=id;if(pref)
{var k=key.indexOf(pref);if(k!=-1)key=key.substr(0,k);}
switch(elements[i].type)
{default:value=elements[i].value;break;case'textarea':if(typeof(CKEDITOR)!='undefined'&&CKEDITOR.instances[elements[i].id])value=CKEDITOR.instances[elements[i].id].getData();else value=elements[i].value;break;case'radio':case'checkbox':value=new Array();value['state']=(elements[i].checked)?1:0;value['value']=elements[i].value;break;case'select-multiple':value=new Array();for(var j=0;j<elements[i].length;j++)
{if(elements[i].options[j].selected==true)value[j]=elements[i].options[j].value;}
break;}
if(name.substr(name.length-2)=='[]')
{if(typeof(values[key])=='undefined')values[key]=new Array();values[key][id]=value;}
else values[key]=value;}
if(arguments.length>1&&typeof(arguments[1])=='object')for(i in arguments[1])values[i]=arguments[1][i];return values;};this.getFormElements=function(el,tags)
{el=el||document;if(!tags)tags='input,select,textarea,checkbox,radio';tags=tags.split(',');var elements=[];var ddup=(tags.length>1);for(var i=0;i<tags.length;i++)
{tag=tags[i];var partial=el.getElementsByTagName(tag.replace(/^\s+|\s+$/g,''));if(ddup)for(var k=0,j=partial.length;k<j;k++)elements.push(partial[k]);else elements=partial;}
return elements;};this._getFormByTarget=function(target)
{var el=document.getElementById(target.substr(6));var firstParent=el.parentNode;var parent=firstParent;while(parent!=document.body&&parent.tagName.toLowerCase()!='form')
{parent=parent.parentNode;}
if(parent==document.body)
{var html=firstParent.innerHTML;var form=document.createElement('form');form.innerHTML=html;firstParent.innerHTML='';firstParent.appendChild(form);parent=form;}
return parent;}};Ajax.action=function()
{switch(arguments[0])
{case'alert':alert(arguments[1]);break;case'redirect':window.location.assign(arguments[1]);break;case'reload':window.location.reload(true);break;case'insert':if(document.getElementById(arguments[2]))document.getElementById(arguments[2]).innerHTML=arguments[1];break;case'replace':var old=document.getElementById(arguments[2]);if(!old)break;var el=document.createElement('span');el.innerHTML=arguments[1];if(el.childNodes[0]&&el.childNodes[0].nodeName&&el.childNodes[0].nodeType==1)el=el.childNodes[0];old.parentNode.replaceChild(el,old);break;case'inject':var element=document.getElementById(arguments[2]);if(!element)break;var el=document.createElement('span');el.innerHTML=arguments[1];if(el.childNodes[0]&&el.childNodes[0].nodeName&&el.childNodes[0].nodeType==1)el=el.childNodes[0];switch(arguments[3])
{case'top':var first=element.firstChild;(first)?element.insertBefore(el,first):element.appendChild(el);break;case'bottom':element.appendChild(el);break;case'before':if(element.parentNode)element.parentNode.insertBefore(el,element);break;case'after':if(!element.parentNode)break;var next=element.nextSibling;(next)?element.parentNode.insertBefore(el,next):element.parentNode.appendChild(el);break;}
break;case'message':var el=document.getElementById(arguments[2]);Ajax.action('insert',arguments[1],arguments[2])
setTimeout(function(){if(el)el.innerHTML='';},arguments[3]);break;case'tool':var el=document.createElement('script'),head=document.getElementsByTagName('HEAD')[0];el.src=arguments[1];el.type='text/javascript';var scripts=head.getElementsByTagName('SCRIPT');for(var i in scripts)if(scripts[i].src==el.src)return;head.appendChild(el);break;}};var ajax=new Ajax();

