/* 
 * === Cookie Utility Class ===
 * 
 * updated 2008/12/06
 * updated 2003/07/02
 * 
 * charset = UTF8
 * 
 * Mail : info@graviness.com
 * Home : http://www.graviness.com/
 */



/**
 * クッキーユーティリティクラス．
 * 
 * インスタンス変数．
 * String	name
 * Date		expires
 * String	path
 * String	domain
 * boolean	secure
 * Document	document
 * boolean	loaded
 */
function class__JCookie__(window) {
	var classId = Object.getClassName(arguments.callee);

	var SIGN_OF_SYSTEM_ATTRIBUTES = "!!__";

	var $name = SIGN_OF_SYSTEM_ATTRIBUTES + Object.privateId();
	var $expires = SIGN_OF_SYSTEM_ATTRIBUTES + Object.privateId();
	var $path = SIGN_OF_SYSTEM_ATTRIBUTES + Object.privateId();
	var $domain = SIGN_OF_SYSTEM_ATTRIBUTES + Object.privateId();
	var $secure = SIGN_OF_SYSTEM_ATTRIBUTES + Object.privateId();
	var $document = SIGN_OF_SYSTEM_ATTRIBUTES + Object.privateId();
	var $loaded = SIGN_OF_SYSTEM_ATTRIBUTES + Object.privateId();

	var $isUserParameterProperty = Object.privateId();
	var $createCookieParametersString = Object.privateId();
	var $createCookieString = Object.privateId();

	/**
	 * 
	 * JCookie(name, number limitDay, path, domain, boolean secure, document)
	 */
	var F = window[classId] = function() {
		var a = arguments;

		this[$name] = a[0];
		this[$expires] = a[1]
			? new Date(new Date().getTime() + a[1] * DAY_RATIO) : null;
		this[$path] = a[2] ? a[2] : "";
		this[$domain] = a[3] ? a[3] : "";
		this[$secure] = Boolean(a[4]);
		this[$document] = a[5] || window.document;
		this[$loaded] = false;
	};

	var FP = Object.getPrototype(arguments.callee, window);

	var DAY_RATIO = 24 * 60 * 60 * 1000;

	/**
	 * 指定したプロパティが，ユーザ設定のパラメータを保持するか判定します．
	 */
	FP[$isUserParameterProperty] = function(property) {
		return property !== null
				&& property !== void 0
				&& property.indexOf(SIGN_OF_SYSTEM_ATTRIBUTES) != 0
				&& typeof this[property] != "function";
	};

	/**
	 * 現在のインスタンスの情報を元にcookieに格納するユーザ設定の
	 * パラメータ文字列部を生成します．
	 * @return cookieイメージのパラメータ文字列部．
	 */
	FP[$createCookieParametersString] = function() {
		var parameters = "";

		for (var p in this) {
			if (this[$isUserParameterProperty](p)) {
				parameters += "&" + p + ":" + escape(this[p]);
			}
		}

		return parameters.substring(1);
	};

	/**
	 * 現在のインスタンスの情報を元にcookieに格納する文字列を生成します．
	 * @return 現在のインスタンスの情報を元に生成されたcookieイメージ．
	 */
	FP[$createCookieString] = function() {
		var cookie = this[$name] + "=" + this[$createCookieParametersString]();

		if (this[$expires]) {
			cookie += "; expires=" + this[$expires].toGMTString();
		}
		if (this[$path]) {
			cookie += "; path=" + this[$path];
		}
		if (this[$domain]) {
			cookie += "; domain=" + this[$domain];
		}
		if (this[$secure]) {
			cookie += "; secure";
		}

		return cookie;
	};

	/**
	 * cookieに情報を書き込みます．
	 * cookieに書き込む情報は，インスタンスの情報を元に生成された文字列です．
	 */
	FP.store = function() {
		this[$document].cookie = this[$createCookieString]();
	};

	/**
	 * cookieから情報を読み出します．
	 * cookieから読み出した情報は，インスタンスの状態に反映されます．
	 * name属性の名称を元にcookieを検索します．
	 * @return name属性の名称を持つcookieの読み出しに成功した場合，真．
	 */
	FP.load = function(f) {
		if (!this[$loaded]) {
			if (this[$document].cookie == "") {
				return false;
			}

			var v = this[$document].cookie.match(
				new RegExp(this[$name] + "=[^\\s;]+"));
			if (v == null) {
				return false;
			}

			var a = v[0].substring(this[$name].length + 1).split('&');
			for (var i = 0; i < a.length; i++) {
				var p = a[i].split(':');
				this[p[0]] = unescape(p[1]);
			}

			this[$loaded] = true;
		}

		if (f === void 0) {
			return true;
		}

		if (f.indexOf('|') != -1) {
			var p = f.split('|');
			for (var i = 0; i < p.length; i++) {
				if (this[p[i]] === void 0) {
					return false;
				}
			}
		} else {
			if (this[f] === void 0) {
				return false;
			}
		}

		return true;
	};

	/**
	 * cookieから情報を読み出します．
	 * cookieから読み出した情報は，インスタンスの状態に反映されます．
	 * name属性の名称を元にcookieを検索します．
	 * @return name属性の名称を持つcookieの読み出しに成功した場合，偽．
	 */
	FP.unload = function(f) {
		return !(f !== void 0 ? this.load(f) : this.load());
	};

	/**
	 * cookieの情報を削除します．
	 * 実際は，name属性の名称を持つcookieの，パラメータ部を空にした文字列を
	 * 保存期限を過去に設定し，保存します．
	 * インスタンスのユーザ設定のパラメータは全て削除(delete)されます．
	 */
	FP.remove = function(f) {
		if (f !== void 0) {
			if (f.indexOf('|') != -1) {
				var keys = f.split('|');
				for (var i = 0, n = keys.length; i < n; i++) {
					var key = keys[i];
					delete this[key];
				}
			} else {
				delete this[f];
			}
			this.store();
		} else {
			var cookie = this[$name] + "=";
			if (this[$path]) {
				cookie += "; path=" + this[$path];
			}
			if (this[$domain]) {
				cookie += "; domain=" + this[$domain];
			}
			cookie += "; expires=Fri, 02-Jan-1970 00:00:00 GMT";

			this[$document].cookie = cookie;

			for (var p in this) {
				if (this[$isUserParameterProperty](p)) {
					delete this[p];
				}
			}
		}
	};

	/**
	 * 
	 * @return 現在のインスタンスの情報を元に生成されたcookieイメージの文字列．
	 */
	FP.toString = function() {
		return this[$createCookieString]();
	};

	/**
	 * 現在のインスタンスの情報を元にcookieに格納するユーザ設定の
	 * パラメータ文字列部を取得します．
	 * @return cookieイメージのパラメータ文字列部．
	 */
	FP.paramString = function() {
		return this[$createCookieParametersString]();
	};
} class__JCookie__(window);

