if (top.location != location) top.location.href = location.href;

if (!String.prototype.trim) String.prototype.trim =  function() { return this.replace(/^\s+|\s+$/g, ''); }
if (!String.prototype.ltrim) String.prototype.ltrim = function() { return this.replace(/^\s+/, ''); }
if (!String.prototype.rtrim) String.prototype.rtrim = function() { return this.replace(/\s+$/, ''); }

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(elt /*, from*/) {
    var len = this.length;
    var from = Number(arguments[1]) || 0;
    from = (from < 0) ? Math.ceil(from) : Math.floor(from);
    if (from < 0) from += len;
    for (; from < len; from++) {
      if (from in this && this[from] === elt) return from;
    }
    return -1;
  };
}

if (!Array.prototype.removeIndex) {
	Array.prototype.removeIndex = function(index) {
		if (index < 0) return false;
		this.splice(index, 1);
		return true;
	}
}

function getObjectById(id) {
	if (document.getElementById) getObjectById = function(id) { return (typeof(id) != 'string') ? id : document.getElementById(id); };
		else if (document.all) getObjectById = function(id) { return (typeof(id) != 'string') ? id : document.all[id]; };
		else if (document.layers) getObjectById = function(id) { return (typeof(id) != 'string') ? id : document.layers[id]; };
		else getObjectById = function(id) { throw new Error('Browser does not support \"getObjectById()\" function.') };
	return getObjectById(id);
}

function getElementsByClass(oElement, strTagName, oClassNames) {
	var arrElements = (strTagName == '*' && oElement.all) ? oElement.all : oElement.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	var arrRegExpClassNames = new Array();
	var bMatchesAll;

	if(typeof(oClassNames) == 'object'){
		for(var i = 0; i < oClassNames.length; i++) { arrRegExpClassNames.push(new RegExp("(^|\\s)" + oClassNames[i].replace(/\-/g, "\\-") + "(\\s|$)")); }
	} else{
		arrRegExpClassNames.push(new RegExp("(^|\\s)" + oClassNames.replace(/\-/g, "\\-") + "(\\s|$)"));
	}

	for(var j = 0; j < arrElements.length; j++){
		oElement = arrElements[j];
		bMatchesAll = true;
		for(var k = 0; k < arrRegExpClassNames.length; k++) {
			if(!arrRegExpClassNames[k].test(oElement.className)) {
				bMatchesAll = false;
				break;
			}
		}
		if(bMatchesAll) { arrReturnElements.push(oElement); }
	}

	return arrReturnElements;
}

function foreach(oElements, callback) {
	if (oElements == null) return 0;
	for (var i = 0; i < oElements.length; i++) callback(oElements[i], i);
	return oElements;
}

function checkCssClass(oElement, className) {
	oElement = getObjectById(oElement);
	return (oElement == null) ? false : new RegExp('\\b' + className + '\\b').test(oElement.className);
}

function addCssClass(oElement, className) {
	oElement = getObjectById(oElement);
	if (oElement == null) return false;
	if (!checkCssClass(oElement, className)) { oElement.className += (oElement.className) ? ' ' + className : className; return true; }
	return false;
}

function removeCssClass(oElement, className) {
	oElement = getObjectById(oElement);
	if (oElement == null) return false;
	var classLength = oElement.className.length;
	oElement.className = oElement.className.replace(new RegExp('\\b' + className + '\\b', 'g'), '').trim();
	oElement.className = oElement.className.replace(/\s{2,}/g, ' ');
	return (classLength > oElement.className.length) ? true : false;
}

function swapCssClass(oElement, sourceClassName, destinationClassName) {
	oElement = getObjectById(oElement);
	if (oElement == null) return false;
	if (checkCssClass(oElement, sourceClassName)) {
		var classLength = oElement.className.length;
		oElement.className = oElement.className.replace(new RegExp('\\b' + sourceClassName + '\\b', 'g'), destinationClassName).trim();
		oElement.className = oElement.className.replace(/\s{2,}/g, ' ');
		return (classLength > oElement.className.length) ? true : false;
	} else {
		return addCssClass(oElement, destinationClassName);
	}
}

function getInnerText(oElement) {
	oElement = getObjectById(oElement);
	return (oElement.innerText) ? oElement.innerText : oElement.textContent;
}

function setInnerText(oElement, text) {
	oElement = getObjectById(oElement);
	return (oElement.innerText) ? oElement.innerText = text : oElement.textContent = text;
}

function getVisibility(oElement) { 
	oElement = getObjectById(oElement);
	return (oElement.style.display != 'none');
}

function setVisibility(oElement, visibility) { 
	oElement = getObjectById(oElement);
	if (oElement == null) return false;
	oElement.style.display = (visibility) ? '' : 'none';
}

function toggleVisibility(oElement) {
	setVisibility(oElement, !getVisibility(oElement));
}

function getInnerText(oElement) {
	oElement = getObjectById(oElement);
	return (oElement.innerText) ? oElement.innerText : oElement.textContent;
}

function setInnerText(oElement, text) {
	oElement = getObjectById(oElement);
	return (oElement.innerText) ? oElement.innerText = text : oElement.textContent = text;
}

function addHandler(oElement, eventName, eventHandler) {
	oElement = getObjectById(oElement);
	if (oElement.addEventListener) oElement.addEventListener(eventName, eventHandler, false);
		else oElement.attachEvent('on' + eventName, eventHandler);
}

function prependChild(oElement, oReferenceNode) {
	oReferenceNode = getObjectById(oReferenceNode);
	if (oReferenceNode == null) return false;
	oReferenceNode.insertBefore(oElement, oReferenceNode.firstChild);
	return oElement;
}

function insertAfter(oElement, oReferenceNode) {
	oReferenceNode = getObjectById(oReferenceNode);
	if (oReferenceNode == null) return false;
	oReferenceNode.parentNode.insertBefore(oElement, oReferenceNode.nextSibling);
	return oElement;
}

function wrapNode(oElement, wrapper) {
	oElement = getObjectById(oElement);
	if (typeof(wrapper) != 'object') wrapper = document.createElement(wrapper);
	wrapper.appendChild(oElement.cloneNode(true));
	oElement.parentNode.replaceChild(wrapper, oElement);
	return wrapper;
}

function wrapChildNodes(oParentNode, wrapper, excludedNodeName) {
	oParentElement = getObjectById(oParentElement);
	var newNode = document.createElement(wrapper);
	var arrRemoveElements = new Array();

	for (var i = 0; i < oParentNode.childNodes.length; i++) { // Build new node.
		if (oParentNode.childNodes[i].nodeName != excludedNodeName) {
			newNode.appendChild(oParentNode.childNodes[i].cloneNode(true));
			arrRemoveElements.push(oParentNode.childNodes[i]);
		}
	}

	for (var i = 0; i < arrRemoveElements.length; i++) { oParentNode.removeChild(arrRemoveElements[i]); } // Remove old nodes.
	if (oParentNode.childNodes.length > 0) { oParentNode.insertBefore(newNode, oParentNode.childNodes[0]); } else { oParentNode.appendChild(newNode); } // Insert new node.

	return newNode;
}

function removeNode(oElement) {
	oElement = getObjectById(oElement);
	return (oElement != null) ? oElement.parentNode.removeChild(oElement) : null;
}

function removeChildNodes(oElement) {
	if (oElement.hasChildNodes()) {
		while (oElement.childNodes.length > 0) oElement.removeChild(oElement.firstChild);
	}
}

function setSelRange(oElement, rangeStart, rangeEnd) {
	oElement = getObjectById(oElement);

	if (oElement.setSelectionRange) {
		oElement.focus();
		oElement.setSelectionRange(rangeStart, rangeEnd);
	} else if (oElement.createTextRange) {
		var range = oElement.createTextRange();
		range.collapse(true);
		range.moveEnd('character', rangeEnd);
		range.moveStart('character', rangeStart);
		range.select();
	}
}

function keyCodeToNumber(e) {
	if (typeof(e.keyCode) == 'number') return e.keyCode; // DOM
		else if (typeof(e.which) == 'number') return e.which; //NS 4 compatible
		else if (typeof(e.charCode) == 'number') return e.charCode; // NS 6+, Mozilla 0.9+
		else return null;
}

function getParentElementByType(oElement, oElementType) {
	oElement = getObjectById(oElement);
	var element = oElement.parentNode;
	var elementType = oElementType.toUpperCase();
	while (element != null) {
		if (element.tagName == elementType) return element;
		element = element.parentNode;
	}
}

function getElementTop(oElement) {
	oElement = getObjectById(oElement);
	var yPosition = oElement.offsetTop;
	var tempElement = oElement.offsetParent;
	while (tempElement != null) {
		yPosition += tempElement.offsetTop;
		tempElement = tempElement.offsetParent;
	}
	return yPosition;
}

function getElementLeft(oElement) {
	oElement = getObjectById(oElement);
	var xPosition = oElement.offsetLeft;
	var tempElement = oElement.offsetParent;
	while (tempElement != null) {
		xPosition += tempElement.offsetLeft;
		tempElement = tempElement.offsetParent;
	}
	return xPosition;
}

function getWindowWidth() {
	var x = 0;
	if (self.innerWidth) x = self.innerWidth;
		else if (document.documentElement && document.documentElement.clientWidth) x = document.documentElement.clientWidth;
		else if (document.body) x = document.body.clientWidth;

	return x;
}

function getWindowHeight() {
	var y = 0;
	if (self.innerHeight) y = self.innerHeight;
		else if (document.documentElement && document.documentElement.clientHeight) y = document.documentElement.clientHeight;
		else if (document.body) y = document.body.clientHeight;

	return y;
}

function getElementWidth(oElement) {
	oElement = getObjectById(oElement);
	return (oElement.offsetWidth != null) ? oElement.offsetWidth : oElement.style.pixelWidth;
}

function getElementHeight(oElement) {
	oElement = getObjectById(oElement);
	return (oElement.offsetHeight != null) ? oElement.offsetHeight : oElement.style.pixelHeight;
}

function getScrollXY() {
	var scrOfX = 0, scrOfY = 0;
	if(typeof(window.pageYOffset) == 'number') {
		//Netscape compliant
		scrOfY = window.pageYOffset;
		scrOfX = window.pageXOffset;
	} else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) {
		//DOM compliant
		scrOfY = document.body.scrollTop;
		scrOfX = document.body.scrollLeft;
	} else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
		//IE6 standards compliant mode
		scrOfY = document.documentElement.scrollTop;
		scrOfX = document.documentElement.scrollLeft;
	}
	return { 'x':scrOfX, 'y':scrOfY };
}

/* Basket */

var referenceValue;

function setReferenceValue(oElement) { referenceValue = oElement.value; }

function showMessageUpdate(oElement) {
	if (oElement.value != referenceValue) {
		setVisibility('ButtonUpdate', true);
		setVisibility('MessageUpdate', true);
	}
}

function updateBasket(oElement) {
	var node = oElement.parentNode;
	while (typeof(node) != 'undefined') {
		if (node.tagName == 'FORM') {
			node.submit();
			break;
		}
		node = node.parentNode;
	}
}

/* All Controls */

function setupControls() {
	setupTextBoxControls();
	setupTabSetControls();
	setupListBoxControls();
	if (typeof(page) != 'undefined' && typeof(page.onload) != 'undefined') page.onload();
}

/* ListBoxControl */

function setupListBoxControls() {
	foreach(getElementsByClass(document, '*', 'ListBoxControl'), setupListBoxControl);
}

function setupListBoxControl(oElement) {
	oElement._label = getObjectById(oElement.id + '_Label');
	oElement._icon = oElement.getElementsByTagName('SPAN')[0];
	oElement._iconOverlay = oElement.getElementsByTagName('SPAN')[1];
	oElement._control = oElement.getElementsByTagName('SELECT')[0];
	setVisibility(getParentElementByType(oElement._icon, 'TD'), true);
	
	oElement._control.onchange = function() {
		if (oElement._icon != null) {
			var optionElement = this.options[this.selectedIndex];
			oElement._icon.className = optionElement.className.replace(/_Icon/gi, 'Icon');
		}
	}

	oElement._control.onkeyup = function(e) { // Hack: Firefox does not properly fire onchange events.
		this.onchange(e);
	}
	
	oElement._icon.onclick = function() {
		oElement._control.focus();
	}
}

/* TextBoxControl */

function setupTextBoxControls() {
	foreach(getElementsByClass(document, '*', 'TextBoxControl'), setupTextBoxControl);
}

function setupTextBoxControl(oElement) {
	var oInputElements = oElement.getElementsByTagName('INPUT');
	var oValue = oInputElements[0];
	var oHint = (oInputElements.length > 1) ? oInputElements[1] : null;
	oElement._label = getObjectById(oElement.id + '_Label');
	oElement._control = oElement.getElementsByTagName('INPUT')[0];

	if (!checkCssClass(oElement, 'DisplayOnly')) {
		if (oHint && oValue.value.length == 0) {
			oValue.value = oHint.value;
			addCssClass(oValue, 'Hint');
		}
	
		oValue.onfocus = function(e) {
			if (oHint) {
				if (oValue.value == oHint.value) oValue.value = '';
				removeCssClass(oValue, 'Hint');
			}
		}
	
		oValue.onblur = function(e) {
			if (oHint && oValue.value.length == 0) {
				oValue.value = oHint.value;
				addCssClass(oValue, 'Hint');
			}
		}
	}
}

/* TabSetControl */

function setupTabSetControls() {
	foreach(getElementsByClass(document, '*', 'TabSetControl'), setupTabSetControl);
}

function setupTabItem(oElement, tabItems, tabPages) {
	var tabItemLink = oElement.getElementsByTagName('A')[0];
	if (typeof(tabItemLink) == 'undefined') return;

	tabItemLink.onclick = function() {
		tabPageSelected = 'TabPage' + tabItemLink.hash.substring(tabItemLink.hash.indexOf('#') + 1);
		foreach(tabPages, function(tabPage) { setVisibility(tabPage, (tabPage.id == tabPageSelected)); });
		foreach(tabItems, function(tabItem) {
			if (tabItem == oElement) addCssClass(tabItem, 'Selected');
				else removeCssClass(tabItem, 'Selected');
		});
		return false;
	}
}

function setupTabSetControl(oElement) {
	var tabTitles = getElementsByClass(oElement, '*', 'TabTitle');
	foreach(tabTitles, function(tabTitle) { setVisibility(tabTitle, false); });

	var tabItems = getElementsByClass(oElement, 'DIV', 'TabItems');
	if (tabItems.length < 1) return;
	setVisibility(tabItems[0], true);

	var tabPages = getElementsByClass(oElement, 'DIV', 'TabPages');
	if (tabPages.length < 1) return;

	tabItems = tabItems[0].getElementsByTagName('LI');
	tabPages = getElementsByClass(tabPages[0], 'DIV', 'TabPage');

	foreach(tabItems, function(tabItem) { setupTabItem(tabItem, tabItems, tabPages); });
	for (var tabPageIndex = 1; tabPageIndex < tabPages.length; tabPageIndex++) { setVisibility(tabPages[tabPageIndex], false); }
	addCssClass(tabItems[0], 'Selected');
}

/* Popup Window */

var popupWindow;

window.onunload = function() { if (popupWindow) popupWindow.close(); };

function showPopupWindow(url, title) {
	content = '<html>' +
							'<head><title>' + escape(title) + '</title></head>' +
							'<body bgcolor=\"#ffffff\" topmargin=\"0\" leftmargin=\"0\" marginwidth=\"0\" marginheight=\"0\" onclick=\"window.close();\" style=\"cursor:pointer;\">' +
								'<table width=\"100%\" height=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">' +
									'<tr><td align=\"center\" valign=\"middle\"><a href=\"JavaScript:window.close();\"><img src=\"' + url + '\" border=\"0\" alt=\"' + escape(title) + '\" title=\"' + escape(title) + '\"></a></td></tr>' +
								'</table>' +
							'</body>' +
						'</html>';

	if (popupWindow && popupWindow.close) popupWindow.close();
	popupWindow = window.open("about:blank", "popupWindow", "width=460, height=460, resizable=no, scrollbars=no, toolbar=no, location=no, menubar=no");
	popupWindow.document.write(content);
	if (popupWindow && popupWindow.focus) popupWindow.focus();
}

function magnifyImage(oElement) {
	showPopupWindow(oElement.href, oElement.title);
	return false;
}
