/**
 * =============================================================
 *  common.js
 * =============================================================
 * @package		javascript
 * @author		sYoshioka
 * @copyright	COPYRIGHT (C) 2009 JCity Inc., ALL RIGHTS RESERVED.
 * @version		$Id: common.js 70 2009-04-20 01:43:12Z yoshsei $
 */

var JCity = new Object();

JCity = {
	env : {
		home : "",
		packageName : "__ObjectPackage.json",
		userAgent : {
			ie : navigator.userAgent.match(/msie/i),
			safari : (navigator.userAgent.match(/applewebkit/i) || navigator.userAgent.match(/khtml/i)),
			opera : window.opera,
			gecko : navigator.userAgent.match(/Gecko\//i),
			firefox : navigator.userAgent.match(/Firefox\//i)
		},
		os : {
			windows : navigator.platform.match(/win/i),
			mac : navigator.platform.match(/mac/i),
			linux : navigator.platform.match(/linux/i)
		}
	},
	preLoad : function(){
		var scripts = document.getElementsByTagName("script");
		var target;

		if(scripts){
			if(target = scripts[scripts.length - 1].src){
				this.env.home = target.match(/.*\//g);
				this.env.home = this.env.home ? this.env.home : "./";
			}
		}
	},
	provide : function(loading){
		var uri = loading.replace(/\./g, "/");

		if(uri.match(/\*$/)){
			this.packageProvide(uri);
		}else{
			if(uri.match(/\/css\//i)){
				this.provideAsObject(uri + ".css?t=" + (new Date()).getTime());
			}else{
				this.provideAsObject(uri + ".js?t=" + (new Date()).getTime());
			}
		}
	},
	packageProvide : function(uri){
		uri = uri.substr(0, uri.length - 1) + this.env.packageName;
		var loadObjects = JCity.ajax.getJSON(JCity.env.home + uri, "", "GET");

		if(typeof(loadObjects) == "object"){
			for(var index in loadObjects.object){
				if(typeof(loadObjects.object[index]) == "string"){
					this.provide(loadObjects.object[index]);
				}
			}
		}
	},
	include : function(loading){
		var uri = JCity.env.home + loading.replace(/\./g, "/");
		if(uri.match(/\*$/)){
			this.packageInclude(uri);
		}else{
			this.require(uri + ".js?t=" + (new Date()).getTime());
		}
	},
	require : function(uri){
		JCity.ajax.objectLoader(uri);
	},
	provideAsElement : function(uri){
		uri = JCity.env.home + uri;

		if(uri.match(/\.css/i)){
			document.write(unescape("%3Clink href=\"" + uri + "\" rel=\"stylesheet\" type=\"text/css\" /%3E"));
		}else{
			document.write(unescape("%3Cscript src=\"" + uri + "\" type=\"text/javascript\"%3E%3C/script%3E"));
		}
	},
	provideAsObject : function(uri, media){
		var head = document.getElementsByTagName("head").item(0);
		var uri = JCity.env.home + uri;

		if(uri.match(/\.css/i)){
			var link = document.createElement("link");
			link.type = "text/css";
			link.rel = "stylesheet";
			link.href = uri;
			link.media = media ? media : "screen";
			head.appendChild(link);
		}else{
			var script = document.createElement("script");
			script.type = "text/javascript";
			script.src = uri;
			head.appendChild(script);
		}
	},
	packageInclude : function(uri){
		uri = uri.substr(0, uri.length - 1) + this.env.packageName;
		var loadObjects = JCity.ajax.getJSON(uri, "", "GET");

		if(typeof(loadObjects) == "object"){
			for(var index in loadObjects.object){
				if(typeof(loadObjects.object[index]) == "string"){
					this.include(loadObjects.object[index]);
				}
			}
		}
	}
}

/* JCity.element
***************************************************************/
JCity.element = {
	anchor : {
		onLoad : function(){
			var anchors = document.getElementsByTagName("a");
			var areas = document.getElementsByTagName("area");
			var anchor;
			var targets = Array();
			var target = null;
			var module = this;

			if(typeof(getProperties) == "function"){
				targets = getProperties("popup"); /*** refer to "objects.prop" ***/
			}

			for(var i=0; i<areas.length; i++){
				anchors[anchors.length + i] = areas[i];
			}

			for(var i=0; anchor=anchors[i]; i++){
				if(anchor.className.match(/external/i)){
					anchor.onclick = function(event){
						return module.openWindowExternal(this);
					}
					anchor.onkeypress = function(event){
						if(JCity.event.key.isKeyPressEnter(event)){
							return module.openWindowExternal(this);
						}
						return true;
					}
				}else if(anchor.className.match(/track\-back/i)){
					anchor.onclick = function(){
						if(window.opener && !window.opener.closed){
							window.opener.location.href = this.href;
							return false;
						}
						return true;
					}
					anchor.onkeypress = function(event){
						if(JCity.event.key.isKeyPressEnter(event)){
							if(window.opener && !window.opener.closed){
								window.opener.location.href = this.href;
								return false;
							}
						}
						return true;
					}
				}else if(anchor.className.match(/close/i)){
					anchor.onclick = function(){
						if(window.opener){
							window.opener.focus();
						}
						window.close();
					}
					anchor.onkeypress = function(){
						if(JCity.event.key.isKeyPressEnter(event)){
							window.close();
						}
					}
				}else if(anchor.className.match(/track\-back\-close/i)){
					if(window.opener && !window.opener.closed){
						anchor.href = "javascript: window.opener.location.href='" + anchor.href + "'; window.close();";
					}
				}else if(anchor.className.match(/pagetop/i)){
					anchor.onclick = function(){
						return JCity.util.scroll.toPageTop();
					}
					anchor.onkeypress = function(event){
						if(JCity.event.key.isKeyPressEnter(event)){
							return JCity.util.scroll.toPageTop();
						}
						return true;
					}
				}else if(anchor.className.match(/toAnchor/i)){
					anchor.onclick = function(){
						return JCity.util.scroll.toAnchor(module.getAnchorName(this));
					}
					anchor.onkeypress = function(event){
						if(JCity.event.key.isKeyPressEnter(event)){
							return JCity.util.scroll.toAnchor(module.getAnchorName(this));
						}
						return true;
					}
				}else if(anchor.className.match(/nLogin/i) || anchor.className.match(/disabled/i)){
					anchor.style.color = "#aaa";
					anchor.onclick = function(){
						return false;
					}
				}else if(anchor.href.charAt(anchor.href.length - 1) == "#"){
					anchor.style.color = "#aaa";
					anchor.onclick = function(){
						return false;
					}
				}else if(anchor.className.match(/print/i)){
					anchor.onclick = function(){
						window.print();
						return false;
					}
				}else if(anchor.rel && anchor.rel.match(/color/i)){
					if(swap){
						anchor.onclick = function(){
							var olderIE = navigator.userAgent.match(/MSIE (5\.5|6\.)/);
							var duration = {hide : (olderIE ? 0.2 : 0.2), show : (olderIE ? 0.1 : 0.1)}
							var color = this.rel.replace(/color_/, "");
							var url = this.href.replace(/[&?]color=.+$/i, "").replace(/\#.+$/i, "");
							var imageSrc = "";

							if(color){
								this.href = url + "#" + color;

								if(olderIE){
									imageSrc = swap.style.filter.match(/src=\".+\.png/i)[0].replace(/src=|\"/g, "");
								}else{
									imageSrc = swap.src;
								}

								if(imageSrc.replace(/(https?:)?\/.+\//i, "").match(/_[a-z]+/) != "_" + color){
									var swapImage = JCity.ajax.getText(JCity.env.home + "isExistsFile.php?file=" + url + "&color=" + color);

									var temp = new Image();
									temp.src = swap.src.replace(/_.+\.png/i, "_" + color + ".png");

									new Effect.Opacity(swap, {
										duration: duration.hide,
										transition: Effect.Transitions.linear,
										from: 1,
										to: 0,
										afterFinish: function(){
											swap.src = swapImage;

											if(olderIE){
												JCity.png.alphaChannel.show("swapImage");
											}

											new Effect.Opacity(swap, {
												duration: duration.show,
												transition: Effect.Transitions.linear,
												from: 0,
												to: 1
											})
										}
									});
								}else{
									return false;
								}
							}
							return true;
						}
					}
				}else{
					if(targets.length > 0){
						for(var j=0; target=targets[j]; j++){
							if(anchor.href.match(new RegExp(target.url))){
								anchor.window_prop = target;
								anchor.onclick = function(){
									return module.openWindow(this);
								}
								anchor.onkeypress = function(event){
									if(JCity.event.key.isKeyPressEnter(event)){
										return module.openWindow(this);
									}
									return true;
								}
							}
						}
					}
				}
			}
		},
		openWindow : function(anchor){
			return JCity.util.openWindow(anchor, anchor.window_prop);
		},
		openWindowExternal : function(anchor){
			return JCity.util.openWindowExternal(anchor);
		},
		getAnchorName : function(anchor){
			return anchor.href.match(/\#.+/i)[0].replace(/\#/i, "");
		}
	},
	image : {
		preLoad	: new Array(),
		onLoad : function(){
			var images = document.getElementsByTagName("img");
			var inputs = document.getElementsByTagName("input");
			var over = new Array();
			var pattern = new Array();
			var img;

			pattern[0] = /rollover/i;
			pattern[1] = /\.(jpe?g|gif|png)$/i;
			pattern[2] = /\-over\.(jpe?g|gif|png)$/i;

			for(var i=0; i<images.length; i++){
				if(images[i].className.match(pattern[0])){
					over[over.length] = images[i];
				}
			}

			for(var i=0; i<inputs.length; i++){
				if(inputs[i].type == "image" && inputs[i].className.match(pattern[0])){
					over[over.length] = inputs[i];
				}
			}

			for(var i=0; img=over[i]; i++){
				if(JCity.env.userAgent.ie && img.id.match(/.png/i)){
					img.defaultsrc = img.id;
				}else{
					img.defaultsrc = img.src;
				}

				if(!img.src.match(pattern[2])){
					var prefix = img.defaultsrc.replace(pattern[1], "");
					var suffix = img.defaultsrc.match(pattern[1])[0];
					img.oversrc = prefix + "-over" + suffix;

					var j = this.preLoad.length;
					this.preLoad[j] = JCity.util.newImage(img.oversrc);

					img.onmouseover = function(){
						this.src = this.oversrc;
						if(JCity.env.userAgent.ie && IEPNGFIX){
							IEPNGFIX.fix(this);
						}
					}
					img.onmouseout = function(){
						this.src = this.defaultsrc;
						if(JCity.env.userAgent.ie && IEPNGFIX){
							IEPNGFIX.fix(this);
						}
					}
				}
			}
		}
	},
	form : {
		onLoad : function(){
			var forms = document.getElementsByTagName("form");
			var form;

			for(var i=0; form=forms[i]; i++){
				var inputs = form.getElementsByTagName("input");
				var input;

				for(var j=0; input=inputs[j]; j++){
					if(input.type == "checkbox" && input.className.match(/column-disable/)){
						input.onclick = function(){
							var objId = this.className.replace(/column\-disable\-/, "");
							var obj = JCity.util.getObject(objId);
							if(obj.disabled){
								obj.style.background = "#fff";
								obj.disabled = false;
							}else{
								obj.style.background = JCity.sys.conf.column.disabledColor;
								obj.disabled = true;
							}
						}
						input.onkeypress = function(event){
							if(JCity.event.key.isKeyPressEnter(event)){
								var objId = this.className.replace(/column\-disable\-/, "");
								var obj = JCity.util.getObject(objId);
								if(obj.disabled){
									obj.style.background = "#fff";
									obj.disabled = false;
								}else{
									obj.style.background = JCity.sys.conf.column.disabledColor;
									obj.disabled = true;
								}
							}
						}
					}
					if(input.className.match(/retype/)){
						var message = null;
						var preValue = "";

						if(!JCity.sys.conf.alert.form) return true;

						if(input.className.match(/retype_passwd/)){
							message = JCity.sys.conf.retype_passwd;
						}else if(input.className.match(/retype_mailaddress/)){
							message = JCity.sys.conf.retype_mailaddress;
						}else{
							return true;
						}

						if(JCity.env.userAgent.firefox){
							input.oncontextmenu = function(){
								return false;
							}
							input.onkeydown = function(event){
								if(JCity.event.key.isKeyPressPaste(event)){
									alert(message);
									this.value = preValue;
									return false;
								}else{
									preValue = this.value;
								}
								return true;
							}
						}else{
							input.onpaste = function(){
								alert(message);
								return false;
							}
						}
					}
					if(input.type == "file"){
						if(JCity.env.os.mac){
							input.size = input.size - 9;
						}
					}
				}
			}

			return true;
		}
	},
	label : {
		onLoad : function(){
/*****
			var labels = document.getElementsByTagName("label");
			var label;
			var module = this;

			for(var i=0; label=labels[i]; i++){
				label.onclick = function(){
					var target = module.getTarget(this);
					if(target){
						if(JCity.env.userAgent.safari && (target.type == "checkbox" || target.type == "radio")){
							target.fireEvent("onchange");
							return false;
						}else if(target.type == "text" || target.type == "password" || target.tagName.match(/TEXTAREA/i)){
							JCity.util.focusObject(target);
						}
					}
					return true;
				}
				label.onkeypress = function(event){
					if(JCity.event.key.isKeyPressEnter(event)){
						var target = module.getTarget(this);
						if(target){
							if(JCity.env.userAgent.safari && target.type == "checkbox"){
								target.fireEvent("onchange");
								return false;
							}
						}
					}
					return true;
				}
				label.onmouseover = function(){
					this.style.cursor = "default";
				}
			}
*****/
		},
		getTarget : function(label){
//			return JCity.util.getObject(labelFor);
		},
		ticked : function(target){
			target.checked = !(target.checked);
			return false;
		}
	},
	input : {
		onLoad : function(){
			var inputs = document.getElementsByTagName("input");
			var textareas = document.getElementsByTagName("textarea");
			var target = new Array();
			var input;

			for(var i=0; i<inputs.length; i++){
				if(inputs[i].type == "text" || inputs[i].type == "password" || inputs[i].type == "button"){
					target[target.length] = inputs[i];
				}
				if(inputs[i].type == "button" && inputs[i].className.match(/close/i)){
					var button = inputs[i];
					button.onclick = function(){
						window.close();
					}
					button.onkeypress = function(event){
						if(JCity.event.key.isKeyPressEnter(event)){
							window.close();
						}
					}
				}
				if((inputs[i].type == "submit" || inputs[i].type == "checkbox") && inputs[i].className.match(/disabled/i)){
					inputs[i].disabled = true;
				}
			}
			for(var i=0; i<textareas.length; i++){
				target[target.length] = textareas[i];
			}

			for(var i=0; input=target[i]; i++){
				if(input.type != "button" && input.type != "image" && JCity.sys.conf.column.swapBgColor){
					input.onfocus = function(){
						this.defaultbgcolor = this.style.backgroundColor;
						this.defaultcolor = this.style.color;
						if(this.defaultbgcolor != JCity.sys.conf.column.errorFiledColor) this.style.backgroundColor = JCity.sys.conf.column.backgroundColor;
						this.style.color = JCity.sys.conf.column.color;
						JCity.util.selectText(this);
					}
					input.onblur = function(){
						this.style.backgroundColor = this.defaultbgcolor;
						this.style.color = this.defaultcolor;
					}
				}else{
					input.onfocus = function(){
						JCity.util.selectText(this);
					}
				}
				if(input.className.match(/select/i)){
					JCity.util.focusObject(input);
				}
				if(input.className.match(/disabled/i)){
					input.style.color = "#999";
					if(input.type == "text" || input.type == "password"){
						input.style.backgroundColor = JCity.sys.conf.column.disabledColor;
					}
					input.disabled = true;
				}
			}
		}
	}
}

/* JCity.util
***************************************************************/
JCity.util = {
	openWindow : function(anchor, prop){
		var win;
		var position;

		this.setCursorWait();
		position = (prop.top >= 0) ? ", top = " + prop.top : "";
		position += (prop.left >= 0) ? ", left = " + prop.left : "";

		win = window.open(anchor.href, prop.window_name, "width = " + prop.width + ", height = " + prop.height + ", directories = " + prop.directories + ", channelmode = " + prop.channelmode + ", fullscreen = " + prop.fullscreen + ", location = " + prop.location + ", menubar = " + prop.menubar + ", scrollbars = " + prop.scrollbars + ", status = " + prop.status + ", toolbar = " + prop.toolbar + ", resizable = " + prop.resizable + position);

		this.setCursorAuto();
		return this.focusWindow(win);
	},
	openWindowExternal : function(anchor){
		var winName = anchor.rel ? anchor.rel : "external";
		var win = window.open(anchor, winName);

		return this.focusWindow(win);
	},
	openPopup : function(page_name){
		var target;
		var targets = getProperties("popup");
		for(var i=0; target=targets[i]; i++){
			if(page_name.match(new RegExp(target.url))){
				return this.openWindow(page_name, target);
			}
		}
		return true;
	},
	focusWindow : function(win){
		if(win){
			win.focus();
			return false;
		}
		return true;
	},
	getObject : function(objectId){
		return document.all ? document.all(objectId) : document.getElementById ? document.getElementById(objectId) : document.layers[objectId];
	},
	newImage : function(src){
		if(document.images){
			var result = new Image();
			result.src = src;
			return result;
		}
		return "";
	},
	errorColumn : function(target){
		JCity.util.scroll.toAnchor(target);
		var object = this.getObject(target);
		if(object) this.focusObject(object);
		return false;
	},
	focusObject : function(target){
		target.focus();
		this.selectText(target);
	},
	selectText : function(target){
		if(target.type == "text" && (JCity.sys.conf.column.highlight || target.className.match(/highlight/i))) target.select();
	},
	setCursor : function(object, type){
		object.style.cursor = type;
	},
	setCursorWait : function(){
		this.setCursor(document.body, "wait");
	},
	setCursorAuto : function(){
		this.setCursor(document.body, "auto");
	},
	transferTo : function(href){
		location.href = href;
	},
	scroll : {
		getScrollLeft : function(){
			return document.body.parentNode.scrollLeft ? document.body.parentNode.scrollLeft : document.body.scrollLeft ? document.body.scrollLeft : 0;
		},
		getScrollTop : function(){
			return document.body.parentNode.scrollTop ? document.body.parentNode.scrollTop : document.body.scrollTop ? document.body.scrollTop : window.pageYOffset ? window.pageYOffset : 0;
		},
		getClientHeight : function(){
			return window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ? document.body.clientHeight : 0;
		},
		getAnchorPosition : function(anchorId){
			var anchor = JCity.util.getObject(anchorId);
			var position = new Object();

			if(!anchor) return 0;

			if(document.all || document.getElementById){
				position.y = anchor.offsetTop;
				while(anchor = anchor.offsetParent){
					position.y += anchor.offsetTop;
				}
			}else if(document.layers){
				position.y = document.anchors[anchorId].y;
			}else{
				position.y = 0;
			}
			return position.y;
		},
		scrollToDestination : function(moveDown, toX, toY, currentX, currentY){
			var scrollTimer;

			if(!toY || toY < 0) toY = 0;
			if(!toX || toX < 0) toX = 0;
			if(!currentX) currentX = this.getScrollLeft();
			if(!currentY) currentY = this.getScrollTop();

			currentX = toX;
			currentY += Math.floor((toY - currentY) * 0.2);
			if(currentY < 0) currentY = 0;
			scrollTo(currentX, currentY);
			scrollTimer = setTimeout("JCity.util.scroll.scrollToDestination(" + moveDown + "," + toX + "," + toY + "," + currentX + "," + currentY + ")", 16);
			var modulus = moveDown ? 5 : 0;
			if(Math.floor(Math.abs(currentY - toY) < modulus) || toY == currentY) clearTimeout(scrollTimer);
		},
		toPageTop : function(){
			this.scrollToDestination(0, 0, 0);
			return false;
		},
		toAnchor : function(toAnchor){
			var toY = this.getAnchorPosition(toAnchor);
			var pageEnd = this.getAnchorPosition("footer");

			if(pageEnd > 0){
				var range = pageEnd - this.getClientHeight();
				if(range < toY) toY = range;
			}

			this.scrollToDestination((toY > this.getScrollTop()) ? 1 : 0, 0, toY);

			return false;
		}
	},
	getLocate : function(event, tooltip){
		var postionX = 0, postionY = 0;
		var windowHeight = ((window.innerHeight) ? window.innerHeight : document.documentElement.offsetHeight) + (document.body.parentNode.scrollTop ? document.body.parentNode.scrollTop : document.body.scrollTop ? document.body.scrollTop : window.pageYOffset ? window.pageYOffset : 0);
		var windowWidth = ((window.innerWidth) ? window.innerWidth : document.documentElement.offsetWidth) + (document.body.parentNode.scrollLeft ? document.body.parentNode.scrollLeft : document.body.scrollLeft ? document.body.scrollLeft : window.pageXOffset ? window.pageXOffset : 0);
		var boxWidth = parseInt(tooltip.style.width, 10);
		var escape = false;

		if(!event) event = window.event;
		if(event.pageX || event.pageY){
			postionX = event.pageX;
			postionY = event.pageY;
		}else if(event.clientX || event.clientY){
			postionX = event.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
			postionY = event.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
		}

		postionY -= 260;
		postionX -= 300;

		if((postionY + 300) > windowHeight){
			postionY += 300;
			postionX += 25;
			escape = true;
		}

		if((boxWidth + postionX) > windowWidth){
			if(escape){
				postionX -= (boxWidth + 35);
			}else{
				postionX -= boxWidth / 2;
			}
		}

		postionY = postionY - 300;
		postionX += 100;
		tooltip.style.top = postionY + "px";
		tooltip.style.left = postionX + "px";
	},
	getStyle : function(element, style){
		if(!element || !style) return null;

		var value = element.style[style];

		if(!value){
			var css = element.currentStyle || document.defaultView.getComputedStyle(element, null);
			value = css ? css[style] : null;
		}

		return (style == "opacity" ? (value ? parseFloat(value) : 1.0) : value);
	}
}

/* JCity.Ajax
***************************************************************/
JCity.ajax = {
	createHttpRequest : function(){
		var httpRequest = null;
		if(window.XMLHttpRequest){
			try{
				httpRequest = new XMLHttpRequest();
			}catch(e){
				httpRequest = false;
			}
 		}else if(window.ActiveXObject){
			try{
				httpRequest = new ActiveXObject('Msxml2.XMLHTTP');
			}catch(e){
				try{
					httpRequest = new ActiveXObject('Microsoft.XMLHTTP');
				}catch(e){
					httpRequest = false;
				}
  			}
		}
		return httpRequest;
	},
	sendHttpRequest : function(uri, arg, callback, method){
		var httpHandler = this.createHttpRequest();
		var callbackOnload = false;
		var module = this;
		var parameter = null;

		method = (method ? method : "POST").toUpperCase();

		if(httpHandler){
			if(callback){
				callbackOnload = (typeof(callback) == "object") ? callback.onload : callback;
			}

			if(JCity.env.userAgent.safari || JCity.env.userAgent.opera || JCity.env.userAgent.gecko){
				httpHandler.onload = function(){
					if(httpHandler.readyState == 4 && module.isHttpStatus(httpHandler)){
						if(callbackOnload) callbackOnload(httpHandler);
					}
				}
			}else{
				httpHandler.onreadystatechange = function(){
					if(httpHandler.readyState == 4 && module.isHttpStatus(httpHandler)){
						if(callbackOnload) callbackOnload(httpHandler);
					}
				}
			}

			if(method == "POST"){
				uri = this.uriEncoder(uri);
				parameter = this.createParam(arg);
			}else{
				uri = this.uriEncoder(uri, arg);
				parameter = "";
			}

			httpHandler.open(method, uri, (callbackOnload ? true : false));
			httpHandler = this.setEncodeHeader(httpHandler);
			httpHandler.send("");

			if(!callbackOnload){
				if(module.isHttpStatus(httpHandler)){
					return httpHandler.responseText;
				}else{
					return "";
				}
			}else{
				return true;
			}
		}
		return false;
	},
	isHttpStatus : function(handler){
		var httpCode = handler.status;
		return Boolean(((!httpCode) || ((200 <= httpCode) && (300 > httpCode)) || (httpCode == 304)));
	},
	setEncodeHeader : function(httpRequest){
		var contentType = "application/x-www-form-urlencoded; charset=UTF-8";
		if(JCity.env.userAgent.safari || JCity.env.userAgent.opera || JCity.env.userAgent.gecko){
			httpRequest.setRequestHeader("Content-Type", contentType);
		}else{
			if(typeof(httpRequest.setRequestHeader) == "function") httpObj.setRequestHeader("Content-Type", contentType);
		}
		return httpRequest;
	},
	uriEncoder : function(uri, arg){
		var encoded = "";
		var encodedURI = "";

		encoded = this.createParam(arg);
		encoded += "t=" + (new Date()).getTime();
		encodedURI = uri + (uri.match(/\?/) ? "&" : "?") + encoded;

		return encodedURI;
	},
	createParam : function(arg){
		var encoded = "";
		if(typeof(arg) == "object"){
			for(var index in arg){
				encoded += index + "=" + encodeURIComponent(arg[index]) + "&"
			}
		}
		return encoded;
	},
	responseTextFilter : function(text){
		if(JCity.env.userAgent.safari){
			var escaped = escape(text);
			if(escaped.indexOf("%u") < 0 && escaped.indexOf("%") > -1){
				text = decodeURIComponent(escaped);
			}
		}
		return text;
	},
	objectLoader : function(uri, method){
		this.sendHttpRequest(uri, false, JCity.ajax.loadObject, method);
	},
	getObject : function(uri, arg, method){
		try{
			return this.sendHttpRequest(uri, arg, false, method);
		}catch(error){
			throw error;
		}
	},
	getText : function(uri, arg, method){
		try{
			return this.responseTextFilter(this.sendHttpRequest(uri, arg, false, method));
		}catch(error){
			throw error;
		}
	},
	getJSON : function(uri, arg, method){
		try{
			var response = this.responseTextFilter(this.sendHttpRequest(uri, arg, false, method));
			return response ? eval("(" + response + ")") : "";
		}catch(error){
			throw error;
		}
	}
}

/* JCity.google
***************************************************************/
JCity.google = {
	tracker : {
		onLoad : function(){
			if(!document.location.pathname.match(new RegExp("\/" + JCity.sys.conf.analysis.controlPanel + "\/", "i"))){
				var status = JCity.sys.conf.analysis.tracking;
				var account = JCity.sys.conf.analysis.googleAccount;
				if(status && account){
					try{
						var pageTracker = _gat._getTracker(account);
						pageTracker._trackPageview();
					}catch(err){}
				}
			}
		}
	}
}

/* JCity.png
***************************************************************/
JCity.png = {
	alphaChannel : {
		show : function(idName, blank){
			if(navigator.userAgent.match(/MSIE (5\.5|6\.)/)){
				if(target = JCity.util.getObject(idName)){
					var original = "";
					if(target.src){
						original = target.src;
						target.src = blank ? blank : JCity.env.home + "resource/blank.gif";
					}else{
						original = target.style.backgroundImage;
						target.style.backgroundImage = "none";
					}
					target.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=\"1\", src=\"" + original + "\", sizingMethod=\"crop\")";
				}
			}
		}
	}
}

/* JCity.adapter
***************************************************************/
JCity.adapter = {
	add : function(adapterName, options){
		if(adapterName == "prototype" || adapterName == "jquery"){
			JCity.provideAsElement(adapterName + "/" + adapterName + ".js?t=" + (new Date()).getTime());
		}
	}
}

/* JCity.sys
***************************************************************/
JCity.sys = {
	conf : "",
	preLoad : function(prop){
		JCity.sys.conf = prop;
	}
}

/* JCity.event
***************************************************************/
JCity.event = {
	add : function(target, eventName, addObject){
		if(target.attachEvent){
			target.attachEvent("on" + eventName, addObject);
		}else if(target.addEventListener){
			target.addEventListener(eventName, addObject, false);
		}else{
			target["on" + eventName] = target["e" + eventName + addObject];
		}
	},
	createListener : function(eventName){
		/**
		* var listener = new JCity.event.createListener("click");
		* listener.call(document.getElementById("clickable"), function(){
		* 	alert("clicked!");
		* });
		*/

		if(this.attachEvent){
			eventName = "on" + eventName;
			return function(handler){ this.attachEvent(eventName, handler); }
		}else if(this.addEventListener){
			return function(handler){ this.addEventListener(eventName, handler, true); }
		}else{
			return function(handler){ target["on" + eventName] = target["e" + eventName + addObject]; }
		}
	},
	key : {
		isKeyPressEnter : function(event){
			if(window.event){
				event = window.event;
				if((event.type == "keypress" || event.type == "keydown") && (event.keyCode == 13 || event.keyCode == 32)){
					return true;
				}else{
					return false;
				}
			}else{
				if(event && (event.type == "keypress" || event.type == "keydown") && (event.which == 13 || event.which == 32)){
					return true;
				}else{
					return false;
				}
			}
			return false;
		},
		isKeyPressPaste : function(event){
			if(window.event) event = window.event;
			if(event && (event.type == "keypress" || event.type == "keydown") && ((event.ctrlKey && event.which == 86) || (event.shiftKey && event.which == 45))){
				return true;
			}else{
				return false;
			}
			return false;
		},
		isKeyPressEnterWithoutSpace : function(event){
			if(window.event){
				event = window.event;
				if((event.type == "keypress" || event.type == "keydown") && event.keyCode == 13){
					return true;
				}else{
					return false;
				}
			}else{
				if(event && (event.type == "keypress" || event.type == "keydown") && event.which == 13){
					return true;
				}else{
					return false;
				}
			}
			return false;
		}
	},
	preLoad : function(){
		JCity.preLoad();
		JCity.sys.preLoad(JCity.ajax.getJSON(JCity.env.home + "conf/js.conf", "", "GET"));
		JCity.provideAsElement("conf/objects.prop?t=" + (new Date()).getTime());
		JCity.provideAsElement("adapter/prototype.js");
		JCity.provideAsElement("adapter/scriptaculous.js?load=effects");
		JCity.provideAsElement("adapter/scroller/smooth.js");
		JCity.provideAsElement("adapter/cookiemanager/cookiemanager.js");
	},
	preLoadGoogle : function(){
		if(!document.location.pathname.match(new RegExp("\/" + JCity.sys.conf.analysis.controlPanel + "\/", "i"))){
			var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
			document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
		}
	},
	onLoad : function(){
		for(var root in JCity){
			for(var module in JCity[root]){
				if(JCity[root][module] && JCity[root][module].onLoad){
					JCity[root][module].onLoad();
				}
			}
		}
		JCity.png.alphaChannel.show("swapImage");
	}
}

/* Add method "trim" to String object.
***************************************************************/
String.prototype.ltrim = function(){
	return this.replace(/^[\s　]+/, "");
}
String.prototype.rtrim = function(){
	return this.replace(/[\s　]+$/, "");
}
String.prototype.trim = function(){
	return this.replace(/^[\s　]+|[\s　]+$/g, "");
}


/* Add method "addDelimiter" to Number and String objects.
***************************************************************/
Number.prototype.addDelimiter = function(delimiter, digits){
	var str = new String(this).replace(/,/g, "");
	var reg = new RegExp("^(-?\\d+)(\\d{" + (digits || 3) + "})", "g");
	delimiter = delimiter ? delimiter : ",";

	while(str != (str = str.replace(reg, "$1,$2")));

	return str;
}

String.prototype.addDelimiter = Number.prototype.addDelimiter;

/* Add method "rmDelimiter" to String objects.
***************************************************************/
String.prototype.rmDelimiter = function(delimiter, num){
	delimiter = delimiter ? delimiter : ",";
	var str = this.replace(new RegExp(delimiter, "g"), "");

	if(num){
		return new Number(str);
	}else{
		return str;
	}
}

/*==============================================================
   Load Module
==============================================================*/
JCity.event.preLoad();
if(JCity.sys.conf.analysis.tracking){
	JCity.event.preLoadGoogle();
}

JCity.event.add(window, "load", JCity.event.onLoad);

