var currentPageIndex = -1;
function switchPage(targetIndex) {
	if (document.getElementById("Page" + (targetIndex + 1)) != null) {
		var index = 0;
		while(true) {
			var pageDiv = document.getElementById("Page" + (index + 1));
			if (pageDiv == null) {
				break;
			} else {
				pageDiv.style.visibility = (targetIndex == index) ? "visible" : "hidden";
				index ++;
			}
		}
		window.status = "Page (" + (targetIndex + 1) + " / " + index + ")";
		currentPageIndex = targetIndex;
	}
}

function getPosLeft(obj) { 
	var l = obj.offsetLeft; 
	while(obj = obj.offsetParent) { 
		l += obj.offsetLeft; 
	} 
	return l; 
}

function getPosTop(obj) { 
	var t = obj.offsetTop; 
	while(obj = obj.offsetParent) { 
		t += obj.offsetTop; 
	} 
	return t; 
}

function getPageByElement(elem) {
	var obj = elem;
	while (obj = obj.parentNode) {
		if (obj.id.indexOf("Page") == 0) {
			return obj;
		}
	}
	return null;
}

function ptInRect(x, y, l, t, w, h) {
	return (x > l) && (x < (l + w)) && (y > t) && (y < (t + h));   
}

function rectInRect(l, t, w, h, bL, bT, bW, bH) {
	var ltIn = ptInRect(l, t, bL, bT, bW, bH);
	var lbIn = ptInRect(l, t + h - 1, bL, bT, bW, bH);
	var rtIn = ptInRect(l + w - 1, t, bL, bT, bW, bH);
	var rbIn = ptInRect(l + w - 1, t + h - 1, bL, bT, bW, bH);
	return ltIn && lbIn && rtIn && rbIn;
}

function changeVisibilityInRect(node, l, t, w, h, visible) {
	var children = node.childNodes;
	for(var i = 0; i < children.length; i ++) {
		var top = getPosTop(children[i]);
		var left = getPosLeft(children[i]);
		var width = children[i].offsetWidth;
		var height = children[i].offsetHeight;
		if (rectInRect(left, top, width, height, l, t, w, h)) {
			var newState = (children[i].style.visibility == "inherit") ? "hidden" : "inherit";
			if (visible == 0) {
				newState = "hidden";
			} else if (visible == 1) {
				newState = "inherit";
			}
			children[i].style.visibility = newState;
		}
		changeVisibilityInRect(children[i], l, t, w, h, visible);
	}
}

function changeVisibility(targetElementId, visible, includeChildren) {
	var targetElement = document.getElementById(targetElementId);
	if (targetElement != null) {
		var newState = (targetElement.style.visibility == "inherit") ? "hidden" : "inherit";
		if (visible == 0) {
			newState = "hidden";
		} else if (visible == 1) {
			newState = "inherit";
		}
		targetElement.style.visibility = newState;
		if (includeChildren == true) {
			var baseTop = getPosTop(targetElement);
			var baseLeft = getPosLeft(targetElement);
			var baseWidth = targetElement.offsetWidth;
			var baseHeight = targetElement.offsetHeight;
			var ownerPage = getPageByElement(targetElement);
			if (ownerPage != null) {
				changeVisibilityInRect(ownerPage, baseLeft, baseTop, baseWidth, baseHeight, visible);
			}
		}
	}
}

function moveElementToPos(targetElement, newX, newY) {
	var parentElement = targetElement.parentNode;
	var baseX = (parentElement == null) ? 0 : getPosLeft(parentElement);
	var baseY = (parentElement == null) ? 0 : getPosTop(parentElement);
	targetElement.style.left = newX - baseX;
	targetElement.style.top = newY - baseY;
}

function changeLocationInRect(node, l, t, w, h, offsetX, offsetY, excludedElement) {
	var children = node.childNodes;
	for(var i = 0; i < children.length; i ++) {
		if (children[i] != excludedElement) {
			var top = getPosTop(children[i]);
			var left = getPosLeft(children[i]);
			var width = children[i].offsetWidth;
			var height = children[i].offsetHeight;
			if (rectInRect(left, top, width, height, l, t, w, h)) {
				moveElementToPos(children[i], left + offsetX, top + offsetY);
			}
			changeLocationInRect(children[i], l, t, w, h, offsetX, offsetY, excludedElement);
		}
	}
}

function changeLocation(targetElementId, newX, newY, includeChildren) {
	var targetElement = document.getElementById(targetElementId);
	if (targetElement != null) {
		var baseTop = getPosTop(targetElement);
		var baseLeft = getPosLeft(targetElement);
		var baseWidth = targetElement.offsetWidth;
		var baseHeight = targetElement.offsetHeight;
		var ownerPage = getPageByElement(targetElement);
		moveElementToPos(targetElement, newX, newY);
		if (includeChildren == true) {
			if (ownerPage != null) {
				var offsetX = getPosLeft(targetElement) - baseLeft;
				var offsetY = getPosTop(targetElement) - baseTop;
				changeLocationInRect(ownerPage, baseLeft, baseTop, baseWidth, baseHeight, offsetX, offsetY, targetElement);
			}
		}
	}
}

function getX(id) {
	var obj = document.getElementById(id);
	if (obj != null) {
		return getPosLeft(obj);
	}
	return -1;
}

function getY(id) {
	var obj = document.getElementById(id);
	if (obj != null) {
		return getPosTop(obj);
	}
	return -1;
}

function getWidth(id) {
	var obj = document.getElementById(id);
	if (obj != null) {
		return obj.offsetWidth;
	}
	return -1;
}

function getHeight(id) {
	var obj = document.getElementById(id);
	if (obj != null) {
		return obj.offsetHeight;
	}
	return -1;
}

function getPostfixForState(state) {
	if (state == 0) {
		return "_Normal";
	} else if (state == 16) {
		return "_Hovering";
	} else if (state == 32) {
		return "_Selected";
	} else if (state == 64) {
		return "_Disabled";
	} else if (state == 48) {
		return "_Selected_Hovering";
	} else if (state == 96) {
		return "_Selected_Disabled";
	}
	return "";
}

function getElementTypeById(id) {
	var index = id.indexOf("_");
	if (index == -1) {
		return "Unknown";
	} else {
		return id.substring(0, index);
	}
}

function changeState(id, state) {
	var obj = document.getElementById(id);
	if (obj != null) {
		var postfix = getPostfixForState(state);
		if (obj.tagName.toUpperCase() == "IMG") {
			obj.src = "images/" + id + postfix + ".png";
		} else {
			obj.className = id + postfix;
			if (typeof(obj.checked) != 'undefined') {
				obj.checked = ((state & 32) > 0);
			}
			if (obj.getAttribute("checked") != null) {
				obj.setAttribute("checked", ((state & 32) > 0));
			}
			if (typeof(obj.disabled) != 'undefined') {
				obj.disabled = ((state & 64) > 0);
			}
			var getExp = getElementTypeById(id) + "_getSelectedIndex('" + id + "');";
			var selIndex = eval(getExp);
			if (selIndex != -1) {
				var setExp = getElementTypeById(id) + "_setSelectedIndex('" + id + "', " + selIndex + ");";
				eval(setExp);
			}
		}
	}
}

function isBooleanTrue(b) {
	if (b == null) {
		return false;
	}
	if (typeof(b) == "boolean") {
		return b;
	}
	if (typeof(b) == "string") {
		return (b.toLowerCase() == "true") ? true : false;
	}
	return b != 0;
}

function getElementState(obj) {
	var state = 0;
	if (isBooleanTrue(obj.getAttribute("checked"))) {
		state |= 32;
	}
	if (typeof(obj.disabled) != 'undefined' && obj.disabled == true) {
		state |= 64;
	}
	return state;
}

function selectToggleObject(id, sel) {
	var obj = document.getElementById(id);
	if (obj != null) {
		if (obj.getAttribute("checked") != null) {
			var newSelected = (isBooleanTrue(obj.getAttribute("checked"))) ? false : true;
			if (sel == 0) {
				newSelected = false;
			} else if (sel == 1) {
				newSelected = true;
			}
			if (obj.getAttribute("checked") != null) {
				obj.setAttribute("checked", newSelected);
			}
			var postfix = getPostfixForState(getElementState(obj));
			obj.className = id + postfix;
		}
	}
}

function selectCheckBoxInGroup(id, sel, includeSiblings) {
	if (includeSiblings == true) {
		var targetElement = document.getElementById(id);
		if (targetElement != null) {
			var parentElement = targetElement.parentNode;
			if (parentElement.id.indexOf("Group") == 0) {
				var children = parentElement.childNodes;
				for(var i = 0; i < children.length; i ++) {
					if (typeof(children[i].id) != 'undefined' && children[i].id.indexOf("CheckBox") == 0) {
						selectToggleObject(children[i].id, sel);
					}
				}
			} else {
				selectToggleObject(id, sel);
			}
		}
	} else {
		selectToggleObject(id, sel);
	}
}

function selectRadioButtonInGroup(id, sel, unselectSiblings) {
	if (unselectSiblings == true) {
		var targetElement = document.getElementById(id);
		if (targetElement != null) {
			var parentElement = targetElement.parentNode;
			if (parentElement.id.indexOf("Group") == 0) {
				var children = parentElement.childNodes;
				for(var i = 0; i < children.length; i ++) {
					if (typeof(children[i].id) != 'undefined' && children[i].id.indexOf("RadioButton") == 0) {
						if (children[i].id == id) {
							selectToggleObject(children[i].id, sel);
						} else {
							selectToggleObject(children[i].id, 0);
						}
					}
				}
			} else {
				selectToggleObject(id, sel);
			}
		}
	} else {
		selectToggleObject(id, sel);
	}
}

function sleep(delay) {
	var start = new Date().getTime();
	while (new Date().getTime() < start + delay);
}

function clearTimeoutArray(arr) {
	if(arr.length){   
		for (var i = 0; i < arr.length; i ++) {
			clearTimeout(arr[i]);
		}
	}
}

function getEvent(){
	if(document.all) {
		return window.event;        
	}
	func=getEvent.caller;            
	while(func!=null){    
		var arg0=func.arguments[0];
		if(arg0){
			if((arg0.constructor==Event || arg0.constructor ==MouseEvent)
				|| (typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation)){    
				return arg0;
			}
		}
		func=func.caller;
	}
	return null;
}               

function getEventOffset(evt) {
	if(document.all) {
	    return evt;
	}
	var target = evt.target;
	var pageCoord = {
		x: getPosLeft(target),
		y: getPosTop(target)
	};
	var eventCoord = {
	    x: window.pageXOffset + evt.clientX,
	    y: window.pageYOffset + evt.clientY
	};
	var offset = {
	    offsetX: eventCoord.x - pageCoord.x,
	    offsetY: eventCoord.y - pageCoord.y
	};
	return offset;
}

function preLoadImg(url) {
	var img = new Image();
	img.src = url;
}