function DateSelector(form_input, id_name, lang){

   this.mesice = new Array('Leden',
                            'Únor',
                            'Březen',
                            'Duben',
                            'Květen',
                            'Červen',
                            'Červenec',
                            'Srpen',
                            'Září',
                            'Říjen',
                            'Listopad',
                            'Prosinec');
   this.dny = new Array('Po',
                        'Út',
                        'St',
                        'Čt',
                        'Pá',
                        'So',
                        'Ne');

  if (lang == 'ru') {
     this.mesice = new Array('январь',
                              'февраль',
                              'март',
                              'апрель',
                              'май',
                              'июнь',
                              'июль',
                              'август',
                              'сентябрь',
                              'октябрь',
                              'ноябрь',
                              'декабрь');
     this.dny = new Array('по',
                          'вт',
                          'ср',
                          'че',
                          'пя',
                          'су',
                          'не');  
  }

  if (lang == 'en') {
     this.mesice = new Array('January',
                              'February',
                              'March',
                              'April',
                              'May',
                              'June',
                              'July',
                              'August',
                              'September',
                              'October',
                              'November',
                              'December');
     this.dny = new Array('Mo',
                          'Tu',
                          'We',
                          'Th',
                          'Fr',
                          'Sa',
                          'Su');  
  }
  if (lang == 'de') {
     this.mesice = new Array('Januar',
                              'Februar',
                              'März',
                              'April',
                              'Mai',
                              'Juni',
                              'Juli',
                              'August',
                              'September',
                              'Oktober',
                              'November',
                              'Dezember');
     this.dny = new Array('Mo',
                          'Di',
                          'Mi',
                          'Do',
                          'Fr',
                          'Sa',
                          'So');  
  }
  this.lang = lang;
  this.id_name = id_name;
  this.form_input = document.getElementById(form_input);
  this.mesic = 0;
  this.rok = 0;

  // ikonka
  date_sel_pic = document.createElement('img');
  date_sel_pic.src = date_sel_img.src;
  date_sel_pic.className = "date-sel-image";
  date_sel_pic.style.verticalAlign = 'text-bottom';
  if (lang == 'cz') {
    date_sel_pic.alt = 'výběr data z kalendáře';
    date_sel_pic.title = 'výběr data z kalendáře';
  }
  else if (lang == 'en') {
    date_sel_pic.alt = 'select date from calendar';
    date_sel_pic.title = 'select date from calendar';
  }
  else if (lang == 'de') {
    date_sel_pic.alt = 'Kalendar';
    date_sel_pic.title = 'Kalendar';
  }
  date_sel_pic.date_selector = this.id_name;
  date_sel_pic.onclick = this.popupDateSelector;

  // vykreslime ikonku
  this.form_input.parentNode.appendChild(date_sel_pic);  
   
  // div obalujici kalendar
  var dateSelectorDiv = document.createElement('div');
  dateSelectorDiv.className = "date-sel-div";
  dateSelectorDiv.style.display = 'none';
  dateSelectorDiv.id = "date_sel_div"+this.id_name;
  
  // vlozime div do stranky
  obj = document.getElementsByTagName('body')[0];
  obj.insertBefore(dateSelectorDiv, obj.firstChild);
 
  this.date_selector_div = document.getElementById("date_sel_div"+this.id_name);
 
  // vykresli tabulku
  this.updateTable();  
}

DateSelector.prototype.popupDateSelector = function() {
  obj = eval(this.date_selector);
  parent_obj = document.getElementsByTagName('body')[0]; 
  obj.date_selector_div.style.zIndex = '100';
  obj.date_selector_div.style.left = parseInt(get_x_offset(this)-get_x_offset(parent_obj)+21-170)+'px';
  obj.date_selector_div.style.top = parseInt(get_y_offset(this)+20)+'px';
  // zobrazime
  obj.date_selector_div.style.display = (obj.date_selector_div.style.display == 'block') ? 'none' : 'block'; 
}

DateSelector.prototype.insertIntoForm = function(den){
  this.form_input.value = den + '.' + (parseInt(this.mesic)+1) + '.' + this.rok;
  this.date_selector_div.style.display = 'none';
}

DateSelector.prototype.updateTable = function(rok, mesic){

   // neni zadan mesic nebo rok
   if (typeof(rok) == 'undefined' || typeof(mesic) == 'undefined') {
      // prevezmeme z inputu
      date_regexp = /^([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})$/;
      if(this.form_input.value != '' && date_regexp.test(this.form_input.value)) {
         parts = date_regexp.exec(this.form_input.value);
         rok = parts[3];
         mesic = parts[2]-1;
      }
      // nebo vyplnime soucasne datum
      else { 
         new_date = new Date();
         rok = new_date.getFullYear();
         mesic = new_date.getMonth();
      }
   } 

   // dnesni datum - pro zvyrazneni bunky s dnesnim datem
   dnes_date = new Date();
   dnes_mesic = dnes_date.getMonth();
   dnes_rok = dnes_date.getFullYear();
   dnes_den = dnes_date.getDate();

   this.mesic = mesic;
   this.rok = rok;
   
   output = '';  
   // krizek pro zavreni
   close_title = 'zavřít';
   if (this.lang == 'de') close_title = 'schliessen';
   if (this.lang == 'en') close_title = 'close';
   if (this.lang == 'ru') close_title = 'закрыть';
   output += '<a title="'+close_title+'" class="close-button" onmouseover="this.className=\'close-button-over\'" onmouseout="this.className=\'close-button\'" onclick="'+this.id_name+'.date_selector_div.style.display = \'none\';">×</a>';

   // horni vyber
   output += '<span class="topselect">';
   // vyber mesice
   output += '<select style="display: inline;" size="1" onchange="'+this.id_name+'.updateTable('+this.rok+',parseInt(this.value))">';
   for(i = 0; i < this.mesice.length; i++) {
     output += '<option value="'+i+'"';
     if (i == this.mesic) output += ' selected="selected"';
     output += '>'+this.mesice[i]+'</option>';
   }
   output += '</select>';
   // vyber roku
   output += '<span onmouseover="this.className=\'date-year-over\'" onmouseout="this.className=\'date-year\'" class="date-year" onclick="'+this.id_name+'.updateTable('+(this.rok-1)+','+this.mesic+')">&lt;</span><span class="year-text">&nbsp;'+this.rok+'&nbsp;</span><span class="date-year" onmouseover="this.className=\'date-year-over\'" onmouseout="this.className=\'date-year\'"  onclick="'+this.id_name+'.updateTable('+(parseInt(this.rok)+1)+','+this.mesic+')">&gt;</span>';
   output += '</span>';

   // kalendar - tabulka   
   output += '<table><tr>';
   
   // nazvy dni
   for(i = 0; i < this.dny.length; i++){
   	output += '<th>' + this.dny[i] + '</th>';
   }
   output += '</tr>';
   
   den_offset = new Date(rok, mesic, 1).getDay();
   if (den_offset == 0) den_offset = 7; // nedele
   den_outset = new Date(rok, mesic+1, 0).getDate();
      
   den_tyden = 0;	
   for(i = 1; i < den_offset; i++){
   	output += '<td onmouseover="this.style.cursor=\'default\'">&nbsp;</td>';
   	den_tyden++;
   }
   
   for(i = 1; i <= den_outset; i++){
      if (den_tyden == 7) { // nedele
   		   output += '</tr><tr>';
   			den_tyden = 0;
   	}
   	den_tyden++;
      // dnesni den zvyraznime
   	td_class = (dnes_rok == rok && dnes_mesic == mesic && dnes_den == i) ? 'date-today' : '';
      output += '<td class="'+td_class+'" onmouseover="this.className=\'date-over\'" onmouseout="this.className=\''+td_class+'\'" onclick="'+this.id_name+'.insertIntoForm('+i+')">'+i+'</td>';
   }
   
   for(i = den_tyden; i < 7; i++) {
      output += '<td onmouseover="this.style.cursor=\'default\'">&nbsp;</td>';
   }
   output += '</tr></table>';

   // dole primy vyber dnesniho dne
   output += '<span class="date-direct" onmouseover="this.className=\'date-direct-over\'" onmouseout="this.className=\'date-direct\'"  onclick="'+this.id_name+'.rok = '+dnes_rok+'; '+this.id_name+'.mesic = '+dnes_mesic+'; '+this.id_name+'.updateTable('+dnes_rok+','+dnes_mesic+'); '+this.id_name+'.insertIntoForm('+dnes_den+')">'+dnes_den+'.'+(dnes_mesic+1)+'.'+dnes_rok+'</span>';
   this.date_selector_div.innerHTML = output;  
}

function get_x_offset(obj){
  var x = 0;
  if(obj.offsetParent){
    while(obj.offsetParent){
      x += obj.offsetLeft;
      obj=obj.offsetParent;
    }
  }
  else if(obj.x) x += obj.x;
  return parseInt(x);
}

function get_y_offset(obj){
  var y =0;
  if(obj.offsetParent){
    while(obj.offsetParent){
      y +=obj.offsetTop
      obj=obj.offsetParent;
    }
  }
 else if(obj.y) y += obj.y;
  return parseInt(y);
}