/*
	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["dojox.secure.sandbox"]){
dojo._hasResource["dojox.secure.sandbox"]=true;
dojo.provide("dojox.secure.sandbox");
dojo.require("dojox.secure.DOM");
dojo.require("dojox.secure.capability");
dojo.require("dojo.NodeList-fx");
(function(){
var _1=setTimeout;
var _2=setInterval;
if({}.__proto__){
var _3=function(_4){
var _5=Array.prototype[_4];
if(_5&&!_5.fixed){
(Array.prototype[_4]=function(){
if(this==window){
throw new TypeError("Called with wrong this");
}
return _5.apply(this,arguments);
}).fixed=true;
}
};
_3("concat");
_3("reverse");
_3("sort");
_3("slice");
_3("forEach");
_3("filter");
_3("reduce");
_3("reduceRight");
_3("every");
_3("map");
_3("some");
}
var _6=function(){
return dojo.xhrGet.apply(dojo,arguments);
};
dojox.secure.sandbox=function(_7){
var _8=dojox.secure.DOM(_7);
_7=_8(_7);
var _9=_7.ownerDocument;
var _a,_b=dojox.secure._safeDojoFunctions(_7,_8);
var _c=[];
var _d=["isNaN","isFinite","parseInt","parseFloat","escape","unescape","encodeURI","encodeURIComponent","decodeURI","decodeURIComponent","alert","confirm","prompt","Error","EvalError","RangeError","ReferenceError","SyntaxError","TypeError","Date","RegExp","Number","Object","Array","String","Math","setTimeout","setInterval","clearTimeout","clearInterval","dojo","get","set","forEach","load","evaluate"];
for(var i in _b){
_d.push(i);
_c.push("var "+i+"=dojo."+i);
}
eval(_c.join(";"));
function _e(_f,_10){
_10=""+_10;
if(dojox.secure.badProps.test(_10)){
throw new Error("bad property access");
}
if(_f.__get__){
return _f.__get__(_10);
}
return _f[_10];
};
function set(obj,_11,_12){
_11=""+_11;
_e(obj,_11);
if(obj.__set){
return obj.__set(_11);
}
obj[_11]=_12;
return _12;
};
function _13(obj,fun){
if(typeof fun!="function"){
throw new TypeError();
}
if("length" in obj){
if(obj.__get__){
var len=obj.__get__("length");
for(var i=0;i<len;i++){
if(i in obj){
fun.call(obj,obj.__get__(i),i,obj);
}
}
}else{
len=obj.length;
for(i=0;i<len;i++){
if(i in obj){
fun.call(obj,obj[i],i,obj);
}
}
}
}else{
for(i in obj){
fun.call(obj,_e(obj,i),i,obj);
}
}
};
function _14(_15,_16,_17){
var _18,_19,_1a;
var arg;
for(var i=0,l=arguments.length;typeof (arg=arguments[i])=="function"&&i<l;i++){
if(_18){
_a(_18,arg.prototype);
}else{
_19=arg;
var F=function(){
};
F.prototype=arg.prototype;
_18=new F;
}
}
if(arg){
for(var j in arg){
var _1b=arg[j];
if(typeof _1b=="function"){
arg[j]=function(){
if(this instanceof _14){
return arguments.callee.__rawMethod__.apply(this,arguments);
}
throw new Error("Method called on wrong object");
};
arg[j].__rawMethod__=_1b;
}
}
if(arg.hasOwnProperty("constructor")){
_1a=arg.constructor;
}
}
_18=_18?_a(_18,arg):arg;
function _14(){
if(_19){
_19.apply(this,arguments);
}
if(_1a){
_1a.apply(this,arguments);
}
};
_a(_14,arguments[i]);
_18.constructor=_14;
_14.prototype=_18;
return _14;
};
function _1c(_1d){
if(typeof _1d!="function"){
throw new Error("String is not allowed in setTimeout/setInterval");
}
};
function _1e(_1f,_20){
_1c(_1f);
return _1(_1f,_20);
};
function _21(_22,_23){
_1c(_22);
return _2(_22,_23);
};
function _24(_25){
return _8.evaluate(_25);
};
var _26=_8.load=function(url){
if(url.match(/^[\w\s]*:/)){
throw new Error("Access denied to cross-site requests");
}
return _6({url:(new _b._Url(_8.rootUrl,url))+"",secure:true});
};
_8.evaluate=function(_27){
dojox.secure.capability.validate(_27,_d,{document:1,element:1});
if(_27.match(/^\s*[\[\{]/)){
var _28=eval("("+_27+")");
}else{
eval(_27);
}
};
return {loadJS:function(url){
_8.rootUrl=url;
return _6({url:url,secure:true}).addCallback(function(_29){
_24(_29,_7);
});
},loadHTML:function(url){
_8.rootUrl=url;
return _6({url:url,secure:true}).addCallback(function(_2a){
_7.innerHTML=_2a;
});
},evaluate:function(_2b){
return _8.evaluate(_2b);
}};
};
})();
dojox.secure._safeDojoFunctions=function(_2c,_2d){
var _2e=["mixin","require","isString","isArray","isFunction","isObject","isArrayLike","isAlien","hitch","delegate","partial","trim","disconnect","subscribe","unsubscribe","Deferred","toJson","style","attr"];
var doc=_2c.ownerDocument;
var _2f=dojox.secure.unwrap;
dojo.NodeList.prototype.addContent.safetyCheck=function(_30){
_2d.safeHTML(_30);
};
dojo.NodeList.prototype.style.safetyCheck=function(_31,_32){
if(_31=="behavior"){
throw new Error("Can not set behavior");
}
_2d.safeCSS(_32);
};
dojo.NodeList.prototype.attr.safetyCheck=function(_33,_34){
if(_34&&(_33=="src"||_33=="href"||_33=="style")){
throw new Error("Illegal to set "+_33);
}
};
var _35={query:function(_36,_37){
return _2d(dojo.query(_36,_2f(_37||_2c)));
},connect:function(el,_38){
var obj=el;
arguments[0]=_2f(el);
if(obj!=arguments[0]&&_38.substring(0,2)!="on"){
throw new Error("Invalid event name for element");
}
return dojo.connect.apply(dojo,arguments);
},body:function(){
return _2c;
},byId:function(id){
return _2c.ownerDocument.getElementById(id);
},fromJson:function(str){
dojox.secure.capability.validate(str,[],{});
return dojo.fromJson(str);
}};
for(var i=0;i<_2e.length;i++){
_35[_2e[i]]=dojo[_2e[i]];
}
return _35;
};
}
