// JavaScript Document

<!--

userAgent = window.navigator.userAgent;
browserVers = parseInt(userAgent.charAt(userAgent.indexOf("/")+1),10);

function changeImages(oldImage,newImage) {
	document['meths'].src = "/images/onion/" + newImage + ".gif";
}

function startIEMenuListener() {
	if (document.all&&document.getElementById) {
		navRoot = document.getElementById("nav");
		for (i=0; i<navRoot.childNodes.length; i++) {
			node = navRoot.childNodes[i];
			if (node.nodeName=="LI") {
				node.onmouseover=function() { this.className+=" over"; }
				node.onmouseout=function() { this.className=this.className.replace(" over", ""); }
			}
		}
	}
}

function newImage(arg) {
	if (document.images) {
		rslt = new Image();
		rslt.src = arg;
		return rslt;
	}
}

function findElement(n,ly) {
	if (browserVers < 4)		return document[n];
	var curDoc = ly ? ly.document : document;
	var elem = curDoc[n];
	if (!elem) {
		for (var i=0;i<curDoc.layers.length;i++) {
			elem = findElement(n,curDoc.layers[i]);
			if (elem) return elem;
		}
	}
	return elem;
}

/*
function changeImages() {
	if (document.images) {
		var img;
		for (var i=0; i<changeImages.arguments.length; i+=2) {
			img = null;
			if (document.layers) {
				img = findElement(changeImages.arguments[i],0);
			}
			else {
				img = document.images[changeImages.arguments[i]];
			}
			if (img) {
				img.src = changeImages.arguments[i+1];
			}
		}
	}
}
*/

function search_selected() {
  if ( document.search_form.keyword.value == "Search Author, Title or ISBN" ) { document.search_form.keyword.value = ''; }
  document.search_form.keyword.className='searchtext_on';
}

function email_selected() {
  if ( document.subscribe.txtEmail.value == "Email" ) { document.subscribe.txtEmail.value = ''; }
}

function search_ISBN_selected() {
  if ( document.search_form_ISBN.search_ISBN.value == "ISBN" ) { document.search_form_ISBN.search_ISBN.value = ''; }
  document.search_form_ISBN.search_ISBN.className='searchtext_on';
}

function MM_jumpMenu(targ,selObj,restore){ //v3.0
  eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
  if (restore) selObj.selectedIndex=0;
}

function MM_preloadImages() { //v3.0
  var d=document;
  if(d.images){
	if(!d.MM_p) d.MM_p=new Array();
	var i,j=d.MM_p.length,a=MM_preloadImages.arguments;
	for(i=0; i<a.length; i++) {
	  if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}
	}
  }
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr;
  for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;
  if(!d) d=document;
  if((p=n.indexOf("?"))>0&&parent.frames.length) {
	d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);
  }
  if(!(x=d[n])&&d.all) x=d.all[n];
  for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n);
  return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments;
  document.MM_sr=new Array;
  for(i=0;i<(a.length-2);i+=3) {
   if ((x=MM_findObj(a[i]))!=null) {
	 document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];
   }
  }
}

function MM_openBrWindow(theURL,winName,features) { //v2.0
  window.open(theURL,winName,features);
}

function check_insert(type) {
  document.generic_form.action += '&action=ins';
  document.generic_form.submit();
}

function check_update(type) {
  if ( document.generic_form.id.selectedIndex < 0 ) {
	alert('Select a row first!');
  } else {
	document.generic_form.action += '&action=upd&id=' + document.generic_form.id[document.generic_form.id.selectedIndex].value;
	document.generic_form.submit();
  }
}

function check_delete(type) {
  if ( document.generic_form.id.selectedIndex < 0 ) {
	alert('Select a row first!');
  } else {
	if (confirm("Are you sure you want to delete")) {
	if ( typeof document.generic_form.id.selectedIndex == 'undefined' ) {
	  document.generic_form.action += '&action=del&id=' + document.generic_form.id.value;
	} else {
	  document.generic_form.action += '&action=del&id=' + document.generic_form.id[document.generic_form.id.selectedIndex].value;
	}
	document.generic_form.submit();
	}
  }
}

function do_popup(url, l_width, l_height, l_scroll)
{
  if (document.all)
	var xMax = screen.width, yMax = screen.height;
  else
	if (document.layers)
	  var xMax = window.outerWidth, yMax = window.outerHeight;
	else
	  var xMax = 640, yMax=480;

  var xOffset = (xMax - l_width)/2, yOffset = (yMax - l_height)/2;

  var details = 'location=0,status=0,resizable=1,scrollbars='+l_scroll+',width='+l_width+',height='+l_height+',';
  details = details + 'screenX='+xOffset+',screenY='+yOffset+',top='+yOffset+',left='+xOffset;

  window.open(url,'title',details);
}

function check_customer_form()
{	
	if ( !checkemail(document.generic_form.txtEmail.value)) {
		alert('You must enter a valid email address!');
		return false;
	}
	if ( document.generic_form.txtFirstname.value == '') {
		alert('You must enter a firstname!');
		return false;
	}
	if ( document.generic_form.txtSurname.value == '') {
		alert('You must enter a surname!');
		return false;
	}
	if ( document.generic_form.txtEmail.value == '') {
		alert('You must enter an email address!');
		return false;
	}
	if ( document.generic_form.txtPhone.value == '') {
		alert('You must enter a contact phone number!');
		return false;
	}	
	/*if ( document.generic_form.txtCC.value == '' ) {
		alert('You must enter a credit card number!');
		return false;
	}
	
	if (!testCreditCard())
	{
		return false;
	}*/ 
	
	if ( document.generic_form.txtAddress1.value == '' && document.generic_form.txtAddress2.value == '' && document.generic_form.txtAddress3.value == '' && document.generic_form.txtAddress4.value == '') {
		alert('You must enter a billing address!');
		return false;
	}
	if ( document.generic_form.txtAddress1.value == '' ) {
		alert('You must enter a billing address starting in Address field 1!');
		return false;
	}
	if ( document.generic_form.txtPostcode.value == '' ) {
		alert('You must enter a postcode!');
		return false;
	}

	if (document.generic_form.cbDelivery.checked)
	{
		if ( document.generic_form.txtDAddress1.value == '' && document.generic_form.txtDAddress2.value == '' && document.generic_form.txtDAddress3.value == '' && document.generic_form.txtDAddress4.value == '') {
			alert('You must enter a delivery address!');
			return false;
		}
		if ( document.generic_form.txtDAddress1.value == '' ) {
			alert('You must enter a delivery address starting in Address field 1!');
			return false;
		}
		if ( document.generic_form.txtDPostcode.value == '' ) {
			alert('You must enter a postcode!');
			return false;
		}
	}
	
	document.generic_form.submit();
}

//function showDeliveryAddress()
//{
//	if (document.generic_form.cbDelivery.checked == true) {
//		document.getElementById('divDelivery').style.display = 'block';
//	} else {
//		document.getElementById('divDelivery').style.display = 'none';
//	}
//}

function showSetBooks()
{
	if (document.generic_form.all_books.checked == false) {
		document.getElementById('divAllBooks').style.display = 'block';
		document.getElementById('divAllBooks1').style.display = 'block';
	} else {
		document.getElementById('divAllBooks').style.display = 'none';
		document.getElementById('divAllBooks1').style.display = 'none';
	}
}

function check_subscribe_form(type) {
	check_subscribe(document.subscribe,type);
}
function check_main_subscribe_form(type) {
	check_subscribe(document.main_subscribe,type);
}

function check_subscribe(form,type) {
        if ( form.txtEmail.value == '') {
            alert('You must enter an email address!');
            return;
        }
        if ( !checkemail(form.txtEmail.value)) {
            alert('You must enter a valid email address!');
            return;
        }
//        if ( type != 'Del' && !document.generic_form.adults.checked && !document.generic_form.children.checked ) {
//            alert('You must enter select either children, adults or both!');
//            return;
//        }
	form.act.value=type;
	form.submit();
}

function showSubDetail()
{
	if (document.generic_form.newsletter.checked == true) {
		document.getElementById('divInterest').style.display = 'block';
		document.getElementById('interestWrap').style.height = '58px';
	} else {
		document.getElementById('divInterest').style.display = 'none';
		document.getElementById('interestWrap').style.height = '35px';
	}
}

function testCreditCard () 
{
	//myCardNo = document.getElementById('txtCC').value;
	//myCardType = document.getElementById('txtCCType').value;
	myCardNo = document.generic_form.txtCC.value;
	myCardType = document.generic_form.ddCCType.value;
	if (!checkCreditCard(myCardNo,myCardType)) 
	{
		alert (ccErrors[ccErrorNo]);
		return false;
	}
	
	return true;
}

function check_download_form()
{
	if ( document.generic_form.downloadname.value == '') {
		alert('You must enter a download name!');
		return FALSE;
	}
	if ( document.generic_form.downloaddesc.value == '') {
		alert('You must enter a download description!');
		return FALSE;
	}
	document.generic_form.submit();
}

function check_casestudy_form()
{
	if ( document.generic_form.casestudyname.value == '') {
		alert('You must enter a case study name!');
		return FALSE;
	}
	if ( document.generic_form.casestudyshortdesc.value == '') {
		alert('You must enter a case study short description!');
		return FALSE;
	}
	if ( document.generic_form.casestudydesc.value == '') {
		alert('You must enter a case study description!');
		return FALSE;
	}
	if ( document.generic_form.casestudydate.value == '') {
		alert('You must enter a case study date!');
		return FALSE;
	}
	document.generic_form.submit();
}

function check_whitepaper_form()
{
	if ( document.generic_form.whitepapername.value == '') {
		alert('You must enter a white paper name!');
		return FALSE;
	}
	if ( document.generic_form.whitepapershortdesc.value == '') {
		alert('You must enter a white paper short description!');
		return FALSE;
	}
	if ( document.generic_form.whitepaperdesc.value == '') {
		alert('You must enter a white paper description!');
		return FALSE;
	}
	if ( document.generic_form.whitepaperdate.value == '') {
		alert('You must enter a white paper date!');
		return FALSE;
	}
	document.generic_form.submit();
}

function check_brochure_form()
{
	if ( document.generic_form.brochurename.value == '') {
		alert('You must enter a brochure name!');
		return FALSE;
	}
	if ( document.generic_form.brochureshortdesc.value == '') {
		alert('You must enter a brochure short description!');
		return FALSE;
	}
	if ( document.generic_form.brochuredesc.value == '') {
		alert('You must enter a brochure description!');
		return FALSE;
	}
	document.generic_form.submit();
}

function check_article_form()
{
	if ( document.generic_form.articlename.value == '') {
		alert('You must enter a article name!');
		return FALSE;
	}
	if ( document.generic_form.articleshortdesc.value == '') {
		alert('You must enter a article short description!');
		return FALSE;
	}
	if ( document.generic_form.articledesc.value == '') {
		alert('You must enter a article description!');
		return FALSE;
	}
	document.generic_form.submit();
}

function check_media_form()
{
	if ( document.generic_form.medianame.value == '') {
		alert('You must enter a media name!');
		return FALSE;
	}
	if ( document.generic_form.mediashortdesc.value == '') {
		alert('You must enter a media short description!');
		return FALSE;
	}
	if ( document.generic_form.mediadesc.value == '') {
		alert('You must enter a media description!');
		return FALSE;
	}
	document.generic_form.submit();
}

function check_news_form()
{
	if ( document.generic_form.newsname.value == '') {
		alert('You must enter a news name!');
		return FALSE;
	}
	if ( document.generic_form.newsdate.value == '') {
		alert('You must enter a news date!');
		return FALSE;
	}
	if ( document.generic_form.newsdesc.value == '') {
		alert('You must enter a news description!');
		return FALSE;
	}
	document.generic_form.submit();
}

function check_events_form()
{
	if ( document.generic_form.eventsname.value == '') {
		alert('You must enter a news or events name!');
		return FALSE;
	}
	if ( document.generic_form.eventsfromdate.value == '') {
		alert('You must enter a news or events from date!');
		return FALSE;
	}
	if ( document.generic_form.eventsdesc.value == '') {
		alert('You must enter a news or events description!');
		return FALSE;
	}
	document.generic_form.submit();
}

function check_user_form()
{
	if ( document.generic_form.username.value == '') {
		alert('You must enter a value for the username!');
		return FALSE;
	}
	if ( document.generic_form.psswd.value == '') {
		alert('You must enter a value for the password!');
		return FALSE;
	}
	if ( document.generic_form.psswd.value == document.generic_form.username.value) {
		alert('username and password cannot be the same!');
		return FALSE;
	}
	if ( document.generic_form.psswd.length < 6) {
		alert('password must be more than six characters!');
		return FALSE;
	}
	document.generic_form.submit();
}

function check_menu_form()
{
	if ( document.generic_form.menuname.value == '') {
		alert('You must enter a value for the menu name!');
		return FALSE;
	}
	document.generic_form.submit();
}

function check_page_form()
{
	if ( document.generic_form.pagename.value == '') {
		alert('You must enter a value for the page name!');
		return FALSE;
	}
	document.generic_form.submit();
}

function bookmark(url, title)
{
  if ((navigator.appName == "Microsoft Internet Explorer") && (parseInt(navigator.appVersion) >= 4)) {
	window.external.AddFavorite(url,title);
  } else {
	alert('Sorry this is not supported in Netscape. Press CTRL-D.')
  }
}

function isInteger(s)
{   var i;
	for (i = 0; i < s.length; i++)
	{
		// Check that current character is number.
		var c = s.charAt(i);
		if (((c < "0") || (c > "9"))) return false;
	}
	// All characters are numbers.
	return true;
}

function toggleLayer(whichLayer)
{
  var style2;
  if (document.getElementById) {
	// this is the way the standards work
	style2 = document.getElementById(whichLayer).style;
  } else if (document.all) {
	// this is the way old msie versions work
	style2 = document.all[whichLayer].style;
  } else if (document.layers) {
	// this is the way nn4 works
	style2 = document.layers[whichLayer].style;
  }

  if ( style2.display == 'none' ) {
	style2.display = "block";
  } else {
	style2.display = "none";
  }
}

function GoFlash(flashname, width, height, bgc)
{
	if (bgc == null) bgc = "#000000";

	if (flashname == null && width == null && height == null)
	{
		document.write("<br/><div style='color: red;'><b>***</b> WriteFlash function requires flashname, width and height parameters</div>");
	}
	else
	{
		document.write("<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0' width='"+width+"' height='"+height+"' id='flashObj' align='middle'><param name='allowScriptAccess' value='sameDomain' /><param name='movie' value='"+flashname+"' /><param name='loop' value='false' /><param name='menu' value='false' /><param name='quality' value='best' /><param name='bgcolor' value='"+bgc+"' /><embed src='"+flashname+"' loop='false' menu='false' quality='best' bgcolor='"+bgc+"' width='"+width+"' height='"+height+"' name='flashObj' align='middle' allowScriptAccess='sameDomain' type='application/x-shockwave-flash' pluginspage='http://www.macromedia.com/go/getflashplayer' /></object>");
	}
}

function onion(section)
{
	var topage = "onion.php?seg=" + section;

	window.location=topage;
}

function checkemail(email)
{
	var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i

	return (filter.test(email)) ? true : false;
}

var newsscrollerset = 0;
var cross_newsscroller;
var ns_newsscroller;
var actualnewsheight='';
var newsscrollerspeed=1; // Scrollers speed here (larger is faster 1-10)
newsscrollerspeed=(document.all) ? newsscrollerspeed : Math.max(1, newsscrollerspeed-1);
var newscopyspeed=newsscrollerspeed;
var newspauseit=1;
var newspausespeed = (newspauseit==0) ? newscopyspeed: 0;

function newsscroller()
{
	var newsscrollerwidth="170px";
	var newsscrollerheight="120px";
	var iedom=document.all||document.getElementById;

	if (newsscrollerset != 1)
	{
		if (iedom||document.layers)
		{
			with (document)
			{
				if (iedom)
				{
					write('<div style="position:relative;width:'+newsscrollerwidth+';height:'+newsscrollerheight+';overflow:hidden" onMouseover="newscopyspeed=newspausespeed" onMouseout="newscopyspeed=newsscrollerspeed">');
					write('<div id="ienewsscroller" style="position:absolute;left:0px;top:0px;width:100%;">');
					write('</div></div>')
				}
				else if (document.layers)
				{
					write('<ilayer width='+newsscrollerwidth+' height='+newsscrollerheight+' name="ns_newsscroller">');
					write('<layer name="ns_newsscroller2" width='+newsscrollerwidth+' height='+newsscrollerheight+' left=0 top=0 onMouseover="newscopyspeed=newspausespeed" onMouseout="newscopyspeed=newsscrollerspeed"></layer>');
					write('</ilayer>');
				}
			}
		}

		if (iedom)
		{
			cross_newsscroller = (document.getElementById) ? document.getElementById("ienewsscroller") : document.all.ienewsscroller;
			cross_newsscroller.style.top=parseInt(newsscrollerheight)+8+"px";
			cross_newsscroller.innerHTML=newsscrollercontent;
			actualnewsheight=cross_newsscroller.offsetHeight;
		}
		else if (document.layers)
		{
			ns_newsscroller=document.ns_newsscroller.document.ns_newsscroller2;
			ns_newsscroller.top=parseInt(newsscrollerheight)+8;
			ns_newsscroller.document.write(newsscrollercontent);
			ns_newsscroller.document.close();
			actualnewsheight=ns_newsscroller.document.height;
		}

		newsscrollerset = 1;
	}

	if (iedom)
	{
		if (parseInt(cross_newsscroller.style.top)>(actualnewsheight*(-1)+8))
		{
			cross_newsscroller.style.top=parseInt(cross_newsscroller.style.top)-newscopyspeed+"px";
		}
		else
		{
			cross_newsscroller.style.top=parseInt(newsscrollerheight)+8+"px";
		}
	}
	else
	{
		if (document.layers)
		{
			if (ns_newsscroller.top>(actualnewsheight*(-1)+8))
			{
				ns_newsscroller.top-=newscopyspeed;
			}
			else
			{
				ns_newsscroller.top=parseInt(newsscrollerheight)+8;
			}
		}
	}

	window.setTimeout("newsscroller()", 20);
}

var eventsscrollerset = 0;
var cross_eventsscroller;
var ns_eventsscroller;
var actualeventsheight='';
var eventsscrollerspeed=1; // Scrollers speed here (larger is faster 1-10)
eventsscrollerspeed=(document.all) ? eventsscrollerspeed : Math.max(1, eventsscrollerspeed-1);
var eventscopyspeed=eventsscrollerspeed;
var eventspauseit=1;
var eventspausespeed = (eventspauseit==0) ? eventscopyspeed: 0;

function eventsscroller()
{
	var eventsscrollerwidth="170px";
	var eventsscrollerheight="120px";
	var iedom=document.all||document.getElementById;

	if (eventsscrollerset != 1)
	{
		if (iedom||document.layers)
		{
			with (document)
			{
				if (iedom)
				{
					write('<div style="position:relative;width:'+eventsscrollerwidth+';height:'+eventsscrollerheight+';overflow:hidden" onMouseover="eventscopyspeed=eventspausespeed" onMouseout="eventscopyspeed=eventsscrollerspeed">');
					write('<div id="ieeventsscroller" style="position:absolute;left:0px;top:0px;width:100%;">');
					write('</div></div>')
				}
				else if (document.layers)
				{
					write('<ilayer width='+eventsscrollerwidth+' height='+eventsscrollerheight+' name="ns_eventsscroller">');
					write('<layer name="ns_eventsscroller2" width='+eventsscrollerwidth+' height='+eventsscrollerheight+' left=0 top=0 onMouseover="eventscopyspeed=eventspausespeed" onMouseout="eventscopyspeed=eventsscrollerspeed"></layer>');
					write('</ilayer>');
				}
			}
		}

		if (iedom)
		{
			cross_eventsscroller = (document.getElementById) ? document.getElementById("ieeventsscroller") : document.all.ieeventsscroller;
			cross_eventsscroller.style.top=parseInt(eventsscrollerheight)+8+"px";
			cross_eventsscroller.innerHTML=eventsscrollercontent;
			actualeventsheight=cross_eventsscroller.offsetHeight;
		}
		else if (document.layers)
		{
			ns_eventsscroller=document.ns_eventsscroller.document.ns_eventsscroller2;
			ns_eventsscroller.top=parseInt(eventsscrollerheight)+8;
			ns_eventsscroller.document.write(eventsscrollercontent);
			ns_eventsscroller.document.close();
			actualeventsheight=ns_eventsscroller.document.height;
		}

		eventsscrollerset = 1;
	}

	if (iedom)
	{
		if (parseInt(cross_eventsscroller.style.top)>(actualeventsheight*(-1)+8))
		{
			cross_eventsscroller.style.top=parseInt(cross_eventsscroller.style.top)-eventscopyspeed+"px";
		}
		else
		{
			cross_eventsscroller.style.top=parseInt(eventsscrollerheight)+8+"px";
		}
	}
	else
	{
		if (document.layers)
		{
			if (ns_scroller.top>(actualeventsheight*(-1)+8))
			{
				ns_scroller.top-=eventscopyspeed;
			}
			else
			{
				ns_scroller.top=parseInt(eventsscrollerheight)+8;
			}
		}
	}

	window.setTimeout("eventsscroller()", 20);
}

//-->

/*============================================================================*/

/*

This routine checks the credit card number. The following checks are made:

1. A number has been provided
2. The number is a right length for the card
3. The number has an appropriate prefix for the card
4. The number has a valid modulus 10 number check digit if required

If the validation fails an error is reported.

The structure of credit card formats was gleaned from a variety of sources on 
the web, although the best is probably on Wikepedia ("Credit card number"):

  http://en.wikipedia.org/wiki/Credit_card_number

Parameters:
			cardnumber           number on the card
			cardname             name of card as defined in the card list below

Author:     John Gardner
Date:       1st November 2003
Updated:    26th Feb. 2005      Additional cards added by request
Updated:    27th Nov. 2006      Additional cards added from Wikipedia

*/

/*
   If a credit card number is invalid, an error reason is loaded into the 
   global ccErrorNo variable. This can be be used to index into the global error  
   string array to report the reason to the user if required:
   
   e.g. if (!checkCreditCard (number, name) alert (ccErrors(ccErrorNo);
*/

var ccErrorNo = 0;
var ccErrors = new Array ()

ccErrors [0] = "Unknown card type";
ccErrors [1] = "No card number provided";
ccErrors [2] = "Credit card number is in invalid format";
ccErrors [3] = "Credit card number is invalid";
ccErrors [4] = "Credit card number has an inappropriate number of digits";

function checkCreditCard (cardnumber, cardname) {
	 
  // Array to hold the permitted card characteristics
  var cards = new Array();

  // Define the cards we support. You may add addtional card types.
  
  //  Name:      As in the selection box of the form - must be same as user's
  //  Length:    List of possible valid lengths of the card number for the card
  //  prefixes:  List of possible prefixes for the card
  //  checkdigit Boolean to say whether there is a check digit
  
  cards [0] = {name: "Visa", 
			   length: "13,16", 
			   prefixes: "4",
			   checkdigit: true};
  cards [1] = {name: "MasterCard", 
			   length: "16", 
			   prefixes: "51,52,53,54,55",
			   checkdigit: true};
  cards [2] = {name: "DinersClub", 
			   length: "14,16", 
			   prefixes: "300,301,302,303,304,305,36,38,55",
			   checkdigit: true};
  cards [3] = {name: "CarteBlanche", 
			   length: "14", 
			   prefixes: "300,301,302,303,304,305,36,38",
			   checkdigit: true};
  cards [4] = {name: "AmEx", 
			   length: "15", 
			   prefixes: "34,37",
			   checkdigit: true};
  cards [5] = {name: "Discover", 
			   length: "16", 
			   prefixes: "6011,650",
			   checkdigit: true};
  cards [6] = {name: "JCB", 
			   length: "15,16", 
			   prefixes: "3,1800,2131",
			   checkdigit: true};
  cards [7] = {name: "enRoute", 
			   length: "15", 
			   prefixes: "2014,2149",
			   checkdigit: true};
  cards [8] = {name: "Solo", 
			   length: "16,18,19", 
			   prefixes: "6334,6767",
			   checkdigit: true};
  cards [9] = {name: "Switch", 
			   length: "16,18,19", 
			   prefixes: "4903,4905,4911,4936,564182,633110,6333,6759",
			   checkdigit: true};
  cards [10] = {name: "Maestro", 
			   length: "16", 
			   prefixes: "5020,6",
			   checkdigit: true};
  cards [11] = {name: "VisaElectron", 
			   length: "16", 
			   prefixes: "417500,4917,4913",
			   checkdigit: true};
			   
  // Establish card type
  var cardType = -1;
  for (var i=0; i<cards.length; i++) {

	// See if it is this card (ignoring the case of the string)
	if (cardname.toLowerCase () == cards[i].name.toLowerCase()) {
	  cardType = i;
	  break;
	}
  }
  
  // If card type not found, report an error
  if (cardType == -1) {
	 ccErrorNo = 0;
	 return false; 
  }
   
  // Ensure that the user has provided a credit card number
  if (cardnumber.length == 0)  {
	 ccErrorNo = 1;
	 return false; 
  }
	
  // Now remove any spaces from the credit card number
  cardnumber = cardnumber.replace (/\s/g, "");
  
  // Check that the number is numeric
  var cardNo = cardnumber
  var cardexp = /^[0-9]{13,19}$/;
  if (!cardexp.exec(cardNo))  {
	 ccErrorNo = 2;
	 return false; 
  }
	   
  // Now check the modulus 10 check digit - if required
  if (cards[cardType].checkdigit) {
	var checksum = 0;                                  // running checksum total
	var mychar = "";                                   // next char to process
	var j = 1;                                         // takes value of 1 or 2
  
	// Process each digit one by one starting at the right
	var calc;
	for (i = cardNo.length - 1; i >= 0; i--) {
	
	  // Extract the next digit and multiply by 1 or 2 on alternative digits.
	  calc = Number(cardNo.charAt(i)) * j;
	
	  // If the result is in two digits add 1 to the checksum total
	  if (calc > 9) {
		checksum = checksum + 1;
		calc = calc - 10;
	  }
	
	  // Add the units element to the checksum total
	  checksum = checksum + calc;
	
	  // Switch the value of j
	  if (j ==1) {j = 2} else {j = 1};
	} 
  
	// All done - if checksum is divisible by 10, it is a valid modulus 10.
	// If not, report an error.
	if (checksum % 10 != 0)  {
	 ccErrorNo = 3;
	 return false; 
	}
  }  

  // The following are the card-specific checks we undertake.
  var LengthValid = false;
  var PrefixValid = false; 
  var undefined; 

  // We use these for holding the valid lengths and prefixes of a card type
  var prefix = new Array ();
  var lengths = new Array ();
	
  // Load an array with the valid prefixes for this card
  prefix = cards[cardType].prefixes.split(",");
	  
  // Now see if any of them match what we have in the card number
  for (i=0; i<prefix.length; i++) {
	var exp = new RegExp ("^" + prefix[i]);
	if (exp.test(cardNo)) PrefixValid = true;
  }
	  
  // If it isn't a valid prefix there's no point at looking at the length
  if (!PrefixValid) {
	 ccErrorNo = 3;
	 return false; 
  }
	
  // See if the length is valid for this card
  lengths = cards[cardType].length.split(",");
  for (j=0; j<lengths.length; j++) {
	if (cardNo.length == lengths[j]) LengthValid = true;
  }
  
  // See if all is OK by seeing if the length was valid. We only check the 
  // length if all else was hunky dory.
  if (!LengthValid) {
	 ccErrorNo = 4;
	 return false; 
  };   
  
  // The credit card is in the required format.
  return true;
}

/*============================================================================*/


function submitSort() 
{
	var url = document.location;
	url += "&sortby=" + document.sort_form.sortby[document.sort_form.sortby.selectedIndex].value;
	for (i = 0;  i < document.sort_form.sortway.length;  i++)
	{
		if (document.sort_form.sortway[i].checked)
			url += "&sortway=" + document.sort_form.sortway[i].value;
	}

	document.location = url;
}

function showDeliveryAddress()
{
	if (document.generic_form.cbDelivery.checked == true)
	{
		document.getElementById('divDelivery').style.display = 'block';
		showDeliveryCharge('Country2');
	}
	else
	{
		document.getElementById('divDelivery').style.display = 'none';
		showDeliveryCharge('Country');
	}
}

function showDeliveryCharge(obj)
{
        var selObj = (obj == "Country") ? document.generic_form.Country : document.generic_form.Country2;

        if (document.generic_form.cbDelivery.checked == true && obj == "Country") return;

        if (selObj.options[selObj.selectedIndex].value == 'GB' || selObj.options[selObj.selectedIndex].value == 'G1') {
          changeDeliveryCharge('GB');
        } else {
          if ( selObj.options[selObj.selectedIndex].value in object_converter(in_europe) ) {
                changeDeliveryCharge('EU');
          } else {
                changeDeliveryCharge('OTHER');
          }

          if ( traditional_books > 0 && selObj.options[selObj.selectedIndex].value in object_converter(restricted_country) ) {
                if (confirm(no_sale_message)) { document.location = no_sale_redirect; }
          }
          if ( digital_books > 0 && selObj.options[selObj.selectedIndex].value in object_converter(restricted_digital_country) ) {
                if (confirm(digital_no_sale_message)) { document.location = digital_no_sale_redirect; }
          }
        }
}

function changeDeliveryCharge(locn)
{
        var total = parseFloat(document.generic_form.total.value);
	var price_symbol = document.generic_form.price_symbol.value;
        if (locn == 'GB' ) {
                //changeText('delivery','FREE');
                total += parseFloat(document.generic_form.delivery_uk.value);
                var delivery = sprintf("%s%01.2f",price_symbol,document.generic_form.delivery_uk.value);
                changeText('delivery',delivery);
        } else if (locn == 'EU' ) {
                total += parseFloat(document.generic_form.delivery_eu.value);
                var delivery = sprintf("%s%01.2f",price_symbol,document.generic_form.delivery_eu.value);
                changeText('delivery',delivery);
        } else if (locn == 'OTHER' ) {
                total += parseFloat(document.generic_form.delivery_rest.value);
                var delivery = sprintf("%s%01.2f",price_symbol,document.generic_form.delivery_rest.value);
                changeText('delivery',delivery);
        }

        //make total 2 decimal places
        total = sprintf("%01.2f", total);
        changeText('totalcost',total);
}

function processStateChange(dest){
	if (request.readyState == 4){
		contentDiv = document.getElementById(dest);

		if (request.status == 200){
			response = request.responseText;
			contentDiv.innerHTML = response;
		} else {
			contentDiv.innerHTML = "Error: Status "+request.status;
		}
	}
}

function loadHTML(URL, destination){
	dest = destination;
	if (window.XMLHttpRequest){
		request = new XMLHttpRequest();
		request.onreadystatechange = processStateChange(dest);
		request.open("GET", URL, true);
		request.send(null);
	} else if (window.ActiveXObject) {
		request = new ActiveXObject("Microsoft.XMLHTTP");
		if (request) {
			request.onreadystatechange = processStateChange(dest);
			request.open("GET", URL, true);
			request.send();
		}
	}
}

/*function setVisible(source){
		 var x = document.getElementById(source);
		 x.style.visibility = "visible";
}*/

//function valid(itext,source,destination)
function valid(itext, iid)
{
	var url = '/jslookup_bic.php?airport=' + itext;
	/*loadHTML(url,destination);
	setVisible(destination)
	alert('return');*/

	// get json data
	if (itext.length >= 3)
	{
		$.getJSON('/jslookup_bic.php', { airport: itext, id: iid }, function(jsonData)
		{
			myHtml = '<br /><div id="ajax_content_bic"><table cellpadding="2" cellspacing="0">';
			if (jsonData.length > 0) for (i in jsonData)
			{
				myRow = jsonData[i];
				myLink = '/index.php?page=biccategoryadmin&action=edit&id=' + iid;
				myLink += '&add_bic_id=' + myRow['BicCodeId'];
				
				myHtml += '<tr><td>' + myRow['BicCode'] + '</td>';
				myHtml += '<td><a href="' + myLink + '">' + myRow['BicCodeDesc'] + '</a></td></tr>';
			}
			else myHtml += '<p>No records found for: ' + itext + '</p>';
			myHtml += '</table></div>';
			
			$('#ajax_content_bic').remove();
			$('#bic_lookup').after(myHtml);
		});
	}
	else { $('#ajax_content').remove(); }
}

function object_converter(a)
{
  var o = {};
  for(var i=0;i<a.length;i++)
  {
    o[a[i]]='';
  }
  return o;
}

function getRefToDiv(divID,oDoc) {
  if( document.getElementById ) {
    return document.getElementById(divID); }
  if( document.all ) {
    return document.all[divID]; }
  if( !oDoc ) { oDoc = document; }
  if( document.layers ) {
    if( oDoc.layers[divID] ) { return oDoc.layers[divID]; } else {
      //repeatedly run through all child layers
      for( var x = 0, y; !y && x < oDoc.layers.length; x++ ) {
        //on success, return that layer, else return nothing
        y = getRefToDiv(divID,oDoc.layers[x].document); }
    return y; } }
  return false;
}

function changeText(id,text) {
        var myReference = getRefToDiv(id);
        if( !myReference ) {
            window.alert('Nothing works in this browser');
            return; //don't go any further
        }

        if( typeof( myReference.innerHTML ) != 'undefined' ) {
          //used by all current browsers
          myReference.innerHTML = text;
        } else if( myReference.document && myReference.document != window.document ) {
          //used by layers browsers
          myReference.document.open();
          myReference.document.write(text);
          myReference.document.close();
        } else if( window.frames && window.frames.length && window.frames['nameOfIframe'] ) {
          //used by browsers like Opera 6-
          myReference = window.frames['nameOfIframe'].window;
          myReference.document.open();
          myReference.document.write(text);
          myReference.document.close();
        }
}

function sprintf( ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Ash Searle (http://hexmen.com/blog/)
    // + namespaced by: Michael White (http://crestidg.com)
    // *     example 1: sprintf("%01.2f", 123.1);
    // *     returns 1: 123.10

    var regex = /%%|%(\d+\$)?([-+#0 ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([scboxXuidfegEG])/g;
    var a = arguments, i = 0, format = a[i++];

    // pad()
    var pad = function(str, len, chr, leftJustify) {
        var padding = (str.length >= len) ? '' : Array(1 + len - str.length >>> 0).join(chr);
        return leftJustify ? str + padding : padding + str;
    };

    // justify()
    var justify = function(value, prefix, leftJustify, minWidth, zeroPad) {
        var diff = minWidth - value.length;
        if (diff > 0) {
            if (leftJustify || !zeroPad) {
            value = pad(value, minWidth, ' ', leftJustify);
            } else {
            value = value.slice(0, prefix.length) + pad('', diff, '0', true) + value.slice(prefix.length);
            }
        }
        return value;
    };

    // formatBaseX()
    var formatBaseX = function(value, base, prefix, leftJustify, minWidth, precision, zeroPad) {
        // Note: casts negative numbers to positive ones
        var number = value >>> 0;
        prefix = prefix && number && {'2': '0b', '8': '0', '16': '0x'}[base] || '';
        value = prefix + pad(number.toString(base), precision || 0, '0', false);
        return justify(value, prefix, leftJustify, minWidth, zeroPad);
    };

    // formatString()
    var formatString = function(value, leftJustify, minWidth, precision, zeroPad) {
        if (precision != null) {
            value = value.slice(0, precision);
        }
        return justify(value, '', leftJustify, minWidth, zeroPad);
    };

    // finalFormat()
    var doFormat = function(substring, valueIndex, flags, minWidth, _, precision, type) {
        if (substring == '%%') return '%';

        // parse flags
        var leftJustify = false, positivePrefix = '', zeroPad = false, prefixBaseX = false;
        for (var j = 0; flags && j < flags.length; j++) switch (flags.charAt(j)) {
            case ' ': positivePrefix = ' '; break;
            case '+': positivePrefix = '+'; break;
            case '-': leftJustify = true; break;
            case '0': zeroPad = true; break;
            case '#': prefixBaseX = true; break;
        }

        // parameters may be null, undefined, empty-string or real valued
        // we want to ignore null, undefined and empty-string values
        if (!minWidth) {
            minWidth = 0;
        } else if (minWidth == '*') {
            minWidth = +a[i++];
        } else if (minWidth.charAt(0) == '*') {
            minWidth = +a[minWidth.slice(1, -1)];
        } else {
            minWidth = +minWidth;
        }

        // Note: undocumented perl feature:
        if (minWidth < 0) {
            minWidth = -minWidth;
            leftJustify = true;
        }

        if (!isFinite(minWidth)) {
            throw new Error('sprintf: (minimum-)width must be finite');
        }

        if (!precision) {
            precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type == 'd') ? 0 : void(0);
        } else if (precision == '*') {
            precision = +a[i++];
        } else if (precision.charAt(0) == '*') {
            precision = +a[precision.slice(1, -1)];
        } else {
            precision = +precision;
        }

        // grab value using valueIndex if required?
        var value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++];

        switch (type) {
            case 's': return formatString(String(value), leftJustify, minWidth, precision, zeroPad);
            case 'c': return formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad);
            case 'b': return formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
            case 'o': return formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
            case 'x': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
            case 'X': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad).toUpperCase();
            case 'u': return formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
            case 'i':
            case 'd': {
                        var number = parseInt(+value);
                        var prefix = number < 0 ? '-' : positivePrefix;
                        value = prefix + pad(String(Math.abs(number)), precision, '0', false);
                        return justify(value, prefix, leftJustify, minWidth, zeroPad);
                    }
            case 'e':
            case 'E':
            case 'f':
            case 'F':
            case 'g':
            case 'G':
                        {
                        var number = +value;
                        var prefix = number < 0 ? '-' : positivePrefix;
                        var method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())];
                        var textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2];
                        value = prefix + Math.abs(number)[method](precision);
                        return justify(value, prefix, leftJustify, minWidth, zeroPad)[textTransform]();
                    }
            default: return substring;
        }
    };

    return format.replace(regex, doFormat);
}

/*************************************************************************\
boolean isNum(String argvalue)
return true if argvalue contains only numeric characters,
else return false.
\*************************************************************************/
function isNum(argvalue) {
    argvalue = argvalue.toString();

    if (argvalue.length == 0) return false;

    for (var n = 0; n < argvalue.length; n++) {
        if (argvalue.substring(n, n+1) < "0" || argvalue.substring(n, n+1) > "9") return false;
    }

    return true;
}

function longYear(argvalue) {
    argvalue = argvalue.toString();

    if (argvalue.length != 4) argvalue = '20' + argvalue;

    return argvalue;
}

function check_cc_form()
{
        if ( document.generic_form.txtCCName.value == '') {
                alert('You must enter the name on the card!');
                return false;
        }

        if ( document.generic_form.txtCC.value == '' ) {
                alert('You must enter a credit card number!');
                return false;
        }

        if ( document.generic_form.txtCCExpireMonth.options[document.generic_form.txtCCExpireMonth.selectedIndex].value == '' ) {
                alert('You must enter a credit card expiry month!');
                return false;
        }

        if ( document.generic_form.txtCCExpireYear.options[document.generic_form.txtCCExpireYear.selectedIndex].value == '' ) {
                alert('You must enter a credit card expiry year!');
                return false;
        }

        if (!testCreditCard())
        {
                return false;
        }

        document.generic_form.submit();
}

function check_customer_form()
{
        if ( document.generic_form.txtFirstname.value == '') {
                alert('You must enter a firstname!');
                return false;
        }
        if ( document.generic_form.txtSurname.value == '') {
                alert('You must enter a surname!');
                return false;
        }
        if ( document.generic_form.txtEmail.value == '') {
                alert('You must enter an email address!');
                return false;
        }
        if ( !checkemail(document.generic_form.txtEmail.value)) {
                alert('You must enter a valid email address!');
                return false;
        }
        if ( document.generic_form.txtPhone.value == '') {
                alert('You must enter a contact phone number!');
                return false;
        }

        if ( document.generic_form.txtAddress1.value == '' && document.generic_form.txtAddress2.value == '' && document.generic_form.txtAddress3.value == '' && document.generic_form.txtAddress4.value == '') {
                alert('You must enter a billing address!');
                return false;
        }
        /* NBN Requirement */
        if ( document.generic_form.txtAddress3.value == '') {
                alert('You must enter a town!');
                return false;
        }
        if ( document.generic_form.txtAddress1.value == '' ) {
                alert('You must enter a billing address starting in Address field 1!');
                return false;
        }
        if ( document.generic_form.txtPostcode.value == '' ) {
                alert('You must enter a postcode!');
                return false;
        }
        if (document.generic_form.cbDelivery.checked)
        {
                if ( document.generic_form.txtDAddress1.value == '' && document.generic_form.txtDAddress2.value == '' && document.generic_form.txtDAddress3.value == '' && document.generic_form.txtDAddress4.value == '') {
                        alert('You must enter a delivery address!');
                        return false;
                }
                if ( document.generic_form.txtDAddress1.value == '' ) {
                        alert('You must enter a delivery address starting in Address field 1!');
                        return false;
                }
                if ( document.generic_form.txtDPostcode.value == '' ) {
                        alert('You must enter a postcode!');
                        return false;
                }
        }

        document.generic_form.submit();
}
