/* JavaScript date function wrappers */
/*
 * Copyright (C) 2006 CC Open Computer Systems Ltd.
 * Author: GK
 */
/* @include util.js */

var dtFormat_ = "YYYY-MM-DD";
var dtCenturyLimit_ = 53;
var dtYearChar_ = "Y";
var dtMonthChar_ = "M";
var dtDayChar_ = "D";

function dt_set_default_fmt(dtFormat) {

  if (!dtFormat) {
    dtFormat_ = "";
  }
  else {
    dtFormat_ = dtFormat;
  }

}

function dt_sort_number(a, b) {
  return a-b;
}

function dt_now() {
  return dt_now_fmt(dtFormat_);
}

function dt_now_fmt(dtFormat) {

  var d = new Date();

  return dt_print_ymd( d.getYear()+1900, d.getMonth()+1, d.getDate(), dtFormat );

}

function dt_print_ymd( dtYear, dtMonth, dtDay, dtFormat ) {

  if (!dtFormat) return "";
  if ((!dtYear) || (!dtMonth) || (!dtDay)) return "";

  dtYear++; dtYear--;
  dtMonth++; dtMonth--;
  dtDay++; dtDay--;

  if ((!dtYear) || (!dtMonth) || (!dtDay)) return "";

  var locs_year = new Array();
  var locs_month = new Array();
  var locs_day = new Array();

  var locs_y_cnt = 0;
  var locs_m_cnt = 0;
  var locs_d_cnt = 0;
  var max_len = dtFormat.length;
  var c;

  for (i = 0; i < max_len; i++) {
    c = dtFormat.substr(i,1);
    if (locs_y_cnt < 4 && c == dtYearChar_)  {
      locs_year[locs_year.length] = i;
      locs_y_cnt++;
      continue;
    }
    if (locs_m_cnt < 2 && c == dtMonthChar_) {
      locs_month[locs_month.length] = i;
      locs_m_cnt++;
      continue;
    }
    if (locs_d_cnt < 2 && c == dtDayChar_) {
      locs_day[locs_day.length] = i;
      locs_d_cnt++;
      continue;
    }
  }

  /* loop done */

  var matches = new Object;
  var locations = new Array();

  /* fit year */
  for (i = locs_y_cnt-1; i >= 0; i--) {
    locations[locations.length] = locs_year[i];
    matches['loc_'+locs_year[i]] = dtYear % 10;
    dtYear = Math.floor(dtYear/10);
  }
  /* fit month */
  for (i = locs_m_cnt-1; i >= 0; i--) {
    locations[locations.length] = locs_month[i];
    matches['loc_'+locs_month[i]] = dtMonth % 10;
    dtMonth = Math.floor(dtMonth/10);
  }
  /* fit day */
  for (i = locs_d_cnt-1; i >= 0; i--) {
    locations[locations.length] = locs_day[i];
    matches['loc_'+locs_day[i]] = dtDay % 10;
    dtDay = Math.floor(dtDay/10);
  }

  /* and now collect all the results */

  var stringParts = new Array();

  var last_i = 0;
  var loc_i = 0;

  locations.sort(dt_sort_number);

  for (i = 0; i < locations.length; i++) {
    // append a part
    loc_i = locations[i];
    if (loc_i > last_i) {
      stringParts[stringParts.length] = dtFormat.substr(last_i+1,loc_i-last_i-1);
    }
    last_i = loc_i;
    stringParts[stringParts.length] = ''+matches['loc_'+loc_i];
  }
  if (last_i > 0) {
    stringParts[stringParts.length] = dtFormat.substr(last_i+1);
  }
  else {
    if (locations.length == 0) {
      stringParts[stringParts.length] = dtFormat;
    }
  }

  return stringParts.join("");
}

/* and return in dtFormat_ format */
function dt_parse_ymd( dateString, dtFormat ) {

  if ((!dateString) || (!dtFormat) || (!dtFormat_)) return "";

  var locs_year = new Array();
  var locs_month = new Array();
  var locs_day = new Array();

  var locs_y_cnt = 0;
  var locs_m_cnt = 0;
  var locs_d_cnt = 0;
  var max_len = dtFormat.length;
  var c;

  for (i = 0; i < max_len; i++) {
    c = dtFormat.substr(i,1);
    if (locs_y_cnt < 4 && c == dtYearChar_)  {
      locs_year[locs_year.length] = i;
      locs_y_cnt++;
      continue;
    }
    if (locs_m_cnt < 2 && c == dtMonthChar_) {
      locs_month[locs_month.length] = i;
      locs_m_cnt++;
      continue;
    }
    if (locs_d_cnt < 2 && c == dtDayChar_) {
      locs_day[locs_day.length] = i;
      locs_d_cnt++;
      continue;
    }
  }

  var matches = new Object;
  var locations = new Array();

  var loc = 0;
  var val = 0;

  var year = 0;
  var month = 0;
  var day = 0;
  /* fit year */
  for (i = 0; i < locs_y_cnt; i++) {
    loc = locs_year[i];
    if (dateString.length <= loc) {
      continue;
    }
    val = dateString.substr(loc,1);
    val++; val--; val %= 10;
    year *= 10;
    year += val;
  }

  for (i = 0; i < locs_m_cnt; i++) {
    loc = locs_month[i];
    if (dateString.length <= loc) {
      continue;
    }
    val = dateString.substr(loc,1);
    val++; val--; val %= 10;
    month *= 10;
    month += val;
  }

  for (i = 0; i < locs_d_cnt; i++) {
    loc = locs_day[i];
    if (dateString.length <= loc) {
      continue;
    }
    val = dateString.substr(loc,1);
    val++; val--; val %= 10;
    day *= 10;
    day += val;
  }

  if (year < 100) {
    if (year < dtCenturyLimit_) year += 2000;
    else year += 1900;
  }
  if (year < 1000) {
    year += 1000;
  }

  if (!date_verify(year,month,day)) return ""; /* sorry - bad date */

  return dt_print_ymd( year, month, day, dtFormat_ );
}
