// ----------------------------------------------------------------------
// Javascript form validation routines.
// Author: Stephen Poley
//
// Simple routines to quickly pick up obvious typos.
// All validation routines return true if executed by an older browser:
// in this case validation must be left to the server.
//
// Update Jun 2005: discovered that reason IE wasn't setting focus was
// due to an IE timing bug. Added 0.1 sec delay to fix.
//
// Update Oct 2005: minor tidy-up: unused parameter removed
//
// Update Jun 2006: minor improvements to variable names and layout
// ----------------------------------------------------------------------

var nbsp = 160;		// non-breaking space char
var node_text = 3;	// DOM text node-type
var emptyString = /^\s*$/ ;
var global_valfield;	// retain valfield for timer thread

// --------------------------------------------
//                  trim
// Trim leading/trailing whitespace off string
// --------------------------------------------
function trim(str)
{
  return str.replace(/^\s+|\s+$/g, '');
}
// --------------------------------------------
//                  setfocus
// Delayed focus setting to get around IE bug
// --------------------------------------------
function setFocusDelayed()
{
  global_valfield.focus();
}
function setfocus(valfield)
{
  // save valfield in global variable so value retained when routine exits
  global_valfield = valfield;
  setTimeout( 'setFocusDelayed()', 100 );
}

// --------------------------------------------
//                  msg
// Display warn/error message in HTML element.
// commonCheck routine must have previously been called
// --------------------------------------------

function msg(fld,     // id of element to display message in
             msgtype, // class to give element ("warn" or "error")
             message) // string to display
{
  // setting an empty string can give problems if later set to a
  // non-empty string, so ensure a space present. (For Mozilla and Opera one could
  // simply use a space, but IE demands something more, like a non-breaking space.)
  var dispmessage;
  if (emptyString.test(message))
    dispmessage = String.fromCharCode(nbsp);
  else
    dispmessage = message;

  var elem = document.getElementById(fld);
  elem.firstChild.nodeValue = dispmessage;

  elem.className = msgtype;   // set the CSS class to adjust appearance of message
}

// --------------------------------------------
//            commonCheck
// Common code for all validation routines to:
// (a) check for older / less-equipped browsers
// (b) check if empty fields are required
// Returns true (validation passed),
//         false (validation failed) or
//         proceed (don't know yet)
// --------------------------------------------
var proceed = 2;
function commonCheck    (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  if (!document.getElementById)
    return true;  // not available on this browser - leave validation to the server
  var elem = document.getElementById(infofield);


  if (!elem.firstChild) return true;  // not available on this browser
  if (elem.firstChild.nodeType != node_text) return true;  // infofield is wrong type of node

  if (emptyString.test(valfield.value)) {

    if (required) {

	 valfield.className="normal"; // M.D.

      msg (infofield, "error", "Required field");
   	  valfield.className="error"; // M.D.
      setfocus(valfield);
      return false;
    }
    else {
      msg (infofield, "warn", "");   // OK
      return true;
    }
  }
  return proceed;
}

// --------------------------------------------
//            validatePresent
// Validate if something has been entered
// Returns true if so
// --------------------------------------------

function validatePresent(valfield,   // element to be validated
                         infofield ) // id of element to receive info/error msg
{

  valfield.className="normal"; // M.D.

  var stat = commonCheck (valfield, infofield, true);
  if (stat != proceed) return stat;

  msg (infofield, "warn", "");
  return true;
}

// --------------------------------------------
//               validateEmail
// Validate if e-mail address
// Returns true if so (and also if could not be executed because of old browser)
// --------------------------------------------

function validateEmail  (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  valfield.className="normal"; // M.D.
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed) return stat;

  var tfld = trim(valfield.value);  // value of field with whitespace trimmed off
  var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/  ;
  if (!email.test(tfld)) {
    msg (infofield, "error", "Invalid e-mail address");
	valfield.className="error"; // M.D.
    setfocus(valfield);
    return false;
  }

  var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/  ;
  if (!email2.test(tfld))
    msg (infofield, "warn", "Unusual e-mail address - check if correct");
  else
    msg (infofield, "warn", "");
  return true;
}


// --------------------------------------------
//            validateTelnr
// Validate telephone number
// Returns true if so (and also if could not be executed because of old browser)
// Permits spaces, hyphens, brackets and leading +
// --------------------------------------------

function validateTelnr  (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed) return stat;

  var tfld = trim(valfield.value);  // value of field with whitespace trimmed off
  var telnr = /^\+?[0-9 ()-]+[0-9]$/  ;
  if (!telnr.test(tfld)) {
    msg (infofield, "error", "ERROR: not a valid telephone number. Characters permitted are digits, space ()- and leading +");
//    msg (infofield, "error", "ERROR: not a valid integer number. Characters permitted are digits, space ()- and leading +");


	setfocus(valfield);




    return false;
  }

  var numdigits = 0;
  for (var j=0; j<tfld.length; j++)
    if (tfld.charAt(j)>='0' && tfld.charAt(j)<='9') numdigits++;

  if (numdigits<6) {
    msg (infofield, "error", "ERROR: " + numdigits + " digits - too short");
    setfocus(valfield);
    return false;
  }

  if (numdigits>14)
    msg (infofield, "warn", numdigits + " digits - check if correct");
  else {
    if (numdigits<10)
      msg (infofield, "warn", "Only " + numdigits + " digits - check if correct");
    else
      msg (infofield, "warn", "");
  }
  return true;
}

// --------------------------------------------
//             validateAge
// Validate person's age
// Returns true if OK
// --------------------------------------------

function validateAge    (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed) return stat;

  var tfld = trim(valfield.value);
  var ageRE = /^[0-9]{1,3}$/
  if (!ageRE.test(tfld)) {
    msg (infofield, "error", "ERROR: not a valid age");
    setfocus(valfield);
    return false;
  }

  if (tfld>=200) {
    msg (infofield, "error", "ERROR: not a valid age");
    setfocus(valfield);
    return false;
  }

  if (tfld>110) msg (infofield, "warn", "Older than 110: check correct");
  else {
    if (tfld<7) msg (infofield, "warn", "Bit young for this, aren't you?");
    else        msg (infofield, "warn", "");
  }
  return true;
}

// --------------------------------------------
//             validateAge
// Validate person's age
// Returns true if OK
// --------------------------------------------

function validateInt    (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed) return stat;
  valfield.className="normal";
  msg (infofield, "alert_form", "");
  var tfld = trim(valfield.value);
  var intRE = /^[0-9]{1,8}$/
  if (!intRE.test(tfld)) {
    msg (infofield, "error", "Invalid integer");
//	alert(valfield);
	valfield.className="error"; // M.D.
    setfocus(valfield);
    return false;
  }

  return true;
}
//////////////////////////
function validateThreePartPhone( valfield1, valfield2, valfield3, infofield, required, thisvalfield )
{
  thisvalfield.className = "normal";
  valfield1.className    = "normal";
  valfield2.className    = "normal";
  valfield3.className    = "normal";
	if( required )
	{
		if (thisvalfield!="0")
		{
		  var stat = commonCheck (thisvalfield, infofield, required);

		  if (stat != proceed) {
	  		  thisvalfield.className="error";
			  return stat;
		  }

		} else {

		  var stat1 = commonCheck (valfield1, infofield, required);
		  var stat2 = commonCheck (valfield2, infofield, required);
  		  var stat3 = commonCheck (valfield3, infofield, required);
		  var totalError = false;


		  if (stat1 != proceed) {
	  		  valfield1.className="error";
			  totalError = true;
			  return false;
		  }

		  if (stat2 != proceed) {
	  		  valfield2.className="error";
			  totalError = true;
			  return false;
		  }

		  if (stat3 != proceed) {
	  		  valfield3.className="error";
			  totalError = true;
			  return false;
		  }



			if (totalError == true)
			{
			  return false;
			}

		}
	}

  var tfld1 = trim(valfield1.value);
  var tfld2 = trim(valfield2.value);
  var tfld3 = trim(valfield3.value);
  var intRE = /^[0-9]{1,3}$/

//   var telnr = /^\+?[0-9 ()-]+[0-9]$/  ; // this can be used too to allow spaces and pluses
//  if (!telnr.test(tfld)) {

   msg (infofield, "hidden", "");
  if (!intRE.test(tfld1)) {
    msg (infofield, "error", "Country code must contain only digits ");
    valfield1.className="error";
    setfocus(valfield1);
    return false;
  } else {
	  if (!intRE.test(tfld2)) {
		msg (infofield, "error", "Area code must contain only digits ");
		valfield2.className="error";
		setfocus(valfield2);
		return false;
	  } else {
		  if (!intRE.test(tfld3)) {
			  if (!tfld3>0) {
				msg (infofield, "error", "Phone number must contain only digits ");
				valfield3.className="error";
				setfocus(valfield3);
				return false;
			  }
		  }
	  }
	}
  return true;
}
/* miscellanous */
//////////////////////////
function textCounter( field, countfield, maxlimit )
{
  if ( field.value.length > maxlimit )
  {
    field.value = field.value.substring( 0, maxlimit );
    alert( 'Textarea value can only be ' + maxlimit + ' characters in length.' );
    return false;
  }
  else
  {
    countfield.value = maxlimit - field.value.length;
  }
}
//////////////////////////
function validateCalendarForm(textareaField, textField)
{
  return;
}
//////////////////////////
function validate_textarea_input( textareaField, textareaFieldlabel, maxLength )
{
  var enteredChars=textareaField.value.length;

	if( enteredChars > maxLength )
	{
	 alert( 'Field ' + textareaFieldlabel + ' can only be '+maxLength+' characters in length. You have entered: ' + enteredChars + ' characters.' );
	 return false;
	}
}
//////////////////////////
function validate_textareas( theForm )
{
  if( theForm.summary.value.length > 125 )
  {
    alert( 'Summary can only be 125 characters in length. You have entered: ' + theForm.summary.value.length + ' characters.' );
  	return false;
  }

  if( theForm.desc.value.length > 4000 )
  {
    alert( 'Descripton value can only be 4000 characters in length.' + theForm.desc.value.length );
  	return false;
  }
  if( theForm.message.value.length > 125 )
  {
    alert( 'Message can only be 125 characters in length. You have entered: ' + theForm.message.value.length + ' characters.' );
  	return false;
  }
  return true;
}
//////////////////////////
function validate_user_login( theForm )
{
  if( theForm.password != null )
	{
		theForm.hash.value = hex_md5( theForm.password.value );
	}
}
//////////////////////////
function calculateCovers()
{
	/*	The Covers field value needs to be automatically calculated as a sum of Reservations + Walk Ins.
	The Covers field must be a read-only field (not allowing input by user, only outputting the result of the values
	of the other two fields it depends on) */
	try
	{
  	var res      = document.form_main.reservations.value * 1;
  	var walkins  = document.form_main.walkins.value * 1;
  	var covers   = res + walkins;
  	document.form_main.covers.value = covers;
  	calculateAvgCheck();
	}
	catch( Exception ){;}
  return;
}
//////////////////////////
function calculateAvgCheck()
{
	/*	The Average check field will be read only too and will display the result of the values of Sales divided by Covers. */
	var sales  = document.form_main.sales.value * 1;
	var covers = document.form_main.covers.value * 1;
	if( covers > 0 )
	{
		var check = Math.round( sales / covers );
	}
	else
	{
		var check = 0;
	}
	document.form_main.check.value = check;
	return;
}
//////////////////////////
function selectManagers( hiddenField, outputArea )
{
  var index                 = document.form_main.managers.selectedIndex;
  var managerId             = document.form_main.managers.value * 1;
  var ManagerNames          = document.form_main.managers.options[index].text;
  var oElement              = eval( 'document.form_main.' + hiddenField );
  var hiddenCollectedvalue  = oElement.value;
  var checkvalue            = "~" + managerId + "~";
	if( managerId > 0 )
	{
		if( hiddenCollectedvalue.indexOf( checkvalue ) == -1 )
		{
			if( hiddenCollectedvalue.length == 1 && hiddenCollectedvalue == "~" )
			{
				oElement.value = hiddenCollectedvalue + managerId + "~";
			}
			else if( hiddenCollectedvalue == "" )
			{
				oElement.value = hiddenCollectedvalue + "~" + managerId + "~";
			}
			else
			{
				oElement.value = hiddenCollectedvalue + managerId + "~";
			}
			document.getElementById(outputArea).innerHTML+="<span id='manager_" + managerId + "'> " + ManagerNames + " <span class='util_link_small' onclick='javascript:removeManager(" + managerId + ",\"" + hiddenField + "\",\"" + outputArea + "\");'>[remove]</span>&nbsp;&nbsp;&nbsp;</span>";
		}
		else
		{
			alert( ManagerNames + " is already assigned as Shift Manager!" );
		}
	}
    document.form_main.managers.selectedIndex=0;
}
//////////////////////////
function selectManagersAssigned( hiddenField, outputArea )
{
  var oElement        = eval('document.form_main.' + hiddenField);
	var hiddenCollectedvalue = oElement.value;
  var count=document.form_main.assigned_managers_all.value;
  var i=0;

  for( i; i < count; i++ )
  {
    var oId                 = eval('document.form_main.assigned_managers_id_'+i);
		var managerId           = oId.value *1;
		var oTFirstName         = eval( 'document.form_main.assigned_managers_firstname_'+ i );
		var oTLastName          = eval( 'document.form_main.assigned_managers_lastname_' + i );
		var ManagerNames        = oTFirstName.value + ' ' + oTLastName.value;
		var hiddenCollectedvalue= oElement.value;
		var checkvalue          = "~" + managerId + "~";
		if( hiddenCollectedvalue.indexOf( checkvalue ) == -1 )
		{
			if( hiddenCollectedvalue.length == 1 && hiddenCollectedvalue == "~" )
			{
				oElement.value = hiddenCollectedvalue + managerId + "~";
			}
			else if( hiddenCollectedvalue == "" )
			{
				oElement.value = hiddenCollectedvalue + "~" + managerId + "~";
			}
			else
			{
				oElement.value = hiddenCollectedvalue + managerId + "~";
			}
			document.getElementById(outputArea).innerHTML+="<span id='manager_" + managerId + "'> " + ManagerNames + " <span class='util_link_small' onclick='javascript:removeManager(" + managerId + ",\"" + hiddenField + "\",\"" + outputArea + "\");'>[remove]</span>&nbsp;&nbsp;&nbsp;</span>";
		}
	}
  document.form_main.managers.selectedIndex=0;
}
/////////////////////////////
function removeManager( managerId, hiddenField, outputArea )
{
  var oElement        = eval('document.form_main.' + hiddenField);
  var collectedIds    = oElement.value;
  var valueToReplace  = "~" + managerId ;
  var collectedIdsNew = collectedIds.replace(valueToReplace,'');

	oElement.value=collectedIdsNew;
	document.getElementById( "manager_" + managerId ).innertHTML       = "";
	document.getElementById( "manager_" + managerId ).style.visibility = "hidden";
	document.getElementById( "manager_" + managerId ).style.position   = "absolute";
  return;
}

