
function advAJAX(){
this.url=window.location.href;
this.method='GET';
this.parameters=new Object();
this.headers=new Object();
this.mimeType=null;
this.username=null;
this.password=null;
this.useJSON=false;
this.useCache=false;
this.requestDone=false;
this.requestAborted=false;
this.requestTimedOut=false;
this.queryString='';
this.responseText=null;
this.responseXML=null;
this.responseJSON=null;
this.status=null;
this.statusText=null;
this.timeout=0;
this.retryCount=0;
this.retryDelay=1000;
this.retryNo=0;
this.repeat=false;
this.repeatCount=0;
this.repeatNo=0;
this.repeatDelay=1000;
this.tag=null;
this.group=null;
this.form=null;
this.disableForm=true;
this.onInitialization=null;
this.onFinalization=null;
this.onAbort=null;
this.onReadyStateChange=null;
this.onLoading=null;
this.onLoaded=null;
this.onInteractive=null;
this.onComplete=null;
this.onSuccess=null;
this.onFatalError=null;
this.onInternalError=null;
this.onError=null;
this.onTimeout=null;
this.onRetryDelay=null;
this.onRetry=null;
this.onRepeat=null;
this.onRepeatDelay=null;
this.onGroupEnter=null;
this.onGroupLeave=null;
this._xhr=null;
this._eventHandled=[false];
this._timerTimeout=null;
this._timerRepeat=null;
this.init=function(){
(this._xhr!==null)&&this.destroy();
if((this._xhr=this._createXHR())===null)
return false;
if(typeof advAJAX._defaultParameters!='undefined')
this.handleArguments(advAJAX._defaultParameters);
if(typeof this._xhr.overrideMimeType=='function'&&this.mimeType!==null)
this._xhr.overrideMimeType(this.mimeType);
this._eventHandled=[this._eventHandled[0],false,false,false,false];
var _this=this;
this._xhr.onreadystatechange=function(){
if(_this.requestAborted)
return;
_this._raise('ReadyStateChange',_this._xhr.readyState);
(!_this._eventHandled[_this._xhr.readyState])&&_this._handleReadyState(_this._xhr.readyState);
}
;
return true;
}
;
this.destroy=function(abort){
abort=abort||false;
try{
abort&&this._xhr.abort();
delete this._xhr['onreadystatechange'];
}
catch(e){
}
;
this._xhr=null;
}
;
this._createXHR=function(){
if(typeof XMLHttpRequest!='undefined')
return new XMLHttpRequest();
var xhr=['MSXML2.XMLHttp.6.0','MSXML2.XMLHttp.5.0','MSXML2.XMLHttp.4.0','MSXML2.XMLHttp.3.0',
'MSXML2.XMLHttp','Microsoft.XMLHttp'];
for(var i=0;i<xhr.length;i++){
try{
var xhrObj=new ActiveXObject(xhr[i]);
return xhrObj;
}
catch(e){
}
;
}
this._raise('FatalError');
return null;
}
;
this._handleReadyState=function(readyState){
if(this._eventHandled[readyState])
return;
this._eventHandled[readyState]=true;
switch(readyState){
case 1:
if(this.retryNo==0&&this.group!==null){
if(typeof advAJAX._groupData[this.group]=='undefined'){
advAJAX._groupData[this.group]=0;
this._raise('GroupEnter',this.group);
}
advAJAX._groupData[this.group]++;
}
this._raise('Loading',this);
break;
case 2:
this._raise('Loaded',this);
break;
case 3:
this._raise('Interactive',this);
break;
case 4:
window.clearTimeout(this._timerTimeout);
if(this.requestAborted)
return;
this.requestDone=true;
this.responseText=this._xhr.responseText;
this.responseXML=this._xhr.responseXML;
try{
this.status=this._xhr.status||null;
this.statusText=this._xhr.statusText||null;
}
catch(e){
this.status=null;
this.statusText=null;
}
this._raise('Complete',this);
if(this.status==200){
try{
var _contentType=this._xhr.getResponseHeader('Content-type');
if(_contentType.match(/^text\/javascript/i))
eval(this.responseText);
else
if(_contentType.match(/^text\/x\-json/i))
this.responseJSON=eval('('+this.responseText+')');
}
catch(e){
this._raise('InternalError',advAJAX.ERROR_INVALID_EVAL_STRING);
}
;
this._raise('Success',this);
}
else
this._raise('Error',this);
if(this.repeat){
if(++this.repeatNo!=this.repeatCount-1){
this._raise('RepeatDelay',this);
var _this=this;
this._timerRepeat=window.setTimeout(function(){
_this._raise('Repeat',this);
_this.init();
_this.run();
}
,this.repeatDelay);
return;
}
}
this.destroy();
(this.disableForm)&&this._switchForm(true);
this._handleGroup();
this._raise('Finalization',this);
}
}
;
this._handleGroup=function(){
if(this.group===null)return;
(--advAJAX._groupData[this.group]==0)&&this._raise('GroupLeave',this);
}
this._onTimeout=function(){
if(this._xhr==null||this._eventHandled[4])
return;
this.requestAborted=this.requestTimedOut=true;
this._xhr.abort();
this._raise('Timeout');
if(this.retryNo++<this.retryCount){
this.init();
this._raise('RetryDelay',this);
var _this=this;
this._timerTimeout=window.setTimeout(function(){
_this._raise('Retry',_this);
_this.run();
}
,this.retryDelay);
}
else{
this.destroy();
(this.disableForm)&&this._switchForm(true);
this._handleGroup();
this._raise('Finalization',this);
}
}
;
this.run=function(){
if(this.init()==false)
return false;
this.requestAborted=this.requestTimedOut=false;
(!this._eventHandled[0])&&(this._raise('Initialization',this))&&(this._eventHandled[0]=true);
if(this.retryNo==0&&this.repeatNo==0){
if(this.useJSON){
if(typeof[].toJSONString!='function'){
this._raise('InternalError',advAJAX.ERROR_NO_JSON);
return;
}
for(var p in this.parameters){
var useJson=typeof[].toJSONString=='function';
(this.queryString.length>0)&&(this.queryString+='&');
this.queryString+=encodeURIComponent(p)+'='+
encodeURIComponent(this.parameters[p].toJSONString());
}
}
else{
for(var p in this.parameters){
(this.queryString.length>0)&&(this.queryString+='&');
if(typeof this.parameters[p]!="object")
this.queryString+=encodeURIComponent(p)+'='+encodeURIComponent(this.parameters[p]);
else{
if(!(this.parameters[p]instanceof Array))continue;
for(var i=0,cnt=this.parameters[p].length;i<cnt;i++)
this.queryString+=encodeURIComponent(p)+'='+encodeURIComponent(this.parameters[p][i])+'&';
this.queryString=this.queryString.slice(0,-1);
}
}
}
(this.method=='GET')&&(this.queryString.length>0)&&(this.url+=(this.url.indexOf('?')!=-1?'&':'?')+this.queryString);
}
(this.disableForm)&&this._switchForm(false);
try{
this._xhr.open(this.method,this.url,true,this.username||'',this.password||'');
}
catch(e){
this._raise('FatalError',this);
return false;
}
var _this=this;
(this.timeout>0)&&(this._timerTimeout=window.setTimeout(function(){
_this._onTimeout();
}
,this.timeout));
if(typeof this._xhr.setRequestHeader=='function'){
if(this.method=='GET'&&!this.useCache)
this._xhr.setRequestHeader('If-Modified-Since','Sat,1 Jan 2000 00:00:00 GMT');
for(var p in this.headers)
this._xhr.setRequestHeader(encodeURIComponent(p),encodeURIComponent(this.headers[p]));
}
if(this.method=='POST'){
try{
this._xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded');
}
catch(e){
}
;
this._xhr.send(this.queryString);
}
else if(this.method=='GET'){
this._xhr.send('');
}
}
;
this.getResponseHeader=function(name){
return this._xhr.getResponseHeader(name)||null;
}
;
this.getAllResponseHeaders=function(){
return this._xhr.getAllResponseHeaders()||null;
}
;
this.abort=function(){
this.requestAborted=true;
window.clearTimeout(this._timerTimeout);
window.clearTimeout(this._timerRepeat);
this._handleGroup();
this._raise('Abort',this);
this.destroy();
this._raise('Finalization',this);
}
,
this._extendObject=function(target,source){
for(var p in source)
target[p]=source[p];
}
;
this.handleArguments=function(args){
(typeof args['form']=='string')&&(args['form']=document.getElementById(args['form']));
for(var p in args){
if(typeof this[p]=='undefined'){
this.parameters[p]=args[p];
}
else{
if(p!='parameters'&&p!='headers'){
this[p]=args[p];
}
else
this._extendObject(this[p],args[p]);
}
}
this.method=this.method.toUpperCase();
(typeof this.form=='object')&&(this.form!==null)&&this._appendForm();
(args.repeat)&&(this.repeatCount++);
}
;
this._switchForm=function(enable){
if(typeof this.form!='object'||this.form===null)
return;
var _f=this.form;
for(var i=0;i<_f.elements.length;i++)
if(!enable){
if(_f.elements[i]['disabled'])
_f.elements[i]['_disabled']=true;
else
_f.elements[i]['disabled']='disabled';
}
else{
if(typeof _f.elements[i]['_disabled']=='undefined'||_f.elements[i]['_disabled']===null)
_f.elements[i]['disabled']='';
try{
delete _f.elements[i]['_disabled'];
}
catch(e){
_f.elements[i]['_disabled']=null;
}
;
}
}
;
this._appendForm=function(){
var _f=this.form;
this.method=_f.getAttribute('method').toUpperCase();
this.url=_f.getAttribute('action');
for(var i=0;i<_f.elements.length;i++){
var _e=_f.elements[i];
if(_e.disabled)
continue;
switch(_e.type){
case 'text':
case 'password':
case 'hidden':
case 'textarea':
this._addParameter(_e.name,_e.value);
break;
case 'select-one':
if(_e.selectedIndex>=0)
this._addParameter(_e.name,_e.options[_e.selectedIndex].value);
break;
case 'select-multiple':
var _r=[];
for(var j=0;j<_e.options.length;j++)
if(_e.options[j].selected)
_r[_r.length]=_e.options[j].value;
(_r.length>0)&&(this._addParameter(_e.name,_r));
break;
case 'checkbox':
case 'radio':
(_e.checked)&&(this._addParameter(_e.name,_e.value));
break;
}
}
}
;
this._addParameter=function(name,value){
if(typeof this.parameters[name]=='undefined'){
this.parameters[name]=value;
}
else{
if(typeof this.parameters[name]!='object')
this.parameters[name]=[this.parameters[name],value];
else
this.parameters[name][this.parameters[name].length]=value;
}
}
;
this._delParameter=function(name){
delete this.parameters[name];
}
;
this._raise=function(name){
for(var i=1,args=[];i<arguments.length;args[args.length]=arguments[i++]);
(typeof this['on'+name]=='function')&&(this['on'+name].apply(null,args));
(name=='FatalError')&&this._raise('Finalization',this);
}
}
advAJAX._groupData=new Object();
advAJAX._defaultParameters=new Object();
advAJAX.get=function(args){
return advAJAX._handleRequest('GET',args);
}
advAJAX.post=function(args){
return advAJAX._handleRequest('POST',args);
}
advAJAX.head=function(args){
return advAJAX._handleRequest('HEAD',args);
}
advAJAX._handleRequest=function(requestType,args){
args=args||{
}
;
var _a=new advAJAX();
_a.method=requestType;
_a.handleArguments(args);
setTimeout(function(){
_a.run()
}
,0);
return _a;
}
;
advAJAX.submit=function(form,args){
args=args||{
}
;
if(typeof form=='undefined'||form===null)
return false;
var _a=new advAJAX();
args['form']=form;
_a.handleArguments(args);
setTimeout(function(){
_a.run()
}
,0);
return _a;
}
;
advAJAX.assign=function(form,args){
args=args||{
}
;
(typeof form=='string')&&(form=document.getElementById(form));
if(typeof form=='undefined'||form===null)
return false;
form['_advajax_args']=args;
var _onsubmit=function(event){
event=event||window.event;
if(event.preventDefault){
event.preventDefault();
event.stopPropagation();
}
else{
event.returnValue=false;
event.cancelBubble=true;
}
var _e=event.target||event.srcElement;
return!advAJAX.submit(_e,_e['_advajax_args']);
}
if(form.addEventListener){
form.addEventListener('submit',_onsubmit,false);
}
else if(form.attachEvent){
form.attachEvent('onsubmit',_onsubmit);
}
return true;
}
;
advAJAX.download=function(target,url){
(typeof target=='string')&&(target=document.getElementById(target));
if(typeof target=='undefined'||target===null)
return false;
advAJAX.get({
'url':url,
'onSuccess':function(o){
target.innerHTML=o.responseText;
}
}
);
}
;
advAJAX.setDefaultParameters=function(args){
advAJAX._defaultParameters=new Object();
for(var a in args)
advAJAX._defaultParameters[a]=args[a];
}
;
advAJAX.ERROR_INVALID_EVAL_STRING=-1;
advAJAX.ERROR_NO_JSON=-2;