var currAjax;
var currentId;
var currSlide;
var oldSlide;
var transitioning;

var loadDiv;
var productId;
var basePrice;
var priceAdjust;
var productShown = false;

var noClose = false;

if(Browser.Engine.trident == true && Browser.Engine.version == 4)
    slideProducts = false;

if(slideProducts) window.addEvent("domready", function( ) {
	$E('body').addEvent("click", function(ev) {
		if(productShown) {	
			new Event(ev).stopPropagation( );
			if(noClose) { noClose = false; return; }
			hideProduct( );
		}
	});
	$('largeFrame').addEvent("click", function(ev) {
		if(productShown) {
			new Event(ev).stopPropagation( );
		}
	});
	var els = $$('#browseProductHolder a');
	$$('.loading').each(function(el) {
		var parts = el.id.split("-");
		var id = parts[1];

		el.setOpacity(0);
		el.setStyle("display", "block");
		hideLoadMessage(id);
	});
	els.each(function(el) {
		var parts = el.id.split("-");
		var id = parts[1];
		el.addEvent("click", function(ev) {
			new Event(ev).stop( );
			if(transitioning) return;
			transitioning = true;
			$('largeFrame').empty( );
			showLoadMessage(id);
			loadProduct(
				document.getElement(
					"#holder-"+id+" .body"
				), el.href, id
			);
		}.bind(el));
	});

	var url = document.location.toString( );
	var match = url.match(/product\-(\d+)/i);

	if(match) {
		var el = $('header-'+match[1]);
		if(!el) return;
		var id = el[1];

		(function ( ) {
		
			if(transitioning) return;
			transitioning = true;
			$('largeFrame').empty( );
			showLoadMessage(id);
			loadProduct(
				document.getElement(
					"#holder-"+id+" .body"
				), el.href, id
			);
		}).delay(200);
	}

	
}); else 
	addProductFormHandlers($E('input[name=product-id]').value, text);

function hideLoadMessage(id) {
	/*var el = document.getElement("#loading-"+id);
	if(!el) return;

	new Fx.Tween(el, "opacity").start(0).chain(
		function( ) { this.setOpacity(0); }.bind(el)
	);

	new Fx.Tween(el, "left").start(0, 100);*/
}

function showLoadMessage(id) {
	var frame = $('largeFrame') ? $('largeFrame') : 
		new Element("div", {'id': "largeFrame", 'class': "mainView"});

	frame.remove( );
	document.body.adopt(frame);

	frame.setStyle("opacity", 0);
	frame.setStyle("display", "block");

	var bodyHeight = Window.getHeight( );
	var bodyWidth = Window.getWidth( );
	var frameWidth = frame.getWidth( );
	var frameHeight = frame.getHeight( );

	frame.setStyle("width", frameWidth);
	frame.setStyle("height", frameHeight);
	frame.setStyle("left", (bodyWidth / 2) - (frameWidth / 2));
	frame.setStyle("top", (bodyHeight / 2) - (frameHeight / 2));

	frame.tween("opacity", 1);
}

function loadProduct(element, url, id) {
	var ret = false;

	//if(currentId == id) { ret = true; }	

	if(currentId) {
		if(!ret) (function( ) {show(url,id)}).delay(1500);
		return;
	}

	if(ret) return;

	if(!currentId) {
		show(url, id);
	}
}

function show(url, id) {
	if(currAjax) {
		currAjax.cancel( );
		if(currentId) {
			hideLoadMessage(currentId);
		}
	}

	currentId = id;

	currAjax = new Request.HTML({
			url: url.replace(".html", "")+"/time="+$time( ),
			onComplete: productLoaded,
			onFailure: productFailed,
			evalScripts: true
		}
	);
	currAjax.get( );
}

function hideProduct( ) {
	/*if(!currentId) return;
	var id = currentId;
	currentId = null;
	hideLoadMessage(id);

	var body = document.getElement("#holder-"+id+" .body");
	if(!body) return;

	var viewLink = document.getElement("#view-"+id);

	if(viewLink) {
		new Fx.Tween(viewLink.getParent( ), "opacity").start(0);
	}

	var p = body.getElement(".loadedDiv");
	if(p) new Fx.Tween(p, "opacity").start(0).chain(function( ) {
		p.remove( );
		var introPara = body.getElement("p");	
		var info = body.getElement(".information");
		var reqSize = 	introPara.getSize( ).y +
				info.getSize( ).y;

		new Fx.Tween(body, "height").start(reqSize);

		viewLink.setHTML(
		    "View This Product &raquo;"
		);
		new Fx.Tween(
			viewLink.getParent( ),
			"opacity"
		).start(1);

		transitioning = false;
	});*/

	(function( ) { $('largeFrame').empty( ) }).delay(1500);

	//if(productShown) {
		new Fx.Tween($('largeFrame'), "opacity").start(0).chain(function( ) {

		});

		productShown = false;
		transitioning = false;
	//}
}

function productLoaded(html) {
    if(!html) return;
	var script;

	priceAdjust = document.pAdjust;
	productId = document.pId;
	basePrice = document.bPrice;

//	var body = document.getElement("#holder-"+currentId+" .body");
	//if(!body) return;

		var newDiv = new Element("div", {"style": "margin:0; padding:0;", "class":"mainView"});
		newDiv.setStyle("opacity", 0);
		newDiv.setStyle("display", "block");
		newDiv.setHTML(html[0].getParent( ).getHTML( ));		
		$('largeFrame').empty( );
		$('largeFrame').adopt(newDiv);
		var bodyHeight = Window.getHeight( );
		var bodyWidth = Window.getWidth( );
		var frameWidth = newDiv.getElement("form").getSize( ).x;
		var frameHeight = newDiv.getElement("form").getSize( ).y + 
			newDiv.getElement("h3").getSize( ).y;
 
		var toLeft = (bodyWidth / 2) - (frameWidth / 2);
		var toTop = (bodyHeight / 2) - (frameHeight / 2);
		var toWidth = frameWidth + 12;
		var toHeight = frameHeight - 10;
	
		var morph = new Fx.Morph($('largeFrame'));
		morph.start({
			"left":	toLeft,
			"top": toTop,
			"width": toWidth,
			"height": toHeight
		}).chain(function( ) {

			$('largeFrame').tween("opacity", 1);
			newDiv.tween("opacity", 1);
		});

		hideLoadMessage(currentId);

		addProductFormHandlers(newDiv.getElement("input[name=product-id]").value);

		productShown = true;
		transitioning = false;

		/*text.setHTML(html[0].getParent( ).getHTML( ));
		var bodyHeight = body.getSize( ).y;
		var paraHeight = introPara.getSize( ).y;
		var reqSize = paraHeight + text.getSize( ).y;
		text.remove( );

		if(reqSize > bodyHeight) {
			new Fx.Tween(body, "height").start(reqSize)
				.chain(function( ) {
					text.setStyle(
						"visibility", "visible"
					);
					text.setStyle(
						"display", "block"
					);
					text.setStyle(
						"position", "relative"
					);
					text.injectAfter(introPara);
					new Fx.Tween(text, "opacity")
						.start(1);
					viewLink.setHTML(
					    "&laquo; Hide This Product"
					);
					new Fx.Tween(
						viewLink.getParent( ),
						"opacity"
					).start(1);
					hideLoadMessage(currentId);
					addProductFormHandlers(currentId, text);
					Milkbox.initialize( );

					transitioning = false;
			});
		} else {
			text.setHTML(html[0].getParent( ).getParent( ).innerHTML);
			new Fx.Tween(text, "opacity")
				.start(1);
			hideLoadMessage(currentId);
		}*/


}

function calculatePrice(holder) {
	if(typeof(holder) == "string") holder = $('holder-'+holder);

	if(holder) {
		var varieties = holder.getElements('select.variety');
		var basePrice = holder.getElement('input.basePrice');

		if(!varieties || !basePrice) return;

		basePrice = basePrice.value.toFloat( );

		var newPrice = basePrice;			

		varieties.each(function(el) {
			var priceChange = priceAdjust[el.value];
			if(priceChange[0]) {
				if(priceChange[0] == "fixed") {
					newPrice += priceChange[1];
				} else {
					newPrice+= basePrice * 
						   ( priceChange[1] / 100);
				}
			}
		});

		holder.getElement(".currentPrice").setHTML(
			"&pound;"+number_format(newPrice, 2, ".", ",")
		);
	}
}

function productFailed( ) {
	alert("Sorry, we could not load the product.\n"+
	 	"Please try again later.");
}

function number_format( number, decimals, dec_point, thousands_sep ) {
    // Format a number with grouped thousands
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_number_format/
    // +       version: 803.2910
    // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     bugfix by: Michael White (http://crestidg.com)
    // +     bugfix by: Benjamin Lupton
    // +     bugfix by: Allan Jensen (http://www.winternet.no)    
    // *     example 1: number_format(1234.5678, 2, '.', '');
    // *     returns 1: 1234.57     

    var i, j, kw, kd, km, neg = "";

    // input sanitation & defaults
    if( isNaN(decimals = Math.abs(decimals)) ){
	decimals = 2;
    }
    if( dec_point == undefined ){
	dec_point = ".";
    }
    if( thousands_sep == undefined ){
	thousands_sep = ",";
    }

    i = parseInt(number = (+number || 0).toFixed(decimals)) + "";
    if (i.substr(0,1) == "-") {
	number = Math.abs(number);
	neg = "-";
	i = i.substr(1);
    }
    
    if ((j = i.length) > 3 ) {
	j = j % 3;
    } else {
	j = 0;
    }
    
    km = (j ? i.substr(0, j) + thousands_sep : "");
    kw = i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep);
    //kd = (decimals ? dec_point + Math.abs(number - i).toFixed(decimals).slice(2) : "");
    kd = (decimals ? dec_point + Math.abs(number - i).toFixed(decimals).replace(/-/, 0).slice(2) : "");
    return neg + km + kw + kd;
}

function displayImage(href, srcImage) {
	var loadDiv = new Element("div", {"class": "loadImage"});
	loadDiv.setStyle("display", "none");
	loadDiv.setOpacity(0);
	document.body.adopt(loadDiv);
	
	loadDiv.setStyle("width", srcImage.getSize( ).x);
	loadDiv.setStyle("height", srcImage.getSize( ).y);
	loadDiv.setStyle("left", srcImage.getPosition( ).x);
	loadDiv.setStyle("top", srcImage.getPosition( ).y);

	loadDiv.setStyle("display", "block");
	loadDiv.tween("opacity", 0.8);
	loadDiv.setHTML("&nbsp;");

	var im = new Element("img");
	im.addEvent("load", function( ) {
		(function ( ) {showImage(im, loadDiv);}).delay(1000);
	});
	im.src = href;
}

function showImage(im, toHide) {
	toHide.tween("opacity", 0);
	(function ( ) { toHide.destroy( ); }).delay(1500);

	var dispDiv = new Element("div", {"class": "zoomImage"});
	dispDiv.setStyle("display", "none");
	document.body.adopt(dispDiv);
	dispDiv.adopt(im);
	dispDiv.setOpacity(0);
	dispDiv.setStyle("display", "block");
	
	dispDiv.setStyle("width", im.width);
	dispDiv.setStyle("height", im.height);

	var top = (window.getSize( ).y / 2) - (im.height / 2);
	var left = (window.getSize( ).x / 2) - (im.width / 2);

	dispDiv.setStyle("left", left);
	dispDiv.setStyle("top", top);


	dispDiv.tween("opacity", 1);

	dispDiv.adopt(new Element("p").setHTML("Click image to close..."));
		noClose = true;

	document.body.addEvent("click", function(ev) {
		if(productShown) {
			new Event(ev).stop( );
			dispDiv.tween("opacity", 0);
			(function ( ) { dispDiv.destroy( ); }).delay(1500);
			window.removeEvent("click", this);
		}
	});
}

function addProductFormHandlers(productId, ele) {

	$$(".productForm").each(
		function (el) {
			var images = el.getElements("a[rel=zoomImage]");

			images.addEvent("click", function(ev) {
				new Event(ev).stop( );
				displayImage(this.href, this.getElement("img"));
			});

			el.removeEvents("submit");
			el.addEvent("submit", function(ev) {
				new Event(ev).stop( );
		
				loadDiv = new Element("div");
				loadDiv.addClass("loader");
				var size = $('largeFrame').getSize( );
				loadDiv.setStyle("width", size.x);
				loadDiv.setStyle("height", size.y);

				var dims = el.getParent( ).getParent( ).getPosition( );
				loadDiv.setStyle("left", 0);
				loadDiv.setStyle("top", 0);
				loadDiv.setOpacity(0);
				var tabMessage = new Element("div");
				tabMessage.addClass("tableLoad");
				tabMessage.setStyle("line-height", size.y+"px");
				tabMessage.setStyle("height", size.y+"px");

				tabMessage.setHTML("Please wait...");

				var sizes = tabMessage.getSize( );

				loadDiv.adopt(tabMessage);
				$('largeFrame').adopt(loadDiv);

				new Fx.Tween(loadDiv, "opacity").start(0, 0.85).chain(
					function( ) {

					el.set('send', {
						method: 'post',
						onComplete: function(text) {
							try {
								var json = JSON.decode(text);
							} catch(err) {
								this.onFailure(text);
								return;
							}
							
							updateCartInfo( );
							showCartSummary(json);
							hideProduct.delay(1000);
						},
						onFailure: function(resp) { 
							alert("Sorry, your product could "+
							"not be added.\n\nPlease try again "+
							"later, or contact a system "+
							"administrator if the\nproblem "+
							"persists.");
							new Fx.Tween(loadDiv, "opacity").start(0);
						}
					});
					el.send( );
				});
		
			});
		}
		);

		calculatePrice(productId);

		var varieties = document.getElements('select.variety');
		varieties.each(function(el) {
			el.removeEvent("change");
			el.addEvent("change", function(ev) {
				calculatePrice(el.getParent( ).getParent( ).getParent( ))
			});
		});
}

function showCartSummary(object) {
	var word;
	if(object.lastAddedQty && object.lastAddedQty > 1) word = "Items";
		else word = "Item";

	loadDiv.getElement("div").setHTML(word+" added successfully.");

	(function( ) {var summary = new Element("div");
	summary.addClass("cartSummaryInfo");

	summary.setHTML("Your basket: <strong>"+object.qty+"</strong> items "+
			"@ &pound;<strong>"+object.cost[0]+"</strong>");

	summary.setOpacity(0);
	document.body.adopt(summary);


	var top = Window.getScrollTop( ) + 4;
	summary.setStyle("top", top);
	var left = Window.getScrollWidth( ) - summary.getSize( ).x -4;
	summary.setStyle("left", left);

	new Fx.Tween(summary, "opacity").start(0,1).chain(function( ) {
		(function( ) { 
			new Fx.Tween(summary,"opacity").start(0).chain(
				function( ) { summary.remove( ); }
			);
		}).delay(2000);

		new Fx.Tween(loadDiv, "opacity").start(0);	
	});}).delay(1000);
}
