function val_date(obj,txt) {

	var dte = date_val(trim(obj.value));

	if (!dte) {
		alert(txt + ' is invalid.\nDate format may be dd-mon-yyyy or d/m/y');
		obj.focus();
		obj.select();
		return false;
	} else {
		obj.value = addDays(dte,0);
		return true;
	}
}


function val_datetime(obj,txt) {

	var dte = date_val(trim(obj.value));

	if (!dte) {
		alert(txt + ' is invalid.\nDate format may be\ndd-mon-yyyy hh:mi:ss  or  d/m/y hh:mi:ss');
		obj.focus();
		obj.select();
		return false;
	} else {
		obj.value = addDaysTime(dte,0);
		return true;
	}
}


function addDays(strDate,days) {

  //input strDate must be in 'December 17, 1995 23:15:00' format

  var dteDate = new Date(strDate);
//  var addDate = new Date(dteDate.getTime() + (days*24*60*60*1000)); 
  var addDate = new Date(dteDate.getTime() + (days*24*60*60*1000) + (1*60*60*1000)); //10-Apr-2002 added 1 hour to date/time to get correct dates

  //'1-Jan-2001' formatted string of new date
  var strMonths = 'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec';
  var arrMonths = strMonths.split('|');

  if (addDate.getYear() >= 0 && addDate.getYear() <= 99) {
    varYYYY = 1900 + addDate.getYear();
  } else {
    varYYYY = addDate.getYear();
  }

  retDate = addDate.getDate() + '-' + arrMonths[addDate.getMonth()] + '-' + varYYYY;

  if (strDate == 1) {   // 1 validates to 'true' but no date i.e.date is null
    return '';
  } else {
    return retDate;
  }
  
}


function addDaysTime(strDate,days) {

  //input strDate must be in 'December 17, 1995 23:15:00' format

	if (strDate!='') {
	  var dteDate = new Date(strDate);
	} else {
	  var dteDate = new Date();
	}

  var addDate = new Date(dteDate.getTime() + (days*24*60*60*1000));

  //'1-Jan-2001' formatted string of new date
  var strMonths = 'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec';
  var arrMonths = strMonths.split('|');

  if (addDate.getYear() >= 0 && addDate.getYear() <= 99) {
    varYYYY = 1900 + addDate.getYear();
  } else {
    varYYYY = addDate.getYear();
  }

  retDate = addDate.getDate() + '-' + arrMonths[addDate.getMonth()] + '-' + varYYYY + ' ' + addDate.getHours() + ':' + addDate.getMinutes() + ':' + addDate.getSeconds();

  if (strDate == 1) {   // 1 validates to 'true' but no date i.e.date is null
    return '';
  } else {
    return retDate;
  }
  
}


function displayday(ddate) {
  if (ddate != '') {
		var testdate = new Date(date_val(trim(ddate)));

		var strDays = 'Sun|Mon|Tue|Wed|Thu|Fri|Sat';
		var arrDays = strDays.split('|');

		return arrDays[testdate.getDay()];
  } else {
    return '';
  }
}


function showday(dte,fld) {
	var vdate = date_val(trim(dte.value));
	if (!vdate) {
		alert('Date is invalid.');
		document.getElementById(fld).innerText='';
		dte.select();
	} else {
		dte.value = addDays(vdate,0);
		if (trim(dte.value) != '') {
			document.getElementById(fld).innerText='('+displayday(dte.value)+')';
		} else {
			document.getElementById(fld).innerText='';
		}
	}
}


function date_val(inpdate) {

  var strInput=inpdate;
  var strReturnDate;


  if (strInput=='') {
    return true;
  }


  strInput=strInput.replace(/[ ~`!@#\$%\^&*()_\-+={}\[\]|\\:;"\'<>?\,\.]/g,'/');
  strInput=strInput.toLowerCase();


  while (strInput.substring(0,1) == '/') {
    strInput=strInput.substring(1,strInput.length);
  }
  while (strInput.substr(strInput.length-1,1)=='/') {
    strInput=strInput.substring(0,strInput.length-1);
  }
  while (strInput.search('//') > -1) {
    strInput=strInput.replace('//','/')
  }


  //string should now be in format day/month/year/hour24/minute/second
  //h/m/s are optional

//alert(strInput);

  var arrInput = strInput.split('/');

  if (arrInput.length>6) {
    return false;
  }

  var vday;
  var vmth;
  var vyr;
  var vhr=0;
  var vmin=0;
  var vsec=0;

  for (var i=0;i<arrInput.length;i++) {
    switch (i) {
      case 0 :
        vday=arrInput[0];
        break;
      case 1 :
        vmth=arrInput[1];
        break;
      case 2 :
        vyr=arrInput[2];
        break;
      case 3 :
        vhr=arrInput[3];
        break;
      case 4 :
        vmin=arrInput[4];
        break;
      case 5 :
        vsec=arrInput[5];
        break;
      default :
        break;
    }
  }

//alert('day:'+vday+'\nmth:'+vmth+'\nyr:'+vyr+'\nhr:'+vhr+'\nmin:'+vmin+'\nsec:'+vsec);


  //vday,vyr,vhr,vmin,vsec must all be numbers
  
  if (isNaN(vday)||isNaN(vyr)||isNaN(vhr)||isNaN(vmin)||isNaN(vsec)) {
    return false;
  }

  var nbrYear = vyr*1;
  if (nbrYear>=0&&nbrYear<=50) {
    nbrYear=nbrYear+2000;
  } else {
    if (nbrYear>50&&nbrYear<=99) {
      nbrYear=nbrYear+1900;
    }
  }
  
  vyr = nbrYear.toString();
  

  // convert mon to mm
  if (isNaN(vmth)) {
    switch (vmth.toLowerCase()) {
      case "jan" :
        vmth = 1;
        break;
      case "feb" :
        vmth = 2;
        break;
      case "mar" :
        vmth = 3;
        break;
      case "apr" :
        vmth = 4;
        break;
      case "may" :
        vmth = 5;
        break;
      case "jun" :
        vmth = 6;
        break;
      case "jul" :
        vmth = 7;
        break;
      case "aug" :
        vmth = 8;
        break;
      case "sep" :
        vmth = 9;
        break;
      case "oct" :
        vmth = 10;
        break;
      case "nov" :
        vmth = 11;
        break;
      case "dec" :
        vmth = 12;
        break;
      default :
        return false;
    }
  }



  //format the return date string

  var strMonths = 'January|February|March|April|May|June|July|August|September|October|November|December';
  var arrMonths = strMonths.split('|');

  var strReturnDate = arrMonths[vmth-1]+' '+vday+', '+vyr+' '+(vhr<1?"0":vhr)+':'+(vmin<1?"0":vmin)+':'+(vsec<1?"0":vsec);

  //end of date string format


  
  //basic error checking 
  if (vmth<1 || vmth>12) return false 
  if (vday<1 || vday>31) return false
  if (vyr<0 || vyr>9999) return false 
         
  //advanced error checking 

  // months with 30 days 
  if (vmth==4 || vmth==6 || vmth==9 || vmth==11){ 
    if (vday==31) return false;
  } 

  // february, leap year 
  if (vmth==2){ 
    // feb 
    var g=parseInt(vyr/4) 
    if (isNaN(g)) { 
      return false;
    } 
    if (vday>29) return false
    if (vday==29 && ((vyr/4)!=parseInt(vyr/4))) return false
  } 

  // hour
  if (vhr != '') {
    if (vhr<0 || vhr>23) return false
  }

  // minute
  if (vmin != '') {
    if (vmin<0 || vmin>59) return false 
  }

  // second
  if (vsec != '') {
    if (vsec<0 || vsec>59) return false 
  }


  return strReturnDate;

}

function displayage(dob,eleid) {
  var dteDate = new Date(date_val(dob.value));
	var dteNow = new Date();
	
	var yrage = dteNow.getFullYear() - dteDate.getFullYear();
	
	if (dteNow.getMonth() < dteDate.getMonth()) {
		yrage = yrage - 1;
	} else if (dteDate.getMonth() == dteNow.getMonth()) {
		if (dteNow.getDate() < dteDate.getDate()) {
			yrage = yrage - 1;
		}
	}

	document.getElementById(eleid).innerText=yrage+' yrs';
}

