// ======================================================
// Contains a number of date functions for general use
// Author: C.Donaldson, 2002-08-27.
// Contains:
//
// is_date: A function to check for a valid date
// clean_date:  Removes extra spaces and number denoters, e.g. (1st  Aug 2002 = 1 Aug 2002)
// get_valid_date:  Takes a date and returns it in the dd/mm/yyyy format
//
// 2004-12-08 - Added code for form date picker
// ======================================================
var ary_delimiters = new Array("-"," ","/",".");
var ary_months = new Array("January", "February", "March", "April","May","June","July","August","September","October",
    "November","December");  

function is_date(s_date) {
  if (s_date + ""=="") return false;
  return (get_valid_date(s_date)!=false);
}

function show_calendar(o_fld,s_format) {    
    var o_dest = cal_get_date_field(o_fld);
		var cal1 = new calendar1(o_dest);
		cal1.year_scroll = true;
		cal1.time_comp = false;
    if (typeof(s_format)!='undefined') { DEF_DATE_FORMAT = s_format };
    cal1.popup();
}

function cal_get_date_field(o_fld) {
  var o_dest = o_fld;
  var i_nodes = (o_fld.parentNode.childNodes.length);
  for (var i=0;i<i_nodes;i++) {
    o_dest = o_dest.previousSibling;
    if (o_dest.type=='text') return o_dest;
  }
}


function clean_date(s_date) {
  var s_new_date = s_date.replace(/\s+/gi, " "); // Replace one or more spaces with a single space
  s_new_date = s_new_date.replace(/([0-9]+)(st|nd|rd|th)/i, "$1"); // replace any occurence of st etc. (e.g. 1st = 1)
  return s_new_date;
}

function format_date(s_date,s_format) {
  var s_new_date = get_valid_date(s_date);
  var s_delimiter = "";
  s_format = (arguments.length<2) ? "dd-mmm-yyyy" : s_format; // Set the default format
  if (s_new_date==false) return "";
  for (i=0;i<ary_delimiters.length;i++) {
    if (s_new_date.indexOf(ary_delimiters[i]) != -1) var ary_date = s_new_date.split(ary_delimiters[i]);
  }
  for (i=0;i<ary_delimiters.length;i++) {
    if (s_format.indexOf(ary_delimiters[i]) != -1) {
      var ary_format = s_format.split(ary_delimiters[i]);
      s_delimiter = ary_delimiters[i];
    }
  }
  if ((s_delimiter=="")||(ary_format.length!=3)) {
    alert("Invalid date format: " + s_format);
    return "";
  }
  var i_day = ary_date[0];
  var i_month = ary_date[1];
  var i_year = ary_date[2];
  s_new_date = ""
  for (var i=0;i<ary_format.length;i++) { // Run through the string format
    switch (ary_format[i].toLowerCase()) {
      case "d" :
        s_new_date += (s_new_date.length>0) ? s_delimiter + i_day : i_day;
        break;
      case "dd" :
        i_day = formatNumber(i_day,"00");
        s_new_date += (s_new_date.length>0) ? s_delimiter + i_day : i_day;
        break;
      case "m" :
        s_new_date += (s_new_date.length>0) ? s_delimiter + i_month : i_month;
        break;
      case "mm" :
        i_month = formatNumber(i_month,"00");
        s_new_date += (s_new_date.length>0) ? s_delimiter + i_month : i_month;
        break;
      case "mmm" :
        i_month = get_month_name(i_month);
        i_month = i_month.substring(0,3);
        s_new_date += (s_new_date.length>0) ? s_delimiter + i_month : i_month;
        break;
      case "mmmm" :
        i_month = get_month_name(i_month);
        s_new_date += (s_new_date.length>0) ? s_delimiter + i_month : i_month;
        break;
      case "yy" :
        i_year = i_year.substring(i_year.length - 2, i_year.length);
        s_new_date += (s_new_date.length>0) ? s_delimiter + i_year : i_year;
        break;
      case "yyy" :
      case "yyyy" :
        s_new_date += (s_new_date.length>0) ? s_delimiter + i_year : i_year;
        break;
      default :
        alert("Invalid date format specified, defaulting to dd-mmm-yyyy.");
        return i_day + "-" + i_month + "-" + i_year;
        break;
    }
  }
  return s_new_date;
}

function get_valid_date(s_date) {
  // returns a date in dd/mm/yyyy format
  var ary_date = "", i;
  s_date = clean_date(s_date); // Clean our date
  var now = new Date();
  for (i=0;i<ary_delimiters.length;i++) {
    if (s_date.indexOf(ary_delimiters[i]) != -1) var ary_date = s_date.split(ary_delimiters[i]);
  }
  if (ary_date.length<2) return false;
  //alert(ary_date.length);
  // Sort the Year out
  var i_year = (ary_date.length!=3) ? now.getFullYear() : parseInt(ary_date[2],10);
  if (isNaN(i_year)) i_year = now.getFullYear();
  if (i_year < 50) i_year = i_year + 2000;
  if ((i_year >= 50)&&(i_year<=99)) i_year = i_year + 1900;

  var s_month = ary_date[1]
  var s_day = ary_date[0]
  // Check for a valid month
  var i_month = get_month_number(s_month);
  var i_day = get_month_number(s_day); // in case of mmm-dd-yyyy format
  if ((i_month>12)&&(i_day<=12)) {
    var i_temp = i_month;
    i_month = i_day;
    i_day = i_temp;
    i_temp = s_month;
    s_month = s_day;
    s_day = i_temp;
  }
  // OK, now we have our date parts, let check it is a valid date!
  
  var s_date_new = new Date(i_year,i_month-1,i_day);
  // check we have a valid date
  var is_date = ((s_date_new.getDate()==i_day)&&(s_date_new.getMonth()==i_month-1)&&(s_date_new.getFullYear()==i_year))
  //alert(is_date + ": " + s_date_new.getFullYear() + " = " + i_year);
  if (is_date==true) { return(i_day+"/"+i_month+"/"+i_year) } else { return false };
}  

function get_month_number(s_val) {
  // returns the relevant month number, e.g. Aug = 8, September = 9
  var i_val = parseInt(s_val,10);
  if (isNaN(i_val)&&(s_val.length>=3)) {
    for (i=0;i<ary_months.length;i++) {
      if (ary_months[i].toLowerCase().indexOf(s_val.toLowerCase())==0) return i + 1;
    }
  }
  return i_val;
}

function get_month_name(i_month) {
  i_month = parseInt(i_month,10);
  if (isNaN(i_month)) return i_month;
  if (i_month > 12) i_month = 12;
  i_month --;
  return ary_months[i_month];
}

function check_valid_date(o_fld) {
  if (is_date(o_fld.value)!=false) {
    o_fld.value = format_date(o_fld.value,"dd-mmm-yyyy");
    return true;
  } else {
    if (o_fld.value+""!="") alert("Invalid date entered!");
    return false;
  }
}