var ie = navigator.appVersion.indexOf("MSIE")>-1;

function WeekNo(n) {
  year = n.getFullYear();
  month = n.getMonth() + 1;
  if (1 == 0) day = n.getDate() + 1;
  else day = n.getDate();
  a = Math.floor((14-month) / 12);
  y = year + 4800 - a;
  m = month + 12 * a - 3;
  b = Math.floor(y/4) - Math.floor(y/100) + Math.floor(y/400);
  J = day + Math.floor((153 * m + 2) / 5) + 365 * y + b - 32045;
  d4 = (((J + 31741 - (J % 7)) % 146097) % 36524) % 1461;
  L = Math.floor(d4 / 1460);
  d1 = ((d4 - L) % 365) + L;
  week = Math.floor(d1/7) + 1;
  return week;
}

function CreateLayer(object, parent) {
  var r = document.createElement("div");
  parent.appendChild(r);
  r.object = object;
  r.style.position = "absolute";
  r.style.display = "none";
  return r;
}

function IsVisible(layer) {
  return layer.style.display != "none";
}
function ShowLayer(layer) {
  layer.style.display = 'block';
}
function HideLayer(layer) {
  layer.style.display = 'none';
}

function GetPosition(layer,topobj) {
  var r = new Array(0,0);
  lr = layer;
  do {
    r[0] += lr.offsetLeft + (ie?lr.clientLeft:0);
    r[1] += lr.offsetTop + (ie?lr.clientTop:0);
    lr = lr.offsetParent;
  } while (lr && lr!=topobj);
  return r;
}

function padZero(num) {
  return (num<10) ? '0'+num : num;
}

/******************************************************************************/
/******************************************************************************/
/******************************************************************************/

function mcDatePickerCreate(resPath) {
  this.resPath = resPath;

  this.ShowWeekNumber = false;
  this.EnablePast = true;

  this.DateFormat = "yyyy-mm-dd";
  this.WeekString = "?";
  this.ShortDayName = new Array('Pn','Wt','Śr','Cz','Pt','So','N');
  this.MonthName = new Array('Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec','Lipiec','Sierpień','Wrzesień','Padziernik','Listopad','Grudzień');
  this.layer = null;

  this.Close = function(sender) {
    this._HideLayer(this.layer);
  }

  this.SetAndClose = function(sender) {
    this.SetDateToControl();
    this.Close(sender);
  }

  this.IncMonth = function(sender) {
    this.month++;
    if (this.month > 11) {
      this.month = 0;
      this.year++;
    }
    this.Recreate();
  }

  this.DecMonth = function(sender) {
    this.month--;
    if (this.month < 0) {
      this.month = 11;
      this.year--;
    }
    this.Recreate();
  }

  this.ScrollYear = function(sender,delta) {
    var n;
    if (delta>0) n = sender.parentNode.previousSibling
    else n = sender.parentNode.nextSibling
    n.firstChild.innerHTML = this.YearsListAsHtml(delta);
  }

  this.PopupMonth = function(sender) {
    this._HideLayer(this.ylayer);
    this._ShowLayer(sender,this.mlayer,true);
  }

  this.PopupYear = function(sender) {
    this._HideLayer(this.mlayer);
    this._ShowLayer(sender,this.ylayer,true);
  }

  this.SelectToday = function(sender) {
    var t = new Date();
    this.day = t.getDate();
    this.month = t.getMonth();
    this.year = t.getFullYear();
    this.SetAndClose(sender);
  }

  this.SelectDay = function(sender,ix) {
    this.day = ix;
    this.SetAndClose(sender);
  }

  this.SelectMonth = function(sender,ix) {
    this.month = ix;
    this.Recreate();
  }

  this.SelectYear = function(sender,ix) {
    this.year = ix;
    this.Recreate();
  }

  this._strToDate = function(str) {
    var i, sep, formatParts, dt;
    var sepArr = new Array('.','-','/');
    for (i=0; i<sepArr.length; i++) {
      formatParts = this.DateFormat.split(sepArr[i]);
      if (formatParts.length==3) {
        sep = sepArr[i];
        break;
      }
    }
    var d,m,y;
    if (sep) {
      dateParts = str.split(sep);
      for (i=0; i<3; i++)
        if ((formatParts[i] == "d") || (formatParts[i] == "dd"))
          d = parseInt(dateParts[i], 10);
        else if ((formatParts[i] == "m") || (formatParts[i] == "mm"))
          m = parseInt(dateParts[i], 10) - 1;
        else if (formatParts[i] == "yyyy")
          y = parseInt(dateParts[i], 10);
    }
    if (isNaN(d) || isNaN(m) || isNaN(y)) return new Date();
    return new Date(y,m,d);
  }

  this._dateToStr = function(dt) {
    var s = this.DateFormat;
    var d=dt.getDate();
    var m=dt.getMonth();
    var y=dt.getFullYear();
    s = s.replace('dd','<e>');
    s = s.replace('d','<d>');
    s = s.replace('<e>',padZero(d));
    s = s.replace('<d>',d);
    s = s.replace('mm','<n>');
    s = s.replace('m','<m>');
    s = s.replace('<m>',m+1);
    s = s.replace('<n>',padZero(m+1));
    s = s.replace('yyyy',y);
    return s.replace('yy',padZero(y%100));
  }

  this.GetDateFromControl = function() {
    var dt = this._strToDate(this.Control.value);
    this.OrygDate = dt;
    this.day = dt.getDate();
    this.month = dt.getMonth();
    this.year = dt.getFullYear();
  }

  this.SetDateToControl = function() {
    var dt = new Date(this.year, this.month, this.day);
    this.Control.value = this._dateToStr(dt);
  }

  this._getDate = function(day) {
    return new Date(this.year,this.month,day);
  }
  this._getToday = function() {
    var t = new Date();
    return new Date(t.getFullYear(),t.getMonth(),t.getDate());
  }

  /****************************************************************************/

  this.CellAsHtml = function(bgcolor, title, content, func, arg) {
    return '<td '+(title?' title="'+title+'"':'')+' class="click" style="padding:2px" onmouseover="this.parentNode.className=\'over\'" onmouseout="this.parentNode.className=\'\'" onclick="FindOwnerObj(this).'+func+'(this'+(typeof(arg)!='undefined'?','+arg:'')+')">'+content+'</td>';
  }

  this.TopAsHtml = function() {
    var r = '';

      r += '<table cellspacing="0" cellpadding="0" border="0"><tr>';
      r += this.CellAsHtml('white','poprzedni miesiąc','<img src="'+this.resPath+'a-l.png" width="9" height="13" alt="" />','DecMonth');
      r += '<td class="sep"></td>';
      var s = '<table cellspacing="0" cellpadding="0" class="month" width="78" border="0"><tr><td>'+this.MonthName[this.month]+'</td><td align="right"><img src="'+this.resPath+'a-d.png" width="9" height="13" alt="" /></td></tr></table>';
      r += this.CellAsHtml('white','wybierz miesiąc',s,'PopupMonth');
      r += '<td class="sep"></td>';
      var s = '<table cellspacing="0" cellpadding="0" class="year" width="43" border="0"><tr><td>'+this.year+'</td><td align="right"><img src="'+this.resPath+'a-d.png" width="9" height="13" alt="" /></td></tr></table>';
      r += this.CellAsHtml('white','wybierz rok',s,'PopupYear');
      r += '<td class="sep"></td>';
      r += this.CellAsHtml('white','następny miesiąc','<img src="'+this.resPath+'a-r.png" width="9" height="13" alt="" />','IncMonth');
      r += '</tr></table>';
    return r;
  }

  this.MonthsAsHtml = function() {
    var s, r = '';
    r += '<table cellspacing="0" cellpadding="0" border="0" width="80">';
    for (i=0; i<12; i++) {
      s = this.MonthName[i];
      if (i==this.month) s = '<b>'+s+'</b>';
      r += '<tr>'+this.CellAsHtml('','',s,"SelectMonth",i)+'</tr>';
    }
    r += '</table>';
    return '<div class="popup">'+r+'</div>';
  }

  this.YearsListAsHtml = function(delta) {
    this._scrollyear += delta;
    var year = this._scrollyear;
    var r = '';
    r += '<table cellpadding="0" cellspacing="0" width="100%">';
    for (var i=year-3; i<=year+3; i++) {
      s = i;
      if (i==this.year) s = '<b>'+s+'</b>';
      r += '<tr align="center">'+this.CellAsHtml('','',s,"SelectYear",i)+'</tr>';
    }
    r += '</table>';
    return r;
  }

  this.YearsAsHtml = function() {
    this._scrollyear = this.year;
    var r = '';
    r += '<table cellpadding="0" cellspacing="0" width="45">';
    r += '<tr align="center">'+this.CellAsHtml('','','-','ScrollYear',-1)+'</tr>';
    r += '<tr><td style="padding:0">'+this.YearsListAsHtml(0)+'</td></tr>';
    r += '<tr align="center">'+this.CellAsHtml('','','+','ScrollYear',1)+'</tr>';
    r += '</table>';
    return '<div class="popup">'+r+'</div>';
  }

  this.MainAsHtml = function() {
    var startDate = this._getDate(1);
    var endDate = new Date(this.year,this.month+1,0);
    var daysInMonth = endDate.getDate();
    var wd = (startDate.getDay()+6)%7; // Mon=0, .. Sun=6
    var r = '';
    r += '<table cellspacing="0" cellpadding="0" border="0" class="main" xstyle="border-collapse:separate">';
    r += '<tr>';
    if (this.ShowWeekNumber) r += '<th>'+this.WeekString+'</th>';
    for (i=0; i<7; i++) r += '<th width="19" align="right">'+this.ShortDayName[i]+'</th>';
    r += '</tr>';
    for (var d=1; d<=daysInMonth; d++) {
      if (d==1 || wd==0) {
        r += '<tr>';
        if (this.ShowWeekNumber)
          r += '<td align="right" class="weekno">'+WeekNo(this._getDate(d))+'</td>';
        if (d==1) for (var i=1; i<=wd; i++) r += '<td>&nbsp;</td>';
      }
      var ispast = !this.EnablePast && this._getDate(d)-this._getToday()<0;
      var istoday = this._getDate(d)-this._getToday()==0;
      var cls = "";
      if (this._getDate(d)-this.OrygDate==0) cls = "selected"
      else if (ispast) cls = "past"
      else if (wd==6) cls = "sunday"
      var content = ispast ? d : '<a href="javascript:;" onclick="FindOwnerObj(this).SelectDay(this,'+d+')">'+d+'</a>';
      if (istoday) content = '<b>'+content+'</b>';
      r += '<td align="right" class="'+cls+'">'+content+'</td>';
      if (wd==6) r += '</tr>';
      wd=(++wd)%7;
    }
    if (wd>0) {
      for (var i=1; i<=7-wd; i++) r += '<td>&nbsp;</td>';
      r += '</tr>';
    }
    //r += '<tr>'; for (i=0; i<7; i++) r += '<td width="19"></td>'; r += '</tr>';
    r += '</table>';
    return r;
  }

  this.BottomAsHtml = function() {
    var r = '';
//    r += '<table cellspacing="0" cellpadding="0" align="center" border="0"><tr>';
//    r += this._bgl;
//    r += this._bgm;

      r += '<table cellspacing="0" cellpadding="0" border="0" align="center"><tr>';
      r += this.CellAsHtml('white','','Dzisiaj','SelectToday');
      r += '</tr></table>';

//    r += '</td>';
//    r += this._bgr;
//    r += '</tr>';
//    r += '</table>';
    return r;
  }

  this.GetAsHtml = function() {
    var r = '';
    r += '<table cellspacing="0" cellpadding="0">';
    r += '<tr><td><div class="top">'+this.TopAsHtml()+'</div></td></tr>';
    r += '<tr><td><div class="main">'+this.MainAsHtml()+'</div></td></tr>';
    r += '<tr><td><div class="bottom">'+this.BottomAsHtml()+'</div></td></tr>';
    r += '</table>';
    return r;
  }

  this.Recreate = function() {
    this.layer.innerHTML = this.GetAsHtml();
    this.ylayer = CreateLayer(this, this.layer);
    this.mlayer = CreateLayer(this, this.layer);
    this.ylayer.innerHTML = this.YearsAsHtml();
    this.mlayer.innerHTML = this.MonthsAsHtml();
    if (!ie) { // mozilla bug
      this.mlayer.style.width = "100%";
      this.mlayer.innerHTML = '<table cellspacing="0" cellpadding="0"><tr><td>'+this.mlayer.innerHTML+'</td></tr></table>';
      this.ylayer.style.width = "100%";
      this.ylayer.innerHTML = '<table cellspacing="0" cellpadding="0"><tr><td>'+this.ylayer.innerHTML+'</td></tr></table>';
    }
  }

  this._HideLayer = function(layer) {
    ChangeOverlapedVisibility(layer, true);
    HideLayer(layer);
  }

  this._ShowLayer = function(sender,layer,rel) {
    if (IsVisible(layer)) {
      this._HideLayer(layer);
    } else {
      var r = GetPosition(sender,rel?FindOwnerObj(sender).layer:null);
      layer.style.top = (r[1]+sender.offsetHeight+1)+'px';
      if (rel) layer.style.left = (r[0]-0)+'px';
      else layer.style.left = '-9999px';
      ShowLayer(layer);
      if (!rel) layer.style.left = Math.max(r[0]+sender.offsetWidth-this.layer.offsetWidth, 2)+'px';
      ChangeOverlapedVisibility(layer, false);
    }
  }

  this.Show = function(sender, control) {
    this.Sender = sender;
    this.Control = control;
    if (!this.layer) {
      this.layer = CreateLayer(this, document.body);
      this.layer.id = "mcDatePicker";
      this.layer.className = "calendar";
    }
    if (!IsVisible(this.layer)) {
      this.GetDateFromControl();
      this.Recreate();
    }
    this._ShowLayer(sender,this.layer,false);
  }

  return this;
}

/******************************************************************************/

function FindOwnerObj(sender) {
  return document.getElementById("mcDatePicker").object;
}

function showDatePicker(sender, control, resPath) {
  if (!document.mcDatePicker) document.mcDatePicker = new mcDatePickerCreate(resPath);
  document.mcDatePicker.Show(sender, control);
}

/******************************************************************************/

document.onmousedown = function(e) {
	var sender = e ? e.target : self.event.srcElement;
  if (document.mcDatePicker && IsVisible(document.mcDatePicker.layer)) {
    var hide = true;
    node = sender;
    while (node.tagName != 'HTML') {
      if (node.id==document.mcDatePicker.layer.id || node==document.mcDatePicker.Sender) { hide = false; break; }
      node = node.parentNode;
    }
    if (hide) document.getElementById("mcDatePicker").object.Close();
  }
}
document.onkeydown = function(e) {
return;
  if (document.mcDatePicker && IsVisible(document.mcDatePicker.layer))
    document.getElementById("mcDatePicker").object.Close();
}



/**
 Layer-utils.js
 */
function GetRect(el) {
  var left = 0
  var top = 0
  this.width = el.offsetWidth
  this.height = el.offsetHeight
  while (el) {
    left += el.offsetLeft
    top += el.offsetTop
    el = el.offsetParent
  }
  this.left = left;
  this.top = top;
}

function CreateOverlapControler(layer) {

  this._Init = function(layer) {
    this.layer = layer;
    list = new Array();
    // this._GetObjects("SELECT", list);
    // this._GetObjects("OBJECT", list);
    this._objects = list;
  }

  this._GetObjects = function(tagName, result) {
    var list = document.getElementsByTagName(tagName);
    for (var i=0, len=list.length; i<len; i++)
      result.push( {layer:list.item(i), save:null} );
  };

  this._Overlap = function(obj1, obj2) {
    var r1 = new GetRect(obj1);
    var r2 = new GetRect(obj2);
    return ((r1.left < r2.left + r2.width) && (r1.left + r1.width > r2.left) && (r1.top < r2.top + r2.height) && (r1.top + r1.height > r2.top));
  };

  this.ChangeVisibility = function(val) {
    var list = this._objects;
    for (var i=0, len=list.length; i<len; i++) {
      var obj = list[i];
      if (val && obj.save!=null) {
        obj.layer.style.visibility = obj.save;
        obj.save = null;
      } else if (!val && obj.save==null && this._Overlap(obj.layer, this.layer)) {
        obj.save = obj.layer.style.visibility;
        obj.layer.style.visibility = 'hidden';
      }
    }
  };

  this._Init(layer);
  return this;
}

function ChangeOverlapedVisibility(layer, val) {
  if (!document.all) return;
  if (!layer._overlapObject) {
    layer._overlapObject = new CreateOverlapControler(layer);
  }
  layer._overlapObject.ChangeVisibility(val);
}
