/*
	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.lang.typed"]){
dojo._hasResource["dojox.lang.typed"]=true;
(function(){
var _1,_2=typeof dojo!="undefined";
if(_2){
dojo.provide("dojox.lang.typed");
dojo.require("dojox.json.schema");
_1=dojox.json.schema;
}else{
if(typeof JSONSchema=="undefined"){
throw new Error("Dojo or JSON Schema library must be present");
}
_1=JSONSchema;
}
function _3(_4,_5){
var _6=function(){
var _7=_5();
if(_7&&_7.parameters){
var _8=_7.parameters;
for(var j=0;j<_8.length;j++){
arguments[j]=_9(arguments[j],_8[j],j.toString());
}
if(_7.additionalParameters){
for(;j<arguments.length;j++){
arguments[j]=_9(arguments[j],_7.additionalParameters,j.toString());
}
}
}
var _a=_4.apply(this,arguments);
if(_7.returns){
_9(_a,_7.returns);
}
return _a;
};
_6.__typedFunction__=true;
for(var i in _4){
_6[i]=_4[i];
}
return _6;
};
function _b(_c){
return function(){
return _c;
};
};
function _9(_d,_e,_f){
if(typeof _d=="function"&&_e&&!_d.__typedFunction__){
_d=_3(_d,_b(_e));
}
var _10=_1._validate(_d,_e,_f);
if(!_10.valid){
var _11="";
var _12=_10.errors;
for(var i=0;i<_12.length;i++){
_11+=_12[i].property+" "+_12[i].message+"\n";
}
throw new TypeError(_11);
}
return _d;
};
var _13=_1.__defineGetter__;
var _14=function(_15){
if(_15.__typedClass__){
return _15;
}
var _16=function(){
var i,_17,_18=_16.properties;
var _19=_16.methods;
_15.apply(this,arguments);
this.__props__={};
for(i in _19){
_17=this[i];
if(_17){
if(!_17.__typedFunction__){
var _1a=this;
while(!_1a.hasOwnProperty(i)&&_1a.__proto__){
_1a=_1a.__proto__;
}
(function(i){
_1a[i]=_3(_17,function(){
return _19[i];
});
})(i);
}
}else{
(function(i){
this[i]=function(){
throw new TypeError("The method "+i+" is defined but not implemented");
};
})(i);
}
}
if(_13){
var _1b=this;
for(i in _18){
_17=this[i];
if(this.hasOwnProperty(i)){
this.__props__[i]=_17;
}
(function(i){
delete _1b[i];
_1b.__defineGetter__(i,function(){
return i in this.__props__?this.__props__[i]:this.__proto__[i];
});
_1b.__defineSetter__(i,function(_1c){
_9(_1c,_18[i],i);
return this.__props__[i]=_1c;
});
})(i);
}
}
_9(this,_16);
};
_16.prototype=_15.prototype;
for(var i in _15){
_16[i]=_15[i];
}
if(_15.prototype.declaredClass&&_2){
dojo.setObject(_15.prototype.declaredClass,_16);
}
_16.__typedClass__=true;
return _16;
};
if(_2){
dojox.lang.typed=_14;
if(dojo.config.typeCheckAllClasses){
var _1d=dojo.declare;
dojo.declare=function(_1e){
var _1f=_1d.apply(this,arguments);
_1f=_14(_1f);
return _1f;
};
dojo.mixin(dojo.declare,_1d);
}
}else{
typed=_14;
}
})();
}
