/** Common Library functions **/

function Library_getInputValue(formItem, name) {
  var i;
  var ret = false;
  formItem = Library_getParentNodeByTagName(formItem, 'FORM');
  if (formItem) {
    var inputs = formItem.getElementsByTagName('INPUT');
    for (i = 0; i < inputs.length; i++) {
      if (
          (inputs[i].type != 'radio') &&
          (inputs[i].type != 'checkbox') &&
          (inputs[i].name == name)
         ) {
        ret = inputs[i].value;
        break;
      }
    }
  }

  return ret;
}

function Library_getRadioValue(formItem, name) {
  var i;
  var ret = false;
  formItem = Library_getParentNodeByTagName(formItem, 'FORM');
  if (formItem) {
    var inputs = formItem.getElementsByTagName('INPUT');
    for (i = 0; i < inputs.length; i++) {
      if (
        (inputs[i].type == 'radio') &&
        (inputs[i].checked) &&
        (inputs[i].name == name)
        ) {
        ret = inputs[i].value;
        break;
      }
    }
  }

  return ret;
}

function Library_setRadioValue(obj, value) {
  var i;
  var ret = false;
  var formItem = Library_getParentNodeByTagName(obj, 'FORM');
  var name = obj.name;
  if (formItem) {
    var inputs = formItem.getElementsByTagName('INPUT');
    for (i = 0; i < inputs.length; i++) {
      if (
        (inputs[i].type == 'radio') &&
        (inputs[i].name == name)
        ) {
          inputs[i].checked = (inputs[i].value == value);
          if (inputs[i].value == value) ret = true;
      }
    }
  }
  return ret;
}

function Library_setSelectValue(obj, value){
  if (!obj) return false;
  var index = -1;
  for (var i = 0; i < obj.options.length; i++){
    if (obj.options[i].value.toUpperCase() == value.toUpperCase()){//shoda na hodnotu
      index = i;
      break;
    }
    if ((index == -1) && (obj.options[i].innerHTML.toUpperCase() == value.toUpperCase())){ // shoda na popisek
      index = i;
    }
  }
  obj.selectedIndex = index;
  return (index != -1);
}

function Library_getFormItemValue(obj){
  var i;
  var ret = false;
  if (obj.tagName == 'INPUT'){
    switch (obj.type){
      case 'radio':
        if (!obj.name) {
            Library_debugAlert('Radio button has no name:'+obj.id);
            return null;
        } //TODO: osetrit
        return Library_getRadioValue(obj, obj.name);
      case 'checkbox':
        return obj.checked ? obj.value : null;
      case 'text':
      case 'hidden':
      default:
        return obj.value; 
    }
  } 
  if (obj.tagName == 'SELECT'){
    return obj.options[obj.selectedIndex].value;
  } 
  if (obj.tagName == 'TEXTAREA') {
    return obj.innerHTML;
  }
  Library_debugAlert('Unhandled type of object:'+obj.tagName);
  return null;
}

function Library_setValue(obj, value, onlyToEmpty){// vraci, zda-li doslo k nastaveni hodnoty
    if (!obj) return false;
    if (obj.tagName == 'INPUT'){
      switch (obj.type){
        case 'radio':
          if (!obj.name) {
            Library_debugAlert('Radio button without definition of name:'+obj.id);
            return false;
          }
          return Library_setRadioValue(obj, value);
        case 'checkbox':
          return element.checked = value ? true : false;
        case 'text':
        default:
          if (onlyToEmpty && (obj.value != '')) return false;
          obj.value = value;
          return true; 
      }
    }
    if (obj.tagName == 'SELECT'){
      if (onlyToEmpty && (obj.selectedIndex != -1) && (trim(obj.options[obj.selectedIndex].value) != '')) return false;
      return Library_setSelectValue(obj, value);
    }
    if (obj.tagName == 'TEXTAREA') {
      if (onlyToEmpty && (trim(obj.innerHTML) != '')) return false;
      obj.innerHTML = value;
      return true;
    }
    return false;
}

function Library_getFormValues(elForm, implodeUrl, filtrName, replace){
  if (!elForm) return false;
  var pars = new Object();
  var inps = elForm.elements;
  for (var i = 0; i < inps.length; i++) {
    var nam = inps[i].name;
    if (!nam || inps[i].type == 'button' || inps[i].type == 'submit' || inps[i].disabled) continue;    
    if (filtrName && nam.indexOf(filtrName) == -1) continue;
    if (replace || replace === ''){
      nam = nam.substring(0,nam.indexOf(filtrName))+replace+nam.substring(nam.indexOf(filtrName) + filtrName.length);
    }
    pars[nam] = Library_getFormItemValue(inps[i]);
  }
  if (!implodeUrl) return pars;
  else {
    var res = '';
    for (var n in pars){
      if (pars[n] !== null){
        res += '&'+n+'='+pars[n];
      }
    }
    return res;
  }
}

function Library_addClass(el, cl) {
  el.className += (el.className ? ' ' : '') + cl;
}

function Library_removeClass(el, cl) {
  var classesOld = el.className.split(' ');
  var classesNew = new Array();
  var i;
  
  for (i in classesOld) {
    if (classesOld[i] != cl) {
      classesNew.push(classesOld[i]);
    }
  }
  el.className = classesNew.join(' ');
}

function Library_hasClass(element, classes, separator){
    var sep =  separator ? separator : ' ';
    var parts = element.className.split(sep);
    if (!classes) return parts;
    for (var index in parts){
      if (parts[index] == classes) return true; 
    }
    return false;
}

function Library_getParentNodeByTagName(element, name) {
  element = element.parentNode;
  while (element && element.nodeName != name) {
    element = element.parentNode;
  }
  return element;
}

function Library_getNextSiblingByTagName(element, name, count) {
  if (!count) { count = 1; }
  do {
    element = element.nextSibling;
    if (element && element.nodeName == name) { count--; }
  } while (element && ((element.nodeName != name) || (count != 0)));
  return element;
}

function Library_getPreviousSiblingByTagName(element, name) {
  element = element.previousSibling;
  while (element && element.nodeName != name) {
    element = element.previousSibling;
  }
  return element;
}

function Library_getFirstChildByTagName(element, name) {
  element = element.firstChild;
  while (element && element.nodeName != name) {
    element = element.nextSibling;
  }
  return element;
}

function Library_getElementAttributes(element){
  var w = document.getElementById('dumpElement'+element.id);
  if (!w){
    w = document.createElement('table');
    w.setAttribute('id', 'dumpElement'+element.id);
//    element.parentNode.appendChild(w);    
    }
  w.nodeValue = '';
  var row = document.createElement('tr');
  var thD = document.createElement('th');
  var tdD = false;
  var tdC = false;
  thD.innerHTML = 'Description';
  var thC = document.createElement('th');
  thC.innerHTML = 'Contain';
  row.appendChild(thD);
  row.appendChild(thC);
  w.appendChild(row);
  for (var a in element){
    row = document.createElement('tr');
    tdD = document.createElement('td');
    tdD.innerHTML = a;
    row.appendChild(tdD);
    tdC = document.createElement('td');
    tdC.innerHTML = ''+element[a];
    row.appendChild(tdC);
    w.appendChild(row);
  }
  return w;
}

  function Library_getOffsetTop(el) {
    var offsetTop = 0;
    if (el.offsetParent) {
      offsetTop = el.offsetTop;
      el = el.offsetParent;
      while (el) {
        offsetTop += el.offsetTop;
        el = el.offsetParent;
      }
    }                                     
    return offsetTop;
  }

  function Library_getOffsetLeft(el) {
    var offsetLeft = 0;
    if (el.offsetParent) {
      offsetLeft = el.offsetLeft;
      el = el.offsetParent;
      while (el) {
        offsetLeft += el.offsetLeft;
        el = el.offsetParent;
      }
    }                                     
    return offsetLeft;
  }

  function Library_getComputedStyle(el) {
   if (window.getComputedStyle) {
     return window.getComputedStyle(el, null);
   } else {
     return el.currentStyle;
   }
  }

  function Library_isPositioned(el) {
   var position = Library_getComputedStyle(el).position;
   return (position != '') && (position != 'static');
  }

//function returns date if date is valid or false if date is invalid (czech date format)
function Library_isValidDate(string, isBirthDate) {
   var parsedDate = string.split (".");
   if (parsedDate.length != 3) return false;
   var day, month, year;
   month = (parsedDate[1]-1);
   day = parsedDate[0];
   year = parsedDate[2];

   var objDate = new Date (year,month,day);
   if (month != (objDate.getMonth())) return false;
   if (day != objDate.getDate()) return false;
   if (year != objDate.getFullYear()) return false;

   if (objDate && isBirthDate) {
     var chk = new Date();
     return (chk.getFullYear() - 100) < objDate.getFullYear();
   }

   return objDate;
}

function Library_insertAfter(newElement, targetElement) {
  var daddy = targetElement.parentNode;
  if (daddy.lastChild == targetElement) {
    daddy.appendChild(newElement);
  }
  else {
    daddy.insertBefore(newElement, targetElement.nextSibling);
  } 
}

function Library_replaceNode(new_node, old_node) {
  var daddy = old_node.parentNode;
  var next_sibling = old_node.nextSibling;
  daddy.removeChild(old_node);
  if (daddy.lastChild == old_node) {
    daddy.appendChild(new_node);
  }
  else {
  daddy.insertBefore(new_node,next_sibling);
  }
}

function Library_insertTemplateVar(string,template,temp_content) {
  return string.replace("{"+template+"}",temp_content)
}

function Library_purge(d) {
    var a = d.attributes, i, l, n;
    if (a) {
        l = a.length;
        for (i = 0; i < l; i += 1) {
            n = a[i].name;
            if (typeof d[n] === 'function') {
                d[n] = null;
            }
        }
    }
    a = d.childNodes;
    if (a) {
        l = a.length;
        for (i = 0; i < l; i += 1) {
            Library_purge(d.childNodes[i]);
        }
    }
}

function Library_getFormElementsByName(sName, sForm){
  if (!sForm) sForm = this;
  while (sForm && sForm.tagName != "FORM")sForm = sForm.parentNode; 
  var res = new Array();
  for (var i = 0; i < sForm.elements.length; i++){
    if (sForm.elements[i].name && sForm.elements[i].name == sName){
      res.push(sForm.elements[i]);
    }
  }
  return res;
}

function trim(str, chars) {
    return ltrim(rtrim(str, chars), chars);
}

function ltrim(str, chars) {
    chars = chars || "\\s";
    return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

function rtrim(str, chars) {
  chars = chars || "\\s";
  return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

function Library_length(ar){
  var i = 0;
  for (var k in ar){
    i++;
  } 
  return i;
}

function Library_inArray(ar, val){
  for (var k in ar){
    if (ar[k] == val) return k;
  } 
  return false;
}

function Library_join(ar, delimiter, includeZero){
  if (!delimiter) delimiter = '';
  var text = '';
  for (var i in ar){
    if (!ar[i] && (!includeZero || (ar[i] !== 0 && ar[i] !== '0' && ar[i] !== "0"))) continue;
    text += (text == '' ? '' : delimiter) + ar[i];
  }
  return text;
}

function Library_unset(ar, index){
  delete ar[index];
  return ar;
}

function Library_ReplaceHolders(value, placeHolders){
  var nVal = value;
  for (var i in placeHolders){
    var re = new RegExp("\{"+i+"\}", "g");
    nVal = nVal.replace(re, placeHolders[i]);
    re = null;
  }
  return nVal;
}

function Library_addEvent(obj, evType, fn, useCapture){
  if (obj.addEventListener){
    obj.addEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn);
    return r;
  } else {
    alert("Handler could not be attached");
    return false;
  }
}

function Library_debugMessage(message, delimiter){
  if (!window.debugMessageEl){
    if (!window.debugMessageId) window.debugMessageId = 'debugDiv';
    window.debugMessageEl = document.getElementById(window.debugMessageId);
    if (!window.debugMessageEl && false) {
      window.debugMessageEl = document.createElement('div');
      window.debugMessageEl.innerHTML = '';
      window.debugMessageEl.id = window.debugMessageId;
      var b = document.getElementsByTagName('body');
      b[0].appendChild(window.debugMessageEl);
    }
  }
  if (!delimiter) delimiter = "<br />";
  if (window.debugMessageEl) window.debugMessageEl.innerHTML += delimiter + message;
}

function Library_debugAlert(message, type){
  if(!type) type = "error";
  var consoleDefinition = typeof(console) != "undefined";
  if(type=="error") {
    if (!consoleDefinition) {
      if (window.debug) alert('console:'+message);
    } else {
      console.error(message);
    }
  }
  else if(type=="warning" && consoleDefinition) {
    console.warn(message);
  }
  else if(type=="info" && consoleDefinition) {
    console.info(message);
  }
  else if(type=="debug" && consoleDefinition) {
    console.debug(message);
  }
}

/*******************************************************************
 * F U N K C E  pro manipulaci s casti linku H A S H (target)      *
 *******************************************************************
 * zakazane parametry:
 * @ oddelovac parametru
 * | oddelovac prvku neidexovaneho pole
 * . v nazvu atributu adresovani objektu
 * momentalne neumi ukladat hodnotu 0, tento parametr preskakuje
 */
function UrlHash(){
    this.get = function(index){
      // pokud se pouziva zamek hashe a neni primo nastavovana location.hash
      if (this.alternativeHashSource instanceof Array){
        if (index) return this.alternativeHashSource[index] ? this.alternativeHashSource[index] : false;
        else return this.alternativeHashSource;
      }
      var a = new Array();
      var str = location.hash.toString();
      if (str && str.substring(0,1) == '#') str = str.substring(1);
      if (!str || str == this.defaultEmptyValue) return index ? false : a;
      if (str == this.lastHash) a = this.lastHashAry;
      else Library_getObjectByPath(str, this.urlByArrays, a, this.itemSeparator, this.arraySeparator, this.objectPathSeparator);
      return index ? false/*polozka nenalezena*/ : a;
    };
    this.set = function(a){
      if (!(a instanceof Array)) return false;
      this.isModifiedHash = true;
      if (this.blockSettingHash){
        this.alternativeHashSource = a;
        return true;
      }
      var h = Library_getPathByObject('', a, this.objectPathSeparator, this.itemSeparator, this.arraySeparator);
      this.isModifiedHash = false; // zmena vypropagovana->dulezite pri zamceni uprav
      if (h == this.lastHash) return false;
      if (!h) h = this.defaultEmptyValue;
      if (this.saveHistoryChangesToHash){
        // funkcionalitu pro IE je potreba realizovat skryty IFrame
        location.hash = h;
      } else {
        location.replace('#'+h); //problem s chovani v IFrame
      }
      this.lastHash = h;
      this.lastHashAry = a;
      this.setStorage(h);
      return true;
    };

    this.setStorage = function(h, skipSave/*preskok ajaxoveho ulozeni*/){
      //zajistuje ukladani hodnot do formularu a tim propagaci do historie
      if (!this.itemsStoringHash){
        this.itemsStoringHash = new Array();
        if (this.hashSourceName){
          var stor = null;
          var forms = document.getElementsByTagName('form');
          for (var iForm = 0; iForm < forms.length; iForm++){
            stor = Library_getFormElementsByName(this.hashSourceName, forms[iForm]);
            if (stor[0]) stor = stor[0];
            else {
              stor = document.createElement('input');
              stor.type = 'hidden';
              stor.name = this.hashSourceName;
              forms[iForm].appendChild(stor);
            }
            this.itemsStoringHash.push(stor);
          }
          if (this.itemsStoringHash[0] && this.ajaxActualization) {
            this.itemsStoringHash[0].actualizeHash = this.ajaxActualization;
          }
        }
      }
      // mechanizmus pro ulozeni Hash pro odesilani pres formulare
      for (var iItem in this.itemsStoringHash){
        if (this.itemsStoringHash[iItem]) this.itemsStoringHash[iItem].value = h;
      }
      if (!skipSave && this.itemsStoringHash[0] && this.itemsStoringHash[0].actualizeHash) this.itemsStoringHash[0].actualizeHash(h); // AJAXOVA REGISTRACE
      forms = null; stor = null;
      return true;
    };

    this.modify = function(key, val, plus){ // vraci, zda doslo ke zmene hash
      // Pozor: pri definovani indexu, jez jsou imlicitnimi metodami tridy array, v IE6 nedojde k jejich vraceni, napr: index => sort
      // vraci false pokud nedojde ke zmene Hash
      if (plus){
        return this.add(key, val, plus == 2);
      } else {
        return this.remove(key, val);
      }
    };
    this.add = function(key, val, replace, source){
      // vraci, zda doslo ke zmene hash
      // Pozor: pri definovani indexu, jez jsou imlicitnimi metodami tridy array, v IE6 nedojde k jejich vraceni, napr: index => sort
      // vraci false pokud nedojde ke zmene Hash
      var a = source ? source : this.get();
      if (Library_setIndexByPath(val, a, key, this.objectPathSeparator, replace)){
        return this.set(a);
      }
      return false;
    };
    this.remove = function(key, val, source){
      // pri specifikovani val hleda val v neindexovanem poli
      var a = source ? source : this.get();
      if (Library_removeIndexByPath(val, a, key, this.objectPathSeparator)){
        return this.set(a);
      }
      return false;
    };
    this.saveToHistory = function(val){
      val = !!val;
      this.saveHistoryChangesToHash = val;
    };
    this.lock = function(lockKey){ // umoznuje vicestupnove zamykani
      if (this.blockSettingHash) return false;
      this.alternativeHashSource = this.get();
      this.blockSettingHash = 'lock'+lockKey;
      this.isModifiedHash = false;
      return true;
    };
    this.unlock = function(lockKey){
      if (this.blockSettingHash != 'lock'+lockKey) return false;
      this.blockSettingHash = false;
      if (this.isModifiedHash){
        this.set(this.alternativeHashSource);
      }
      this.alternativeHashSource = false;
      return true;
    };
    this.ajaxActualizationHandler = function(hash, frame){
      // prida se k prvnimu formularovamu elementu
      // na zaklade upravy hashe provede aktualizaci historie
      if (!window.Library_ajaxRequest) return false;
      var url = '';
      if (this.ajaxUrl){
        url = this.ajaxUrl;
      } else {
        url = location.href;
        if (url.indexOf('?') != -1) url = url.substring(0, url.indexOf('?'));
      }
      var separator = (url.indexOf('?') == -1) ? '?' : '&';
      url  = url + separator + 'action=eAjaxSetTarget' +
        (frame ? '&frame='+frame : '')+
        '&'+this.hashSource+'=' +hash;
      Library_ajaxRequest('actualizeHash', url, Library_ajaxHashActualizationResultHandler, this, 0, 1);
      return true;
    };
    this.onloadPrepare = function(){
      window.urlHash.lastHash = location.hash;
      window.urlHash.lastHashAry = window.urlHash.get();
      window.urlHash.setCheckIntervalDelay(window.urlHash.checkIntervalDelay);
      if (!location.hash) return false;
      window.urlHash.setStorage(location.hash.substring(1)); // pri zadavani do linku musi dojit k automatizovanemu zpracovani
      return true;
    };
    this.modifyByHash = function(){
      if (this.changingByHash || this.blockSettingHash || !this.isChanged()) return false;
      this.changingByHash = true;
      if (this.onModifyByHashHandler){
         var hashAry = this.get();
         var appendedAry = Library_arrayMissing(this.lastHashAry, hashAry);
         var removedAry = Library_arrayMissing(hashAry, this.lastHashAry);

         if (Library_lengthNoEmpty(removedAry) + Library_lengthNoEmpty(appendedAry) > 0){
            this.onModifyByHashHandler(appendedAry, removedAry);
            this.lastHash = location.hash;
            this.lastHashAry = hashAry;
         }
      }
      this.changingByHash = false;
      return true;
    };
    this.isChanged = function(){
      var h = location.hash.toString();
      return (this.isEmpty(this.lastHash) != this.isEmpty(h)) || (this.lastHash && this.lastHash != h);
    };
    this.isEmpty = function(val){
      return (!val) || (val == '#') || (val == this.defaultEmptyValue) || (val == '#'+this.defaultEmptyValue);
    }
    this.setOnModifyByHashHandler = function(handle){
      this.onModifyByHashHandler = handle;
    };
    this.setCheckIntervalDelay = function(secs){// nulovym casem se vypne
      //if (this.checkIntervalDelay != secs && this.checkInterval) return false;
      this.checkIntervalDelay = secs;
      if (this.checkInterval) window.clearInterval(this.checkInterval);
      if (this.checkIntervalDelay) this.checkInterval = window.setInterval('window.urlHash.modifyByHash();', this.checkIntervalDelay);
      return true;
    };
/*local function for array operations*/
  function Library_getIndexByPath(ary, path, del){
    if (!del) del = '.';
    if (path.indexOf(del) >= 0){
      var key = path.substring(0, path.indexOf(del));
      if (Library_isObject(ary[key])) return Library_getIndexByPath(ary[key], path.substring(path.indexOf(del)+del.length), del);
      else return null;
    } else {
      if (Library_isDefined(ary[path])) return ary[path];
      else return null;
    }
  }

/*otazka resit vlozeni hodnoty null, "" a false jako remove ? */
  function Library_setIndexByPath(value, ary, path, del, repl){
    if (!del) del = '.';
    var change = false;
    //if (!ary) ary = new Object();
    if (path.indexOf(del) >= 0){
      var key = path.substring(0, path.indexOf(del));
      if (!Library_isObject(ary[key])) {
        ary[key] = isNaN(ary*1) ? new Object() : new Array();
      }
      change = Library_setIndexByPath(value, ary[key], path.substring(path.indexOf(del)+del.length), del, repl);
    } else {
      if (Library_isEmpty(path)) return false;
      if (Library_isEmpty(ary[path])){
        ary[path] = value;
        change = true;
      } else if(ary[path] != value){
        if (repl){
          ary[path] = value;
          change = true;          
        } else {//append
          var subcase = false;
          if (Library_isEmpty(value)) return false; //souvisi s uvodni otazkou
          if (!Library_isObject(value)) value = [value];
          if (!Library_isObject(ary[path])) ary[path] = [ary[path]];
          var saArr = Library_hasSubArray(ary[path]);
          var saVal = Library_hasSubArray(value);
          if (saArr != saVal){
            Library_debugAlert('Unknown way to merge unindexed and indexed array');
          } else if(saArr/* && saVal*/){/* pokud se merguji hluboka pole */
            for (subcase in value){
              if (Library_setIndexByPath(value[subcase], ary[path], subcase, del, repl)) change = true;
            }
          } else {
            for (subcase in value){
              if (Library_inArray(ary[path], value[subcase]) === false){
                if (Library_isEmpty(value[subcase])) continue;
                ary[path].push(value[subcase]);
                change = true;
              }
            }
          }
        }
      }
    }
    return change;
  }

  function Library_removeIndexByPath(value, ary, path, del){
    /*snazi se v poli hledat cestu,
      je-li zadana hodnota, hledaji ve vysledku, jinak odstrani vysledek */
    if (!del) del = '.';
    if (Library_isEmpty(path)) return false;
    var change = false;
    var key = path.toString();
    if (key.indexOf(del) >= 0){
      key = key.substring(0, path.indexOf(del));
      if (Library_isObject(ary[key])) {
        change = Library_removeIndexByPath(ary[key], path.substring(path.indexOf(del)+del.length), del);
      }
    } else {
      if (ary[key]){
        if (value){//hleda pouze konkretni hodnotu
          if (Library_isObject(ary[key])){
            var index = Library_inArray(ary[key], value);
            if (index !== false){
              Library_unset(ary[key], index);
              change = true;
            }
          } else if(ary[key] == value){
            ary[key] = null;
            change = true;
          }
        } else {
          ary[key] = null;
          change = true;
        }
      }
    }
    if (Library_isEmpty(ary[key]) || (Library_isObject(ary[key]) && Library_lengthNoEmpty(ary[key])==0)){
      Library_unset(ary, key); // odstraneni posledniho
    }
    return change;
  }

  function Library_getObjectByPath(path, likeAry, ary, delPar, delSplit, del){
    if (!ary) ary = new Object();
    if (!del) del = '.';
    if (!delPar) delPar = '@';
    if (!delSplit) delSplit = '|';

    if (!path) return null;
    var parts = false;
    var subparts = false;

    if (path.indexOf(delPar))
      parts = path.split(delPar);
    else
      parts = [path];

    for (var i in parts){
      if (parts[i].indexOf('=')>=0)
        subparts = parts[i].split('=', 2);
      else
        subparts = [path, true];
      var val = subparts[1];
      //TODO: problem s urceni, zda jde o retezec
      if (val && val.indexOf && val.indexOf(delSplit) >= 0){
        subparts[1] = val.split(delSplit);
      }
      if (likeAry && !(subparts[1] instanceof Array)) subparts[1] = [subparts[1]];
      Library_setIndexByPath(subparts[1], ary, subparts[0], del);
    }
    return ary;
  }

  function Library_getPathByObject(path, ary, del, delPar, delSplit){
    if (!del) del = '.';
    if (!delPar) delPar = '@';
    if (!delSplit) delSplit = '|';
    if (!path) path = '';
    var val = '';
    //if (!ary) ary = new Object();
    if (!Library_isObject(ary) || Library_lengthNoEmpty(ary) == 0) return val;
    if (!Library_hasSubArray(ary)){// pro neindexovane pole neobsahujici dalsi pole
      return path+"="+Library_join(ary, delSplit, true);
    }
    for (var a in ary){
      if (!Library_isDefined(ary[a])) continue;
      if (Library_isObject(ary[a])){
        val += (val ? delPar : '')+Library_getPathByObject(path+(path ? del : '')+a, ary[a], del, delPar, delSplit);
      } else {
        val += (val ? delPar : '')+(path ? path+del : '')+a+(ary[a] !== true ? ("="+ary[a]) : '');
      }
    }
    return val;
  }

  function Library_arrayMissing(ary1, ary2){ // vraci co chybi ary1 vuci ary2
    var missPar = [];
    if (ary1 == ary2) return missPar;
    if (!Library_isObject(ary1)){
      if (!Library_isObject(ary2)) return [ary2];
      else {
        missPar = ary2;
        var index = Library_inArray(missPar, ary1);
        if (index !== false) Library_unset(missPar, index);
        return missPar;
      }
    }
    if (Library_isObject(ary2)){
      for (var i in ary2){
        if ((i in ary1) && (ary1[i] == ary2[i])) continue;
        if (isNaN(i*1) || Library_isObject(ary2[i])){ // indexovane pole
          var ni = i in ary1 ? Library_arrayMissing(ary1[i], ary2[i]) : ary2[i];
          if (Library_lengthNoEmpty(ni)){
            missPar[i] = ni;
          }
        } else { // neindexovane pole
          if (!Library_isObject(ary2[i])){
            if (Library_inArray(ary1, ary2[i]) === false){
              missPar.push(ary2[i]);
            }
          }
        }
      }
      return missPar;
    } else return [ary2];
  }

  function Library_hasSubArray(ary){ //TODO: co s polem type reference: a[55555] = 1; ??
    if (Library_isObject(ary)){// pro neindexovane pole neobsahujici dalsi pole
      for (var a in ary){
        if (Library_isObject(ary[a]) || isNaN(a*1)){
          return true;
        }
      }
    } else {
      Library_debugAlert('This value cannot be used instead of Object in hasSubArray');
    }
    return false;
  }

  function Library_lengthNoEmpty(o){ /* pocita neprazdne prvky pole*/
    var len = 0;
    if (!Library_isObject(o)) return Library_isEmpty(o) ? 0 : 1;
    for (var i in o){
      len += Library_lengthNoEmpty(o[i]) ? 1 : 0;
    }
    return len;
  }

  function Library_isObject(val){
    return (val instanceof Object && !(val instanceof String));
  }

  function Library_isDefined(val){ // povoluje jakoukoli definovanou hodnotu
    return (typeof(val) != "undefined" && val !== null);
  }

  function Library_isFunction(val){
    return (typeof(val) == "function");
  }

  function Library_isEmpty(val){ // povazuje string 0 i cislo 0 za spravny obsah
    return (!val && val !== '0' && val !== "0" && val !== 0);
  }

  this.onModifyByHashHandler = false;
  this.checkIntervalDelay = 1000; //interval pro zjistovani zmen v Hash
  this.defaultEmptyValue = "USED";
  this.isModifiedHash = false;
  this.changingByHash = false;
  this.saveHistoryChangesToHash = false;
  this.blockSettingHash = false;
  this.hashSource = "__hashSource";
  this.hashSourceName = false; // polozky formulare pro ukladani hashe
  this.alternativeHashSource = false; //pro ukladani stavu hashe v prubehu zamceni
  this.itemsStoringHash = false; // kolekce elementu pro ukladani hashe
  this.lastHash = false;
  this.lastHashAry = false;

  this.itemSeparator = "@";
  this.arraySeparator = "|";
  this.objectPathSeparator = ".";
  this.urlByArrays = true;

  if (window.Library_prepareUrlHash) Library_prepareUrlHash(this);
  //automatic for add action onload
  Library_addEvent(window, 'load', this.onloadPrepare, false);
}

window.urlHash = new UrlHash();
/*******************************
 *        datove konverze      *
 *******************************/

function Library_parseHumanDate(value, inFormat, forceValue){
  /* return res.month 1-12, res.day 1-31*/
  var res = {'year': false, 'month': false, 'day': false, 'format': false};
  var d_arr = null;
  if (!inFormat){
    if (value.indexOf(".") != -1) {
      d_arr = value.split(".");
      res.day = d_arr[0] && !isNaN(d_arr[0]*1) ? d_arr[0] : false;
      res.month = d_arr[1] && !isNaN(d_arr[1]*1) ? d_arr[1] : false;
      res.year = d_arr[2] && !isNaN(d_arr[2]*1) ? d_arr[2] : false;
      res.format =  'd.m.Y';
      res.separator = '.';
    } else if(value.indexOf("-") != -1) {
      d_arr = value.split("-");
      res.year = d_arr[0] && !isNaN(d_arr[0]*1) ? d_arr[0] : false;
      res.month = d_arr[1] && !isNaN(d_arr[1]*1) ? d_arr[1] : false;
      res.day = d_arr[2] && !isNaN(d_arr[2]*1) ? d_arr[2] : false;
      res.format =  'Y-m-d';
      res.separator = '-';    
    } else if(value.indexOf("/") != -1) {
      d_arr = value.split("/");
      res.month = d_arr[0] && !isNaN(d_arr[0]*1) ? d_arr[0] : false;
      res.day = d_arr[1] && !isNaN(d_arr[1]*1) ? d_arr[1] : false;
      res.year = d_arr[2] && !isNaN(d_arr[2]*1) ? d_arr[2] : false;
      res.format =  'm/d/Y';
      res.separator = '/';    
    } else if(value.indexOf("_") != -1) {
      d_arr = value.split("_");
      res.year = d_arr[0] && !isNaN(d_arr[0]*1) ? d_arr[0] : false;
      res.month = d_arr[1] && !isNaN(d_arr[1]*1) ? d_arr[1] : false;
      res.day = d_arr[2] && !isNaN(d_arr[2]*1) ? d_arr[2] : false;
      res.format =  'Y_m_d';      
      res.separator = '_';
    }
  } else {
    res.format = inFormat;
    var con = new Array();
    res.separator = false;
    for (var iLet = 0; iLet < inFormat.length; iLet++){ //parsovani formatu
      switch (inFormat.charAt(iLet)){
        case 'y':
        case 'Y':
          con.push('year');
          break;
        case 'm':  
        case 'M':  
          con.push('month');
          break;        
        case 'd':  
        case 'D':  
          con.push('day');
          break;        
        case '-':  
        case '/':  
        case '.':  
        case '_':  
          res.separator = inFormat.charAt(iLet);
          break;        
        default:
          break;        
      }
    }
    if (con && res.separator){ //parsovani hodnoty
      d_arr = value.split(res.separator);
      for (var i = 0; i < d_arr.length; i++){
        if (!con[i] || isNaN(d_arr[i]*1)) continue;
        res[con[i]] = d_arr[i]*1;
      }
    }
  }

  if (forceValue){
    if (forceValue.year) res.year = forceValue.year;
    if (forceValue.month || forceValue.month === 0) res.month = forceValue.month+1;/*vstup 0..11*/
    if (forceValue.day) res.day = forceValue.day;
  }
  
  if (inFormat) format = inFormat;
  if (res.year<100){// prevod year -> full Year
    if (res.year>=70) res.year += 1900;
    else res.year += 2000;
  }
  return res;
}
/* pozor na  problemy typu:
     31.5.2009 -> 1.6.2009
     10.2.2009 -> 30.4.2009  
*/
function Library_getHumanToDate(value, params){
  if (!params) params = new Array();
  var dateVal = params.defaultDate ? params.defaultDate : new Date();
  var dateAry = Library_parseHumanDate(value, params.format, params.forceValue);
  var day = dateAry.day;
  var month = dateAry.month - 1;
  var year = dateAry.year;
  var checkDate = null;

  if ((year !== false && !isNaN(year * 1) && (year > 0))
    && (month !== false && !isNaN(month * 1) && (month>=0))
    && (day !== false && !isNaN(day * 1) && (day >=0))){ // existuje-li datum zadane uplne
    
    checkDate = new Date(year, month-1, day);
    if (year == checkDate.getFullYear() && month-1 == checkDate.getMonth() && day == checkDate.getDate()){
      dateVal = Library_setDateLimits(year, month , day , dateVal, params.minimalDate, params.maximumlDate);
      return dateVal;      
    }    
  } else if ((month !== false && !isNaN(month * 1) && (month>=0))
    && (day !== false && !isNaN(day * 1) && (day >=0))){ // existuje-li datum bez specifikace roku
    checkDate = new Date(dateVal.getFullYear(), month-1, day);
    if (month-1 == checkDate.getMonth() && day == checkDate.getDate()){
      dateVal = Library_setDateLimits(dateVal.getFullYear(), month , day , dateVal, params.minimalDate, params.maximumlDate);
      return dateVal;  
    }
  }

  checkDate = new Date(dateVal);
//  checkDate.setDate(1); // viz problemy v zakladu -> vyreseno dosazenim, 31.3.09 -> false.4.09 => 31.3.09, ale nyni 31.4. = 1.5.09
  
  var useYear = false;
  var useMonth = false;
  var useDay = false;
  var checksDate = null;

  if (year !== false && !isNaN(year * 1) && (year > 0)){
    checkDate.setFullYear(year);
    useYear = true;
  }
  if (month !== false && !isNaN(month * 1) && (month>=0)){
    checksDate = new Date(checkDate);
    checksDate.setMonth(month);
    if (month*1 == checksDate.getMonth()){ // proti 13.mesici etc.
      checkDate = checksDate;
      useMonth = true;
    }
  }
  if (day !== false && !isNaN(day * 1) && (day >=0)){
    checksDate = new Date(checkDate);
    checksDate.setDate(day);
    if (day*1 == checksDate.getDate()){ // proti 30.2. etc.
      checkDate = checksDate;
      useDay = true;
    }
  }    
    
  dateVal = Library_setDateLimits(useYear ? year : false, useMonth ? month : false, useDay ? day : false, dateVal, params.minimalDate, params.maximumlDate);
  return dateVal;
}

function Library_setDateLimits(y,m,d, defaultDate, minDate, maxDate){
  var checkDate = new Date(defaultDate);
  var validSet = ['d','m','y'];
  if (minDate && checkDate < minDate) return minDate;
  if (maxDate && checkDate > maxDate) return maxDate;
  
  for (var iSet = validSet.length; iSet>0; iSet--){
    var resDate = null;
    if (iSet == validSet.length && y !== false && m !== false && d !== false){
      resDate = new Date(y,m,d);
    } else {
      resDate = new Date(defaultDate);
      for (var iDate = 0; iDate < iSet; iDate++){
        if (validSet[iDate] == 'y'){
          if (y !== false)
            resDate.setFullYear(y);
        }
        if (validSet[iDate] == 'm'){
          if (m !== false)
            resDate.setMonth(m);
        }
        if (validSet[iDate] == 'd'){
          if (d !== false)
            resDate.setDate(d);
        }
      }
    }
    for (var i = iSet; i < validSet.length; i++){ // vybalancovani do rozsahu
      if (validSet[i] == 'd'){
        if (minDate && resDate < minDate) resDate.setDate(minDate.getDate());
        else if (maxDate && resDate > maxDate) resDate.setDate(maxDate.getDate());
      }
      if (validSet[i] == 'm'){
        if (minDate && resDate < minDate){ 
          resDate.setMonth(minDate.getMonth());
          if (resDate < minDate) resDate.setMonth(minDate.getMonth()+1);
        } else if (maxDate && resDate > maxDate){
          resDate.setMonth(maxDate.getMonth());
          if (resDate > maxDate) resDate.setMonth(maxDate.getMonth()-1);
        }
      }
      if (validSet[i] == 'y'){
        if (minDate && resDate < minDate){ 
          resDate.setMonth(minDate.getFullYear());
          if (resDate < minDate) resDate.setFullYear(minDate.getFullYear()+1);
        } else if (maxDate && resDate > maxDate){
          resDate.setMonth(maxDate.getFullYear());
          if (resDate > maxDate) resDate.setFullYear(maxDate.getFullYear()-1);
        }
      }
    }
    if ((!minDate || resDate >= minDate) && (!maxDate || resDate <= maxDate)) return resDate;
  }
  return false;
}

function Library_checkHumanDate(value, params){ // pokud je v poradku, vrati true, jinak vraci navrhovanou opravu
  if (!params) params = new Array();
  var dateVal = Library_getHumanToDate(value, params); // vcetne aplikace ohraniceni
  var dateAry = Library_parseHumanDate(value, params.format, params.forceValue);

  var day = dateAry.day;
  var month = dateAry.month - 1;
  var year = dateAry.year;

  if (year === false || isNaN(year * 1) || (year < 0) || year != dateVal.getFullYear()){
    return Library_getDateToHuman(dateVal, dateAry.format);
  }
  if (month === false || isNaN(month * 1) || (month < 0) || month != dateVal.getMonth()){
    return Library_getDateToHuman(dateVal, dateAry.format);
  }
  if (day === false || isNaN(day * 1) || (day < 0) || day != dateVal.getDate()){
    return Library_getDateToHuman(dateVal, dateAry.format);
  }    
  return false;
}

function Library_getDateToHuman(dat, format){
  if (!format) format = 'd.m.Y';
  if (!(dat instanceof Date)) return '';
  var res = '';
  var oper = '';
  var last = false;
  for (var i = 0; i < format.length; i++){
    oper = format.substring(i,i+1);
    if (oper == last) continue;
    switch (oper){
      //cas
      case 'h': res += dat.getHours() % 12; break;// 0-12
      case 'H': res += dat.getHours(); break;// 0-23
      case 'i': res += dat.getMinutes(); break;
      case 's': res += dat.getSeconds(); break;
      case 'a': res += dat.getHours()<12 ? 'am' : 'pm'; break;
      case 'A': res += dat.getHours()<12 ? 'AM' : 'PM'; break;
      //datum
      case 'Y': res += dat.getFullYear(); break;
      case 'y': res += dat.getYear(); break;
      case 'm': res += (dat.getMonth() < 9 ? '0' : '')+(dat.getMonth()+1); break;
      case 'j': res += dat.getMonth()+1; break;
      case 'd': res += (dat.getDate() < 10 ? '0' : '')+dat.getDate(); break;
      case 'n': res += dat.getDay(); break;
      case 'w': res += dat.getDay(); break;
      default: res += oper;
    }
    last = oper;
  }
  return res;
}

function Library_compareDates(part, date1, date2, supposedVal, isGreater){
  var today = new Date(date1);
  var secDate = new Date(date2);
  if (!part) part = '';
  switch (part.toUpperCase()){
    case 'Y':
      Library_resetTime(secDate, 'Y');
      Library_resetTime(today, 'Y');
      if (supposedVal || supposedVal !== 0) today.setFullYear(supposedVal);
    break;
    case 'M':
       Library_resetTime(secDate, 'M');
       Library_resetTime(today, 'M');
       if (supposedVal || supposedVal !== 0) today.setMonth(supposedVal);
    break;
    case 'D':
    case '':
       Library_resetTime(secDate, 'D');
       Library_resetTime(today, 'D');
       if (supposedVal || supposedVal !== 0) today.setDate(supposedVal);
    break;
    case 'Y-M-D':
    case 'D.M.Y':
       var separ = false;
       if (part.toUpperCase() == 'Y-M-D') separ = '-';
       if (part.toUpperCase() == 'D.M.Y') separ = '.';
       Library_resetTime(secDate, 'D');
       Library_resetTime(today, 'D');
       if (supposedVal) {
          supposedVal = supposedVal.split(separ);
          if ((supposedVal.length != 3) || isNaN(1*supposedVal[0]) || isNaN(1*supposedVal[1]) || isNaN(1*supposedVal[2])){
            Library_debugAlert('bad type for new Enter of date for compare');
            return false;
          } else {
            today.setFullYear(supposedVal[0]);
            today.setMonth(supposedVal[1]);
            today.setDate(supposedVal[2]);
          }
       }
    break;
    default:
      Library_debugAlert('unrecognized part of date for compare:'+part);
      return false;
    break;
  }
  return isGreater ? today > secDate : today < secDate;
}

function Library_resetTime(date, part){
  date.setHours(0, 0, 0, 0);
  if (!part || part == "D") return date;
  date.setDate(1);
  if (part == "M") return date;
  date.setMonth(1);
  return date;
}

/********************/
function Library_getStyle(x,styleProp)
{
	if (x.currentStyle)
		var y = x.currentStyle[styleProp];
	else if (window.getComputedStyle)
		var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp);
	return y;
}
/** Ajax Library functions **/

var LibraryVar_ajaxRequests = new Array();
var LibraryVar_ajaxRequestsObjects = new Array();
var LibraryVar_ajaxRequestsPostData = new Array();

function Library_ajaxRequest(type, url, handler, element, delay, post) {
  var httpRequest = false;
  post = post ? 1 : 0;
  var postData = null;

  if (post) {
    var urlDataStart = url.indexOf('?');
    if (urlDataStart > -1) {
      postData = url.substring(urlDataStart + 1, url.length);
      url = url.substring(0,urlDataStart);
    }
  }

  if (window.XMLHttpRequest) {
    httpRequest = new XMLHttpRequest();
    if (httpRequest.overrideMimeType) {
      httpRequest.overrideMimeType('text/xml');
    }
  } else if (window.ActiveXObject) { 
    try {
      httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {
        alert('Problem with generating ajax request');
      }
    }
  }
  if (httpRequest) {
    var ident = Math.random();
    LibraryVar_ajaxRequests[type] = ident;
    LibraryVar_ajaxRequestsObjects[type] = httpRequest;
    LibraryVar_ajaxRequestsPostData[ident] = postData;
    httpRequest.onreadystatechange = function () { handler(httpRequest, type, ident, element); };
    httpRequest.open(post ? 'POST' : 'GET', url, true);
    if (!delay) {
      Library_ajaxRequestSend(httpRequest, post, postData);
    } else {
      window.setTimeout("Library_ajaxRequestDelayed('"+ type +"','"+ ident +"',"+ post +");", delay);
    }
    return ident;
  }
  return false;
}

function Library_ajaxRequestDelayed(type, ident, post) {
  if (LibraryVar_ajaxRequests[type] == ident) {
    Library_ajaxRequestSend(LibraryVar_ajaxRequestsObjects[type], post, LibraryVar_ajaxRequestsPostData[ident]);
  }
}

function Library_ajaxRequestSend(httpRequest, post, postData) {
  httpRequest.setRequestHeader("X-Requested-With", "XMLHttpRequest");/* usable for debug infos */
  if (post) {
    httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    httpRequest.setRequestHeader("Content-length", postData.length);
//    httpRequest.setRequestHeader("Connection", "close");
  }
  httpRequest.send(postData);
}

function Library_ajaxUrlEncode(val) {
  var ret = val.toString();
  return encodeURIComponent(ret);
}

function Library_ajaxHashActualizationResultHandler(httpRequest, type, ident, element) {
  if (httpRequest.readyState == 4 && LibraryVar_ajaxRequests[type] == ident) {
    if (httpRequest.status == 200) {
      var errors = httpRequest.responseXML.getElementsByTagName('error');
      if (errors.length) {
        for (var i = 0; i < errors.length; i++){
          alert(errors[i].nodeValue);
        }
      }
      
      LibraryVar_ajaxRequests[type] = null;
      LibraryVar_ajaxRequestsObjects[type] = null;  
    }
  }
}

/**
 * Generuje kalandar v iframe puvodne urceny pro Zazemi projektu AO
 * pripina se automaticky k elementu input s tridou dle Library_getClassName(), v defaultu "date"
 * tento element musi byt editovatelny text, nebo musi mit tridu setByButton, s tim ze se kalendar vyvolava tlacitkem
 * pro modifikace iframu se pouziva metoda MyIframeCalendarModification(iframe)
 */
if (!window.calendarSet) window.calendarSet = new Object();
window.calendarSet.keepAlive = 0;
window.calendarSet.onChangeUnset = 0;
window.calendarSet.flag = [];
window.calendarSet.navChange = 0;
window.calendarSet.keyInput = null;
window.calendarSet.idPrefix = 'zaoCalendar';
window.calendarSet.classPrefix = 'zaoCalendar_';
window.calendarSet.dayTag = 'div';// td nepodporuje v IE udalosti mysi a proto je v nem potreba vlozit tag

/*
NOTE: 
doladit defaultDate, 
dodelat dopocitavani rozmeru -> problemy s IE
*/

function Library_CalendarHandlerAdd() {
  var inputs = document.getElementsByTagName('INPUT');
  window.calendarSet.counter = 0;
  for (var i = 0; i < inputs.length; i++){
    if (Library_hasClass(inputs[i],Library_getClassName(),' ') 
      && ((inputs[i].type == 'text' && !Library_isReadOnly(inputs[i])) /* editovatelny textovy prvek*/
         || Library_hasClass(inputs[i], 'setByButton'))){ /* element, editovvatelny pouze kalendarem "externe" */
      inputs[i].onfocus = Library_setCalendarHandler;
      inputs[i].onblur = Library_unsetCalendarTimeoutHandler;
      inputs[i].onchange = Library_unsetCalendarHandler;
      inputs[i].onkeyup = Library_updateCalendarHandler;
      inputs[i].validate = Library_validateCalendarValue;
      inputs[i].setAttribute('autocomplete','off');
      if (!inputs[i].defaultDate && inputs[i].value) {
        inputs[i].defaultDate = Library_setInputCalendarDate(inputs[i].value);
      }
      if (window.Library_CalendarHandlerExternalAdd) Library_CalendarHandlerExternalAdd(inputs[i]);
    }
  }
}

function Library_updateCalendarHandler(e) {
  if (!e) e = window.event
  if (!(e.keyCode>=37 && e.keyCode<=40)){
    var old = new Date(window.calendarSet.today);
    window.calendarSet.flag = [];
    window.calendarSet.today = Library_setInputCalendarDate(this.value);//dopocitavaci fce
 //   if (old == window.calendarSet.today) return;
    if (old){
      window.calendarSet.keyInput = this;
    }
    Library_setIFrame(this);
  }
}

function Library_unsetCalendarTimeoutHandler(e) {
  if  (window.calendarSet.navChange != 1) window.calendarSet.flag = [];
  if (window.calendarSet.keepAlive == 0) {
    window.calendarSet.unseting = window.setTimeout("Library_unsetCalendar('"+this.id+"');",500);
  }
}
function Library_unsetCalendarTimeoutHandlerClick(el) {
  Library_unsetCalendar(el.id);
}

/*HANDLERS*/
function Library_setCalendarHandler(e) {
//DEBUGGER document.body.insertBefore(document.createElement("div").appendChild(document.createTextNode(window.keepAlive)),document.body.firstChild);
  var flag = window.calendarSet.flag;
  if (window.calendarSet.unseting){
    clearTimeout(window.calendarSet.unseting);
  }
  if (window.calendarSet.keyInput && window.calendarSet.keyInput.id != this.id){
    Library_unsetCalendar(window.calendarSet.keyInput.id);
  }// zniceni predchoziho kalendare pokud existoval
  if (flag.month==0 && flag.prevMonth == 11) {
    flag.year++;
  }
  else if (flag.month==0 && flag.prevMonth == -1) {
   // flag.year;
  }

  if (this.value == '') {
    var date_today = Library_getDefaultDate();
    var month = (flag.month>=0) ? flag.month : date_today.getMonth();
    var year = flag.year ? flag.year : date_today.getFullYear();
    var day = flag.day ? flag.day : date_today.getDate(); 
    var date = new Date(year, month, day);
    window.calendarSet.today = date;
    window.calendarSet.keyInput = this;
  }
  else { //zadani datumu z input elementu
    window.calendarSet.today = Library_setInputCalendarDate(this.value);
// format typu d.m.y
    window.calendarSet.keyInput = this;
  }
  if (flag.year >= 0 || flag.month >= 0) {
    Library_setIFrame(this)
  }
  else {  
    if (window.calendarSet.counter == 0)
      Library_setCalendar(this);
    else if (window.calendarSet.counter == 1) {
      Library_unsetCalendar(this.id);
      Library_setCalendar(this);
    }
  }
}

function Library_validateCalendarValue(){
  var params = {'defaultDate': Library_getDefaultDate(),
                'minimalDate': Library_getMinimalDate(),
                'maximumDate': Library_getMaximumDate(),
                'format': this.format};
  return Library_checkHumanDate(this.value, params);
}

function Library_setInputCalendarDate(value, force){// force preskoci prioritu flagu
    var params = new Object();
    params.defaultDate = new Date(Library_getDefaultDate());
    params.forceValues = (force ? false : window.calendarSet.flag);
    params.minimalDate = Library_getMinimalDate();
    params.maximumlDate = Library_getMaximumDate();
    return Library_getHumanToDate(value, params);
}

function Library_unsetCalendarHandler(e) {
  if (window.calendarSet.onChangeUnset == 1)
    Library_unsetCalendar(this.id);
}

function Library_setIFrameHandler(e) {
  Library_setIFrame(this);
}

/*FUNCTIONS*/
function Library_isReadOnly(input) {
  return input.readOnly;
}
function Library_setCalendar(tag) {
  window.calendarSet.counter++;
  var rodic = tag.parentNode;
  if (!Library_hasClass(rodic, "showCalendarDiv")) Library_addClass(rodic, "showCalendarDiv");
  var div_iframe = document.createElement("div");
  div_iframe.id = "iframe_div_"+tag.id;
  div_iframe.className = "iframe_div_calendar";
  var iframe = document.createElement("IFRAME");
  iframe.frameBorder = 0;
  iframe.name = "inline_frame_"+tag.id;
  iframe.id = "inline_frame_"+tag.id;
  iframe.scrolling = "no";
  iframe.className = "iframe_calendar";
  iframe.tabIndex = "9999";
  
  Library_setIFrameSource(iframe);
  if (window.MyIframeCalendarModification) MyIframeCalendarModification(iframe);
  Library_setIFrameHeight(iframe);
  Library_setIFrameWidth(iframe);
  iframe.onload = Library_setIFrameHandler;
  iframe.onreadystatechange = Library_setIFrameHandler;
  iframe.defaultDate = tag.defaultDate;
  rodic.appendChild(div_iframe);
  div_iframe.appendChild(iframe);
  var doc;
  if (iframe.contentDocument) {
    doc = iframe.contentDocument; 
  } else {
    doc = iframe.contentWindow.document;
  }
  doc.open();
  doc.write('<?xml version="1.0" encoding="utf-8" ?>'+"\n"+'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'+"\n"+
'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs"><head><link href="'+Library_getCSS()+'" rel="stylesheet" type="text/css" /></head><body></body></html>');
  doc.close();
/*  if (!tag.defaultDate && tag.value) {
    tag.defaultDate = Library_setInputCalendarDate(tag.value);
  }
*/
//    Library_recountOffset();

}

function Library_setIFrame(tag) {
  var pw = this;
  var pwSet = pw.calendarSet;
  var f = false;
  var frame = false;
  if (tag.tagName == 'INPUT') {
    tag = document.getElementById("inline_frame_"+tag.id);
  }
  if (tag.tagName == 'IFRAME'){
    if (tag.contentDocument) {
      frame = tag.contentDocument;
    } else {
      frame = tag.contentWindow.document;
    }
    f = tag.contentWindow;
  }            
  window.calendarSet.fdoc = frame;
  var ifr_body = frame.body;
  if (! ifr_body) return false;
  ifr_body.id = "iframe_body";
  ifr_body.tagId = tag.id;
    
  f.Library_setIFrameCloseHandler = function() {
      var pw = this.parent.window;
      var pwSet = pw.calendarSet;
      pw.Library_unsetCalendar(pwSet.keyInput.id);
  }

  f.Library_setIFramePrevYearHandler = function() {  
      var pw = this.parent.window;
      var pwSet = pw.calendarSet;
      var day = Library_NumOfDays(pwSet.today.getMonth(), pwSet.today.getFullYear()-1);
      pwSet.today = new Date(pwSet.today.getFullYear()-1, pwSet.today.getMonth(), day);
      pwSet.keepAlive = 1;
      pwSet.flag.day = day;
      pwSet.flag.month = pwSet.today.getMonth();
      pwSet.flag.year = pwSet.today.getFullYear();

      pwSet.navChange = 1;
      pw.Library_replaceCalendarData();
      if (pw.Library_isMinimalDate('Y', pwSet.today.getFullYear())){
        f.Library_setIFramePrevYearHandler_noshow();
      }
  }

  f.Library_setIFrameFollowYearHandler = function() {
      var pw = this.parent.window;
      var pwSet = pw.calendarSet;
      pwSet.today = new Date(pwSet.today.getFullYear()+1, pwSet.today.getMonth(),1);
      pwSet.flag.day = 1;
      pwSet.flag.month = pwSet.today.getMonth();
      pwSet.flag.year = pwSet.today.getFullYear();

      pwSet.navChange = 1;
      pwSet.keepAlive = 1;
      pw.Library_replaceCalendarData();
      if (pw.Library_isMaximumDate('Y', pwSet.today.getFullYear())){
        f.Library_setIFrameFollowYearHandler_noshow();
      }
  }

  f.Library_setIFramePrevMonthHandler = function() {  
      var pw = this.parent.window;
      var pwSet = pw.calendarSet;
      var day = Library_NumOfDays(pwSet.today.getMonth()-1, pwSet.today.getFullYear());
      pwSet.today = new Date(pwSet.today.getFullYear(), pwSet.today.getMonth()-1, day);
      pwSet.flag.day = day;
      pwSet.flag.month = pwSet.today.getMonth();
      pwSet.flag.prevMonth = pwSet.today.getMonth()-1;
      pwSet.flag.year = pwSet.today.getFullYear();

      pwSet.keepAlive = 1;
      pwSet.navChange = 1;
      pw.Library_replaceCalendarData();
      if (pw.Library_isMinimalDate('M', pwSet.today.getMonth())){
        f.Library_setIFramePrevMonthHandler_noshow();
      }
  }

  f.Library_setIFrameFollowMonthHandler = function() {
      var pw = this.parent.window;
      var pwSet = pw.calendarSet;
      pwSet.today = new Date(pwSet.today.getFullYear(), pwSet.today.getMonth()+1,1);
      pwSet.flag.day = 1;
      pwSet.flag.month = pwSet.today.getMonth();
      pwSet.flag.year = pwSet.today.getFullYear();

      pwSet.keepAlive = 1;
      pwSet.navChange = 1;
      pw.Library_replaceCalendarData();
      if (pw.Library_isMaximumDate('M', pwSet.today.getMonth()*1+pw.Library_getCalendarMonths()-1)){
        f.Library_setIFrameFollowMonthHandler_noshow();
      }
  }

  f.Library_setIFramePrevYearHandler_show = function() { 
    f.Library_setIFrameChangeDate_show(f.Library_setIFramePrevYearHandler, "Library_setIFramePrevYearHandler();");
  }

  f.Library_setIFramePrevYearHandler_noshow = function() {
    f.Library_setIFrameChangeDate_noshow();
  }

  f.Library_setIFramePrevMonthHandler_show = function() {
    f.Library_setIFrameChangeDate_show(f.Library_setIFramePrevMonthHandler, "Library_setIFramePrevMonthHandler();");
  }

  f.Library_setIFramePrevMonthHandler_noshow = function() {
    f.Library_setIFrameChangeDate_noshow();
  }

  f.Library_setIFrameFollowMonthHandler_show = function() {
    f.Library_setIFrameChangeDate_show(f.Library_setIFrameFollowMonthHandler, "Library_setIFrameFollowMonthHandler();");
  }

  f.Library_setIFrameFollowMonthHandler_noshow = function() {
    f.Library_setIFrameChangeDate_noshow();
  }

  f.Library_setIFrameFollowYearHandler_show = function() { 
    f.Library_setIFrameChangeDate_show(f.Library_setIFrameFollowYearHandler, "Library_setIFrameFollowYearHandler();");
  }

  f.Library_setIFrameFollowYearHandler_noshow = function() {
    f.Library_setIFrameChangeDate_noshow();
  }

  f.Library_setIFrameChangeDate_show = function(handle, interval) { 
      var pw = this.parent.window.calendarSet;
      f.clearInterval(window.calendarSet.inter);
      pw.keepAlive=1 ;
      handle.apply(f);
      if (!window.calendarSet.inter) window.calendarSet.inter = f.setInterval(interval, Library_navigationTimeout());
  }

  f.Library_setIFrameChangeDate_noshow = function() {
      var pw = this.parent.window.calendarSet;
      f.clearInterval(window.calendarSet.inter);
      pw.navChange = 1;
      pw.keepAlive = 0;// upraveno
      //    if (pw.keepAlive==1) this.parent.window.Library_unsetCalendarTimeoutHandlerClick(pw.keyInput);
      window.calendarSet.inter=null;
  }

  f.Library_setDateHandler = function(div) {
    f.Library_setDate(div);
  }
  f.Library_setDate = function(date) {
      var pw = this.parent.window;
      var pwSet = pw.calendarSet;
      var val;
      if (date && date.id.substring(0, 13) == 'calendar_date'){
        val = date.id.substring(18); //upraveno pro odlisnost minuleho a nasledujiciho mesice :)
        pwSet.onChangeUnset = 1;
        pwSet.flag = [];
        pwSet.keepAlive = 0;
        pwSet.keyInput.value = Library_getDateToHuman(Library_getHumanToDate(val), pwSet.keyInput.format);
        if (pwSet.keyInput.onchange) pwSet.keyInput.onchange();
       pw.Library_unsetCalendar(pwSet.keyInput.id);
      } else {
        pwSet.onChangeUnset = 1;
        pwSet.flag = [];
        pwSet.keepAlive = 0;
        if(val.nodeValue != '') {
          var newDate = new Date();
          newDate.setDate(val.nodeValue);
          pwSet.keyInput.value = Library_getDateToHuman(newDate, pwSet.keyInput.format);
          if (pwSet.keyInput.onchange) pwSet.keyInput.onchange();
          this.parent.window.Library_unsetCalendar(pwSet.keyInput.id);
        }
      }
  };
  var b = frame.body;
  /*NAVIGATION*/
  var ins  = "<div id=\""+pwSet.idPrefix+"_calendarNavigation_close\" onclick=\"Library_setIFrameCloseHandler()\">"+
                "<a id=\""+pwSet.idPrefix+"_calendarNavigation_closeLink\">"+pwSet.navigClose+"</a>"+
              "</div>"+
              "<div id=\""+pwSet.idPrefix+"_calendarNavigation\">"+
                "<table><tr>"+
                  "<td id=\""+pwSet.idPrefix+"_prevYear\" onmousedown=\"Library_setIFramePrevYearHandler_show()\"onmouseup=\"Library_setIFramePrevYearHandler_noshow()\" onmouseout=\"Library_setIFramePrevYearHandler_noshow()\"><a>"+pwSet.navigPrevYear+"</a></td>"+
                  "<td id=\""+pwSet.idPrefix+"_prevMonth\" onmousedown=\"Library_setIFramePrevMonthHandler_show()\" onmouseup=\"Library_setIFramePrevMonthHandler_noshow()\" onmouseout=\"Library_setIFramePrevMonthHandler_noshow()\"><a>"+pwSet.navigPrevMonth+"</a></td>"+
                  "<td id=\""+pwSet.idPrefix+"_followMonth\" onmousedown=\"Library_setIFrameFollowMonthHandler_show()\" onmouseup=\"Library_setIFrameFollowMonthHandler_noshow()\" onmouseout=\"Library_setIFrameFollowMonthHandler_noshow()\"><a>"+pwSet.navigFollowMonth+"</a></td>"+
                  "<td id=\""+pwSet.idPrefix+"_followYear\" onmousedown=\"Library_setIFrameFollowYearHandler_show()\" onmouseup=\"Library_setIFrameFollowYearHandler_noshow()\" onmouseout=\"Library_setIFrameFollowYearHandler_noshow()\"> <a>"+pwSet.navigFollowYear+"</a></td>"+
                "</tr></table>"+
              "</div>";
  var content = ins;
  content += Library_createCalendarData();
  
  var iframe_body = frame.getElementById("iframe_body");
//  b.innerHTML = "<div id='zaoCalendar'>"+content+"<div class=\"zaoCalendar_breaker\">&nbsp;</div></div><div class=\"zaoCalendar_breaker\">&nbsp;</div>";
  b.innerHTML = "<div id=\""+pwSet.idPrefix+"\">"+content+"</div>";
  Library_modifyCalendarNavigation();
  Library_setIFrameWidth(iframe_body);
  Library_setIFrameHeight(iframe_body);
  Library_recountOffset();
}

function Library_modifyCalendarNavigation() {
  var navs = {
    'prevYear': window.calendarSet.today.getFullYear()-1,
    'prevMonth': window.calendarSet.today.getMonth()-1,
    'followYear': window.calendarSet.today.getFullYear()+1,
    'followMonth': window.calendarSet.today.getMonth()*1+Library_getCalendarMonths()
  };
  var check = false;
  for (var i in navs){
    var elNav = window.calendarSet.fdoc.getElementById(window.calendarSet.idPrefix+"_"+i);
    if (elNav){
      if (i.indexOf('prev') == 0){
        check = Library_isMinimalDate((i.indexOf('Year') >= 0 ? 'Y' : 'M'), navs[i]);
      } else {
        check = Library_isMaximumDate((i.indexOf('Year') >= 0 ? 'Y' : 'M'), navs[i]);
      }
      if (check){
        elNav.disabled = true;
        elNav.style.visibility = 'hidden';
        Library_addClass(elNav, 'hiddenNavig');
      } else {
        elNav.disabled = false;
        elNav.style.visibility = 'visible';
        Library_removeClass(elNav, 'hiddenNavig');
      }
    }
  }
}

function Library_replaceCalendarData() {
  for (var i = 0; i < Library_getCalendarMonths(); i++){
    var deltaMonth = !i ? '' : i;
    var today = new Date(window.calendarSet.today);
    today.setDate(1); /* jinak nedojde k ke spravnemu posunu 31.5. */
    today.setMonth(today.getMonth()+(deltaMonth ? deltaMonth : 0));
    
    var monthYear = window.calendarSet.months[today.getMonth()]+" "+today.getFullYear();
    var divDelMonth_n = window.calendarSet.fdoc.createElement("div");
    divDelMonth_n.id = window.calendarSet.idPrefix+"_displayedMonth"+deltaMonth;
    divDelMonth_n.className = window.calendarSet.idPrefix+"_displayedMonth";
    divDelMonth_n.innerHTML = "<div>"+monthYear+"</div>";
    Library_replaceNode(divDelMonth_n, window.calendarSet.fdoc.getElementById(window.calendarSet.idPrefix+"_displayedMonth"+deltaMonth));

    var fd = Library_FirstDayOfMonth(today.getMonth(),today.getFullYear());
    var nd = Library_NumOfDays(today.getMonth(), today.getFullYear());
    var calendarArray = Library_fillCalendarArray(fd, nd);
    var divDelCalendar_n = window.calendarSet.fdoc.createElement("div");
    divDelCalendar_n.id = window.calendarSet.idPrefix+"_calendar"+deltaMonth;
    divDelCalendar_n.className = window.calendarSet.classPrefix+"calendar";
    divDelCalendar_n.innerHTML = "<table class=\""+window.calendarSet.classPrefix+"displayedMonthTable\"><tbody>"+Library_generateRows(calendarArray, deltaMonth)+"</tbody></table>";
    Library_replaceNode(divDelCalendar_n, window.calendarSet.fdoc.getElementById(window.calendarSet.idPrefix+"_calendar"+deltaMonth));
  }
  Library_modifyCalendarNavigation();
  Library_recountOffset();
}

function Library_createCalendarData() {
  var divCalendarS = '';
  for (var i = 0; i < Library_getCalendarMonths(); i++){
    var deltaMonth = !i ? '' : i;
    var today = new Date(window.calendarSet.today);
    today.setDate(1); /* jinak nedojde k ke spravnemu posunu 31.5. */

    today.setMonth(today.getMonth()+(deltaMonth ? deltaMonth : 0));
    var monthYear = window.calendarSet.months[today.getMonth()]+" "+today.getFullYear();
    var fd = Library_FirstDayOfMonth(today.getMonth(),today.getFullYear());
    var nd = Library_NumOfDays(today.getMonth(), today.getFullYear());
    var calendarArray = Library_fillCalendarArray(fd,nd);
    divCalendarS += "<div class=\""+window.calendarSet.classPrefix+"blockMonth\">"+
                    "<div id=\""+window.calendarSet.idPrefix+"_displayedMonth"+deltaMonth+"\" class=\""+window.calendarSet.classPrefix+"displayedMonth\">"+
                      "<div>"+monthYear+"</div>"+
                    "</div>"+
                    "<div id=\""+window.calendarSet.idPrefix+"_calendar"+deltaMonth+"\" class=\""+window.calendarSet.classPrefix+"calendar\">"+
                      "<table class=\""+window.calendarSet.classPrefix+"displayedMonthTable\"><tbody>"+Library_generateRows(calendarArray, deltaMonth)+"</tbody></table>"+
                    "</div>"+
                    "</div>";
  }
  return divCalendarS;
}

function Library_generateRows(calendarArray, deltaMonth) {
  /*HEADER*/
  var enableSetOutOfMonthsDays = true;
  var thS='';
  for(var iWD = 0; iWD < window.calendarSet.weekdays.length; iWD++) {
    thS += "<th class=\"day"+iWD+"\"><div>"+window.calendarSet.weekdays[iWD]+"</div></th>";
  }
  var table_rows = "<tr>"+thS+"<tr>";

  /*BODY*/
  var tdS ='';
  var today = new Date(window.calendarSet.today);
  var disabled = false;
  var weekendDay = false;
  
  var t = new Date(!window.calendarSet.keyInput.value ? Library_getDefaultDate() : Library_setInputCalendarDate(window.calendarSet.keyInput.value, true));
//  t.setMonth(t.getMonth() + (deltaMonth ? deltaMonth : 0));
  today.setDate(1); // aby nam nepretekl mesic
  today.setMonth(today.getMonth() + (deltaMonth ? deltaMonth : 0));
  var firstDayOfWeek = (Library_FirstDayOfMonth(today.getMonth(), today.getFullYear()) + 6) % 7;
  var monthDaysActual = Library_NumOfDays(today.getMonth(), today.getFullYear());
  var idPrefActual = 'actu_'+today.getFullYear()+'_'+(today.getMonth()+1)+'_';

  if (enableSetOutOfMonthsDays){

    var prevMonth = new Date(today.getFullYear(), today.getMonth()-1, 1);
    var monthDaysPrevMonth = Library_NumOfDays(prevMonth.getMonth(), prevMonth.getFullYear());
    var idPrefPrevMonth = 'prev_'+prevMonth.getFullYear()+'_'+(prevMonth.getMonth()+1)+'_';

    var nextMonth = new Date(today.getFullYear(), today.getMonth()+1, 1);
    var idPrefNextMonth = 'next_'+nextMonth.getFullYear()+'_'+(nextMonth.getMonth()+1)+'_';
  }

  var inMonth = false;
  var dayVal = false;
  var afterMonth = false;
  var idPref = false;
  var dayClass = false;
  
  for (var i = 0, j =1 ; i < 42; i++,j++) {
    dayClass = new Array();
    if (j==0 || j==6)  dayClass.push(window.calendarSet.classPrefix+'dayWeekendDay');
    dayVal = calendarArray[i];
    if (!dayVal){// neni dnem aktualne vykreslovaneho mesice
      if (afterMonth){//je v nasledujicim mesici
        if (j==1) break;
        if (enableSetOutOfMonthsDays){
          dayVal = i-monthDaysActual-firstDayOfWeek+1;
        }
        disabled = (!calendarArray[i] && !enableSetOutOfMonthsDays) || (Library_isMinimalDate('D', dayVal, nextMonth) || Library_isMaximumDate('D', dayVal, nextMonth));
        idPref = idPrefNextMonth;
      } else {// je v predchozim mesici
        if (enableSetOutOfMonthsDays){
          dayVal = i+monthDaysPrevMonth-firstDayOfWeek+1;
        }
        disabled = (!calendarArray[i] && !enableSetOutOfMonthsDays) || (Library_isMinimalDate('D', dayVal, prevMonth) || Library_isMaximumDate('D', dayVal, prevMonth));
        idPref = idPrefPrevMonth;
      }
    } else { // je v aktualnim
      afterMonth = true; 
      idPref = idPrefActual;
      disabled = (Library_isMinimalDate('D', calendarArray[i], today) || Library_isMaximumDate('D', calendarArray[i], today));
    }
    inMonth = calendarArray[i] != "" ? "In" : "Out";

    if (disabled) dayClass.push(window.calendarSet.classPrefix+'disabledDay');
    if (calendarArray[i]==t.getDate() && (today.getMonth() == t.getMonth()) && (today.getFullYear() == t.getFullYear())) dayClass.push('actual_day');
    dayClass.push(window.calendarSet.classPrefix+"day"+inMonth+"ChosenMonth");
    dayClass.push(window.calendarSet.classPrefix+"day"+j);

    tdS += "<td class=\""+Library_join(dayClass, ' ')+"\"><"+window.calendarSet.dayTag+" class=\""+Library_join(dayClass, ' ')+"\" id=\"calendar_date"+idPref+dayVal+"\" "+(!disabled ? "onclick='Library_setDateHandler(this)'" : "")+">"+dayVal+"</"+window.calendarSet.dayTag+"></td>";

    if (j==6) j=-1;
    if ( (i+1)%7 == 0) {
      table_rows += "<tr class=\"week\">"+tdS+"</tr>";
      tdS = '';
    }
  }
//parent.document.body.insertBefore(document.createElement("div").appendChild(document.createTextNode(table_rows)),parent.document.body.firstChild);
  return table_rows;
}

function Library_getClassName() {
	return window.calendarSet.className ? window.calendarSet.className : 'date';
}

function Library_getCSS() {
	return window.calendarSet.css ? window.calendarSet.css : 'styles.css';
}

function Library_setIFrameHeight(el) {
  if (window.calendarSet.iframe_height != 'auto' && window.calendarSet.iframe_height != 'css'){
	el.style.height = window.calendarSet.iframe_height ? window.calendarSet.iframe_height : "342px";
  }
}

function Library_setIFrameWidth(el) {
  if (window.calendarSet.iframe_width != 'auto' && window.calendarSet.iframe_width != 'css'){
	el.style.width = window.calendarSet.iframe_width ? window.calendarSet.iframe_width : "291px";
  }
}
function Library_setIFrameSource(el) {
  if (window.calendarSet.iframe_source){
    el.src = window.calendarSet.iframe_source;
  } else {
    el.src = "javascript:''";
  }
}
function Library_getCalendarMonths() {
	return window.calendarSet.calendarMonths ? window.calendarSet.calendarMonths*1 : 1;
}

function Library_navigationTimeout() {
  return window.calendarSet.navTimeout ? window.calendarSet.navTimeout : 500;
}

function Library_fillCalendarArray(firstDay,NumberOfDays) {
  var a = new Array;
  var firstDay_czIndexed;
  if (firstDay == 0)
    firstDay_czIndexed = 6;
  else 
    firstDay_czIndexed = firstDay - 1;
  for (var i=0,j=1; i<42; i++) {
    if (i >= firstDay_czIndexed && i<(NumberOfDays+firstDay_czIndexed)) {
      a.push(j);
      j++;
    }
    else
      a.push("");
  }
  return a;
}

function Library_getDefaultDate(){
  if (window.calendarSet.elementDefaultDate) return window.calendarSet.elementDefaultDate;
  if (window.calendarSet.keyInput && window.calendarSet.keyInput.defaultDate) return window.calendarSet.keyInput.defaultDate;
  return window.calendarSet.defaultDate ? window.calendarSet.defaultDate : Library_resetTime(new Date());
}

function Library_getMinimalDate(){
  return window.calendarSet.minimalDate ? window.calendarSet.minimalDate : false/*Library_resetTime(new Date())*/;
}

function Library_getMaximumDate(){
  return window.calendarSet.maximumDate ? window.calendarSet.maximumDate : false;
}

function Library_isMaximumDate(part, supposedVal, today){ // vraci true, pokud je vetsim datem
  var maxDate = Library_getMaximumDate();
  if (!maxDate) return false;
  return Library_compareDates(part, today ? today : window.calendarSet.today, maxDate, supposedVal, true);
}

function Library_isMinimalDate(part, supposedVal, today){ // vraci true pokud je mensim datem
  var minDate = Library_getMinimalDate();
  if (!minDate) return false;
  return Library_compareDates(part, today ? today : window.calendarSet.today, minDate, supposedVal, false);
}

function Library_FirstDayOfMonth(month, year) {
  var dd = new Date(year,month,1);
  return dd.getDay();
}

function Library_NumOfDays(pMonth, pYear) {
//  var today = new Date(pYear, pMonth, 1);
//  var dd = new Date(today.getFullYear() + (today.getMonth()==11 ? 1 : 0), today.getMonth()==11 ? 1 : today.getMonth()+1, 0);
  var dd = new Date(pYear, pMonth+1, 0);
  return dd.getDate();
}

function Library_unsetCalendar(el) {
  
  if (window.calendarSet.keepAlive == 1) {
    window.calendarSet.keepAlive = 0;
    document.getElementById(el).focus();
  }
  else {
    var id = 'iframe_div_'+el;
    if (document.getElementById(id)) {
      Library_removeClass(document.getElementById(el).parentNode, "showCalendarDiv");
      Library_purge(document.getElementById(id));
      document.getElementById(id).parentNode.removeChild(document.getElementById(id));
      window.calendarSet.counter--;
      window.calendarSet.flag=[];
      window.calendarSet.keepAlive = 0;
      window.calendarSet.onChangeUnset = 0;
      window.calendarSet.navChange = 0;
      //window.calendarSet.keyInput = null; /*problem pri dvojkliku na stejny element*/
    }
  }
}

function Library_recountOffset() {
  if (window.calendarSet.iframe_height != 'auto' && window.calendarSet.iframe_height != 'auto') return false;
  var elId = (parent.window.calendarSet.keyInput.id);
  var eInside = window.calendarSet.fdoc.getElementById("zaoCalendar");

  var eIframeDiv = document.getElementById('iframe_div_'+elId);
  var eIframe = document.getElementById('inline_frame_'+elId);

  var deltaHeight = eInside.offsetHeight + (parent.window.calendarSet.deltaHeightCalendar ? parent.window.calendarSet.deltaHeightCalendar : 35);
  var deltaWidth = eInside.offsetWidth + (parent.window.calendarSet.deltaWidthCalendar ? parent.window.calendarSet.deltaWidthCalendar : 10);
  
  if (window.calendarSet.iframe_height == 'auto'){
    if (eIframeDiv){
      eIframeDiv.height = (deltaHeight)+'px';
    }
    if (eIframe){
      eIframe.height = (deltaHeight)+'px';
    }
  }
  if (window.calendarSet.iframe_width == 'auto'){
    if (eIframeDiv){
      eIframeDiv.width = (deltaWidth)+'px';
    }
    if (eIframe){
      eIframe.width = (deltaWidth)+'px';
    }
  }
  if (!parent.window.calendarSet.deltaHeightCalendar){
    eInside = window.calendarSet.fdoc.getElementById(parent.window.calendarSet.idPrefix);//je potreba aktualizovat kvuli prepoctu velikosti
    parent.window.calendarSet.deltaHeightCalendar = deltaHeight - eInside.offsetHeight;
    parent.window.calendarSet.deltaWidthCalendar = deltaWidth - eInside.offsetWidth;
  }
  return true;
}

// ---modules/ForAll.Destination.ajax---
//-- ForAll.Destination.ajax.js
function dumpObject(el){
     var x = '';
     for (a in el)x += a + "=" + el[a] + "\t<br />";
     var q = document.getElementsByTagName('h3');
     q[0].innerHTML = x;
}

function AO3noWork(){}

function AO3stepOne2destinationElHandlerAdd(el, way){
  if (! el) return false;
  var hid = document.createElement('input');
  hid.setAttribute('type', 'hidden');
  if (!hid.onchange) hid.onchange = AO3noWork;
  el.parentNode.appendChild(hid);

  if (el.tagName != "SELECT"){
    AO3stepOne2destinationElHandlerAddInput(el, way);
  } else {
    AO3stepOne2destinationElHandlerAddSelect(el, way);
    var inp = document.createElement('input');
    AO3stepOne2destinationElHandlerAddInput(inp, way);
    inp.style.display = 'none';
    inp.className = "inputText";
    inp.name="data["+way+"Search]";
    var option = el.getElementsByTagName('OPTION')[el.selectedIndex].innerHTML;
// tohle galileo nechtelo
//    inp.value = option.substr(0, option.length - 6);
     el.parentNode.insertBefore(inp, el);
  }
}

function AO3stepOne2destinationElHandlerAddSelect(select, way) {
  if (! select) return false;
  select.way = way;
  select.kde = window.parametr.ajax.kde;
  select.onchange = AO3stepOne2destinationSelOnChange;
}

function AO3stepOne2destinationElHandlerAddInput(input, way) {
  if (! input) return false;
  input.way = way;
  input.kde = window.parametr.ajax.kde;
  input.setAttribute('autocomplete', 'off');
  input.onkeyup = AO3stepOne2destinationOnKeyUp;
  input.onkeypress = AO3stepOne2destinationOnKeyPress;
  input.onkeydown = AO3stepOne2destinationOnKeyDown;
  input.onblur = AO3stepOne2destinationOnBlur;
  input.onfocus = AO3stepOne2destinationOnFocus;
  input.onchange = AO3stepOne2destinationOnChange;
}

function AO3stepOne2destinationOnKeyUp(e){
  if (!e) { e = window.event; }
  AO3searchFormGetDestinations(this, this.kde);
}
function AO3stepOne2destinationOnKeyPress(e){
  if (!e) { e = window.event; }
  return AO3searchFormDestinationsSelectionsCancelEnter(this);
}
function AO3stepOne2destinationOnKeyDown(e){
  if (!e) { e = window.event; }
  return AO3searchFormDestinationsSelection(e, this);
}

function AO3stepOne2destinationOnBlur(e){
  if (!e) { e = window.event; }
  window.terminalResetTimer = window.terminalResetTimer = setTimeout('AO3searchFormGetDestinationsTerminalReset()',300);
}

function AO3stepOne2destinationOnFocus(e){
  if (!e) { e = window.event; }
  this.last=''; AO3searchFormGetDestinations(this,'index.php');
}
function AO3stepOne2destinationOnChange(e){
 // if (!e) { e = window.event; }
  var codeInput = Library_getNextSiblingByTagName(this, 'INPUT', 2);
  if (!this.didSelection){
    codeInput.name = '';
    codeInput.value = '';
  }
  codeInput.onchange();
  AO3searchFunctionGetDestinationsSelectionReset(this);
}

/**  Nastaveni destinaci **/

function AO3searchFormDestinationsSelectionGetCode(text) {
  var r_code = /\(([A-Z0-9]{3,5})\)\u200e?$/; // u200e je znak LRM nutny pro spravne srovnane zavorky kolem kodu
  var m_code = text.match(r_code);
  return m_code ? m_code[1] : '';
}

function AO3searchFormDestinationsSelectionGetLabel(text) {
  return text.replace('&amp;', '&').replace('&gt;', '>').replace('&lt;', '<');
}

function AO3searchFormDestinationsSelection(event, element) {
//navigace
  element.didSelection = false;
  element.last = element.value;
  var ret = true;
  var terminal = document.getElementById('ao3AjaxTerminalGetDestinations');

  if (terminal) {
    // dolu: 40, nahoru: 38, enter: 13
    var cursor = document.getElementById('ao3AjaxTerminalGetDestinationsCursor');
    if (cursor && (event.keyCode == 40) || (event.keyCode == 38)) {
      if (event.keyCode == 40) {
        var novyCursor = Library_getNextSiblingByTagName(cursor, 'DIV');
      } else if (event.keyCode == 38 ) {
        var novyCursor = Library_getPreviousSiblingByTagName(cursor, 'DIV');
      }

      if (novyCursor) {
        cursor.id = null;
        Library_removeClass(cursor, 'cursor');
        novyCursor.id = 'ao3AjaxTerminalGetDestinationsCursor';
        Library_addClass(novyCursor, 'cursor');
      }
      ret = false;
    } else if (cursor && (event.keyCode == 13)) {
      var code = AO3searchFormDestinationsSelectionGetCode(cursor.innerHTML);
      var label = AO3searchFormDestinationsSelectionGetLabel(cursor.innerHTML);
      var codeInput = Library_getNextSiblingByTagName(element, 'INPUT', 2);

      codeInput.value = code;
      codeInput.name = element.name.substr(0, element.name.length - 7) + ']';

      codeInput.onchange();

      element.didSelection = true;
      element.value = label;
      element.onchange();

      setTimeout(AO3searchFormGetDestinationsTerminalReset, 100);
      ret = false;
    } else if (!cursor && (event.keyCode == 40)) {
     var div1level = Library_getFirstChildByTagName(terminal, 'DIV');
     var div2level = Library_getFirstChildByTagName(div1level, 'DIV');
     if (div2level) {
       Library_addClass(div2level, 'cursor');
       div2level.id = 'ao3AjaxTerminalGetDestinationsCursor';
       ret = false;
     }
    }
  }

  return ret;
}

function AO3searchFormDestinationsSelectionsCancelEnter(element) {
  return !element.didSelection;
}

function AO3searchFunctionGetDestinationsSelectionReset(element) {
  var codeInput = Library_getNextSiblingByTagName(element, 'INPUT', 2);
}

function AO3stepOne2destinationTerminalOnFocus(e){
  if (!e) { e = window.event; }
  if (window.terminalResetTimer) { clearTimeout(window.terminalResetTimer); window.terminalResetTimer = 0; }
}

 function setPositionForGetDestination(caller, insertedEl) {
  caller.parentNode.appendChild(insertedEl);
  if (Library_isPositioned(caller.parentNode)) {
    var top = (caller.offsetHeight)+'px';
    var left = (caller.offsetLeft)+'px';
  } else {
    var top = (Library_getOffsetTopPos(caller)+caller.offsetHeight)+'px';
    var left = Library_getOffsetLeftPos(caller)+'px';
  }
  insertedEl.style.top = top;
  insertedEl.style.left = left;
  insertedEl.style.visibility = 'visible';
}

  function Library_getOffsetTopPos(el) {
    var offsetTop = 0;
    if (el.offsetParent) {
      offsetTop = el.offsetTop;
      el = el.offsetParent;
      while (el && !Library_isPositioned(el)) {
        offsetTop += el.offsetTop;
        el = el.offsetParent;
      }
    }                                     
    return offsetTop;
  }

  function Library_getOffsetLeftPos(el) {
    var offsetLeft = 0;
    if (el.offsetParent) {
      offsetLeft = el.offsetLeft;
      el = el.offsetParent;
      while (el && !Library_isPositioned(el)) {
        offsetLeft += el.offsetLeft
        el = el.offsetParent;
      }
    }                                     
    return offsetLeft;
  }

function AO3searchFormGetDestinations (input, url) {

  if (input.value == input.last) {
    return;
  }
  input.last = input.value;

  var codeInput = Library_getNextSiblingByTagName(input, 'INPUT', 2);

  if (input.value.length <= 2) {
    AO3searchFormGetDestinationsTerminalReset();
  } else {
    var separator = (url.indexOf('?') == -1) ? '?' : '&';

    //  - pozadavek: pro hotely jsou zobrazovana nejen pouze mesta, ale i letiste
    var actionSuffix = /*(input.name == 'data[locationSearch]') ? '&data[onlyCities]=1' :*/ '';

    url  = url + separator + 'action='+(window.parametr.ajax.action ? window.parametr.ajax.action : 'eSearchFormData') +
      '&data[ajax]=getDestinations' +
      '&data[string]=' + input.value + actionSuffix;
    //    window.status = ', '+ input.value +' '+ Math.random();
    Library_ajaxRequest('getDestinations', url, AO3searchFormGetDestinationsHandler, input, 200,1);
  }
}


function AO3searchFormGetDestinationsHandler(httpRequest, type, ident, element) {
//  if (httpRequest.readyState == 4) window.status += ", i: " + ident;
  if (httpRequest.readyState == 4 && LibraryVar_ajaxRequests[type] == ident) {
    if (httpRequest.status == 200) {

      if (
        (httpRequest.responseXML.getElementsByTagName('error').length > 0) ||
        (httpRequest.responseXML.getElementsByTagName('div').length < 2)
        ) {
        AO3searchFormGetDestinationsTerminalReset();
        return;
      }

      var out = httpRequest.responseText;
      var outElement = document.getElementById('ao3AjaxTerminalGetDestinations');

      if (!outElement) {
        outElement = document.createElement('div');
        outElement.id = 'ao3AjaxTerminalGetDestinations';
        if (window.setPositionForGetDestination){
          setPositionForGetDestination(element, outElement);
        } else {
          element.parentNode.appendChild(outElement);
        }
      }
      outElement.innerHTML = out+'<iframe id="ao3AjaxTerminalGetDestinationsIframe"></iframe>';

      var innerElement = Library_getFirstChildByTagName(document.getElementById('ao3AjaxTerminalGetDestinations'),'DIV');
      innerElement.onblur = AO3stepOne2destinationOnBlur;
      innerElement.onfocus = AO3stepOne2destinationTerminalOnFocus;

      var variants = innerElement.getElementsByTagName('DIV');
      for (var i=0; i < variants.length; i++) {
        variants[i].onmouseover = AO3searchFormGetDestinationsMouseCursorOver;
        variants[i].onmouseout = AO3searchFormGetDestinationsMouseCursorOut;
        variants[i].onclick = AO3searchFormGetDestinationsMouseCursorSelect;
       }
    } else {
      alert ('error with searching '+element.value);
    }
    LibraryVar_ajaxRequests[type] = null;
    LibraryVar_ajaxRequestsObjects[type] = null;
  }
}

function AO3searchFormGetDestinationsMouseCursorOver(e) {
  if (!e) { e = window.event; }
  var cursor = document.getElementById('ao3AjaxTerminalGetDestinationsCursor');
  if (cursor) {
    cursor.id = null;
    Library_removeClass(cursor, 'cursor');
  }

  this.id = 'ao3AjaxTerminalGetDestinationsCursor';
  Library_addClass(this, 'cursor');
}

function AO3searchFormGetDestinationsMouseCursorOut(e) {
  if (!e) { e = window.event; }
  if (this.id == 'ao3AjaxTerminalGetDestinationsCursor') {
    this.id = null;
    Library_removeClass(this, 'cursor');
  }
}

function AO3searchFormGetDestinationsMouseCursorSelect(e) {
  if (!e) { e = window.event; }
  var code = AO3searchFormDestinationsSelectionGetCode(this.innerHTML);
  var label = AO3searchFormDestinationsSelectionGetLabel(this.innerHTML);

  var searchInput = Library_getFirstChildByTagName(this.parentNode.parentNode.parentNode, 'INPUT');
  var codeInput = Library_getNextSiblingByTagName(searchInput, 'INPUT', 2);
  if (codeInput){
    codeInput.value = code;
    codeInput.name = searchInput.name.substr(0, searchInput.name.length - 7) + ']';

    codeInput.onchange();
  }
  if (searchInput){
    searchInput.value = label;
    searchInput.didSelection = true;

    searchInput.onchange();
  }
  AO3searchFormGetDestinationsTerminalReset();
}

function AO3searchFormGetDestinationsTerminalReset() {
  var outElement = document.getElementById('ao3AjaxTerminalGetDestinations');
  if (outElement) {
    outElement.parentNode.removeChild(outElement);
  }
  LibraryVar_ajaxRequests['getDestinations'] = null;
  LibraryVar_ajaxRequestsObjects['getDestinations'] = null;
}

function Library_ifsetor(path, alernative){
  if (!alternative) alternative = false;
  if (!path) return alternative;
  var pars = path.split('.');
  var path = window;
  for (var i in pars){
    if (path[pars[i]]) path = path[pars[i]];
    else return alternative;
  }
  return path;
}
// ---modules/ForAll.ChooseCountry.ajax---
// *** Forall - ChooseCounry - Ajax *** 
function AO3searchFormChooseCountryHandlerAdd(tagName){
  var hasMatch = typeof(tagName) != 'object';// == "String";
  if (!hasMatch) tagName = 'INPUT';
  var buts = document.getElementsByTagName(tagName);
  for (var i = 0; i < buts.length; i++) {
    if (Library_hasClass(buts[i],'setLocationButton')) {//multipleFlights
      hasMatch = true;
     //   AO3_StepOne2_originButton_0
      buts[i].idPref = buts[i].id.substring(0, buts[i].id.indexOf('Button'));
      buts[i].idSufx = buts[i].id.substring(buts[i].id.indexOf('Button') + 6);
      var elLocation = document.getElementById(buts[i].idPref + buts[i].idSufx);
      if (elLocation){
        if (elLocation.tagName.toLowerCase() == 'select') buts[i].iataSelect = elLocation;
        else buts[i].searchInput = elLocation;
      } else alert ('not Found:'+buts[i].idPref + buts[i].idSufx);
      var elHidden = document.getElementById(buts[i].idPref +'Found'+ buts[i].idSufx);        
      if (elHidden){
         buts[i].iataInput = elHidden;
      }
      buts[i].onclick = AO3searchFormChooseCountryAjaxCreateFormHandler;
      buts[i].parentDeph = 1; // 3
    }
    if (buts[i].name == 'data[stepChooseOrigin]' || buts[i].name == 'data[stepChooseDestination]') {
      hasMatch = true;
      // AO3_chooseDest_Destination
      buts[i].idPref = buts[i].id.substring(0, buts[i].id.indexOf('Button'));
      buts[i].idSufx = '';
      var elLocation = document.getElementById(buts[i].idPref + buts[i].idSufx);
      if (elLocation){
        if (elLocation.tagName.toLowerCase() == 'select') buts[i].iataSelect = elLocation;
        else buts[i].searchInput = elLocation;
      } else alert ('not Found:'+idPref + idSufx);
      // pro stare je spatne napojeno
      var elHidden = document.getElementById(buts[i].idPref +'Found'+ buts[i].idSufx);        
      if (elHidden){
         buts[i].iataInput = elHidden;
      }
      buts[i].onclick = AO3searchFormChooseCountryAjaxCreateFormHandler;
      buts[i].parentDeph = 1;    
    }
  }
  if (!hasMatch) AO3searchFormChooseCountryHandlerAdd('A');
}

function AO3searchFormChooseCountryAjaxCreateFormHandler(e){
  var url = '';
  if (!Library_hasClass(this, 'activatedItem')) Library_addClass(this, 'activatedItem');
  if (this.iataInput && this.iataInput.value) url += '&data[location]='+this.iataInput.value;
  if (this.searchInput && this.searchInput.value) url += '&data[locationSearch]='+this.searchInput.value;
  if (this.iataSelect) url += '&data[location]='+Library_getValue(this.iataSelect);
  var el = document.getElementById('ao3AjaxTerminalChooseCountry');
  if (el){//likvidace puvodniho
    AO3searchFormChooseCountryAjaxHandlerRemove();
  }
  AO3searchFormChooseCountryAjaxHandlerAdd(this, url);
}

function AO3searchFormChooseCountryAjaxSelectCountryHandler(e){
  var url = '';
  url += '&data[country]='+(this.elSelect ? Library_getValue(this.elSelect) : Library_getValue(this));

  AO3searchFormChooseCountryAjaxHandlerAdd(this.elButton, url);
}

function AO3searchFormChooseCountryAjaxSelectSubCountryHandler(e){
  var url = '';
  url += '&data[subCountry]='+(this.elSelect ? Library_getValue(this.elSelect) : Library_getValue(this));
  AO3searchFormChooseCountryAjaxHandlerAdd(this.elButton, url);
}

function AO3searchFormChooseCountryAjaxHandlerAdd(element, urlPar) {
  var url = window.parametr.url;
  var separator = (url.indexOf('?') == -1) ? '?' : '&';
  if (window.parametr.hasSes){
    url += separator + window.parametr.sesName+"="+window.parametr.sesId;
    separator = "&";
  }
  url += separator+'action='+window.parametr.ajax.action;
  url += '&iframe=chooseCountry';
  url += '&data[ajax]=chooseCountry';  
  url += urlPar;
  if (true){
      var outElement = document.getElementById('ao3AjaxTerminalChooseCountry');
      if (outElement){
        outElement.parentNode.removeChild(outElement);//autodestrukce
      }
      outElement = document.createElement('div');
      outElement.id = 'ao3AjaxTerminalChooseCountry';
      outElement.className='ao3AjaxTerminal ao3AjaxWait';
      outElement.trigerEl = element;
      AO3searchFormChooseCountryPlaceTerminal(element, outElement, '<span style="float:left">'+window.parametr.ajax.waitfor+'</span><a class="closer" onclick="AO3searchFormChooseCountryAjaxHandlerRemove();">X</a>');
  }
  Library_ajaxRequest('chooseCountry', url, AO3searchFormChooseCountryAjaxHandler, element, 0, 1);
}

function AO3searchFormChooseCountryAjaxHandlerRemove() {
  var el = document.getElementById('ao3AjaxTerminalChooseCountry');
  if (el){
    if (el.trigerEl)Library_removeClass(el.trigerEl, 'activatedItem');
    el.parentNode.removeChild(el);
  } else {
    Library_debugAlert('nenalezen objekt pro zniceni');
  }
}

function AO3searchFormChooseCountryAjaxHandler(httpRequest, type, ident, element) {
  if (httpRequest.readyState == 4 && LibraryVar_ajaxRequests[type] == ident) {
    if (httpRequest.status == 200) {
      var out = '';
      var errors = httpRequest.responseXML.getElementsByTagName('error');

      if (errors.length) {
        out += errors[0].firstChild.nodeValue;
      } else {
        out += '<a class="closer" onclick="AO3searchFormChooseCountryAjaxHandlerRemove();">X</a>' + httpRequest.responseText;
      }

      var outElement = document.getElementById('ao3AjaxTerminalChooseCountry');
      if (outElement){
        outElement.parentNode.removeChild(outElement);//autodestrukce
      }
      outElement = document.createElement('div');
      outElement.segment = element.segment;
      outElement.reference = element.reference;

      outElement.setAttribute('id', 'ao3AjaxTerminalChooseCountry');
      outElement.className='ao3AjaxTerminal';
      AO3searchFormChooseCountryPlaceTerminal(element, outElement, out);
      AO3searchFormChooseCountryJoinEvents(outElement, element);
      outElement.trigerEl = element;
      
      LibraryVar_ajaxRequests[type] = null;
      LibraryVar_ajaxRequestsObjects[type] = null;

    } else {
      Library_debugAlert('There was a problem with the request *choose country*.');
    }
  }
}

function AO3searchFormChooseCountryPlaceTerminal(element, outElement, out) {
  if (window.setPositionForChooseCountry){
    setPositionForChooseCountry(element, outElement);
  } else {
    var par = element;
    for (var i = 0; i < element.parentDeph; i++){
      par = par.parentNode;
    }
    par.appendChild(outElement);
    var outContent = document.createElement('div');
    outContent.id = "ao3AjaxTerminalChooseCountryContent";
    outElement.appendChild(outContent);
    outContent.innerHTML = out;
    var back = document.createElement('iframe');
    back.id = "ao3AjaxTerminalChooseCountryBackground";
    back.style.position = "absolute";
    back.style.width = outContent.offsetWidth+'px';
    back.style.border = 0;
    back.style.padding = 0;
    back.style.height = outContent.offsetHeight+'px';
    back.style.zIndex = 150;
    outElement.appendChild(back);
  }
}

function AO3searchFormChooseCountryJoinEvents(outElement, formButton) {
  var sel = document.getElementById('AO3_ChooseCountry_Country');
  var butt = document.getElementById('AO3_ChooseCountry_CountryButton');
  if (sel){
    sel.onchange = AO3searchFormChooseCountryAjaxSelectCountryHandler;
    sel.elButton = formButton;
    if (butt){
      butt.elButton = formButton;
      butt.onclick = AO3searchFormChooseCountryAjaxSelectCountryHandler;
    }
  }
  var sel = document.getElementById('AO3_ChooseCountry_SubCountry');
  var butt = document.getElementById('AO3_ChooseCountry_SubCountryButton');
  if (sel){
    sel.elButton = formButton;
    sel.onchange = AO3searchFormChooseCountryAjaxSelectSubCountryHandler;
    if (butt){
      butt.elButton = formButton;
      butt.onclick = AO3searchFormChooseCountryAjaxSelectSubCountryHandler;
    }
  }
  var sel = document.getElementById('AO3_ChooseCountry_Place');
  var butt = document.getElementById('AO3_ChooseCountry_PlaceButton');
  if (sel && butt){
    sel.elButton = formButton;
    butt.elButton = formButton;
    butt.elSelect = sel;
    butt.onclick = AO3searchFormChooseCountrySetLocationHandler;
  }
  //TODO: podminky mizeni elementu
}

function AO3searchFormChooseCountryGetLabel(text) {
  return text.replace('&amp;', '&').replace('&gt;', '>').replace('&lt;', '<');
}

function AO3searchFormChooseCountrySetLocationHandler(){
  var iata = this.elSelect.options[this.elSelect.selectedIndex].value;
  var search = AO3searchFormChooseCountryGetLabel(this.elSelect.options[this.elSelect.selectedIndex].innerHTML);
  if (!iata) search = '';
  var elButton = this.elButton;
  if (elButton.iataSelect && iata){
    if (elButton.iataSelect == document.getElementById(elButton.idPref + elButton.idSufx)){//overi existenci elementu
      var match = false;
      for (var i = 0; i< elButton.iataSelect.options.length; i++){
        if (elButton.iataSelect.options[i].value == iata){
          match = true;
          elButton.iataSelect.selectedIndex = i;
          if (elButton.iataSelect.onchange) elButton.iataSelect.onchange();
          break;
        }
      }
      if (!match){ // vyber nulove polozky
        elButton.iataSelect.selectedIndex = 0;
        if (elButton.iataSelect.onchange) elButton.iataSelect.onchange(); //mel by nahradit select za 2 inputy
        elButton.iataSelect = false;
      }
    } else elButton.iataSelect = false;
  }
  if (!elButton.iataSelect){ //select mohl od onlaod zmizet
    if (!elButton.searchInput) elButton.searchInput = document.getElementById(elButton.idPref + elButton.idSufx);
    if (!elButton.iataInput) elButton.iataInput = document.getElementById(elButton.idPref +"Found"+ elButton.idSufx);
  }
  if (elButton.iataInput){
    elButton.iataInput.value = iata;
    if (elButton.iataInput.onchange) elButton.iataInput.onchange();
  }
  if (elButton.searchInput){
    if (elButton.searchInput.tagName=='INPUT'){
      elButton.searchInput.value = search;//+' ('+iata+')';
      if (elButton.searchInput.onchange) elButton.searchInput.onchange();
//    if (elButton.searchInput.onkeyup) elButton.searchInput.onkeyup();// u multiletu zajistuje zobbrazeni dalsiho segmentu
    } else {
      elButton.searchInput.innerHTML = search;//+' ('+iata+')';
    }
  } 
  AO3searchFormChooseCountryAjaxHandlerRemove();
  return false;
}

function Library_getValue(el){
  switch (el.tagName.toLowerCase()){
    case 'input': return el.value;
    case 'select': return el.options[el.selectedIndex].value;
    default: return false;
  }
  return false;
}

function Library_firstLetterUp(str, down){
  if (!str.length) return false;
  return (down ? str.substring(0,1).toLowerCase() : str.substring(0,1).toUpperCase())+str.substring(1);
}

Library_addEvent(window, 'load', AO3searchFormChooseCountryHandlerAdd, false);
// ---GuiSearchFormHotelsStepOne---
function AO3searchFormHotelsstepOneHandlerAdd() {
  //AO3HotelsStepOnesetTimeHandlerAdd();
  AO3HotelsStepOneHideAdvHandlerAdd();
  AO3HotelsStepOneShowAdvButtonHandlerAdd();
  AO3HotelsStepOneTravelersCountHandlerAdd();
  AO3HotelsStepOneCalendarDeltaHandlerAdd();
  AO3HotelsStepOneDestinationHandlerAdd();
  AO3HotelsStepOneExtraBedsHandlerAdd();
  AO3HotelsStepOneRoomTypeHandlerAdd();
  AO3HotelsStepOneFormSubmitHandlerAdd();
}

function AO3HotelsStepOneFormSubmitHandlerAdd() {
  var forms = document.getElementsByTagName('FORM');
  for (var i=0; i< forms.length; i++){
    if (Library_hasClass(forms[i], 'ao3StepOne')){
      forms[i].onsubmit = AO3HotelsStepOneFormSubmitHandler;
    }
  }

}

function AO3HotelsStepOneFormSubmitHandler() {
  var destination = document.getElementById('AO3_HotelsStepOne_location');

  if (destination.value.length < 3 && window.notCheck != true) {
    alert(window.parametr.NoLocationFilled);
    return false;
  }

  var params = new Array;
  var lastCheck = 'toDay';
  if (document.getElementById('AO3_HotelsStepOne_startMonth')){
  switch (lastCheck){
    case 'toDay':
      params['elToDay'] = document.getElementById('AO3_HotelsStepOne_endDay');
    case 'toMonth':
      params['elToMonth'] = document.getElementById('AO3_HotelsStepOne_endMonth');
    case 'fromDay':
      params['elFromDay'] = document.getElementById('AO3_HotelsStepOne_startDay');
    case 'fromMonth':
      params['elFromMonth'] = document.getElementById('AO3_HotelsStepOne_startMonth');
    default:
    break;
  }
  switch (onSubmitCalendarData(params)){
    case 'INVALID_FROM':
    case 'INVALID_TO':
      alert(window.parametr.invalidDate);
      return false;
    case 'LESS_FROM':
    case 'LESS_TO':
      alert(window.parametr.lessDate);
      return false;
    case 'CROSS_DATES':
      alert(window.parametr.crossDates);
      return false;
    case 'EQUAL_DATES':
      alert(window.parametr.equalDates);
      return false;
    default:
    break;
  }
  } else { // novy format
    var ways = ['start', 'end'];
    for (var iway in ways){ 
      var elDate = document.getElementById('AO3_HotelStepOne_'+ways[iway]);
      if (elDate){ elDate = document.getElementById('AO3_HotelsStepOne_'+ways[iway]);}
      if (elDate){
        var valid = elDate.validate();
        if (valid){
          if (window.parametr.showDateCorrection){
            var res = confirm(window.parametr.replaceInvalidDate+': '+elDate.value+" -> "+valid);
            if (res) elDate.value = valid;
            else return false;
          } else {
            alert(window.parametr.invalidDate);
            return false;
          }
        }  
        elDate.valueDate =  Library_getHumanToDate(elDate.value, elDate/*params*/);
        if (Library_getMinimalDate() && elDate.valueDate < Library_getMinimalDate()){
          alert(window.parametr.lessDate);
          return false;
        }
        if (Library_getMaximumDate() && elDate.valueDate > Library_getMaximumDate()){
          alert(window.parametr.invalidDate);
          return false;
        }

        if (elDate.nextCalendar) {
          elDate.nextCalendar.valueDate = Library_getHumanToDate(elDate.nextCalendar.value, elDate.nextCalendar/*params*/);
          if (elDate.valueDate > elDate.nextCalendar.valueDate){
            if (window.parametr.showDateCorrection){
              var delta = /*window.parametr.defaultEndDateDelta ? window.parametr.defaultEndDateDelta*1 : */1;
              var newDate = new Date(elDate.valueDate.getFullYear(), elDate.valueDate.getMonth(), elDate.valueDate.getDate()*1+delta);
              var res = confirm(window.parametr.crossDates+': '+elDate.value+" -> "+valid);
              if (res) elDate.nextCalendar.value = Library_getDateToHuman(newDate, elDate.format);
              else return false;
            } else {
              alert(window.parametr.crossDates);
              return false;
            }
          }
        }
      }
    }
  }
  var rooms = document.getElementById('AO3_HotelsStepOne_roomTypesDiv');
  var roomsContainers = rooms.getElementsByTagName('FIELDSET');

  for (var i=0; i< roomsContainers.length; i++) {
    var roomSelects = roomsContainers[i].getElementsByTagName('SELECT');

    if (roomSelects[1].selectedIndex == 0)
      roomSelects[1].disabled = true;

    if (roomSelects[2].selectedIndex == 0) {
      roomSelects[2].disabled = true;
      roomSelects[3].disabled = true;
      roomSelects[4].disabled = true;
    }
  }
  return true;
}

function AO3HotelsStepOneExtraBedsHandlerAdd() {

  var rooms = document.getElementById('AO3_HotelsStepOne_roomTypesDiv');
  var roomsContainers = rooms.getElementsByTagName('FIELDSET');

  for (var i=0; i< roomsContainers.length; i++) {
    var roomSelects = roomsContainers[i].getElementsByTagName('SELECT');
    var rowDivs = roomsContainers[i].getElementsByTagName('DIV');
    var extraBed = roomSelects[2];

    //naveseni handleru na select s poctem pristylek
    roomSelects[2].onchange = AO3HotelsStepOneExtraBedsHandler;
    roomSelects[2].onchange();
  }
}

function AO3HotelsStepOneExtraBedsHandler() {
  var parentEl = this.parentNode;
  var grandParent = parentEl.parentNode;
  var rowsDiv = grandParent.getElementsByTagName('DIV');
  var roomSelect = grandParent.getElementsByTagName('SELECT');

  switch (this.value) {
    case '1':
      rowsDiv[3].style.display = 'block';
      roomSelect[3].style.display = 'inline';
      roomSelect[4].style.display = 'none';
      roomSelect[3].disabled = false;
      roomSelect[4].disabled = true;
    break;
    case '2':
      rowsDiv[3].style.display = 'block';
      roomSelect[3].style.display = 'inline';
      roomSelect[4].style.display = 'inline';
      roomSelect[3].disabled = false;
      roomSelect[4].disabled = false;
    break;
    case '0':
    default:
      rowsDiv[3].style.display = 'none';
      roomSelect[3].style.display = 'none';
      roomSelect[4].style.display = 'none';
      roomSelect[3].disabled = true;
      roomSelect[4].disabled = true;
    break;
  }
}

function AO3HotelsStepOneRoomTypeHandlerAdd() {

  var rooms = document.getElementById('AO3_HotelsStepOne_roomTypesDiv');
  var roomsContainers = rooms.getElementsByTagName('FIELDSET');

  for (var i=0; i< roomsContainers.length; i++) {
    var roomSelects = roomsContainers[i].getElementsByTagName('SELECT');
    var roomType = roomSelects[0];

    //naveseni handleru na select s poctem pristylek
    roomType.onchange = AO3HotelsStepOneRoomTypeHandler;
    roomType.onchange();
  }
}

function AO3HotelsStepOneRoomTypeHandler() {
  var parentEl = this.parentNode;
  var grandParent = parentEl.parentNode;
  var rowsDiv = grandParent.getElementsByTagName('DIV');
  var roomSelect = grandParent.getElementsByTagName('SELECT');
  if (this.value == 'SB') {
     rowsDiv[1].style.display = 'none';
     rowsDiv[3].style.display = 'none';
     roomSelect[1].value = 0;
     roomSelect[1].disabled = true;
  } else {
     rowsDiv[1].style.display = 'block';
     roomSelect[1].disabled = false;
  }
  var extraBeds = 'none';
  if ((this.value == 'DB') || (this.value == 'TB')) {
     extraBeds = 'block';
     roomSelect[2].disabled = false;
     roomSelect[2].onchange();
  } else {
    roomSelect[2].disabled = true;
    roomSelect[3].disabled = true;
    roomSelect[4].disabled = true;
    roomSelect[2].value = 0;
    roomSelect[3].value = 0;
    roomSelect[4].value = 0;
  }
  rowsDiv[2].style.display = extraBeds;
}

function AO3HotelsStepOneTravelersCountHandlerAdd() {
  var rooms = document.getElementById('AO3_HotelsStepOne_roomCount');
  if (!rooms) return;

  rooms.onchange =  AO3HotelsStepOneTravelersCountHandler;
}

function AO3HotelsStepOneTravelersCountHandler() {
  var roomsDiv = document.getElementById('AO3_HotelsStepOne_roomTypesDiv');
  var roomsCountTmp = roomsDiv.getElementsByTagName('FIELDSET');
  var roomsCount = roomsCountTmp.length;
  var newCount = document.getElementById('AO3_HotelsStepOne_roomCount').value;
  var diff = newCount - roomsCount;

  while (diff != 0) {
    if (diff > 0) {
      var novy = document.getElementById('roomContainer_room0').cloneNode(true);
      var novyName =  'roomContainer_room' + (roomsCount);
      novy.setAttribute('id', novyName);
      roomsDiv.appendChild(novy);

      //prepsat cislo pokoje v nadpisu
      var legendSpans = novy.getElementsByTagName('SPAN');
      legendSpans[1].innerHTML = (roomsCount + 1);


      //pripojit handler pro zmenu pristylek
      var selecty = novy.getElementsByTagName('SELECT');
      selecty[2].onchange = AO3HotelsStepOneExtraBedsHandler;
      selecty[2].onchange();

      //pripojit handler pro zmenu typu pokoje
      var selecty = novy.getElementsByTagName('SELECT');
      selecty[0].onchange = AO3HotelsStepOneRoomTypeHandler;
      selecty[0].onchange();

      //nahradit index pole u pristylek
      //data[childAge][0][]
      for (var j=0; j<=4; j++) {
        var extraName = selecty[j].getAttribute('name').replace('0', roomsCount);
        selecty[j].setAttribute('name', extraName);
      }

/*      var inputy = novy.getElementsByTagName('INPUT');
      for (j=0; j<=1; j++) {
        var extraName = inputy[j].getAttribute('name').replace('0', roomsCount);
        inputy[j].setAttribute('name', extraName);
      }
*/
      diff = diff - 1;
      roomsCount += 1;
    } else {
      roomsDiv.removeChild(roomsDiv.lastChild);
      diff = diff + 1;
      roomsCount -= 1;
    }
  }
}

function AO3HotelsStepOneShowAdvButtonHandlerAdd() {
  var btn = document.getElementById('AO3_HotelsStepOne_AdvancedSearch');
  if (btn) {
    btn.onclick = AO3HotelsStepOneShowAdvButtonHandler;
  }
}

function AO3HotelsStepOneShowAdvButtonHandler() {
  window.parametr.showSearch = !window.parametr.showSearch;
  var elements = new Array('AO3_HotelsStepOne_StarRating', 'AO3_HotelsStepOne_HotelName', 'AO3_HotelsStepOne_CityPartCode', 'AO3_HotelsStepOne_HotelAmenities', 'AO3_HotelsStepOne_HotelSpecDiv');

  for (var i=0; i< elements.length; i++) {
    var el = document.getElementById(elements[i]);
    if (el) AO3HotelsStepOneToogleAdvHandler(el);
  }

  return false;
}

/** Nastaveni casu **/
function AO3HotelsStepOneCalendarDeltaHandlerAdd() {
  var wayType = ['start', 'end'];
  for (wayIndex in wayType){
    var way = wayType[wayIndex];
    var elDay = document.getElementById('AO3_HotelsStepOne_'+way+'Day');
    if (!elDay) continue;
    elDay.onchange = AO3HotelsStepOnecheckTimeHandler;
    var elMonth = document.getElementById('AO3_HotelsStepOne_'+way+'Month');
    elMonth.onchange = AO3HotelsStepOnecheckTimeHandler;
    var elCal = document.getElementById('AO3_HotelsStepOne_'+way+'Calendar');
    elCal.way = way;
    elCal.onclick = AO3HotelsStepOnegetCalendarHandler;
    elMonth.onchange();
  }
}

function Library_CalendarHandlerExternalAdd(inp){
  var elImg = inp.parentNode.getElementsByTagName('IMG');
  for (var k = 0; k < elImg.length; k++){
    if (Library_hasClass(elImg[k], 'showCalendarIcon')){
      elImg[k].targetEl = inp;
      elImg[k].targetAction = "blur";
      elImg[k].onclick = CalendarIconOnclickHandler;
    }
    if (Library_hasClass(elImg[k], 'hiddenCalendarIcon')){
      elImg[k].targetEl = inp;
      elImg[k].targetAction = "focus";
      elImg[k].onclick = CalendarIconOnclickHandler;
    }
  }
  inp.format = window.parametr.dateFormat;
  inp.onchange = AO3CalendarInputOnchangeHandler;
  if(inp.id == 'AO3_HotelStepOne_start' || inp.id == 'AO3_HotelStepOne_end'){
    inp.nextCalendar = inp.id == 'AO3_HotelStepOne_start' ? document.getElementById('AO3_HotelStepOne_end') : false;
    inp.previousCalendar = inp.id == 'AO3_HotelStepOne_end' ? document.getElementById('AO3_HotelStepOne_start') : false;
  } else {
    inp.nextCalendar = inp.id == 'AO3_HotelsStepOne_start' ? document.getElementById('AO3_HotelsStepOne_end') : false;
    inp.previousCalendar = inp.id == 'AO3_HotelsStepOne_end' ? document.getElementById('AO3_HotelsStepOne_start') : false;
  }

}
function CalendarIconOnclickHandler(){
  if (this.targetAction == 'focus') this.targetEl.blur();
  if (this.targetAction == 'blur') this.targetEl.focus();
}
function AO3CalendarInputOnchangeHandler(){
  this.valueDate = Library_getHumanToDate(this.value, this/*params*/);
  if (this.nextCalendar) {
    this.nextCalendar.valueDate = Library_getHumanToDate(this.nextCalendar.value, this.nextCalendar/*params*/);
    if (this.valueDate > this.nextCalendar.valueDate){
      var delta = /*window.parametr.defaultEndDateDelta ? window.parametr.defaultEndDateDelta*1 : */1;
      var newDate = new Date(this.valueDate.getFullYear(), this.valueDate.getMonth(), this.valueDate.getDate()*1+delta);
      this.nextCalendar.value = Library_getDateToHuman(newDate, this.format);
    }
  }
}

function AO3HotelsStepOnegetCalendarHandler(e){
  if (!e) { e = window.event; }

  var params = new Array();
  params['elDay'] = document.getElementById('AO3_HotelsStepOne_'+this.way+'Day');
  params['elMonthYear'] = document.getElementById('AO3_HotelsStepOne_'+this.way+'Month');
  params['maxMonth'] = 'plus12';
  ShowCalendar(params);
  return false;
}

function AO3HotelsStepOneHideAdvHandlerAdd() {
  var elements = new Array('AO3_HotelsStepOne_StarRating', 'AO3_HotelsStepOne_HotelName', 'AO3_HotelsStepOne_CityPartCode', 'AO3_HotelsStepOne_HotelAmenities', 'AO3_HotelsStepOne_HotelSpecDiv');
  if (!window.parametr) {
    window.parametr = new Object();
  }
  window.parametr.showSearch = true;

  for (var i=0; i< elements.length; i++) {
    var el = document.getElementById(elements[i]);
    if (el) AO3HotelsStepOneToogleAdvHandler(el);
  }
}

function AO3HotelsStepOneToogleAdvHandler(el) {
  var how = window.parametr.showSearch;
  el.parentNode.style.display = (how == false ? 'block' : 'none');
  el.disabled = how;
}

function AO3HotelsStepOnecheckTimeHandler(e){
  if (!e) { e = window.event; }
  var params = new Array();
  var lastCheck = 'toDay';
  switch (lastCheck){
    case 'toDay':
      params['elToDay'] = document.getElementById('AO3_HotelsStepOne_endDay');
    case 'toMonth':
      params['elToMonth'] = document.getElementById('AO3_HotelsStepOne_endMonth');
    case 'fromDay':
      params['elFromDay'] = document.getElementById('AO3_HotelsStepOne_startDay');
    case 'fromMonth':
      params['elFromMonth'] = document.getElementById('AO3_HotelsStepOne_startMonth');
    default:
    break;
  }

  params['keepInterval'] = 3600*24*1;//window.parametr.hotelEndDateDelta;
  params['allowWrongDate'] = true;//'future';
  params['autoModify'] = 'from';//'both';

  params['caller'] = this;
  var lastParams = params;
  ergonomicTimeAdjustment(params);
  ergonomicTimeAdjustment(lastParams); // this is not bug !

}

function AO3HotelsStepOneDestinationHandlerAdd() {
  var el = document.getElementById('AO3_HotelsStepOne_chooseLocation');
  if (el){
    el.onclick = AO3HotelsStepOneDestinationHandler;
  }
}

function AO3HotelsStepOneDestinationHandler(e) {
  if (!e) { e = window.event; }
    var inputs = document.getElementsByTagName('INPUT');
    for (var i=inputs.length; i>0; i--) {
      if (Library_hasClass(inputs[(i-1)], 'buttonContinue')){
        var b = inputs[(i-1)];
        break;
      }
    }

   b.name = this.name;
   window.notCheck = true;
   b.click();
}
// ---GuiSearchFormHotelsStepOne.ajax---
function AO3searchFormHotelsstepOneAjaxHandlerAdd(){
    AO3stepOneHotels2destinationHandlerAdd();
}

function AO3stepOneHotels2destinationHandlerAdd(){
  var wayType = ['location'];
  for (wayIndex in wayType){
    var way = wayType[wayIndex];
    var el = document.getElementById('AO3_HotelsStepOne_'+way);
    AO3stepOne2destinationElHandlerAdd(el,way);
  }
}

function AO3stepOne2destinationSelOnChange(e) {
  if (!e) { e = window.event; }
  var select = this;
  var type = this.way;
  if (select.value == '') {
    var input = select.previousSibling;
    select.parentNode.removeChild(select);
    input.style.display = 'inline';
    input.id = 'AO3_HotelsStepOne_'+this.way;
    input.focus();
  }
}
