//*****************************************************************************
// Navigation + Standard Prompts
//*****************************************************************************
function PrevPage()
{ history.back(); }

function LoadPage(page_name)
{
   var d = new Date();
   if (page_name.lastIndexOf("?") == -1)
   { location.href = page_name + "?x=" + d.getTime(); }
   else
   { location.href = page_name + "&x=" + d.getTime(); }
}

function ConfirmDelete(item_name, item_data)
{
   return confirm("Delete " + item_name + ": '" + item_data + "'?")
}

function GoToNewWin(page, win_name, appearance, use_cache)
{   
   if (page.indexOf(".htm") == -1 )
   {
      if (page.indexOf("?") == -1 )
      { page = page + "?"; }
      else
      { page = page + "&"; }

      if (use_cache) 
      {
         page = page;
      }
      else
      {
         //x forces no cacheing
         var d = new Date;
         page = page + "x=" + d.getTime();
      }
   }
   
   if (win_name == "")
   { win_name = "new_win"; }

   window.open(page , win_name, appearance);
}

//*****************************************************************************
// Date
//*****************************************************************************
function IsDate(obj)
{
   var str_datevalue = obj.value;
   var str = str_datevalue;
   var d; var m; var y;
   var is_err=false;
   
   if (str_datevalue == "") {return true;}
   
   if (str.indexOf(" ") != -1)
   {
      d = str.substring(0, str.indexOf(" "));
      m = str.substring(str.indexOf(" ")+1,str.lastIndexOf(" "));
      y = str.substring(str.lastIndexOf(" ")+1, str.length);
   }
   else if (str.indexOf("/") != -1)
   {
      d = str.substring(0, str.indexOf("/"));
      m = str.substring(str.indexOf("/")+1,str.lastIndexOf("/"));
      y = str.substring(str.lastIndexOf("/")+1, str.length);
   }
   else if (str.length == 6 || str.length == 8)
   {
      d = str.substring(0,2);
      m = str.substring(2,4);
      y = str.substring(4, str.length);
   }

   if (isNaN(parseInt(d)))
   { is_err = true; }   
   else if (isNaN(parseInt(y)))
   { is_err = true; }   
   else
   {
      y = parseInt(y);
      if (y < 30) { y = 2000 + y; }      
      
      m = m.toLowerCase();
      switch(m.substring(0,3))
      {
         case "jan": m = 1; break;
         case "feb": m = 2; break;
         case "mar": m = 3; break;
         case "apr": m = 4; break; 
         case "may": m = 5; break; 
         case "jun": m = 6; break; 
         case "jul": m = 7; break; 
         case "aug": m = 8; break; 
         case "sep": m = 9; break; 
         case "oct": m = 10; break; 
         case "nov": m = 11; break;
         case "dec": m = 12; break;
      }
      
      if (m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12)
      { if (d<1 || d>31) {is_err = true;} }
      else if (m==4 || m==6 || m==9 || m ==11)
      { if (d<1 || d>30) {is_err = true;} }
      else if (m==2)
      { 
         if (y%100 == 0)
         {
            if (y%400 == 0)
            { if (d<1 || d>29) {is_err = true;} }
            else
            { if (d<1 || d>28) {is_err = true;} }            
         }
         else
         {
            if (y%4 == 0)
            { if (d<1 || d>29) {is_err = true;} }
            else
            { if (d<1 || d>28) {is_err = true;} }
         }
      }
      else
      {is_err = true; }
   }

   if (!is_err)
   {
      str = m +"/" + d + "/" + y
      if (isNaN(Date.parse(str)))
      { is_err = true; }
      else
      { var dte = new Date(str); }
   }
   
   if (is_err) 
   {
      return false;
   }
   
   obj.value = FmtDate(dte);
   return true;
}

function CheckDate(obj)
{
   var str = obj.value;
   var d; var m; var y;
   var is_err=false;
   
   if (obj.value == "") {return true;}
   
   if (str.indexOf(" ") != -1)
   {
      d = str.substring(0, str.indexOf(" "));
      m = str.substring(str.indexOf(" ")+1,str.lastIndexOf(" "));
      y = str.substring(str.lastIndexOf(" ")+1, str.length);
   }
   else if (str.indexOf("/") != -1)
   {
      d = str.substring(0, str.indexOf("/"));
      m = str.substring(str.indexOf("/")+1,str.lastIndexOf("/"));
      y = str.substring(str.lastIndexOf("/")+1, str.length);
   }
   else if (str.length == 6 || str.length == 8)
   {
      d = str.substring(0,2);
      m = str.substring(2,4);
      y = str.substring(4, str.length);
   }

   if (isNaN(parseInt(d)))
   { is_err = true; }   
   else if (isNaN(parseInt(y)))
   { is_err = true; }   
   else
   {
      y = parseInt(y);
      if (y < 30) { y = 2000 + y; }      
      
      m = m.toLowerCase();
      switch(m.substring(0,3))
      {
         case "jan": m = 1; break;
         case "feb": m = 2; break;
         case "mar": m = 3; break;
         case "apr": m = 4; break; 
         case "may": m = 5; break; 
         case "jun": m = 6; break; 
         case "jul": m = 7; break; 
         case "aug": m = 8; break; 
         case "sep": m = 9; break; 
         case "oct": m = 10; break; 
         case "nov": m = 11; break;
         case "dec": m = 12; break;
      }
      
      if (m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12)
      { if (d<1 || d>31) {is_err = true;} }
      else if (m==4 || m==6 || m==9 || m ==11)
      { if (d<1 || d>30) {is_err = true;} }
      else if (m==2)
      { 
         if (y%100 == 0)
         {
            if (y%400 == 0)
            { if (d<1 || d>29) {is_err = true;} }
            else
            { if (d<1 || d>28) {is_err = true;} }            
         }
         else
         {
            if (y%4 == 0)
            { if (d<1 || d>29) {is_err = true;} }
            else
            { if (d<1 || d>28) {is_err = true;} }
         }
      }
      else
      {is_err = true; }
   }

   if (!is_err)
   {
      str = m +"/" + d + "/" + y
      if (isNaN(Date.parse(str)))
      { is_err = true; }
      else
      { var dte = new Date(str); }
   }
   
   if (is_err) 
   { alert("Cannot recognise '" + obj.value + "' as a date."); obj.focus(); return false; }
   else
   { obj.value = FmtDate(dte); return true; }
}

function FmtDate(d)
{
   var x=d.getDate();
   var temp="";
   
   if (x<10) {x = "0" + x;}   
   temp = x + " ";
   switch (d.getMonth() + 1)
   {
      case 1: temp = temp + "Jan";break;
      case 2: temp = temp + "Feb";break;
      case 3: temp = temp + "Mar";break;
      case 4: temp = temp + "Apr";break;
      case 5: temp = temp + "May";break;
      case 6: temp = temp + "Jun";break;
      case 7: temp = temp + "Jul";break;
      case 8: temp = temp + "Aug";break;
      case 9: temp = temp + "Sep";break;
      case 10: temp = temp + "Oct";break;
      case 11: temp = temp + "Nov";break;
      case 12: temp = temp + "Dec";break;
   }
   temp = temp + " " + d.getFullYear();
   return temp;
}


//*****************************************************************************
// Editing
//*****************************************************************************
function CheckCode(obj)
{
   var code;
   var i;
   var chr;
   code = obj.value;
   code = code.toUpperCase();
   
   for (i=0; i < code.length; i++)
   {
      chr = code.charAt(i)
      if (!((chr >= "A" && chr <= "Z") || (chr >= "0" && chr <= "9")))
      { 
         alert ("Invalid character: '" + chr + "'.  Only characters 'A' to 'Z' and '0' to '9' are valid."); 
         obj.focus();
         return false;
      }
   }
   
   obj.value = code;
   return true;
}

function CheckCurrency(obj)
{
   if (obj.value == "") {return true;}
   
   var new_val = obj.value;
   var achar;
   
   for (var i = 0; i != new_val.length; i++)
   {
      achar = new_val.substring(i,i+1)
      if ((achar < "0" || achar > "9") && achar != "." && achar != "$" && achar != ",")
      { alert("'" + obj.value + "' is not a number."); obj.focus(); return false; }
   }
   return true;
}

function CheckInteger(obj)
{
   if (obj.value == "") {return true;}
   
   var new_val = obj.value;
   var achar;
   
   for (var i = 0; i != new_val.length; i++)
   {
      achar = new_val.substring(i,i+1)
      if (achar < "0" || achar > "9")
      { alert("'" + obj.value + "' is not a number."); obj.focus(); return false; }
   }
   return true;
}

function FmtDollar(m)
{ 
   return "$" + FmtMoney(m);
}

function FmtMoney(m)
{ 
   var str = parseFloat(m).toString();
   var idx = str.indexOf(".");
   
   if (idx == -1)
   { return str + ".00"; }
   else
   { 
      if (idx == (str.length - 2))
      { return str + "0" ; }
      else
      { return str.substring(0,idx+3); }
   }
}

function MakeUCase(obj)
{ obj.value = obj.value.toUpperCase(); }

function MyParseFloat(f)
{
   var str;
   var newstr="";
   str = f.toString();
   
   for(i=0; i < str.length; i++)
   {
      aChar = str.substring(i, i+1)
      if ((aChar >= "0" && aChar <= "9") || aChar == "." || aChar == "-")
      { newstr = newstr + aChar; }
   }
     
   return parseFloat(newstr);
}


//*****************************************************************************
// Lists
//*****************************************************************************
function CountSelected(s)
{
   var count=0;
   var i;
   
   for (i=0; i < s.options.length; i++)
   { 
      if (s.options(i).selected)
      { count++; }
   }
   return count;
}
function ListSelect(s, value)
{
   var i;
   for (i=0; i < s.options.length; i++)
   {
      if (s.options(i).value == value)
      { s.options(i).selected=true; }
   }
}
function ListSelectAll(s)
{
   var i;
   for (i=0; i < s.options.length; i++)
   { s.options(i).selected=1; }
}

function ListUnselectAll(s)
{
   var i;
   for (i=0; i < s.options.length; i++)
   { s.options(i).selected=0; }
}

function ListAddItem(s, item_text, item_value, sorted)
{
   var el = document.createElement("OPTION");
   var i=0;
   
   el.text=item_text;
   el.value=item_value;
   el.selected=1;
   
   if (sorted)
   {
      //Assume sorted by value
      for (i=0; i < s.options.length; i++)
      {
         //if already in list, just select item
         if (item_value == s.options(i).value)
         { ListUnselectAll(s); s.options(i).selected=1; return; }
         else if (item_value < s.options(i).value)
         { break; }
      }
      ListUnselectAll(s);
      s.options.add(el,i);
   }
   else
   {
      ListUnselectAll(s);
      s.options.add(el);
   }
}

function ListDelItem(s)
{
   var opts = s.options;
   var opts_len = opts.length - 1;
   var i=0;

   if (opts_len == -1)
   {
      alert ("No items to delete.");
      return;
   }
   
   while (1)   
   {
      if (opts(i).selected)
      { opts.remove(i); opts_len = opts.length -1 ; i=-1; }
      
      if (i == opts_len)
      { break; }
      else
      { i++; }
   }   
}

function ListDelAll(s)
{
   while (s.options.length > 0)
   { s.options.remove(0); }
}

function ListAddPadding(length)
{
   var i;
   var out="";
   for (i=0; i < length; i++)
   {
      out = out + " "
   }
   return out;
}

//*****************************************************************************
// Right alignment
//*****************************************************************************
function RightAlignBlur(obj)
{
   var str = obj.value;
   var padding = "";
   var i;
   
   for (i=str.length-1; i >=0 ; i--) { if (str.charAt(i) != " ") {break;} }
   str = str.substring(0, i+1);
   for (i=0; i < obj.size - str.length; i++) { padding = padding + " "; }
   obj.value = padding + str;
}
function RightAlignFocus(obj)
{
   var str = obj.value;
   for (var i=0; i < str.length; i++) 
   { if (str.charAt(i) != " ") {break;} }
   obj.value = str.substring(i, str.length);
}
function RightAlignCheckNumber(obj,decimal_pt)
{
   var str = obj.value;
   var dp_idx;
   var new_str = "";
   var digits=0;
   var i;

   if (str == "") 
   { return true; }
   
   //trim head
   for (i=0; i < str.length; i++) 
   { if (str.charAt(i) != " ") {break;} }
   str = str.substring(i, str.length);

   //trim tail
   for (i=str.length-1; i>=0; i--) 
   { if (str.charAt(i) != " ") {break;} }
   str = str.substring(0, i+1);

   dp_idx = str.indexOf(".")
   
   //Going backwards, parse string for valid characters
   for (i=str.length-1; i>=0 ; i--) 
   { 
      achar = str.charAt(i);
      if ((achar >= "0" && achar <= "9") || achar == ".")
      { 
         new_str = achar + new_str;
         if (dp_idx == -1 || i < dp_idx)
         {  //If after decimal point, then add thousand sep            
            digits++;
            if ((digits % 3) == 0 && i != 0)
            { new_str = "," + new_str; }
         }
      }
      else if (achar == "." && decimal_pt == 0)
      { break; }
      else if (achar != ",")
      { alert("'" + obj.value + "' is not a number."); obj.focus(); return false; }
   }

   //Fixup decimal points
   dp_idx = new_str.indexOf(".");   
   if (decimal_pt == 0)
   { 
      if (dp_idx != -1 )
      { new_str = new_str.substring(0, dp_idx); }
   }
   else
   {
      if (dp_idx == 0 )
      { 
         new_str = "0" + new_str;
         dp_idx=1;
         new_str = new_str.substring(0, dp_idx + decimal_pt + 1);
      }
      else if (dp_idx == -1)
      { new_str = new_str + "."; dp_idx = new_str.length-1; }
      else
      { new_str = new_str.substring(0, dp_idx + decimal_pt + 1); }
   
      //Pad decimal points to correct length
      for (i=dp_idx; new_str.length <= decimal_pt + dp_idx; i++)
      { new_str = new_str + "0"; }
   }
   
   obj.value = new_str;
   RightAlignBlur(obj);
   return true;
}


//*****************************************************************************
// General Data Checking
//*****************************************************************************

function IsNumeric(obj)
{
   if (obj.value == "") {return true;}
   
   var new_val = obj.value;
   var achar;
   
   for (var i = 0; i != new_val.length; i++)
   {
      achar = new_val.substring(i,i+1)
      if (achar < "0" || achar > "9")
         if (achar != ".")
            return false;
   }
   return true;
}

function IsInteger(obj)
{
   if (obj.value == "") {return true;}
   
   var new_val = obj.value;
   var achar;
   
   for (var i = 0; i != new_val.length; i++)
   {
      achar = new_val.substring(i,i+1)
      if (achar < "0" || achar > "9")
         if ((achar != "-") && (achar != "+"))
            return false;
   }
   return true;
}


function IsPositiveInteger(obj)
{
   if (obj.value == "") {return true;}
   
   var new_val = obj.value;
   var achar;
   
   for (var i = 0; i != new_val.length; i++)
   {
      achar = new_val.substring(i,i+1)
      if (achar < "0" || achar > "9")
            return false;
   }
   return true;
}


function emailCheck (emailStr) {
/* The following pattern is used to check if the entered e-mail address
   fits the user@domain format.  It also is used to separate the username
   from the domain. */
var emailPat=/^(.+)@(.+)$/
/* The following string represents the pattern for matching all special
   characters.  We don't want to allow special characters in the address. 
   These characters include ( ) < > @ , ; : \ " . [ ]    */
var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
/* The following string represents the range of characters allowed in a 
   username or domainname.  It really states which chars aren't allowed. */
var validChars="\[^\\s" + specialChars + "\]"
/* The following pattern applies if the "user" is a quoted string (in
   which case, there are no rules about which characters are allowed
   and which aren't; anything goes).  E.g. "jiminy cricket"@disney.com
   is a legal e-mail address. */
var quotedUser="(\"[^\"]*\")"
/* The following pattern applies for domains that are IP addresses,
   rather than symbolic names.  E.g. joe@[123.124.233.4] is a legal
   e-mail address. NOTE: The square brackets are required. */
var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
/* The following string represents an atom (basically a series of
   non-special characters.) */
var atom=validChars + '+'
/* The following string represents one word in the typical username.
   For example, in john.doe@somewhere.com, john and doe are words.
   Basically, a word is either an atom or quoted string. */
var word="(" + atom + "|" + quotedUser + ")"
// The following pattern describes the structure of the user
var userPat=new RegExp("^" + word + "(\\." + word + ")*$")
/* The following pattern describes the structure of a normal symbolic
   domain, as opposed to ipDomainPat, shown above. */
var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")


/* Finally, let's start trying to figure out if the supplied address is
   valid. */

/* Begin with the coarse pattern to simply break up user@domain into
   different pieces that are easy to analyze. */
var matchArray=emailStr.match(emailPat)
if (matchArray==null) {
  /* Too many/few @'s or something; basically, this address doesn't
     even fit the general mould of a valid e-mail address. */
	alert("Email address seems incorrect (check @ and .'s)")
	return false
}
var user=matchArray[1]
var domain=matchArray[2]

// See if "user" is valid 
if (user.match(userPat)==null) {
    // user is not valid
    alert("The email username doesn't seem to be valid.")
    return false
}

/* if the e-mail address is at an IP address (as opposed to a symbolic
   host name) make sure the IP address is valid. */
var IPArray=domain.match(ipDomainPat)
if (IPArray!=null) {
    // this is an IP address
	  for (var i=1;i<=4;i++) {
	    if (IPArray[i]>255) {
	        alert("Destination IP address is invalid!")
		return false
	    }
    }
    return true
}

// Domain is symbolic name
var domainArray=domain.match(domainPat)
if (domainArray==null) {
	alert("The domain name doesn't seem to be valid.")
    return false
}

/* domain name seems valid, but now make sure that it ends in a
   three-letter word (like com, edu, gov) or a two-letter word,
   representing country (uk, nl), and that there's a hostname preceding 
   the domain or country. */

/* Now we need to break up the domain to get a count of how many atoms
   it consists of. */
var atomPat=new RegExp(atom,"g")
var domArr=domain.match(atomPat)
var len=domArr.length
if (domArr[domArr.length-1].length<2 || 
    domArr[domArr.length-1].length>3) {
   // the address must end in a two letter or three letter word.
   alert("The address must end in a three-letter domain, or two letter country.")
   return false
}

// Make sure there's a host name preceding the domain.
if (len<2) {
   var errStr="This address is missing a hostname!"
   alert(errStr)
    return false
}

// If we've gotten this far, everything's valid!
return true;
}

function IsAlphaNumeric(obj)
{
   if (obj.value == "") {return true;}
   
   var new_val = obj.value;
   var achar;
   
   for (var i = 0; i != new_val.length; i++)
   {
      achar = new_val.substring(i,i+1)
      if (achar < "0" || achar > "9")
         if (achar < "a" || achar > "z")
            if (achar < "A" || achar > "Z")
                return false;
   }
   return true;
}


