// Copyright (c) Microsoft Corporation.  All rights reserved.
var dataProxyVersion="0.061109.0";registerNamespace("Web.Data");if(undefined==__Web_Data_Proxy||undefined==Web.Data.Proxy)var __Web_Data_Proxy=Web.Data.Proxy=new function(){var _this=this;var _loader=null;var _initializing=false;var _initializeQueue=[];var _serializing=false;var _serializePending=false;var _data=null;var _hasData=false;this.cacheKey=null;this.rootDomain=__Web_Utility.extractHost(document.location,false).split(".").slice(-2).join(".");if(this.rootDomain.toLowerCase()=="com.")throw "Invalid domain";this.partitions=[];this.domainPrefix=null;this.dataLoaderUrl="dataloader.html";this.configure=function(cacheKey,partitionSize,partitionCount,partitionPrefix,domainPrefix){_this.cacheKey=cacheKey;_this.domainPrefix=domainPrefix?domainPrefix:_this.domainPrefix?_this.domainPrefix:cacheKey;};this.loadData=function(callback){_this._validateConfigured();function ensureDataCallback(){if(callback)callback({"action":"loadData","result":deepClone(_data)});}_this._ensureData(ensureDataCallback);};this.hasData=function(callback){_this._validateConfigured();function ensureDataCallback(){if(callback)callback({"action":"hasData","result":_hasData});}_this._ensureData(ensureDataCallback);};this.saveData=function(callback,data){_this._validateConfigured();function ensureDataCallback(){for(var name in data){_data[name]=deepClone(data[name]);}_this._save();if(callback)callback({"action":"saveData","args":[data]});}_this._ensureData(ensureDataCallback);};this.clearData=function(callback){_this._validateConfigured();function ensureDataCallback(){_data={};_this._save();if(callback)callback({"action":"clearData"});}_this._ensureData(ensureDataCallback);};this.getItem=function(callback,name){_this._validateConfigured();function ensureDataCallback(){if(callback)callback({"action":"getItem","args":[name],"result":deepClone(_data[name])});}_this._ensureData(ensureDataCallback);};this.setItem=function(callback,name,value){_this._validateConfigured();var stringValue=Object.toJSON(value);function ensureDataCallback(){_data[name]=Object.fromJSON(stringValue);_this._save();if(callback)callback({"action":"setItem","args":[name,Object.fromJSON(stringValue)]});}_this._ensureData(ensureDataCallback);};this.removeItem=function(callback,name){_this._validateConfigured();function ensureDataCallback(){if(undefined!=_data[name])delete _data[name];_this._save();if(callback)callback({"action":"removeItem","args":[name]});}_this._ensureData(ensureDataCallback);};this._validateConfigured=function(){if(null==_this.cacheKey||""==_this.cacheKey)throw "Web.Data.Proxy.cacheKey required in order to persist data!";};this._registerDataLoader=function(w){_this._validateConfigured();_loader=w;var data=_loader.getItem(_this.cacheKey);_data=Object.fromJSON(data);_hasData=_data?true:false;if(!_data)_data={};_initializing=false;var callback;while(callback=_initializeQueue.dequeue()){callback();}};this._ensureData=function(callback){if(_data)setTimeout(callback,0);else{_initializeQueue.queue(callback);if(!_initializing){_initializing=true;_loader=null;var prefix=document.location.protocol+"//";var suffix="/"+_this.dataLoaderUrl+(_this.dataLoaderUrl.indexOf("?")>0?"&":"?")+"cacheKey="+_this.cacheKey+"&domain="+_this.rootDomain;var iframe=_ce("iframe");iframe.style.display="none";document.body.insertAdjacentElement("afterBegin",iframe);iframe.src=prefix+_this.domainPrefix+"."+_this.rootDomain+suffix;if(document.domain!=_this.rootDomain&&document.location.hostname.endsWith(_this.rootDomain))document.domain=_this.rootDomain;}}};this._save=function(expiration){if(!expiration)expiration=new Date(new Date().valueOf()+31536000000).toUTCString();function serializeData(addToQueue){if(_serializing&&addToQueue)_serializePending=true;else{_serializing=true;_serializePending=false;function callback(){var data=Object.toJSON(_data);_loader.removeItem(_this.cacheKey);_loader.setItem(_this.cacheKey,data,expiration);_serializing=false;if(_serializePending)serializeData(false);}setTimeout(callback,0);}}serializeData(true);};function deepClone(value){return Object.fromJSON(Object.toJSON(value));}}();