///////////////////////////////////////////////////////////////////////////////
// JavaScript Date Parser                                                    //
//                                                                           //
// Created by James Semple 20-Oct-1999  for FSS Group                        //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////
// Parse a date input as a free format string                                //
// ------------------------------------------                                //
//                                                                           //
// Dates can have the following formats:-                                    //
//                                                                           //
// mm/dd/yy      mm.dd.yy      mm dd yy                                      //
// dd/mon/yy     dd.mon.yy     dd mon yy                                     //
// dd/mon/yyyy   dd.mon.yyyy   dd mon yyyy                                   //
// mon/dd/yy     mon.dd.yy     mon dd yy                                     //
// mon/dd/yyyy   mon.dd.yyyy   mon dd yyyy                                   //
// ddmmyy        ddmmyyyy                                                    //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////
function js_dateParser(myDate) 
{
  // Return blank fields as blank
  if (myDate == "")
  {
    return "";
  }

  // Declare variables
  var date_output;
  var year  = null;
  var month = null;
  var day   = null;

  var months = new Array('jan',
                         'feb',
                         'mar',
                         'apr',
                         'may',
                         'jun',
                         'jul',
                         'aug',
                         'sep',
                         'oct',
                         'nov',
                         'dec');

  // Failsafe variable
  var failmsg = '-1';
  var datemsg = '-1';

  // Utility variables
  var tempHolder         = null;        // array of date, month and year
  var patterns           = new Array(); // array of regular expressions
  var didWeCalculateYear = false;       // flag
  var i                  = 0;           // iterator

  // Remove any leading or trailing whitespace
  myDate = trim(myDate);

  // Initialize all the regular expressions
  patterns[0] = new RegExp("([a-zA-Z]{3,})(\\d+)(\\d{4})");               // mond(d)yyyy
  patterns[1] = new RegExp("([a-zA-Z]{3,})(\\d+)(\\d{2})");               // mond(d)yy
  patterns[2] = new RegExp("(\\d{2})(\\d{2})(\\d{2,4})");                 // ddmmyy(yy)
  patterns[3] = new RegExp("(\\d{1,2})\\W*([a-zA-Z]{3,})\\W*(\\d{2,4})"); // d(d)( ./)mon( ./)yy(yy)
  patterns[4] = new RegExp("([a-zA-Z]{3,})\\W*(\\d{1,2})\\D+(\\d{2,4})"); // mon[ ./]d(d)[ ./]yy(yy)
  patterns[5] = new RegExp("(\\d{1,2})\\W+(\\d{1,2})\\W+(\\d{2,4})");     // m(m)[ ./]d(d)[ ./]yy(yy)
  patterns[6] = new RegExp("([a-zA-Z]{3,})\\W*(\\d{1,2})");               // mond(d)
  patterns[7] = new RegExp("(\\d+)\\W*([a-zA-Z]{3,})");                   // d(d)mon
  patterns[8] = new RegExp("(\\d{1,2})\\W+(\\d{1,2})");                   // m(m)[ ./]d(d)
  patterns[9] = new RegExp("(\\d{2})(\\d{2})");                           // ddmm

  for (i=0;i<patterns.length;i++)
  {
    if ( patterns[i].test(myDate) )
    {
      tempHolder = myDate.match(patterns[i]);   
      break;
    }  
  }
  
  if (tempHolder == null)
  {
    //alert('No pattern matches');
    return failmsg;
  }

  if(tempHolder.length == 3)
  {
    // Then we haven't been given a year and must work it out for ourself
    tempHolder[3] = new Date().getYear();
    year = tempHolder[3];
    didWeCalculateYear = true;
  }

  if(tempHolder.length != 4)
  {
    //alert('Wrong number of array elements. Array el no : ' + tempHolder.length);
    return failmsg;
  }

  // Now we make sure that our date is in the correct format
  
  // Remove any incompatible characters from the holders
  // The last holder is a year value and can only have numbers
  if (didWeCalculateYear == false) {
    year = tempHolder[3].replace(/\D/g, "");

    if ((year.length != 2) && (year.length != 4)) {
      //alert('Year is in incorrect format');
      return failmsg;
    }
  }

  // Now check if either of the first two holders contain text
  if (tempHolder[2].search(/\D/) != -1)
  {
    month = tempHolder[2];
    day   = tempHolder[1];
  }
  else
  {
    month = tempHolder[1];
    day   = tempHolder[2];
  }

  // Remove any incompatible characters from month
  month = month.replace(/\W/g, "");

  // Remove any non-numbers from day
  day = day.replace(/\D/g, "");

  // If month is in text format, convert it to a number
  if (month.search(/\D/) != -1)
  {
    // Make month all lower case
    month = month.toLowerCase();

    // Iterate through the month array and return a number
    for (i=0;i<12;i++)
    {
      if (month.indexOf(months[i]) != -1)
      {
        month = i+1;
        break;
      }
    }

    if (i == 12)
    {
      return failmsg;
    }
  }

  // If we worked out the year then we should check the date
  if (didWeCalculateYear == true)
  {
    if (isItNextYear(day, month))
    {
      year++;
    }
  }

  // Make sure date is in the right range
  if (   (day < 1)
      || (day > howManyDays(month, year))
     )
  {
    return datemsg;
  }

  // Make sure month is in the right range
  if (   (month < 1)
      || (month > 12)
     )
  {
    return datemsg;
  }

    var yeartoset = year > 1000 ? year : year <= 25 || didWeCalculateYear ? 
			2000+(year%100) : 1900+(year%100); 
    return new Date(yeartoset, month-1, day);
}

function trim(myWord)
{
  // Trim any odd characters from start and end
  myWord = myWord.replace(/^(\W*)/, "");
  myWord = myWord.replace(/(\W*)$/, "");
  return myWord;
}

function howManyDays(thisMonth, thisYear)
{
  var monthDays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
  if (thisMonth != 2)
  {
    return monthDays[thisMonth - 1];
  }
  else
  {
    // month is february
    if (   (   (thisYear%400)  == 0 ) 
        || (   ((thisYear%100) != 0 ) 
            && ((thisYear%4)   == 0 )
           ) 
       )
    {
      return 29;
    }
    else
    {
      return 28;
    }
  }
}

function isItNextYear(thedate, themonth)
{
  var returnvalue  = false;
  var currentDate  = new Date();
  var currentMonth = currentDate.getMonth();
  var currentDay   = currentDate.getDate();
  if (themonth < currentMonth + 1)
  {
    returnvalue = true;
  }
  else if (   (themonth == currentMonth + 1)
           && (thedate < currentDay)
          )
  {
    returnvalue = true;
  }

  return returnvalue;
}

function convertToString(number)
{
  return number + "";
}
