/*
	Browsers in compliance with RFC 2109 have at least
	20 cookies per domain and 4096 bytes per cookie. (Internet Explorer has a max of 20 cookies per domain) 
	Large amounts of data should be grouped in a cookie group.
*/

var Page = new Object()

Page.getCookie = function(cookieName) {
	var cookies = document.cookie

	var regExp = new RegExp("" + cookieName + "\\=([\\w\\%\\+]+)")
	var matches = regExp.exec(cookies)

	if (matches != null && matches.length > 0) {
		return unescape(matches[1])
	} else {
		return ""
	}
}

Page.cookieExists = function(cookieName) {
	var cookies = document.cookie
	var regExp = new RegExp("" + cookieName + "\\=([\\w\\%\\+]+)")
	return regExp.test(cookies)
}


Page.deleteCookie = function(name) {
	var cookies = document.cookie
	var path = "/"
	var domain = ""
	var showDebug = false
	
	if (name.exec) {
		var expr = name.toString()
		expr = expr.substring(1,expr.length - 1)
		var findExpr = new RegExp("(" + expr + ")","g")

		var matches = cookies.match(findExpr)
		
		if (matches == null) {
			return true
		} else {
			var found = ""
			for (var i = 0; i < matches.length; i ++) {
				if (showDebug) {
					found += matches[i] + " = " + Page.deleteCookie(matches[i], path, domain) + "\n"
				} else {
					Page.deleteCookie(matches[i], path, domain)
				}
			}
			
			if (showDebug) alert("delete cookies[" + matches.length + "] :\n" + found)
		}
		
		return matches.length == 0
	} else {
		if (arguments.length > 1) path = arguments[1]
		if (arguments.length > 2) domain = arguments[2]
		
		if (Page.cookieExists(name)) {
			return Page.setCookie(name, "", -1, path, domain)
		}
	}
}

Page.sessCookie = function(name, value) {
	return Page.setCookie(name,value)
}

Page.setCookie = function() {
	//name, value, [expires], [path], [domain], [secure]
	var name = arguments[0]
	var value = arguments[1]
	
	if (value == null) {
		return Page.deleteCookie(name)	
	}
	
	var expires = ""
	var path = "/"
	var domain = ""
	var secure = false

	if (arguments.length > 2 && arguments[2]) expires = Page.getExpiryDate(arguments[2])
	if (arguments.length > 3 && arguments[3]) path = arguments[3]
	if (arguments.length > 4 && arguments[4]) domain = arguments[4]
	if (arguments.length > 5 && arguments[5]) secure = arguments[5] != "" ? true : false

	
	var cookie = name + "=" + escape(value) + 
	((expires) ? "; expires=" + expires : "") +
	((path) ? "; path=" + path : "") +
	((domain) ? "; domain=" + domain : "") +
	((secure) ? "; secure" : "");
	
	//alert("setCookie: name=" + name + "\nvalue=" + escape(value) + "\nexpires=" + expires + "\npath=" + path + "\ndomain=" + domain + "\nsecure=" + secure)
	document.cookie = cookie
	return Page.cookieExists(name)
}

Page.getExpiryDate = function(days) {
	var utc
	var daySec = 86400000
	now = new Date()
	ms = Date.parse(now)
	now.setTime(ms + parseInt(days) * daySec)
	utc = now.toUTCString()
	return utc
}

Page.setCookieGroup = function() {
	//name, value, [expires], [path], [domain], [secure]
	var name = arguments[0]
	var value = arguments[1]
	
	var expires = ""
	var path = "/"
	var domain = ""
	var secure = false

	if (arguments.length > 2) expires = Page.getExpiryDate(arguments[2])
	if (arguments.length > 3) path = arguments[3]
	if (arguments.length > 4) domain = arguments[4]
	if (arguments.length > 5) secure = arguments[5] != "" ? true : false
	
	var items = Page.getCookieGroup(name)
	var pos = items.length
	var groupData
	
	for (var i = 0; i < items.length; i++) {
		if (value == items[i])	{
			pos = i
			break
		}
	}

	if (pos == items.length) items[pos] = escape(value)
	
	value = items.join("&")

	return Page.setCookie(name,value,expires,path,domain,secure)
}

Page.getCookieGroup = function(name) {
	var groupData = Page.getCookie(name)
	var items

	if (groupData) {
		items = groupData.split("&")
		
		for (var i = 0; i < items.length; i++) {
			items[i] = unescape(items[i])	
		}
	} else {
		items = new Array()
	}
	
	return items
}

Page.findCookieGroup = function(name, startsWith) {
	var groupInfo = Page.getCookieGroup(name)
	
	if (groupInfo) {
		for (var i = 0; i < groupInfo.length; i++) {
			if (groupInfo[i].indexOf(startsWith) == 0) return groupInfo[i]
		}
	}
	
	return ""
}


Page.deleteCookieGroup = function() {
	//name, value, [expires], [path], [domain], [secure]
	var name = arguments[0]
	var value = arguments[1]

	var expires = ""
	var path = "/"
	var domain = ""
	var secure = false

	if (arguments.length > 2) expires = Page.getExpiryDate(arguments[2])
	if (arguments.length > 3) path = arguments[3]
	if (arguments.length > 4) domain = arguments[4]
	if (arguments.length > 5) secure = arguments[5] != "" ? true : false
	
	var expr = value.toString()
	if (value.exec) expr = expr.substring(1,expr.length - 1)
	var findExpr = new RegExp("(" + expr + ")","g")
	
	var items = Page.getCookieGroup(name)
	var pos = items.length
	var groupData
	var newGroup = new Array()
	
	for (var i = 0; i < items.length; i++) {

		if (! findExpr.test(items[i])) {
			newGroup[newGroup.length] = escape(items[i])
		}
	}
	
	value = newGroup.join("&")
		
	return Page.setCookie(name,value,expires,path,domain,secure)
}

