/*
 *
 * ONE CMS: jslib/dates.js
 * javascript date functions
 *
 * Joris Dormans (2006)
 *
 */

function formatDate (d, f) {
  if (d==null) return(null);
  if (d=="") return("");
  var r = f;
  var dayshort = ''+d.getDate();
  var monthshort = ''+(d.getMonth()+1);
  var yearshort = ''+d.getFullYear();
  yearshort = yearshort.slice(yearshort.length-3);
  var daylong = dayshort;
  while (daylong.length<2) daylong = '0'+daylong;
  var monthlong = monthshort;
  while (monthlong.length<2) monthlong = '0'+monthlong;
  var yearlong = ''+d.getFullYear();
  while (yearlong.length<4) yearlong = '0'+yearlong;
  var hours = ''+d.getHours();
  while (hours.length<2) hours = '0'+hours;
  var minutes = ''+d.getMinutes();
  while (minutes.length<2) minutes = '0'+minutes;
  var seconds = ''+d.getSeconds();
  while (seconds.length<2) seconds = '0'+seconds;
  r = r.replace(/%d/, daylong);
  r = r.replace(/%m/, monthlong);
  r = r.replace(/%y/, yearshort);
  r = r.replace(/%Y/, yearlong);
  r = r.replace(/%H/, hours);
  r = r.replace(/%M/, minutes);
  r = r.replace(/%S/, seconds);
  return(r);
}

function setToday(idc, f) {
  now = new Date();
  document.getElementById(idc).value=formatDate(now, f);
}



// function to replace a substring within a string
// this should be included in a general javascript library
function replaceString(str, findstr, replacestr) {
  replacestr = replacestr+'';
  str = str+'';
  //check for endless recursion
  if (replacestr.indexOf(findstr)>=0) {
    return str;
  }
  p = str.indexOf(findstr);
  if (p>=0) {
    str = str.substr(0,p)+replacestr+str.substr(p+findstr.length);
    return replaceString(str,findstr,replacestr);
  } else {
    //substring not found return original string
    return str;
  }
}

function lpad(str, len, chr) {
  str=str+'';
  if (chr.length<1) {return str;}
  while (str.length<len) {str=chr+str;}
  return str;
}

function toShortYear(year) {
  year=year+'';
  if (year.length<=2) {return year;}
  return year.substr(year.length-2);
}

function dateToString(aDate, format) {
  format = format.toLowerCase();
  var str='';
  var year = aDate.getYear()+1900;
  var month = aDate.getMonth()+1;
  var day = aDate.getDate();
  var weekday = aDate.getDay();
  var hour = aDate.getHours();
  var minutes = aDate.getMinutes();
  var seconds = aDate.getSeconds();

  var n=0;

  while (n<=format.length) {
    if (format.substr(n,2)=='%Y') {
      str = str+year;
      n = n+2;
    } else if (format.substr(n,2)=='%y') {
      str = str+toShortYear(year);
      n=n+2;
    } else if (format.substr(n,2)=='%m') {
      str = str+lpad(month,2,'0');
      n=n+2;
    } else if (format.substr(n,2)=='%d') {
      str = str+lpad(day,2,'0');
      n=n+2;
    } else if (format.substr(n,2)=='%H') {
      str = str+lpad(hour,2,'0');
      n=n+2;
    } else if (format.substr(n,2)=='%M') {
      str = str+lpad(minutes,2,'0');
      n=n+2;
    } else if (format.substr(n,2)=='%S') {
      str = str+lpad(seconds,2,'0');
      n=n+2;
    } else {
      str = str+format.substr(n,1);
      n++;
    }
  }
  return str;
}

function stringToDate(str, format, def) {
  var pat ='';
  var arr = new Array;
  var n=0;
  var m=1;
  while (n<format.length) {
    if (format.substr(n,2)=='%Y') {
      pat = pat+'([0-9]{4})';
      n = n+2;
      arr[m] = 'y';
      m++;
    } else if (format.substr(n,2)=='%y') {
      pat = pat+'([0-9]{1,2})';
      n=n+2;
      arr[m] = 'sy';
      m++;
    } else if (format.substr(n,2)=='%m') {
      n=n+2;
      pat = pat+'([0-9]{1,2})';
      arr[m] = 'm';
      m++;
    } else if (format.substr(n,2)=='%d') {
      n=n+2;
      pat = pat+'([0-9]{1,2})';
      arr[m] = 'd';
      m++;
    } else if (format.substr(n,2)=='%H') {
      n=n+2;
      pat = pat+'([0-9]{1,2})';
      arr[m] = 'h';
      m++;
    } else if (format.substr(n,2)=='%M') {
      n=n+2;
      pat = pat+'([0-9]{1,2})';
      arr[m] = 'mi';
      m++;
    } else if (format.substr(n,2)=='%S') {
      n=n+2;
      pat = pat+'([0-9]{1,2})';
      arr[m] = 's';
      m++;
    } else {
      n=n+1;
      pat = pat+'['+format.substr(n-1,1)+']';
//      arr[m] = '';
//      m++;
    }
  }
  var year = 0;
  var month = 0;
  var day = 0;
  var hour = 0;
  var minutes = 0;
  var seconds = 0;

  pat = pat+'';
  var datePat = new RegExp(pat);
  var matchArray = str.match(datePat); // is the format ok?
  if (matchArray == null) {return def;}
  for (n=1; n<=m; n++) {
    if (arr[n]=='y') {year=matchArray[n];}
    if (arr[n]=='sy') {
      year=matchArray[n];
      if (year<=30) {year=year+2000} else {year=year+1900}
    }
    if (arr[n]=='m') {month=matchArray[n];}
    if (arr[n]=='mo') {month=monthToNumber(matchArray[n]);}
    if (arr[n]=='d') {day=matchArray[n];}
    if (arr[n]=='h') {hour=matchArray[n];}
    if (arr[n]=='mi') {minutes=matchArray[n];}
    if (arr[n]=='s') {seconds=matchArray[n];}
  }
  //check if date is valid
  if ((hour<0) || (hour>23)) {return def;}
  if ((minutes<0) || (minutes>59)) {return def;}
  if ((seconds<0) || (seconds>59)) {return def;}
  if ((day<1) || (day>31)) {return def;}
  if ((month<1) || (month>12)) {return def;}
  if ((month==4 || month==6 || month==9 || month==11) && day==31) {return def;}
  if (month == 2) { // check for february 29th
    var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
    if (day > 29 || (day==29 && !isleap)) {return def}
  }

  var aDate = new Date(year, month-1, day, hour, minutes, seconds);
  return aDate;

}

function addYear(idc, f) {
  var s=document.getElementById(idc).value;
  var now = new Date();
  var d=stringToDate(s, f, now);
  d.setFullYear(d.getFullYear()+1);
  document.getElementById(idc).value=formatDate(d, f);
}


