// -----------------------------------------------------------------------------
// ASTER GDEM script library / common
// -----------------------------------------------------------------------------

// control : [ActionButton/ActionCheckBox/ActionRadioButtonSet]
var ActionButtonBase = function(elementId, type, clickedFunction)
{
	this.id = elementId;
	this.buttonElement = document.getElementById(elementId);
	this.buttonElement.style.backgroundRepeat = "no-repeat";
	this.buttonHeight = this.buttonElement.offsetHeight;
	this.isEnabled = true;
	this.buttonElement.style.cursor = this.isEnabled? "pointer": "default";
	this.checked = false;
	this.type = type;
	this.clickedFunction = clickedFunction;
	this.changeImage();
	this.buttonElement.actionButtonBase = this;
	addListener(this.buttonElement, "mouseover", this.mouseoverFunction, false);
	addListener(this.buttonElement, "mouseout", this.mouseoutFunction, false);
	addListener(this.buttonElement, "mousedown", this.mousedownFunction, false);
	addListener(this.buttonElement, "mouseup", this.mouseupFunction, false);
}
ActionButtonBase.TYPE_BUTTON = 0;
ActionButtonBase.TYPE_CHECK_BOX = 1;
ActionButtonBase.TYPE_RADIO_BUTTON = 2;
ActionButtonBase.prototype =
{
	id : null,
	buttonElement : null,
	buttonHeight : null,
	isEnabled : true,
	isFocused : false,
	isDown : false,
	type : ActionButtonBase.TYPE_BUTTON,
	clickedFunction : null,
	buttonMouseUpFunction : null,
	buttonMouseDownFunction : null,
	mouseoverFunction : function(e)
	{
		var buttonElement = getEventTargetElement(e);
		var actionButtonBase = buttonElement.actionButtonBase;
		if(actionButtonBase.isEnabled == false) return;
		if((actionButtonBase.type == ActionButtonBase.TYPE_RADIO_BUTTON) && (actionButtonBase.isDown == true)) return;
		actionButtonBase.isFocused = true;
		actionButtonBase.changeImage();
	},
	mouseoutFunction : function(e)
	{
		var buttonElement = getEventTargetElement(e);
		var actionButtonBase = buttonElement.actionButtonBase;
		if(actionButtonBase.isEnabled == false) return;
		actionButtonBase.isFocused = false;
		if(actionButtonBase.type == ActionButtonBase.TYPE_BUTTON) actionButtonBase.isDown = false;
		actionButtonBase.changeImage();
		if(actionButtonBase.buttonMouseUpFunction) actionButtonBase.buttonMouseUpFunction(actionButtonBase);
	},
	mousedownFunction : function(e)
	{
		var buttonElement = getEventTargetElement(e);
		var actionButtonBase = buttonElement.actionButtonBase;
		if(actionButtonBase.isEnabled == false) return;
		if((actionButtonBase.type == ActionButtonBase.TYPE_RADIO_BUTTON) && (actionButtonBase.isDown == true)) return;
		if(actionButtonBase.type == ActionButtonBase.TYPE_RADIO_BUTTON) actionButtonBase.isFocused = false;
		if(actionButtonBase.type != ActionButtonBase.TYPE_CHECK_BOX) actionButtonBase.isDown = true;
		else actionButtonBase.isDown = !actionButtonBase.isDown;
		actionButtonBase.changeImage();
		if((actionButtonBase.type != ActionButtonBase.TYPE_BUTTON) && (actionButtonBase.clickedFunction)) actionButtonBase.clickedFunction(actionButtonBase);
		if(actionButtonBase.buttonMouseDownFunction) actionButtonBase.buttonMouseDownFunction(actionButtonBase);
		if(actionButtonBase.type == ActionButtonBase.TYPE_RADIO_BUTTON) buttonElement.style.cursor = "default";
	},
	mouseupFunction : function(e)
	{
		var buttonElement = getEventTargetElement(e);
		var actionButtonBase = buttonElement.actionButtonBase;
		if(actionButtonBase.isEnabled == false) return;
		if(actionButtonBase.type != ActionButtonBase.TYPE_BUTTON) return;
		if(actionButtonBase.isDown == false) return;
		actionButtonBase.isDown = false;
		actionButtonBase.changeImage();
		if(actionButtonBase.clickedFunction) actionButtonBase.clickedFunction(actionButtonBase);
		if(actionButtonBase.buttonMouseUpFunction) actionButtonBase.buttonMouseUpFunction(actionButtonBase);
	},
	changeImage : function()
	{
		var imageIndex = 0;
		if(this.isEnabled == true)
		{
			if(this.isFocused == false) imageIndex = (this.isDown == false)? 1: 4;
			else imageIndex = (this.isDown == false)? 2: 3;
		}
		else
		{
			imageIndex = (this.isDown == false)? 0: 5;
		}
		this.buttonElement.style.backgroundPosition = "0 -" + (this.buttonHeight * imageIndex) + "px";
	},
	setEnablement : function(isEnabled)
	{
		this.isEnabled = isEnabled;
		this.changeImage();
		this.buttonElement.style.cursor = this.isEnabled? "pointer": "default";
	},
	setChecked : function(isDown)
	{
		this.isDown = isDown;
		this.changeImage();
		this.buttonElement.style.cursor = this.isEnabled? "pointer": "default";
	}
}
function createActionButton(elementId, clickedFunction)
{
	return new ActionButtonBase(elementId, ActionButtonBase.TYPE_BUTTON, clickedFunction);
}
function createActionCheckBox(elementId, changedFunction)
{
	return new ActionButtonBase(elementId, ActionButtonBase.TYPE_CHECK_BOX, changedFunction);
}
var ActionRadioButtonSet = function()
{
	this.radioButtonSet = new Array();
	this.changedFunction = ActionRadioButtonSet.arguments[ActionRadioButtonSet.arguments.length - 1];
	for(var i = 0, n = ActionRadioButtonSet.arguments.length - 1; i < n; i++)
	{
		var elementId = ActionRadioButtonSet.arguments[i];
		var radioButton = new ActionButtonBase(elementId, ActionButtonBase.TYPE_RADIO_BUTTON, this.memberChangedFunction);
		radioButton.actionRadioButtonSet = this;
		this.radioButtonSet.push(radioButton);
	}
}
ActionRadioButtonSet.prototype =
{
	radioButtonSet : null,
	changedFunction : null,
	selectedIndex : -1,
	memberChangedFunction : function(buttonElement)
	{
		var actionRadioButtonSet = this.actionRadioButtonSet;
		var radioButtonSet = this.actionRadioButtonSet.radioButtonSet;
		for(var i = 0, n = radioButtonSet.length; i < n; i++)
		{
			if(radioButtonSet[i] == buttonElement)
			{
				actionRadioButtonSet.selectedIndex = i;
				continue;
			}
			if(radioButtonSet[i].isDown)
			{
				radioButtonSet[i].setChecked(false);
			}
		}
		if(actionRadioButtonSet.changedFunction) actionRadioButtonSet.changedFunction(actionRadioButtonSet);
	},
	setEnablement : function(isEnabled)
	{
		for(var i = 0, n = this.radioButtonSet.length; i < n; i++)
		{
			this.radioButtonSet[i].setEnablement(isEnabled);
		}
	},
	select : function(index)
	{
		for(var i = 0, n = this.radioButtonSet.length; i < n; i++)
		{
			this.radioButtonSet[i].setChecked((i == index)? true: false);
		}
		this.selectedIndex = index;
		if(this.changedFunction) this.changedFunction(this);
	}
}

// control : [CheckBox]
var CheckBox = function(elementId, changedFunction)
{
	this.id = elementId;
	this.checkBoxElement = document.getElementById(elementId);
	this.changedFunction = changedFunction;
	this.checkBoxElement.checkBox = this;
	addListener(this.checkBoxElement, "keypress", this.operatedFunction, false);
	addListener(this.checkBoxElement, "click", this.operatedFunction, false);
}
CheckBox.prototype =
{
	id : null,
	checkBoxElement : null,
	changedFunction : null,
	operatedFunction : function(e)
	{
		var checkBoxElement = getEventTargetElement(e);
		var checkBox = checkBoxElement.checkBox;
		if(checkBox.changedFunction) checkBox.changedFunction(checkBox);
	}
}

// control : [Label]
var Label = function(elementId)
{
	this.id = elementId;
	this.labelElement = document.getElementById(elementId);
}
Label.prototype =
{
	id : null,
	labelElement : null,
	setText : function(text)
	{
		this.labelElement.innerHTML = text;
	}
}

// control : [Items]
var Items = function(elementId)
{
	this.itemsElement = document.getElementById(elementId);
	this.id = elementId;
}
Items.prototype =
{
	id : null,
	itemsElement : null,
	clear : function()
	{
		this.itemsElement.innerHTML = "";
	},
	addItem : function(text)
	{
		var liElement = document.createElement("li");
		liElement.appendChild(document.createTextNode(text));
		this.itemsElement.appendChild(liElement);
	}
}

// control handling
function getScrollPosition(window)
{
	var scrollPosition = new Object();
	scrollPosition.left = window.document.body.scrollLeft;
	scrollPosition.top = window.document.body.scrollTop;
	//scrollPosition.left = window.pageXOffset;
	//scrollPosition.top = window.pageYOffset;
	return scrollPosition;
}
function getClientSize(window)
{
	var clientSize = new Object();
	clientSize.width = window.document.body.clientWidth;
	clientSize.height = window.document.body.clientHeight;
	//clientSize.width = window.innerWidth;
	//clientSize.height = window.innerHeight;
	return clientSize;
}
function getElementPosition(element)
{
	var elementPosition = new Object();
	elementPosition.left = element.offsetLeft;
	elementPosition.top = element.offsetTop;
	return elementPosition;
}
function getElementAbsolutePosition(element)
{
	var elementPosition = new Object();
	elementPosition.left = element.offsetLeft;
	elementPosition.top = element.offsetTop;
	while(true)
	{
		element = element.offsetParent;
		if(!element) {break;}
		elementPosition.left += element.offsetLeft;
		elementPosition.top += element.offsetTop;
	}
	return elementPosition;
}
function setElementPosition(element, elementLeft, elementTop)
{
	element.style.left = elementLeft + "px";
	element.style.top = elementTop + "px";
}
function getElementSize(element)
{
	var elementSize = new Object();
	elementSize.width = element.offsetWidth;
	elementSize.height = element.offsetHeight;
	return elementSize;
}
var SET_SIZE_NO = -1;
var SET_SIZE_100_PERCENT = 0;
function setElementSize(element, elementWidth, elementHeight)
{
	var adjustedWidth = elementWidth;
	var adjustedHeight = elementHeight;
	if(!isBrowser_IE_appName() && !isBrowser_Opera())
	{
		if(0 < adjustedWidth)
		{
			var borderLeftWidth = getStyleValue(element.style.borderLeftWidth);
			var borderRightWidth = getStyleValue(element.style.borderRightWidth);
			var paddingLeft = getStyleValue(element.style.paddingLeft);
			var paddingRight = getStyleValue(element.style.paddingRight);
			adjustedWidth -= borderLeftWidth + borderRightWidth + paddingLeft + paddingRight;
		}
		if(0 < adjustedHeight)
		{
			var borderTopWidth = getStyleValue(element.style.borderTopWidth);
			var borderBottomWidth = getStyleValue(element.style.borderBottomWidth);
			var paddingTop = getStyleValue(element.style.paddingTop);
			var paddingBottom = getStyleValue(element.style.paddingBottom);
			adjustedHeight -= borderTopWidth + borderBottomWidth + paddingTop + paddingBottom;
		}
	}

	if(adjustedWidth == SET_SIZE_100_PERCENT) {adjustedWidth = "100%";}
	else if(adjustedWidth == SET_SIZE_NO) {adjustedWidth = "";}
	else if(0 < adjustedWidth) {adjustedWidth = adjustedWidth + "px";}
	else {adjustedWidth = "";}
	if(adjustedHeight == SET_SIZE_100_PERCENT) {adjustedHeight = "100%";}
	else if(adjustedHeight == SET_SIZE_NO) {adjustedHeight = "";}
	else if(0 < adjustedHeight) {adjustedHeight = adjustedHeight + "px";}
	else {adjustedHeight = "";}

	if(adjustedWidth != "")
	{
		element.style.width = adjustedWidth;
	}
	if(adjustedHeight != "")
	{
		element.style.height = adjustedHeight;
	}
}
function isVisible(element)
{
	if(element.style.visibility == "visible") {return true;}
	else if(element.style.visibility == "hidden") {return false;}
	else {return true;}
}
function setVisible(element, isVisible)
{
	if(isVisible == true)
	{
		if(element.style.visibility == "hidden")
		{
			//element.style.visibility = "visible";
			element.style.visibility = "inherit";
			//element.style.visibility = null;
		}
	}
	else
	{
		if(element.style.visibility != "hidden")
		{
			element.style.visibility = "hidden";
		}
	}
}
function setOpacity(element, opacity)
{
	if(isBrowser_Opera()) return;
	if(isBrowser_IE_appName())
	{
		element.style.filter = "alpha(opacity=" + opacity + ")";
	}
	else
	{
		var opacityPercent = opacity / 100;
		element.style.MozOpacity = opacityPercent;
		element.style.opacity = opacityPercent;
	}
}
function getOpaqueValue()
{
	if(isBrowser_Netscape() && !isBrowser_Firefox()) return 99;
	return 100;
}
function getStyleValue(styleValue)
{
	if(styleValue == "") {return 0;}
	return parseInt(styleValue, 10);
}
function setTextboxEnablement(element, isEnabled)
{
	element.disabled = !isEnabled;
	if(isBrowser_IE_appName())
	{
		if(isEnabled)
		{
			element.style.backgroundColor = "";
		}
		else
		{
			element.style.backgroundColor = "#EEEEEE";
//			element.style.borderStyle = "solid";
		}
	}
}
function appendSelectionToPulldown(pulldownElement, text)
{
	appendSelectionToPulldownWithValue(pulldownElement, text, null);
}
function appendSelectionToPulldownWithValue(pulldownElement, text, value)
{
	var newSelectionElement = document.createElement("option");
	var newTextNode = document.createTextNode(text);
	newSelectionElement.appendChild(newTextNode);
	newSelectionElement.value = value? value: text;
	pulldownElement.appendChild(newSelectionElement);
}
function removeAllSelectionFromPulldown(pulldownElement)
{
	for(var i = pulldownElement.childNodes.length - 1; 0 <= i; i--)
	{
		var childNode = pulldownElement.childNodes[i];
		pulldownElement.removeChild(childNode);
	}
}
function getSelectedTextFromPulldown(pulldownElement)
{
	// notes: value get by directry as "element.value"
	var selectedIndex = pulldownElement.selectedIndex;
	if(pulldownElement.options.length <= selectedIndex) {return "";}
	return pulldownElement.options[selectedIndex].text;
}

// message box
var ZINDEX_MESSAGE_BOX = 10000;
var MESSAGE_BOX_BUTTON_WIDTH = 50;
var MESSAGE_BOX_BUTTON_HEIGHT = 20;
var MESSAGE_BOX_BUTTON_RIGHT_MARGIN = 10;
var MESSAGE_BOX_BUTTON_GAP = 5;
var MESSAGE_BOX_BUTTON_TOP_OFFSET = 25;
var MESSAGE_BOX_OPACITY = 80;
var MESSAGE_BOX_OPACITY_OPENING = 30;
var MESSAGE_BOX_OPACITY_CLOSING = 30;
preLoadImage("images/button_message_box_confirm_ok.png");
preLoadImage("images/button_message_box_confirm_cancel.png");
preLoadImage("images/button_message_box_error_ok.png");
preLoadImage("images/button_message_box_error_cancel.png");
function showMessage(ownerElement, left, top, width, height, message)
{
	showMessageBox(ownerElement, left, top, width, height, message, false, null, null);
}
function doConfirm(ownerElement, left, top, width, height, message, okFunction, cancelFunction)
{
	showMessageBox(ownerElement, left, top, width, height, message, true, okFunction, cancelFunction);
}
function showMessageBox(ownerElement, left, top, width, height, message, doConfirm, okFunction, cancelFunction)
{
	// disable page
	disablePage();

	// adjust position
	var ownerPosition;
	if(isBrowser_IE_appName()) ownerPosition = getElementAbsolutePosition(ownerElement);
	else ownerPosition = getElementPosition(ownerElement);
	left += ownerPosition.left;
	top += ownerPosition.top;

	// create message box
	var messageBoxElement = document.createElement("div");
	messageBoxElement.style.position = "absolute";
	messageBoxElement.style.zIndex = ZINDEX_MESSAGE_BOX;
	if(doConfirm == true) messageBoxElement.style.backgroundColor = "#FFDD22";
	else messageBoxElement.style.backgroundColor = "#FF6644";
	if(doConfirm == true) messageBoxElement.style.border = "1px solid #AA8800";
	else messageBoxElement.style.border = "1px solid #BB2200";
	setOpacity(messageBoxElement, MESSAGE_BOX_OPACITY_OPENING);

	// create message
	var messageElement = document.createElement("div");
	messageElement.style.position = "absolute";
	setElementPosition(messageElement, 10, 5);
	if(doConfirm == true) messageElement.style.color = "#1A1500";
	else messageElement.style.color = "#300700";
	messageElement.style.fontSize = "14px";
	messageElement.style.fontWeight = "bold";
	var messageTextElement = document.createTextNode(message);
	messageElement.appendChild(messageTextElement);

	// create OK button
	var buttonOkElement = document.createElement("div");
	buttonOkElement.id = "button_message_box_ok";
	buttonOkElement.style.position = "absolute";
	setElementSize(buttonOkElement, MESSAGE_BOX_BUTTON_WIDTH, MESSAGE_BOX_BUTTON_HEIGHT);
	var buttonLeft = width - (MESSAGE_BOX_BUTTON_WIDTH + MESSAGE_BOX_BUTTON_RIGHT_MARGIN);
	if(doConfirm == true) buttonLeft -= (MESSAGE_BOX_BUTTON_WIDTH + MESSAGE_BOX_BUTTON_GAP);
	var buttonTop = height - MESSAGE_BOX_BUTTON_TOP_OFFSET;
	setElementPosition(buttonOkElement, buttonLeft, buttonTop);
	if(doConfirm == true) buttonOkElement.style.backgroundImage = "url(images/button_message_box_confirm_ok.png)";
	else buttonOkElement.style.backgroundImage = "url(images/button_message_box_error_ok.png)";

	// create Cancel button
	if(doConfirm == true)
	{
		var buttonCancelElement = document.createElement("div");
		buttonCancelElement.id = "button_message_box_cancel";
		buttonCancelElement.style.position = "absolute";
		setElementSize(buttonCancelElement, MESSAGE_BOX_BUTTON_WIDTH, MESSAGE_BOX_BUTTON_HEIGHT);
		buttonLeft = width - (MESSAGE_BOX_BUTTON_WIDTH + MESSAGE_BOX_BUTTON_RIGHT_MARGIN);
		setElementPosition(buttonCancelElement, buttonLeft, height - buttonTop);
		if(doConfirm == true) buttonCancelElement.style.backgroundImage = "url(images/button_message_box_confirm_cancel.png)";
		else buttonCancelElement.style.backgroundImage = "url(images/button_message_box_error_cancel.png)";
	}

	// show message box
	var currentWidth = 2;
	var isFirstTime = true;
	var showingMessageBox = function()
	{
		currentWidth += 20;
		if(width < currentWidth) currentWidth = width;
		setElementSize(messageBoxElement, currentWidth, height);
		var currentLeft = left + ((width - currentWidth) / 2);
		setElementPosition(messageBoxElement, currentLeft, top);
		if(isFirstTime == true)
		{
			isFirstTime = false;
			ownerElement.appendChild(messageBoxElement);
		}
		if(currentWidth < width) return;
		window.clearInterval(timerIdShowMessageBox);
		setOpacity(messageBoxElement, MESSAGE_BOX_OPACITY);
		messageBoxElement.appendChild(messageElement);
		messageBoxElement.appendChild(buttonOkElement);
		if(doConfirm == true) messageBoxElement.appendChild(buttonCancelElement);
		var buttonClicked = function(actionButton)
		{
			messageBoxElement.removeChild(messageElement);
			messageBoxElement.removeChild(buttonOkElement);
			if(doConfirm == true) messageBoxElement.removeChild(buttonCancelElement);
			setOpacity(messageBoxElement, MESSAGE_BOX_OPACITY_CLOSING);
			var hideMessageBox = function()
			{
				currentWidth -= 20;
				if(currentWidth <= 0)
				{
					window.clearInterval(timerIdHideMessageBox);
					ownerElement.removeChild(messageBoxElement);
					if(actionButton.id == "button_message_box_ok")
					{
						if(okFunction) okFunction();
					}
					if(actionButton.id == "button_message_box_cancel")
					{
						if(cancelFunction) cancelFunction();
					}
					enablePage();
					return;
				}
				setElementSize(messageBoxElement, currentWidth, height);
				var currentLeft = left + ((width - currentWidth) / 2);
				setElementPosition(messageBoxElement, currentLeft, top);
			}
			var timerIdHideMessageBox = window.setInterval(hideMessageBox, 10);
		}
		createActionButton("button_message_box_ok", buttonClicked);
		if(doConfirm == true) createActionButton("button_message_box_cancel", buttonClicked);
	}
	var timerIdShowMessageBox = window.setInterval(showingMessageBox, 10);
}

// event handling
function addListenerWithElementId(elementId, eventType, func, capture)
{
	var element = document.getElementById(elementId);
	addListener(element, eventType, func, capture);
}
function addListener(element, eventType, func, capture)
{
	if(element.addEventListener)
	{
		element.addEventListener(eventType, func, capture);
	}
	else if(element.attachEvent)
	{
		element.attachEvent("on" + eventType, func);
	}
	else
	{
		browserError();
		return false;
	}
}
function addMouseWheelListener(element, func, capture)
{
	if(element.addEventListener)
	{
		element.addEventListener("DOMMouseScroll", func, capture);
		element.addEventListener("mousewheel", func, capture);
	}
	else if(element.attachEvent)
	{
		element.attachEvent("onmousewheel", func);
	}
}
function removeListener(element, eventType, func, capture)
{
	if(element.removeEventListener)
	{
		element.removeEventListener(eventType, func, capture);
	}
	else if(element.detachEvent)
	{
		element.detachEvent("on" + eventType, func);
	}
}
function getEventTargetElement(e)
{
	var targetElement;
	if(e.target)
	{
		targetElement = e.target;
	}
	else
	{
		targetElement = e.srcElement;
	}
	if(targetElement.nodeType == 3)
	{
		targetElement = targetElement.parentNode;
	}
	return targetElement;
}
function stopEventBubblingAndDefaultAction(e)
{
	// stop event bubbling
	stopEventBubbling(e);

	// stop default event action
	stopDefaultEventAction(e);
}
function stopEventBubbling(e)
{
	// stop bubbling
	if(e.stopPropagation)
	{
		e.stopPropagation();
	}
	if(window.event)
	{
		window.event.cancelBubble = true;
	}
}
function stopDefaultEventAction(e)
{
	// stop default event event action
	if(e.preventDefault)
	{
		e.preventDefault();
	}
	if(window.event)
	{
		window.event.returnValue = false;
	}
}

// form
function setFocusToFirstField()
{
	var inputElements = document.getElementsByTagName("input");
	if(0 < inputElements.length) inputElements[0].focus();
}
function submitForm(elementId, action)
{
	var element = document.getElementById(elementId);
	element.action = action;
	element.submit();
}

// page control
var ZINDEX_COVER_PANEL = 9999;
var coverElement = null;
function disablePage()
{
	// prepare cover panel
	if(coverElement == null)
	{
		// get document height
		var bodyElement = document.getElementsByTagName("body")[0];
		var documentHeight = bodyElement.scrollHeight;

		// create cover panel
		coverElement = document.createElement("div");
		document.body.appendChild(coverElement);
		coverElement.style.position = "absolute";
		setElementPosition(coverElement, 0, 0);
		setElementSize(coverElement, SET_SIZE_100_PERCENT, documentHeight);
		coverElement.style.zIndex = ZINDEX_COVER_PANEL;
		if(isBrowser_IE_appName())
		{
			coverElement.style.backgroundColor = "white";
			setOpacity(coverElement, 0);
		}
	}

	// show cover panel
	setVisible(coverElement, true);
}
function enablePage()
{
	// hide cover panel
	if(coverElement != null)
	{
		setVisible(coverElement, false);
	}
}
function transferPage(url)
{
	window.location.href = url;
}

// resources
var preLoadImages = null;
function preLoadImage(url)
{
	var newImage = new Image();
	newImage.src = url;
	if(preLoadImages == null) preLoadImages = new Array();
	preLoadImages.push(newImage);
}

// cookie management
function getCookieValue(key)
{
	var cookieValues = getCookieKeyAndValues();
	for(cookieKey in cookieValues)
	{
		//devTrace("(" + cookieKey + ") [" + cookieValues[cookieKey] + "]");
		if(cookieKey == key) return cookieValues[cookieKey];
	}
	return null;
}
function getCookieKeyAndValues()
{
	//devTrace(document.cookie);
	var valueTexts = document.cookie.split(";");
	var cookieValues = new Array();
	for(var i = 0, n = valueTexts.length; i < n; i++)
	{
		var valueText = valueTexts[i];
		var posStart = 0;
		for(var m = valueText.length; posStart < m; posStart++)
		{
			if(valueText.charAt(posStart) != " ") break;
		}
		var posEnd = valueText.length - 1;
		for(; 0 <= posEnd; posEnd--)
		{
			if(valueText.charAt(posEnd) != " ") break;
		}
		valueText = valueText.substring(posStart, posEnd + 1);
		if(!valueText) continue;
		var posEqual = 0;
		for(var m = valueText.length; posEqual < m; posEqual++)
		{
			if(valueText.charAt(posEqual) == "=") break;
		}
		var textKey = valueText.substring(0, posEqual);
		if(!textKey) continue;
		valueText = valueText.substring(posEqual + 1);
		if(!valueText) continue;
		cookieValues[textKey] = unescape(valueText);
	}
	return cookieValues
}
function setCookieValue(key, value, spanDay)
{
	var expireText = "";
	if(spanDay)
	{
		var expireDate = new Date();
		expireDate.setTime(expireDate.getTime() + (spanDay * 1000 * 60 * 60 * 24));
		expireText = ";expires=" + expireDate.toGMTString();
	}
	document.cookie = key + "=" + escape(value) + expireText + ";";
}
function clearCookieValue(key)
{
	document.cookie = key + "=; expires=Tue, 1-Jan-1980 00:00:00;";
}

// http asynchronous request
var SERVER_ACCESS_TIMEOUT_STANDARD			= 60000;		// 1 minute
var SERVER_ACCESS_TIMEOUT_ARCHIVE_SERVER	= 600000;		// 10 minutes
var SERVER_ACCESS_TIMEOUT = SERVER_ACCESS_TIMEOUT_STANDARD;
function httpRequest(targetURL, functionReference, doAcceptXML)
{
	httpRequestWithData(targetURL, functionReference, "", doAcceptXML);
}
function httpRequestWithData(targetURL, functionReference, postData, doAcceptXML, targetSite, serverAccessTimeout)
{
	var objHTTPRequest = false;
	try
	{
		if(window.XMLHttpRequest)
		{
			objHTTPRequest = new XMLHttpRequest();
		}
		else if(window.ActiveXObject)
		{
			try
			{
				objHTTPRequest = new ActiveXObject("MSXML2.XMLHTTP");
			}
			catch(e)
			{
				try
				{
					objHTTPRequest = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch(e)
				{
					objHTTPRequest = false;
				}
			}
		}
		else
		{
			objHTTPRequest = false;
		}
	}
	catch(e)
	{
		objHTTPRequest = false;
	}
	if(!objHTTPRequest)
	{
		browserError();
		return false;
	}
	var httpRequsetTimeOut = function()
	{
		objHTTPRequest.abort();
		communicationError("T00");
		return false;
	}
	if(5 <= arguments.length)
	{
		if(targetSite)
		{
			var proxySetting =
				"_gd_proxy_target_site=" + targetSite +
				"&_gd_proxy_servlet_name=" + targetURL +
				"&_gd_proxy_result_type=" + (doAcceptXML? "xml": "text");
			targetURL = "gdServletAsyn/Proxy";
			if(!postData) postData = proxySetting;
			else postData = proxySetting + "&" + postData;
		}
	}
	var timeout = (arguments.length == 6)? serverAccessTimeout: SERVER_ACCESS_TIMEOUT;
	var requestTimeOutTimerId = window.setTimeout(httpRequsetTimeOut, timeout);
	objHTTPRequest.open("POST", targetURL, true);
	objHTTPRequest.setRequestHeader("content-type", "application/x-www-form-urlencoded");
	objHTTPRequest.onreadystatechange =
		function()
		{
			try
			{
				if(objHTTPRequest.readyState == 4)
				{
					window.clearTimeout(requestTimeOutTimerId);
					if(objHTTPRequest.status == 200)
					{
						if(doAcceptXML === true)
						{
							var xmlData = objHTTPRequest.responseXML;
							objHTTPRequest = false;
							functionReference(xmlData);
						}
						else
						{
							var textData = objHTTPRequest.responseText;
							objHTTPRequest = false;
							functionReference(textData);
						}
					}
					else if(objHTTPRequest.status === 0) {} // for IE
					else
					{
						var requestStatus = objHTTPRequest.status;
						objHTTPRequest = false;
						communicationError(requestStatus);
					}
				}
			}
			catch(e)
			{
			}
		};
	objHTTPRequest.send(postData);
}
var restraintRepeatingCommunicationErrorMessage = true;
var restraintCommunicationErrorMessage = false;
function communicationError(errorAppendix)
{
	if(restraintCommunicationErrorMessage == true) {return;}
	if(restraintRepeatingCommunicationErrorMessage == true)
	{
		restraintCommunicationErrorMessage = true;
	}
	window.alert("Cannot access to server(" + errorAppendix + ")");
}
function getCashlessQuery()
{
	return "time=" + (new Date()).getTime();
}

// DOM/XML
function getNodeValue(node)
{
	if(node.length <= 0) {return "";}
	return node[0].nodeValue;
}
function getFirstNodeValueByTagName(parentNode, tagName)
{
	return getNodeValue(parentNode.getElementsByTagName(tagName)[0].childNodes);
}
function getAttributeFromElement(element, attributeName)
{
	try
	{
		return element.getAttribute(attributeName);
	}
	catch(e)
	{
		return element.getAttributeNode(attributeName).value;
	}
}
function setAttributeToElement(element, attributeName, value)
{
	try
	{
		element.setAttribute(attributeName, value);
	}
	catch(e)
	{
		element.getAttributeNode(attributeName).value = value;
	}
}
function removeAttributeFromElement(element, attributeName)
{
	try
	{
		element.removeAttribute(attributeName);
	}
	catch(e)
	{
		element.removeAttributeNode(element.getAttributeNode(attributeName));
	}
}

// browser
function isBrowser_Netscape()
{
	if(navigator.appName == "Netscape") {return true;}
	return false;
}
function isBrowser_IE_appName()
{
	if(navigator.appName == "Microsoft Internet Explorer") {return true;}
	return false;
}
function isBrowser_Opera()
{
	if(window.opera) {return true;}
	return false;
}
function isBrowser_Safari()
{
	if(navigator.userAgent.indexOf("Safari") != -1) {return true;}
	return false;
}
function isBrowser_Firefox()
{
	if(navigator.userAgent.indexOf("Firefox") != -1) {return true;}
	return false;
}
function browserError()
{
	window.alert("Page unavailable");
}

// collection
function insertElementToArray(targetArray, insertIndex, insertData)
{
	if(targetArray.length <= insertIndex)
	{
		targetArray.push(insertData);
		return;
	}
	targetArray.push(targetArray[targetArray.length - 1]);
	for(var i = targetArray.length - 2; insertIndex < i; i--)
	{
		targetArray[i] = targetArray[i - 1];
	}
	targetArray[insertIndex] = insertData;
}
function removeElementFromArray(targetArray, removeIndex)
{
	for(var i = removeIndex, n = targetArray.length - 1; i < n; i++)
	{
		targetArray[i] = targetArray[i + 1];
	}
	targetArray.pop();
}
function exchangeElement(targetArray, priorIndex)
{
	if(priorIndex < 0) {return;}
	if((targetArray.length - 1) <= priorIndex) {return;}
	var priorValue = targetArray[priorIndex];
	targetArray[priorIndex] = targetArray[priorIndex + 1];
	targetArray[priorIndex + 1] = priorValue;
}
function clearArray(targetArray)
{
	for(var i = targetArray.length - 1; 0 <= i; i--) targetArray.pop();
}

// utilities
function intToString(intValue, figureCount)
{
	var resultString = "00000000" + intValue;
	return resultString.substring(resultString.length - figureCount);
}
function startsWith(text, testString)
{
	var testLength = testString.length;
	if(text.length < testLength) return false;
	if(text.substring(0, testLength).toUpperCase() == testString.toUpperCase()) return true;
	return false;
}
var base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var base64DecodeTable = new Array();;
for(var i = 0, n = base64Chars.length; i < n; i++) base64DecodeTable[base64Chars.charAt(i)] = i;
function base64Decode(base64Text)
{
	var resultBytes = new Array();
	for(var i = 0, j = 0, n = base64Text.length; i < n; i += 4, j += 3)
	{
		var work3Byte =
			(base64DecodeTable[base64Text.charAt(i)] << 18) |
			(base64DecodeTable[base64Text.charAt(i + 1)] << 12) |
			(base64DecodeTable[base64Text.charAt(i + 2)] << 6) |
			(base64DecodeTable[base64Text.charAt(i + 3)]);
		resultBytes[j] = work3Byte >>> 16;
		resultBytes[j + 1] = (work3Byte >>> 8) & 0xff;
		resultBytes[j + 2] = work3Byte & 0xff;
	}
	return resultBytes;
}
