function setCookie() {
	var i, cName, kName, cValue, kObj, cStr, kExist, ampOK;
	var aLen = setCookie.arguments.length;
	var exp = typeof(setCookie.arguments[aLen-1]) == "number";
	if(aLen == 2 || (aLen == 3 && exp)) {
		cName = setCookie.arguments[0];
		if (cName == "") return false;
		cValue = setCookie.arguments[1];
		document.cookie = enc(cName) + "=" + enc(cValue) + (aLen == 2 ? "" : "; expires=" + expDate(setCookie.arguments[2]));
		return true;
	}
	else if (aLen == 3 || (aLen == 4 && exp)) {
		cName = setCookie.arguments[0];
		if (cName == "") return false;
		kName = setCookie.arguments[1];
		cValue = setCookie.arguments[2];
		if (hasKeys(cName)) {
			kObj = getCookie(cName);
			cStr = enc(cName)+"=";
			kExist = false;
			ampOK = false;
			for (key in kObj) {
				if (ampOK) {
					cStr += "&";
				}
				else {
					ampOK = true;
				}
				if (key != kName) {
					cStr += enc(key) + "=" + enc(kObj[key]);
				}
				else {
					cStr += enc(kName) + "=" + enc(cValue);
					kExist = true;
				}
			}
			if (!kExist) {
				cStr += "&" + enc(kName) + "=" + enc(cValue);
			}
			cStr += (aLen == 3 ? "" : "; expires=" + expDate(setCookie.arguments[3]));
			document.cookie = cStr;
		}
		else {
			document.cookie = enc(cName) + "=" + enc(kName) + "=" + enc(cValue) + (aLen == 3 ? "" : "; expires=" + expDate(setCookie.arguments[3]));
		}
		return true;
	}
	return false;
}

function hasKeys(cName) {
	if (cName == "") return false;
	var i, cVArr;
	var cSet = document.cookie.split("; ");
	var cSLen = cSet.length;
	cName = enc(cName) + "=";
	for (i=0;i<cSLen;i++) {
		if (cSet[i].indexOf(cName) == 0) {
			cVArr = cSet[i].split("=");
			if (cVArr.length > 2) {
				return true;
			}
			else {
				return false;
			}
		}
	}
	return false;
}

function getCookie() {
	var i, cName, kName, cSet, cSLen, cValue, kvSet, kvSLen, kvPair;
	var gCLen = getCookie.arguments.length;
	switch (gCLen) {
		case 0:
			return getCookieArray();
		case 2:
			kName = enc(getCookie.arguments[1]);
		case 1:
			cName = enc(getCookie.arguments[0]);
			if (cName!="") break;
		default:
			return "";
	}
	cSet = document.cookie.split("; ");
	cSLen = cSet.length;
	for (i=0;i<cSLen;i++) {
		if (cSet[i].indexOf(cName + "=") == 0) {
			cValue = cSet[i].substring(cName.length + 1,cSet[i].length);
			if (gCLen == 1 && cValue.indexOf("=") > -1) {
				return getKeyArray(cValue);
			}
			else if (gCLen == 1 || cValue.indexOf("=") == -1) {
				return dec(cValue);
			}
			else if (cValue.indexOf("=") > -1) {
				kvSet = cValue.split("&");
				kvSLen = kvSet.length;
				for (i=0;i<kvSLen;i++) {
					kvPair = kvSet[i].split("=");
					if (kvPair[0]==kName) {
						return dec(kvPair[1]);
					}
				}
				return getKeyArray(cValue);
			}
		}
	}
	return "";
}

function deleteCookie(){
	var i, cName, kName, key, cObj, kObj;
	var keyCount = 0;
	var ampOK = false;
	var cStr = "";
	var dCLen = deleteCookie.arguments.length;
	switch (dCLen) {
		case 0:
			cObj = getCookieArray();
			for (key in cObj) {
				clearCookie(key);
			}
			return true;
		case 1:
			cName = deleteCookie.arguments[0];
			cObj = getCookieArray();
			if (cObj[cName] != undefined) {
				clearCookie(cName);
				return true;
			}
			return false;
		case 2:
		case 3:
			cName = deleteCookie.arguments[0];
			kName = deleteCookie.arguments[1];
			if (hasKeys(cName)) {
				kObj = getCookie(cName);
				if (kObj[kName] == undefined) {
					return false;
				}
				for (key in kObj) {
					if (key != kName) {
						if (ampOK) cStr += "&";
						else ampOK = true;
						cStr += enc(key) + "=" + enc(kObj[key]);
					}
					keyCount++;
				}
				if (keyCount == 1) {
					clearCookie(cName);
					return true;
				}
				cStr = enc(cName) + "=" + cStr + (dCLen == 2 ? "" : "; expires=" + expDate(deleteCookie.arguments[2]));
				document.cookie = cStr;
				return true;
			}		
		default:
			return false;
	}
}

function clearCookie(cName) {
	document.cookie = enc(cName) + "=" + "; expires=Thu, 01 Jan 1970 00:00:00 UTC";
}

function getKeyArray(cValue) {
	var i, kvPair;
	var kvSet = cValue.split("&");
	var kvSLen = kvSet.length;
	var rObj = new Object;
	for (i=0;i<kvSLen;i++) {
		kvPair = kvSet[i].split("=");
		rObj[dec(kvPair[0])] = dec(kvPair[1]);
	}
	return rObj;
}

function getCookieArray(){
	var i, cName, cValue;
	var cSet = document.cookie.split("; ");
	var cSLen = cSet.length;
	var rObj = new Object;
	for (i=0;i<cSLen;i++) {
		cName = cSet[i].substring(0,cSet[i].indexOf("="));
		cValue = cSet[i].substring(cSet[i].indexOf("=") + 1,cSet[i].length);
		rObj[dec(cName)] = dec(cValue);
	}
	return rObj;
}

function enc(str){
	return encodeURIComponent(str).replace(/%20/g,"+");
}

function dec(str){
	return decodeURIComponent(str.replace(/\+/g," "));
}

function expDate(d){
	var currentD = new Date();
	var expD = new Date(currentD.getFullYear(), currentD.getMonth(), currentD.getDate() + d);
	//var expD = new Date(2020,1,1);
	return expD.toUTCString();
}



