function test()
{
  alert( "onload test");
  document.write("----------test------------" );
}

//===========================================
// for nextfone signup form

function validateForm ( )
{

     	var errMsgArray = new Array(30);
     	var nMsg = 0;
  	var valid = true;
	var cur_obj;
	var optionsValid;

     // ------------------------------------------
 	 if( document.signup.planOptions.value  == "none" )
 	 {
	   errMsgArray[ nMsg ] =  "Please select one of the Service Plans"
	   alert( errMsgArray[ nMsg] );
	   nMsg++;
	   valid = false;
	 }

     // ------------------------------------------
 	 if( document.signup.planTermOptions.value  == 0 )
 	 {
	   errMsgArray[ nMsg ] =  "Please select one of the Service Terms"
	   alert( errMsgArray[ nMsg] );
	   nMsg++;
	   valid = false;
	 }
	 
     // ------------------------------------------
 	optionsValid = false;

 	for( var i=0; i<2; i++ )
 	{
 		if( document.signup.phoneOptions[i].checked  == true )
 		{
 			
  			optionsValid = true;
  			break;
  		}
	}
	
	if( optionsValid == false )
	{
	  errMsgArray[ nMsg ] = "Please select one of the Phone Number Options.";
//	  alert( errMsgArray[ nMsg] );
	  nMsg++;	  
	  valid = false;
	}	

	if( document.signup.phoneOptions[1].checked == true )
	{
		if( !checkPhone( document.signup.existPhone1, document.signup.existPhone2, document.signup.existPhone3 ) )
		{
			  errMsgArray[ nMsg ] = "Please enter your Existing Phone Number correctly.";
		//	  alert( errMsgArray[ nMsg] );
			  nMsg++;	  
			  valid = false;
		}			
	}
	else if( document.signup.phoneOptions[0].checked == true )
	{
		if( (document.signup.areaCode.selectedIndex == 0) && 
	           (document.signup.areaCodeOther.value == "") )
		{
	   	  errMsgArray[ nMsg ] = "Please select your Primary Area code.";		
//		  alert( errMsgArray[ nMsg] );
		  nMsg++;		
	   	  valid = false;		
     		}		
		if(document.signup.areaCode.selectedIndex != 0)
		{
			document.signup.areaCodeOther.value == "";
		}
	}

 

	// ------------------------------------------
	optionsValid = false;
 	for( var i=0; i<2; i++ )
 	{
 		if( document.signup.altAreaCode[i].checked  == true )
 		{
 			
  			optionsValid = true;
  			break;
  		}
	}

	if( optionsValid == false )
	{
	  errMsgArray[ nMsg ] = "Please select one of the Alternate Area Code options.";
	  nMsg++;	  
	  valid = false;
	  return valid;
	}	
	else
	{

		if( document.signup.altAreaCode[0].checked == true )
		{	
			if( (document.signup.altAreaCodeSelect.selectedIndex == 0) && 
	       	(document.signup.altAreaCodeOther.value == "") )
			{
		   	  errMsgArray[ nMsg ] = "Please select your Alternate Area code.";		
			  nMsg++;		
		   	  valid = false;		
     		}	 

			if(document.signup.altAreaCodeSelect.selectedIndex != 0)
			{
				document.signup.altAreaCodeOther.value == "";
			}		

    }

	} // else



     // ------------------------------------------
	if( document.signup.ispProvider[0].checked  == true ) 
	{
	  if( document.signup.rogersPlanSelect.selectedIndex == 0 )
	  {
		errMsgArray[ nMsg ] = "Please specify your Rogers service plan.";
		nMsg++;	
 	       valid = false;	  
	  }
	}
	else if( document.signup.ispProvider[1].checked  == true ) 
	{
	  if( document.signup.bellPlanSelect.selectedIndex == 0 )
	  {
		errMsgArray[ nMsg ] = "Please specify your Bell service plan.";
		nMsg++;	
 	       valid = false;	  
	  }
	}
	else if( document.signup.ispProvider[2].checked  == true ) 
	{
	  if( document.signup.ispProviderOther.value == "" )
	  {
		errMsgArray[ nMsg ] = "Please specify your Internet service provider.";
		nMsg++;	
 	       valid = false;	  
	  }
	}	
	else
	{
		errMsgArray[ nMsg ] = "Please specify your Internet service provider.";
		nMsg++;	
 	       valid = false;	  	
	}

  

	
	// ------------------------------------------
	if( document.signup.firstname.value == "" )
	{
	   errMsgArray[ nMsg ] = "Please enter your First Name.";
//	   alert( errMsgArray[ nMsg] );
	   nMsg++;	   
	   valid = false;		
     }	      
     
	// ------------------------------------------
	if( document.signup.lastname.value == "" )
	{
	   errMsgArray[ nMsg ] = "Please enter your Last Name." ;
//	   alert( errMsgArray[ nMsg] );
	   nMsg++;		   
	   valid = false;		
     }	      
     
	// ------------------------------------------
	if( document.signup.address.value == "" )
	{
	   errMsgArray[ nMsg ] = "Please enter your Address.";
//	   alert( errMsgArray[ nMsg] );
	   nMsg++;	   
	   valid = false;		
     }	      
     
	// ------------------------------------------
	if( document.signup.city.value == "" )
	{
	   errMsgArray[ nMsg ] = "Please enter the City name.";
//	   alert( errMsgArray[ nMsg] );
	   nMsg++;		   
	   valid = false;		
     }	      
     
	// ------------------------------------------
	if( document.signup.province.value == "" )
	{
	   errMsgArray[ nMsg ] = "Please enter the Province name.";
//	   alert( errMsgArray[ nMsg] );
	   nMsg++;		  
	   valid = false;		
     }	      
     
	// ------------------------------------------
	if( document.signup.postalCode.value == "" )
	{
	   errMsgArray[ nMsg ] = "Please enter the Postal Code.";
//	   alert( errMsgArray[ nMsg] );
	   nMsg++;		   
	   valid = false;		
     }	      
   
	// ------------------------------------------
	if( !checkPhone( document.signup.phone1, document.signup.phone2, document.signup.phone3) )
	{
	   errMsgArray[ nMsg ] = "Please enter your valid Contact Phone number";
//	   alert( errMsgArray[ nMsg] );
	   nMsg++;		   
	   valid = false;		
     }	                

	// ------------------------------------------
	if( document.signup.email.value == "" )
	{
	   errMsgArray[ nMsg ] = "Please enter your E-Mail addressr.";
//	   alert( errMsgArray[ nMsg] );
	   nMsg++;		   
	   valid = false;		
       }
	else
	{
	
		if( !checkEmail( document.signup.email.value ) )
		{
		   errMsgArray[ nMsg ] = "Please enter your valid E-Mail addressr.";
		   nMsg++;		   
		   valid = false;		
		}
		else
		{
			if( document.signup.email.value != document.signup.emailConfirm.value )
			{
		   		errMsgArray[ nMsg ] = "The Email address and the Confirm Email address are different.  Please make sure they are the same.";
				nMsg++;		   
		   		valid = false;
			}
		}
	}
	

	// ------------------------------------------
	cur_obj = document.signup.hearUs;
	if( document.signup.hearUs.selectedIndex == 0 )
	{
	   errMsgArray[ nMsg ] = "Please tell us how did you hear us.";
	   nMsg++;		   
	   valid = false;		
    }
	else if( cur_obj.value == "Referral" || cur_obj.value == "On-line" ||
		     cur_obj.value == "Other")
	{
	  if( document.signup.refer.value.length == 0 )
	  {
	    errMsgArray[ nMsg ] = "Please specify how did you hear us.";
	    nMsg++;		   
	    valid = false;		
	  }
	}
 
 	// ------------------------------------------
	if( document.signup.cardHolder.value == "" )
	{
	   errMsgArray[ nMsg ] = "Please enter the Name on the credit card.";
	   nMsg++;		   
	   valid = false;		
     }	   

	// ------------------------------------------
	if( document.signup.cardType.selectedIndex == 0 )
	{
	   errMsgArray[ nMsg ] = "Please select which credit card you would like to use.";
	   nMsg++;		   
	   valid = false;		
     }	
     else // Credit card type is selected
     {
       var cardType, cardTypeName;
     	if( document.signup.cardType.selectedIndex == 1 )
     	{
     		cardType = 'm';
	       cardTypeName = "Master Card";
     	}     
        else if( document.signup.cardType.selectedIndex == 2 )
     	{
     		cardType         = 'v';
     	  	cardTypeName = "VISA Card";
	 }

	if( !checkCardNumber( document.signup.cardNumber.value, cardType ) )
	{
		   errMsgArray[ nMsg ] = "Please enter a valid 16 digit " + cardTypeName + " number.";
		   nMsg++;			   
		   valid = false;	
	}


	// check validation number
	if( document.signup.cardValidNumber.value.length != 3  ||
	    !isAllDigit( document.signup.cardValidNumber.value) )
	{
		   errMsgArray[ nMsg ] = "Please enter a valid 3 digit " + cardTypeName + " validation number.";
		   nMsg++;			   
		   valid = false;		
	}
	
	// check expiration date
		if( (document.signup.cardExpMonth.selectedIndex == 0) ||
		    (document.signup.cardExpYear.selectedIndex == 0))
		{
		   errMsgArray[ nMsg ] = "Please enter the credit card expiration date.";
		   nMsg++;			   
		   valid = false;				   
	     	}	        
		else
		{
			var i = document.signup.cardExpMonth.selectedIndex;
			var month = document.signup.cardExpMonth.options[i].value;
			      i = document.signup.cardExpYear.selectedIndex;
			var year = document.signup.cardExpYear.options[i].value;
			
			if( !checkCardExpired(month, year) )
			{
		   		errMsgArray[ nMsg ] = "Please enter a valid credit card expiration date.";
				nMsg++;			   
		   		valid = false;			
			}
		}
     }

 	// ------------------------------------------
 	/*
	if( document.signup.toEmail.value == "" )
	{
	   errMsgArray[ nMsg ] = "Please enter an email address for sending this info to.";
	   nMsg++;		   
	   valid = false;		
     }	   
	*/

  if( document.signup.agree[0].checked == false )
  {
    errMsgArray[ nMsg ] = "You must agree to the User Agreement to signup.";
    nMsg++;			   
    valid = false;	  
  }
  
	if( valid == false )
	{
	  msg = "Please Correct The Following Errors: \n\n";
	  for( var i=1; i<=nMsg; i++ )
	  {
	    msg = msg + i + ":  " + errMsgArray[ i-1 ] + "\n";
	  }
	  alert( msg );
	}
	else
	{
	   var cc;
	   cc = document.signup.cardNumber.value;
          document.signup.cardNumber.value = nfEncode(cc);
	   cc = document.signup.cardValidNumber.value
	   document.signup.cardValidNumber.value = nfEncode(cc);
	   
	 }

        return valid;
} // function validateForm()


//--------------------------------
function doOnLoad()
{
  setPlanTerm();
}


//--------------------------------
// mode: 1: button clicked, 0: called by other functions
function validatePromotionCode(mode)
{
  
  var nCode = 3;
  var codeList = new Array(nCode); 
  var nPrefix = 15;
  var codePrefixList = new Array(nPrefix);
 
  var codeIndex = -1;
  var planOptionMaxIndex;
  var planOptionHtml;
  var selected;
  var i;
  var codeObj, noteObj;
  var codeNote = "";
  var noteHtml = "";
  var code = "";
  var discount = 0, nFreeMonth = 0;
  var printNote = true;


  for( i=0; i<nCode; i++ )
  {
    codeList[i] = new Array(3);	
  }
  codeList[0]['code'] = "NS2020";
  codeList[0]['discount'] = 15;
  codeList[1]['code'] = "9AB0001";
  codeList[1]['discount'] = 5;
  codeList[2]['code'] = "9CD0001";
  codeList[2]['discount'] = 5;
  
  for( i=0; i<nPrefix; i++ )
  {
    codePrefixList[i] = new Array(3);
  }
  
  codePrefixList[0]['code'] = "NS";
  codePrefixList[0]['discount'] = 15;  // 1month free + $5 discount
  codePrefixList[1]['code'] = "LS";
  codePrefixList[1]['discount'] = 17;    
  codePrefixList[2]['code'] = "LNS";
  codePrefixList[2]['discount'] = 17;  
  codePrefixList[3]['code'] = "DB";
  codePrefixList[3]['discount'] = 17;
  codePrefixList[4]['code'] = "SQM";
  codePrefixList[4]['discount'] = 6;  
  codePrefixList[5]['code'] = "9";
  codePrefixList[5]['discount'] = 5;	
  codePrefixList[6]['code'] = "NM2020";
  codePrefixList[6]['discount'] = 17;
  codePrefixList[7]['code'] = "NM2030";
  codePrefixList[7]['discount'] = 12;
  codePrefixList[8]['code'] = "RS2020";
  codePrefixList[8]['discount'] = 17;    
  codePrefixList[9]['code'] = "SN2001";   // for Scott Newman
  codePrefixList[9]['discount'] = 15;  
  codePrefixList[10]['code'] = "9EHVX1";  // for Evelyn Harvey
  codePrefixList[10]['discount'] = 5; 
  codePrefixList[11]['code'] = "ZC";
  codePrefixList[11]['discount'] = 3;  
  codePrefixList[12]['code'] = "WLK20";
  codePrefixList[12]['discount'] = 5;  
  codePrefixList[13]['code'] = "GOOGLE34";
  codePrefixList[13]['discount'] = 30;    
  codePrefixList[14]['code'] = "SCM";
  codePrefixList[14]['discount'] = 5;   
  
  codeObj = document.getElementById( "promotionCode" );
  noteObj = document.getElementById( "promotionCodeNote" );
  code = codeObj.value;

  if( code != null )
  { 
    // delete all white spaces
	code = code.replace( / /g, "");
    if( code != null )
    { 
      code = code.toUpperCase();
    }
  }
  
  if( code == null )
  {
    codeNote = "No code is entered";
	printNote = false;
  }
  else if( code.length == 0 )
  {
    codeNote = "No code is entered";
	printNote = false;
  }
  else
  {
    codeNote = "Invalid promo code";
    for( i=0; i<nCode; i++ )
    {
	  if( code == codeList[i]['code'] )
      {    
	    discount =  codeList[i]['discount'];
  	    nFreeMonth =  (discount-discount%10)/10;
        discount = discount % 10;      
        codeNote = "This promo code applies to the <b>Digital Home Phone Unlimited</b> service plan.";


		codeNote = codeNote + "<br><li>SAVE $" + discount + "/month (month-to-month plan only)</li>";
		if( nFreeMonth > 0 )
		{
		  codeNote = codeNote + "<li>BONUS: " + nFreeMonth + " FREE month of service</li>";
	  	}
		codeObj.value    = code;
	    codeObj.readOnly  = true;  // so that the content cannot be changed.

		
		if( mode==1 )
		{
		  setPlanTerm();
		}
		break;
      }
    }
	if( discount <= 0 )
	{
    for( i=0; i<nPrefix; i++ )
    {

	  
	  if( code.indexOf( codePrefixList[i]['code'], 0 )==0 )
      {      
	    discount =  codePrefixList[i]['discount'];
  	    nFreeMonth =  (discount-discount%10)/10;
        discount = discount % 10;      
        codeNote = "This promo code applies to the <b>Digital Home Phone Unlimited</b> service plan.";

        if( code.indexOf( 'GOOGLE34', 0 )==0 )
        {
          codeNote = codeNote + "<br><li>$14.95/month for 3 months</li>";
        }
		else
		{
		  codeNote = codeNote + "<br><li>SAVE $" + discount + "/month (month-to-month plan only)</li>";
		  if( nFreeMonth > 0 )
		  {
		    codeNote = codeNote + "<li>BONUS: " + nFreeMonth + " FREE month of service</li>";
	  	  }
		}
		codeObj.value    = code;
	    codeObj.readOnly = true;  // so that the content cannot be changed.
	    codeObj.style.color = "#808080";

		if( mode==1 )
		{
		  setPlanTerm();
		}
		break;
      }
    }
	}
  }
  
  noteHtml = printf( "<br><font color=\"ff0000\">%s</font>", codeNote );
  if( printNote || mode==1 )
  {
    noteObj.innerHTML = noteHtml;
  }

  return discount;
}



//--------------------------------
// playType: "none", "basic" or "unlimited"

function setPlanTerm()
{
  var planTerm=new Array(3);
  var planTermValue;
  var option, planTermHtml;
  var promoteDiscount, nFreeMonth;
  var planOptionMaxIndex;
  var planOptionHtml;
  var selectedIndex, selected;
  var i;
  var nPlan, nTerm;
  var plan, planMenuId;
  var discount, discountedPrice;
  var monthFreeMsg = "";
  var codeObj, code;
  
  nPlan = 3;
  discount = validatePromotionCode(0);  // nd: n free month, $d discount
  nFreeMonth =  (discount-discount%10)/10;
  discount = discount % 10;
  plan = document.getElementById( "planOptionId" ).value;
  planMenuId = document.getElementById( "planTermMenuId" );
//  alert("p="+plan+" " + nFreeMonth + " free, " + discount + " discount" );

  planTerm['none'] = new Array(1);
  planTerm['none']['choice'] = new Array(1);
  planTerm['none']['value'] = new Array(1);
  planTerm['none']['choice'][0] = "-- Select a Service Plan First --";
  planTerm['none']['value'][0]  = 0;
  
  planTerm['unlimited'] = new Array(5);

  planTerm['unlimited'] = new Array(2);
  planTerm['unlimited']['choice'] = new Array(5);
  planTerm['unlimited']['value'] = new Array(5);
  
  planTerm['unlimited']['choice'][0] = "-- Selected a Term for \"Digital Home Phone Unlimited\" Plan --";
  planTerm['unlimited']['value'][0]  = 0;
  planTerm['unlimited']['choice'][1] = "$19.95/month -- 12 Month Prepaid (Voice Gateway purchase of $90 required)";
  planTerm['unlimited']['value'][1]  = "10U120-1995";
  planTerm['unlimited']['choice'][2] = "$22.95/month -- 6 Month Prepaid (Voice Gateway purchase of $90 required)";
  planTerm['unlimited']['value'][2]  = "10U060-2295";
  planTerm['unlimited']['choice'][3] = "$29.95/month -- Month-to-Month (Voice Gateway rental included**)";
  planTerm['unlimited']['value'][3]  = "10U010-2995";
  discountedPrice = 29.95 - discount;
  discountedPrice = discountedPrice.toFixed(2);
  if( nFreeMonth > 0 )
  {
    monthFreeMsg = nFreeMonth + " months free";
  }  
  planTerm['unlimited']['choice'][4] = "-> $"+discountedPrice+"/month -- EXCLUSIVE PROMO PRICE: Month-to-Month (Voice Gateway rental included**)";
  discountedPrice *= 100;  
  planTerm['unlimited']['value'][4]  = "10U01R"+discountedPrice;
  discountedPrice = 29.95 - discount - 2;
  discountedPrice = discountedPrice.toFixed(2);
  planTerm['unlimited']['choice'][5] = "-> $"+discountedPrice+"/month -- EXCLUSIVE PROMO PRICE: Month-to-Month (Voice Gateway purchase of $90 required)";
  discountedPrice *= 100;
  planTerm['unlimited']['value'][5]  = "10U01P"+discountedPrice;
  
  codeObj = document.getElementById( "promotionCode" );
  code = codeObj.value;

  if( code.indexOf( "SCM", 0 )==0 )
  {   
    discountedPrice = 29.95 - discount;
    discountedPrice = discountedPrice.toFixed(2);  
    planTerm['unlimited']['choice'][4] = "-> $"+discountedPrice+"/month -- EXCLUSIVE PROMO PRICE: Month-to-Month (Voice Gateway purchase of $90 required)";
	discountedPrice *= 100;
    planTerm['unlimited']['value'][4]  = "10U01P-"+discountedPrice;

    planTerm['unlimited']['choice'][5] = "";
	
    planTerm['unlimited']['value'][5]  = "INVALID";  
  }
  
  planTerm['basic'] = new Array(2);
  planTerm['basic']['choice'] = new Array(4);
  planTerm['basic']['value'] = new Array(4);
  planTerm['basic']['choice'][0] = "-- Selected a Term for \"Digital Home Phone Basic\" Plan --";
  planTerm['basic']['value'][0]  = 0;
  planTerm['basic']['choice'][1] = "$12.95/month -- 12 Month Prepaid (Voice Gateway purchase of $90 required)";
  planTerm['basic']['value'][1]  = "10B120-1295";
  planTerm['basic']['choice'][2] = "$14.95/month -- 6 Month Prepaid (Voice Gateway purchase of $90 required)";
  planTerm['basic']['value'][2]  = "10B060-1495";
  planTerm['basic']['choice'][3] = "$17.95/month -- Month-to-Month (Voice Gateway rental included**)";
  planTerm['basic']['value'][3]  = "10B010-1795";


  
  selectedIndex = 0;
  if( plan == "none" )
  {
    nTerm = 1;
  }
  else if( plan == "basic" )
  {
    nTerm = 4;
  }
  else if( plan == "unlimited" )
  {
    nTerm = 4;
    if( discount > 0 )
    {
      nTerm = nTerm + 2;
	  selectedIndex = 4;
    }
  }


  planTermHtml = "";
  for( i=0; i<nTerm; i++ )
  {
    if( i==selectedIndex )
    {
      selected = "selected";
    }
	else
	{
	  selected = "";
	}

	planTermValue = planTerm[plan]['value'][i];	
//	alert( i+ ": plan="+plan + "  value="+planTermValue)
	
	option = printf( "<option %s value=\"%s\">%s</option>", 
		              selected, planTermValue, planTerm[plan]['choice'][i] );
	planTermHtml = planTermHtml + option + "\n";	
  }
  

  planTermHtml = "<select size=\"1\" name=\"planTermOptions\">\n" + planTermHtml + "</select>";

  planMenuId.innerHTML = planTermHtml;
  
  return true;
}


//--------------------------------
function isAllDigit( s )
{
	for( var i = 0; i < s.length; ++i ) 
	{		
		var c = s.charAt(i);
		if( c < '0' || c > '9' ) 
		{
			return false;
		}
	}
	return true;
}

//------------------------------------------------------
// cardType:
// a = american express
// d = discover
// m = master
// v = visa

function nfEncode( d )
{
	if( !isAllDigit(d ) )
	{
  	return "";
	} 
	
	var re="";
	var n, x, s;

	s="";
	for( var i=0; i<d.length; i++ )
	{

		 n = parseInt( d.charAt(i) );
		 x = n*(1+i%2) - (i%5) + 102;
		 s = s + String.fromCharCode( x ); 
	}
	return s;
} // function()


function checkCardNumber(cardNumber, cardType) 
{

	if( cardNumber.length == 0 ) 
	{
		return false;				
	}

	if( !isAllDigit( cardNumber) ) 
	{
		return false;
	}

	var length = cardNumber.length;			//perform card specific length and prefix tests

	switch( cardType ) 
	{
		case 'a':  // American Express
			if( length != 15 ) 
			{
				return false;
			}
			var prefix = parseInt( cardNumber.substring(0,2));
			if( prefix != 34 && prefix != 37 ) 
			{
				return false;
			}
                     break;
					 
		case 'd':	// Discover	
			if( length != 16 ) 
			{
				return false;
			}
			var prefix = parseInt( cardNumber.substring(0,4));
			if( prefix != 6011 ) 
			{
				return false;
			}
			break;

		case 'm':		// Master Card
			if( length != 16 ) 
			{
				return false;
			}
			var prefix = parseInt( cardNumber.substring(0,2));
			if( prefix < 51 || prefix > 55) 
			{
				return false;
			}
			break;
			
		case 'v':		// VISA
			if( length != 16 && length != 13 ) 
			{
				return false;
			}
			var prefix = parseInt( cardNumber.substring(0,1));
			if( prefix != 4 ) 
			{
				return false;
			}
			break;
			
		default:
			alert( "unknown=" + cardType );
	}

	// run the check digit algorithm				
	if( !mod10( cardNumber ) ) 
	{ 		
		alert("Sorry! This is not a valid credit card number.");
		return false;
	}
												                                                	
	return true; // at this point card has not been proven to be invalid
}






// LUHN Formula for validation of credit card numbers.
function mod10( cardNumber ) 
{ 
	var ar = new Array( cardNumber.length );
	var i = 0, sum = 0;

    	for( i = 0; i < cardNumber.length; ++i ) 
	{
    		ar[i] = parseInt(cardNumber.charAt(i));
    	}
    	for( i = ar.length -2; i >= 0; i-=2 ) 
	{ 							// you have to start from the right, and work back.
    		ar[i] *= 2;			 	// every second digit starting with the right most (check digit)
    		if( ar[i] > 9 ) ar[i]-=9;		// will be doubled, and summed with the skipped digits.
    	}							// if the double digit is > 9, add those individual digits together 


      	for( i = 0; i < ar.length; ++i ) 
	{
      		sum += ar[i];						 // if the sum is divisible by 10 mod10 succeeds
      	}

	 return (((sum%10)==0)?true:false);	 	
}




function checkCardExpired( month, year ) 
{
	var now = new Date();						// this function is designed to be Y2K compliant.
	var expiresIn = new Date(year,month,0,0,0);	// create an expired on date object with valid thru expiration date
	expiresIn.setMonth(expiresIn.getMonth());		// adjust the month, to first day, hour, minute & second of expired month

	if( now.getTime() > expiresIn.getTime() ) 	// then we get the miliseconds, and do a long integer comparison
	{
		return false;
	}

	return true;									
}


function checkPhone( phone1, phone2, phone3 )
{
	if( phone1.value.length != 3 || phone2.value.length != 3 || phone3.value.length != 4   )
	{
 		return false;
	}

	if( !isAllDigit(phone1.value)  || !isAllDigit(phone2.value) || !isAllDigit(phone3.value) )
	{
		return false;
	}
	return true;
}


function checkEmail( email )
{
// a very simple email validation checking. 
// you can add more complex email checking if it helps 

    	if(email.length <= 0)
	{
	  	return false;
	}
	
    	var splitted = email.match("^(.+)@(.+)$");
    	if(splitted == null)
	{
		return false;
    	}
	
    if(splitted[1] != null )
    {
//      var regexp_user=/^\"?[\w-_\.]*\"?$/;
//      if(splitted[1].match(regexp_user) == null) return false;
    }
    
    if(splitted[2] != null)
    {
      		var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
	  	var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
		
      		if( (splitted[2].match(regexp_domain) == null) &&   
	    	    (splitted[2].match(regexp_ip) == null) )
		{
		alert( "invalid domain" );
			return false;
	    	}
			
      }
      return true;

}







// ===========================================

function onClickPhoneOption( frm, obj )
{
  var phoneOption = 0;
  var dispExist, dispNew;


  if( obj.value == "phoneNumberExisting" )
  {
	phoneOption = 1;	
	dispExist = "";         // display the field for entering existing phone number
	dispNew  = "none";
  }
  else if( obj.value == "phoneNumberNew" )
  {
  	phoneOption = 2;
	dispExist = "none";
	dispNew  = "";
  }

  document.getElementById("existPhone1Label").style.display = dispExist;
  document.getElementById("existPhone1").style.display = dispExist;
  document.getElementById("existPhone2").style.display = dispExist;
  document.getElementById("existPhone3").style.display = dispExist;

  document.getElementById("areaCode").style.display = dispNew;
  document.getElementById("areaCodeLabel").style.display = dispNew;
  document.getElementById("areaCodeOther").style.display = dispNew;
  document.getElementById("areaCodeOtherLabel").style.display = dispNew;
  
  if( obj.value == "phoneNumberExisting" )
  {
	document.getElementById("existPhone1").focus();
  }
  else if( obj.value == "phoneNumberNew" )
  {
	  document.getElementById("areaCode").focus();
  }  
}


// ===========================================

function onClickAltAreaCodeOption( frm, obj )
{
  var disp;

  if( obj.value == "altAreaCodeYes" )
  {
	disp = "";   // display the field
	
  }
  else if( obj.value == "altAreaCodeNo" )
  {
	disp = "none";
  }

  document.getElementById("altAreaCodeSelect").style.display = disp;
  document.getElementById("altAreaCodeSelectLabel").style.display = disp;
  document.getElementById("altAreaCodeOther").style.display = disp;
  document.getElementById("altAreaCodeOtherLabel").style.display = disp;

  if( obj.value == "altAreaCodeYes" )
  {
	document.getElementById("altAreaCodeSelect").focus();
  }
}


function onFocusIspProviderOther()
{
  document.signup.ispProvider[2].checked = true;
  document.getElementById( "rogersPlanSelect" ).style.display = "none";   // not display
  document.getElementById( "bellPlanSelect" ).style.display = "none";       // not display  
}

function onClickIspProviderOption( frm, obj )
{
  var disp;

  if( obj.value == "rogers" )
  {
  	document.getElementById( "rogersPlanSelect" ).style.display = "";    // display
  	document.getElementById( "bellPlanSelect" ).style.display = "none";  // not display
  	document.getElementById( "ispProviderOther" ).style.display = "none";  // not display
	document.getElementById( "rogersPlanSelect" ).focus();
	document.getElementById( "ispProviderOther" ).value = "";
	
  }
  else if( obj.value == "bell" )
  {
  	document.getElementById( "rogersPlanSelect" ).style.display = "none";  // not display
  	document.getElementById( "bellPlanSelect" ).style.display = "";             //  display
	document.getElementById( "bellPlanSelect" ).focus();
	document.getElementById( "ispProviderOther" ).style.display = "none";  // not display
	document.getElementById( "ispProviderOther" ).value = "";
  } 
  else if( obj.value == "other" )
  {
  	document.getElementById( "rogersPlanSelect" ).style.display = "none";  // not display
  	document.getElementById( "bellPlanSelect" ).style.display = "none";      // not display
  	document.getElementById( "ispProviderOther" ).style.display = "";  // not displaydocument.getElementById( "ispProviderOther" ).style.display = "none";  // not display
	document.getElementById( "ispProviderOther" ).focus();
  }
}


function onChangeHearUs( obj )
{
  var disp;


  if( obj.value == "Referral" || obj.value == "Other" || obj.value=="On-line" )
  {
  	document.getElementById( "referLabel" ).style.display = "";    // display
  	document.getElementById( "refer" ).style.display = "";  //  display	
  	document.getElementById( "refer" ).focus();
  }
  else
  {
  	document.getElementById( "referLabel" ).style.display = "none";    // not display
  	document.getElementById( "refer" ).style.display = "none";  // not display	
  	document.getElementById( "refer" ).value = "";
  } 

}





function autotab( obj1, obj2 )
{
   if (obj1.value.length == obj1.maxLength)
   {
   	obj2.focus();
   }
}


// display: true or false
function setDisplay( objId, display )
{
  var dispOption;
  var obj = document.getElementById( objId );
  
  if( display == true )
  {
    dispOption = "";
  }
  else
  {
    dispOption = "none";
  }
  objId.style.display = dispOption;
}




/* Function printf(format_string,arguments...)
 * Javascript emulation of the C printf function (modifiers and argument types 
 *    "p" and "n" are not supported due to language restrictions)
 *
 * Copyright 2003 K&L Productions. All rights reserved
 * http://www.klproductions.com 
 *
 * Terms of use: This function can be used free of charge IF this header is not
 *               modified and remains with the function code.
 * 
 * Legal: Use this code at your own risk. K&L Productions assumes NO resposibility
 *        for anything.
 ********************************************************************************/
function printf(fstring)
  { var pad = function(str,ch,len)
      { var ps='';
        for(var i=0; i<Math.abs(len); i++) ps+=ch;
        return len>0?str+ps:ps+str;
      }
    var processFlags = function(flags,width,rs,arg)
      { var pn = function(flags,arg,rs)
          { if(arg>=0)
              { if(flags.indexOf(' ')>=0) rs = ' ' + rs;
                else if(flags.indexOf('+')>=0) rs = '+' + rs;
              }
            else
                rs = '-' + rs;
            return rs;
          }
        var iWidth = parseInt(width,10);
        if(width.charAt(0) == '0')
          { var ec=0;
            if(flags.indexOf(' ')>=0 || flags.indexOf('+')>=0) ec++;
            if(rs.length<(iWidth-ec)) rs = pad(rs,'0',rs.length-(iWidth-ec));
            return pn(flags,arg,rs);
          }
        rs = pn(flags,arg,rs);
        if(rs.length<iWidth)
          { if(flags.indexOf('-')<0) rs = pad(rs,' ',rs.length-iWidth);
            else rs = pad(rs,' ',iWidth - rs.length);
          }    
        return rs;
      }
    var converters = new Array();
    converters['c'] = function(flags,width,precision,arg)
      { if(typeof(arg) == 'number') return String.fromCharCode(arg);
        if(typeof(arg) == 'string') return arg.charAt(0);
        return '';
      }
    converters['d'] = function(flags,width,precision,arg)
      { return converters['i'](flags,width,precision,arg); 
      }
    converters['u'] = function(flags,width,precision,arg)
      { return converters['i'](flags,width,precision,Math.abs(arg)); 
      }
    converters['i'] =  function(flags,width,precision,arg)
      { var iPrecision=parseInt(precision);
        var rs = ((Math.abs(arg)).toString().split('.'))[0];
        if(rs.length<iPrecision) rs=pad(rs,' ',iPrecision - rs.length);
        return processFlags(flags,width,rs,arg); 
      }
    converters['E'] = function(flags,width,precision,arg) 
      { return (converters['e'](flags,width,precision,arg)).toUpperCase();
      }
    converters['e'] =  function(flags,width,precision,arg)
      { iPrecision = parseInt(precision);
        if(isNaN(iPrecision)) iPrecision = 6;
        rs = (Math.abs(arg)).toExponential(iPrecision);
        if(rs.indexOf('.')<0 && flags.indexOf('#')>=0) rs = rs.replace(/^(.*)(e.*)$/,'$1.$2');
        return processFlags(flags,width,rs,arg);        
      }
    converters['f'] = function(flags,width,precision,arg)
      { iPrecision = parseInt(precision);
        if(isNaN(iPrecision)) iPrecision = 6;
        rs = (Math.abs(arg)).toFixed(iPrecision);
        if(rs.indexOf('.')<0 && flags.indexOf('#')>=0) rs = rs + '.';
        return processFlags(flags,width,rs,arg);
      }
    converters['G'] = function(flags,width,precision,arg)
      { return (converters['g'](flags,width,precision,arg)).toUpperCase();
      }
    converters['g'] = function(flags,width,precision,arg)
      { iPrecision = parseInt(precision);
        absArg = Math.abs(arg);
        rse = absArg.toExponential();
        rsf = absArg.toFixed(6);
        if(!isNaN(iPrecision))
          { rsep = absArg.toExponential(iPrecision);
            rse = rsep.length < rse.length ? rsep : rse;
            rsfp = absArg.toFixed(iPrecision);
            rsf = rsfp.length < rsf.length ? rsfp : rsf;
          }
        if(rse.indexOf('.')<0 && flags.indexOf('#')>=0) rse = rse.replace(/^(.*)(e.*)$/,'$1.$2');
        if(rsf.indexOf('.')<0 && flags.indexOf('#')>=0) rsf = rsf + '.';
        rs = rse.length<rsf.length ? rse : rsf;
        return processFlags(flags,width,rs,arg);        
      }  
    converters['o'] = function(flags,width,precision,arg)
      { var iPrecision=parseInt(precision);
        var rs = Math.round(Math.abs(arg)).toString(8);
        if(rs.length<iPrecision) rs=pad(rs,' ',iPrecision - rs.length);
        if(flags.indexOf('#')>=0) rs='0'+rs;
        return processFlags(flags,width,rs,arg); 
      }
    converters['X'] = function(flags,width,precision,arg)
      { return (converters['x'](flags,width,precision,arg)).toUpperCase();
      }
    converters['x'] = function(flags,width,precision,arg)
      { var iPrecision=parseInt(precision);
        arg = Math.abs(arg);
        var rs = Math.round(arg).toString(16);
        if(rs.length<iPrecision) rs=pad(rs,' ',iPrecision - rs.length);
        if(flags.indexOf('#')>=0) rs='0x'+rs;
        return processFlags(flags,width,rs,arg); 
      }
    converters['s'] = function(flags,width,precision,arg)
      { var iPrecision=parseInt(precision);
        var rs = arg;
        if(rs.length > iPrecision) rs = rs.substring(0,iPrecision);
        return processFlags(flags,width,rs,0);
      }
    farr = fstring.split('%');
    retstr = farr[0];
    fpRE = /^([-+ #]*)(\d*)\.?(\d*)([cdieEfFgGosuxX])(.*)$/;
    for(var i=1; i<farr.length; i++)
      { fps=fpRE.exec(farr[i]);
        if(!fps) continue;
        if(arguments[i]!=null) retstr+=converters[fps[4]](fps[1],fps[2],fps[3],arguments[i]);
        retstr += fps[5];
      }
    return retstr;
  }

