// ===============
// = JSON Parser =
// ===============
if(!this.JSON){JSON={};}(function(){function f(n){return n<10?"0"+n:n;}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4);})+'"':'"'+string+'"';}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==="object"&&typeof value.toJSON==="function"){value=value.toJSON(key);}if(typeof rep==="function"){value=rep.call(holder,key,value);}switch(typeof value){case"string":return quote(value);case"number":return isFinite(value)?String(value):"null";case"boolean":case"null":return String(value);case"object":if(!value){return"null";}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==="[object Array]"){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||"null";}v=partial.length===0?"[]":gap?"[\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"]":"["+partial.join(",")+"]";gap=mind;return v;}if(rep&&typeof rep==="object"){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==="string"){v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v);}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v);}}}}v=partial.length===0?"{}":gap?"{\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"}":"{"+partial.join(",")+"}";gap=mind;return v;}}if(typeof JSON.stringify!=="function"){JSON.stringify=function(value,replacer,space){var i;gap="";indent="";if(typeof space==="number"){for(i=0;i<space;i+=1){indent+=" ";}}else{if(typeof space==="string"){indent=space;}}rep=replacer;if(replacer&&typeof replacer!=="function"&&(typeof replacer!=="object"||typeof replacer.length!=="number")){throw new Error("JSON.stringify");}return str("",{"":value});};}if(typeof JSON.parse!=="function"){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==="object"){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v;}else{delete value[k];}}}}return reviver.call(holder,key,value);}cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4);});}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){j=eval("("+text+")");return typeof reviver==="function"?walk({"":j},""):j;}throw new SyntaxError("JSON.parse");};}})();

// ==============
// = Data Store =
// ==============

var dataStore = function(key,value) {
	var store = dataStore.store = dataStore.store || window.sessionStorage || {},
		_return = store, data;
	
	var isNative =  (store == window.sessionStorage);
	
	var items = store.Items = store.Items || {};
	
// Private Methods
	var _parseVal = function(value) {
		if(typeof value == 'function') {
			value = value.toString(); }
		
		if (typeof value === 'undefined') {
			value = false; }
		
		return JSON.stringify(value) ;
	};
	var _set = function(key,value) {
		var r;value = _parseVal(value);
		
		if(isNative) {
			store.setItem(key,value);
			r = store.getItem(key);	}
		else {
			store[key] = {};
			store[key].value = value;
			r = store[key];	}
		
		return r;
	};
	var _get = function(key) {
		var r;
		if(isNative) {
			r = store.getItem(key); }
		else {
			r = store[key];}
			
		return r || _set(key);
	};
		
// Set
	if(key && typeof value !== 'undefined') {
		data = _set(key,value); }
// Get
	else if (key && typeof value === 'undefined') {
		data = _get(key); }
// Store new value	
	if(data && items[key]) {
		items[key].setData(data); }

	dataStore.store = store;
	dataStore.store.Items = items;
	
	if(data) {
		return items[key] || new Item(key,data); }
	
	return store;
};
// Public Methods	
dataStore.clear = function() {
	var store = dataStore.store || window.sessionStorage || {};
	
	for(var i in store) {
		delete store[i];};

	return store;
};
dataStore.all = function(valuesOnly) {
	var store = dataStore.store || window.sessionStorage || {},
		r = [], items = store.Items || {};
	
	for (var i in items) {
		if(i == 'value' || i == 'secure'){continue;}
		var item = items[i];
		var p = (valuesOnly) ? item.data : item;
		
		r.push( p );
	};
	return r;
		
};
var Item = function(k,e) {
	this.original = e;
	this.name = k;
	this.id = new Date().valueOf();
	
	this.setData(e);
	
	dataStore.store.Items[this.name] = this;
	
	return this;
};


Item.prototype.setData = function(data) {
//	var d = data.value || data || false;
	var d = (data.value) ? data.value : (data) ? data : false;
	this.data = JSON.parse(d);
	
	return this;
};
Item.prototype.hasData = function() {
	return (this.data && this.data !== false);
};
Item.prototype.deleteData = function() {
	dataStore(this.name,false);
	return this;
};