<!--
/*
 * cookie.js - mainly manipulate cookie handling which similar to backend php
 * Secondly manipulate serialize, url, security
 */
//serialize object
//Source from : http://www.coolcode.cn/andot/javascript-php-serialize-unserialize/171
//Source from : http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt
var core_serialize = {
	serialize:function(o){
		var p = 0, sb = [], ht = [], hv = 1;
		var classname = function(o) {
			if (typeof(o) == 'undefined' || typeof(o.constructor) == 'undefined') return '';
			var c = o.constructor.toString();
			c = core_serialize.utf16to8(c.substr(0, c.indexOf('(')).replace(/(^\s*function\s*)|(\s*$)/ig, ''));
			return ((c == '') ? 'Object' : c);
		};
		var is_int = function(n) {
			var s = n.toString(), l = s.length;
			if (l > 11) return false;
			for (var i = (s.charAt(0) == '-') ? 1 : 0; i < l; i++) {
				switch (s.charAt(i)) {
					case '0':
					case '1':
					case '2':
					case '3':
					case '4':
					case '5':
					case '6':
					case '7':
					case '8':
					case '9': break;
					default : return false;
				}
			}
			return !(n < -2147483648 || n > 2147483647);
		};
		var in_ht = function(o) {
			for (var k in ht) if (ht[k] === o) return k;
			return false;
		};
		var ser_null = function() {
			sb[p++] = 'N;';
		};
		var ser_boolean = function(b) {
			sb[p++] = (b ? 'b:1;' : 'b:0;');
		};
		var ser_integer = function(i) {
			sb[p++] = 'i:' + i + ';';
		};
		var ser_double = function(d) {
			if (isNaN(d)) d = 'NAN';
			else if (d == Number.POSITIVE_INFINITY) d = 'INF';
			else if (d == Number.NEGATIVE_INFINITY) d = '-INF';
			sb[p++] = 'd:' + d + ';';
		};
		var ser_string = function(s) {
			var utf8 = core_serialize.utf16to8(s);
			sb[p++] = 's:' + utf8.length + ':"';
			sb[p++] = utf8;
			sb[p++] = '";';
		};
		var ser_date = function(dt) {
			sb[p++] = 'O:4:"Date":7:{';
			sb[p++] = 's:4:"year";';
			ser_integer(dt.getFullYear());
			sb[p++] = 's:5:"month";';
			ser_integer(dt.getMonth() + 1);
			sb[p++] = 's:3:"day";';
			ser_integer(dt.getDate());
			sb[p++] = 's:4:"hour";';
			ser_integer(dt.getHours());
			sb[p++] = 's:6:"minute";';
			ser_integer(dt.getMinutes());
			sb[p++] = 's:6:"second";';
			ser_integer(dt.getSeconds());
			sb[p++] = 's:11:"millisecond";';
			ser_integer(dt.getMilliseconds());
			sb[p++] = '}';
		}
		var ser_array = function(a) {
			sb[p++] = 'a:';
			var lp = p;
			sb[p++] = 0;
			sb[p++] = ':{';
			for (var k in a) {
				if (typeof(a[k]) != 'function') {
					is_int(k) ? ser_integer(k) : ser_string(k);
					__serialize(a[k]);
					sb[lp]++;
				}
			}
			sb[p++] = '}';
		};
		var ser_object = function(o) {
			var cn = classname(o);
			if (cn == '') ser_null();
			else if (typeof(o.serialize) != 'function') {
				sb[p++] = 'O:' + cn.length + ':"' + cn + '":';
				var lp = p;
				sb[p++] = 0;
				sb[p++] = ':{';
				if (typeof(o.__sleep) == 'function') {
					var a = o.__sleep();
					for (var kk in a) {
						ser_string(a[kk]);
						__serialize(o[a[kk]]);
						sb[lp]++;
					}
				}
				else {
					for (var k in o) {
						if (typeof(o[k]) != 'function') {
							ser_string(k);
							__serialize(o[k]);
							sb[lp]++;
						}
					}
				}
				sb[p++] = '}';
			}
			else {
				var cs = o.serialize();
				sb[p++] = 'C:' + cn.length + ':"' + cn + '":' + cs.length + ':{' +cs + '}';
			}
		};
		var ser_pointref = function(R) {
			sb[p++] = 'R:' + R + ';';
		};
		var ser_ref = function(r) {
			sb[p++] = 'r:' + r + ';';
		};
		var __serialize = function(o) {
			if (o == null || o.constructor == Function) {
				hv++;
				ser_null();
			}
			else switch (o.constructor) {
				case Boolean: {
					hv++;
					ser_boolean(o);
					break;
				}
				case Number: {
					hv++;
					is_int(o) ? ser_integer(o) : ser_double(o);
					break;
				}
				case String: {
					hv++;
					ser_string(o);
					break;
				}
				case Date: {
					hv++;
					ser_date(o);
				}
				case Object:
				case Array: {
					var r = in_ht(o);
					if (r) {
						ser_pointref(r);
					}
					else {
						ht[hv++] = o;
						ser_array(o);
					}
					break;
				}
				default: {
					var r = in_ht(o);
					if (r) {
						hv++;
						ser_ref(r);
					}
					else {
						ht[hv++] = o;
						ser_object(o);
					}
					break;
				}
			}
		};
		__serialize(o);
		return sb.join('');
	},
	
	unserialize:function(ss) {
		var p = 0, ht = [], hv = 1;
		var unser_null = function() {
			p++;
			return null;
		};
		var unser_boolean = function() {
			p++;
			var b = (ss.charAt(p++) == '1');
			p++;
			return b;
		};
		var unser_integer = function() {
			p++;
			var i = parseInt(ss.substring(p, p = ss.indexOf(';', p)));
			p++;
			return i;
		};
		var unser_double = function() {
			p++;
			var d = ss.substring(p, p = ss.indexOf(';', p));
			switch (d) {
				case 'NAN': d = NaN; break;
				case 'INF': d = Number.POSITIVE_INFINITY; break;
				case '-INF': d = Number.NEGATIVE_INFINITY; break;
				default: d = parseFloat(d);
			}
			p++;
			return d;
		};
		var unser_string = function() {
			p++;
			var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
			p += 2;
			var s = core_serialize.utf8to16(ss.substring(p, p += l));
			p += 2;
			return s;
		};
		var unser_array = function() {
			p++;
			var n = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
			p += 2;
			var a = [];
			ht[hv++] = a;
			for (var i = 0; i < n; i++) {
				var k;
				switch (ss.charAt(p++)) {
					case 'i': k = unser_integer(); break;
					case 's': k = unser_string(); break;
					case 'U': k = unser_unicode_string(); break;
					default: return false;
				}
				a[k] = __unserialize();
			}
			p++;
			return a;
		};
		var unser_date = function() {
			var k, a = [];
			for (var i = 0; i < 7; i++) {
				p++;
				k = unser_string();
				p++;
				a[k] = unser_integer();
			}
			var dt = new Date(
				a['year'],
				a['month'] - 1,
				a['day'],
				a['hour'],
				a['minute'],
				a['second'],
				a['millisecond']
			);
			ht[hv++] = dt;
			return dt;
		}
		var unser_object = function() {
			p++;
			var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
			p += 2;
			var cn = core_serialize.utf8to16(ss.substring(p, p += l));
			p += 2;
			var n = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
			p += 2;
			if (cn == "Date" && n == 7) {
				return unser_date();
			}
			if (eval(['typeof(', cn, ') == "undefined"'].join(''))) {
				eval(['function ', cn, '(){}'].join(''));
			}
			var o = eval(['new ', cn, '()'].join(''));
			ht[hv++] = o;
			for (var i = 0; i < n; i++) {
				var k;
				switch (ss.charAt(p++)) {
					case 's': k = unser_string(); break;
					case 'U': k = unser_unicode_string(); break;
					default: return false;
				}
				if (k.charAt(0) == '\0') {
					k = k.substring(k.indexOf('\0', 1) + 1, k.length);
				}
				o[k] = __unserialize();
			}
			p++;
			if (typeof(o.__wakeup) == 'function') o.__wakeup();
			return o;
		};
		var unser_custom_object = function() {
			p++;
			var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
			p += 2;
			var cn = core_serialize.utf8to16(ss.substring(p, p += l));
			p += 2;
			var n = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
			p += 2;
			if (eval(['typeof(', cn, ') == "undefined"'].join(''))) {
				eval(['function ', cn, '(){}'].join(''));
			}
			var o = eval(['new ', cn, '()'].join(''));
			ht[hv++] = o;
			if (typeof(o.unserialize) != 'function') p += n;
			else o.unserialize(ss.substring(p, p += n));
			p++;
			return o;
		};
		var unser_unicode_string = function() {
			p++;
			var l = parseInt(ss.substring(p, p = ss.indexOf(':', p)));
			p += 2;
			var sb = [];
			for (var i = 0; i < l; i++) {
				if ((sb[i] = ss.charAt(p++)) == '\\') {
					sb[i] = String.fromCharCode(parseInt(ss.substring(p, p += 4), 16));
				}
			}
			p += 2;
			return sb.join('');
		};
		var unser_ref = function() {
			p++;
			var r = parseInt(ss.substring(p, p = ss.indexOf(';', p)));
			p++;
			return ht[r];
		};
		var __unserialize = function() {
			switch (ss.charAt(p++)) {
				case 'N': return ht[hv++] = unser_null();
				case 'b': return ht[hv++] = unser_boolean();
				case 'i': return ht[hv++] = unser_integer();
				case 'd': return ht[hv++] = unser_double();
				case 's': return ht[hv++] = unser_string();
				case 'U': return ht[hv++] = unser_unicode_string();
				case 'r': return ht[hv++] = unser_ref();
				case 'a': return unser_array();
				case 'O': return unser_object();
				case 'C': return unser_custom_object();
				case 'R': return unser_ref();
				default: return false;
			}
		};
		return __unserialize();
	},
	
	utf16to8:function(str){
		var out, i, len, c;
		out = "";
		len = str.length;
		for(i = 0; i < len; i++) {
			c = str.charCodeAt(i);
			if ((c >= 0x0001) && (c <= 0x007F)) {
				out += str.charAt(i);
			} else if (c > 0x07FF) {
				out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
				out += String.fromCharCode(0x80 | ((c >>  6) & 0x3F));
				out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
			} else {
				out += String.fromCharCode(0xC0 | ((c >>  6) & 0x1F));
				out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
			}
		}
		return out;
	},

	utf8to16:function(str){
		var out, i, len, c;
		var char2, char3;

		out = "";
		len = str.length;
		i = 0;
		while(i < len) {
			c = str.charCodeAt(i++);
			switch(c >> 4)
			{ 
			  case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
				// 0xxxxxxx
				out += str.charAt(i-1);
				break;
			  case 12: case 13:
				// 110x xxxx   10xx xxxx
				char2 = str.charCodeAt(i++);
				out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
				break;
			  case 14:
				// 1110 xxxx  10xx xxxx  10xx xxxx
				char2 = str.charCodeAt(i++);
				char3 = str.charCodeAt(i++);
				out += String.fromCharCode(((c & 0x0F) << 12) |
							   ((char2 & 0x3F) << 6) |
							   ((char3 & 0x3F) << 0));
				break;
			}
		}
		return out;
	}
};//end serialize object

// Url Object
var core_url = {
	getBaseDomain:function(){
		e = document.domain.split(/\./);
		if(e.length > 1) return (e[e.length-2] + "." +  e[e.length-1]) ;
		else return "";	  
	}
};//end url object

// Cookie Object
var core_cookie = {
	iExpiry : 0,
	sPath : '/',
	sDomain : '',
	bSecure : false,
	bHttpOnly : true,

	getTime:function(){
		var dTime = new Date();
		dTime.getTime();
		return Math.round(dTime/1000);
	},
	
	setExpiry:function(){
		this.iExpiry = this.getTime()- 3600;
	},

	addExpiryTime:function(iTime){
		this.iExpiry = this.getTime() + iTime;
	},

	setBaseDomain:function(){
		if(this.isLocalHost()) return;		
		this.sDomain = "." + core_url.getBaseDomain();
	},

	setFullDomain:function(){
		if(this.isLocalHost()) return;
		this.sDomain = "." + document.location.hostname ;
	},

	setOtherDomain:function(sDomain){
		this.sDomain = sDomain;
	},
	
	isLocalHost:function(){
		var sHost = document.location.hostname;
		if(sHost.search(/localhost/i)<0) return false;
		this.sDomain = 'core.cookie.dev';
		return true;
	},
	
	setSecure:function(){
		this.bSecure = true;
	},

	setPath:function(sPath){
		this.sPath = sPath;
	},

	getValue:function(sType, sSubKey){
		var sCookie = this.getCookie(sType);
		var aPart = new Array();
		if(sCookie != "")
		{
			sCookie = core_security.decodeValue(sCookie);
			aPart = core_serialize.unserialize(sCookie);
			if(typeof(sSubKey) == 'undefined') return aPart;	

			if(typeof(aPart[sSubKey]) != 'undefined') return aPart[sSubKey];
		}
		return "";
	},

	setValue:function(sType, mValue, sSubKey){
		var sCookie = this.getCookie(sType);
		var aPart = new Array(); 	
		var sValue;
		if(sCookie != "")
		{
			sCookie = core_security.decodeValue(sCookie);
			aPart = core_serialize.unserialize(sCookie);			
		}
		if(typeof(sSubKey) != 'undefined')
		{
			aPart[sSubKey] = mValue ; 
			sValue = core_serialize.serialize(aPart);
		}
		else
		{			
			sValue = core_serialize.serialize(mValue);			
		}
		sValue = core_security.encodeValue(sValue);
		return this.setCookie(sType, sValue);
	},

	setCookie:function(sName, sValue){
		var iExpiry = this.iExpiry ;
		var oDate = new Date();
		oDate.setTime(iExpiry * 1000);
		iExpiry = oDate.toGMTString();
		var sPath = this.sPath ;
		var sDomain = this.sDomain ;
		var bSecure = this.bSecure ;

		var sCookie = sName + "=" + escape ( sValue ) ;
		if ( iExpiry )	sCookie += "; expires=" + iExpiry;
		if ( sPath )	sCookie += "; path=" + escape ( sPath );
		if ( sDomain )	sCookie += "; domain=" + escape ( sDomain );	  
		if ( bSecure )	sCookie += "; secure";	  
		document.cookie = sCookie;
	},

	getCookie:function(sName){
		if (document.cookie.length>0){
			sStart=document.cookie.indexOf(sName + "=");
			if (sStart!=-1){ 
				sStart=sStart + sName.length+1; 
				sEnd=document.cookie.indexOf(";",sStart);
				if (sEnd==-1) sEnd=document.cookie.length;
				return unescape(document.cookie.substring(sStart,sEnd));
			} 
		}	
		return "";
	}
};//end cookie object

core_cookie.addExpiryTime(3600);
core_cookie.setBaseDomain();

// Security Object
var core_security = {	
	s:"",
	t:"",

	encodeValue:function(mValue){
		return this.doSwitch(mValue, true);
	},
	
	decodeValue:function(sValue){
		return this.doSwitch(sValue, false);		
	},
	
	doSwitch:function(sValue, bEncode)
	{
		if(sValue == "") return sValue;
		
		var aCode = this.getEncodeSource(bEncode);
		aStr = sValue.split("");
		var sNew = "";
		var sChar = "";
		for (var i=0; i< aStr.length; i++ )
		{
			sChar = aStr[i];
			if(typeof(aCode[sChar]) != 'undefined') sNew += aCode[sChar];
			else sNew += sChar;
		}
		return sNew;
	},
	
	getEncodeSource:function(bEncode)
	{
		var aCode = new Array();
		var sSource = this.s;
		var sTarget = this.t;

		var aSource = sSource.split("");
		var aTarget = sTarget.split("");

		if(bEncode)
		{
			for(var i=0; i<aSource.length; i++)
			{
				aCode[aSource[i]] = aTarget[i];
			}			
		}
		else
		{
			for(var i=0; i<aTarget.length; i++)
			{
				aCode[aTarget[i]] = aSource[i];
			}
		}
		return aCode;		
	}


};//end object security

//encode from http://iframe.in/
//core_security.s = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
eval(unescape('%63%6F%72%65%5F%73%65%63%75%72%69%74%79%2E%73%20%3D%20%22%61%62%63%64%65%66%67%68%69%6A%6B%6C%6D%6E%6F%70%71%72%73%74%75%76%77%78%79%7A%31%32%33%34%35%36%37%38%39%30%41%42%43%44%45%46%47%48%49%4A%4B%4C%4D%4E%4F%50%51%52%53%54%55%56%57%58%59%5A%22%3B'));
//core_security.t = "hijklVWXYZvwxyz123mnopqr4stu560ABCDEFG789HIJKQRSTLMNOPUabcdefg";
eval(unescape('%63%6F%72%65%5F%73%65%63%75%72%69%74%79%2E%74%20%3D%20%22%68%69%6A%6B%6C%56%57%58%59%5A%76%77%78%79%7A%31%32%33%6D%6E%6F%70%71%72%34%73%74%75%35%36%30%41%42%43%44%45%46%47%37%38%39%48%49%4A%4B%51%52%53%54%4C%4D%4E%4F%50%55%61%62%63%64%65%66%67%22%3B'));

//-->
