/** 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;  
    }
  }
}



// ---modules/ForAll.ImageFading---
function setOpacity(obj, opacity) {
  opacity = (opacity == 100) ? 99.999 : opacity;

  // IE/Win
  obj.style.filter = "alpha(opacity:"+opacity+")";

  // Safari<1.2, Konqueror
  obj.style.KHTMLOpacity = opacity/100;

  // Older Mozilla and Firefox
  obj.style.MozOpacity = opacity/100;

  // Safari 1.2, newer Firefox and Mozilla, CSS3
  obj.style.opacity = opacity/100;
}
// ---GuiSearchFormHotels2---
function getDivFormButton(trida){
    var divs = document.getElementsByTagName('div');
    if (!trida)trida = 'formButtons';
    var pred = null;
    for(var i=0;i<divs.length;i++){
      if (Library_hasClass(divs[i], trida)) pred = divs[i];
    }
    return pred;
  }

  function getPageXOffset() {
    var x;
    if (self.pageXOffset) { // all except Explorer
      x = self.pageXOffset;
    } else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict
      x = document.documentElement.scrollLeft;
    } else if (document.body) { // all other Explorers
      x = document.body.scrollLeft;
    }
    return x;
  }

  function AO3searchFormHotels2HandlerAdd(){
  }
// ---GuiSearchFormHotels2StepSpecialOffer---
function AO3searchFormHotels2stepSpecialOfferHandlerAdd() {
  // historicky pouzito pro skyty formular s predvyplnenim dle nabitky, jez vedlo na vyhledavani
}
// ---GuiSearchFormHotels2StepSpecialOffer.ajax---
window.newSpecialOffer = new Array(); // prepisovano ajaxem

function AO3searchFormHotels2stepSpecialOfferAjaxHandlerAdd() {
//  window.debugEl = document.getElementById('left_col');
  AO3searchFormHotels2SpecialOfferAjaxHandlerAdd();
}

function AO3searchFormHotels2getHotelLabelAdd(inps, key, i){
// generovani divu s popisem
      var descrDiv = document.createElement('div');
      descrDiv.className = 'hotelImageDesription '+key+'HotelDesc';
      descrDiv.style.position = 'absolute';
      descrDiv.style.bottom = '0px';
      descrDiv.style.right = '0px';
      descrDiv.style.zIndex = 2;
      inps[i].appendChild(descrDiv);

      var descrName = document.createElement('span');
      descrName.className = 'hotelImageName';
      descrName.innerHTML = 'hotelImageName';
      descrDiv.appendChild(descrName);
      inps[i].descr.name = descrName;

      var descrBr = document.createElement('br');
      descrDiv.appendChild(descrBr);

      var descrDest = document.createElement('span');
      descrDest.className = 'hotelImageDestination';
      descrDest.innerHTML = 'hotelImageName';
      descrDiv.appendChild(descrDest);
      inps[i].descr.destination = descrDest;

}

function AO3searchFormHotels2SpecialOfferAjaxHandlerAdd(){
  var parts = ['top', 'left', 'right'];
//  window.SpecialOffer.parts = Library_shuffleArray(parts);
  var inps = document.getElementsByTagName('A');
  for (var i = 0; i<inps.length; i++){
    if (Library_hasClass(inps[i], 'getHotelById')){
      var key = inps[i].parentNode.id;
      if (key == 'main') key = 'top';
      var noIdHref = inps[i].href;
      var isAfter = noIdHref.indexOf("&", noIdHref.indexOf("hotelDbId="));
      isAfter = isAfter > 0 ? noIdHref.substring(isAfter) : '';
      noIdHref = noIdHref.substring(0, noIdHref.indexOf("&hotelDbId=")) + isAfter;
      inps[i].backUpHref = noIdHref;

      inps[i].descr = new Object;
      var spans = inps[i].getElementsByTagName('SPAN');
      for (var j = 0; j<spans.length; j++){
        if (Library_hasClass(spans[j], 'hotelImageName')){
          inps[i].descr.name = spans[j];
        }
        if (Library_hasClass(spans[j], 'hotelImageDestination')){
          inps[i].descr.destination = spans[j];
        }
      }
      //AO3searchFormHotels2getHotelLabelAdd(inps, key, i);

      var backImage = new Image();
      inps[i].backImage = backImage;
      inps[i].appendChild(backImage);
//      backImage.style.visibility = 'hidden';
      backImage.style.position = 'absolute';
      backImage.style.top = Library_getOffsetTop(inps[i].parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode)+"px";
      backImage.style.left = Library_getOffsetLeft(inps[i].parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode)+"px";
      backImage.style.zIndex = 0;
      var hotelImgs = inps[i].getElementsByTagName('IMG');
      for (var j = 0; j < hotelImgs.length; j++){
        if (Library_hasClass(hotelImgs[j], 'hotelImage')){
          inps[i].fadingImage = hotelImgs[j];
          inps[i].fadingImage.style.position = 'absolute';
          inps[i].fadingImage.style.top = backImage.style.top;
          inps[i].fadingImage.style.left = backImage.style.left;
          inps[i].fadingImage.style.zIndex = 1;
          backImage.src = inps[i].fadingImage.src;
        }
      }
      window.SpecialOffer[key+'Part'] = inps[i];

      window.newSpecialOffer[key+'Part'] = new Object;
      window.newSpecialOffer[key+'Part'].hotelId = inps[i].id.substring(11); // kvuli prvnimu dotazu na ajax
    }
  }
  //AO3searchFormHotels2SpecialOfferChangeAjaxHandlerAdd()
  AO3searchFormHotels2SpecialOfferChangeHandler();
}

function AO3searchFormHotels2SpecialOfferChangeAjaxHandlerAdd() {
  var disabledId = '';
  for (var i in window.newSpecialOffer){
    disabledId += '&data[disabledId]['+i+']='+window.newSpecialOffer[i].hotelId;
  }
  var par = window.parametr;
  var url = par.url;
  if (par.hasSes)url += "?"+par.sesName+"="+par.sesId;
  var separator = (url.indexOf('?') == -1) ? '?' : '&';
  url  = url + separator + 'action=eSearchFormHotels2Data&data[ajax]=hotelSpecialOffer' + disabledId;
  if (window.parametr.needSecurity) url += '&data[needSecurity]=1';

  var element = document.getElementById('main');

  Library_ajaxRequest('hotelSpecialOffer', url, AO3searchFormHotels2SpecialOfferChangeAjaxHandler, element, 0, 1);
}

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

      if (!errors.length) {
        out += httpRequest.responseText;
//  window.debugEl.innerHTML +="BEFORE Eval; <br/>";

        AO3parseAndEval(out);

//  window.debugEl.innerHTML +="AFTER Eval; <br/>";
        var parts = ['top', 'left', 'right'];
        window.SpecialOffer.parts = parts;//AO3generateRandomArray(parts);

        window.setTimeout('AO3searchFormHotels2SpecialOfferChangeHandler()', window.SpecialOffer.interval);
//  window.debugEl.innerHTML +="new INIT; <br/>";

      } else {
//        window.setTimeout('AO3searchFormHotels2SpecialOfferChangeAjaxHandlerAdd()', 1000); // po sekunde zkusit znovu
      }

      LibraryVar_ajaxRequests[type] = null;
      LibraryVar_ajaxRequestsObjects[type] = null;
    } else {
      Library_debugAlert('There was a problem with the request *hotel special offer*.');
    }
  }
}

function AO3parseAndEval(kod){
  var res = new String(kod);
  res = res.substring(0, res.indexOf('/* ]]> */'));
  res = res.substring(res.indexOf('/* <![CDATA[ */'));
  eval (res);
}

function AO3searchFormHotels2SpecialOfferGetNextPart(nextTime){
//  window.debugEl.innerHTML +=window.SpecialOffer.parts.length+'/'+nextTime+"; ";
  if (window.SpecialOffer.parts.length){
    if (nextTime){
      var next = window.SpecialOffer.parts.pop();
      window.setTimeout('AO3searchFormHotels2SpecialOfferChangeHandler("'+next+'")', window.SpecialOffer.interval);
    } else {
      AO3searchFormHotels2SpecialOfferChangeHandler(window.SpecialOffer.parts.pop()); // preskoci hodnotu
    }
  } else {
    AO3searchFormHotels2SpecialOfferChangeAjaxHandlerAdd();
  }
}

function AO3searchFormHotels2SpecialOfferChangeHandler(part){
  if (part && window.SpecialOffer[part+'Part']){
    var el = window.SpecialOffer[part+'Part'];
    var source = window.newSpecialOffer[part+'Part'];
    if (source && source.hotelImage && source.imageId && (!el.newImage || el.backImage.src.toString()  != source.hotelImage.src.toString())){ // posledni pozadavek je o zmene hodnoty
      el.newImage = source;
      AO3searchFormHotels2SpecialOfferFadeOut(part, 100); // nastartovani prechodoveho efektu
      window.setTimeout('window.SpecialOffer["'+part+'Part"].backImage.src = window.SpecialOffer["'+part+'Part"].newImage.hotelImage.src;', 100);

      AO3searchFormHotels2SpecialOfferGetNextPart(true);
    } else {
      AO3searchFormHotels2SpecialOfferGetNextPart(false);
    }
  } else {
    AO3searchFormHotels2SpecialOfferGetNextPart(false);
  }
}

/*
function AO3searchFormHotels2SpecialOfferFadeIn(part, opacity) {
  var obj = window.SpecialOffer[part+'Part'].fadingImage;//document.getElementById(objId);
  if (obj){
    if (!window.selectedDestination || (window.selectedDestination != window.SpecialOffer[part+'Part'].id)){
      window.SpecialOffer[part+'Part'].timer = window.setTimeout("AO3searchFormHotels2SpecialOfferFadeOut('"+part+"',"+opacity+")", window.SpecialOffer.fadingInterval);
    } else {
      if (opacity <= 100) {
        setOpacity(obj, opacity);
        opacity += window.SpecialOffer.fadingStep;
        window.SpecialOffer[part+'Part'].timer = window.setTimeout("AO3searchFormHotels2SpecialOfferFadeIn('"+part+"',"+opacity+")", window.SpecialOffer.fadingInterval);
      } else {
        setOpacity(obj, 100);
      }
    }
  }
}
*/

function AO3searchFormHotels2SpecialOfferFadeOut(part, opacity) { // staremu obrazku se snizuje pruhlednost, v pozadi je novy
  var obj = window.SpecialOffer[part+'Part'].fadingImage;//document.getElementById(objId);
  if (obj){
      if (opacity >= 0) {
        setOpacity(obj, opacity);
        obj.style.visibility = 'visible';
        opacity -= window.SpecialOffer.fadingStep;
        window.SpecialOffer[part+'Part'].timer = window.setTimeout("AO3searchFormHotels2SpecialOfferFadeOut('"+part+"',"+opacity+")", window.SpecialOffer.fadingInterval);
      } else {
        obj.style.visibility = 'hidden';
        obj.src = window.SpecialOffer[part+'Part'].backImage.src;//stary nahradi novy
        setOpacity(obj, 100);
        AO3searchFormHotels2SpecialOfferSetNewImage(part);
      }
  }
}

function AO3searchFormHotels2SpecialOfferSetNewImage(part){
    var el = window.SpecialOffer[part+'Part'];
    var source = el.newImage;
    if (source) {
      el.id = 'hotelButton'+source.hotelId;//hotelButton
      el.href = source.link; //el.backUpHref + '&hotelDbId=' + source.hotelId;
      var stars = '';
      if (!isNaN(source.stars * 1)){
          for (var s = 0; s < (source.stars * 1); s++){
            stars += '*';
          }
      }
      el.descr.name.innerHTML = source.name;
      el.descr.destination.innerHTML = source.destination;
      el.title = source.name + stars;
      el.backImage.alt = source.name + stars;
      el.fadingImage.alt = source.name + stars;
    }
}
// ---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 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 = cursor.innerHTML.substr(cursor.innerHTML.length-4,3);
      var label = cursor.innerHTML /*.substr(0,cursor.innerHTML.length - 6)*/;
      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 = this.innerHTML.substr(this.innerHTML.length-4,3);
  var label = this.innerHTML/*.substr(0,this.innerHTML.length - 6)*/;

  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.Calendar---
/** Datove fce **/

/**
* ShowCalendar(hash);
*
* Argumenty:
*   hash::elFromDay
*   hash::elFromMonth
*   hash::elFromTime (nepovinny)
*
*   hash::elToDay
*   hash::elToMonth
*   hash::elToTime (nepovinny)
*
*   hash::autoModify (none|from|to|both pri krizeni datumu provadeni automatickych oprav daneho datumu - from - mensi prilet na vetsi, Less povoluje datum pred aktualnim datem)
*   hash::allowWrongDate (true|false|future pro povoleni zadani neexistujiciho datumu - true , future - v budoucnu)
*
*   hash::keepInterval
*   - interval, ktery ma byt v pripade, ze se ma provest uprava datumu 'od' a 'do' dodrzet (delta)
*
*   hash::caller
*   - html element, ktery spousti funkci ergonomicTimeAdjustment, nutne to musi byt
*    jeden z elFrom* nebo elTo*
*   - podle nej se poznava, ktery datum ('od' nebo 'do') klient manualne nastavuje a ktery
*     ma byt automaticky prizpusoben
*
* nepovinne :
*   hash::windowWidth
*   hash::windowHeight
*   hash::months (default ... 1)
*/
function ergonomicTimeAdjustment(hash){
  /**
  * Argumenty:
  *   hash::elMonth... select-box `mesic`
  *   hash::elDay... select-box `den`
  *   hash::elTime... select-box `cas' (nepovinny)
  * Vraci:
  *   - objekt Date s datumem odpovidajicim hodnotam ve vstupnich polich
  *   - false v pripade, ze vstupni pole obsahuji nespravna data (napr. 31. zari)
  */

/*
  setDateOptionsStyle(hash);
  parseDate(hash);
  getRightDate(hash, delta);
  chooseSelectOption(elSelect, optionValue);
  __onDateValid(hash);
  __onDateInvalid(hash);
  saveDate(hash);
  getCurrentDate();
*/
  function setDateOptionsStyle(hash){
    //  - podbarvuje den dle validnich moznosti
    //  - predpokladany format vstupu ze select-boxu:
    //    - dny... D (cislo dne v mesici)
    //    - mesic, rok... parsovat z retezce YYYY-MM
    var strMonthYear = hash['elMonth'].value;
    var year = parseInt(strMonthYear.substring(0, 4), 10);
    var month = parseInt(strMonthYear.substring(5, 7), 10)-1;
    var day = parseInt(hash['elDay'].value, 10);
    var today = getCurrentDate();
//    var checkDate = new Date(year, month, day);
//    alert(hash['elDay'].id+'*'+hash['elDay'].options.length+' in '+year+'/'+month);
    for (var i = 0; i < hash['elDay'].options.length; i++){
      var dayCheck = parseInt(hash['elDay'].options[i].value, 10);
      var checkDate = new Date(year, month, dayCheck);// pri nastaveni dvou dnu nad limit by posunul mesic o 2
      var cn = 'rightDate';
      if (checkDate.getDate() != dayCheck) cn = 'inputError wrongDate';
      if (checkDate < today) {
       cn = 'inputError lowDate';
      }
      hash['elDay'].options[i].className = cn;
    }

    for (var i = 0; i < hash['elMonth'].options.length; i++){
      var cn = 'rightDate';
      // Kontrola relevance mesice
      if (i == hash['elMonth'].selectedIndex || false){ // at se ostatni mesice tvari jako OK
        var strMonthYearCheck = hash['elMonth'].options[i].value;
        var yearCheck = parseInt(strMonthYearCheck.substring(0, 4), 10);
        var monthCheck = parseInt(strMonthYearCheck.substring(5, 7), 10)-1;
        var checkDate = new Date(yearCheck, monthCheck, day);// pri nastaveni dvou dnu nad limit by posunul mesic o 2
        if (checkDate.getDate() != day) cn = 'inputError wrongDate';
        if (checkDate < today) {
         cn = 'inputError lowDate';
        }
      }
      hash['elMonth'].options[i].className = cn;
    }
  }

  function parseDate(hash){
    //  - predpokladany format vstupu ze select-boxu:
    //    - hodiny... HH:MM
    //    - dny... D (cislo dne v mesici)
    //    - mesic, rok... parsovat z retezce YYYY-MM
    var hour = 0; var minute = 0;

    if(hash['elTime']){
      var strTime = hash['elTime'].value;

      hour = parseInt(strTime.substring(0, 2), 10);
      if(!hour) hour = 0;

      minute = parseInt(strTime.substring(3), 10);
      if(!minute) minute = 0;
    }

    var day = parseInt(hash['elDay'].value, 10);

    var strMonthYear = hash['elMonth'].value;
    var year = parseInt(strMonthYear.substring(0, 4), 10);
    var month = parseInt(strMonthYear.substring(5, 7), 10)-1;

    var result = new Date(year, month, day, hour, minute);

    //  - test validity datumu (den v mesici)
    if (result.getDate() != day/* (result < new Date())*/)
      return false;
    else
      return result;
  }

  function getRightDate(hash, delta){
    if (!delta) delta = 0;
    //  - predpokladany format vstupu ze select-boxu - nespravne datum:
    var hour = 0; var minute = 0;

    if(hash['elTime']){
      var strTime = hash['elTime'].value;

      hour = parseInt(strTime.substring(0, 2), 10);
      if(!hour) hour = 0;

      minute = parseInt(strTime.substring(3), 10);
      if(!minute) minute = 0;
    }

    var day = parseInt(hash['elDay'].value, 10);

    var strMonthYear = hash['elMonth'].value;
    var year = parseInt(strMonthYear.substring(0, 4), 10);
    var month = parseInt(strMonthYear.substring(5, 7), 10)-1;

    var result = new Date(year, month, day, hour, minute);
    var currentDate = new Date();
    //  - test validity datumu (den v mesici)
    if (result < currentDate){
      result.setYear(currentDate.getYear() < 1900 ? currentDate.getYear()+1900 : currentDate.getYear());
      result.setMonth(currentDate.getMonth());
      result.setDate(currentDate.getDate());
      result.setMonth(currentDate.getDate());
      result.setHours((result.getMinutes() ? 1 : 0) + result.getHours());
      result.setMinutes(0);
      result.setSeconds(delta);
    }
    return result;
  }

  /**
  * Argumenty:
  *   elSelect... objekt Select, kteremu chci nastavit hodnotu option na `selected`
  *   optionValue... hodnota (option.value) optionu, ktery ma byt nastaven na `selected`
  */
  function chooseSelectOption(elSelect, optionValue){
    for(var i=0; i < elSelect.options.length; i++){
      if(elSelect.options[i].value == optionValue){
//        elSelect.options[i].selected = true;
//    /*
        elSelect.selectedIndex = i;
        break;
// */
      }
    }
  }

  /**
  * Udalost, ktera je vyvolana v pripade, ze datum ulozene v elementech
  * hash::elMonth, hash::elDay, hash::elTime je validni.
  *
  * Argumenty:
  *   hash::elMonth
  *   hash::elDay
  *   hash::elTime
  */
  function __onDateValid(hash){
    //  -TODO: doplnit telo... uprava stylu select-boxu
    // Library_debugAlert('datum OK');
    Library_removeClass(hash['elMonth'], 'inputError');
    Library_removeClass(hash['elDay'], 'inputError');
    setDateOptionsStyle(hash);
  }

  /**
  * Udalost, ktera je vyvolana v pripade, ze datum ulozene v elementech
  * hash::elMonth, hash::elDay, hash::elTime NENI validni.
  *
  * Argumenty:
  *   hash::elMonth
  *   hash::elDay
  *   hash::elTime
  */
  function __onDateInvalid(hash){
    //  -TODO: doplnit telo... uprava stylu select-boxu hash::elMonth, hash::elDay... atd.
    // Library_debugAlert('datum BAD');
    Library_addClass(hash['elMonth'], 'inputError');
    Library_addClass(hash['elDay'], 'inputError');
    setDateOptionsStyle(hash);
  }

  function getCurrentDate(){
    var d = new Date();
    d.setHours(0);
    d.setMinutes(0);
    d.setSeconds(0);
    d.setMilliseconds(0);
    return d;
  }

  /**
  * Nastavi elementy hash::elMonth, hash::elDay a hash::elTime tak, aby zobrazovaly
  * datum hash::date.
  *
  * Argumenty:
  *   hash::elMonth
  *   hash::elDay
  *   hash::elTime
  *   hash::date
  */
  function saveDate(hash){
    if(hash['elMonth']){
      // format YY-mm
      //  - bug v js... problem s Y2K (neni opraven ve vsech prohlizecich: IE ano, Firefox ne...)
      var strYear = hash['date'].getYear();
      if(strYear < 1900) strYear+= 1900;
      var month = hash['date'].getMonth() + 1;
      var strMonth = (month < 10)?('0' + month):(month);
      var s = strYear + '-' + strMonth;

      chooseSelectOption(hash['elMonth'], s);
    }

    if(hash['elDay']){
      var strDay = hash['date'].getDate();
      chooseSelectOption(hash['elDay'], strDay);
    }

    if(hash['elTime']){
      strHour = (hash['date'].getHours() < 10)?('0' + hash['date'].getHours()):(hash['date'].getHours());
      strMinute = (hash['date'].getMinutes() < 10)?('0' + hash['date'].getMinutes()):(hash['date'].getMinutes());
      var s = strHour + ':' + strMinute;

      chooseSelectOption(hash['elTime'], s);
    }

    setDateOptionsStyle(hash);
  }

// Hlavni vetev zpracovani

  if (!hash['allowWrongDate'] && hash['allowWrongDate']!== false) hash['allowWrongDate'] = true;//'future';
  if (!hash['autoModify']) hash['autoModify'] = 'from';//'both';


  var _caller = hash['caller'];

  //  - rozhodnuti, ktere hodnoty se budou prizpusobovat, zda hodnoty 'od' nebo 'do'
  //  - defaultne se predpoklada prizpusobovani 'do'
  //  - autoModify urcuje vztah prizpusobovani
  var toAdjust = 'to';
  if ((
      ((hash['elToTime']) && (hash['elToTime'] == _caller))
      ||
      hash['elToDay'] == _caller
      ||
      hash['elToMonth'] == _caller
  )
  || (
      ((hash['elToTime']) && (hash['elToTime'] == hash['elToTime'].id == _caller.id))
      ||
      hash['elToDay'].id == _caller.id
      ||
      hash['elToMonth'].id == _caller.id
   )){
    toAdjust = 'from';
  }
  var flagDateInvalid = false;

  //  - parsovani data 'od'
  var paramsFrom = new Array();
  paramsFrom['elTime'] = hash['elFromTime'];
  paramsFrom['elDay'] = hash['elFromDay'];
  paramsFrom['elMonth'] = hash['elFromMonth'];
  __onDateValid(paramsFrom);
  __onDateInvalid(paramsFrom);

  var fromDate = parseDate(paramsFrom);
  if (fromDate){
    __onDateValid(paramsFrom);
  } else {
    if (!hash['allowWrongDate']){
      paramsFrom['date'] = getRightDate(paramsFrom);
      saveDate(paramsFrom);
    } else {
      __onDateInvalid(paramsFrom);
      flagDateInvalid = true;
    }
  }

  //  - parsovani data 'do'
  var paramsTo = new Array();
  paramsTo['elTime'] = hash['elToTime'];
  paramsTo['elDay'] = hash['elToDay'];
  paramsTo['elMonth'] = hash['elToMonth'];
  __onDateValid(paramsTo);
  __onDateInvalid(paramsTo);

  var toDate = parseDate(paramsTo); // vraci pouze existujici datumy (v porovnani dnu)
  if (toDate){
    __onDateValid(paramsTo);
  } else {
    if (!hash['allowWrongDate']){
      paramsTo['date'] = getRightDate(paramsTo, hash['keepInterval']);
      saveDate(paramsTo);
    } else {
      __onDateInvalid(paramsTo);
      flagDateInvalid = true;
    }
  }

  //  - LOGIKA: osetreni datumu, ktery je v minulosti
  var currentDate = getCurrentDate();
  if (fromDate && fromDate < currentDate){
    if (!hash['allowWrongDate'] || hash['allowWrongDate'] != 'future'){ // neopravovat
      __onDateInvalid(paramsFrom);
      flagDateInvalid = true;
    } else {
      //  - hodnoty select-boxu pro cas maji tvar HH:00, minuty se proto musi
      //    nastavit tak, aby z objektu Date bylo mozne zrekonstruovat
      //    atribut select::options[]::value
      var newDate = new Date;
//      fromDate.setYear(currentDate.getYear() < 1900 ? currentDate.getYear()+1900 : currentDate.getYear());
//      fromDate.setMonth(currentDate.getMonth());
//      fromDate.setDate(currentDate.getDate());
      newDate.setHours(fromDate ? (fromDate.getMinutes() ? 1 : 0) + fromDate.getHours() : 0);
      newDate.setMinutes(0);
      newDate.setSeconds(0);
      fromDate = newDate;

      var params = new Array();
      if(hash['elFromMonth']) params['elMonth'] = hash['elFromMonth'];
      if(hash['elFromDay']) params['elDay'] = hash['elFromDay'];

      //  - pouze pokud zakaznik specifikuje cas, mohu cas modifikovat
      if(hash['elFromTime'])
        if(hash['elFromTime'].value)
          params['elTime'] = hash['elFromTime'];
      params['date'] = fromDate;
      saveDate(params); // oprava datumu pred aktualnim casem
    }
  }

  if (toDate && toDate < currentDate){// necha se zpracovat from
    if (!hash['allowWrongDate'] || hash['allowWrongDate'] != 'future'){ // neopravovat
      __onDateInvalid(paramsTo);
      flagDateInvalid = true;
    } else {
      var newDate = new Date;
//      toDate.setYear(currentDate.getYear() < 1900 ? currentDate.getYear()+1900 : currentDate.getYear());
//      toDate.setMonth(currentDate.getMonth());
//      toDate.setDate(currentDate.getDate());
      newDate.setHours(toDate ? (toDate.getMinutes() ? 1 : 0) + toDate.getHours() : 0);
      newDate.setMinutes(0);
      newDate.setSeconds(hash['keepInterval']);
      toDate = newDate;

      var params = new Array();
      if(hash['elToMonth']) params['elMonth'] = hash['elToMonth'];
      if(hash['elToDay']) params['elDay'] = hash['elToDay'];

      //  - pouze pokud zakaznik specifikuje cas, mohu cas modifikovat
      if(hash['elToTime'])
        if(hash['elToTime'].value)
          params['elTime'] = hash['elToTime'];
      params['date'] = toDate;
      saveDate(params);
    }
  }

  if(flagDateInvalid) return false; //neposouvat hodnoty vuci neplatnemu datumu

  //  - LOGIKA: prekrizeni datumu
  if(fromDate > toDate){
    if(toAdjust == 'to'){
      if (Library_inArray(['from', 'both'], hash['autoModify'])){
        //  - vychazim z data 'od' a podle nej prizpusobuji datum 'do'
        toDate = new Date(fromDate);
        toDate.setSeconds(fromDate.getSeconds() + hash['keepInterval']);

        var params = new Array();
        if(hash['elToMonth']) params['elMonth'] = hash['elToMonth'];
        if(hash['elToDay']) params['elDay'] = hash['elToDay'];
        //  - pokud zakaznik zadal cas 'od', predpoklada se, ze pozaduje
        //    i zadani casu 'do' (probehne automaticky)
        if(hash['elToTime'])
          if(hash['elFromTime'].value)
            params['elTime'] = hash['elToTime'];
        params['date'] = toDate;
        saveDate(params);
      }
    } else {
      if (Library_inArray(['to', 'both'], hash['autoModify'])){
        //  - vychazim z data 'do' a podle nej prizpusobuji datum 'od'
        //  - je treba resit i situaci, kdy by upraveni casu 'od' zpet
        //    zpusobilo skok do minulosti
        if((_caller == hash['elToDay']) || (_caller.id == hash['elToDay'].id)){
          //  - LOGIKA: prekrizeni datumu, ktere bylo zpusobeno zmenou dne v mesici
          //  - uzivatel pravdepodobne zamysli nastavit 'do' na nektery z nasledujicich
          //    mesicu
          //  - nastavuji mu mesic select-boxu o jeden dopredu
          toDate.setMonth(toDate.getMonth()+1);

          var params = new Array();
          if(hash['elToMonth']) params['elMonth'] = hash['elToMonth'];
          if(hash['elToDay']) params['elDay'] = hash['elToDay'];
          //  - pokud zakaznik zadal cas 'od', predpoklada se, ze pozaduje
          //    i zadani casu 'do' (probehne automaticky)
          if(hash['elToTime'])
            if(hash['elFromTime'].value)
              params['elTime'] = hash['elToTime'];
          params['date'] = toDate;
          saveDate(params);
          hash['elToMonth'].onchange();
        } else {
          var currentDate = new Date();

          fromDate = new Date(toDate);
          fromDate.setSeconds(toDate.getSeconds() - hash['keepInterval']);

          if(fromDate < currentDate) fromDate = currentDate;

          var params = new Array();
          if(hash['elFromMonth']) params['elMonth'] = hash['elFromMonth'];
          if(hash['elFromDay']) params['elDay'] = hash['elFromDay'];

          //  - pouze pokud zakaznik specifikuje cas, mohu cas modifikovat
          if(hash['elFromTime'])
            if(hash['elFromTime'].value)
              params['elTime'] = hash['elFromTime'];

          params['date'] = fromDate;
          saveDate(params);
        }
      }
    }
  }

  return true;
}

function onSubmitCalendarData(hash){
  function parseDate(hash){
    //  - predpokladany format vstupu ze select-boxu:
    //    - hodiny... HH:MM
    //    - dny... D (cislo dne v mesici)
    //    - mesic, rok... parsovat z retezce YYYY-MM
    var hour = 0; var minute = 0;

    if(hash['elTime']){
      var strTime = hash['elTime'].value;

      hour = parseInt(strTime.substring(0, 2), 10);
      if(!hour) hour = 0;

      minute = parseInt(strTime.substring(3), 10);
      if(!minute) minute = 0;
    }

    var day = parseInt(hash['elDay'].value, 10);

    var strMonthYear = hash['elMonth'].value;
    var year = parseInt(strMonthYear.substring(0, 4), 10);
    var month = parseInt(strMonthYear.substring(5, 7), 10)-1;

    var result = new Date(year, month, day, hour, minute);

    //  - test validity datumu (den v mesici)
    if (result.getDate() != day/* (result < new Date())*/)
      return false;
    else
      return result;
  }

  function getRightDate(hash, delta){
    if (!delta) delta = 0;
    //  - predpokladany format vstupu ze select-boxu - nespravne datum:
    var hour = 0; var minute = 0;

    if(hash['elTime']){
      var strTime = hash['elTime'].value;

      hour = parseInt(strTime.substring(0, 2), 10);
      if(!hour) hour = 0;

      minute = parseInt(strTime.substring(3), 10);
      if(!minute) minute = 0;
    }

    var day = parseInt(hash['elDay'].value, 10);

    var strMonthYear = hash['elMonth'].value;
    var year = parseInt(strMonthYear.substring(0, 4), 10);
    var month = parseInt(strMonthYear.substring(5, 7), 10)-1;

    var result = new Date(year, month, day, hour, minute);
    var currentDate = new Date();
    //  - test validity datumu (den v mesici)
    if (result < currentDate){
      result.setYear(currentDate.getYear() < 1900 ? currentDate.getYear()+1900 : currentDate.getYear());
      result.setMonth(currentDate.getMonth());
      result.setDate(currentDate.getDate());
      result.setMonth(currentDate.getDate());
      result.setHours((result.getMinutes() ? 1 : 0) + result.getHours());
      result.setMinutes(0);
      result.setSeconds(delta);
    }
    return result;
  }

  function getCurrentDate(){
    var d = new Date();
    d.setHours(0);
    d.setMinutes(0);
    d.setSeconds(0);
    d.setMilliseconds(0);
    return d;
  }

  //  - parsovani data 'od'
  var paramsFrom = new Array();
  paramsFrom['elTime'] = hash['elFromTime'];
  paramsFrom['elDay'] = hash['elFromDay'];
  paramsFrom['elMonth'] = hash['elFromMonth'];
  var fromDate = parseDate(paramsFrom);
  if (!fromDate){
    return 'INVALID_FROM';
  }

  if (hash['elToMonth']){ // pokud kontroluji jen jedno datum
    //  - parsovani data 'do'
    var paramsTo = new Array();
    paramsTo['elTime'] = hash['elToTime'];
    paramsTo['elDay'] = hash['elToDay'];
    paramsTo['elMonth'] = hash['elToMonth'];
    var toDate = parseDate(paramsTo);
    if (!toDate){
      return 'INVALID_TO';
    }
  }
  //  - LOGIKA: osetreni datumu, ktery je v minulosti
  var currentDate = getCurrentDate();
  if (fromDate < currentDate){
    return 'LESS_FROM';
  }

  if (hash['elToMonth']){ // pokud kontroluji jen jedno datum
    if (toDate < currentDate){
      return 'LESS_TO';
    }

    if(fromDate > toDate){
      return 'CROSS_DATES';
    }
    if(fromDate.getTime() == toDate.getTime()){
      return 'EQUAL_DATES';
    }
  }
  return false;
}

function onReceiveCalendarData(hash){
  /**
  * Argumenty:
  *   elSelect... objekt Select, kteremu chci nastavit hodnotu option na `selected`
  *   optionValue... hodnota (option.value) optionu, ktery ma byt nastaven na `selected`
  */
  function chooseSelectOption(elSelect, optionValue){
    for(var i=0; i < elSelect.options.length; i++){
      if(elSelect.options[i].value == optionValue) elSelect.options[i].selected = true;
    }
  }

  /**
  * Nastavi elementy hash::elMonth, hash::elDay a hash::elTime tak, aby zobrazovaly
  * datum hash::date.
  *
  * Argumenty:
  *   hash::elMonth
  *   hash::elDay
  *   hash::elTime
  *   hash::date
  */
  function saveDate(hash){
    if(hash['elMonth']){
      //  - bug v js... problem s Y2K (neni opraven ve vsech prohlizecich: IE ano, Firefox ne...)
      var strYear = hash['date'].getYear();
      if(strYear < 1900) strYear+= 1900;
      var month = hash['date'].getMonth() + 1;
      var strMonth = (month < 10)?('0' + month):(month);
      var s = strYear + '-' + strMonth;

      chooseSelectOption(hash['elMonth'], s);
    }

    if(hash['elDay']){
      var strDay = hash['date'].getDate();
      chooseSelectOption(hash['elDay'], strDay);
    }

    if(hash['elTime']){
      strHour = (hash['date'].getHours() < 10)?('0' + hash['date'].getHours()):(hash['date'].getHours());
      strMinute = (hash['date'].getMinutes() < 10)?('0' + hash['date'].getMinutes()):(hash['date'].getMinutes());
      var s = strHour + ':' + strMinute;

      chooseSelectOption(hash['elTime'], s);
    }
  }

  var params = new Array();
  params['elMonth'] = hash['elMonthYear'];
  params['elDay'] = hash['elDay'];
  params['date'] = new Date(
    hash['selectedYear'],
    hash['selectedMonth']-1,
    hash['selectedDay'],
    0, 0, 0
  );
  saveDate(params);
//  if (hash['caller'] != hash['elMonthYear'])
    hash['elMonthYear'].onchange();
}

/**
* Argumenty:
*   hash::url
*   hash::windowWidth
*   hash::windowHeight
*   hash::windowXCoord
*   hash::windowYCoord
*
*/

function ShowCalendar(hash){
  var popHeight = 220;

  if(!hash['months']) hash['months'] = 2;
  if(!hash['windowWidth']) hash['windowWidth'] = 220;
  if(!hash['windowHeight']) hash['windowHeight'] = 220 + 152*(hash['months']-1);
  if(!hash['windowXCoord']) hash['windowXCoord'] = 0;
  if(!hash['windowYCoord']) hash['windowYCoord'] = 0;
  hash['maxMonth'] = hash['maxMonth'] ? ('&maxMonth='+hash['maxMonth']) : '';
  if (/*!hash['url']*/true) hash['url'] = window.parametr.url+'?action=eCalendarData&frame=calendar&months='+hash['months']+'&defDay='+hash['elDay'].value+'&defMonth='+hash['elMonthYear'].value+hash['maxMonth'];

  window.open(hash['url'], "", "toolbar=no,scrollbars=no,location=no,status=no,width=" + hash['windowWidth'] + ",height=" + hash['windowHeight'] + ",resizable=0,screenX=" + hash['windowXCoord'] + ",screenY=" + hash['windowYCoord']);
  window.showCalendarParams = hash;
  window.onReceiveCalendarData = onReceiveCalendarData;
}
// ---GuiSearchFormHotels2StepOne---
function AO3searchFormHotels2stepOneHandlerAdd() {
  AO3Hotels2StepOneHideAdvHandlerAdd();
  AO3Hotels2StepOneShowAdvHandlerAdd();
  AO3stepOneHotels2setTimeHandlerAdd();
  AO3stepOneHotels2buttDestinationHandlerAdd();
  AO3stepOne2HotelAndDestinationHandlerAdd();
  AO3stepOneHotels2FormOnsubmitHandlerAdd();
  AO3stepOneHotels2CheckMaxAmenitiesCountAdd();
   // NEED: /modules/ForAll.Calendar.js
}

/** chooseDestination **/

function AO3stepOneHotels2buttDestinationHandlerAdd(){
  var wayType = ['location'];
  for (wayIndex in wayType){
    var way = wayType[wayIndex];
    var el = document.getElementById('AO3_HotelsStepOne_'+way+'Button');
    if (el && !el.onclick){
      el.onclick = AO3stepOneHotels2buttonDestinationHandler;
    }

  }
}

function AO3stepOneHotels2buttonDestinationHandler(e){
  if (!e) {e = window.event;}
   var b = document.getElementById('AO3_HotelsStepOne_buttonContinue');
   b.name=this.name;
   window.notCheck = true;
   b.click();
}

/** advance search **/
function AO3Hotels2StepOneShowAdvHandlerAdd() {
  var btn = document.getElementById('AO3_HotelsStepOne_AdvancedSearch');
  if (btn) {
    btn.onclick = AO3Hotels2StepOneShowAdvButtonHandler;
  }
}

function AO3Hotels2StepOneShowAdvButtonHandler() {
  var elements = new Array('AO3_HotelsStepOne_extendedSearchContain');

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

  return false;
}
function  AO3Hotels2StepOneHideAdvHandlerAdd(){
  var elements = new Array('AO3_HotelsStepOne_extendedSearchContain');
  if (!window.parametr) {
    window.parametr = new Object();
  }

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

function AO3Hotels2HasEnteredValue(el){
  // kontroluje hodnoty pro vyplnene polozky formulare
  var i;
  var elements = el.getElementsByTagName('input');
  for (i=0; i< elements.length; i++) {
    if (elements[i].type=='text' && elements[i].value) return true;
    if (elements[i].type=='checkbox' && elements[i].checked) return true;
  }
  elements = el.getElementsByTagName('select');
  for (i=0; i< elements.length; i++) {
    if (elements[i].value) return true;
  }
  return false;
}

function AO3Hotels2StepOneToogleAdvHandler(el) {
  var how = el.showSearch;
  el.style.display = (how == false ? 'block' : 'none');
  var elements = el.getElementsByTagName('input');
  for (var i=0; i< elements.length; i++) {
    elements[i].disabled = how;
  }
  elements = el.getElementsByTagName('select');
  for (var i=0; i< elements.length; i++) {
    elements[i].disabled = how;
  }
  el.showSearch = !el.showSearch;
}
/** Switch hotels / destiantion**/

function AO3stepOne2HotelAndDestinationHandlerAdd(){
  var HotDes = document.getElementById('AO3_HotelsStepOne_HotelName');
  if (HotDes){
    var elLocation = document.getElementById('AO3_HotelsStepOne_location');
    if (!elLocation) elLocation = document.getElementById('AO3_HotelsStepOne_location_noajax');

    HotDes.locat = elLocation.parentNode;
    HotDes.subm = document.getElementById('AO3_HotelsStepOne_buttonContinue');
    HotDes.onchange = AO3stepOne2HotelAndDestinationHandler;
  }
}

function AO3stepOne2HotelAndDestinationHandler(e){
/*  if (this.value){
    this.locat.style.display = 'none';
  } else {
    this.locat.style.display = 'block';
  }*/
  if (Library_hasClass(e, 'nonRCT')) return true;
  if (this.value){
    this.locat.style.visibility = 'hidden';
    this.locat.style.marginTop = '-1.8em';
    this.subm.name = 'data[stepChooseHotelAndRooms]';
  } else {
    this.locat.style.visibility = 'visible';
    this.locat.style.marginTop = '0em';
    this.subm.name = 'data[stepChooseHotel]';
  }
  return true;
}

/** Nastaveni casu **/
function AO3stepOneHotels2setTimeHandlerAdd(){
  var wayType = ['start', 'end'];
  for (wayIndex in wayType){
    var way = wayType[wayIndex];
//    alert(way);
    var elDay = document.getElementById('AO3_HotelsStepOne_'+way+'Day');
    if (!elDay) continue; // nove zadavani datumu
    elDay.onchange = AO3stepOneHotels2checkTimeHandler;
    var elMonth = document.getElementById('AO3_HotelsStepOne_'+way+'Month');
    elMonth.onchange = AO3stepOneHotels2checkTimeHandler;
    var elCal = document.getElementById('AO3_HotelsStepOne_'+way+'Calendar');
    elCal.way = way;
    elCal.style.display = 'inline';
    elCal.onclick = AO3stepOneHotels2getCalendarHandler;
    elMonth.onchange();
  }
}

function AO3stepOneHotels2getCalendarHandler(e){
  if (!e) {e = window.event;}
//id ... [arrival|departure]
  var params = new Array();
  params['elDay'] = document.getElementById('AO3_HotelsStepOne_'+this.way+'Day');
  params['elMonthYear'] = document.getElementById('AO3_HotelsStepOne_'+this.way+'Month');
  ShowCalendar(params);
  return false;
}

function AO3stepOneHotels2checkTimeHandler(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.defaultEndDateDelta;
  params['allowWrongDate'] = true;//'future';
  params['autoModify'] = 'from';//'both';

  params['caller'] = this;
  var lastParams = params;
  ergonomicTimeAdjustment(params);
  ergonomicTimeAdjustment(lastParams); // this is not bug !
}
/* ajaxove zadavani datumu + text box*/
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;
  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;
}
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);
    }
  }
}
// overovani formulare pred odeslani

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

function AO3stepOneHotels2CheckMaxAmenitiesCountAdd(){
  var elBlok = document.getElementById('AO3_HotelsStepOne_HotelAmenities');
  if (!elBlok) return false;
  var inps = elBlok.getElementsByTagName('INPUT');
  for (var iinp in inps){
    if (inps[iinp].type != 'checkbox') continue;
    inps[iinp].onclick = AO3stepOneHotels2CheckMaxAmenitiesCount;
  }
}

function AO3stepOneHotels2CheckMaxAmenitiesCount(){
  var elBlok = document.getElementById('AO3_HotelsStepOne_HotelAmenities');
  if (!elBlok) return false;
  var inps = elBlok.getElementsByTagName('INPUT');
  var cnt = 0;
  for (var iinp in inps){
    if (inps[iinp].type != 'checkbox') continue;
    if (inps[iinp].checked) cnt++;
  }
  if (cnt>7){
    alert(window.parametr.filterHasTooManyAmenities);
    return false;
  }
  return true;
}

function AO3stepOneHotels2FormOnsubmitHandler(){
  //fareDisplayWithFlightUnion
//  alert(window.notCheck);
  if (window.notCheck){window.notCheck = false;return true;}
  //povinne udaje

  var HotDes = document.getElementById('AO3_HotelsStepOne_HotelName');
  if (HotDes && HotDes.value){

  } else {
    var hotelLoc = document.getElementById('AO3_HotelsStepOne_location');
    if (!hotelLoc){
      hotelLoc = document.getElementById('AO3_HotelsStepOne_location_noajax');
    }
    if (hotelLoc){
      var val = '';
      if (hotelLoc.tagName == 'INPUT') val = hotelLoc.value;
      if (hotelLoc.tagName == 'SELECT') val = hotelLoc.options[hotelLoc.selectedIndex].value;
      if (val == ''){
        alert (window.parametr.noLocationFilled);
        return false;
      }
      var sBut = document.getElementById('AO3_HotelsStepOne_buttonContinue');
      sBut.name = 'data[stepChooseHotel]';
    }
  }

  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){
        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;
            }
          }
        }
      }
    }
  }

  return true;
}
// ---GuiSearchFormHotels2StepOne.ajax---
// NEED: /modules/ForAll.Destination.ajax.js

function AO3searchFormHotels2stepOneAjaxHandlerAdd(){
  AO3stepOneHotels2destinationHandlerAdd();
}

function AO3stepOneHotels2destinationHandlerAdd(){
  var wayType = ['location'];
  for (wayIndex in wayType){
    var way = wayType[wayIndex];
    var el = document.getElementById('AO3_HotelsStepOne_'+way);
    if (el){
      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();
  }
}
// ---GuiSearchFormFlights2---
function AO3searchFormFlights2HandlerAdd(){
}


function getDivFormButton(trida){
  var divs = document.getElementsByTagName('div');
  if (!trida)trida = 'formButtons';
  var pred = null;
  for(var i=0;i<divs.length;i++){
    if (divs[i].className == trida) pred = divs[i];
  }
  return pred;
}
// ---GuiSearchFormFlights2StepOneHP---
function AO3searchFormFlights2stepOneHPHandlerAdd() {
//   AO3searchFormAddAdvancedSearchHandler(as);
   AO3searchFormCabinVendorHandlerAdd();
   AO3stepOne2setTimeHandlerAdd();
   AO3stepOne2travelerListHandlerAdd();
   AO3stepOne2SearchTypeHandlerAdd();
   AO3stepOne2buttDestinationHandlerAdd();
   AO3stepOne2FormOnsubmitHandlerAdd();
}

function AO3insertedFormHandlerAdd(){
  AO3searchFormFlights2stepOneHandlerAdd();
  if (window.AO3stepOne2destinationHandlerAdd) AO3stepOne2destinationHandlerAdd();
  var b = document.getElementById('AO3NewSearchButton');
  if (b){
    b.onclick = AO3ShowOneForm;
    b.fillData = false;
  }
}


/** Advance Search - rozbalovani vedlejsiho bloku **/
function AO3searchFormAddAdvancedSearchHandler(as){
  as.onclick = AO3searchFormHandleAdvancedSearch;
  as.click();
}

function AO3searchFormHandleAdvancedSearch(e) {
  if (!e) { e = window.event; }
  var div = this.nextSibling;
  if (this.myState != 'none') {
    this.myState = 'none';
  } else {
    this.myState = 'block';
  }
  while (div.className != 'formButtons') {
    if (div.nodeName == 'DIV') {
      div.style.display = this.myState;
    }
    div = div.nextSibling;
  }
}

function AO3searchFormCabinVendorHandlerAdd() {
  var el = document.getElementById('labelCabinVendor');
  if (el){
    el.targetDiv = document.getElementById('contentCabinVendor');
    el.onclick = AO3searchFormCabinVendorHandler;
    el.onclick();
  }
}

function AO3searchFormCabinVendorHandler() {
  if (this.targetDiv){
    if (this.targetDiv.style.display == 'none'){
      this.targetDiv.style.display = 'block';
      if (!Library_hasClass(this.parentNode, 'openedTag')){ Library_addClass(this.parentNode, 'openedTag'); }
    } else {
      Library_removeClass(this.parentNode, 'openedTag');
      this.targetDiv.style.display = 'none';
    }
  }
  return false;
}

/** chooseDestination **/

function AO3stepOne2buttDestinationHandlerAdd(){
  var wayType = ['Origin', 'Destination'];
  for (wayIndex in wayType){
    var way = wayType[wayIndex];
    var el = document.getElementById('AO3_chooseDest_'+way);
    if (el && !el.onclick){
      el.onclick = AO3stepOne2buttonDestinationHandler;
    }

  }
}

function AO3stepOne2buttonDestinationHandler(e){
  if (!e) { e = window.event; }
   var b = document.getElementById('AO3_StepOne2_buttonContinue');
   b.name=this.name;
   window.notCheck = true;
   b.click();
}

/** Nastaveni casu **/
function AO3stepOne2setTimeHandlerAdd(){
  var wayType = ['arrival', 'departure'];
  for (wayIndex in wayType){
    var way = wayType[wayIndex];
//    alert(way);
    var elDay, elMonth, elCal;
    if(!(elDay = document.getElementById('AO3_StepOne2_'+way+'Day'))) {
      break;
    };
    elDay.onchange = AO3stepOne2checkTimeHandler;
    if(!(elMonth = document.getElementById('AO3_StepOne2_'+way+'Month'))) {
      break;
    };
    elMonth.onchange = AO3stepOne2checkTimeHandler;
    var elTime = document.getElementById('AO3_StepOne2_'+way+'Time');
    if (elTime){
      elTime.onchange = AO3stepOne2checkTimeHandler;
    }
    if(elCal = document.getElementById('AO3_stepOne2_'+way+'Calendar')) {
      elCal.way = way;
      elCal.style.display = 'inline';
      elCal.onclick = AO3stepOne2getCalendarHandler;
    };
    elMonth.onchange();
  }
}

function AO3stepOne2getCalendarHandler(e){
  if (!e) { e = window.event; }
//id ... [arrival|departure]
  var params = new Array();
  params['elDay'] = document.getElementById('AO3_StepOne2_'+this.way+'Day');
  params['elMonthYear'] = document.getElementById('AO3_StepOne2_'+this.way+'Month');
  params['maxMonth'] = 'plus12';
  ShowCalendar(params);
  return false;
}

function AO3stepOne2checkTimeHandler(e){
  if (!e) { e = window.event; }
  var params = new Array();
  lastCheck = 'toTime';
  params['elFromDay'] = document.getElementById('AO3_StepOne2_departureDay');
  switch (lastCheck){
    case 'toTime':
      params['elToTime'] = document.getElementById('AO3_StepOne2_arrivalTime');
    case 'toDay':
      params['elToDay'] = document.getElementById('AO3_StepOne2_arrivalDay');
    case 'toMonth':
      params['elToMonth'] = document.getElementById('AO3_StepOne2_arrivalMonth');
    case 'fromTime':
      params['elFromTime'] = document.getElementById('AO3_StepOne2_departureTime');
    case 'fromDay':
      params['elFromDay'] = document.getElementById('AO3_StepOne2_departureDay');
    case 'fromMonth':
      params['elFromMonth'] = document.getElementById('AO3_StepOne2_departureMonth');
    default:
    break;
  }
  params['keepInterval'] = 3600*24*1;//window.parametr.defaultEndDateDelta;
  params['allowWrongDate'] = true;//'future';
  params['autoModify'] = 'from';//'both';

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

/** Ovlivneni poctu cestujicich **/
function AO3stepOne2travelerListHandlerAdd() {
  var el;
  if(el = document.getElementById('AO3_StepOne2_travelersCount')) {
    el.onchange = AO3stepOne2travelerListHandler;
  }
}

function AO3stepOne2travelerListHandler(e) {
  if (!e) { e = window.event; }
  var i, mustr, vkladatCo, vkladatPred, vkladatDo, vyndavatZ, labelText;
  var count = parseInt(this.value);
  if (isNaN(count)) count = 0;

  var selects = document.getElementsByTagName('SELECT');
  var travelers = new Array;
  for (i = 0; i < selects.length; i++) {
    if (selects[i].name == 'data[travelers][]') {
      travelers.push(selects[i]);
    }
  }

  i = travelers.length;

  if ((count < 1) || (count > 5)) {
    Library_addClass(this, 'userError');
    this.value = i;
    return;
  } else {
    Library_removeClass(this, 'userError');
  }

  if (i < count) {// je potreba
    mustr = travelers[0].parentNode.cloneNode(true); // Vzor
    mustr.removeAttribute('id');

    vkladatDo = travelers[0].parentNode.parentNode;
    vkladatPred = travelers[travelers.length-1].parentNode.nextSibling;

    i++
    for (i; i <= count; i++) {
      vkladatCo = mustr.cloneNode(true); //instance vkladaneho prvku
      labelText = vkladatCo.getElementsByTagName('label')[0].firstChild;
      labelText.nodeValue = labelText.nodeValue.replace('1', i);
      vkladatCo.getElementsByTagName('label')[0].setAttribute('for', 'AO3_StepOne2_travelers'+(i-1));
      vkladatCo.getElementsByTagName('select')[0].setAttribute('id', 'AO3_StepOne2_travelers'+(i-1));
      vkladatCo.getElementsByTagName('select')[0].setAttribute('value', 'ADT');
      vkladatDo.insertBefore(vkladatCo, vkladatPred);
    }
  } else if (i > count) {
    vyndavatZ = travelers[0].parentNode.parentNode;

    for (i; i > count; i--) {
      vyndavatZ.removeChild(travelers[i-1].parentNode);
    }
  }
}

/** Typ vyhledani **/
function AO3stepOne2SearchTypeHandlerAdd() {
  var inputs = new Array('AO3_StepOne2_searchType', 'AO3_StepOne2_returnTicketYes', 'AO3_StepOne2_returnTicketNo', 'AO3_StepOne2_returnTicketMulti');
  var inp;

  for (var i in inputs) {
    inp = document.getElementById(inputs[i]);
    if (inp) {
      if (i) {
        inp.onclick = AO3stepOne2SearchTypeHandler;
      } else {
        inp.onchange = AOstepOne2SearchTypeHandler;
      }
    }
  }

  AO3stepOne2SearchTypeHandler();
}
/*
function AO3stepOne2VendorsHandlerAdd() {
  window.parametr.vendorTeam = new Array();

  var ven = document.getElementById('AO3_StepOne2_vendor');
  var vendors = ven.getElementsByTagName('OPTION');
  var skupina = 0;
  for (var i=0; i< vendors.length; i++){
    if (vendors[i].value = '')continue;
    if (vendors[i].value = '-'){
      if (skupina>1) break;
      skupina++;
    }
    window.parametr.vendorTeam[vendors[i].value] = 1;
  }
}
*/
function AO3stepOne2FormOnsubmitHandlerAdd(){
  var forms = document.getElementsByTagName('FORM');
  for (var i=0; i< forms.length; i++){
    if (forms[i].className == 'ao3StepOneHP'){
      forms[i].onsubmit = AO3stepOne2FormOnsubmitHandler;
    }
  }
}
// overovani formulare pred odeslani
function AO3stepOne2FormOnsubmitHandler(){
  //fareDisplayWithFlightUnion
  if (window.notCheck){ window.notCheck = false; return true;}
  var ven = document.getElementById('AO3_StepOne2_vendor');
  var st = document.getElementById('AO3_StepOne2_searchType');
  if (st && (st.options[st.selectedIndex].value == 'FareDisplay') && (ven.options[ven.selectedIndex].value.substr(0,2)=='/*')) {
    alert (window.parametr.fareDisplayWithFlightUnion);
    return false;
  }
  //povinne udaje
  var origin = document.getElementById('AO3_StepOne2_origin');
  if (origin){
    var val = '';
    if (origin.tagName == 'INPUT') val = origin.value;
    if (origin.tagName == 'SELECT') val = origin.options[origin.selectedIndex].value;
    if (val == ''){
      alert (window.parametr.noOriginFilled);
      return false;
    }
  }
  var destin = document.getElementById('AO3_StepOne2_destination');
  if (destin){
    var val = '';
    if (destin.tagName == 'INPUT') val = destin.value;
    if (destin.tagName == 'SELECT') val = destin.options[destin.selectedIndex].value;
    if (val == ''){
      alert (window.parametr.noDestinationFilled);
      return false;
    }
  }
  //datumy
  var params = new Array;
  var lastCheck = 'toTime';
  params['elFromDay'] = document.getElementById('AO3_StepOne2_departureDay');
  switch (lastCheck){
    case 'toTime':
      params['elToTime'] = document.getElementById('AO3_StepOne2_arrivalTime');
    case 'toDay':
      params['elToDay'] = document.getElementById('AO3_StepOne2_arrivalDay');
    case 'toMonth':
      params['elToMonth'] = document.getElementById('AO3_StepOne2_arrivalMonth');
    case 'fromTime':
      params['elFromTime'] = document.getElementById('AO3_StepOne2_departureTime');
    case 'fromDay':
      params['elFromDay'] = document.getElementById('AO3_StepOne2_departureDay');
    case 'fromMonth':
      params['elFromMonth'] = document.getElementById('AO3_StepOne2_departureMonth');
    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;
    default:
    break;
  }

  return true;
}

function AO3stepOne2SearchTypeHandler() {
  var departureTimeDisabled, arrivalTimeDisabled;
  var returnTicketDisabled;
  var arrivalDayDisabled, arrivalMonthDisabled;
  var cabinDisabled = true;
  var directFlightDisabled = false;

  var type = document.getElementById('AO3_StepOne2_searchType') ?  document.getElementById('AO3_StepOne2_searchType').value : 'FromFour';
  var returnTicket = false;

  if (document.getElementById('AO3_StepOne2_returnTicketYes')){
    returnTicket = document.getElementById('AO3_StepOne2_returnTicketYes').checked || document.getElementById('AO3_StepOne2_returnTicketMulti').checked;
  }

  var activeReturn; var pasiveReturn;

  if (!returnTicket) {
    activeReturn = document.getElementById('AO3_StepOne2_returnTicketNoDiv');
    pasiveReturn = document.getElementById('AO3_StepOne2_returnTicketYesDiv');
    arrivalDayDisabled = true;
    arrivalMonthDisabled = true;
    arrivalTimeDisabled = true;

    switch (type) {
      case 'FareDisplay':
        departureTimeDisabled = true;
        directFlightDisabled = true;
        break;
      default:
        departureTimeDisabled = false;
    }

  } else {
    activeReturn = document.getElementById('AO3_StepOne2_returnTicketYesDiv');
    pasiveReturn = document.getElementById('AO3_StepOne2_returnTicketNoDiv');

    switch (type) {
      case 'FareDisplay':
        departureTimeDisabled = true;
        directFlightDisabled = true;
      case 'LowFare':
        arrivalTimeDisabled = true;
        break;
      default:
        departureTimeDisabled = false;
        arrivalTimeDisabled = false;
        break;
    }

    switch (type) {
      case 'LowFare':
        arrivalDayDisabled = true;
        arrivalMonthDisabled = true;
        returnTicketDisabled = true;
        break;
      default:
        arrivalDayDisabled = false;
        arrivalMonthDisabled = false;
        returnTicketDisabled = false;
    }
  }
  if (activeReturn) Library_addClass(activeReturn, 'activeReturn');
  if (pasiveReturn) Library_removeClass(pasiveReturn, 'activeReturn');

  if(document.getElementById('AO3_StepOne2_arrivalDay') && (document.getElementById('AO3_StepOne2_arrivalMonth'))) {
    document.getElementById('AO3_StepOne2_arrivalDay').disabled = arrivalDayDisabled;
    document.getElementById('AO3_StepOne2_arrivalMonth').disabled = arrivalMonthDisabled;
  }
  if (document.getElementById('AO3_StepOne2_departureTime')){
    document.getElementById('AO3_StepOne2_departureTime').disabled = departureTimeDisabled;
  }
  if(document.getElementById('AO3_StepOne2_arrivalTime')){
    document.getElementById('AO3_StepOne2_arrivalTime').disabled = arrivalTimeDisabled;
  }
  document.getElementById('AO3_StepOne2_returnTicketYes').disabled = returnTicketDisabled;
  document.getElementById('AO3_StepOne2_returnTicketNo').disabled = returnTicketDisabled;
  if (document.getElementById('AO3_StepOne2_directFlight')){
    document.getElementById('AO3_StepOne2_directFlight').disabled = directFlightDisabled;
  }
  if (type == 'FromFour' || type == 'LowFare') {
    cabinDisabled = false;
  }
  if (document.getElementById('AO3_StepOne2_cabinDiv')) {
    var cabins = document.getElementById('AO3_StepOne2_cabinDiv').getElementsByTagName('INPUT');
    for (var i = 0; i < cabins.length; i++) {
      cabins[i].disabled = cabinDisabled;
    }
  }
}

function ShowCalendar(hash){
  Library_debugAlert('pouziti depracated showCalendar(), pouzivat tuto metodu z ForAll.Calendar.js');

  if (!hash['months']) hash['months'] = 2;
  if (!hash['windowWidth']) hash['windowWidth'] = 220;
  if (!hash['windowHeight']) hash['windowHeight'] = 220+152*(hash['months']-1);
  if (!hash['windowXCoord']) hash['windowXCoord'] = 0;
  if (!hash['windowYCoord']) hash['windowYCoord'] = 0;
  hash['maxMonth'] = hash['maxMonth'] ? ('&maxMonth='+hash['maxMonth']) : '';
  if (/*!hash['url']*/true) hash['url'] = window.parametr.url+'?action=eCalendarData&frame=calendar&months='+hash['months']+'&defDay='+hash['elDay'].value+'&defMonth='+hash['elMonthYear'].value+hash['maxMonth'];

  window.open(hash['url'], "", "toolbar=no,scrollbars=no,location=no,status=no,width=" + hash['windowWidth'] + ",height=" + hash['windowHeight'] + ",resizable=0,screenX=" + hash['windowXCoord'] + ",screenY=" + hash['windowYCoord']);
  window.showCalendarParams = hash;
  window.onReceiveCalendarData = onReceiveCalendarData;
}

function AO3ShowOneForm(){
  this.fillData;
  if (!window.popupFormOne){
    window.popupFormOne = document.getElementById('insertedFormStepOne');
    if (!window.popupFormOne) return false;
    window.popupFormOne.formEl = window.popupFormOne.getElementsByTagName('form');
    window.popupFormOne.deltaX = window.popupFormOne.offsetLeft;
    window.popupFormOne.deltaY = window.popupFormOne.offsetTop;
    window.popupFormOne.formEl = window.popupFormOne.formEl[0];
    window.popupFormOne.backEl = document.getElementById('tmpFormStepOne');
      window.popupFormOne.backElDiv = document.getElementById('tmpFormStepOneDiv');

      setOpacity(window.popupFormOne.backElDiv, 70); //nastavi jej hodne pruhledne :)
      setOpacity(window.popupFormOne.backEl, 1);
      window.popupFormOne.backElDiv.onclick = function(e){if (!e){ e = window.event;} e.cancelBubble = true;  if (e.stopPropagation){ e.stopPropagation();} AO3HideOneForm(); return false;}
  }

  window.onscroll = AO3stepOneOnScrollHandler;
  window.onresize = AO3stepOneOnResizeHandler;

  var formDiv = window.popupFormOne;
  formDiv.style.display = 'block';
  window.onresize();
  return false;
}

function getScrollPosition(top){
  if (!top){
    return window.pageXOffset ? window.pageXOffset : (window.scrollX ? window.scrollX : (document.body.scrollLeft ? document.body.scrollLeft : (document.documentElement && document.documentElement.scrollLeft ? document.documentElement.scrollLeft : 0)));
  } else {
    return window.pageYOffset ? window.pageYOffset : (window.scrollY ? window.scrollY : (document.body.scrollTop ? document.body.scrollTop : (document.documentElement && document.documentElement.scrollTop ? document.documentElement.scrollTop : 0)));
  }
}

function AO3HideOneForm(){
  if (!window.popupFormOne) return false;
  window.setTimeout("window.popupFormOne.style.display = 'none';", 100);
}

function AO3stepOneOnScrollHandler(){
  if (!window.popupFormOne || !window.popupFormOne.formEl ||(window.popupFormOne.style.display == 'none')) return false;
  var mesDiv = window.popupFormOne;
  mesDiv.backElDiv.style.left = getScrollPosition(false) - mesDiv.deltaX +'px';
  mesDiv.backElDiv.style.top = getScrollPosition(true) - mesDiv.deltaY +'px';
  mesDiv.formEl.style.left = ((getScrollPosition(false) - mesDiv.deltaX) /*+ (document.body.clientWidth - mesDiv.formEl.offsetWidth)/2*/)+'px';
  mesDiv.formEl.style.top = ((getScrollPosition(true) - mesDiv.deltaY) /*+ (document.body.clientHeight - mesDiv.formEl.offsetHeight)/2*/)+'px';
}

function AO3stepOneOnResizeHandler(){
  if (!window.popupFormOne || !window.popupFormOne.formEl || (window.popupFormOne.style.display == 'none')) return false;
  var mesDiv = window.popupFormOne;
  mesDiv.backEl.style.width = document.body.clientWidth+'px'; // pro variantu pozadi pruhledne sede
  mesDiv.backEl.style.height = document.body.clientHeight+'px';
  mesDiv.backElDiv.style.width = document.body.clientWidth+'px'; // pro variantu pozadi pruhledne sede
  mesDiv.backElDiv.style.height = document.body.clientHeight+'px';
  AO3stepOneOnScrollHandler();
}
// ---GuiSearchFormFlights2StepOneHP.ajax---
function AO3searchFormFlights2stepOneHPAjaxHandlerAdd(){
  AO3stepOne2destinationHandlerAdd();
}

function AO3stepOne2destinationHandlerAdd(){
  var wayType = ['origin', 'destination'];
  for (wayIndex in wayType){
    var way = wayType[wayIndex];
    var el = document.getElementById('AO3_StepOne2_'+way);
    AO3stepOne2destinationElHandlerAdd(el,way);
  }
}

function getInputByName(jmeno){
  inps = document.getElementsByTagName('input');
  for (var i = 0; i < inps.length; i++){
    if (inps[i].name == jmeno) return inps[i];
  }
  return false;
}

function AO3stepOne2destinationElHandlerAdd(el, way){
  if (! el) return false;
  var hid = document.createElement('input');
  hid.setAttribute('type', 'hidden');
  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;
  if (input.kde == undefined) input.kde = 'index.php';
  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 = setTimeout('AO3searchFormGetDestinationsTerminalReset()',300);
}
function AO3stepOne2destinationOnFocus(e){
  if (!e) { e = window.event; }
  this.last=''; AO3searchFormGetDestinations(this, window.parametr.ajax.kde);
}
function AO3stepOne2destinationOnChange(e){
//  if (!e) { e = window.event; }
  var codeInput = Library_getNextSiblingByTagName(this, 'INPUT', 2);
  if (codeInput) {
    codeInput.name = '';
    codeInput.value = '';
  }

  AO3searchFunctionGetDestinationsSelectionReset(this);
}

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_StepOne2_'+this.way;
    input.focus();
  }
}

/**  Nastaveni destinaci **/
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 AO3searchFormDestinationsSelection(event, element) {
  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 = cursor.innerHTML.substr(cursor.innerHTML.length-4,3);
      var label = cursor.innerHTML/*.substr(0,cursor.innerHTML.length - 6)*/;
      var codeInput = Library_getNextSiblingByTagName(element, 'INPUT', 2);

      element.didSelection = true;
      element.value = label;
      if (codeInput) {
        codeInput.value = code;
        codeInput.name = element.name.substr(0, element.name.length - 7) + ']';
      }

      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_getOffsetTop(caller)+caller.offsetHeight)+'px';
    var left = Library_getOffsetLeft(caller)+'px';
  }
  insertedEl.style.top = top;
  insertedEl.style.left = left;
  insertedEl.style.visibility = 'visible';
}

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=eSearchFormData' +
      '&data[ajax]=getDestinations' +
      '&data[string]=' + input.value + actionSuffix;

    if(!window.parametr.resultOverflow) input.parentNode.style.height = 'auto';

    //    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 on status jo');
    }
    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 = this.innerHTML.substr(this.innerHTML.length-4,3);
  var label = this.innerHTML/*.substr(0,this.innerHTML.length - 6)*/;

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

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