//stuff used for ordering prints online
// - mainly used by the gallery.php module
//
//$Log: commerce_utils.js,v $
//Revision 1.16  2008/01/11 12:33:47  diginnet
//another attempt to cope with the firefox layered form
//bug.
//
//Revision 1.15  2007/11/21 11:42:49  diginnet
//sync with live site
//
//Revision 1.13  2007/08/25 12:17:53  diginnet
//changes for new site
//
//Revision 1.12  2007/04/17 21:08:38  diginnet
//fix for non-updating of basket icons when an
//image is deleted
//
//Revision 1.11  2007/03/26 07:22:30  diginnet
//A couple of tweaks to prevent reload of gallery thumbnails
//- this needs a rewrte.
//
//Wrap currencyString() around order value - didn't affect
//screen display - just the email sent to me.
//
//Revision 1.10  2007/01/07 10:22:23  diginnet
//more major surgery to modularise / de-spaghetti the code
//
//Revision 1.9  2006/12/31 11:54:14  imogen
//Somehow, the checkout qty & value had
//been deleted - so this puts them back,
//and cleans up a bit.
//
//Revision 1.8  2006/12/31 10:23:16  imogen
//use show/hideObject() instead of hand-coding
//for showBasketOrder/CheckoutForm()
//
//Revision 1.7  2006/12/30 16:17:10  imogen
//Extensive surgery:
//Get rid of a load of spaghetti
//Implement stepped discounting
//
//Revision 1.6  2006/12/09 09:15:30  imogen
//Fix typo careflully => carefully on
//warning message for empty basket item(s)
//
//

var img_order = new Array();

//more unsavouiry globals
//=======================
var saved_gidx = 0;
var saved_iidx = 0;
var saved_scroll_top = 0;
var vat_rate = .175;

function setSavedGallery()
{
	saved_gidx = gallery_idx;
	saved_iidx = image_idx;
	saved_scroll_top = findObject("thumbtable").scrollTop;
}

function restoreSavedGallery()
{
	setGallery(saved_gidx); 
	loadImg(gallery_idx, saved_iidx);
	findObject("thumbtable").scrollTop = saved_scroll_top;
}

//set up an array to hold the print orders
//========================================
//This needs to be updated in real time as
//the user alters edit box contents etc.

if (gCommercial && typeof(gallery_ctr) != "undefined")
{

	for (g=0; g<gallery_ctr; ++g)
	{
		img_order[g] = new Array();
		for (i = 0; i < gallery_img_ctr[g]; ++i)
		{
			img_order[g][i] = new Array();
			for (p = 0; p < num_print_sizes; ++p)
			{
				img_order[g][i][p] = 0;
			}
		}	//so img_order[gallery][image][size]
	}		//holds the quantity of each size ordered

}


//var total_print_qty = 0;
//var total_print_price = 0;

var disable_print_order_update = false;
var current_basket_img_gidx = -1;
var current_basket_img_iidx = -1;

var client_collects = false;


function clientCollects()
{
	var chk_box = findObj("clientcollects");
	
	if (!chk_box)
	{
		alert("can't find client_collects check box");
		return;
	}
	
	var country = findObj("checkout_country");
		
	if (!country)
	{
		alert("can't find country list box");
		return;
	}
	
	if (chk_box.checked)
	{
		//set country to client collect
		//set the selected item to client collects
		country.selectedIndex = 0;	
		countryChange();
	}
	else
	{
		country.value = "uk";
		countryChange();
	}
	
	return;
}

function loadBasketThumbs() 
{

	var thumb_table_row = new Array();
	var thumb_table_cell = new Array();
	var spacer_table_cell = new Array();
	var t_img = new Array();
	var t_anchor = new Array();
	var t_anchor_txt = new Array();
	var current_row = -1;
	
	thumbSrcTimerClear();
	
	showBasketOrderForm(false);
	
	doc_body=document.getElementsByTagName("body").item(0);
	thumb_div = document.getElementById("thumbtable");
		
	if (!thumb_div)
	{
		alert("can't get thumb_div");
	}

	if (thumb_table)
	{
		thumb_div.removeChild(thumb_table);
	}
	
	thumb_table = document.createElement("TABLE");
	thumb_table_body = document.createElement("TBODY");

	j = row_img_limit;
	img_idx = 0;

	for (var g = 0; g < gallery_ctr; ++g)
	{
		for (var i = 0; i < gallery_img_ctr[g]; ++i)
		{
		
			if (!img_buy[g][i])
			{
				continue;
			}
				
			++j;
			if (j >= row_img_limit)
			{
				j = 0;
				++current_row;
				thumb_table_row[current_row]=document.createElement("TR");
				thumb_table_body.appendChild(thumb_table_row[current_row]);
			}
	
			thumb_table_cell[img_idx]=document.createElement("TD");
			t_img[img_idx] = document.createElement("img");
			t_img[img_idx].src = img_array[g][i];
			t_img[img_idx].width = 70;
			t_img[img_idx].height = 70;
			t_img[img_idx].alt = img_array[g][i];
			
			t_anchor[img_idx] = document.createElement("a");
						+'");';
			t_anchor[img_idx].href = 'javascript:loadBasketImg('
						+g + ',' +i + ');';
			t_anchor[img_idx].appendChild(t_img[img_idx]);
			
			thumb_table_cell[img_idx].appendChild(t_anchor[img_idx]);
			thumb_table_row[current_row].appendChild(thumb_table_cell[img_idx]);
			
			++img_idx;
	
		}	//end for (i...
	}	//end for (g...
	
	thumb_table.appendChild(thumb_table_body);
	thumb_div.appendChild(thumb_table);
	
}

function getPrintSizeIdxFromName(psize)
{

	for (var pidx = 0; pidx < print_sizes.length; ++ pidx)
	{
		if (print_sizes[pidx] == psize)
		{
			return pidx;
		}
	}
	
	return -1;
	
}

function loadCookies()
{
	//alert("loadCookies() : calling getCookie(username) : username = " + username);
	var cookie_str = getCookie(username);
	var show_warning = false;
	var baskettotqtyprints = findObj("baskettotqtyprints");
	var baskettotpriceprints = findObj("baskettotpriceprints");
	var vat = findObj("vat");
				
	if (!cookie_str || cookie_str.length == 0)
	{
	//	alert("Didn't find cookie for " + username);
		return;
	}
	
	//alert("Loading Cookie for " + username +
	//	" : cookie = " + cookie_str);
	for (var gidx = 0; gidx < gallery_ctr; ++gidx)
	{
		for (var iidx = 0; iidx < gallery_img_ctr[gidx]; ++iidx)
		{
			img_buy[gidx][iidx] = false;
			
			for (var pidx = 0; pidx < num_print_sizes; ++pidx)
			{
				img_order[gidx][iidx][pidx] = 0;
			}
		}
	}
	
	var cookie_array = cookie_str.split(":");
	//alert("Searching for " + cookie_array.length + " cookies");
	for (var cidx = 0; cidx < cookie_array.length; ++ cidx)
	{
		if (cookie_array[cidx].length == 0)
		{
			continue;
		}
		var order_details = cookie_array[cidx].split(",");
		var gidx = getGalleryIdxFromName(order_details[0]);
		var iidx = getImgIdxFromName(gidx, order_details[1]);
		var print_size_idx = getPrintSizeIdxFromName(order_details[2]);
		var qty = parseInt(order_details[3]);
		
		
	//	alert("gidx = " + gidx + "\n" +
	//		"iidx = " + iidx+ "\n" +
	//		"print name = " + order_details[2] + "\n" +
	//		"print_size_idx = " + print_size_idx + "\n" +
	//		"qty = " + qty);
		
		if (gidx >= 0 && iidx >= 0 && 
			print_size_idx >= 0 && qty >= 0)
		{
			img_order[gidx][iidx][print_size_idx] = qty; 
			buy_tot_order_qty += qty; 
			buy_tot_order_val += qty * print_prices[print_size_idx];
			buyImg(gidx, iidx, true);
		}
		else
		{
			show_warning = true;
		}
	}
	
		recalcOrderArray();
	
	/*	Not sure if this can be ditched ...
		var totdiscount = calcDiscount();
		
		findObj("totdiscount").value  = currencyString(totdiscount);
		
		//update display controls (talk about spaghetti code
		baskettotqtyprints.value = buy_tot_order_qty;
		baskettotpriceprints.value = currencyString(buy_tot_order_val);
		vat.value = currencyString( (buy_tot_order_val - totdiscount) * vat_rate );
		var tot_price = (buy_tot_order_val - totdiscount) * vat_rate;
		setObjValue("basketnetpriceprints", currencyString(tot_price));
	
	*/
	
	if (show_warning)
	{
		alert("WARNING:\nYou have pictures in your\nshopping basket"
			+ "\nfrom a previous viewing, but the\n"
			+ "\ngallery has been updated since then.\n"
			+ "\nYou should carefully check your\n"
			+ "shopping basket to make sure that"
			+ "\nyou have the pictures that you want");
	}
}


function makeCookieStr()
{
	if (!gCommercial)
	{
		return;
	}
	
	var cookie_str = username + "=";
	
	for (var gidx = 0; gidx < gallery_ctr; ++gidx)
	{
		
		for (var iidx = 0; iidx < gallery_img_ctr[gidx]; ++iidx)
		{
			var tot_qty = 0;
			
			var img_name = img_array[gidx][iidx].substring(img_array[gidx][iidx].lastIndexOf('/') + 1);
				
			for (var pidx = 0; pidx < num_print_sizes; ++pidx)
			{
				var qty = img_order[gidx][iidx][pidx];
				
				
				if (qty == 0)
				{
					continue;
				}
				
				tot_qty += qty;
				
				cookie_str += (gallery_name[gidx] + "," +
						img_name + "," +
						print_sizes[pidx] + "," + qty + ":");
			}
			
			if (img_buy[gidx][iidx] && tot_qty == 0)
			{
				//picture chosen, but no
				//size / qty ordered.
				//save a zero-value cookie
				cookie_str += (gallery_name[gidx] + "," +
						img_name + "," +
						print_sizes[0] + "," + tot_qty + ":");
			}
		}
	}
	
	return cookie_str;
	
}

function saveCookies()
{
	var days_to_expire = 7;
	var expiry_date = new Date(new Date().getTime() + (days_to_expire * 24 * 60 * 60 * 1000) );
	var cookie_str = makeCookieStr()+"; expires=" + expiry_date.toGMTString();
	
	//alert("Saving Cookies : cookie_str = " + cookie_str);
	
	document.cookie = escape(cookie_str);
	
	return;
}

function setCookie(cookie_name, cookie_val)
{
	document.cookie = cookie_name + "=" + cookie_val;

}

function getCookie(cookie_name)
{
	var cookie_str = unescape(document.cookie);
	
	//alert("looking for cookie for username " + cookie_name +
	//	", found cookie_str " + cookie_str);
	
	if (!cookie_str)
	{
		return null;
	}
	
	var cookie_str_array = cookie_str.split(";");
		
	//alert("cookie_str_array.length = " + cookie_str_array.length +
	//	"\ncookie_str_array[0] = " + cookie_str_array[0]);
	
	for (var i = 0; i < cookie_str_array.length; i++)
	{
		var cookie_val = cookie_str_array[i].split("=");
		var cookie_username = cookie_val[0].rtrim();
	
	//	alert("looking for " + cookie_name + 
	//	"\nfound : cookie_val.length = " + cookie_val.length +
	//	"\ncookie_val[0] = >" + cookie_val[0] + "<" +
	//	"\ncookie_username = >" + cookie_username + "<" +
	//	"\ncookie_val[1] = >" + cookie_val[1] + "<");
		
		if (cookie_username == cookie_name)
		{
	//		alert("Found what we're looking for ... " +
	//			cookie_val[1]);
				
			return cookie_val[1];
		}
		
	}
	
	
	return null;
	
}

function clearAllCookies()
{
	var cookie_str = document.cookie;
	var cookie_str_array = cookie_str.split(";");
	
	//alert("document.cookie = " + document.cookie);
	
	for (var i = 0; i < cookie_str_array.length; i++)
	{
		var cookie_val = cookie_str_array[i].split("=");
		/*
		alert("looking for " + cookie_val + 
		", found : cookie_val.length = " + cookie_val.length +
		", cookie_val[0] = " + cookie_val[0] +
		", cookie_val[1] = " + cookie_val[1]);
		*/
		clearCookie(cookie_val[0]);
		
	}
	
}

function clearCookie(cookie_name)
{
	var epoch = "=;expires=Thu, 01Jan-70 00:00:01 GMT;path=/";
	document.cookie = cookie_name + epoch;
}



//	checkout()
//	==========
//
//Send the order to be processed
//First, validate the email address
//plus the existence of name, address
//
function validate_checkout()
{
	var checkout_basket_string = findObj("checkout_basket_string");
	var dbg = false;
	
	
	
	if (!checkout_basket_string)
	{
		alert("Unable to find checkout string control\n" +
			"Please contact Imogen Photographic");
		return false
	}
	
	//
	if (!validEmail(findObj("checkout_email")))
	{
		return false;
	}
	
	if (!validName(findObj("checkout_surname")))
	{
		return false;
	}
	
	if (!validName(findObj("checkout_forenames")))
	{
		return false;
	}
	
	if (!(findObj("clientcollects").checked))
	{	//only validate address if client is NOt
		//collecting
	
		if (!validPostcode(findObj("checkout_postcode"), findObj("checkout_country").value))
		{
			return false;
		}
		
		if (!validAddress(findObj("checkout_address")))
		{
			return false;
		}
		
		//make mods to the address
		// - replace commas by spaces,
		//then replace newline by comma
		var formControl = findObj("checkout_address");
		formControl.value = formControl.value.replace(/,/g, ' ').replace(/\r\n/g, ',').replace(/\n/g, ',');
		
	}
	
	checkout_basket_string.value = makeCookieStr();
	
	if (dbg)
	{
		alert("Debug Mode:\nOrder String = " + 
		checkout_basket_string);
		return false;
	}
	
        showObject("checkout_be_patient");
	hideObject("checkout_form_table");
	clearAllCookies();
	
	return true;
}

function clearAllOrders(ask_first)
{
	var num_photos = getNumPhotosInBasket();
	var singular_plural = (num_photos == 1) ? "is" : "are";
	var photo_photos = (num_photos == 1) ? "photo" : "photos";
	if (ask_first && !confirm("You are about to empty your basket," +
			"containing " + num_photos + 
			" " + photo_photos + "." +
			"\n\nIf you DON'T want to do this, click cancel," +
			" otherwise, click OK to confirm"
			))
	{
		return;
	}
	
	clearAllCookies();
	
	buy_tot_order_qty = 0;
	buy_tot_order_val = 0;
	buy_ctr = 0;
	
	for (var gidx = 0; gidx < gallery_ctr; ++gidx)
	{
		for (var iidx = 0; iidx < gallery_img_ctr[gidx]; ++iidx)
		{
			img_buy[gidx][iidx] = false;
			
			for (var pidx = 0; pidx < num_print_sizes; ++pidx)
			{
				img_order[gidx][iidx][pidx] = 0;
			}
		}
	}
	
	hideObject("checkout");
	
	setObjValue("baskettotqtyprints", 0);
	
	setObjValue("baskettotpriceprints", currencyString(0));
	
	setObjValue("totdiscount", currencyString(0));
	
	setObjValue("vat", currencyString(0));
	
	setObjValue("checkout_num_prints", 0);
	
	setObjValue("checkout_order_value", currencyString(0));
	
	setObjValue("checkout_postage", currencyString(0));
	
	setObjValue("checkout_invoice_total", currencyString(0));
	
	setObjValue("basketnetpriceprints", currencyString(0));
	
	hideObject("clear_basket_img");
	
	hideObject("basket_view");
	
	//force the view
	//back to the standard gallery
	if (gallery_type == "std")
	{
		showBasketIcons(gallery_idx, img_idx);
	}
	else
	{
		gallery_type = "std";
		setGallery(0);
		showBasketIcons(0, 0);
	}
}


//	countryChange()
//	===============
//	called when the country code is changed
//	in the checkout form
//	
//	needs to change the postage charge, and 
//	update the total order value
//	
function countryChange()
{
	
	checkout_order_discount = calcDiscount();
		
	setObjValue("checkout_num_prints", buy_tot_order_qty);
	setObjValue("checkout_order_discount", currencyString(checkout_order_discount));
	setObjValue("checkout_order_value", currencyString(buy_tot_order_val - checkout_order_discount));
	var vat = (buy_tot_order_val - checkout_order_discount) * vat_rate;
	setObjValue("checkout_order_vat", currencyString(vat));
	
	var country = getObjValue("checkout_country");
	var postage_rate = postage[country].percentage;
	var postage_min = postage[country].minimum_charge;
	var postage_cost = buy_tot_order_val * (postage_rate / 100.0);
	if (postage_cost < postage_min)
	{
		postage_cost = postage_min;
	}
	buy_invoice_total = buy_tot_order_val - checkout_order_discount + vat + postage_cost;
	
	setObjValue("checkout_postage", currencyString(postage_cost));
		
	setObjValue("checkout_invoice_total", currencyString(buy_invoice_total));
	
	return;
}

function refreshCheckoutForm()
{
	countryChange();
}

function printOrderChange(price_idx,label)
{
	var formControl = findObj(label);
	var qty = 0;
	var tot_qty = 0;
	var this_img_tot_qty = 0;
	var this_img_tot_price = 0;
	var unit_price = 0;
	var tot_price = 0;
	var basket_tot_qty = 0;
	var basket_tot_price = 0;
	var postage = 0;
	var invoice_total = 0;
	var discount_total = 0;
	
	//when an image is loaded for display
	//into the view area, the values will
	//be changed on the display, causing the
	//onChange() event to be fired.
	//disable_print_order_update is a hack
	//to get around this.
	
	if (disable_print_order_update)
	{
		return;
	}
	
	if (current_basket_img_gidx < 0 || 
  		current_basket_img_iidx < 0)
  	{
  		alert("Can't set img_order value, gidx = " + current_basket_img_gidx +
  			", iidx = " + current_basket_img_iidx);
  	
  		return;
  	}
  	
	if (!formControl)
	{
		alert("unable to find formControl, id = " + label);
		return;
	}
	
	qty = parseInt(formControl.value);
	
	img_order[current_basket_img_gidx][current_basket_img_iidx][price_idx]  = qty;
	
	formControl = findObj("unit_price" + label);
	if (!formControl)
	{
		alert("unable to find formControl, id = unit_price" + label);
		return;
	}
	
	unit_price = parseFloat(formControl.value);
	
	formControl = findObj("tot_price" + label);
	if (!formControl)
	{
		alert("unable to find formControl, id = tot_price" + label);
		return;
	}
	
	tot_price = qty * unit_price;
	
	formControl.value = currencyString(tot_price);
	
	recalcOrderArray();
	
	for (var pidx = 0; pidx < num_print_sizes; ++pidx)
	{
		var this_print_size_qty = img_order[current_basket_img_gidx][current_basket_img_iidx][pidx];
		this_img_tot_qty += this_print_size_qty;
		this_img_tot_price += (this_print_size_qty * print_prices[pidx]);
	}
	
	var checkout = findObj("checkout");
	
	if (!checkout)
	{
		alert("Unable to find checkout image");
	}
	checkout.style.visibility = basket_tot_qty > 0 ? "visible":"hidden";
	
	var clear_basket = findObj("clear_basket_img");
	
	if (!clear_basket)
	{
		alert("Unable to find clear basket image");
	}
	
	clear_basket.style.visibility = checkout.style.visibility;
	
	formControl = findObj("totqtyprints");
	if (!formControl)
	{
		alert("unable to find formControl, id = totqtyprints");
		return;
	}
	
	formControl.value = this_img_tot_qty;
	
	formControl = findObj("totpriceprints");
	if (!formControl)
	{
		alert("unable to find formControl, id = totpriceprints");
		return;
	}
	
	
	formControl.value = currencyString(this_img_tot_price);
	
	showBasketIcons(current_basket_img_gidx, current_basket_img_iidx)
}

function getNetOrderValue()
{
	return buy_tot_order_val - calcDiscount();
}


function calcDiscount()
{
	//var print_cost_prices = new Array();
	//var print_min_markup = new Array();
	//var print_multiplier = new Array();
	//var print_discount_steps = new Array();
	var print_count = new Array();
	
	for (var didx = 0; didx < num_print_sizes; ++didx)
	{
		print_count[didx] = 0;
	}
	
	var discount = 0;

	for (var gidx = 0; gidx < gallery_ctr; ++gidx)
	{
		
		for(var iidx = 0; iidx < gallery_img_ctr[gidx]; ++iidx)
		{
			if (!img_buy[gidx][iidx])
			{
				continue;
			}
				
			for(var pidx = 0; pidx < num_print_sizes; ++pidx)
			{
				print_count[pidx] += img_order[gidx][iidx][pidx];
			}
		}
	}
	
	for (var pidx = 0; pidx < num_print_sizes; ++pidx)
	{
		//First one is not free, so
		if (print_count[pidx] <= 1)
		{
			continue;
		}
		
		var delta = ((print_cost_prices[pidx] * print_multiplier[pidx])
			    - (print_cost_prices[pidx] + print_min_markup[pidx]) ) / print_discount_steps[pidx];
			    
		var current_discount = 0;
			
			
		--print_count[pidx]; 
		
		for (var pctr = 0;
			 pctr < print_count[pidx];
			 ++pctr)
		{
			if (pctr < print_discount_steps[pidx])
			{
				current_discount += delta;
			}
			discount += current_discount;
		}
	}
	
	if (discount > 0)
	{
		discount *= 100;
		discount = parseFloat(parseInt(discount)) / 100;
	}
	//alert("Discount = " + discount);
	
	return discount;
	
}

//Set the print order values in the browser
//for the currently selected image

function setPrintOrderDisplay(gidx, iidx)
{
	var tot_qty = 0;
	var tot_price = 0;
	var formControl;
		
	for (p = 0; p < num_print_sizes; ++p)
	{
		var qty;
		var unit_price;
		var price;
		
		formControl = findObj(print_sizes[p]);
		if (!formControl)
		{
			alert("Couldn't set " + print_sizes[p] +
				"print order for [" + gidx +
				"][" + iidx + "]"); 
		}
		
		qty = parseInt(img_order[gidx][iidx][p]);
		tot_qty += qty;
		
		//formControl.value = qty;
		formControl.selectedIndex = qty;
		
		formControl = findObj("unit_price" + print_sizes[p]);
		if (!formControl)
		{
			alert("Couldn't set " + print_sizes[p] +
				"print order for [" + gidx +
				"][" + iidx + "]"); 
		}
		
		unit_price = formControl.value;
		
		formControl = findObj("tot_price" + print_sizes[p]);
		if (!formControl)
		{
			alert("Couldn't set " + print_sizes[p] +
				"print order for [" + gidx +
				"][" + iidx + "]"); 
		}
		
		price = qty * unit_price;
		tot_price += parseFloat(price);
		
		formControl.value = currencyString(price);
	
	}
	
	
	
	formControl = findObj("totqtyprints");
	if (!formControl)
	{
		alert("unable to find formControl, id = totqtyprints");
		return;
	}
	
	formControl.value = tot_qty;
	
	formControl = findObj("totpriceprints");
	if (!formControl)
	{
		alert("unable to find formControl, id = totqtyprints");
		return;
	}
	
	formControl.value = currencyString(tot_price);
	
}

function showBasketOrderForm(showBasket)
{
	if (showBasket)
	{
		var img1 = getScreenCoords("img_frame");
		var x = img1.x;
		var y = img1.y;
		showObjectAt("basket_form_table", x, y);
	}
	else
	{
		hideObject("basket_form_table");
	}
}

function showBasketCheckoutForm(showBasket)
{
	if (showBasket)
	{
		refreshCheckoutForm();
		syncXYCoords("checkout_form_table", "gallery_main_table");
		
    /*if (isFirefox())
		{
			var checkout_form_table = findObj("checkout_form_table");
			//checkout_form_table.style.top -= document.body.scrollTop;
			checkout_form_table.style.position = "fixed";
		}
		*/
		showObject("checkout_form_table");
	}
	else
	{
		hideObject("checkout_form_table");
	}
}

function getPostage()
{
	var postage = 1.5;

	return postage;
}

function updateCheckoutForm()
{
	var formControl = findObj("checkout_num_prints");
	
	if (!formControl)
	{
		alert("can't find checkout_num_prints");
		return;
	}
	formControl.value = buy_tot_order_qty;
	
	formControl = findObj("checkout_order_value");
	if (!formControl)
	{
		alert("can't find checkout_order_value");
		return;
	}
	
	formControl.value = currencyString(getNetOrderValue());
	
	formControl = findObj("checkout_postage");
	if (!formControl)
	{
		alert("can't find checkout_postage");
		return;
	}
	buy_tot_postage = getPostage();
	formControl.value = currencyString(buy_tot_postage);
	
	formControl = findObj("checkout_invoice_total");
	if (!formControl)
	{
		alert("can't find checkout_invoice_total");
		return;
	}
	
	formControl.value = currencyString(buy_tot_postage + buy_tot_order_val);
	
}

function basketCheckout()
{
	//Check to see whether any images
	//still need to have print sizes
	//specified.
	
	for (var gidx = 0; gidx < gallery_ctr; ++gidx)
	{
		var print_ordered = false;
		
		for(var iidx = 0; iidx < gallery_img_ctr[gidx]; ++iidx)
		{
			if (!img_buy[gidx][iidx])
			{
				continue;
			}
				
			print_ordered = false;
			
			for(var pidx = 0; pidx < num_print_sizes && !print_ordered; ++pidx)
			{
				if (img_order[gidx][iidx][pidx] > 0)
				{
					print_ordered = true;
				}
			}
			
			if (!print_ordered)
			{
				alert("You have not specified the print sizes " +
					" for one or more of the images that are " +
					"in your basket." +
					" Please go through them and choose your print sizes," +
					" or remove the prints from your basket" +
					"\nThank you");
				return;
			}
		}
	}
	
	gallery_type = "checkout";
	showBasketOrderForm(false);
	var basket_img = findObj("basket_img");
	var basket_cancel_img = findObj("basket_cancel_img");
	var checkout = findObj("checkout");
	var viewBasket = findObj("basket_view");
	
	basket_img.style.visibility = "hidden";
	//basket_cancel_img.style.visibility = "hidden";
	checkout.style.visibility = "hidden";
	viewBasket.style.visibility = "hidden";
	loadBasketThumbs();
	
	findObj('Image1').src = "images/blank_pic.gif";
	
	showBasketCheckoutForm(true);
	
}

function viewBasket()
{
	loadBasketThumbs();
	
	if (buy_ctr > 0)
	{
		var gidx = 0;
		var iidx = 0;
		
		while (!img_buy[gidx][iidx])
		{
			++iidx;
			if (iidx == gallery_img_ctr[gidx])
			{
				++gidx;
				iidx = 0;
			}
			
		}
		
		loadBasketImg(gidx, iidx);
	}
	
	gallery_type = "basket";
	
	hideObject('sort_g_asc');
	hideObject('sort_g_desc');
	hideObject('slide_show');
	
	showObject('your_basket');
	
	showBasketIcons(gidx, iidx); 
	
	return;
	 
}

function addAllToBasket(gidx)
{
	if (!isVisible("basket_choose_all_img"))
	{
		return;
	}
	
	if (!confirm("Are you sure that you want to\nadd all the pictures to\nthe basket?"))
	{
		return;
	}
	
	for (var img_idx = 0; img_idx < gallery_img_ctr[gidx]; ++img_idx)
	{
		buyImg(gidx, img_idx, true);
	}
	
	showBasketIcons(gallery_idx, image_idx); 
	
	return;

}


function addToBasket(gidx, iidx, buy)
{
	if (!isVisible("basket_img"))
	{
		return;
	}
	
	buyImg(gidx, iidx, buy);
	
	showBasketIcons(gidx, iidx); 
	
	return;

}


function removeFromBasket(gidx, iidx)
{
	//if (!isVisible("basket_cancel_img"))
	//{
	//	return;
	//}
	
	buyImg(gidx, iidx, false);
	
	return;

}

function buyImg(gidx, iidx, buy)
{
	
	if (img_buy[gidx][iidx] == buy)
	{
		return;
	}
	
	img_buy[gidx][iidx] = buy;
		
	if (buy)
	{
		++buy_ctr;
	}
	else
	{
		--buy_ctr;
		for (var pidx = 0; pidx < print_prices.length; ++pidx)
		{
			img_order[gidx][iidx][pidx] = 0;
		}
		
		recalcOrderArray();
		
		updateCheckoutForm();
	}
	
	if (buy_ctr == 0)
	{
		//gallery_type = "std";
		if (gallery_type == "std")
		{
			showBasketIcons(gidx, iidx);
		}
		else
		{
			setGallery(0);
		}
	}
	
	if (gallery_type == "basket" ||
		gallery_type == "checkout")
	{
		viewBasket();
	}
	else
	{
		showBasketIcons(gidx, iidx);
	}
	//showBasketIcons(gidx, iidx);

}

function showBasketIcons(gidx, iidx)
{
	
	setObjectVisibility("basket_choose_all_img", gallery_type == "std");
	setObjectVisibility("clear_basket_img", buy_ctr > 0);
	setObjectVisibility("checkout", parseFloat(buy_tot_order_val) > 0.0);
	
	setObjectVisibility("basket_choose_all_img", gallery_type == "std"); 
	setObjectVisibility("basket_view", buy_ctr > 0 
					&& (gallery_type == "std" 
					   || gallery_type == "checkout"));
	
	//setObjectVisibility("basket_cancel_img",
	//			iidx >= 0 && img_buy[gidx][iidx]);
	
	
	setObjectVisibility("basket_img", 
				iidx >= 0 &&
				!img_buy[gidx][iidx] &&
				gallery_type == "std");
	
}

function recalcOrderArray()
{

	buy_tot_order_qty = 0;
	buy_tot_order_val = 0;
	
	for (var gidx = 0; gidx < gallery_ctr; ++gidx)
	{
		for (var iidx = 0; iidx < gallery_img_ctr[gidx]; ++iidx)
		{
			for (var pidx = 0; pidx < num_print_sizes; ++pidx)
			{
				var qty = img_order[gidx][iidx][pidx];
				img_buy[gidx][iidx] = qty > 0 ? true : img_buy[gidx][iidx];
				buy_tot_order_qty += qty;
				buy_tot_order_val += (qty * print_prices[pidx]);
			}
		}
	}
	
	setObjValue("baskettotqtyprints", buy_tot_order_qty);
	setObjValue("baskettotpriceprints", currencyString(buy_tot_order_val));
	
	var discount = calcDiscount();
	setObjValue("totdiscount", currencyString(discount));
	
	var vat = (buy_tot_order_val - discount) * vat_rate;
	setObjValue("vat", currencyString(vat));
	
	var tot_price = buy_tot_order_val - discount + vat;
	setObjValue("basketnetpriceprints" , currencyString(tot_price));
	
	return;
}


function syncPrintSizes()
{
	//
  	//current_basket_img_gidx
  	//current_basket_img_iidx
  	// - these identify the current
  	//	gallery / print
	
	disable_print_order_update = true;

	for (var gidx = 0; gidx < gallery_ctr; ++gidx)
	{
		for(var iidx = 0; iidx < gallery_img_ctr[gidx]; ++iidx)
		{
			//skip the image if it is the sync image 
			if (gidx == current_basket_img_gidx
				&& iidx == current_basket_img_iidx)
			{
				continue;
			}
			
			if (!img_buy[gidx][iidx])
			{
				continue;
			}
			
			for (var pidx = 0; pidx < print_prices.length; ++pidx)
			{
				//first, remove all the print size orders
				//for this image ...
				img_order[gidx][iidx][pidx] = 0;
				
				//now set the number of prints of this size ordered ...
				img_order[gidx][iidx][pidx] = img_order[current_basket_img_gidx]
									[current_basket_img_iidx]
									[pidx];
				
			}
			
			
		
		}
	}

	recalcOrderArray();
	disable_print_order_update = false;
	
	return;
}

function loadBasketImg(gidx, iidx)
{
	//var x=findObj('Image1');
	var x=findObj('checkout_thumb');
	if (!x)
	{
		return;
	}
  	
  	if (gidx < 0 || iidx < 0)
  	{
  		alert("loadBasketImg(" +
  			gidx + ", " + iidx + ")");
  		return;
  	}
  	
  	current_basket_img_gidx = gidx;
  	current_basket_img_iidx = iidx;
  	
	//prevent looping of
	//change events
	disable_print_order_update = true;
	
	//x.src = img_array[gidx][iidx].replace(/thumb/g, "slide_show");
	//current_img = x.src.replace(/.*gallery/, "");
	
	x.src = img_array[gidx][iidx];
	//
	gallery_idx = gidx;
	img_idx = iidx;

	showBasketIcons(gidx, iidx);
	showBasketOrderForm(true);
	showBasketCheckoutForm(false);
	setPrintOrderDisplay(gidx, iidx);

	disable_print_order_update = false;
	
	return;
}

function getNumPhotosInBasket()
{
	var num_photos = 0;
		
	for (var gidx = 0; gidx < gallery_ctr; ++gidx)
	{
		for(var iidx = 0; iidx < gallery_img_ctr[gidx]; ++iidx)
		{
			if (!img_buy[gidx][iidx])
			{
				continue;
			}
				
			++num_photos;
		}
	}
	
	
	return num_photos;
}

