var NODETYPE_ELEMENT=1;
function showForm(formId) {
	var form = document.getElementById(formId);
	if (form.style.display == "block")
	{
		form.style.display = "none";
	}
	else
	{
		form.style.display = "block";
	}
}

/**
 * Submit a form, saving the IE autocomplete
 */
function submitForm(formId) {
	var frm = document.getElementById(formId);
	return submitFormDirect(frm);
}

function submitFormDirect(frm) {
	// save autocomplete workaround around bug in IE
	// TODO Does not work with Safari, Konquerer
	
	if (navigator.userAgent.indexOf("MSIE")>=0) {
		window.external.AutoCompleteSaveForm(frm);
	}
	
	frm.submit();
	return true;
}

/**
 * Submit a form when enter is pressed in a field of the form
 */
function enterSubmit(event, field) {
	var keyCode = -1;
	if (window.event) {
		keyCode = window.event.keyCode;
	}
	else if (event) {
		keyCode = event.which;
	}
		
	if (keyCode == 13)
	{
		// intemittent bug in IE creashing when this function is invoked. 
		// Commented call to submitForm to see if this is the problem
		submitFormDirect(field.form);
		//submitForm(field.form.id);
    return false;
  }
  return true;
}

// set the rollover class for the element
function rollOver(element) {
	element.className=element.className + "-over";
}

/**
 * Clear the rollover class for the element
 */
function rollOut(element) {
	element.className=element.className.substring(0, element.className.length-5);
}

/**
 * Debug function to display the page's data in a new window
 */
function displayXml(xmlid) {
	var xml = document.getElementById(xmlid);
	var test = window.open('','_blank');
  	test.document.write('<html><body><textarea style="width:100%;height:100%">');
 	test.document.write(xml.innerHTML);
 	test.document.write('</textarea></body></html>');
}

/**
 * Update the crumbs cookie based on the trail displayed.
 * Deals with keeping the trail in sync when the user uses the back button
 */
function updateCrumbsCookie() {
	// we need the encodeURI function to be available
	if ( ( typeof( encodeURI ) ).toLowerCase() == 'undefined' ) {
		return;
	} 
	var crumbs = document.getElementById("trail");
	// go through each of the links in this element and extract the href and name;
	var i;
	var cookie = "";
	
	var links = crumbs.getElementsByTagName("div");
	for (i=1 ;; i++) {
		var child = links.item(i);
		if (child==null) {
			break;
		}
		if (child.nodeType != NODETYPE_ELEMENT) {
			continue; // only elements
		}
		var link = child.getElementsByTagName("a").item(0);
		cookie += "|" + link.getAttribute("href") + "~" + unescapeXml(link.innerHTML);
	}
	
	if (cookie.length > 0) {
		cookie = cookie.substring(1);
	}
	setCookie("nav", cookie);
}

function unescapeXml(xml){
    return xml.replace(/&amp;/, "&");
}

function setCookie(name, cookie) {
	cookie = encodeURI(cookie);
	// ";" is not replaced by encodeURI but is invalid in cookies 
	cookie = cookie.replace(/;/g, "%3B");
	document.cookie = name + "=" + cookie;
}

function moveCategoryProduct(categoryId, productId, version, fromPosition) {
	moveItem(categoryId, productId, version, fromPosition, 'product', 'moveCategoryProduct');
}

function moveCategorySubCategory(parentCategoryId, categoryId, version, fromPosition){
	moveItem(parentCategoryId, categoryId, version, fromPosition, 'category', 'moveCategorySubCategory');
}

function moveAssociatedProduct(parentProductId, productId, version, fromPosition){
	moveItem(parentProductId, productId, version, fromPosition, 'product', 'moveAssociatedProduct');
}

function moveProductOption(parentProductId, productId, version, fromPosition){
	moveItem(parentProductId, productId, version, fromPosition, 'product', 'moveProductOption');
}

function moveItem(parentId, itemId, version, fromPosition, itemName, action)
{
	var position = prompt("Which position should the " + itemName + " be moved to?", "");
	var iPos = parseInt(position, 10);
	if (isNaN(iPos)) {
		window.alert("You must provide a valid number.");
	}
	else {
		window.location.href = action + ".do?id=" + parentId + "&version=" + version + "&itemId=" + 
			itemId + "&from=" + fromPosition + "&to=" + (iPos - 1);
	}
}

// firefox seems to ignore the autocomplete attribute, so we will do it using script. Need to use a timeout as 
// firefox sets the values after running the onLoad scripts.
function clearAutoComplete() {
	window.setTimeout('clearAutoCompleteImpl()', 10);
}

// remove the text set for autocomplete
function clearAutoCompleteImpl() {
	if (document.getElementsByTagName) {
		var inputElements = document.getElementsByTagName("input");
		for (i=0; inputElements[i]; i++) {
			if (inputElements[i].getAttribute("autocomplete") == "off") {
				inputElements[i].value = "";
			}
		}
	}
}

// frame detection - if page loaded in a frame, redirects to the page
if (top.location != self.location) {
	top.location.replace(self.location);
}

var FormRules = {
	"form.auto-submit" : function(element) {
		element.submit();	
	}
};

Behaviour.register(FormRules);

function changeTab(event){
	if (! event) {
		event = window.event;
	}
	
	var element = event.srcElement || event.currentTarget || event.target;
	
	while (element != null && element.nodeName.toLowerCase() != "li"){
		element = element.parentNode;
	}
	if (element == null){
		return false;
	}
	var tabs = element.parentNode.childNodes;
	for(i=0; i<tabs.length;i++){
		if (tabs[i].nodeType == 1){
			if (tabs[i].className.slice(-9) == " selected"){
				tabs[i].className = tabs[i].className.substring(0, tabs[i].className.length-9);
			}
		}
	}
	
	element.className = element.className + " selected";
}

var ProductTabRules = {
	"li.tab" : function(element){
		element.onclick = changeTab;
	}
};
Behaviour.register(ProductTabRules);

var lastDeliveryMethod;
function attachDeliveryChangeHandler(){
	var deliverySelect = document.getElementById("deliveryMethod");
	var btnSelect = document.getElementById("deliveryMethodSubmit");
	if (deliverySelect != null){
		lastDeliveryMethod = deliverySelect.selectedIndex;
		deliverySelect.onchange = function() {
			if (this.selectedIndex != lastDeliveryMethod){
				submitFormDirect(this.form);
			}
		};
	}
	if (btnSelect != null){
		btnSelect.disabled=true;
	}
}
Behaviour.addLoadEvent(attachDeliveryChangeHandler);

var mainProductImage = null;
function changeAltImage(event){
	if (! event) {
		event = window.event;
	}
	var element = event.srcElement || event.currentTarget || event.target;
	src = element.src;
	// substring after = and before &
	var context = src.substring(0, src.indexOf("/image.do"));
	src = src.substring(src.indexOf("=") + 1);
	src = context + "/image.do?path=" + src.substring(0,src.indexOf("&")) + "&width=250&height=250";
	var image = document.getElementById("product-image");
	if (mainProductImage == null){
		mainProductImage = image.src;
	}
	image.src = src; 
}

function restoreMainImage(event){
	if (mainProductImage != null){
		var image = document.getElementById("product-image");
		window.setTimeout("restoreMainImageDelayed('" + image.src + "');", 500); 
	}
}

function restoreMainImageDelayed(current){
	var image = document.getElementById("product-image");
	if (image.src == current){
		image.src = mainProductImage;
	}
}

var AlternateImageRules = {
	"img.alt-image" : function(element){
		element.onmouseover = changeAltImage;
		element.onclick = changeAltImage;
		element.onmouseout = restoreMainImage;
	}
};
Behaviour.register(AlternateImageRules);

var VATDisplay = {
	"showInclusive" : function() {
		createCookie('showVatInclusive', "1", 1);
		location.reload(true);
		return false;
	},
	"showExclusive" : function() {
		createCookie('showVatInclusive', "0", 1);
		location.reload(true);
		return false;
	}
};
var VATDisplayRules = {
	"a#show-vat-inclusive" : function(element) {
		PythonEvent.observe(element, "click", VATDisplay.showInclusive);
		element.style.display="block";
	},
	"a#show-vat-exclusive" : function(element) {
		PythonEvent.observe(element, "click", VATDisplay.showExclusive);
		element.style.display="block";
	}
};

Behaviour.register(VATDisplayRules);

var RecentProductsView = {
	"showAdditional" : function(event) {
		if (! event) {
			event = window.event;
		}
		var element = event.srcElement || event.currentTarget || event.target;
		var list = element.parentNode;
		var products = list.getElementsByTagName("li");
		for(i=0; i<products.length;i++){
			products[i].style.display = "table";
		}
		element.style.display = "none";
		return false;
	}
};
var RecentProductsViewRules = {
	"a#btn-more-recently-viewed" : function(element) {
		PythonEvent.observe(element, "click", RecentProductsView.showAdditional);
	}
};

Behaviour.register(RecentProductsViewRules);

function resolveEventElement(event){
	if (! event) {
		event = window.event;
	}
	return event.srcElement || event.currentTarget || event.target;
}

/* On order results a click on the li should go to the edit link */
var OrderResults = {
	"showDetailsPage" : function(event){
		var li = resolveEventElement(event);
		var links = li.getElementsByTagName("a");
		var editUrl = null;
		for(i=0; i<links.length;i++){
			if (links[i].className != null && links[i].className.indexOf("btn-view-edit")>-1){
				editUrl = links[i].href;
			}
		}
		if (editUrl != null){
			window.location.href = editUrl;
		}
		return false;	
	},
	
	"showSummary" : function(event){
		var li = resolveEventElement(event);
		if (li.nodeName.toLowerCase() == "a"){
			event.cancelBubble = true;
			return true;
		}
		while (li != null && li.nodeName.toLowerCase() != "li"){
			li = li.parentNode;
		}
		var a = li.getElementsByTagName("a")[0];
		var orderId = a.innerHTML;
		var url = "viewOrderSummary.do?id=" + orderId;
		if (! event) {
			event = window.event;
		}
		var offset = -300;
		var x = event.pageX || event.clientX;
		if (x < 320){
			offset = 20 - x;
		}
		
		var offsety = -200;
		var viewportHeight = window.innerHeight || document.documentElement.clientHeight;
		var pageHeight = event.pageY || event.clientY;
		var y = pageHeight - viewportHeight;
		if (pageHeight > viewportHeight - 320){
			if (y < 0){
				offsety = -520 - y;
			}
			else{
				offsety = -500;
			}
		}
		
		jQuery.get(url,function(data) {
		    overlib(data, STICKY, MOUSEOFF, OFFSETX, offset, OFFSETY, offsety);
		  }
		 );
		 return false;
	},
	
	"hideSummary" : function(event){
		var li = resolveEventElement(event);
	}
};

var PopupPositioner = {
	"getPosition" : function(event, popupWidth, popupHeight){
		var minMargin = 20;
		var clickX = event.pageX;
		var clickY = event.pageY;
		var windowWidth = window.innerWidth || document.documentElement.clientWidth;
		var windowHeight = window.innerHeight || document.documentElement.clientHeight;
		var scrollTop = window.pageYOffset || document.documentElement.scrollTop || 0; 
		var scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || 0;
		
		var maxX = windowWidth - minMargin - popupWidth + scrollLeft;
		var minX = minMargin + scrollLeft;
		var maxY = windowHeight - minMargin - popupHeight + scrollTop;
		var minY = minMargin + scrollTop;
		
		var result = {};
		result.x = clickX;
		result.y = clickY;
		if (result.x < minX) {
			result.x = minX;
		}
		if (result.x > maxX) {
			result.x = maxX;
		}
		if (result.y < minY) {
			result.y = minY;
		}
		if (result.y > maxY) {
			result.y = maxY;
		}
		return result;
	},
	"getOffset" : function(event, popupWidth, popupHeight){
		var offset = -20;
		var clickX = event.pageX;
		var clickY = event.pageY;
		var result = PopupPositioner.getPosition(event, popupWidth, popupHeight);
		var offsets = {};
		offsets.x = offset;
		offsets.y = offset;
		

		//window.alert("<span>" + clickX + " - " + result.x + ", " + clickY + " - " + result.y + "</span>");
		if (result.x != clickX){
			offsets.x = offsets.x - (clickX - result.x);
		}
		if (result.y != clickY){
			offsets.y = offsets.y - (clickY - result.y);
		}
		return offsets;
	}
};

var OrderResultsRules = {
	"li.order" : function(element){
		PythonEvent.observe(element, "click", OrderResults.showSummary);
	}
};
Behaviour.register(OrderResultsRules);
/* On associated products and recently viewed products mouse over displays summary */
var AssociatedProducts = {
	"showSummary" : function(event){
		var li = resolveEventElement(event);
		while(li.tagName != "LI"){
			li = li.parentNode;
		}
		if ($(li).hasClass("visible")) {
			return false;
		}
			
		var associated = $(li.parentNode.parentNode);
		var div = $(li).find("div.extra-product-info");
		
		if (div != null){
			var offsets = PopupPositioner.getOffset(event, 412, 219);
			div[0].innerHTML = div[0].innerHTML.replace(/&amp;/g,"&");
			overlib("<div id='extra-product-info'>" + div[0].innerHTML + "</div>", STICKY, MOUSEOFF, OFFSETX, offsets.x, OFFSETY, offsets.y);
		}
		
	 	return false;
	}
};



/* On reviews button click displays text*/
var ReviewText = {
	"showText" : function(event){
		var a = resolveEventElement(event);
		var adminDiv = a.parentNode;
		var div = adminDiv.parentNode;
		div.className = 'show-text-review';
		return false;
	},
	
	"hideText" : function(event){
		var a = resolveEventElement(event);
		var adminDiv = a.parentNode;
		var div = adminDiv.parentNode;
		div.className = 'review';
	}
};

var ReviewTextRules = {
	"a.btn-show-review-text" : function(element) {
		PythonEvent.observe(element, "click", ReviewText.showText);
		
	},
	
	"a.btn-hide-review-text" : function(element) {
		PythonEvent.observe(element, "click", ReviewText.hideText);
		
	}
};

Behaviour.register(ReviewTextRules);

/* Newsletter Form */
var Newsletter = {
	"showForm" : function(event){
		var popup = PopupPositioner.getPosition(event, $("#newsletter-form").width(), $("#newsletter-form").height());
		// move newsletter-form to the body so we are OK with offsets and z orders.
		$("#page").before($("#newsletter-form"));
		$("#newsletter-form")
			.css("top", (popup.y - 10) + "px")
			.css("left", (popup.x - 10) + "px")
			.show();
		
		return false;
	},
	
	"hideForm" : function(event){
		$("#newsletter-form").hide();		
		return false;
	}
	
};

/* Order Email Customer */
var OrderEmailCustomer = {
	"showSubject" : function(event){
		var input = resolveEventElement(event);
		var td = input.parentNode;
		var tr = td.parentNode;
		var tbody = tr.parentNode;
		var tableRows = tbody.getElementsByTagName("tr");
		var hiddenSubjectRow;
		var subjectTextInputs;
		var subjectText;
		var button;
		var textArea;
		
		for(i=0; i<tableRows.length;i++){
			if($(tableRows[i]).hasClass("email-subject")){
				hiddenSubjectRow = tableRows[i];
				subjectTextInputs = hiddenSubjectRow.getElementsByTagName("input");
				subjectText = subjectTextInputs[0];
			}
		}
		
		/*Find the checkboxes*/
		var checkBoxes = tbody.getElementsByTagName("input");
		for(i=0; i<checkBoxes.length;i++){
			if($(checkBoxes[i]).hasClass("Update")){
				button = checkBoxes[i];
			}
		}
		
		var textAreas = tbody.getElementsByTagName("textarea");
		for(i=0; i<textAreas.length;i++){
				textArea = textAreas[i];
		}
		
		var internalCheckbox = document.getElementById("internal");
		
		if($(hiddenSubjectRow).hasClass("hide-row") && input.checked == true){
			$(hiddenSubjectRow).removeClass("hide-row");
			internalCheckbox.checked = true;
			button.src = 'media/image/site/btn-send.gif';
		}
		else{
			$(hiddenSubjectRow).addClass("hide-row");
			internalCheckbox.checked = false;
			$(textArea).text('');
			subjectText.value = '';
			button.src = 'media/image/site/btn-update.gif';
		}
		
		return true;
	},
	
	"showText" : function(event){
		
		var input = resolveEventElement(event);
		var td = input.parentNode;
		var tr = td.parentNode;
		var tbody = tr.parentNode;
		var textArea;
		var emailCustomerCheckbox;
		var button;
		var hiddenSubjectRow;
		var subjectTextInputs;
		var subjectText;
		
		/*Find the text area*/
		var textAreas = tbody.getElementsByTagName("textarea");
		for(i=0; i<textAreas.length;i++){
				textArea = textAreas[i];
		}
		/*Find the checkboxes*/
		var checkBoxes = tbody.getElementsByTagName("input");
		for(i=0; i<checkBoxes.length;i++){
			if($(checkBoxes[i]).hasClass("email-customer")){
				emailCustomerCheckbox = checkBoxes[i];
			}
			if($(checkBoxes[i]).hasClass("Update")){
				button = checkBoxes[i];
			}
		}
		
		/*Get the text selected from the drop down*/
		var text = "";
		var subject = "";
		var options = input.getElementsByTagName("option");
		for(i=0; i<options.length;i++){
			if ($(options[i]).attr("selected")){
				text = $(options[i]).attr("hidden");
				subject = $(options[i]).text();
			}
			
		}
		/*Find the internal checkbox*/
		var internalCheckbox = document.getElementById("internal");
		
		/*Find the subject row and subject box*/
		var tableRows = tbody.getElementsByTagName("tr");
		for(i=0; i<tableRows.length;i++){
			if($(tableRows[i]).hasClass("email-subject")){
				hiddenSubjectRow = tableRows[i];
				subjectTextInputs = hiddenSubjectRow.getElementsByTagName("input");
				subjectText = subjectTextInputs[0];
			}
		}
		
		$(textArea).text(text);
		if(text == null){
			$(textArea).text('');
			emailCustomerCheckbox.checked = false;			
			internalCheckbox.checked = false;
			$(hiddenSubjectRow).addClass("hide-row");
			subjectText.value = '';
			button.src = 'media/image/site/btn-update.gif';
		}
		else{
			emailCustomerCheckbox.checked = true;			
			internalCheckbox.checked = true;
			$(hiddenSubjectRow).removeClass("hide-row");
			subjectText.value = subject;
			button.src = 'media/image/site/btn-send.gif';
		}
		
		return true;
	}
	
};

function jQueryRegister(){
	/*
	Removed at request of connevans
	if ($("li.associated") != null){
		$("li.associated").mouseover(AssociatedProducts.showSummary);
	}
	if ($("li.additional") != null){
		$("li.additional").mouseover(AssociatedProducts.showSummary);
	}*/
	if ($("a.subscribe") != null){
		$("a.subscribe").click(Newsletter.showForm);
	}
	if ($("a.close") != null){
		$("a.close").click(Newsletter.hideForm);
	}
	if ($("input.email-customer") != null){
		$("input.email-customer").click(OrderEmailCustomer.showSubject);
	}
	if ($("select.email-template") != null){
		$("select.email-template").change(OrderEmailCustomer.showText);
	}
	$("a.delete, a.delete-account").each(function(link){
		if ($(this).attr("onclick") == null || $(link).attr("onclick") == ""){
			$(this).click(function(){
				return window.confirm("Are you sure you want to delete this item?");
			});
		}
	});

}

Behaviour.addLoadEvent(jQueryRegister);

