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

var loadDiv;
var productId;
var basePrice;
var priceAdjust;

window.addEvent("domready", function( ) {
	/*var els = $ES('#browseProductHolder a');
	$ES('.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( );
            handleLoad(el, id);
		}.bind(el));
	});
	
	var p = window.location.toString().split("#");
	if(p.length > 1) {
	    var anchor = p[1];
	    if(anchor.substring(0,7) == "holder-") {
	        handleLoad(
	            document.getElement("#"+anchor+" a"), anchor.substring(7).toInt()
	        );
	    }
	}
});

function handleLoad(el, id) {
    if(!el) return;

	if(transitioning) return;
	transitioning = true;
	showLoadMessage(id);
	loadProduct(
		document.getElement(
			"#holder-"+id+" .body"
		), el.href, id
	);
}

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

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

	new Fx.Style(el, "left").start(0, 100);
}

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

	new Fx.Style(el, "opacity").start(1);

	new Fx.Style(el, "left").start(100, 0);
}

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

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

	if(currentId) {
		if(!ret) (function( ) {show(url,id)}).delay(1500);
		hideProduct( );
		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 Ajax(
		url.replace(".html", "")+"/time="+$time( ), {
			onComplete: productLoaded,
			onFailure: productFailed
		}
	);
	currAjax.request( );
}

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.Style(viewLink.getParent( ), "opacity").start(0);
	}

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

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

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

		currSlide.slideIn( );
		transitioning = false;
	});
}

function productLoaded(html) {
	var script = html.match(/<script[^>]*>([\s\S]*?)<\/script>/gi);
	if(script) {
		var s = script[0];
		s = s.replace(/<script[^>]*>/, "");
		s = s.replace(/<\/script>/, "");

		if(s) {
			eval(s);
			priceAdjust = document.pAdjust;
			productId = pId;
			basePrice = document.bPrice;
		}
	}

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

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

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

	var text = new Element("div");
	text.addClass("loadedDiv");
	var introPara = body.getElement(".description");

	text.setOpacity(0);
	text.setStyle("visibility", "hidden");
	text.setStyle("position", "absolute");
	body.adopt(text);

	var info = body.getElement(".information");

	oldSlide = currSlide;
	currSlide = new Fx.Slide(info);
	currSlide.slideOut( ).chain(function( ) {
		text.setHTML(html);
		var bodyHeight = body.getSize( ).size.y;
		var paraHeight = introPara.getSize( ).size.y;
		var reqSize = paraHeight + text.getSize( ).size.y;
		text.remove( );

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

					transitioning = false;
			});
		} else {
			text.setHTML(html);
			new Fx.Style(text, "opacity")
				.start(1);
			hideLoadMessage(currentId);
		}
	});


}

function calculatePrice(id) {
	var holder = $('holder-'+id);
	if(holder) {
		var varieties = holder.getElements('select.variety');
		var basePrice = holder.getElement('input.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);
				}
			}
			if(priceChange[2]) {
			    newPrice *= 1.15;
			    newPrice = Math.round(newPrice*100)/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.");
	hideProduct( );
}

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 addProductFormHandlers(productId) {
	document.getElements(".productForm").each(
		function (el) {
			el.removeEvents("submit");
			el.addEvent("submit", function(ev) {
				new Event(ev).stop( );
		
				loadDiv = new Element("div");
				loadDiv.addClass("loader");
				var size = el.getParent( ).getParent( ).getSize( );
				loadDiv.setStyle("width", size.size.x);
				loadDiv.setStyle("height", size.size.y);

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

				tabMessage.setHTML("Please wait, checking stock...");

				var sizes = tabMessage.getSize( );

				loadDiv.adopt(tabMessage);
				document.body.adopt(loadDiv);

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

					el.send({
						onComplete: function(text) {
							try {
								eval("var json = "+text);
							} catch(err) {
								this.onFailure(text);
								return;
							}
							
							updateCartInfo( );
							showCartSummary(json);

						},
						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.Style(loadDiv, "opacity").start(0);
						}
					});
				});
		
			});
		}
		);

		calculatePrice(productId);

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

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( ).size.x -4;
	summary.setStyle("left", left);

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

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