// Utils.js
//
// Various utils for dealing with strings and validation
 
function nonWS(s)
{
 if (s == " ") return false;
 if (s == "\t") return false;
 return true;
}


// Cross-platform function to set inner text.
function setInnerText(o, sText)
{
	if (o.innerText != undefined)
	{
		o.innerText = sText;
	}
	else
	{
		o.textContent = sText;
	}
}


function trimAll(sString) 
{
    while (sString.substring(0,1) == ' ')
    {
        sString = sString.substring(1, sString.length);
    }
    while (sString.substring(sString.length-1, sString.length) == ' ')
    {
        sString = sString.substring(0,sString.length-1);
    }
    return sString;
}

function jsTrim(s)
{
 var nLen = s.length;
 var nStart = 0;
 var nEnd = nLen - 1;
 var i;

 for (nStart = 0; nStart <= nEnd; nStart++)
  if (nonWS(s.charAt(nStart))) break;

 for (nEnd = nLen - 1; nEnd >= nStart; nEnd--)
  if (nonWS(s.charAt(nEnd))) break;

 return s.substr(nStart, nEnd - nStart + 1);
}


function validateNoQuotes (obj, msg)
{
 var s = new String(obj.value);
 var i;
 for (i = 0; i < s.length; i++)
 {
  switch (s.charAt(i))
  {
   case "'":
   case '"':
    alert(msg);
    obj.focus();
    return false;
  }
 }
 return true;
}


function validateNonZero(obj, msg)
{
 if (obj == null)
 {
  return true;
 }
 if (obj.value == '0')
 {
  alert(msg);
  obj.focus();
  return false;
 }
 return true;
}


function validatePresence(obj, msg)
{
 if (obj == null)
 {
  return true;
 }
 if (jsTrim(obj.value) == '')
 {
  alert(msg);
  obj.focus();
  return false;
 }
 return true;
}


function validatePresenceAlphaNumeric(obj, msg, msgAlpha)
{
 if (jsTrim(obj.value) == '')
 {
  alert(msg);
  obj.focus();
  return false;
 }
 if (!isStringAlphaNumeric(obj.value))
 {
  alert(msgAlpha);
  obj.focus();
  return false;
 }
 return true;
}


function validatePresenceNonNegNumber(obj, msg)
{
 if (jsTrim(obj.value) == '')
 {
  alert(msg);
  obj.focus();
  return false;
 }
 if (!isFinite(obj.value) || obj.value < 0)
 {
  alert(msg);
  obj.focus();
  return false;
 }
 return true;
}


function validateLimit(obj, nLimit, sLimitMsg)
{
 if (obj.value.length > nLimit)
 {
  alert(sLimitMsg);
  obj.focus();
  return false;
 }
 return true;
}


// Make sure date is in dd/mm/yyyy format.
function validateDate(obj)
{
    // regular expression to match required date format
    re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;

    if (!obj.value.match(re))
	{
		alert("'" + obj.value + "' is an invalid date format.\r\nPlease use dd/mm/yyyy for the format.");
		obj.focus();
		return false;
    }
	return true;
}



function validatePresenceLimit(obj, sMsg, nLimit, sLimitMsg)
{
 if (jsTrim(obj.value) == "")
 {
  alert(sMsg);
  obj.focus();
  return false;
 }
 if (obj.value.length > nLimit)
 {
  alert(sLimitMsg);
  obj.focus();
  return false;
 }
 return true;
}


function validateCurrency(sName, sDesc)
{
 var ta;
 ta = document.getElementById(sName);
 if (ta)
 {
  if (!isFinite(ta.value))
  {
   alert('Please enter a number for ' + sDesc + '.');
   ta.focus();
   return false;
  }
 }
 return true;
}


function validatePresenceBound(obj, sMsg, nLow, nHigh, sBoundMsg)
{
 if (!isFinite(obj.value))
 {
  alert(sMsg);
  obj.focus();
  return false;
 }
 if (obj.value < nLow || obj.value > nHigh)
 {
  alert(sBoundMsg);
  obj.focus();
  return false;
 }
 return true;
}


function validatePresenceAtLeast(obj, sMsg, nLow)
{
 if (jsTrim(obj.value) == "")
 {
  alert(sMsg);
  obj.focus();
  return false;
 }
 if (!isFinite(obj.value))
 {
  alert(sMsg);
  obj.focus();
  return false;
 }
 if (obj.value < nLow)
 {
  alert(sMsg);
  obj.focus();
  return false;
 }
 return true;
}


function isStringAlphaNumeric(s)
{
 var i;
 for (i = s.length - 1; i >= 0; i--)
  if (!isCharAlphaNumeric(s.charAt(i))) return false;

 return true;
}

function isCharAlphaNumeric(c)
{
 return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || (c == '_'));
}


function isStringNumeric(s)
{
 var i;
 for (i = s.length - 1; i >= 0; i--)
  if (!isCharNumeric(s.charAt(i))) return false;

 return true;
}

function isCharNumeric(c)
{
 return (c >= '0' && c <= '9');
}


function validateImageSelection(sSel, sImgBrowse, sMsg)
{
 var imgSel = document.getElementById(sSel);
 if (imgSel.value == '/upload')
 {
  var imgUp = document.getElementById(sImgBrowse);
  if (jsTrim(imgUp.value) == '')
  {
   alert(sMsg);
   imgUp.focus();
   return false;
  }
 }
 return true;
}

function syncNav(navID)
{
	document.getElementById(navID).style.background = "#535456";
	//document.getElementById(navID).style.color = "#5B0024";
}

function validatePresence(obj, msg)
{
	if (obj == null)
	{
		return true;
	}
	if (jsTrim(obj.value) == '')
	{
		alert(msg);
		obj.focus();
		return false;
	}
	return true;
}

function validateEmail(obj, msg, bAllowBlank)
{
	var str = obj.value;
	if (jsTrim(str) == "")
	{
		if (bAllowBlank)
		{
			return true;
		}
		else
		{
			alert(msg);
			obj.focus();
			return false;
		}
	}

	var at = "@";
	var dot = ".";
	var lat = str.indexOf(at);
	var lstr = str.length;
	var ldot = str.indexOf(dot);

	if ( (str.indexOf(at) == -1)
	|| (str.indexOf(at) == -1 || str.indexOf(at) == 0 || str.indexOf(at) == lstr)
	|| (str.indexOf(dot) == -1 || str.indexOf(dot) == 0 || str.indexOf(dot) == lstr)
	|| (str.indexOf(at, (lat + 1)) != -1)
	|| (str.substring(lat - 1, lat) == dot || str.substring(lat + 1, lat + 2) == dot)
	|| (str.indexOf(dot, (lat + 2)) == -1)
	|| (str.indexOf(" ") != -1) )
	{
		alert(msg);
		obj.focus();
		return false;
	}
	return true;
}


function jsTrim(s)
{
 var nLen = s.length;
 var nStart = 0;
 var nEnd = nLen - 1;
 var i;

 for (nStart = 0; nStart <= nEnd; nStart++)
  if (nonWS(s.charAt(nStart))) break;

 for (nEnd = nLen - 1; nEnd >= nStart; nEnd--)
  if (nonWS(s.charAt(nEnd))) break;

 return s.substr(nStart, nEnd - nStart + 1);
}

function nonWS(s)
{
 if (s == " ") return false;
 if (s == "\t") return false;
 return true;
}


function addOptionSimple(selectbox, value)
{
	var optn = document.createElement("OPTION");
	optn.text = value;
	optn.value = value;
	selectbox.options.add(optn);
}


// We have the ContainerTypes in a javascript variable (sContainerTypesData).
// Now, split them up into individual entries for the ContainerTypes dropdown.
function populateDropdownSimple(dropDown, sItems)
{
	var array = sItems.split(";");
	for (var i = 0; i < array.length; i++)
	{
		var pair = array[i].split(":");
		addOptionSimple(dropDown, array[i]);
	}
}
