Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

var DATA = {
	
	// Locals //
	/////////////////////////////////////////////////////////////////////////////
	
	LANG: 'eng',	// Overridden by page
	CLANG: 'eng',	// Overridden by page
	COUNTRY: '',	// Overridden by page
	
	LOCALE: function() {
		return DATA.LANG + (DATA.COUNTRY != '' ? '-' + DATA.COUNTRY : '');
	},
	
	localeParams: function() {
		var params = [];
		if (DATA.LANG != '') params.push('lang=' + DATA.LANG);
		if (DATA.CLANG != '') params.push('clang=' + DATA.CLANG);
		if (DATA.COUNTRY != '') params.push('country=' + DATA.COUNTRY);
		
		return params.join('&');
	},
	
	SITE: 'https://www.balanceofnature.com/', // Overridden by page
	
	CID: null,
	
	// Product //
	/////////////////////////////////////////////////////////////////////////////
	
	PRODUCT: {},
	
	PKID: {},
	
	PROMO: null,
	
	PC: 'false',
	
	LOGIN: false,
	
	addProduct: function (id,pkid,base_r,base_pc) {
		DATA.PRODUCT[id] = { PKID: pkid, BASE_R : base_r, BASE_PC : base_pc};
	},
	
	addPKID: function (id,fwd,q) {
		if (typeof(q) === 'undefined') var q	= 1;
		var t	= DATA.searchPKID(id);
		if (t == false) {
			DATA.PKID[id] = q;
		} else {
			DATA.PKID[id] = DATA.PKID[id]+q; 
			if (DATA.PKID[id]>6) DATA.PKID[id] = 6;
		}
		//alert(t+' '+q+' '+id+' '+DATA.PKID[id]);
		DATA.createCookie(DATA.CookieName,DATA.encode(JSON.stringify(DATA.PKID)),6);
		//////////////
		//alert(JSON.stringify(DATA.PKID));
		if (fwd) window.location = DATA.SITE+"shopbag/";
		return true;
	},
	
	delPKID: function (id,re,conf) {
		if (typeof(conf) === 'undefined') {
			if (confirm ("Are you sure you want to delete this item?")) {
				delete DATA.PKID[id];
				DATA.createCookie(DATA.CookieName,DATA.encode(JSON.stringify(DATA.PKID)),6);
			}
		} else {
			delete DATA.PKID[id];
			DATA.createCookie(DATA.CookieName,DATA.encode(JSON.stringify(DATA.PKID)),6);
		}
		//////////////
		//alert(JSON.stringify(DATA.PKID));
		if (re) window.location.reload();
		return true;
	},
	
	addPROMO: function (id,sofc,fwd) {
		DATA.PROMO	= id;
		DATA.SOFC	= sofc;
		DATA.createCookie(DATA.CookieName+'pv1',DATA.encode(DATA.PROMO),6);
		DATA.createCookie(DATA.CookieName+'pv2',DATA.encode(DATA.SOFC),6);
		DATA.addPC(false);
		//////////////
		//alert(JSON.stringify(DATA.PROMO));
		if (fwd) window.location = DATA.SITE+"shopbag/";
		return true;
	},
	
	addPC: function (fwd) {
		DATA.PC	= 'true';
		DATA.createCookie(DATA.CookieName+'pv3',DATA.encode(DATA.PC),6);
		//////////////
		//alert(JSON.stringify(DATA.PROMO));
		if (fwd) window.location = DATA.SITE+"shopbag/";
		return true;
	},
	
	delPROMO: function (id,re) {
		if (confirm ("Are you sure you want to delete this promocode?")) {
			delete DATA.PROMO;
			DATA.createCookie(DATA.CookieName+'pv1',DATA.encode(DATA.PROMO),6);
			//////////////
			//alert(JSON.stringify(DATA.PROMO));
			if (re) window.location.reload();
			return true;
		}
	},
	
	addUPGRADE: function (id,fwd) {
		switch(id) {
			case 133: // whole health system plus
				var p1	= DATA.searchPKID(132);
				var p2	= DATA.searchPKID(131);
				var p3	= DATA.searchPKID(130);
				var p3	= DATA.searchPKID(134);
				if(p1 || p2 || p3) {
					if (confirm ("Do you really want to apply this upgrade?")) {
						DATA.delPKID(130,false,true);
						DATA.delPKID(131,false,true);
						DATA.delPKID(132,false,true);
						DATA.delPKID(134,false,true);
						var ma = Math.max(p1,p2,p3);
						DATA.addPKID(133,true,ma);
					}
				} else {
					DATA.addPKID(133,true,1);
				}
				break;
			case 134: // whole health system
				var p1	= DATA.searchPKID(132);
				var p2	= DATA.searchPKID(131);
				if(p1 || p2) {
					if (confirm ("Do you really want to apply this upgrade?")) {
						DATA.delPKID(132,false,true);
						DATA.delPKID(131,false,true);
						var ma = Math.max(p1,p2);
						DATA.addPKID(134,true,ma);
					}
				} else {
					DATA.addPKID(134,true,1);
				}
				break;
		}
		//alert(t+' '+q+' '+id+' '+DATA.PKID[id]);
		DATA.createCookie(DATA.CookieName,DATA.encode(JSON.stringify(DATA.PKID)),6);
		//////////////
		//alert(JSON.stringify(DATA.PKID));
		if (fwd) window.location = DATA.SITE+"shopbag/";
		return true;
	},
	
	searchPKID: function (id) {
		if (id in DATA.PKID) return DATA.PKID[id];
		return 0;
	},
	
	// Cookie //
	/////////////////////////////////////////////////////////////////////////////
	
	CookieName: "bov1",
	
	createCookie: function (name,value,days) {
		if (days) {
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		}
		else var expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	},
	
	readCookie: function (name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	},
	
	eraseCookie: function (name) {
		DATA.createCookie(name,"",-1);
	},
	
	// Base64 //
	/////////////////////////////////////////////////////////////////////////////
	
	// private property
	_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
 
	// public method for encoding
	encode : function (input) {
		var output = "";
		var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
		var i = 0;
 
		input = DATA._utf8_encode(input);
 
		while (i < input.length) {
 
			chr1 = input.charCodeAt(i++);
			chr2 = input.charCodeAt(i++);
			chr3 = input.charCodeAt(i++);
 
			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
			enc4 = chr3 & 63;
 
			if (isNaN(chr2)) {
				enc3 = enc4 = 64;
			} else if (isNaN(chr3)) {
				enc4 = 64;
			}
 
			output = output +
			this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
			this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
 
		}
 
		return output;
	},
 
	// public method for decoding
	decode : function (input) {
		var output = "";
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
		var i = 0;
 
		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
 
		while (i < input.length) {
 
			enc1 = this._keyStr.indexOf(input.charAt(i++));
			enc2 = this._keyStr.indexOf(input.charAt(i++));
			enc3 = this._keyStr.indexOf(input.charAt(i++));
			enc4 = this._keyStr.indexOf(input.charAt(i++));
 
			chr1 = (enc1 << 2) | (enc2 >> 4);
			chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
			chr3 = ((enc3 & 3) << 6) | enc4;
 
			output = output + String.fromCharCode(chr1);
 
			if (enc3 != 64) {
				output = output + String.fromCharCode(chr2);
			}
			if (enc4 != 64) {
				output = output + String.fromCharCode(chr3);
			}
 
		}
 
		output = DATA._utf8_decode(output);
 
		return output;
 
	},
 
	// private method for UTF-8 encoding
	_utf8_encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
 
		for (var n = 0; n < string.length; n++) {
 
			var c = string.charCodeAt(n);
 
			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
 
		}
 
		return utftext;
	},
 
	// private method for UTF-8 decoding
	_utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;
 
		while ( i < utftext.length ) {
 
			c = utftext.charCodeAt(i);
 
			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
 
		}
 
		return string;
	}
}
