//
// Date Picker
// As seen in Microsoft Outlook, then slightly enhanced
//
// Copyright (C) 2003 Alexei Naschokin, nalex@parallelgraphics.com
//

var prev_img_src = '/l2/art/previous.gif';
var next_img_src = '/l2/art/next.gif';
var spacer_img_src = '/l2/art/s.gif';

var mths = new Array("Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь");
var mthsr = new Array("января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря");
var wdays = new Array("Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье");
var wdaysh = new Array("Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс");
var dpna = "n/a";
var dpdiv = "dpdiv";
var dpfield = null;
var dpvisible = 0;
var highlight = null;
var datefmt = 0;
function lz(n) {return n<10 ? ('0'+n) : n;}
function parseNum(s) {
  var r = s.replace(/^\s*0*/,"").replace(/\s*$/,"");
  return (r == '' && s.indexOf('0') >= 0) ? 0 : parseInt(r);
}
function parseMonth(s) {
  var l = s.length;
  var n = s.toLowerCase();
  var r = 0;
  for (var i = 0; i < 12; ++i)
    if (l <= mths[i].length && mths[i].substring(0, l).toLowerCase() == n) {
      if (r != 0)
        return 0;
      r = i + 1;
    }
  return r;
}
function nalexParseDate(ds, fmt, base) {
  var r = base ? base : new Date();
  var d, m, y;
  var di = (fmt & 1) ? 1 : 0;
  var mi = 1-di;
  var a = ds.split('-');
  var a1 = ds.split('.');
  var a2 = ds.split('/');
  if (a.length < a1.length)
    a = a1.length > a2.length ? a1 : a2;
  else if (a.length < a2.length) {
    a = a2;
    di = 1;
    mi = 0;
  }
  if (a.length == 3) {
    // full date
    d = parseNum(a[di]);
    m = parseNum(a[mi]);
    y = parseNum(a[2]);
    if (d > 0 && m > 0) {
      if (m > 12 && d <= 12) {
        var i = m; m = d; d = i;
      }
    }
    else if (m != m || m <= 0)
      m = parseMonth(a[mi]);
    else if (d != d || d <= 0) {
      d = m;
      m = parseMonth(a[di]);
    }
    if (d > 0 && m > 0 && m <= 12 && y > 0) {
      r.setDate(1);
      r.setYear(y>99 ? y : 2000+y);
      r.setMonth(m-1);
      r.setDate(d);
      return r;
    }
  }
  else if (a.length == 2) {
    // date-month or month-year
    d = parseNum(a[di]);
    m = parseNum(a[mi]);
    if (d > 0 && m > 0) {
      if (m > 1900) {
        r.setYear(m);
        r.setMonth(d-1);
        if (r.getMonth() != m-1) r.setDate(0);
        return r;
      }
      else if (m > 12 && d <= 12) {
        r.setDate(1);
        r.setMonth(d-1);
        r.setDate(m);
        return r;
      }
      else {
        r.setDate(1);
        r.setMonth(m-1);
        r.setDate(d);
        return r;
      }
    }
    else {
      y = -1;
      if (m != m || m <= 0)
        m = parseMonth(a[mi]);
      else if (d != d || d <= 0) {
        y = m;
        m = parseMonth(a[di]);
      }
      if (m > 0 && m <= 12) {
        if (y == y && y > 0) {
          r.setDate(1);
          r.setYear(y>99 ? y : 2000+y);
          r.setMonth(m-1);
          if (r.getMonth() != m-1) r.setDate(0);
          return r;
        }
        else if (d == d && d > 1) {
          r.setDate(1);    
          r.setMonth(m-1);
          r.setDate(d);
          return r;
        }
      }
    }
  }
  else if (a.length == 1) {
    // month or year
    m = parseNum(a[0]);
    if (m == m && m > 0) {
      if (m > 31)
        r.setYear(m>99 ? m : 2000+m);
      else
        r.setDate(m);
      return r;
    }
    else {
      m = parseMonth(a[0]);
      if (m > 0) {
        r.setMonth(m-1);
        if (r.getMonth() != m-1) r.setDate(0);
        return r;
      }
    }
  }
  return null;
}
 
function updateDate(e, fmt) {
  if (e.value != dpna && e.value != "") {
    var r = nalexParseDate(e.value, fmt);
    if (r != null) {
      switch (fmt) {
      case 1: e.value = mths[r.getMonth()].substring(0, 3)+"-"+lz(r.getDate())+"-"+r.getFullYear(); break;
      case 2: e.value = lz(r.getDate())+"."+lz(r.getMonth()+1)+"."+r.getFullYear(); break;
      case 3: e.value = (r.getMonth()+1)+"/"+r.getDate()+"/"+r.getFullYear(); break;
//      default: e.value = lz(r.getDate())+'-'+mths[r.getMonth()].substring(0, 3)+"-"+r.getFullYear(); break;	  
      default: e.value = lz(r.getDate())+" "+mthsr[r.getMonth()]+" "+r.getFullYear()+" года"; break;
      }
      e.style.color = "black";
    }
    else {
      e.style.color = "#D03030";
      return false;
    }
  }
  else {
    e.value = dpna;
    e.style.color = "#808080";
  }
  return true;
}
function beginEditDate(e) {
  if (e.value == dpna) {
    e.value="";
    e.style.color = "black";
  }
}
function formatSqlDate(s) {
  if (s == dpna || s == "") return "";
  var d = nalexParseDate(s, datefmt);
  return d ? d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate() : null;
}
function dp(y, m, d) {
  if (dpfield) {
    switch (datefmt) {
    case 1: dpfield.value = mths[m].substring(0, 3)+"-"+lz(d)+'-'+y; break;
    case 2: dpfield.value = lz(d)+"."+lz(m+1)+"."+y; break;
    case 3: dpfield.value = (m+1)+"/"+d+"/"+y; break;
//    default: dpfield.value = lz(d)+'-'+mths[m].substring(0, 3)+"-"+y; break;
    default: dpfield.value = lz(d)+" "+mthsr[m]+" "+y+" года"; break;	
    }
    dpfield.style.color = "black";
  }
  dismissDatePicker();
  return false;
}
var userhook = null;
var userdata = null;
function datePicker(form, fieldName, fmt, hookfn, hookdata) {
  var f = dpfield;
  dismissDatePicker();

  if (f == null || f.name != fieldName) {

	dpfield = document.forms[form].elements[fieldName];
    datefmt = fmt;
    highlight = nalexParseDate(dpfield.value, fmt);
    var d = highlight ? highlight : new Date();
    dpvisible = 2;
    document.onclick = clickhook;
    document.onselectstart = selecthook;
    window.onresize = resizehook;
    userhook = hookfn;
    userdata = hookdata;
    if (userhook) userhook(1, userdata);

    createDatePicker(fieldName+"i", d.getFullYear(), d.getMonth());
  }
  return false;
}
function dismissDatePicker() {
  if (dpvisible) {
    var e = document.getElementById ? document.getElementById(dpdiv) : document.all[dpdiv];
    e.style.display = "none";
    e.innerHTML = "";
    dpvisible = 0;
  }
  if (userhook) userhook(0, userdata);
  userdata = null;
  userhook = null;
  dpfield = null;
  document.onclick = null;
  document.onselectstart = null;
  window.onresize = null;
}
function createDatePicker(elname, y, m) {
  var d1 = new Date(0);
  d1.setYear(y);
  d1.setMonth(m);
  m = d1.getMonth();
  y = d1.getFullYear();
  var d = highlight ? highlight.getDate() : 0;
  var chk = highlight && m == highlight.getMonth() && y == highlight.getFullYear();
  var mn = (m + 1) % 12;
  var mp = (m + 11) % 12;
  var yn = (m == 11) ? y + 1 : y;
  var yp = (m == 0) ? y - 1 : y;

  var i;
  var s = '<table cellpadding="0" cellspacing="0" border="0" style="border: 1px solid #dae7f1;"><tr><td><table cellpadding="0" cellspacing="0" border="0" width="100%"><tr>'+
    '<td class="dpheader" align="left" style="padding-left: 12px;" nowrap="true"><b>'+mths[d1.getMonth()]+', '+d1.getFullYear()+
    '</b></td><td class="dpheader" align="right"><a href="" onclick="return createDatePicker(\''+
    elname+'\','+yp+','+mp+');"><img src="'+prev_img_src+'" width="14" height="13" border="0" title="'+mths[mp]+', '+yp+'"/></a><a href="" onclick="return createDatePicker(\''+
    elname+'\','+yn+','+mn+');"><img src="'+next_img_src+'" width="14" height="13" border="0" title="'+mths[mn]+', '+yn+'"/></a></td></tr>' +
    '<tr><td colspan="2" bgcolor="#A0A0A0"><img src="'+spacer_img_src+'"/></td></tr>' +
    '<tr><td colspan="2" align="center" bgcolor="#ffffff" style="padding-left: 12px; padding-right: 12px; padding-bottom: 4px;">'+
    '<table cellpadding="2" cellspacing="0" border="0"><tr>';
  for (i = 0; i < 7; i++)
//    s += '<td class="dpweek">'+wdays[i].substring(0,2)+'</td>';
    s += '<td class="dpweek">'+wdaysh[i]+'</td>';	
  s += '<tr>'
  d1.setDate(1);
  var pre = (d1.getDay() == 0)? 6 : (d1.getDay()-1);
  if (pre == 0)
    pre = 7;
  // previous month
  var d2 = new Date(0);
  d2.setYear(yp);
  var j = 33;
  while (--j >= 0) {
    d2.setMonth(mp);
    d2.setDate(j);
    if (d2.getMonth() == mp)
      break;
  }  
  for (i = j - pre + 1; i <= j; ++i)
    s += '<td class="dpcell"><a class="dpgrey" href="" onclick="return dp('+yp+','+mp+','+i+');">'+i+'</a></td>';
  if (pre == 7)
      s += '</tr><tr>';
  // this month
  for (d1.setDate(i = 1), j = d1.getDay(); d1.getMonth() == m; ++j, d1.setDate(++i)) {
    s += '<td class="dpcell"';
    if (chk && i == d)
      s += ' style="background-color: #E8E8E8;"><a style="color: #000000;"';
    else
      s += '><a';
    s += ' href="" onclick="return dp('+y+','+m+','+i+');">'+i+'</a></td>';
    if ((j % 7) == 0) s += '</tr><tr>';
  }
  // next month
  pre = (d1.getDay() == 0) ? 1 : (8 - d1.getDay());
  for (i = 1; i <= pre; ++i)
    s += '<td class="dpcell"><a class="dpgrey" href="" onclick="return dp('+yn+','+mn+','+i+');">'+i+'</a></td>';
  s += '</tr></table></td></tr></table></td></tr></table>';

  var xp = 1;
  var yp = 1;
  if (navigator.userAgent.indexOf("Opera") > 0) yp += 10;//16;
  else if (navigator.userAgent.indexOf("Gecko") > 0) yp -= 2;//16;
  var e;
  for (i = 0; i < document.anchors.length; i++) {
    e = document.anchors[i];
    if (e.name == elname) {
      for (; e.offsetParent; e = e.offsetParent) {
        xp += e.offsetLeft;
        yp += e.offsetTop;
      }
      break;
    }
  }

  if (document.getElementById)
    e = document.getElementById(dpdiv);
  else if (document.all)
    e = document.all[dpdiv];

  e.innerHTML = s;
  e.style.left = xp;
  e.style.top = yp-e.shiftTop;
  e.style.display = "block";

  return false;
}
function resizehook() {
  dismissDatePicker();
}
function clickhook() {
  if (dpvisible == 2)
    --dpvisible;
  else if (dpvisible)
    dismissDatePicker();
}
function selecthook() {
  event.cancelBubble = true;
  event.returnValue = false;
}

