/*
	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.json.ref"]){
dojo._hasResource["dojox.json.ref"]=true;
dojo.provide("dojox.json.ref");
dojo.require("dojo.date.stamp");
dojox.json.ref={resolveJson:function(_1,_2){
_2=_2||{};
var _3=_2.idAttribute||"id";
var _4=this.refAttribute;
var _5=_2.idAsRef;
var _6=_2.idPrefix||"";
var _7=_2.assignAbsoluteIds;
var _8=_2.index||{};
var _9=_2.timeStamps;
var _a,_b=[];
var _c=/^(.*\/)?(\w+:\/\/)|[^\/\.]+\/\.\.\/|^.*\/(\/)/;
var _d=this._addProp;
var F=function(){
};
function _e(it,_f,_10,_11,_12,_13){
var i,_14,val,id=_3 in it?it[_3]:_10;
if(_3 in it||((id!==undefined)&&_11)){
id=(_6+id).replace(_c,"$2$3");
}
var _15=_13||it;
if(id!==undefined){
if(_7){
it.__id=id;
}
if(_2.schemas&&(!(it instanceof Array))&&(val=id.match(/^(.+\/)[^\.\[]*$/))){
_12=_2.schemas[val[1]];
}
if(_8[id]&&((it instanceof Array)==(_8[id] instanceof Array))){
_15=_8[id];
delete _15.$ref;
delete _15._loadObject;
_14=true;
}else{
var _16=_12&&_12.prototype;
if(_16){
F.prototype=_16;
_15=new F();
}
}
_8[id]=_15;
if(_9){
_9[id]=_2.time;
}
}
while(_12){
var _17=_12.properties;
if(_17){
for(i in it){
var _18=_17[i];
if(_18&&_18.format=="date-time"&&typeof it[i]=="string"){
it[i]=dojo.date.stamp.fromISOString(it[i]);
}
}
}
_12=_12["extends"];
}
var _19=it.length;
for(i in it){
if(i==_19){
break;
}
if(it.hasOwnProperty(i)){
val=it[i];
if((typeof val=="object")&&val&&!(val instanceof Date)&&i!="__parent"){
_a=val[_4]||(_5&&val[_3]);
if(!_a||!val.__parent){
val.__parent=it;
}
if(_a){
delete it[i];
var _1a=_a.toString().replace(/(#)([^\.\[])/,"$1.$2").match(/(^([^\[]*\/)?[^#\.\[]*)#?([\.\[].*)?/);
if((_a=(_1a[1]=="$"||_1a[1]=="this"||_1a[1]=="")?_1:_8[(_6+_1a[1]).replace(_c,"$2$3")])){
if(_1a[3]){
_1a[3].replace(/(\[([^\]]+)\])|(\.?([^\.\[]+))/g,function(t,a,b,c,d){
_a=_a&&_a[b?b.replace(/[\"\'\\]/,""):d];
});
}
}
if(_a){
val=_a;
}else{
if(!_f){
var _1b;
if(!_1b){
_b.push(_15);
}
_1b=true;
val=_e(val,false,val[_4],true,_18);
val._loadObject=_2.loader;
}
}
}else{
if(!_f){
val=_e(val,_b==it,id===undefined?undefined:_d(id,i),false,_18,_15!=it&&typeof _15[i]=="object"&&_15[i]);
}
}
}
it[i]=val;
if(_15!=it&&!_15.__isDirty){
var old=_15[i];
_15[i]=val;
if(_14&&val!==old&&!_15._loadObject&&!(i.charAt(0)=="_"&&i.charAt(1)=="_")&&i!="$ref"&&!(val instanceof Date&&old instanceof Date&&val.getTime()==old.getTime())&&!(typeof val=="function"&&typeof old=="function"&&val.toString()==old.toString())&&_8.onUpdate){
_8.onUpdate(_15,i,old,val);
}
}
}
}
if(_14&&(_3 in it)){
for(i in _15){
if(!_15.__isDirty&&_15.hasOwnProperty(i)&&!it.hasOwnProperty(i)&&!(i.charAt(0)=="_"&&i.charAt(1)=="_")&&!(_15 instanceof Array&&isNaN(i))){
if(_8.onUpdate&&i!="_loadObject"&&i!="_idAttr"){
_8.onUpdate(_15,i,_15[i],undefined);
}
delete _15[i];
while(_15 instanceof Array&&_15.length&&_15[_15.length-1]===undefined){
_15.length--;
}
}
}
}else{
if(_8.onLoad){
_8.onLoad(_15);
}
}
return _15;
};
if(_1&&typeof _1=="object"){
_1=_e(_1,false,_2.defaultId,true);
_e(_b,false);
}
return _1;
},fromJson:function(str,_1c){
function ref(_1d){
var _1e={};
_1e[this.refAttribute]=_1d;
return _1e;
};
try{
var _1f=eval("("+str+")");
}
catch(e){
throw new SyntaxError("Invalid JSON string: "+e.message+" parsing: "+str);
}
if(_1f){
return this.resolveJson(_1f,_1c);
}
return _1f;
},toJson:function(it,_20,_21,_22){
var _23=this._useRefs;
var _24=this._addProp;
var _25=this.refAttribute;
_21=_21||"";
var _26={};
var _27={};
function _28(it,_29,_2a){
if(typeof it=="object"&&it){
var _2b;
if(it instanceof Date){
return "\""+dojo.date.stamp.toISOString(it,{zulu:true})+"\"";
}
var id=it.__id;
if(id){
if(_29!="#"&&((_23&&!id.match(/#/))||_26[id])){
var ref=id;
if(id.charAt(0)!="#"){
if(it.__clientId==id){
ref="cid:"+id;
}else{
if(id.substring(0,_21.length)==_21){
ref=id.substring(_21.length);
}else{
ref=id;
}
}
}
var _2c={};
_2c[_25]=ref;
return _28(_2c,"#");
}
_29=id;
}else{
it.__id=_29;
_27[_29]=it;
}
_26[_29]=it;
_2a=_2a||"";
var _2d=_20?_2a+dojo.toJsonIndentStr:"";
var _2e=_20?"\n":"";
var sep=_20?" ":"";
if(it instanceof Array){
var res=dojo.map(it,function(obj,i){
var val=_28(obj,_24(_29,i),_2d);
if(typeof val!="string"){
val="undefined";
}
return _2e+_2d+val;
});
return "["+res.join(","+sep)+_2e+_2a+"]";
}
var _2f=[];
for(var i in it){
if(it.hasOwnProperty(i)){
var _30;
if(typeof i=="number"){
_30="\""+i+"\"";
}else{
if(typeof i=="string"&&(i.charAt(0)!="_"||i.charAt(1)!="_")){
_30=dojo._escapeString(i);
}else{
continue;
}
}
var val=_28(it[i],_24(_29,i),_2d);
if(typeof val!="string"){
continue;
}
_2f.push(_2e+_2d+_30+":"+sep+val);
}
}
return "{"+_2f.join(","+sep)+_2e+_2a+"}";
}else{
if(typeof it=="function"&&dojox.json.ref.serializeFunctions){
return it.toString();
}
}
return dojo.toJson(it);
};
var _31=_28(it,"#","");
if(!_22){
for(var i in _27){
delete _27[i].__id;
}
}
return _31;
},_addProp:function(id,_32){
return id+(id.match(/#/)?id.length==1?"":".":"#")+_32;
},refAttribute:"$ref",_useRefs:false,serializeFunctions:false};
}
