// Javascript for setting form object value and validation

function selectOptions() {
 var i, j;
 var frm_obj = selectOptions.arguments;
 var frm_name = (document.all != null ? "document.all." : "document.") + frm_obj[0];
 for (i=1; i<frm_obj.length-1; i+=2) {
  select_obj = eval(frm_name + "." + frm_obj[i]);

  if (select_obj.type != null && (select_obj.type == 'select-one' || select_obj.type == 'select-multiple')) {
   for (j=0; j<select_obj.options.length; j++) {
    if (select_obj.options[j].value == frm_obj[i+1]) {
     select_obj.options[j].selected = true;
    }
   }
  }
  else if (select_obj.type != null && select_obj.type == 'checkbox' && select_obj.value != null) {
   select_obj.checked = (select_obj.value == frm_obj[i+1]);
  }
  else if (select_obj[0] != null && select_obj[0].type != null && (select_obj[0].type == 'radio' || select_obj[0].type == 'checkbox')) {
   for (j=0; j<select_obj.length; j++) {
    if (select_obj[j].value == frm_obj[i+1]) {
     select_obj[j].checked = true;
    }
   }
  }
  else select_obj.value = frm_obj[i+1];
 }
}


function isDigit(c)
{
  return c >= '0' && c <= '9';
}

function isLetter(c)
{
  return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}

function isSimpleWord(s)
{
   for (i=0, c=s.charAt(0); i<s.length; c=s.charAt(++i))
    if (!isDigit(c) && !isLetter(c) && c != '_') return false;
   return true;
}

function isEmail(str) {
  var supported = 0;
  if (window.RegExp) {
    var tempStr = "a";
    var tempReg = new RegExp(tempStr);
    if (tempReg.test(tempStr)) supported = 1;
  }
  if (!supported)
    return (str.indexOf(".") > 2) && (str.indexOf("@") > 0);
  var r1 = new RegExp("(@.*@)|(\\.\\.)|(@\\.)|(^\\.)");
  var r2 = new RegExp("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$");
  return (!r1.test(str) && r2.test(str));
}

function isDecimal(s)
{
   return !isNaN(s);
}

function isIntegerValue(s)
{
   for (i=0, c=s.charAt(0); i<s.length; c=s.charAt(++i)) {
    if (c == '+' || c == '-') { if (i!=0) return false; }
    else if (!isDigit(c)) return false;
   }
   return true;
}

function isPhoneNumber(s)
{
   var p1=p2=-1;
   for (i=0, c=s.charAt(0); i<s.length; c=s.charAt(++i)) {
    if (c == '(') { if (p1>0) return false; else p1=i; }
    else if (c == ')') { if (p1<0||p2>0) return false; else p2=i; }
    else if (!isDigit(c) && c != '-' && c != ' ') return false;
   }
   if ((p1==-1&&p2!=-1)||(p1!=-1&&p2==-1)) return false;
   return true;
}

function inRange(s, start, end)
{
  if (s >= start && s <= end)
     return true;
  else
     return false;
}


// format : dd/mm/yyyy , mm/dd/yyyy, yyyy/mm/dd , dd-mm-yyyy , mm-dd-yyyy, yyyy-mm-dd
function isDate(s, format)
{
  if (format == null)
     format = "yyyy/mm/dd";
  else
     format = format.toLowerCase();
  if (s.length < 8 || s.length > 10) return false;
  var delimiter = '/';
  if (s.indexOf("-") >= 0)
     delimiter = '-';
  var d, m, y, i1, i2;
  i1 = s.indexOf(delimiter);
  if (i1 < 0 || i1 >= s.length-1) return false;
  i2 = s.indexOf(delimiter, i1+1);
  if (i2 <= i1 || i2 >= s.length-1) return false;
//  if (s.charAt(i1) != delimiter || s.charAt(i2) != delimiter) return false;

  d = s.substring(0,i1);
  m = s.substring(i1 + 1, i2);
  y = s.substring(i2 + 1);
  if (format.charAt(0) == 'y')
  {
    var t = d;
    d = y;
    y = t;
  }
  else if (format.charAt(0) == 'm')
  {
    var t = d;
    d = m;
    m = t;
  }

  dd = new Date(y, m-1, d);

  if (isNaN(dd)) return false;
  if (dd.getYear() != y && dd.getYear()+1900 != y) return false;
  if (dd.getMonth()+1 != m) return false;
  if (dd.getDate() != d) return false;

  return true;
}


function validateFail(obj,msg)
{
  alert(msg);
  obj.focus();
  return false;
}


/*

usage:
 first character:
 e: email
 s: simple word (no space)
 f: floating point - decimal
 i: integer
 t: text
 p: phone
 d: date

 second character:
 Y: required field
 N: not required field

 value after the second character: maximum length


<form method="post" action="http://localhost" onSubmit="return validate(this ,'textfield1','First Name','sY10' ,'textfield2','Last Name','iY' )">
 <input type="text" name="textfield1">
 <input type="text" name="textfield2">
 <input type=submit name=Submit>
</form>

*/
function validate()
{
 var obj, type, require, i, j, c, m, s, a=validate.arguments;
 var frm = a[0];
 for (j=1; j<a.length-2; j+=3)
 {
  obj = eval(frm + "." + a[j]);
  obj_name = a[j+1];
  type = a[j+2].charAt(0);
  require = a[j+2].charAt(1) == "Y";
  m = a[j+2].substring(2);
  s = obj.value;
  msg = obj_name + " is a mandatory field!";
  if (s == "") if (require) return validateFail(obj, msg); else continue;

  msg = "The value of " + obj_name + " is too long!";
  if (m != "" && s.length > m) return validateFail(obj, msg);

  if (type=="e") {
   msg = "The email address " + obj_name + " is invalid!";
   if (!isEmail(s)) return validateFail(obj, msg);
  }
  else if (type=='s') {
   msg = "The value of " + obj_name + " contains invalid characters!";
   if (!isSimpleWord(s)) return validateFail(obj, msg);
  }
  else if (type=="f") {
   msg = "The value of " + obj_name + " is not a valid decimal number!";
   if (!isDecimal(s)) return validateFail(obj, msg);
  }
  else if (type=="i") {
   msg = "The value of " + obj_name + " is not a valid integer!";
   if (!isIntegerValue(s)) return validateFail(obj, msg);
  }
  else if (type=="p") {
   msg = obj_name + " is not a valid telephone/fax number!";
   if (!isPhoneNumber(s)) return validateFail(obj, msg);
  }
  else if (type=="d") {
   msg = obj_name + " is not a valid date!";
   if (!isDate(s)) return validateFail(obj, msg);
  }
 }
 return true;
}

var _dim  = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

function isLeap(yr) {
 return yr % 400 == 0 || (yr % 4 == 0 && yr % 100 != 0);
}
function DayOfWeek(d,m,y)
{
 if (m < 3)
 {
   m += 13;
   y--;
 }
 else m++;
 return Math.floor((d + 26 * m / 10 + y + y / 4 - y / 100 + y / 400 + 5) % 7) + 1;
}
function daysInMonth(mm, yr) {
 return _dim[mm-1] + (mm==2 ? isLeap(yr) : 0);
}
function setDaysInMonth(obj) {
 var frm = obj.form;
 var name = obj.name.substring(3);
 var d = frm["DD_" + name];
 var m = frm["MM_" + name];
 var y = frm["YY_" + name];
 __setDaysInMonth(d,m,y);
}
function __setDaysInMonth(d,m,y) {
 var mm = m.options[m.selectedIndex].value;
 var dd = d.options[d.selectedIndex].value;
 var yy = y.options[y.selectedIndex].value;

 var _dim = daysInMonth(mm, yy);
 if (dd > _dim) d.selectedIndex = _dim-1;

 while (d.options.length != _dim)
 {
  if (d.options.length > _dim)
   d.options[d.options.length-1] = null;
  else
   d.options[d.options.length] = new Option(d.options.length+1,d.options.length+1);
 }
}
function setToday(frm, name, mask) {
 var t = new Date();
 var today = t.getFullYear()+"-"+a0(t.getMonth()+1)+"-"+a0(t.getDate())+" "+a0(t.getHours())+":"+a0(t.getMinutes())+":"+a0(t.getSeconds())+".0"
 setDate(frm, name, today, mask);
}
function a0(v) {
 return v>9 ? v : "0"+v;
}
function setDate(frm, name, date, mask) {
 if (!date) return;
 if (!mask) mask = "DD MM YY";
 var ss = mask.indexOf("SS") == -1 ? null : frm["SS_" + name];
 var hh = mask.indexOf("HH") == -1 ? null : frm["HH_" + name];
 var mi = mask.indexOf("MI") == -1 ? null : frm["MI_" + name];
 var d  = mask.indexOf("DD") == -1 ? null : frm["DD_" + name];
 var m  = mask.indexOf("MM") == -1 ? null : frm["MM_" + name];
 var y  = mask.indexOf("YY") == -1 ? null : frm["YY_" + name];
 var yy = y.options[0].value;
 // 2000-04-06 00:05:15.0
 if (y)  y.selectedIndex = date.substring(0,4) - yy;
 if (m)  m.selectedIndex = date.substring(5,7)-1;
 if (d)  d.selectedIndex = date.substring(8,10)-1;
 if (hh) hh.value = date.substring(11,13);
 if (mi) mi.value = date.substring(14,16);
 if (ss) ss.value = date.substring(17,19);
 if (d && m && y) __setDaysInMonth(d,m,y);
}
function convertMonth2Num(mon) {
 var m = mon.toUpperCase();
 if (m == "JAN")
  return 0;
 else if (m == "FEB")
  return 1;
 else if (m == "MAR")
  return 2;
 else if (m == "APR")
  return 3;
 else if (m == "MAY")
  return 4;
 else if (m == "JUN")
  return 5;
 else if (m == "JUL")
  return 6;
 else if (m == "APR")
  return 7;
 else if (m == "SEP")
  return 8;
 else if (m == "OCT")
  return 9;
 else if (m == "NOV")
  return 10;
 else if (m == "DEC")
  return 11;
}
function generateYear(currentSel,cnt) {
 var theYear = new Date().getFullYear();
 if (!cnt) cnt = 10;
 for (var i = 0; i < cnt; i++)
  currentSel[i] = new Option(theYear + i - 1, theYear + i - 1);

 for (var i = 0; i < currentSel.options.length - 1; i++) {
  if (currentSel.options[i].value != "") {
   currentSel.options[i].selected = true;
   break;
  }
 }
}

function generateYear2(currentSel,cnt,start) {
 var theYear = new Date().getFullYear();
 if (start) theYear = start;
 if (!cnt) cnt = 10;
 for (var i = 0; i < cnt; i++)
  currentSel[i] = new Option(theYear + i, theYear + i);

 for (var i = 0; i < currentSel.options.length - 1; i++) {
  if (currentSel.options[i].value != "") {
   currentSel.options[i].selected = true;
   break;
  }
 }
}
