/**
 * =============================================================
 *  common.js
 * =============================================================
 * @package		X-niX
 * @subpackage	javascript
 * @author		sYoshioka
 * @link		http://www.xnix.com/
 * @copyright	COPYRIGHT (C) 2007 PHENIX CO., LTD. ALL RIGHTS RESERVED.
 * @version		$Id: common.js 75 2008-08-31 20:39:01Z sYoshioka $
 */

var __XNIXROOT = this;

if(!xnix) var xnix = new Object();

xnix = {
	env : {
		home : "",
		coreScriptName : "common.js",
		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)
		},
		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 script;
		var core = new RegExp(this.env.coreScriptName.replace(/\./g, "\\."), "i");

		for(var i=0; script=scripts[i]; i++){
			var src = script.getAttribute("src");
			if(src){
				var result = src.match(core);
				if(result){
					this.env.home = src.substring(0, result.index);
					break;
				}
			}
		}
	},
	provide : function(loading){
		var uri = xnix.env.home + loading.replace(/\./g, "/");
		if(uri.match(/\*$/)){
			this.packageProvide(uri);
		}else{
			this.provideAsElement(uri + ".js");
		}
	},
	packageProvide : function(uri){
		uri = uri.substr(0, uri.length - 1) + this.env.packageName;
		var loadObjects = xnix.ajax.getJSON(uri);

		if(typeof(loadObjects) == "object"){
			for(var index in loadObjects.object){
				this.provide(loadObjects.object[index]);
			}
		}
	},
	include : function(loading){
		var uri = xnix.env.home + loading.replace(/\./g, "/");
		if(uri.match(/\*$/)){
			this.packageInclude(uri);
		}else{
			this.require(uri + ".js");
		}
	},
	require : function(uri){
		xnix.ajax.objectLoader(uri);
	},
	provideAsElement : function(uri){
		var head = document.getElementsByTagName("head").item(0);
		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 = xnix.ajax.getJSON(uri);

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

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

			targets = getProperties("popup"); /*** refer to "objects.prop" ***/

			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(xnix.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(xnix.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.href = "javascript: 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 xnix.util.scroll.toPageTop();
					}
					anchor.onkeypress = function(event){
						if(xnix.event.key.isKeyPressEnter(event)){
							return xnix.util.scroll.toPageTop();
						}
						return true;
					}
				}else if(anchor.className.match(/toAnchor/i)){
					anchor.onclick = function(){
						return xnix.util.scroll.toAnchor(module.getAnchorName(this));
					}
					anchor.onkeypress = function(event){
						if(xnix.event.key.isKeyPressEnter(event)){
							return xnix.util.scroll.toAnchor(module.getAnchorName(this));
						}
						return true;
					}
				}else if(anchor.rel.match(/color_/i)){
					anchor.onclick = function(){
						var swap = xnix.util.getObject("swapPhoto");
						var color = this.rel.replace(/color_/, "");
						swap.src = xnix.ajax.getText("/common/scripts/isExistsFile.php?file=" + this.href + "&color=" + color);
/*
						var path = this.href
						var productId = path.substring(path.lastIndexOf('/', path.length) + 1, path.length).replace(/.html/, "");
						var tab = xnix.util.getObject("product-list");
						var file = tab.href.substring(tab.href.lastIndexOf('/', tab.href.length) + 1, tab.href.length).split("?")[0];
						tab.href = file + "?" + xnix.base64.encode(productId + "&" + color);
*/
						return false;
					}
					anchor.onkeypress = function(event){
						if(xnix.event.key.onKeyPress(event)){
							var swap = xnix.util.getObject("swapPhoto");
							swap.src = xnix.ajax.getText("/common/scripts/isExistsFile.php?file=" + this.href + "&color=" + this.rel.replace(/color_/, ""));
							return false;
						}
						return true;
					}
				}else if(anchor.id.match(/product-list/i)){
					var productId = xnix.base64.decode(location.search.substr(1));
					if(productId){
						var fileName = productId + ".html";
						if(xnix.ajax.getText("/common/scripts/isExistsFile.php?detail=" + fileName + "&file=" + anchor.href) == "true"){
							anchor.href = productId + ".html";
						}
					}
				}else{
					for(var j=0; target=targets[j]; j++){
						if(anchor.href.match(target.pattern)){
							anchor.window_prop = target;
							anchor.onclick = function(){
								return module.openWindow(this);
							}
							anchor.onkeypress = function(event){
								if(xnix.event.key.isKeyPressEnter(event)){
									return module.openWindow(this);
								}
								return true;
							}
						}
					}
				}
			}
		},
		openWindow : function(anchor){
			return xnix.util.openWindow(anchor, anchor.window_prop);
		},
		openWindowExternal : function(anchor){
			return xnix.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++){
				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] = xnix.util.newImage(img.oversrc);

					img.onmouseover = function(){ this.src = this.oversrc; }
					img.onmouseout = function(){ this.src = this.defaultsrc; }
				}
			}
		}
	},
	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 = xnix.util.getObject(objId);
							if(obj.disabled){
								obj.style.background = "#fff";
								obj.disabled = false;
							}else{
								obj.style.background = "#ccc";
								obj.disabled = true;
							}
						}
						input.onkeypress = function(event){
							if(xnix.event.key.isKeyPressEnter(event)){
								var objId = this.className.replace(/column\-disable\-/, "");
								var obj = xnix.util.getObject(objId);
								if(obj.disabled){
									obj.style.background = "#fff";
									obj.disabled = false;
								}else{
									obj.style.background = "#ccc";
									obj.disabled = 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((xnix.env.userAgent.safari && target.type == "checkbox") || target.type == "radio"){
						module.ticked(target);
					}else if(target.type == "text" || target.type == "password" || target.type == "textarea"){
						xnix.util.focusObject(target);
					}
				}
				label.onkeypress = function(event){
					if(xnix.event.key.isKeyPressEnter(event)){
						var target = module.getTarget(this);
						if(xnix.env.userAgent.safari && target.type == "checkbox"){
							module.ticked(target);
						}
					}
				}
				label.onmouseover = function(){
					this.style.cursor = "default";
				}
			}
		},
		getTarget : function(label){
			return xnix.util.getObject(label.htmlFor);
		},
		ticked : function(target){
			target.checked = !(target.checked);
		}
	},
	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(xnix.event.key.isKeyPressEnter(event)){
							window.close();
						}
					}
				}
			}
			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" && xnix.sys.conf.column.swapBgColor){
					input.onfocus = function(){
						this.defaultbgcolor = this.style.backgroundColor;
						this.defaultcolor = this.style.color;
						this.style.backgroundColor = xnix.sys.conf.column.backgroundColor;
						this.style.color = xnix.sys.conf.column.color;
						xnix.util.selectText(this);
					}
					input.onblur = function(){
						this.style.backgroundColor = this.defaultbgcolor;
						this.style.color = this.defaultcolor;
					}
				}else{
					input.onfocus = function(){
						xnix.util.selectText(this);
					}
				}
				if(input.className.match(/select/i)){
					xnix.util.focusObject(input);
				}
				if(input.className.match(/disabled/i)){
					input.style.color = "#999";
					if(input.type == "text"){
						input.style.backgroundColor = "#ddd";
					}
					input.disabled = true;
				}
			}
		}
	}
}

/* xnix.util
*******************************************************************************/
xnix.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, 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 win = window.open(anchor, "external");
		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(target.pattern)){
				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 "";
	},
	focusObject : function(target){
		target.focus();
		this.selectText(target);
	},
	selectText : function(target){
		if(xnix.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 = xnix.util.getObject(anchorId);
			var position = new Object();

			if(!anchor) return 0;

			if(document.all || document.getElementById){
				position.y = anchor.offsetTop;
				for(var i=0; anchor = anchor.offsetParent; i++){
					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;
			if(!toX) 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("xnix.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;
		}
	},
	loadGoogleAnaytics : function(){
		_uacct = xnix.sys.conf.analysis.google_uacct;
		urchinTracker();
	},
	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";
	}
}

/* xnix.Ajax
*******************************************************************************/
xnix.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;

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

			if(xnix.env.userAgent.safari || xnix.env.userAgent.opera || xnix.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);
					}
				}
			}

			uri = this.uriEncoder(uri, arg);

			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(xnix.env.userAgent.safari || xnix.env.userAgent.opera || xnix.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 = "";
		if(typeof(arg) == "object"){
			for(var index in arg){
				encoded += index + "=" + encodeURIComponent(arg[index]) + "&"
			}
		}
		encoded += "t=" + (new Date()).getTime();
		encodedURI = uri + (uri.match(/\?/) ? "&" : "?") + encoded;
		return encodedURI;
	},
	responseTextFilter : function(text){
		if(xnix.env.userAgent.safari){
			var escaped = escape(text);
			if(escaped.indexOf("%u") < 0 && escaped.indexOf("%") > -1){
				text = decodeURIComponent(escaped);
			}
		}
		return text;
	},
	objectLoader : function(uri){
		this.sendHttpRequest(uri, false, xnix.ajax.loadObject, "GET");
	},
	getObject : function(uri, arg){
		return this.sendHttpRequest(uri, arg, false, "GET");
	},
	getText : function(uri, arg){
		return this.responseTextFilter(this.sendHttpRequest(uri, arg, false, "GET"));
	},
	getJSON : function(uri, arg){
		var response = this.responseTextFilter(this.sendHttpRequest(uri, arg, false, "GET"));
		return response ? eval("(" + response + ")") : "";
	}
}

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

/* xnix.event
*******************************************************************************/
xnix.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 xnix.event.createListener("click");
		* listener.call(document.getElementById("clickable"), funcClicked);
		* function funcClicked(){
		* 	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.keyCode == 13 || event.keyCode == 32)){
					return true;
				}else{
					return false;
				}
			}else{
				if(event && event.type == "keypress" && (event.which == 13 || event.which == 32)){
					return true;
				}else{
					return false;
				}
			}
			return false;
		},
		isKeyPressEnterWithoutSpace : function(event){
			if(window.event){
				event = window.event;
				if(event.type == "keypress" && event.keyCode == 13){
					return true;
				}else{
					return false;
				}
			}else{
				if(event && event.type == "keypress" && event.which == 13){
					return true;
				}else{
					return false;
				}
			}
			return false;
		}
	},
	preLoad : function(){
		xnix.preLoad();
		xnix.sys.preLoad(xnix.ajax.getJSON(xnix.env.home + "conf/js.conf?t=" + (new Date()).getTime()));
		xnix.provideAsElement(xnix.env.home + "conf/objects.prop?t=" + (new Date()).getTime());
		xnix.provideAsElement(xnix.env.home + "com/xnix/base64.js");
	},
	onLoad : function(){
		for(var root in xnix){
			for(var module in xnix[root]){
				if(xnix[root][module] && xnix[root][module].onLoad){
					xnix[root][module].onLoad();
				}
			}
		}
	}
}

/* Add method
*******************************************************************************/
String.prototype.ltrim = function(){
	return this.replace(/^\n|^\s*/, "");
}
String.prototype.rtrim = function(){
	return this.replace(/\s*$|\n$/, "");
}
String.prototype.trim = function(){
	return this.ltrim().rtrim();
}

/*=============================================================================
   Load Module
 =============================================================================*/
xnix.event.preLoad();
xnix.event.add(window, "load", xnix.event.onLoad);
