function CheckRequired(form)
{
	var msg_hdr = "All fields followed by a red asterisk (*) on this form are required. \nPlease enter values for the following:\n";
	var msg_dtl = "";
	var final_msg = "";
	var rtns = "";
	var zippo = 0;
	var NumBks = 0;
	
	msg_dtl = CheckField(form.Name.value, "Name", msg_dtl)
	msg_dtl = CheckField(form.Address.value, "Address", msg_dtl)
	msg_dtl = CheckField(form.City.value, "City", msg_dtl)
	msg_dtl = CheckField(form.State.value, "State", msg_dtl)
	msg_dtl = CheckField(form.Postal.value, "Zip/Postal Code", msg_dtl)
	msg_dtl = CheckField(form.Country.value, "Country", msg_dtl)
	msg_dtl = CheckField(form.PhoneDay.value, "Day Phone #", msg_dtl)
	msg_dtl = CheckField(form.PhoneEvening.value, "Evening Phone #", msg_dtl)
	msg_dtl = CheckField(form.Email.value, "Email", msg_dtl)
	
	if (msg_dtl != "")
	{
		final_msg = msg_hdr + msg_dtl
	}
	
	if (form.Email.value.length > 0)
	{
		if (isEmail(form.Email.value))
		{
		}
		else
		{
			if (final_msg != "")
			{
				final_msg = final_msg  + "\n\nAlso:\n  Email address not formatted properly"
			}
			else
			{
				final_msg = "\nEmail address not formatted properly"
			}
		}
	}
	
	if (final_msg != "")
	{
		alert(final_msg)
		form.Name.focus()
		return false
	}
	else
	{
		NumBks = form.NumWorkbooks.value
		if (((form.Country.value == "Canada") && (form.ShipCountry.value == "none") && (NumBks > 1)) || (form.ShipCountry.value == "Other") || ((form.ShipCountry.value == "Canada") && (NumBks > 1)))
		{
			alert("Please contact us for shipping and payment information.")
			//form.NumWorkbooks.value = 0
			form.BooksSumTotal.value = zippo.toFixed(2)
			form.firstSH_USA.value = zippo.toFixed(2)
			form.AddlSH_USA.value = zippo.toFixed(2)
			form.firstSH_CAN.value = zippo.toFixed(2)
			form.Total.value = zippo.toFixed(2)
			form.Name.focus()
			return false
		}
		else
		{
			return true
		}
	}
}

function CheckAngel(form)
{
	var msg_hdr = "All fields followed by a red asterisk (*) on this form are required. \nPlease enter values for the following:\n";
	var msg_dtl = "";
	var final_msg = "";
	var rtns = "";
	var zippo = 0;
	
	msg_dtl = CheckField(form.Name.value, "Name", msg_dtl)
	msg_dtl = CheckField(form.Address.value, "Address", msg_dtl)
	msg_dtl = CheckField(form.City.value, "City", msg_dtl)
	msg_dtl = CheckField(form.State.value, "State", msg_dtl)
	msg_dtl = CheckField(form.Postal.value, "Zip/Postal Code", msg_dtl)
	msg_dtl = CheckField(form.Country.value, "Country", msg_dtl)
	msg_dtl = CheckField(form.PhoneDay.value, "Day Phone #", msg_dtl)
	msg_dtl = CheckField(form.PhoneEvening.value, "Evening Phone #", msg_dtl)
	msg_dtl = CheckField(form.Email.value, "Email", msg_dtl)
	
	if (msg_dtl != "")
	{
		final_msg = msg_hdr + msg_dtl
	}
	
	if (form.Email.value.length > 0)
	{
		if (isEmail(form.Email.value))
		{
		}
		else
		{
			if (final_msg != "")
			{
				final_msg = final_msg  + "\n\nAlso:\n  Email address not formatted properly"
			}
			else
			{
				final_msg = "\nEmail address not formatted properly"
			}
		}
	}
	
	if (final_msg != "")
	{
		alert(final_msg)
		form.Name.focus()
		return false
	}
	else
	{
		if (((form.Country.value == "Other") && (form.ShipCountry.value == "none")) || (form.ShipCountry.value == "Other"))
		{
			alert("Please contact us for shipping and payment information.")
			//form.NumWorkbooks.value = 0
			form.BooksSumTotal.value = zippo.toFixed(2)
			form.firstSH_USA.value = zippo.toFixed(2)
			form.AddlSH_USA.value = zippo.toFixed(2)
			form.SalesTax.value = zippo.toFixed(2)
			form.Total.value = zippo.toFixed(2)
			form.Name.focus()
			return false
		}
		else
		{
			return true
		}
	}
}

function CheckField(Fld, Name, Msg)
{
	Fld = stripWhitespace(Fld)
	
	if ((Fld == null) || (Fld.length == 0))
	{
		Msg = Msg + "\n" + Name
		return Msg
	}
	return Msg + ""
}

//
// Removes all characters which appear in string 'bag' from string 's'.
//
function stripCharsInBag (s, bag)
{   var i;
    var returnString = "";

    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }

    return returnString;
}

//
// Removes all whitespace characters from string s.
// Variable 'whitespace' defines which characters are considered whitespace.
//
function stripWhitespace (s)
{
	var whitespace = " \t\n\r";

	return stripCharsInBag (s, whitespace)
}

//
// Validates Email address
// 
// Email address must be of form a@b.c -- in other words:
// * there must be at least one character before the @
// * there must be at least one character before and after the .
// * the characters @ and . are both required
//
function isEmail (s)
{   
	// there must be >= 1 character before @, so we
    // start looking at character position 1 
    // (i.e. second character)
    var i = 1;
    var sLength = s.length;

    // look for @
    while ((i < sLength) && (s.charAt(i) != "@"))
    { i++
    }

    if ((i >= sLength) || (s.charAt(i) != "@")) return false;
    else i += 2;

    // look for .
    while ((i < sLength) && (s.charAt(i) != "."))
    { i++
    }

    // there must be at least one character after the .
    if ((i >= sLength - 1) || (s.charAt(i) != ".")) return false;
    else return true;
}

//Function to do qty*price extension and calculate shipping costs for
// "Design Your Life" workbook
function extendQty(form)
{
	var extTot = 0;
	var NumBks = 0;
	var SH1USA = 8;
	var zippo = 0;
	var SH2USA = 0;
	var SH1CAN = 12;
	var finalTot = 0;
	var msgCAN = "Please contact us for shipping and payment information."
	
	NumBks = form.NumWorkbooks.value
	if ((NumBks < 1) || (isNaN(NumBks)))
	{
		alert("Please enter a number of books greater than zero.")
		form.NumWorkbooks.value = 0
		form.BooksSumTotal.value = zippo.toFixed(2)
		form.firstSH_USA.value = zippo.toFixed(2)
		form.AddlSH_USA.value = zippo.toFixed(2)
		form.firstSH_CAN.value = zippo.toFixed(2)
		form.Total.value = zippo.toFixed(2)
		form.NumWorkbooks.focus()
		return true
	}
	extTot = NumBks * 75
	form.BooksSumTotal.value = extTot.toFixed(2)
	/*
	if (((form.Country.value == "USA" ) && (form.ShipCountry.value == "")) || (form.ShipCountry.value == "USA"))
	*/
	if (((form.Country.value == "USA" ) && (form.ShipCountry.value == "none")) || (form.ShipCountry.value == "USA"))
	{
		if (NumBks == 1)
		{
			form.firstSH_USA.value = SH1USA.toFixed(2)
			form.AddlSH_USA.value = zippo.toFixed(2)
			form.firstSH_CAN.value = zippo.toFixed(2)
			finalTot = extTot + SH1USA
			form.Total.value = finalTot.toFixed(2)
			form.Submit2.focus()
			return true
		}

		if (NumBks > 1)
		{
			form.firstSH_USA.value = SH1USA.toFixed(2)
			SH2USA = (NumBks - 1) * 4
			form.AddlSH_USA.value = SH2USA.toFixed(2)
			form.firstSH_CAN.value = zippo.toFixed(2)
			finalTot = extTot + 8 + SH2USA
			form.Total.value = finalTot.toFixed(2)
			form.Submit2.focus()
			return true
		}
	}
	if (((form.Country.value == "Canada" ) && (form.ShipCountry.value == "none")) || (form.ShipCountry.value == "Canada"))
	{
		if (NumBks == 1)
		{
			form.firstSH_USA.value = zippo.toFixed(2)
			form.AddlSH_USA.value = zippo.toFixed(2)
			form.firstSH_CAN.value = SH1CAN.toFixed(2)
			finalTot = extTot + SH1CAN
			form.Total.value = finalTot.toFixed(2)
			form.Submit2.focus()
			return true
		}

		if (NumBks > 1)
		{
			alert(msgCAN)
			//form.NumWorkbooks.value = 0
			form.BooksSumTotal.value = zippo.toFixed(2)
			form.firstSH_USA.value = zippo.toFixed(2)
			form.AddlSH_USA.value = zippo.toFixed(2)
			form.firstSH_CAN.value = zippo.toFixed(2)
			form.Total.value = zippo.toFixed(2)
			form.Name.focus()
			return true
		}
	}
	if (((form.Country.value == "Other" ) && (form.ShipCountry.value == "none")) || (form.ShipCountry.value == "Other"))
	{
		alert(msgCAN)
		//form.NumWorkbooks.value = 0
		form.BooksSumTotal.value = zippo.toFixed(2)
		form.firstSH_USA.value = zippo.toFixed(2)
		form.AddlSH_USA.value = zippo.toFixed(2)
		form.firstSH_CAN.value = zippo.toFixed(2)
		form.Total.value = zippo.toFixed(2)
		form.Name.focus()
		return true
	}
	return true
}

//Function to do qty*price extension and calculate shipping costs for
// "Unlikely Angel" book
function extendQty_Angel(form)
{
	var extTot = 0;
	var NumBks = 0;
	var firstSH = 3;
	var zippo = 0;
	var addlSH = 0;
	var SlsTax = 0;
	var finalTot = 0;
	var msgCAN = "Please contact us for shipping and payment information."
	
	NumBks = form.NumWorkbooks.value
	if ((NumBks < 1) || (isNaN(NumBks)))
	{
		alert("Please enter a whole number of books greater than zero.")
		form.NumWorkbooks.value = 0
		form.BooksSumTotal.value = zippo.toFixed(2)
		form.SalesTax.value = zippo.toFixed(2)
		form.firstSH_USA.value = zippo.toFixed(2)
		form.AddlSH_USA.value = zippo.toFixed(2)
		form.Total.value = zippo.toFixed(2)
		form.NumWorkbooks.focus()
		return true
	}
	extTot = NumBks * 15
	form.BooksSumTotal.value = extTot.toFixed(2)
	SlsTax = NumBks * .75
	// alert("sales tax = " + SlsTax)
	if ((((form.Country.value == "USA" ) || (form.Country.value == "Canada")) && (form.ShipCountry.value == "none")) || (form.ShipCountry.value == "USA") || (form.ShipCountry.value == "Canada"))
	{
		if (NumBks == 1)
		{
			form.firstSH_USA.value = firstSH.toFixed(2)
			form.AddlSH_USA.value = zippo.toFixed(2)
			form.SalesTax.value = SlsTax.toFixed(2)
			finalTot = extTot + firstSH + SlsTax
			form.Total.value = finalTot.toFixed(2)
			form.Submit2.focus()
			return true
		}

		if (NumBks > 1)
		{
			form.SalesTax.value = SlsTax.toFixed(2)
			form.firstSH_USA.value = firstSH.toFixed(2)
			addlSH = (NumBks - 1) * 1.5
			form.AddlSH_USA.value = addlSH.toFixed(2)
			finalTot = extTot + firstSH + addlSH + SlsTax
			form.Total.value = finalTot.toFixed(2)
			form.Submit2.focus()
			return true
		}
	}
	/*
	if (((form.Country.value == "Canada" ) && (form.ShipCountry.value == "none")) || (form.ShipCountry.value == "Canada"))
	{
		if (NumBks == 1)
		{
			form.firstSH_USA.value = zippo.toFixed(2)
			form.AddlSH_USA.value = zippo.toFixed(2)
			form.firstSH_CAN.value = SH1CAN.toFixed(2)
			finalTot = extTot + SH1CAN
			form.Total.value = finalTot.toFixed(2)
			form.Submit2.focus()
			return true
		}

		if (NumBks > 1)
		{
			alert(msgCAN)
			form.NumWorkbooks.value = 0
			form.BooksSumTotal.value = zippo.toFixed(2)
			form.NumWorkbooks.value = zippo.toFixed(2)
			form.firstSH_USA.value = zippo.toFixed(2)
			form.AddlSH_USA.value = zippo.toFixed(2)
			form.firstSH_CAN.value = zippo.toFixed(2)
			form.Total.value = zippo.toFixed(2)
			form.Name.focus()
			return true
		}
	}
	if (((form.Country.value == "Other" ) && (form.ShipCountry.value == "none")) || (form.ShipCountry.value == "Other"))
	{
	*/
		alert(msgCAN)
		//form.NumWorkbooks.value = 0
		form.BooksSumTotal.value = zippo.toFixed(2)
		form.firstSH_USA.value = zippo.toFixed(2)
		form.AddlSH_USA.value = zippo.toFixed(2)
		form.SalesTax.value = zippo.toFixed(2)
		form.Total.value = zippo.toFixed(2)
		form.Name.focus()
		return true
	/*
	}
	return true
	*/
}
