function w(str) { document.write(str); }
//function w(str) { alert(str); }
function getDay(d) { return (d.getDay()==0)?6:d.getDay()-1; }
function getcdate(oid) {
  var date = new Date();
  date.setDate(1);
  date.setMonth(document.getElementById("cmonth"+oid).value);
  date.setFullYear(document.getElementById("cyear"+oid).value);
  return date;
}
function getDateCopy(date) {
  var copy = new Date();
  copy.setFullYear(date.getFullYear());
  copy.setDate(date.getDate());
  copy.setMonth(date.getMonth());
  return copy;
}
function changeDate(oid,mode,url,clickedDate) {
  var date = getcdate(oid);
  if (mode=="today") date = new Date();
  if (mode=="m--") date.setMonth(date.getMonth()-1);
  if (mode=="m++") date.setMonth(date.getMonth()+1);
  var url = getSpecialUrl(oid,url,date,(mode=="m++") ? -2 : -1);
  window.location.assign(url);
  return;
}
function getLink(oid,url,date,style) {
  var str = date2displayDate(date);
  if (url.indexOf("[date]")!=-1) url = url.replace("[date]",str).replace("[date]",str);
  else url = url+"&fd"+oid+"="+str+"&td"+oid+"="+str+"&d"+oid+"="+str;
  return "<a href='"+url+"' class='"+style+"'>"+date.getDate()+"</a>";
}

function getSpecialUrl(oid,url,date,week) {
  var d = getDateCopy(date);
  var strTo, strFrom, strCur;

  if (week<0) {
    var str = date2displayDate(date);
    str = "01"+str.substr(2);
    strFrom = str;
    d = displayDate2date(str);
    d.setDate(d.getDate()+33);
    str = date2displayDate(d);
    str = "01"+str.substr(2);
    d = displayDate2date(str);
    d.setDate(d.getDate()-1);
    strTo = date2displayDate(d);
  }
  else {
    strTo = date2displayDate(d);
    d.setDate(d.getDate()-6);
    strFrom = date2displayDate(d);
  }
  strCur = week==-2 ? strFrom : strTo;
  
  url = url+"&fd"+oid+"="+strFrom+"&td"+oid+"="+strTo+"&d"+oid+"="+strCur;
  return url;
}
function getSpecialLink(oid,url,date,week,style) {
  var alt = "За неделю";
  if (week==-1) alt = "За месяц";
  url = getSpecialUrl(oid,url,date,week);
  return "<a href='"+url+"' class='"+style+"' title='"+alt+"'>...</a>";
}

function getCalendarDateStyle(curDate,date,hs,clickedDate) {
  var style="calendar";
  if (curDate.getMonth()==date.getMonth()) {
    if ((getDay(curDate)>4) || (hs.indexOf(";"+(curDate.getMonth()+1)+"/"+curDate.getDate()+";")!=-1)) style+=" holiday";
    if (curDate.toDateString()==(new Date()).toDateString()) style+=" today";
    if (clickedDate==date2displayDate(curDate)) style+=" clicked";
  }
  else {
    style+=" othermonth";
    if (curDate.toDateString()==(new Date()).toDateString()) style+=" today";
  }
  return style + " " + style.replace(" ","");
}
function getCalendarStyle(css) {
  if ((css=="") || (css==null)) return "calendar";
  return "calendar "+css+" calendar"+css;
}
function calendar(oid,url,clickedDate,monthType,special,shiftType,startDisplayDate,exists,controlsTemplate,url2) {
  var date = new Date();
  if (clickedDate==null) clickedDate = "";
  if (clickedDate!="") date = displayDate2date(clickedDate);
  if (url2==null) url2="";
  if (url2=="") url2=url;
  

  var today=new Date();
  var dt,d,m,y,week,day;
  var i,j,curDate,str,style;
  var bool=document.getElementById("ct"+oid)!=null;
  dt=date.getDate();
  d=getDay(date);
  m=date.getMonth();
  y=date.getFullYear();
  
  var startDate = displayDate2date(startDisplayDate);
  var startYear=startDate.getFullYear();
  var stopYear=today.getFullYear();

  var ms;
  if (monthType==1) ms=new Array("Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь");
  else if (monthType==2) ms=new Array("Янв","Февр","Март","Апр","Май","Июнь","Июль","Авг","Сент","Окт","Нояб","Дек");
  else ms=new Array("Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек");
  var ds=new Array("Пн","Вт","Ср","Чт","Пт","Сб","Вс");
  //var mdts=new Array(31,(y%4==0&&y%100!=0||y%400==0)?29:28,31,30,31,30,31,31,30,31,30,31);
  var hs=";1/1;1/2;1/3;1/4;1/5;1/7;2/23;3/8;5/1;5/9;6/12;11/4;";
  
  curDate=getDateCopy(date);
  curDate.setDate(1);
  curDate.setDate(1-getDay(curDate)-1);
  if (shiftType==1) {
    var tDate = getDateCopy(curDate);
    tDate.setDate(tDate.getDate()+36);
    //alert(tDate.getMonth() + "=" + curDate.getMonth());
    if (tDate.getMonth()!=date.getMonth()) curDate.setDate(curDate.getDate()-7);
  }
  
  if (!bool) {
    var mc="<select id='cmonth"+oid+"' class='" + getCalendarStyle("controls") + "' onchange='changeDate("+oid+",null,\""+url+"\",\""+clickedDate+"\")'>";
    if (y==startDate.getFullYear()) j = startDate.getMonth();
    else j = 0;
    for (i=j; i<12; i++) {
      mc+="<option value='"+i+"'>"+ms[i]+"</option>";
    }
    mc+="</select>";
    
    var yc="<select id='cyear"+oid+"' class='" + getCalendarStyle("controls") + "' onchange='changeDate("+oid+",null,\""+url+"\",\""+clickedDate+"\")'>";
    for(var i=startYear;i<=stopYear;i++) {
      yc+="<option value='"+i+"'>"+i+"</option>";
    }
    yc+="</select>";

    w("<table id='ct"+oid+"' class='calendar'>");
    w("<tr class='" + getCalendarStyle("controls") + "'>");
    w("<td colspan='"+(special!=""?8:7)+"' class='" + getCalendarStyle("controls") + "'>");

    if (controlsTemplate=="") {
      w("<input type='button' value='&lt;' class='" + getCalendarStyle("controls") + "' onclick='changeDate("+oid+",\"m--\",\""+url+"\",\""+clickedDate+"\")'>");
      w(mc+yc);
      w("<input type='button' value='&gt;' class='" + getCalendarStyle("controls") + "' onclick='changeDate("+oid+",\"m++\",\""+url+"\",\""+clickedDate+"\")'>");
    }
    else {
      w("<input type='button' value='&lt;' class='" + getCalendarStyle("controls") + "' onclick='changeDate("+oid+",\"m--\",\""+url+"\",\""+clickedDate+"\")'>");
      w(" "+ms[date.getMonth()]+" "+date.getFullYear()+" ");
      w("<input type='button' value='&gt;' class='" + getCalendarStyle("controls") + "' onclick='changeDate("+oid+",\"m++\",\""+url+"\",\""+clickedDate+"\")'>");
    }
    w("</td>");
    w("</tr>");
      
    w("<tr class='" + getCalendarStyle("header") + "'>")
    for (day=0; day<7; day++) {
      w("<td class='" + getCalendarStyle("header") + "'>");
      w(ds[day]);
      w("</td>");
    }
    if (special!="") w("<td class='" + getCalendarStyle("header") + "'>"+getSpecialLink(oid,url,date,-1,"header")+"</td>");
    w("</tr>");
        
    for (week=0; week<6; week++) {
      w("<tr class='calendar'>");
      for (day=0; day<7; day++) {
        curDate.setDate(curDate.getDate()+1);
        style = getCalendarDateStyle(curDate,date,hs,clickedDate);
        bool = (exists.indexOf(";"+date2displayDate(curDate)+";")==-1);
        if (!bool) style=style+" exist' onclick='ctdclick(event,this)'";
        w("<td class='"+style+"' onmouseover='ctdover(event,this)' onmouseout='ctdout(event,this)'>");
        if (bool) w(curDate.getDate());
        else w(getLink(oid,url2,curDate,style));
        w("</td>");
	  }
      if (special!="") w("<td class='calendar'>"+getSpecialLink(oid,url,curDate,week,"calendar")+"</td>");
      w("</tr>");
    }
    w("<tr class='" + getCalendarStyle("bottom") + "'>")
    w("<td colspan='"+(special!=""?8:7)+"' class='" + getCalendarStyle("bottom") + "'>");
    
    str = date2displayDate(today);
    if ((m!=today.getMonth()) || (y!=today.getFullYear())) {
      url = url+"&fd"+oid+"="+str+"&td"+oid+"="+str+"&d"+oid+"="+str;
      str = "<a href='"+url+"'>"+str+"</a>";
    }
    w("Сегодня: "+str);
    w("</td>");
    w("</tr>");
    w("</table>");
    var ct=document.getElementById("ct"+oid);
  }
  else {
    var ct=document.getElementById("ct"+oid);
    ct.childNodes[0].childNodes[1].childNodes[7].innerHTML = getSpecialLink(oid,url,date,-1,"calendar");
    for (week=0; week<6; week++) {
      for (day=0; day<7; day++) {
        curDate.setDate(curDate.getDate()+1);
        style = getCalendarDateStyle(curDate,date,hs,clickedDate);
        ct.childNodes[0].childNodes[week+2].childNodes[day].className = style;
        ct.childNodes[0].childNodes[week+2].childNodes[day].innerHTML = getLink(oid,url,curDate,style);
      }
      ct.childNodes[0].childNodes[week+2].childNodes[day].innerHTML = getSpecialLink(oid,url,curDate,week,"calendar");
    }
  }
  try {
    if (y==startDate.getFullYear()) m=m-startDate.getMonth();
    document.getElementById("cmonth"+oid).childNodes[m].selected=true;
    document.getElementById("cyear"+oid).childNodes[y-startYear].selected=true;
  }
  catch(err) {  }
}
function ctdover(e,el) {
  var index = el.className.lastIndexOf(" ");
  var css = el.className.substr(index);
  if (index==-1) index = 0;
  el.className = el.className + " over " + css + "over";
}
function ctdout(e,el) {
  el.className = el.className.substring(0, el.className.indexOf(" over"));
}
function displayDate2date(date) {
  if ((date=="") || (date==null)) return null;
  var d = new Date();
  d.setFullYear(date.substr(6,4));
  d.setDate(date.substr(0,2));
  var str = date.substr(3,2);
  if (str.indexOf("0")==0) str = str.substring(1);
  d.setMonth(parseInt(str)-1);
  return d;
}
function date2displayDate(date) {
  return getDate(date.getDate()) + "." + getDate(date.getMonth()+1) + "." + date.getFullYear();
}
function getDate(str) {
  if (parseInt(str, 10) < 10) str = "0" + parseInt(str, 10);
  return str;
}
function ctdclick(e,el) {
  if (el.tagName=="TD") el.childNodes[0].click();
  cancelEvent(e);
}
