// mu_parse_date
// 
// provides the function mu_parse_date to parse a string to provide a date object.
// This always returns a date. If no sensible interpretation of the string is found, it returns todays date.
// This should work multilingual

var mu_date_language;
var mu_date_localize = new Object();
mu_date_localize.languages = ['en', 'de', 'it', 'hu'];
mu_date_localize.month_names = new Object();
mu_date_localize.month_names.en = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
mu_date_localize.month_names.de = ['Jan', 'Feb', 'M\u00e4r', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'];
mu_date_localize.month_names.it = ['Gen', 'Feb', 'Mar', 'Apr', 'Mag', 'Giu', 'Lug', 'Ago', 'Set', 'Ott', 'Nov', 'Dic'];
mu_date_localize.month_names.hu = ['Jan', 'Feb', 'M\u00e1r', 'Apr', 'M\u00e1j', 'J\u00fan', 'J\u00fal', 'Aug', 'Sze', 'Okt', 'Nov', 'Dec'];
mu_date_localize.get_month_name = function (month_nr) {return(this.month_names[mu_date_language || 'en'][month_nr - 1])};

var mu_date_format = "dd MM yyyy"

function mu_parse_date(str) {
  // check if this is a sensible day/month combination. If not, checks if the swapped version is sensible.
  // returns [day, month] on success or null otherwise.
  function check_day_month (pday, pmonth) {
    if (pday > 0 && pday <= 31 && pmonth > 0 && pmonth <= 12)
      return([pday, pmonth]);
    else if (pday > 0 && pday <= 12 && pmonth > 0 && pmonth <= 31)
      return([pmonth, pday]);
    else
      return(void(0));
  };
  function check_day_year (pday, pyear) {
    if (pday > 0 && pday <= 31) {
      if (pyear < 100)
        return([pday, pyear + 2000]);
      else
        return([pday, pyear]);
    } else if (pyear > 0 && pyear <= 31) {
      if (pday < 100)
        return([pyear, pday + 2000]);
      else
        return([pyear, pday]);
    } else
      return(void(0));
  };
  var low_month_names = [['jan','j\u00e4n','gen'],['feb'],['mar','m\u00e4r','m\u00e1r'],['apr','\u00e1pr'],['may','mai','mag','m\u00e1j'],['jun','giu','j\u00fan'],['jul','lug','j\u00fal'],['aug','ago'],['sep','set','sze'],['oct','okt','ott'],['nov'],['dec','dez','dic']];
  var arr = str.match(new RegExp('[0-9a-zA-Z\u00e4\u00e1\u00fa]+', 'g'));
  var numarr = str.match(new RegExp('[0-9]+', 'g'));
  var the_year, the_month, the_day
  var the_date = new Date
  the_year = the_date.getFullYear();
  the_month = the_date.getMonth() + 1;
  the_day = the_date.getDate() + 1;

  if (numarr.length == 1 && arr.length == 1) {
    // possibilities: dmy, mdy, ydm, ymd, md, dm, d
    // not supported yet
    ;
  }
  else if (numarr.length == 1 && arr.length == 2) {
    // possibilities: dM, Md, Mdy
    // not supported yet
    ;
  }
  else if (numarr.length == 2 && arr.length == 2) {
    // possibilities: d m, m d
    // not supported yet
    ;
  }
  else if (numarr.length == 2 && arr.length == 3) {
    // possibilities: d M y, M d y, y M d, y d M
    var letters = str.toLowerCase().match(/[a-z\u00e1].*/);
    if (letters) letters = letters[0].substring(0,3);
    var success = false;
    if (letters) {
    for (var i_month = 0; (!success) && i_month < 12; ++i_month) {
      for (var i_low in low_month_names[i_month]) {
        if (letters == low_month_names[i_month][i_low]) {
          success = true;
          the_month = i_month + 1;
        }
      }
    }
    if (success) {
      var ck = check_day_year(numarr[0], numarr[1]);
      if (ck) {
        the_day = ck[0];
        the_year = ck[1];
      }
    }
  }
  }else if (numarr.length == 3 && arr.length == 3) {
    // possibilities: d m y, m d y, y m d, y d m
    if (numarr[0] >= 100) {
      var ck = check_day_month (numarr[2], numarr[1]);
      if (ck)
      {
        the_day = ck[0];
        the_month = ck[1];
      }
      the_year = numarr[0];
    } else if (numarr[2] >= 100) {
      var ck = check_day_month (numarr[0], numarr[1]);
      if (ck)
      {
        the_day = ck[0];
        the_month = ck[1];
      }
      the_year = numarr[2];
    } else {
      // we assume d m y
      var ck = check_day_month (numarr[0], numarr[1]);
      if (ck)
      {
        the_day = ck[0];
        the_month = ck[1];
        the_year = 2000 + 1 * numarr[2];
      }
    }
  }

 return(new Date(the_year, the_month - 1, the_day));
};

function mu_write_date(a_date) {
  // format a number as a string of given length, filling with 0
  function number_format(nr, len) {
    var zeros = "";
    var my_len = len - (nr + "").length;
    for(var i=0; i < my_len; ++i) zeros = zeros + "0";
    return(zeros + nr);
  };
  var the_day = a_date.getDate();
  var the_month = a_date.getMonth() + 1;
  var the_year = a_date.getFullYear();

  // simple fixed format for now
  str = number_format(the_day, 2) + "-" + mu_date_localize.get_month_name(the_month) + "-" + number_format(the_year, 4);
  return(str);
};

// provides functions to update arrival/departure type date pairs
function update_dep(mod_arr, orig_dep) {
  arr_date = mu_parse_date(mod_arr.value);
  dep_obj = document.getElementById(orig_dep);
  dep_date = mu_parse_date(dep_obj.value);
  if (arr_date >= dep_date) {
    dep_date.setFullYear(arr_date.getFullYear(), arr_date.getMonth(), arr_date.getDate() + 1);
    dep_obj.value =  mu_write_date(dep_date); // dep_date.getDate() + "-" + (dep_date.getMonth() + 1) + "-" + dep_date.getFullYear();
  }
};
function update_arr(mod_dep, orig_arr) {
  dep_date = mu_parse_date(mod_dep.value);
  arr_obj = document.getElementById(orig_arr);
  arr_date = mu_parse_date(arr_obj.value);
  if (arr_date >= dep_date) {
    arr_date.setFullYear(dep_date.getFullYear(), dep_date.getMonth(), dep_date.getDate() - 1);
    arr_obj.value = mu_write_date(arr_date); // arr_date.getDate() + "-" + (arr_date.getMonth() + 1) + "-" + arr_date.getFullYear();
  }
};
