PopCalendar = function(name) {
}

PopCalendar.activeName = null;
PopCalendar.activeInputName = null;
PopCalendar.lastTimeValue = null;
PopCalendar.callbacks = new Array();

PopCalendar.calendarColors = new Array();
PopCalendar.calendarColors['bgColor'] = '#FFFFFF';
PopCalendar.calendarColors['borderColor'] = '#333366';
PopCalendar.calendarColors['headerBgColor'] = '#989490';
PopCalendar.calendarColors['headerColor'] = '#FFFFFF';
PopCalendar.calendarColors['dateBorderColor'] = '#333366';
PopCalendar.calendarColors['dateBgColor'] = '#FFFFFF';
PopCalendar.calendarColors['dateColor'] = '#000000';
PopCalendar.calendarColors['dateHoverBorderColor'] = '#333366';
PopCalendar.calendarColors['dateHoverBgColor'] = '#c0c0E0';
PopCalendar.calendarColors['dateHoverColor'] = '#000000';
PopCalendar.calendarColors['dateSelectedBorderColor'] = '#333366';
PopCalendar.calendarColors['dateSelectedColor'] = '#000000';
PopCalendar.calendarColors['dateSelectedBgColor'] = '#b0b0d0';
PopCalendar.calendarColors['dateTodayColor'] = '#771100';
PopCalendar.calendarColors['dateTodayBgColor'] = '#FFFFFF';
PopCalendar.calendarMonths = new Array('Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpień', 'Wrzesień', 'Październik', 'Listopad', 'Grudzień');
PopCalendar.calendarDays = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
PopCalendar.calendarWeekdays = new Array('N', 'P', 'W', 'Ś', 'C', 'P', 'S', 'N');
PopCalendar.calendarUseToday = true;
PopCalendar.calendarFormat = 'y-m-d';
PopCalendar.calendarStartMonday = true;

PopCalendar.thisDay = null;
PopCalendar.thisMonth = null;
PopCalendar.thisYear = null;
PopCalendar.currentYear = null;
PopCalendar.currentMonth = null;
PopCalendar.currentDay = null;
PopCalendar.currentHour = null;
PopCalendar.currentMinutes = null;

PopCalendar.y2k = function(number) {
    return (number < 1000) ? number + 1900 : number; 
}

PopCalendar.showAtMouse = function(event, name) {
   PopCalendar.show(event.clientX, event.clientY, name);
}

PopCalendar.close = function(event, force) {
   var trg = event.target ? event.target : event.srcElement;
   if (!force && trg.id.indexOf(PopCalendar.activeName) != -1) {
      if (trg.id.indexOf(PopCalendar.activeName+'td') != -1) {
         PopCalendar.sendDate(PopCalendar.thisMonth, trg.innerHTML, PopCalendar.thisYear);
      } else {
         return false;
      }
   }
   var div = getRefToEl('PopCalendar');
   STDLib.removeIframe(div);
   div.style.display = 'none';
   //div.parentNode.removeChild(div);
   
   PopCalendar.activeName = null;
   PopCalendar.activeInputName = null;
   
   eval('removeEvent(document, \'mouseup\', PopCalendar.close);');

   
   return false;
}

PopCalendar.show = function(x, y, name) {
   PopCalendar.activeInputName = name;
   PopCalendar.activeName = name + 'cal';

   var div = getRefToEl('PopCalendar');
   if (div == null) {
      var div = document.createElement('div');
      div.id = 'PopCalendar';
      div.className = 'PopCalendar';
      div.setAttribute('class', 'PopCalendar');
      div.style.display = 'none';
      div.style.position = 'absolute';
      div.style.zIndex = 900;
      div.style.left = '0px';
      div.style.top = '0px';
      div.unselectable = 'on';

      document.body.appendChild(div);
   }
   
   var inp = getRefToEl(name);
   var dateString = inp.value;

   if (dateString != '') {
       tmp_format = PopCalendar.calendarFormat.replace(/m/i, 'mm').replace(/d/i, 'dd').replace(/y/i, 'yyyy').replace(/h/i, 'hh').replace(/i/i, 'ii');
       tmp_yOffset = tmp_format.indexOf('y');
       tmp_mOffset = tmp_format.indexOf('m');
       tmp_dOffset = tmp_format.indexOf('d');
       tmp_hOffset = tmp_format.indexOf('h');
       tmp_iOffset = tmp_format.indexOf('i');

       var today = new Date(dateString.substring(tmp_yOffset, tmp_yOffset + 4), dateString.substring(tmp_mOffset, tmp_mOffset + 2) - 1, dateString.substring(tmp_dOffset, tmp_dOffset + 2), dateString.substring(tmp_hOffset, tmp_hOffset + 2), dateString.substring(tmp_iOffset, tmp_iOffset + 2));

       if ((today == "Invalid Date") || (isNaN(today))) {
           var today = new Date();
       }
   } else {
       var today = new Date();
   }

   var day = today.getDate();
   var year = PopCalendar.y2k(today.getFullYear());
   var month = today.getMonth();

   PopCalendar.currentDay = day;
   PopCalendar.currentYear = year;
   PopCalendar.currentMonth = month;
   PopCalendar.currentHour = today.getHours();
   PopCalendar.currentMinutes = today.getMinutes();
   
   PopCalendar.thisDay = day;
   PopCalendar.thisYear = year;
   PopCalendar.thisMonth = month;
   
   PopCalendar.create(year, month);
   
   if (isIE) {
       var Xpos = document.body.clientWidth - x;
        var Ypos = document.body.clientHeight - y;
    } else {
       var Xpos = window.innerWidth - x;
        var Ypos = window.innerHeight - y;
   }
   
   div.style.display = 'block';
   
    if (Xpos < div.offsetWidth) x = isIE ? document.body.scrollLeft + x - div.offsetWidth : window.pageXOffset + x - div.offsetWidth;
    else x = isIE ? document.body.scrollLeft + x : window.pageXOffset + x;
    if (Ypos < div.offsetHeight) y = isIE ? document.body.scrollTop + y - div.offsetHeight : window.pageYOffset + y - div.offsetHeight;
    else y = isIE ? document.body.scrollTop + y : window.pageYOffset + y;

   div.style.left = x + 'px';
   div.style.top = y + 'px';
   
   STDLib.addIframe(div, true);
   
   eval('addEvent(document, \'mouseup\', PopCalendar.close);');

   div = null;   

   PopCalendar.fresh = false;
}

PopCalendar.create = function(year, month) {
   if (year == null && month == null) {
      var ysel = getRefToEl(PopCalendar.activeName + 'ysel');
      var msel = getRefToEl(PopCalendar.activeName + 'msel');
      
      year = ysel.value;
      month = msel.value;
      PopCalendar.thisYear = year;
      PopCalendar.thisMonth = month;
   }

   var yeararray = new Array();
   var year_cnt = 0;
   
   for (year_cnt = 1; year_cnt <= 21; year_cnt++) {
       yeararray[year_cnt] = PopCalendar.thisYear - 11 + year_cnt;
   }

    var realMonth = parseInt(month) + 1;
    if (realMonth < 10) {
        realMonth = '0' + realMonth;
    }

    var realDate = '';
    var output = '';
       
    var firstDay = new Date(year, month, 1);
    var startDay = firstDay.getDay();
    var weekdayOffset = 0;
    if (PopCalendar.calendarStartMonday) {
        if (startDay) {
           startDay--;
        } else {
           startDay = 6;
        }

        weekdayOffset++;
    }

    if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
        PopCalendar.calendarDays[1] = 29; 
    } else {
        PopCalendar.calendarDays[1] = 28;
    }

    output += '<table class="mainTable" id="'+ PopCalendar.activeName +'tab" border="0" cellspacing="0" cellpadding="0"><tr><td align="left"></td><td align="center">';
    output += '<select id="'+ PopCalendar.activeName +'msel" onchange="PopCalendar.create(null, null);">';
    for (month_cnt = 0; month_cnt < 12; month_cnt++) {
        output += '<option value='+month_cnt;
        if (month_cnt == PopCalendar.thisMonth) {
            output += ' selected';
        }

        output += '>' + PopCalendar.calendarMonths[month_cnt] + '</option>';
    }

    output += '</select><select id="'+ PopCalendar.activeName +'ysel" onchange="PopCalendar.create(null, null);">';
    for (year_cnt = 1; year_cnt <= 21; year_cnt++) {
        output += '<option value="' + yeararray[year_cnt]+'"';
        if (yeararray[year_cnt] == PopCalendar.thisYear) {
            output += ' selected';
        }
        output += '>'+ yeararray[year_cnt]+'</option>';
    }

    output += '</select></td>';
    output += '<td align="right"></td></tr>\n';
    output += '<tr><td colspan="3" valign="top" style="border-right: 1px solid #FFFFFF;">'+
            '<table class="calTable" border="0" cellspacing="0" cellpadding="0" style="background-color:'+ PopCalendar.calendarColors['bgColor'] +'">';
    output += '<tr class="dayofweek" style="background-color: '+ PopCalendar.calendarColors['headerBgColor']+';">';
    for (i = weekdayOffset; i < 7 + weekdayOffset; i++) {
        output += '<th style="font-weight:normal; color:'+ PopCalendar.calendarColors['headerColor']+';">' + PopCalendar.calendarWeekdays[i] + '</th>';
    }

    output += '\n<tr>';

    var column = 0;
    for (i = 0; i < startDay; i++) {
        output += '<td class="empty" style="background-color: '+ PopCalendar.calendarColors['bgColor']+';">&nbsp</td>';
        column++;
    }

    for (i = 1; i <= PopCalendar.calendarDays[month]; i++) {
        realDate = i;
        if (realDate < 10) {
            realDate = '0' + realDate
        }

        if ((i == PopCalendar.currentDay)  && (month == PopCalendar.currentMonth) && (year == PopCalendar.currentYear)) {
            output += '<td id="'+ PopCalendar.activeName +'td" class="selected" style="background-color: '+ PopCalendar.calendarColors['dateSelectedBgColor']+'; color: '+ PopCalendar.calendarColors['dateSelectedColor']+';" onmouseover="" onmouseout="" >';
            output += i + '</td>';
        } else {
            output += '<td id="'+ PopCalendar.activeName +'td" class="date" style="background-color: '+ PopCalendar.calendarColors['dateBgColor']+'; color: '+ PopCalendar.calendarColors['dateColor']+';" onmouseover="PopCalendar.colorize(this,1,\'date\');" onmouseout="PopCalendar.colorize(this,0,\'date\');" >';
           output += i + '</td>';
        }

        column++;
        if (column == 7) {
            output += '</tr>\n<tr>';
            column = 0;
        }
    }

    for(j = PopCalendar.calendarDays[month]; j < 42 - startDay; j++) {
        output += '<td class="empty">&nbsp</td>';
        column++;
        if (column == 7) {
            output += '</tr>\n<tr>';
            column = 0;
        }
    }
    
    PopCalendar.realDate = realDate;
   
   var ifocus = 'this.select();';
   var ikeyup = 'return PopCalendar.verifyTime(event, this);';
   var ikeydown = 'return PopCalendar.verifyTime(event, this);';
   
    output += '</tr></table></td></tr>';

    if (PopCalendar.calendarFormat.indexOf('h') != -1) {
       output += '<tr><td colspan=3 style="padding:2px 0 2 4; border-top: 1px solid #FFFFFF;">Godzina:&nbsp;<input type="text" id="'+ PopCalendar.activeName +'_h" maxlength=2 onfocus="'+ ifocus +'" onkeydown="'+ ikeydown +'" onkeyup="'+ ikeyup +'"  value="'+ PopCalendar.currentHour.toString().expand('0',2) +'"><strong>:</strong><input type="text" id="'+ PopCalendar.activeName +'_m" maxlength=2 onfocus="'+ ifocus +'" onkeydown="'+ ikeydown +'" onkeyup="'+ ikeyup +'"  value="'+ PopCalendar.currentMinutes.toString().expand('0',2) +'"></td></tr>';
    }    
    output += '</table>';
    
    var div = getRefToEl('PopCalendar');
    div.innerHTML = output;
}

PopCalendar.verifyTime = function(event, obj) {
   if (event.type == 'keydown') {
      if (event.keyCode == 27) {
         PopCalendar.close(event, true);
      }
      if (event.keyCode == 13) {
         PopCalendar.close(event, true);
      }
      
         if ((event.keyCode > 95 && event.keyCode < 106) || (event.keyCode > 47 && event.keyCode < 58) || event.keyCode == 8 || event.keyCode == 8 || event.keyCode == 46 || event.keyCode == 110) {
            if (obj.value.length < 3) {
               PopCalendar.lastTimeValue = obj.value;
            }
       } else if (event.keyCode == 13) {
          
       } else if (event.keyCode == 9 || event.keyCode == 39 || event.keyCode == 37) {
          return true;
       } else {
          return false;
       }
   }
   if (event.type == 'keyup') {
      if (obj.id == PopCalendar.activeName+'_h') {
         if (obj.value.length == 1 && parseInt(obj.value) > 2) {
            obj.value = '0' + obj.value;
         } else if (parseInt(obj.value) > 23) {
            obj.value = PopCalendar.lastTimeValue;
         }
         if (obj.value.length == 2) {
            getRefToEl(PopCalendar.activeName+'_m').focus();
         }
      } else if (obj.id == PopCalendar.activeName+'_m') {
         if (obj.value.length == 1 && parseInt(obj.value) > 5) {
            obj.value = '0' + obj.value;
         } else if (parseInt(obj.value) > 59) {
            obj.value = PopCalendar.lastTimeValue;
         }
      }
   }

   return true;
}

PopCalendar.colorize = function(which, toggle, type) {
    if ((document.all) || (document.getElementById)) {
        if (toggle == 1) {
            which.style.color = PopCalendar.calendarColors[type + 'HoverColor'];
            which.style.border = '1px solid '+PopCalendar.calendarColors[type + 'HoverBorderColor'];
            which.style.backgroundColor = PopCalendar.calendarColors[type + 'HoverBgColor'];
        } else {
            which.style.color = PopCalendar.calendarColors[type + 'Color'];
            which.style.border = '1px solid '+PopCalendar.calendarColors[type + 'BgColor'];
            which.style.backgroundColor = PopCalendar.calendarColors[type + 'BgColor'];
        }
    }
}

PopCalendar.registerOnChangeFunc = function(name, func) {
    PopCalendar.callbacks[name] = func;
}

PopCalendar.sendDate = function(month, day, year) {
    month = ++month < 10 ? '0' + month : month;
    day   = day   < 10 ? '0' + day   : day;
    selectedDate = PopCalendar.calendarFormat;
    selectedDate = selectedDate.replace(/m/, month);
    selectedDate = selectedDate.replace(/d/, day);
    selectedDate = selectedDate.replace(/y/, year);
     
    var hour = getRefToEl(PopCalendar.activeName + '_h');
    if (hour != null)  {
       hour = hour.value;
       var minutes = getRefToEl(PopCalendar.activeName + '_m').value;
       selectedDate = selectedDate.replace(/h/, hour.expand('0', 2));
       selectedDate = selectedDate.replace(/i/, minutes.expand('0', 2));
    }

    getRefToEl(PopCalendar.activeInputName).value = selectedDate;
    
    if (typeof(PopCalendar.callbacks[PopCalendar.activeInputName]) == 'function') {
       PopCalendar.callbacks[PopCalendar.activeInputName](selectedDate);
    }
    
    return true;
}