// JavaScript functions



function up_1( r )
	{
		//alert( r );
		var q =  document.getElementById( r ).value * 1;
		
		document.getElementById( r ).value = q + 1;
		
		if( q < 0 )
			{
				document.getElementById( r ).value = '';
			}
		
		s1( r );
	
	}    //    end of function



function down_1( r )
	{
		//alert( r );
		
		var q =  document.getElementById( r ).value * 1;
		
		if( q >= 1 )
			{
				document.getElementById( r ).value = q - 1;
			}
		
		if( q <= 1 )
			{
				document.getElementById( r ).value = '';
			}
			
		s1( r );	  
	
	}    //    end of function


function up_3( r )
	{
		//alert( r );
		var q =  document.getElementById( r ).value * 1;
		
		document.getElementById( r ).value = q + 1;
		
		if( q < 0 )
			{
				document.getElementById( r ).value = '';
			}
		
		s3( r );
	
	}    //    end of function


function down_3( r )
	{
		//alert( r );
		var q =  document.getElementById( r ).value * 1;
		
		if( q >= 1 )
			{
				document.getElementById( r ).value = q - 1;
			}
		
		if( q <= 1 )
			{
				document.getElementById( r ).value = '';
			}
			
		s3( r );	  
	
	}    //    end of function



function s1( r )    //    form_quick
	{
		//alert( "function s1() : " + r );

		var xml_string	= "<xml><session_id>" + session_id + "</session_id>";
		
		//alert( getCheckedValue( document.form_quick.order_type ) );
		
		xml_string		+= "<data>";
		
		//    always send radio
		
		xml_string		+= "<order_type>" + getCheckedValue( document.form_quick.order_type ) + "</order_type>";
		
		
		if( r != "order_type" )
			{
				//    input field obj
				
				var qty			= document.getElementById( r ).value;
				
				//alert( "qty = " + qty );
		
				if( qty == 0  ||  qty == "" )
					{
						qty 	= "0";
					}
					
				//alert( "qty = " + qty );
				
				xml_string		+= "<" + r + ">" + qty + "</" + r + ">";
			}
		
		xml_string		+= "</data>";
		
		xml_string		+= "</xml>";
		
		//alert( "xml_string = " + xml_string );

		//
		//    build XMLHttpRequest()
		//
		
		var http_rq = new XMLHttpRequest();
		
		var url		= "http://www.fastorder.info/fastorder/xml.php";
		
		http_rq.open( "POST", url, true );    //    'true' is for asynchronous
		
		//    Send the proper header information along with the request
		
		http_rq.setRequestHeader( "MessageType", "Call" );
		http_rq.setRequestHeader( "Content-type", "text/xml" );
		http_rq.setRequestHeader( "Content-length", xml_string.length );
		http_rq.setRequestHeader( "Connection", "close" );

		http_rq.send( xml_string );
		
		//    wait for response
		
		http_rq.onreadystatechange	= function() { if( http_rq.readyState == 4 )
			{
				//alert( "http_rq.responseText = " + http_rq.responseText );  //  for debug
				
			}    //  end of if( http_rq.readyState == 4 )
			
		}    //    end of http_rq.onreadystatechange function()

	}    //    end of function s1()


// return the value of the radio button that is checked
// return an empty string if none are checked, or
// there are no radio buttons
function getCheckedValue( radioObj ) {
	
	//alert( "radioObj = " +  radioObj );
	
	if(!radioObj)
		return "";
	var radioLength = radioObj.length;
	
	//alert( "radioLength = " +  radioLength );
	
	if(radioLength == undefined)
		if(radioObj.checked)
			return radioObj.value;
		else
			return "";
	for(var i = 0; i < radioLength; i++) {
		if(radioObj[i].checked) {
			return radioObj[i].value;
		}
	}
	return "";

}    //    end of getCheckedValue( radioObj )

// set the radio button with the given value as being checked
// do nothing if there are no radio buttons
// if the given value does not exist, all the radio buttons
// are reset to unchecked
function setCheckedValue(radioObj, newValue) {
	if(!radioObj)
		return;
	var radioLength = radioObj.length;
	if(radioLength == undefined) {
		radioObj.checked = (radioObj.value == newValue.toString());
		return;
	}
	for(var i = 0; i < radioLength; i++) {
		radioObj[i].checked = false;
		if(radioObj[i].value == newValue.toString()) {
			radioObj[i].checked = true;
		}
	}

}    //    end of setCheckedValue(radioObj, newValue)


//
//    IE error - form onchange event does NOT work with https - need event handlers on each element
//

function s2( obj )    //    form_my_account.html
	{
		//alert( "id = " + obj.id + ", value = " + obj.value );
		
		var f = [ "user", "mail", "pass", "first", "last", "street", "apt", "city", "state", "zip", "phone", "special", "mm", "yyyy", "csv", "cc" ];
		
		var c = [ "checkbox_mail", "checkbox_cc", "checkbox_weekly_mail", "checkbox_weekly_sms" ];
		
		var http_rq = new XMLHttpRequest();
		
		var url		= "https://www.fastorder.info/fastorder/xml.php";
		
		http_rq.open( "POST", url, true );    //    'true' is for asynchronous
		
		var xml_string	= "<xml><session_id>" + session_id + "</session_id>";
		
		xml_string		+= "<data>";

		
		//    input fields   f array
		
		for( i = 0; i < f.length; i++ )
			{
				if( document.getElementById( f[i] ).value != "" )
					{
						xml_string		+= "<" + f[i] + ">" + document.getElementById( f[i] ).value + "</" + f[i] + ">";
					}
			}

		
		//    checkboxes    c array
		
		for( i = 0; i < c.length; i++ )
			{
				xml_string		+= "<" + c[i] + ">" + document.getElementById( c[i] ).checked + "</" + c[i] + ">";
			}
		
		
		//    radio cc_type
		
		xml_string		+= "<cc_type>" + getCheckedValue( document.form_my_account.cc_type ) + "</cc_type>";
		
		xml_string		+= "</data>";
		
		xml_string		+= "</xml>";
		
		//alert( "xml_string = " + xml_string );
		
		//    Send the proper header information along with the request
		
		http_rq.setRequestHeader( "MessageType", "Call" );
		http_rq.setRequestHeader( "Content-type", "text/xml" );
		http_rq.setRequestHeader( "Content-length", xml_string.length );
		http_rq.setRequestHeader( "Connection", "close" );

		http_rq.send( xml_string );
		
		//    wait for response
		
		http_rq.onreadystatechange	= function() { if( http_rq.readyState == 4 )
			{
				//alert( "http_rq.responseText = " + http_rq.responseText );  //  for debug
				
			}    //  end of if( http_rq.readyState == 4 )
			
		}    //    end of http_rq.onreadystatechange function()

	}    //    end of function s2()


function s3( r )    //    form_detail
	{
		//alert( "function s3() : element id = " + r );
		
		var xml_string	= "<xml><session_id>" + session_id + "</session_id>";
		
		//alert( getCheckedValue( document.form_detail.order_type ) );
		
		xml_string		+= "<data>";
		
		//    always send radio
		
		xml_string		+= "<order_type>" + getCheckedValue( document.form_detail.order_type ) + "</order_type>";
		
		//    input field r
		
		
		if( r != "order_type" )
			{
				var qty			= document.getElementById( r ).value;
				
				if( qty == 0  ||  qty == "" )
					{
						qty 	= "0";
					}
					
				//alert( "qty = " + qty );
				
				xml_string		+= "<" + r + ">" + qty + "</" + r + ">";
			}
		
		xml_string		+= "</data>";
		
		xml_string		+= "</xml>";
		
		//alert( "xml_string = " + xml_string );

		//
		//    build  XMLHttpRequest()
		//

		var http_rq = new XMLHttpRequest();
		
		var url		= "http://www.fastorder.info/fastorder/xml.php";
		
		http_rq.open( "POST", url, true );    //    'true' is for asynchronous
		
		http_rq.setRequestHeader( "MessageType", "Call" );
		http_rq.setRequestHeader( "Content-type", "text/xml" );
		http_rq.setRequestHeader( "Content-length", xml_string.length );
		http_rq.setRequestHeader( "Connection", "close" );

		http_rq.send( xml_string );
		
		//    wait for response
		
		http_rq.onreadystatechange	= function() { if( http_rq.readyState == 4 )
			{
				//alert( "http_rq.responseText = " + http_rq.responseText );  //  for debug
				
			}    //  end of if( http_rq.readyState == 4 )
			
		}    //    end of http_rq.onreadystatechange function()
				
	}    //    end of function s3()



function test( obj )    //  use: test( this )
	{
		alert( "function test() : " + obj.id );
		
	}    //    end of function


function test_drupal_name_exists( obj )
	{
		//alert( "test_drupal_name_exists - " + obj.id );
		
		//    the page calling this must be https
		
		var xml_string	= "<xml>";
		
		xml_string		+= "<table>users</table>";
		xml_string		+= "<field>uid</field>";
		xml_string		+= "<where_field>name</where_field>";
		xml_string		+= "<where_value>" + obj.value + "</where_value>";
		
		xml_string		+= "</xml>";
		
		//alert( "xml_string = " + xml_string );

		//
		//    build XMLHttpRequest()
		//
		
		var http_rq = new XMLHttpRequest();
		
		var url		= "https://www.fastorder.info/fastorder/xml_1.php";
		
		http_rq.open( "POST", url, true );    //    'true' is for asynchronous
		
		//    Send the proper header information along with the request
		
		http_rq.setRequestHeader( "MessageType", "Call" );
		http_rq.setRequestHeader( "Content-type", "text/xml" );
		http_rq.setRequestHeader( "Content-length", xml_string.length );
		http_rq.setRequestHeader( "Connection", "close" );

		http_rq.send( xml_string );
		
		//    wait for response
		
		http_rq.onreadystatechange	= function() { if( http_rq.readyState == 4 )
			{
				//alert( "http_rq.responseText = " + http_rq.responseText );  //  for debug
				
				if( http_rq.responseText > 0 )
					{
						//alert( "write error message" );
						
						var message	 = "<p>Username " + obj.value + " already exists. If you do not already have an account, please enter a different username.</p>";
						
						document.getElementById( 'error_user' ).innerHTML = message;
						
						return true;
					}
				else
					{
						//alert( "put into fastorder_session_temp" );
						
						document.getElementById( 'error_user' ).innerHTML = "";
						
						//s2( obj.value );    //  put value into fastorder_session_temp
						
						return false;
					}
				
			}    //  end of if( http_rq.readyState == 4 )
			
		}    //    end of http_rq.onreadystatechange function()
		
	}    //    end of function
	
	
function validate_email_format( obj )
	{
		var v	= obj.value;
		
		//alert( "validate_email_format - " + obj.id + " : value =" + v );
		
		//  if checkbox_mail == on then check for duplicate mail
		
		if( document.getElementById( 'checkbox_mail' ).value == "on" )
			{
				if( test_drupal_name_exists( obj ) == true )
					{
						return;  //  display error message and return
					}
			}
		
		//  look for @
		
		var at	= v.indexOf( "@" );
		
		//alert( at );
		
		if( at > 0 )
			{
				document.getElementById( 'error_mail' ).innerHTML = "";
			}
		else
			{
				document.getElementById( 'error_mail' ).innerHTML = v + " is invalid.  An email address requires the '@' symbol.";
				write_session_temp_value( session_id, obj.id );
				return;
			}
		
		
		//  look for .
		
		var dot	= v.indexOf( "." );
		
		//alert( dot );
		
		if( dot > at )
			{
				document.getElementById( 'error_mail' ).innerHTML = "";
			}
		else
			{
				document.getElementById( 'error_mail' ).innerHTML = v + " is invalid.  An email address requires the '.' symbol.";
				write_session_temp_value( session_id, obj.id );
				return;
			}
		
		
		//  look for extensions
		
		var ext	= v.substring( dot + 1 );
		
		//alert( ext );
		//alert( ext.length );
		
		if( ext.length >= 2 )
			{
				//alert( "true" );
				document.getElementById( 'error_mail' ).innerHTML = "";
			}
		else
			{
				//alert( "false" );
				document.getElementById( 'error_mail' ).innerHTML = ext + " is not a valid domain extension.  A domain name extension must have 2 or more characters.";
				write_session_temp_value( session_id, obj.id );
				return;
			}
		
		
		//  ok to save
		
		s2( obj );
		
		//  write into user if checkbox_mail is true
		
		//alert( document.getElementById( 'checkbox_mail' ).value );
		
		if( document.getElementById( 'checkbox_mail' ).value == 'on' )
			{
				document.getElementById( 'user' ).value = v;
			}
		
		
	}    //    end of function


function write_session_temp_value( session_id, field )
	{
		//    the page calling this must be https
		
		var xml_string	= "<xml>";
		
		xml_string		+= "<session_id>" + session_id + "</session_id>";
		
		xml_string		+= "<field>" + document.getElementById( field ).value + "</field>";
		
		document.getElementById( f[i] ).value
		
		xml_string		+= "</xml>";
		
		///alert( "xml_string = " + xml_string );

		//
		//    build XMLHttpRequest()
		//
		
		var http_rq = new XMLHttpRequest();
		
		var url		= "https://www.fastorder.info/fastorder/xml_2.php";
		
		http_rq.open( "POST", url, true );    //    'true' is for asynchronous
		
		//    Send the proper header information along with the request
		
		http_rq.setRequestHeader( "MessageType", "Call" );
		http_rq.setRequestHeader( "Content-type", "text/xml" );
		http_rq.setRequestHeader( "Content-length", xml_string.length );
		http_rq.setRequestHeader( "Connection", "close" );

		http_rq.send( xml_string );
		
		//    wait for response
		
		http_rq.onreadystatechange	= function() { if( http_rq.readyState == 4 )
			{
				//alert( "http_rq.responseText =" + http_rq.responseText );  //  for debug
				
				document.getElementById( field ).value = http_rq.responseText;
				
			}    //  end of if( http_rq.readyState == 4 )
			
		}    //    end of http_rq.onreadystatechange function()
		
	}    //    end of function
	

function test_checkbox_mail( obj )
	{
		//alert( obj.checked );
		
		if( obj.checked == true )
			{
				document.getElementById( 'user' ).readOnly = true;
				
				document.getElementById( 'user' ).value = document.getElementById( 'mail' ).value;
			}
		else
			{
				document.getElementById( 'user' ).readOnly = false;
			}
		
		s2( obj );
		
	}    //    end of function
	

function verify_zip( obj )
	{
		//alert( "id = " + obj.id + ", value = " + obj.value );
		
		var o 	= obj.value;  //  old zip
		var n	= "";         //  new zip
		
		var oa	= o.split( "" );
		var na	= [];
		var ni	= 0;
		
		for( oi = 0; oi < oa.length; oi++ )
			{
				//  allow only 0 - 9
				
				if( oa[oi] != '0' && oa[oi] != '1' && oa[oi] != '2' && oa[oi] != '3' && oa[oi] != '4' && oa[oi] != '5' && oa[oi] != '6' && oa[oi] != '7' && oa[oi] != '8' && oa[oi] != '9' )
					{
						continue;
					}
				
				//  save new zip
				
				na[ni] = oa[oi];
				ni++;
			}
		
		n	= na.join( "" );
		
		document.getElementById( obj.id ).value = n;  //  filtered zip
		
		//  check for length of 5 or 9
		
		if( n.length == 5  ||  n.length == 9 )
			{
				document.getElementById( "error_zip" ).innerHTML = "";	
				
				if( n.length == 9 )
					{
						n	= n.replace( n.substr( 0, 5 ), n.substr( 0, 5 ) + "-" );
						//alert( n );
						document.getElementById( obj.id ).value = n;  //  xxxxx-xxxx
					}
				
				s2( obj );  //  save
				return;
			}
		else
			{
				document.getElementById( "error_zip" ).innerHTML = "Zip Code must have 5 or 9 characters: xxxxx or xxxxx-xxxx.";
				return;
			}
	
	}    //    end of function


function verify_phone( obj )
	{
		//alert( "id = " + obj.id + ", value = " + obj.value );
		
		var o 	= obj.value;  //  old
		var n	= "";         //  new
		
		var oa	= o.split( "" );
		var na	= [];
		var ni	= 0;
		
		for( oi = 0; oi < oa.length; oi++ )
			{
				//  allow only 0 - 9
				
				if( oa[oi] != '0' && oa[oi] != '1' && oa[oi] != '2' && oa[oi] != '3' && oa[oi] != '4' && oa[oi] != '5' && oa[oi] != '6' && oa[oi] != '7' && oa[oi] != '8' && oa[oi] != '9' )
					{
						continue;
					}
				
				//  save new
				
				na[ni] = oa[oi];
				ni++;
			}
		
		n	= na.join( "" );
		
		document.getElementById( obj.id ).value = n;  //  filtered
		
		//  check for length of 10
		
		if( n.length == 10 )
			{
				document.getElementById( "error_phone" ).innerHTML = "";	
				
				n	= n.replace( n.substr( 0, 3 ), n.substr( 0, 3 ) + "-" );
				n	= n.replace( n.substr( 0, 7 ), n.substr( 0, 7 ) + "-" );
				//alert( n );
				document.getElementById( obj.id ).value = n;  //  xxx-xxx-xxxx
				
				s2( obj );  //  save
				return;
			}
		else
			{
				document.getElementById( "error_phone" ).innerHTML = "Phone number must have 10 characters: xxx-xxx-xxxx.";
				return;
			}
	
	}    //    end of function


function verify_cc( obj )
	{
		//alert( "id = " + obj.id + ", value = " + obj.value );

		var o 	= obj.value;  //  old
		var n	= "";         //  new
		
		var oa	= o.split( "" );
		var na	= [];
		var ni	= 0;
		
		for( oi = 0; oi < oa.length; oi++ )
			{
				//  allow only 0 - 9
				
				if( oa[oi] != '0' && oa[oi] != '1' && oa[oi] != '2' && oa[oi] != '3' && oa[oi] != '4' && oa[oi] != '5' && oa[oi] != '6' && oa[oi] != '7' && oa[oi] != '8' && oa[oi] != '9' )
					{
						continue;
					}
				
				//  save new
				
				na[ni] = oa[oi];
				ni++;
			}
		
		n	= na.join( "" );
		
		document.getElementById( obj.id ).value = n;  //  filtered
		
		//  check for length of 16
		
		if( n.length == 16 )
			{
				document.getElementById( "error_cc" ).innerHTML = "";	
				
				n	= n.replace( n.substr( 0, 4 ), n.substr( 0, 4 ) + " " );
				n	= n.replace( n.substr( 0, 9 ), n.substr( 0, 9 ) + " " );
				n	= n.replace( n.substr( 0, 14 ), n.substr( 0, 14 ) + " " );
				//alert( n );
				document.getElementById( obj.id ).value = n;  //  xxxx xxxx xxxx xxxx
				
				s2( obj );  //  save
				return;
			}
		else
			{
				document.getElementById( "error_cc" ).innerHTML = "Credit card number must have 16 characters: xxxx xxxx xxxx xxxx.";
				return;
			}

	}    //    end of function


function verify_csv( obj )
	{
		//alert( "id = " + obj.id + ", value = " + obj.value );

		var o 	= obj.value;  //  old
		var n	= "";         //  new
		
		var oa	= o.split( "" );
		var na	= [];
		var ni	= 0;
		
		for( oi = 0; oi < oa.length; oi++ )
			{
				//  allow only 0 - 9
				
				if( oa[oi] != '0' && oa[oi] != '1' && oa[oi] != '2' && oa[oi] != '3' && oa[oi] != '4' && oa[oi] != '5' && oa[oi] != '6' && oa[oi] != '7' && oa[oi] != '8' && oa[oi] != '9' )
					{
						continue;
					}
				
				//  save new
				
				na[ni] = oa[oi];
				ni++;
			}
		
		n	= na.join( "" );
		
		document.getElementById( obj.id ).value = n;  //  filtered
		
		//  check for length of 3 or 4
		
		if( n.length == 3 || n.length == 4 )
			{
				document.getElementById( "error_csv" ).innerHTML = "";	
				
				s2( obj );  //  save
				return;
			}
		else
			{
				document.getElementById( "error_csv" ).innerHTML = "CSV must have 3 or 4 characters: xxx or xxxx.";
				return;
			}

	}    //    end of function


function verify_pass( obj )
	{
		//alert( "id = " + obj.id + ", value = " + obj.value );

		var p		= obj.value;
		var id		= obj.id;
		var e		= "error_" + obj.id;
		
		var pv		= document.getElementById( "pass" ).value;
		var pv1		= document.getElementById( "pass1" ).value;
		var pid		= document.getElementById( "pass" ).id;
		var pid1	= document.getElementById( "pass1" ).id;
		var ep		= "error_pass";
		var ep1		= "error_pass1";
		
		//alert( "pv = " + pv + ", pv1 = " + pv1 + ", pid = " + pid + ", pid1 = " + pid1 );
		
		if( pv.length == 0  &&  pv1.length == 0 )
			{
				document.getElementById( ep ).innerHTML = "";
				document.getElementById( ep1 ).innerHTML = "";
				
				return;
			}
		
		if( p.length > 2 )
			{
				document.getElementById( e ).innerHTML = "";	
			}
		else
			{
				document.getElementById( e ).innerHTML = "Password must be 3 characters or longer.";
				return;
			}

		if( pv.length != 0  &&  pv1.length != 0  &&  pv != pv1 )
			{
				document.getElementById( e ).innerHTML = "Passwords do not match.";
				return;
			}

		if( pv.length > 2  &&  pv1.length > 2  &&  pv == pv1 )
			{
				document.getElementById( ep ).innerHTML = "";
				document.getElementById( ep1 ).innerHTML = "";
				
				s2( obj );  //  save
				
				//alert( "ok" );
			}

	}    //    end of function



function debug_variable( var_name, v, debug_id )
	{
		var out	= document.getElementById( debug_id ).innerHTML
		
		out		+= "<br />Variable : " + var_name + " = " + v + "<br />";
		
		document.getElementById( debug_id ).innerHTML	= out;
	
	}    //    end of function


function debug_array( arr_name, arr, debug_id )
	{
		var out	= document.getElementById( debug_id ).innerHTML
		
		out		+= "<br />Array : " + arr_name + " =<br />";
		
		for ( var sKey in arr )
			{
				out		+= sKey + " : " + arr[sKey];
				out		+= "<br />";
			}
			
		document.getElementById( debug_id ).innerHTML	= out;
	
	}    //    end of function


function dumpProps( obj, parent ) {
   // Go through all the properties of the passed-in object 
   for (var i in obj) {
      // if a parent (2nd parameter) was passed in, then use that to 
      // build the message. Message includes i (the object's property name) 
      // then the object's property value on a new line 
      if (parent) { var msg = parent + "." + i + "\n" + obj[i]; } else { var msg = i + "\n" + obj[i]; }
      // Display the message. If the user clicks "OK", then continue. If they 
      // click "CANCEL" then quit this level of recursion 
      if (!confirm(msg)) { return; }
      // If this property (i) is an object, then recursively process the object 
      if (typeof obj[i] == "object") { 
         if (parent) { dumpProps(obj[i], parent + "." + i); } else { dumpProps(obj[i], i); }
      }
   }
}


function sortAssoc( aInput )
	{
		var aTemp 	= [];
		var sTemp 	= [];
		var obj		= new Object();
		
		for ( var sKey in aInput )
			{
				aTemp.push( aInput[ sKey ] );
			}
		
		sTemp	= aTemp.sort( numOrdA );
		
		for ( var tKey in sTemp )
			{
				for( var sKey in aInput )
					{
						if( sTemp[ tKey ] == aInput[ sKey ] )
							{
								obj[ sKey ]	= aInput[ sKey ];
							}
					}
			}

		return obj;
	
	}    //    end of function


function numOrdA( a, b )
	{
		return ( a - b );
	}


function write_array(  arr2 )
	{
		// show the sorted array
		for ( var sKey in arr2 )
			{
				document.write( sKey + ':' + arr2[sKey] + '; ');
				document.write('<br />');
			}
		
		document.write('<br />');
		
	}    //   end of function


function get_object_size( obj )
	{
		var	i = 0 * 1;
		for( var key in obj )
			{
				i++;
			}
		
		return i;
		
	}    //    end of function


