var texts = new Array();
texts['daysInside'] = "Nekteré dny, ktere jste si vybrali jsou již obsazeny";
texts['dayAfter'] = "Musíte vybrat dny, která jsou po sobě\\n - datum od musí být nižší než datum do";
texts['selectedDateBlocked'] = "Vybrané datum je již zamluveno";
texts['pleaseSelectRoom'] = "Nejdříve vyberte pokoj, prosím";
texts['yearIsToFar'] = "Datum je prilis v budoucnu";
texts['tooLargeDistance'] = "Vybrali jste dny, které jsou od sebe příliš vzdálené, nelze zkontrolovat volnost tohoto termínu a také cenu";
jednotka = "Kč";
/**
* DOM-> object for basic document functions
*  gEBI = document.getElementById();
*  gEsBTN = document.getElementsByTagName();
*  cE = document.createElement();
*  aC = p.appendChild(c);
*  rC = p.removeChild(c);
*/
DOM = {
  gEBI: function (id){return document.getElementById(id);},
  gEsBTN: function (name){return document.getElementsByTagName(name);},
  cE: function (tN){return document.createElement(tN);},
  aC: function (p, c){return p.appendChild(c);},
  rC: function (p, c){return p.removeChild(c);}
}
function toogleShow(obj) {
  return obj.style.display = (obj.style.display == "none"?"":"none");
}
var date = 0;
var lastSelected = null;
var datumOd, datumDo;
var returnObj = null;
var calPattern = /([0-9]+)\. ([0-9]+)\. ([0-9]+)/;
function calendarSetDate(obj, dateNumber){
  if(typeof obj == "undefined" || typeof dateNumber == "undefined") {
    return;
  }
  if(typeof room_id == "undefined") {
    alert(texts['pleaseSelectRoom']);
    return;
  }
  if(returnObj == fillDateFrom && !isBlocked(dateNumber, month, year)) {
    datumOd = dateNumber + ". " + month + ". " + year;
  } else if(returnObj == fillDateTo && !isBlocked(dateNumber, month, year)){
    datumDo = dateNumber + ". " + month + ". " + year;
  } else {
    alert(texts['selectedDateBlocked']);
    return ;
  }
  if(hasBlocked()) {
    alert(texts['daysInside']);
    if(returnObj == fillDateFrom) {
      datumOd = null;
    } else {
      datumDo = null;
    }
    return ;
  }
  calcPrice ();
  date = dateNumber;
  if(lastSelected){
    n = lastSelected.className;
    setClass(lastSelected, n.replace("selected", ""));
  }
  setClass(obj, obj.className + " selected");
  lastSelected = obj;
  returnObj();
  if(calPattern.exec(datumOd) && calPattern.exec(datumDo))
    calcPrice();
  toogleShow(DOM.gEBI("calendar"));
}
function calcPrice() {
  //debug("CALCPRICE!!"+(typeof room_id != "undefined") +"&&"+ (typeof calendarDaysCount != "undefined"));
  if(typeof room_id != "undefined" && typeof calendarDaysCount != "undefined") {
    roomPrice = parseInt(roomInfo[room_id].price);
    t = parseInt(DOM.gEBI('extra_bed').value);
    if(t > 0)
      if(DOM.gEBI('extra_bed').checked)
        roomPrice += t;
    DOM.gEBI('price').value = (roomPrice * calendarDaysCount)+ " " + jednotka;
  }
}
function hasBlocked(  ) {
  date1 = datumOd;
  date2 = datumDo;
  if(typeof date1 != "undefined" && typeof date2 != "undefined" && date1!=date2 && checkDays(date1, date2)) {
    if(date1 != date2 && (date1 = calPattern.exec(date1)) && (date2 = calPattern.exec(date2)) ) {
      y2 = date1[3];
      mon = date1[2];
      da = date1[1];
      cnt = 0;
      for(y = y2;y<=y2+2;y++) {
        for(m = mon;m<=12;m++) {
          for(d = da;d<=getDaysCountInMonth(m, y);d++) {
            //debug(d+". "+m+". "+y+"|"+isBlocked(d, m, y2));
            if(cnt > 50) {
              alert(texts['tooLargeDistance']);
              return;
            }
            if(isBlocked(d, m, y)) {
              return true;
            }
            if((d == date2[1] && m == date2[2] && y == date2[3])){
              calendarDaysCount = cnt;
              return false;
            }
            cnt ++ ;
          }
          da = 1;
        }
        mon = 1;
      }
      calendarDaysCount = cnt;
    }
  }
  return false;
}
function getDaysCountInMonth ( monthNumber, yearNumber) {
  if(monthNumber == 1 || monthNumber == 3 || monthNumber == 5 || monthNumber == 7 || monthNumber == 8 || monthNumber == 10 || monthNumber == 12)
    return 31;
  if( monthNumber == 2) {
    if(yearNumber%4 == 0 && (yearNumber % 100 != 0 || yearNumber % 400 == 0))
      return 29;
    return 28;
  }
  return 30;
}
function showCalendar (retFunc) {
  if(typeof room_id != "undefined") {
    ctl = 0;
    resetCalendarSelected(DOM.gEBI("calendar"));
    DOM.gEBI("calendar").style.display = "block";
    returnObj = retFunc;
  } else {
    alert(texts['pleaseSelectRoom']);
  }
}
function updateCalendarHeadings() {
  objs = new Array();
  objs[objs.length] = {"id": "calendarPrevMonth", "type": "monthPrev"};
  objs[objs.length] = {"id": "calendarMonth", "type": "monthHead"};
  objs[objs.length] = {"id": "calendarNextMonth", "type": "monthNext"};
  objs[objs.length] = {"id": "calendarPrevYear", "type": "yearPrev"};
  objs[objs.length] = {"id": "calendarYear", "type": "yearHead"};
  objs[objs.length] = {"id": "calendarNextYear", "type": "yearNext"};
  for(i in objs) {
    obj = objs[i];
    ob = DOM.gEBI(obj.id);
    if(ob) {
      switch (obj.type) {
        case "monthPrev":
          ob.href = "?timestamp="+(Date.DateAdd("m", -1, firstDOWTimestamp.getTime()).getTime()/1000);
          break;
        case "monthHead":
          month = new Date(firstDOWTimestamp.getTime()).getMonth()+1;
          ob.innerHTML = Date.MonthName(month-1);
          break;
        case "monthNext":
          ob.href = "?timestamp="+(Date.DateAdd("m", 1, firstDOWTimestamp.getTime()).getTime()/1000);
          break;
        case "yearPrev":
          ob.href = "?timestamp="+(Date.DateAdd("yyyy", -1, firstDOWTimestamp.getTime()).getTime()/1000);
          break;
        case "yearHead":
          year = new Date(firstDOWTimestamp.getTime()).getYear();
          year = (year< 1000?year + 1900:year);
          ob.innerHTML = year;
          break;
        case "yearNext":
          ob.href = "?timestamp="+(Date.DateAdd("yyyy", 1, firstDOWTimestamp.getTime()).getTime()/1000);
          break;
      }
    } else {
      debug("Object not found!");
    }
  }
}
function changeMonth(where) {
  firstDOWTimestamp = Date.DateAdd("m", where, firstDOWTimestamp.getTime());
  changeCalendar();
}
function changeYear(where) {
  firstDOWTimestamp = Date.DateAdd("yyyy", where, firstDOWTimestamp.getTime());
  changeCalendar();
}
function changeCalendar(){
  resetCalendarSelected();
  updateCalendarHeadings();
  updateCalendarDates();
}
function updateCalendarDates() {
  firstDOW = firstDOWTimestamp.getDay();
  prin = false;
  domDay = 0;
  monthLastDay = Date.DateAdd("d", -1, Date.DateAdd("m", 1, firstDOWTimestamp.getTime())).getDate();
  for(r = 0; r < 6;r++) {
    for(i = 0; i < 7; i++) {
      if((r == 0) && ((i == (firstDOW - 1)) || (i == 6 && firstDOW == 0))) {
        prin = true;
      }
      if(domDay >= monthLastDay){
        prin = false;
      }
      obj = DOM.gEBI("calendarR"+r+"C"+i);
      if (prin) {
        domDay++;
        if(obj){
          obj.innerHTML = domDay;
          if(obj.setAttribute){
            //showTooltip(anchorTooltips.tooltip, this, 'Odkaz vede na jiný server', 0, 300)
            if(isFront) {
              ro = getRooms(domDay);
              if(document.all) {
                obj.mytext = ro[1];
                obj.onmouseover = function (event) { showTooltip(tdTooltips.tooltip, this, this.mytext, 0, 300);};
                obj.onmouseout = function (event) { hideTooltip(); };
              } else {
                obj.removeAttribute("onmouseover");
                obj.removeAttribute("onmouseout");
                obj.setAttribute("onmouseover", "showTooltip(tdTooltips.tooltip, this, '"+ro[1]+"', 0, 300);");
                obj.setAttribute("onmouseout", "hideTooltip();");
              }
              //debug(ro[0]);
              if(ro[0]) {
                if(document.all) {
                  obj.style.color="#CAC";
                  obj.style.className = "blocked";
                } else {
                  obj.setAttribute("class", "blocked");
                  obj.setAttribute("style", "color: #CAC;");
                }
              } else {
                if(document.all) {
                  obj.style.color="#000";
                  obj.style.className = "free";
                } else {
                  obj.setAttribute("class", "free");
                  obj.setAttribute("style", "color: #000;");
                }
              }
            } else if(!isBlocked(domDay, month, year)) {
              obj.setAttribute("class", "free");
              obj.setAttribute("style", "color: #000;");
              if(!isFront) {
                obj.setAttribute("onclick", "calendarSetDate(this, '"+(domDay)+"')");
              }
              if(document.all) {
                obj.style.color="#000";
                //obj.style.cursor = "hand";
                if(!isFront) {
                  obj.onclick = function (event) {calendarSetDate(this, this.innerHTML)};
                }
              }
              //debug("not-blocked!"+domDay);
            } else {
              obj.setAttribute("class", "blocked");
              obj.setAttribute("style", "color: #CCAACC;");
              if(document.all){
                obj.style.color="#CCAACC";
                //obj.style.cursor="auto";
              }
              //debug("blocked!"+domDay);
            }
          } else {
            if(!isBlocked(domDay, month, year)) {
              obj.className = "free";
              obj.style.color = "#000";
              if(!isFront) {
                obj.onclick = "calendarSetDate(this, '"+(domDay)+"')";
              }
            } else {
              obj.className = "blocked";
              obj.style.color = "#CCAACC";
            }
          }
        }
      } else {
        if(obj){
          if(document.all) {
            obj.onclick = function (event) {};
            obj.onmouseout = function (event) {};
            obj.onmouseover = function (event) {};
        } else {
            obj.removeAttribute("onmouseover");
            obj.removeAttribute("onmouseout");
            obj.removeAttribute("onclick");
          }
          obj.innerHTML = "";
        }
      }
    }
  }
  calendarSetDate();
  return true;
}
function getRooms(d) {
  return isBlocked(d, month, year);
}
function isBlocked(day, month, year) {
  out = new Array();
  if(!isFront)
    roomsBlock = roomsBlokace[room_id];
  else {
    roomsBlock = roomsBlokace;
  }
      retu = false;
  if(roomsBlock) {
    for(roomsI = 0; roomsI < roomsBlock.length;roomsI++) {
      blokace = roomsBlock[roomsI];
      patt = /([0-9]+)-([0-9]+)-([0-9]+) [0-9]+:[0-9]+:[0-9]+/;
      if((dateFrom = patt.exec(blokace.dateFrom)) && (dateTo = patt.exec(blokace.dateTo))) {
        dateToT = new Array();
        dateToT[1] = dateTo[3];dateToT[2] = dateTo[2];dateToT[3] = dateTo[1];dateTo = dateToT;
        dateFromT = new Array();
        dateFromT[1] = dateFrom[3];dateFromT[2] = dateFrom[2];dateFromT[3] = dateFrom[1];dateFrom = dateFromT;
        if( ( (
                (mr(day) >= mr(dateFrom[1]))
                && (mr(month) == mr(dateFrom[2]))
                && (mr(year) == mr(dateFrom[3]))
              )  //pocatecni den je ve stejnem mesici
              || (
                (mr(month) > mr(dateFrom[2]))
                && (mr(year) == mr(dateFrom[3]))
              ) // pocatecni den je v predeslem mesici
              || (
                mr(year) > mr(dateFrom[3])
              ) // pocatecni den je v predeslem roku
            ) && ( (
                (mr(day)<=mr(dateTo[1]))
                && (mr(month) == mr(dateTo[2]))
                && (mr(year) == mr(dateTo[3]))
              ) //konecny den je ve stejnem mesici
              || (
                mr(month) < mr(dateTo[2])
                && (mr(year) == mr(dateTo[3]))
              )  // konecny den je v nasledujicim mesici
              || (
                mr(year) < mr(dateTo[3])
              ) // konecny den je v nasledujicim roku
            )
        ) {
          retu = true;
          if(isFront)
            out.push("<span class=\\'error\\'>"+roomInfo[blokace.room_id].name + " není volná"+"</span>");
          else
            return true;
        }
      }
    }
  }
  //debug(day+". "+month+". "+year+": !isBlocked");
  if(isFront) {
    ret = new Array();
    ret[0] = retu;
    ret[1] = day+"."+month+"."+year+"<br />"+ (out.length > 0 ? out.join("<br />") : "<"+"span class=\\'info\\'>"+'Pokoje jsou volne'+"<"+"/"+"span>");
    return ret;
  }
  return false;
}
function mr(t) {
  return Math.round(t);
}
Date.MonthNames = ['Leden','Únor','Březen','Duben','Květen','Červen','Červenec','Srpen','Září','Říjen','Listopad','Prosinec'];
Date.MonthName = function(p_Month, p_Abbreviate){
  if(isNaN(p_Month)){ // v0.94- compat: extract real param from passed date
    if(!Date.CDate(p_Month)){ return "invalid month: '" + p_Month + "'";  }
    p_Month = DatePart("m", Date.CDate(p_Month));
  }

  var retVal = Date.MonthNames[p_Month];
  if(p_Abbreviate==true){ retVal = retVal.substring(0, 3) } // abbr to 3 chars
  return retVal;
}
Date.IsDate = function(p_Expression){
  return !isNaN(new Date(p_Expression));    //review further
}
Date.CDate = function(p_Date){
  if(Date.IsDate(p_Date)){ return new Date(p_Date); }

  var strTry = p_Date.replace(/\-/g, '/').replace(/\./g, '/').replace(/ /g, '/'); // fix separators
  strTry = strTry.replace(/pm$/i, " pm").replace(/am$/i, " am");  // and meridian spacing
  if(Date.IsDate(strTry)){ return new Date(strTry); }

  var strTryYear = strTry + '/' + new Date().getFullYear(); // append year
  if(Date.IsDate(strTryYear)){ return new Date(strTryYear); }


  if(strTry.indexOf(":")){  // if appears to have time
    var strTryYear2 = strTry.replace(/ /, '/' + new Date().getFullYear() + ' ');  // insert year
    if(Date.IsDate(strTryYear2)){ return new Date(strTryYear2); }

    var strTryDate = new Date().toDateString() + ' ' + p_Date;  // pre-pend current date
    if(Date.IsDate(strTryDate)){ return new Date(strTryDate); }
  }

  return false; // double as looser IsDate
  //throw("Error #13 - Type mismatch"); // or is this better?
}
Date.DateAdd = function(p_Interval, p_Number, p_Date){
  if(!Date.CDate(p_Date)){  return "invalid date: '" + p_Date + "'";  }
  if(isNaN(p_Number)){  return "invalid number: '" + p_Number + "'";  }

  p_Number = new Number(p_Number);
  var dt = Date.CDate(p_Date);

  switch(p_Interval.toLowerCase()){
    case "yyyy": {
      dt.setFullYear(dt.getFullYear() + p_Number);
      break;
    }
    case "q": {
      dt.setMonth(dt.getMonth() + (p_Number*3));
      break;
    }
    case "m": {
      dt.setMonth(dt.getMonth() + p_Number);
      break;
    }
    case "y":     // day of year
    case "d":     // day
    case "w": {   // weekday
      dt.setDate(dt.getDate() + p_Number);
      break;
    }
    case "ww": {  // week of year
      dt.setDate(dt.getDate() + (p_Number*7));
      break;
    }
    case "h": {
      dt.setHours(dt.getHours() + p_Number);
      break;
    }
    case "n": {   // minute
      dt.setMinutes(dt.getMinutes() + p_Number);
      break;
    }
    case "s": {
      dt.setSeconds(dt.getSeconds() + p_Number);
      break;
    }
    case "ms": {  // JS extension
      dt.setMilliseconds(dt.getMilliseconds() + p_Number);
      break;
    }
    default: {
      return "invalid interval: '" + p_Interval + "'";
    }
  }
  return dt;
}
var ctl = 0
function resetCalendarSelected(parentObj){
  for(r = 0; r<7;r++){
    for(c = 0; c<7;c++){
      obj = DOM.gEBI("calendarR"+r+"C"+c);
      if(obj && obj.className.indexOf("selected"))
        setClass(obj, obj.className.replace("selected", ""));
    }
  }
}
/**
  * debug() displays it's parameter to page
*/
var debugObj;
function debug(){
  if(!debugObj){
    if(!DOM.gEBI("debug")){
      if(typeof document.appendChild == "function") {
        debugObj = DOM.cE("DIV");
        debugObj.id = "debug";
        DOM.aC(document.body, debugObj);
      } else{
        DOM.gEsBTN("BODY")[0].innerHTML += "<"+"div id=\"debug\"></div>";
        debugObj = DOM.gEBI("debug");
      }
    } else {
      debugObj = DOM.gEBI("debug");
    }
  }
  str = "";
  for(di=0;di<arguments.length;di++){
    str += ( str.length > 0 ? ", " : "" ) +  arguments[di];
  }
  debugObj.innerHTML += "D: "+str+"<br />";
}
function setClass(obj, cn) {
  if(obj.setAttribute && !document.all){
    obj.setAttribute("class", cn);
  } else {
    obj.className = cn;
  }
}
function fillDateFrom (){
  obj = DOM.gEBI("calendarDateFrom");
  obj.value = date+". "+month+". "+year;
}
function fillDateTo (){
  obj = DOM.gEBI("calendarDateTo");
  obj.value = date+". "+month+". "+year;
}
function checkDays(dateFrom , dateTo){
  if((da1 = calPattern.exec(dateFrom)) && (da2 = calPattern.exec(dateTo))){
    if((parseInt(da1[1])<parseInt(da2[1]) && (parseInt(da1[2]) == parseInt(da2[2])) && (parseInt(da1[3]) == parseInt(da2[3]))) || (parseInt(da1[2]) < parseInt(da2[2]) && (parseInt(da1[3]) == parseInt(da2[3]))) || (parseInt(da1[3]) < parseInt(da2[3]))){
      return true;
    }
    alert(texts['dayAfter']);
  }
  return false;
}
function updateCal(rid) {
  room_id = rid;
  if(rid.length > 0)
  updateCalendarDates();
  if(roomInfo[room_id].extra_bed.length != 0 && roomInfo[room_id].extra_bed != 0) {
    DOM.gEBI("extra_bed_row").style.display = "block";
    DOM.gEBI("extra_bed").value = roomInfo[room_id].extra_bed;
  } else
    DOM.gEBI("extra_bed_row").style.display = "none";
}
function updateMyText(obj, typ, val) {
  if(typ == "focus"){
    if(obj.value == val) {
      obj.value = "";
    }
  }
  if(typ == "blur") {
    if(obj.value == "") {
      obj.value = val;
    }
  }
}
