/*
	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojo._base.xhr"]){
dojo._hasResource["dojo._base.xhr"]=true;
dojo.provide("dojo._base.xhr");
dojo.require("dojo._base.Deferred");
dojo.require("dojo._base.json");
dojo.require("dojo._base.lang");
dojo.require("dojo._base.query");
(function(){
var _1=dojo,_2=_1.config;
function _3(_4,_5,_6){
if(_6===null){
return;
}
var _7=_4[_5];
if(typeof _7=="string"){
_4[_5]=[_7,_6];
}else{
if(_1.isArray(_7)){
_7.push(_6);
}else{
_4[_5]=_6;
}
}
};
dojo.fieldToObject=function(_8){
var _9=null;
var _a=_1.byId(_8);
if(_a){
var _b=_a.name;
var _c=(_a.type||"").toLowerCase();
if(_b&&_c&&!_a.disabled){
if(_c=="radio"||_c=="checkbox"){
if(_a.checked){
_9=_a.value;
}
}else{
if(_a.multiple){
_9=[];
_1.query("option",_a).forEach(function(_d){
if(_d.selected){
_9.push(_d.value);
}
});
}else{
_9=_a.value;
}
}
}
}
return _9;
};
dojo.formToObject=function(_e){
var _f={};
var _10="file|submit|image|reset|button|";
_1.forEach(dojo.byId(_e).elements,function(_11){
var _12=_11.name;
var _13=(_11.type||"").toLowerCase();
if(_12&&_13&&_10.indexOf(_13)==-1&&!_11.disabled){
_3(_f,_12,_1.fieldToObject(_11));
if(_13=="image"){
_f[_12+".x"]=_f[_12+".y"]=_f[_12].x=_f[_12].y=0;
}
}
});
return _f;
};
dojo.objectToQuery=function(map){
var enc=encodeURIComponent;
var _14=[];
var _15={};
for(var _16 in map){
var _17=map[_16];
if(_17!=_15[_16]){
var _18=enc(_16)+"=";
if(_1.isArray(_17)){
for(var i=0;i<_17.length;i++){
_14.push(_18+enc(_17[i]));
}
}else{
_14.push(_18+enc(_17));
}
}
}
return _14.join("&");
};
dojo.formToQuery=function(_19){
return _1.objectToQuery(_1.formToObject(_19));
};
dojo.formToJson=function(_1a,_1b){
return _1.toJson(_1.formToObject(_1a),_1b);
};
dojo.queryToObject=function(str){
var ret={};
var qp=str.split("&");
var dec=decodeURIComponent;
_1.forEach(qp,function(_1c){
if(_1c.length){
var _1d=_1c.split("=");
var _1e=dec(_1d.shift());
var val=dec(_1d.join("="));
if(typeof ret[_1e]=="string"){
ret[_1e]=[ret[_1e]];
}
if(_1.isArray(ret[_1e])){
ret[_1e].push(val);
}else{
ret[_1e]=val;
}
}
});
return ret;
};
dojo._blockAsync=false;
var _1f=_1._contentHandlers=dojo.contentHandlers={text:function(xhr){
return xhr.responseText;
},json:function(xhr){
return _1.fromJson(xhr.responseText||null);
},"json-comment-filtered":function(xhr){
if(!dojo.config.useCommentedJson){
console.warn("Consider using the standard mimetype:application/json."+" json-commenting can introduce security issues. To"+" decrease the chances of hijacking, use the standard the 'json' handler and"+" prefix your json with: {}&&\n"+"Use djConfig.useCommentedJson=true to turn off this message.");
}
var _20=xhr.responseText;
var _21=_20.indexOf("/*");
var _22=_20.lastIndexOf("*/");
if(_21==-1||_22==-1){
throw new Error("JSON was not comment filtered");
}
return _1.fromJson(_20.substring(_21+2,_22));
},javascript:function(xhr){
return _1.eval(xhr.responseText);
},xml:function(xhr){
var _23=xhr.responseXML;
if(_1.isIE&&(!_23||!_23.documentElement)){
var ms=function(n){
return "MSXML"+n+".DOMDocument";
};
var dp=["Microsoft.XMLDOM",ms(6),ms(4),ms(3),ms(2)];
_1.some(dp,function(p){
try{
var dom=new ActiveXObject(p);
dom.async=false;
dom.loadXML(xhr.responseText);
_23=dom;
}
catch(e){
return false;
}
return true;
});
}
return _23;
},"json-comment-optional":function(xhr){
if(xhr.responseText&&/^[^{\[]*\/\*/.test(xhr.responseText)){
return _1f["json-comment-filtered"](xhr);
}else{
return _1f["json"](xhr);
}
}};
dojo._ioSetArgs=function(_24,_25,_26,_27){
var _28={args:_24,url:_24.url};
var _29=null;
if(_24.form){
var _2a=_1.byId(_24.form);
var _2b=_2a.getAttributeNode("action");
_28.url=_28.url||(_2b?_2b.value:null);
_29=_1.formToObject(_2a);
}
var _2c=[{}];
if(_29){
_2c.push(_29);
}
if(_24.content){
_2c.push(_24.content);
}
if(_24.preventCache){
_2c.push({"dojo.preventCache":new Date().valueOf()});
}
_28.query=_1.objectToQuery(_1.mixin.apply(null,_2c));
_28.handleAs=_24.handleAs||"text";
var d=new _1.Deferred(_25);
d.addCallbacks(_26,function(_2d){
return _27(_2d,d);
});
var ld=_24.load;
if(ld&&_1.isFunction(ld)){
d.addCallback(function(_2e){
return ld.call(_24,_2e,_28);
});
}
var err=_24.error;
if(err&&_1.isFunction(err)){
d.addErrback(function(_2f){
return err.call(_24,_2f,_28);
});
}
var _30=_24.handle;
if(_30&&_1.isFunction(_30)){
d.addBoth(function(_31){
return _30.call(_24,_31,_28);
});
}
if(_2.ioPublish&&_1.publish&&_28.args.ioPublish!==false){
d.addCallbacks(function(res){
_1.publish("/dojo/io/load",[d,res]);
return res;
},function(res){
_1.publish("/dojo/io/error",[d,res]);
return res;
});
d.addBoth(function(res){
_1.publish("/dojo/io/done",[d,res]);
return res;
});
}
d.ioArgs=_28;
return d;
};
var _32=function(dfd){
dfd.canceled=true;
var xhr=dfd.ioArgs.xhr;
var _33=typeof xhr.abort;
if(_33=="function"||_33=="object"||_33=="unknown"){
xhr.abort();
}
var err=dfd.ioArgs.error;
if(!err){
err=new Error("xhr cancelled");
err.dojoType="cancel";
}
return err;
};
var _34=function(dfd){
var ret=_1f[dfd.ioArgs.handleAs](dfd.ioArgs.xhr);
return ret===undefined?null:ret;
};
var _35=function(_36,dfd){
if(!dfd.ioArgs.args.failOk){
console.error(_36);
}
return _36;
};
var _37=null;
var _38=[];
var _39=0;
var _3a=function(dfd){
if(_39<=0){
_39=0;
if(_2.ioPublish&&_1.publish&&(!dfd||dfd&&dfd.ioArgs.args.ioPublish!==false)){
_1.publish("/dojo/io/stop");
}
}
};
var _3b=function(){
var now=(new Date()).getTime();
if(!_1._blockAsync){
for(var i=0,tif;i<_38.length&&(tif=_38[i]);i++){
var dfd=tif.dfd;
var _3c=function(){
if(!dfd||dfd.canceled||!tif.validCheck(dfd)){
_38.splice(i--,1);
_39-=1;
}else{
if(tif.ioCheck(dfd)){
_38.splice(i--,1);
tif.resHandle(dfd);
_39-=1;
}else{
if(dfd.startTime){
if(dfd.startTime+(dfd.ioArgs.args.timeout||0)<now){
_38.splice(i--,1);
var err=new Error("timeout exceeded");
err.dojoType="timeout";
dfd.errback(err);
dfd.cancel();
_39-=1;
}
}
}
}
};
if(dojo.config.debugAtAllCosts){
_3c.call(this);
}else{
try{
_3c.call(this);
}
catch(e){
dfd.errback(e);
}
}
}
}
_3a(dfd);
if(!_38.length){
clearInterval(_37);
_37=null;
return;
}
};
dojo._ioCancelAll=function(){
try{
_1.forEach(_38,function(i){
try{
i.dfd.cancel();
}
catch(e){
}
});
}
catch(e){
}
};
if(_1.isIE){
_1.addOnWindowUnload(_1._ioCancelAll);
}
_1._ioNotifyStart=function(dfd){
if(_2.ioPublish&&_1.publish&&dfd.ioArgs.args.ioPublish!==false){
if(!_39){
_1.publish("/dojo/io/start");
}
_39+=1;
_1.publish("/dojo/io/send",[dfd]);
}
};
_1._ioWatch=function(dfd,_3d,_3e,_3f){
var _40=dfd.ioArgs.args;
if(_40.timeout){
dfd.startTime=(new Date()).getTime();
}
_38.push({dfd:dfd,validCheck:_3d,ioCheck:_3e,resHandle:_3f});
if(!_37){
_37=setInterval(_3b,50);
}
if(_40.sync){
_3b();
}
};
var _41="application/x-www-form-urlencoded";
var _42=function(dfd){
return dfd.ioArgs.xhr.readyState;
};
var _43=function(dfd){
return 4==dfd.ioArgs.xhr.readyState;
};
var _44=function(dfd){
var xhr=dfd.ioArgs.xhr;
if(_1._isDocumentOk(xhr)){
dfd.callback(dfd);
}else{
var err=new Error("Unable to load "+dfd.ioArgs.url+" status:"+xhr.status);
err.status=xhr.status;
err.responseText=xhr.responseText;
dfd.errback(err);
}
};
dojo._ioAddQueryToUrl=function(_45){
if(_45.query.length){
_45.url+=(_45.url.indexOf("?")==-1?"?":"&")+_45.query;
_45.query=null;
}
};
dojo.xhr=function(_46,_47,_48){
var dfd=_1._ioSetArgs(_47,_32,_34,_35);
var _49=dfd.ioArgs;
var xhr=_49.xhr=_1._xhrObj(_49.args);
if(!xhr){
dfd.cancel();
return dfd;
}
if("postData" in _47){
_49.query=_47.postData;
}else{
if("putData" in _47){
_49.query=_47.putData;
}else{
if("rawBody" in _47){
_49.query=_47.rawBody;
}else{
if((arguments.length>2&&!_48)||"POST|PUT".indexOf(_46.toUpperCase())==-1){
_1._ioAddQueryToUrl(_49);
}
}
}
}
xhr.open(_46,_49.url,_47.sync!==true,_47.user||undefined,_47.password||undefined);
if(_47.headers){
for(var hdr in _47.headers){
if(hdr.toLowerCase()==="content-type"&&!_47.contentType){
_47.contentType=_47.headers[hdr];
}else{
if(_47.headers[hdr]){
xhr.setRequestHeader(hdr,_47.headers[hdr]);
}
}
}
}
xhr.setRequestHeader("Content-Type",_47.contentType||_41);
if(!_47.headers||!("X-Requested-With" in _47.headers)){
xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");
}
_1._ioNotifyStart(dfd);
if(dojo.config.debugAtAllCosts){
xhr.send(_49.query);
}else{
try{
xhr.send(_49.query);
}
catch(e){
_49.error=e;
dfd.cancel();
}
}
_1._ioWatch(dfd,_42,_43,_44);
xhr=null;
return dfd;
};
dojo.xhrGet=function(_4a){
return _1.xhr("GET",_4a);
};
dojo.rawXhrPost=dojo.xhrPost=function(_4b){
return _1.xhr("POST",_4b,true);
};
dojo.rawXhrPut=dojo.xhrPut=function(_4c){
return _1.xhr("PUT",_4c,true);
};
dojo.xhrDelete=function(_4d){
return _1.xhr("DELETE",_4d);
};
})();
}
