/** Common Library functions **/

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

  return ret;
}

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

  return ret;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

   return objDate;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

function AO3noWork(){}

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

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

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

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

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

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

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

/**  Nastaveni destinaci **/

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

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

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

  AO3searchFormChooseCountryAjaxHandlerAdd(this.elButton, url);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

Library_addEvent(window, 'load', AO3searchFormChooseCountryHandlerAdd, false);
// ---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;
}
// ---GuiSearchFormFlights2StepOneMultiple---
function AO3searchFormFlights2stepOneMultipleHandlerAdd() {
   AO3searchFormCabinVendorHandlerAdd();
   AO3stepOne2travelerListHandlerAdd();
   AO3stepOne2SegmentsHandlerAdd();
   AO3stepOne2FormOnsubmitHandlerAdd();
}

/* zobrazeni rozsirenych moznosti hledani */
function AO3searchFormCabinVendorHandlerAdd() {
  var el = document.getElementById('labelCabinVendor');
  if (el){
    el.targetDiv = document.getElementById('contentCabinVendor');
    el.onclick = AO3searchFormCabinVendorHandler;
    if (!window.parametr.openShortStep && Library_isActivable(el)) el.onclick();

  }
}

function AO3searchFormCabinVendorHandler() {
  if (this.targetDiv){
    if (this.targetDiv.style.display == 'none'){
      this.targetDiv.style.display = 'block';
    } else {
      this.targetDiv.style.display = 'none';
    }
  }
  return false;
}

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

function AO3stepOne2travelerListHandler(e) {
  if (!e) { e = window.event; }
  var count = parseInt(this.value);
  if (isNaN(count)) count = 0;
  var minI = Math.min(count, this.oldValue);
  var maxI = Math.max(count, this.oldValue);
  for (var i = minI; i < maxI; i++) {
    var itemTraveler = document.getElementById('AO3_StepOne2_travelers'+i);
    if (itemTraveler) {
      itemTraveler.parentNode.style.display = (i < count) ? 'block' : 'none';
      if (i < count){
        // set default
        for (var o = 0; o < itemTraveler.options.length; o++ ){
          if (itemTraveler.options[o].value == window.parametr.defaultTravelerType){
             itemTraveler.selectedIndex = o;
             break;
          }
        }
      }
      itemTraveler.disabled = (i >= count);
    }
  }

  if (count < 1) {
    Library_addClass(this, 'userError');
    return;
  } else {
    Library_removeClass(this, 'userError');
  }
  this.oldValue = count;
}

/** Typ vyhledani **/
function AO3stepOne2SegmentsHandlerAdd() {
// pole je definovano s hodnotou count v Gui elementu na globalni urovni
  var inputs = new Array('returnTicketYes', 'returnTicketNo', 'returnTicketMulti');
  var destins = new Array('origin', 'destination');
  var ways = new Array('arrival', 'departure');
  var seasons = new Array('Time', 'Day', 'Month', '');
  var dateVariants = new Array('Exact', 'Close', 'Weekend');
  var returnType = 'on';
  window.segmentCollection.segmentsBox = document.getElementById('segmentsBox');
  
  var sForm = document.getElementById('segmentsBox');
  while (sForm && sForm.tagName != "FORM") sForm = sForm.parentNode; 
  window.segmentCollection.segmentsForm = sForm;

  window.segmentCollection.returnTicketHidden = document.getElementById('AO3_StepOne2_returnTicketHidden');

  for (var i in inputs) {
    var inp = document.getElementById('AO3_StepOne2_'+inputs[i]);
    if (inp) {
      window.segmentCollection[inputs[i]] = inp;
      if ((inputs[i] == 'returnTicketMulti') && document.getElementById('main-iframe')){
        inp.onclick = AO3stepOne2MultipleIframeRedirect;
      } else {
        inp.onclick = AO3stepOne2ReturnTicketHandler;
      }
      if (inp.checked){
        switch (inputs[i]){
          case 'returnTicketMulti':
           returnType = 'multi';
          break;
          case 'returnTicketYe':
           returnType = 'on';
          break;
          case 'returnTicketNo':
            returnType = false;
          break;
        }
      }
    }
  }

  if (window.segmentCollection.returnTicketHidden) returnType = window.segmentCollection.returnTicketHidden.value;
  window.segmentCollection.returnType = returnType;

  var inp = document.getElementById('AO3_StepOne2_searchType');
  if (inp) {
      window.segmentCollection.searchType = inp;
      inp.onchange = AO3stepOne2SearchTypeHandler;
  }
  for (var i = 0; i < window.segmentCollection.count; i++){
    window.segmentCollection['segment'+i] = document.getElementById('AO3_StepOne2_flightSegment_'+i+'Div');
    var seg = window.segmentCollection['segment'+i];
    if (!seg) continue;
//Destinations settings
    for (wayIndex in destins){
      var way = destins[wayIndex];
      var dest = document.getElementById('AO3_StepOne2_'+way+'_'+i);
      if (dest){
        dest.counter = i;
        dest.way = way;
        dest.onkeyup = AO3stepOne2SegmentDestinationKeyUpHandler;
        dest.onchange = AO3stepOne2SegmentDestinationChangeHandler;
        dest.setValue = AO3stepOne2SegmentDestinationSetValueHandler;
        dest.getValue = AO3stepOne2SegmentDestinationGetValueHandler;
        dest.testFill = AO3stepOne2SegmentDestinationTestFill;
        seg[way] = dest;
        if (dest.tagName == 'SELECT'){
          var inp = document.createElement('input'); //predpripraveni input pri vybrani prazdne hodnoty v select prvku
          inp.style.display = 'none';
          inp.className = way+" inputText";
          inp.name = dest.name.substring(0, dest.name.indexOf("[flights]"))+"[flights]["+i+"]["+way+"Search]";
          inp.id = 'AO3_StepOne2_'+way+'Hidden_'+i;
          inp.counter = i;
          inp.onkeyup = AO3stepOne2SegmentDestinationKeyUpHandler;
          inp.onchange = AO3stepOne2SegmentDestinationChangeHandler;
          inp.setValue = AO3stepOne2SegmentDestinationSetValueHandler;
          inp.getValue = AO3stepOne2SegmentDestinationGetValueHandler;
          inp.testFill = AO3stepOne2SegmentDestinationTestFill;
          inp.lastSearchValue = '';
          inp.lastExactValue = '';
          if (window.AO3stepOne2destinationElHandlerAddInput) AO3stepOne2destinationElHandlerAddInput(inp, way); // ajax
          dest.parentNode.insertBefore(inp, dest);
          dest.hiddenInput = inp;
        }
        if (window.AO3stepOne2destinationElHandlerAdd){ // pripne Ajax
          AO3stepOne2destinationElHandlerAdd(dest); // viz AJAX
//          seg[way+'Found'] = dest.valueTarget;
        }
        dest.lastSearchValue = dest.getValue(false);
        dest.lastExactValue = dest.getValue(true);
        if (i >= 1){
          window.segmentCollection['segment'+(i-1)][way=='destination'?'origin':'destination'].changesTarget = dest;
        }
      }
      var el = document.getElementById('AO3_StepOne2_'+way+'Button_'+i);
      if (el){
/*        el.selectionCounter = i;
        el.name = el.name.substring(0, el.name.indexOf('_')) + ']';*/
        if (!el.onclick) el.onclick = AO3stepOne2buttonDestinationHandler;
        seg[way+'Button'] = el;
      }
      var el = document.getElementById('AO3_StepOne2_'+way+'Range_'+i);
      if (el){
        el.onclick = AO3stepOne2DestinationRangeHandler;
        el.onclick(); //musi se volat samostatne, nanastavuje se v ramci returnTicketHandleru
        seg[way+'Range'] = el;
      }      
    }
//Timer settings
    for (var wayId in ways){
      var way = ways[wayId];
      for (var seasonId in seasons){
        var season = seasons[seasonId];
        var ePart = document.getElementById('AO3_StepOne2_'+way+season+'_'+i);
        if (ePart){
          ePart.way = way;
          ePart.season = season;
          ePart.counter = i;
          if (season) ePart.onchange = AO3stepOne2checkTimeHandler;
          seg[way+season] = ePart;
        }
      }
      var eCalendar = document.getElementById('AO3_StepOne2_'+way+'Calendar_'+i);
      if (eCalendar){
        seg[way+'Calendar'] = eCalendar;
        eCalendar.way = way;
        eCalendar.counter = i;
        eCalendar.onclick = AO3stepOne2getCalendarHandler;
      }
      var el = document.getElementById('AO3_StepOne2_'+way+'PlusMinusDay_'+i);
      if (el){
        el.onchange = AO3stepOne2PlusMinusDayHandler;
        seg[way+'PlusMinusDay'] = el;
      }  
    }
  }
  
  for (var i in dateVariants) {
    var inp = document.getElementById('AO3_StepOne2_Date'+dateVariants[i]);
    if (inp) {
      inp.onclick = AO3stepOne2dateVariantsHandler;
      if (!window.segmentCollection.dateVariants) window.segmentCollection.dateVariants = new Array();
      window.segmentCollection.dateVariants.push(inp);
    }
  }

  if (window.segmentCollection.segmentsBox){
    var segBoxClass = window.segmentCollection.segmentsBox.className;
    if (Library_hasClass(window.segmentCollection.segmentsBox, 'oneWaySegments')) Library_removeClass(window.segmentCollection.segmentsBox, 'oneWaySegments');
    if (Library_hasClass(window.segmentCollection.segmentsBox, 'returnSegments')) Library_removeClass(window.segmentCollection.segmentsBox, 'returnSegments');
    if (Library_hasClass(window.segmentCollection.segmentsBox, 'multipleSegments')) Library_removeClass(window.segmentCollection.segmentsBox, 'mutlipleSegments');
    window.segmentCollection.segmentsBox.defaultClass = window.segmentCollection.segmentsBox.className;
    window.segmentCollection.segmentsBox.className = segBoxClass;
  }
  var cl = document.getElementById('AO3_StepOne2_departureDay_0');
  if (cl){ // osetreni datumu
    cl.onchange();
  }
  AO3stepOne2ReturnTicketHandler();
}

function AO3stepOne2MultipleIframeRedirect(){
  var b = document.getElementById('AO3_StepOne2_buttonContinue');
  if (b){
    b.name='stepOne';
    window.notCheck = true;
    b.click();
  }
}

function AO3stepOne2SetActive(el, active){
  var elDiv = el.id ? document.getElementById(el.id+'Div') : el.parentNode;
  if (elDiv){
    if (active) Library_removeClass(elDiv, 'unusedItem');
    else Library_addClass(elDiv, 'unusedItem');
  }
}

function AO3stepOne2SetDisplay(el, active){
  var elDiv = el.id ? document.getElementById(el.id+'Div') : el.parentNode;
  if (elDiv){
    elDiv.style.display = active ? 'block' : 'none';
  }
}

/** Nasteveni chovani letovych segmentu **/
function AO3stepOne2PlusMinusDayHandler(){
//  AO3stepOne2SetActive(this, this.options[this.selectedIndex].value>0 && !this.disabled);
}
function AO3stepOne2DestinationRangeHandler(){
  AO3stepOne2SetActive(this, this.checked && !this.disabled);
}
function AO3stepOne2dateVariantsHandler(){
  if (!window.segmentCollection.dateVariants) return false;
  var val = false;
  var dv = window.segmentCollection.dateVariants;
  for (var i=0; i<dv.length; i++){
    AO3stepOne2SetActive(dv[i], dv[i].checked && !dv[i].disabled);
    if (dv[i].checked) val = dv[i].value;
  }
  if ((!window.segmentCollection.searchType) 
   || (window.segmentCollection.searchType.options[window.segmentCollection.searchType.selectedIndex].value != 'FromFour')
   || (window.segmentCollection.returnType != 'on')){ return true;}

  var pmDayDisable = true;
  var rangeDisable = true;
  var timeDisable = true;
  var arrivalDateDisable = false;
  switch (val){ // definovat chovani
    case 'close': // povolit +- dny, zakazat cas    
      rangeDisable = false;//->zarizeno 2 dotazy
      pmDayDisable = false;
      timeDisable = false;
      break;
    case 'weekend': // zakazat +- dny, zakazat cas, zakazat datum navratu
      arrivalDateDisable = true;
      break;
    case 'exact': // zakazat +- dny, povolit cas
    default:
      rangeDisable = false;
      timeDisable = false;
      break;
  }
  var ways = new Array('arrival', 'departure');
  var destins = new Array('origin', 'destination');
  var formats = new Array('', 'Day', 'Month');
  for (var i = 0; i < window.segmentCollection.count; i++){
    var seg = window.segmentCollection['segment'+i];
    if (i > 0){ // necha aktivni pouze 1. vyber
      for (var iFormat = 0; iFormat < formats.length; iFormat++){
        if (seg['departure'+formats[iFormat]]){ 
          seg['departure'+formats[iFormat]].disabled = arrivalDateDisable;
        }
      }
    }
    for (var iWay = 0; iWay < ways.length; iWay++){
      var way = ways[iWay];
      if (seg[way+'PlusMinusDay']){ 
        seg[way+'PlusMinusDay'].disabled = pmDayDisable;
        AO3stepOne2SetActive(seg[way+'PlusMinusDay'], /*(seg[way+'PlusMinusDay'].options[seg[way+'PlusMinusDay'].selectedIndex].value>0) &&*/ !pmDayDisable);
      }
      if (seg[way+'Time']){ 
        seg[way+'Time'].disabled = timeDisable;
      }
    }
    for (var iDest = 0; iDest < destins.length; iDest++){
      var dest = destins[iDest];
      if (seg[dest+'Range']) seg[dest+'Range'].disabled = rangeDisable;
    }

  }  
}
function AO3stepOne2flexiOptionsEnable(val){
  var ways = new Array('arrival', 'departure');
  var destins = new Array('origin', 'destination');
  for (var i = 0; i < window.segmentCollection.count; i++){
    var seg = window.segmentCollection['segment'+i];
    for (var iWay = 0; iWay < ways.length; iWay++){
      var way = ways[iWay];
      if (seg[way+'PlusMinusDay']) seg[way+'PlusMinusDay'].disabled = !val;
    }
    for (var iDest = 0; iDest < destins.length; iDest++){
      var dest = destins[iDest];
      if (seg[dest+'Range']) seg[dest+'Range'].disabled = !val;      
    }
  }
//  var valDV = false;
  if (window.segmentCollection.dateVariants){
    for (var i=0; i < window.segmentCollection.dateVariants.length; i++){
      window.segmentCollection.dateVariants[i].disabled = !val;
//    if (window.segmentCollection.dateVariants[i].checked && val) valDV = window.segmentCollection.dateVariants[i].value;
    }
  }
/*  if (valDV)*/ AO3stepOne2dateVariantsHandler();
}  
function AO3stepOne2flexiOptionsShow(val){
  var ways = new Array('arrival', 'departure');
  var destins = new Array('origin', 'destination');
  for (var i = 0; i < window.segmentCollection.count; i++){
    var seg = window.segmentCollection['segment'+i];
    for (var iWay = 0; iWay < ways.length; iWay++){
      var way = ways[iWay];
      if (seg[way+'PlusMinusDay']) AO3stepOne2SetDisplay(seg[way+'PlusMinusDay'], val);
    }
    for (var iDest = 0; iDest < destins.length; iDest++){
      var dest = destins[iDest];
      if (seg[dest+'Range']) AO3stepOne2SetDisplay(seg[dest+'Range'], val);
    }
  }
  var elDiv = document.getElementById('AO3_StepOne2_DateVariantsDiv');
  if (elDiv){
    elDiv.style.display = val ? 'block' : 'none';
  }
}

function AO3stepOne2SegmentDestinationSetValueHandler(searchValue ,exactValue, udelej){ //nastavovani hodnot v elementu
// linkovani teoretickych cilu(jako 1.segment ovlivnuje druhy je nastaveno pomoci SearchTypeHandleru)
// udelej false-test/ set-set/ event-set+onchange()
  var suc = false;
  if (this.tagName == 'SELECT'){
    for (var index = 0; index < this.options.length; index++){
      if (((exactValue || exactValue == '') && this.options[index].value == exactValue)){
        if (udelej) this.selectedIndex = index;
        suc = true;
        break;
      }
      var val = this.options[index].innerHTML;
      val = (val.indexOf(' (') > 0) ? val.substring(0, val.indexOf(' (')) : val;
      if (val.toUpperCase() == searchValue.toUpperCase()){
        if (udelej) this.selectedIndex = index;
        suc = true;
        break;
      }
    }
    if (!suc && udelej) this.selectedIndex = 0;
//    alert(this.selectedIndex+'-'+searchValue+'-'+udelej);
  } else {
    suc = (this.value != searchValue);
    if (udelej) this.value = searchValue;
    if (this.valueTarget){ // value Target pouziva ajax
      suc = (this.valueTarget.value == exactValue);
      if (udelej) this.valueTarget.value = exactValue;
    }
  }
  if (udelej){
//    alert(this.lastSearchValue+'/'+ searchValue);
//    this.lastSearchValue = searchValue;
//    this.lastExactValue = exactValue;
    if (udelej == 'event'){
      this.onchange();
      if (this.valueTarget && this.valueTarget.onchange){ this.valueTarget.onchange(); }
    }
  }
  return suc; // vraci potrebu onchange u volaneho elementu
}

function AO3stepOne2SegmentDestinationGetValueHandler(exactValue){ //nastavovani hodnot v elementu
// linkovani teoretickych cilu(jako 1.segment ovlivnuje druhy je nastaveno pomoci SearchTypeHandleru)
  var suc = false;
  if (this.tagName == 'SELECT'){
    if (exactValue){
      suc = this.options[this.selectedIndex].value;
    } else {
      suc = this.options[this.selectedIndex].innerHTML;
//      suc = (suc.indexOf(' (') > 0) ? suc.substring(0, suc.indexOf(' (')) : suc;
    }
  } else {
    if (exactValue){
      suc = this.valueTarget ? this.valueTarget.value : false;//zavisi na ajaxu
    } else {
      suc = this.value;
    }
  }
  return suc; // vraci potrebu onchange u volaneho elementu
}

function AO3stepOne2SegmentDestinationChangeHandler(){
  var searc = this.getValue(false);
  var exact = this.getValue(true);
  if ((searc == this.lastSearchValue) && (exact == this.lastExactValue) && (this.propagation != 'force')) return false;
  if (this.changesTarget && this.propagation){
    if (this.propagation == 'force'){// soft | false | force
      this.changesTarget.didSelection = this.didSelection;
      this.changesTarget.setValue(searc, exact, 'event');
      //momentalne nema duplicitu
    }
    if ((this.propagation == 'soft')
          && (this.lastSearchValue == this.changesTarget.getValue(false))
          && (this.lastExactValue == this.changesTarget.getValue(true))){
      this.changesTarget.didSelection = this.didSelection;
      this.changesTarget.setValue(searc, exact, 'event');
    }
    this.waitForAjax = !this.didSelection;
  }
  this.lastSearchValue = searc;
  this.lastExactValue = exact;
  this.testFill();
  return true;
}

function AO3stepOne2SegmentDestinationKeyUpHandler(){
  this.cal = 'key';
  this.onchange();
}
function AO3stepOne2SegmentDestinationTestFill(){
  if (this.way == 'destination'){
    var col = window.segmentCollection['segment'+(parseInt(this.counter)+1)];
    if (col && (window.segmentCollection.returnType == 'multi')){
      var val = new String(this.value);
      if ((col.style.display == 'none') && (val.length > 0)){
         col.style.display = 'block';
      } else {
        if ((col.style.display != 'none') && (val.length == 0) && (this.counter >= 2)){
          var emp = true;
          for (var i = this.counter + 1; i < window.segmentCollection.count; i++){
            if ((window.segmentCollection['segment'+i].origin) && (window.segmentCollection['segment'+i].origin.value != '')){
              emp = false; break;
            }
            if ((window.segmentCollection['segment'+i].destination) && (window.segmentCollection['segment'+i].destination.value != '')){
              emp = false; break;
            }
          }

          if (emp){
            col.style.display = 'none';
          }
        }
      }
    }
  }
}

function AO3stepOne2SegmentDestinationBlurHandler(){
  if (this.counter>2){
    window.segmentCollection['segment'+(parseInt(this.counter)-1)].destination.onkeyup();
  }
}

/** Nastaveni casu **/

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

function AO3stepOne2checkTimeHandler(){
  AO3stepOne2checkTime(true, this);
  AO3stepOne2checkTime(false, this);
}

function AO3stepOne2checkTime(incr, el){
  var params = new Array();
  var lastCheck = 'toTime';
  if (!incr){
    var colTo = window.segmentCollection['segment' + el.counter];
    var colFrom = colTo;
    var wayTo = el.way;
    var wayFrom = ((!window.segmentCollection['segment' + el.counter]['arrivalMonth']) || ((wayTo == 'arrival') && (window.segmentCollection['segment' + el.counter]['departureMonth']))) ? 'departure' : 'arrival';

    if (wayFrom == wayTo){
      if (el.counter-1 < 0) return false;
      else colFrom = window.segmentCollection['segment' + (el.counter-1)];
    }
    var nextCheck = colFrom[wayFrom + el.season];
  }
  else {
    var colFrom = window.segmentCollection['segment' + el.counter];
    var colTo = colFrom;
    var wayFrom = el.way;
    var wayTo = ((!window.segmentCollection['segment' + el.counter]['departureMonth']) || ((wayFrom == 'departure') && (window.segmentCollection['segment' + el.counter]['arrivalMonth']))) ? 'arrival' : 'departure';

    if (wayFrom == wayTo){
      if (el.counter+1 >= window.segmentCollection.count) return false;
      else colTo = window.segmentCollection['segment' + (el.counter+1)];
    }
    var nextCheck = colTo[wayTo + el.season];
  }


//  alert(el.way +'/'+ el.counter +'/'+ el.season+'/'+incr+' -> from :' + wayFrom+' in '+colFrom.departureMonth.counter +' to:'+ wayTo+' in '+colTo.departureMonth.counter  );

  switch (lastCheck){
    case 'toTime':
      params['elToTime'] = colTo[wayTo+'Time'];
    case 'toDay':
      params['elToDay'] = colTo[wayTo+'Day'];
    case 'toMonth':
      params['elToMonth'] = colTo[wayTo+'Month'];
    case 'fromTime':
      params['elFromTime'] = colFrom[wayFrom+'Time'];
    case 'fromDay':
      params['elFromDay'] = colFrom[wayFrom+'Day'];
    case 'fromMonth':
      params['elFromMonth'] = colFrom[wayFrom+'Month'];
    default:
    break;
  }
//  alert(el.id+'/'+params['elFromMonth'].id+'/'+params['elToMonth'].id+incr);
  params['keepInterval'] = 3600*24*1;//window.parametr.defaultEndDateDelta;
  params['allowWrongDate'] = true;//'future';
  params['autoModify'] = window.segmentCollection.returnType == 'multi' ? 'none' : 'from';//'both';

  params['caller'] = el;
  ergonomicTimeAdjustment(params);

  AO3stepOne2checkTime(incr, nextCheck);
  return true;
}

/** chooseDestination **/


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

function AO3stepOne2FormOnsubmitHandlerAdd(){
  var forms = document.getElementsByTagName('FORM');
  for (var i=0; i< forms.length; i++){
    if (Library_hasClass(forms[i], 'ao3StepOne') || Library_hasClass(forms[i], 'ao3StepOneMultiple')) {
      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');
//  alert(st.options[st.selectedIndex].value);
  if (st && (st.options[st.selectedIndex].value == 'FareDisplay') && (ven.options[ven.selectedIndex].value.substr(0,2)=='/*')) {
    alert (window.parametr.fareDisplayWithFlightUnion);
    return false;
  }

  var eCount = 0;
  if (window.segmentCollection.returnType == ''){
    eCount = 1;
  }
  if (window.segmentCollection.returnType == 'on'){ // aby se zpatecni cast letu poslala
    eCount = 2;
    window.segmentCollection.segment1.origin.disabled = false;
    window.segmentCollection.segment1.destination.disabled = false;
  }
  if (window.segmentCollection.returnType == 'multi'){
    eCount = window.segmentCollection.count;
    var col = window.segmentCollection['segment'+(eCount-1)];
    while ((!col || (col.destination.value == '')) && (eCount>=1)){
      eCount --;
      col = window.segmentCollection['segment'+(eCount-1)];
    }

    if (eCount <= 0){
      alert (window.parametr.minimalFlightSegmentForMulti);
      return false;
    }
  }

  var lastCheck = 'toTime';

  for (var iCount = 0; iCount < eCount; iCount++){
  //povinne udaje
    var origin = document.getElementById('AO3_StepOne2_origin_'+iCount);
    if (origin){
    var val = '';
      if (origin.tagName == 'INPUT') val = origin.value;
      if (origin.tagName == 'SELECT') val = origin.options[origin.selectedIndex].value;
      if (val == ''){
        strForNthFlight(window.parametr.noOriginFilled, iCount);
        return false;
      }
    }
    var destin = document.getElementById('AO3_StepOne2_destination_'+iCount);
    if (destin){
      var val = '';
      if (destin.tagName == 'INPUT') val = destin.value;
      if (destin.tagName == 'SELECT') val = destin.options[destin.selectedIndex].value;
      if (val == ''){
        strForNthFlight(window.parametr.noDestinationFilled, iCount);
        return false;
      }
    }

    var colFrom = window.segmentCollection['segment' + iCount];
    var colTo = window.segmentCollection['segment' + (1+iCount)];
    var wayFrom = 'departure';
    var wayTo = 'departure';//((!window.segmentCollection['segment' + el.counter]['departureMonth']) || ((wayFrom == 'departure') && (window.segmentCollection['segment' + el.counter]['arrivalMonth']))) ? 'arrival' : 'departure';
    var params = new Array;
    if (colFrom[wayFrom+'Month']){// existence pro stary format
      switch (lastCheck){
        case 'toTime':
          params['elToTime'] = (iCount+1 == eCount) ? null : colTo[wayTo+'Time'];
        case 'toDay':
          params['elToDay'] = (iCount+1 == eCount) ? null : colTo[wayTo+'Day'];
        case 'toMonth':
          params['elToMonth'] = (iCount+1 == eCount) ? null : colTo[wayTo+'Month'];
        case 'fromTime':
          params['elFromTime'] = colFrom[wayFrom+'Time'];
        case 'fromDay':
          params['elFromDay'] = colFrom[wayFrom+'Day'];
        case 'fromMonth':
          params['elFromMonth'] = colFrom[wayFrom+'Month'];
        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;
      }
    } else {// datumu v novem formatu
    
      var ways = ['departure', 'arrival'];
      for (var iway in ways){ 
        var elDate = document.getElementById('AO3_StepOne2_'+ways[iway]+'_'+iCount);
        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;
          }
          var val = '';
          var destin = document.getElementById('AO3_StepOne2_destination_'+(iCount*1+1));
          if (destin){ // musi preskocit kontrolu u nezadanych segmentu (napr 3. segment ve zpatecnim segmentu)
            var val = '';
            if (destin.tagName == 'INPUT') val = destin.value;
            if (destin.tagName == 'SELECT') val = destin.options[destin.selectedIndex].value;
          }

          if (elDate.nextCalendar && val && !window.segmentCollection.returnType == '') {
            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;
              }
            }
          }  
        }
      }
    }
  }
  
  // Vyber typu cestujiciho -- stary format
  var travelers = document.getElementById('AO3_StepOne2_travelersCount');
  if (travelers){
    for (var i=0; i<travelers.options[travelers.selectedIndex].value; i++){
      var trav = document.getElementById('AO3_StepOne2_travelers'+i);
      if (trav.options[trav.selectedIndex].value == ''){
        alert (window.parametr.notFilledTravelerType);
        return false;
      }
    }
  } else {
  // Vyber cestujicich jako pocet daneho typu
    var travCount = new Array();
    var travType = new Array('ADT', 'CHD', 'INF', 'YTH', 'YCD');
    var travTypeForINF = new Array('ADT', 'YTH', 'YCD');
    var countTrav = 0;
    var countType = 0;
    var hasOptions = false;
    for (var iTT in travType){
      var eTT = document.getElementById('AO3_StepOne2_travelersCount'+travType[iTT]);
      if (eTT) hasOptions = true;
      travCount[travType[iTT]] = eTT ? eTT.options[eTT.selectedIndex].value*1 : 0;
      if (travCount[travType[iTT]]){
        countTrav += travCount[travType[iTT]];
        countType++;
      }
    }
    if (hasOptions){ // na skrytem elementu travelers neni    
      if (travCount['INF']){
        for (var iTT in travTypeForINF){
          travCount['INF'] -= travCount[travTypeForINF[iTT]];
        }
      }
      if (countTrav == 0){//nevybran zadny cestujici
        alert(window.parametr.noTravelerSelected);
        return false;    
      }
      if (countTrav>9){//prekroceni poctu cestujicich
        alert(window.parametr.TooManyTravelers);
        return false;
      }
      if (countType>4){//prekroceni poctu typu cestujicich
        alert(window.parametr.TooManyTravelerTypes);
        return false;
      }
      if (travCount['INF']>0){//nedostatecny doprovod pro kojence
        alert(window.parametr.InfantsWithoutCompany);
        return false;
      }
    }
  }
  if (window.AO3stepOne2FormOnsubmitSecondHandler) return AO3stepOne2FormOnsubmitSecondHandler();
  return true;
}

function strForNthFlight(val, index){
  var str = new String(val);
  if (str.substr(str.length - 1) == '.'){
    str = str.substr(0, str.length - 1);
  }
  alert (str+' '+window.parametr.inAry+' '+(1+index)+''+window.parametr.nthFlightSegment);
}

function AO3stepOne2SearchTypeSwitchToReadOnly(val, exclude){
  var orig = document.getElementById('AO3_StepOne2_searchType');
  var el = document.getElementById('AO3_StepOne2_fakeSearchType');
  if (!orig) {
    return false;
  }
  var lastVal = window.segmentCollection.searchType.options[window.segmentCollection.searchType.selectedIndex].value;
  if (!el){
    el = document.createElement('select');
    el.setAttribute('id', 'AO3_StepOne2_fakeSearchType');
    el.className = 'searchType inputText';
    el.onchange = AO3stepOne2SearchTypeHandler;
    orig.parentNode.appendChild(el);
  }
  el.innerHTML = '';
//  var choosen = false;

  for (var i = 0; i < orig.length; i++){
    if ((exclude && (orig.options[i].value != val)) || (!exclude && (orig.options[i].value == val))){
      var klon = orig.options[i].cloneNode(true);
      if (lastVal == klon.value) {
//        choosen = i;
        klon.setAttribute('selected', true);
      } else klon.removeAttribute('selected');
      el.appendChild(klon);
    }
  }
/* v IE6 se chova asynchronne, tedy atribut neurci spravne*/  
/*  for (var i = 0; i < el.length; i++){
    if (el.options[i].value == lastVal){
      el.selectedIndex = i;
      break;
    }
  }
*/

  if (val) { // puvodni ma zastoupit padelek
//    Library_setSelectValue(el, lastVal);
    el.style.display = 'inline';
    el.disabled = false;
    el.name = 'data[searchType]';
    orig.style.display = 'none';
    orig.disabled = true;
    orig.name = 'fake';
    window.segmentCollection.searchType = el;
  } else {
//    Library_setSelectValue(el, lastVal);
    el.parentNode.removeChild(el);
    orig.style.display = 'inline';
    orig.disabled = false;
    orig.name = 'data[searchType]';
    window.segmentCollection.searchType = orig;
  }
}

function AO3stepOne2ReturnTicketHandler() {
  var segClass = '';
  if ((window.segmentCollection.returnTicketNo && window.segmentCollection.returnTicketNo.checked) || (!window.segmentCollection.returnTicketNo && window.segmentCollection.returnType == '')) {
    window.segmentCollection['segment0']['origin'].propagation = 'force'; //false;
    window.segmentCollection['segment0']['destination'].propagation = 'force'; //false;
    for (var k = 1; k < window.segmentCollection.count; k++){
      window.segmentCollection['segment'+k].style.display = 'none';
      window.segmentCollection['segment'+k]['origin'].propagation = false;
      window.segmentCollection['segment'+k]['destination'].propagation = false;
      window.segmentCollection['segment'+k]['origin'].setValue('', '', 'event');
      window.segmentCollection['segment'+k]['destination'].setValue('', '', 'event');
    }
    var col = window.segmentCollection['segment'+(parseInt(this.counter)+1)];

    if (window.segmentCollection.returnType == 'multi'){
      AO3stepOne2SearchTypeSwitchToReadOnly(false, true);
    }
    window.segmentCollection.returnType = false;
    segClass = 'oneWay';
  }
  if ((window.segmentCollection.returnTicketYes && window.segmentCollection.returnTicketYes.checked) || (!window.segmentCollection.returnTicketYes && window.segmentCollection.returnType == 'on')) {
    window.segmentCollection['segment0']['origin'].propagation = 'force';
    window.segmentCollection['segment0']['destination'].propagation = 'force';
    for (var k = 1; k < window.segmentCollection.count; k++){
      window.segmentCollection['segment'+k].style.display = (k==1) ? 'block' : 'none';
//      window.segmentCollection['segment'+k]['origin'].changesTarget = (k==1) ? window.segmentCollection['segment0']['destination'] : false;
//      window.segmentCollection['segment'+k]['destination'].changesTarget = (k==1) ? window.segmentCollection['segment0']['origin'] : false;
      window.segmentCollection['segment'+k]['origin'].propagation = false; //(k==1) ? 'force' : false;
      window.segmentCollection['segment'+k]['destination'].propagation = false; //(k==1) ? 'force' : false;
      window.segmentCollection['segment'+k]['origin'].setValue('', '', 'event');
      window.segmentCollection['segment'+k]['destination'].setValue('', '', 'event');
    }
    //disabled zrusi onsubmit
    window.segmentCollection.segment1.origin[window.segmentCollection.segment1.origin.tagName == 'SELECT' ? 'disabled' : 'readOnly'] = true;
    window.segmentCollection.segment1.destination[window.segmentCollection.segment1.destination.tagName == 'SELECT' ? 'disabled' : 'readOnly'] = true;
    if (window.segmentCollection.segment1.originButton) {
      window.segmentCollection.segment1.originButton.style.display = 'none';
    }
    if (window.segmentCollection.segment1.destinationButton) {
      window.segmentCollection.segment1.destinationButton.style.display = 'none';
    }
    if (window.segmentCollection.returnType == 'multi'){
      AO3stepOne2SearchTypeSwitchToReadOnly('LowFare', true);
    }
    window.segmentCollection.returnType = 'on';

    window.segmentCollection.segment0.origin.onchange();
    window.segmentCollection.segment0.destination.onchange(); // automaticky opravi segment1
    segClass = 'return';
  }

  if ((window.segmentCollection.returnTicketMulti && window.segmentCollection.returnTicketMulti.checked) || (!window.segmentCollection.returnTicketMulti && window.segmentCollection.returnType == 'multi')) {
    var elSeg = window.segmentCollection.segmentsBox;
    if (elSeg) {elSeg.className = elSeg.defaultClass +' multipleSegments';}
    var hide = true;
    if (window.segmentCollection.returnType === false || window.segmentCollection.returnType == 'on'){
      for (var resetCounter = 8; resetCounter >= 2; resetCounter --){
        if (window.segmentCollection['segment'+resetCounter])window.segmentCollection['segment'+resetCounter]['origin'].setValue('', '', true);
        window.segmentCollection['segment'+(resetCounter-1)]['destination'].setValue('', '', 'event');
      }
    }

    for (var k = window.segmentCollection.count-1; k >= 1; k--){
      if (hide){
        if (((window.segmentCollection['segment'+k].origin) && (window.segmentCollection['segment'+k].origin.value)) ||
         ((window.segmentCollection['segment'+k].originSearch) && (window.segmentCollection['segment'+k].originSearch.value))){
          hide = false;
        }
        if (((window.segmentCollection['segment'+k].destination) && (window.segmentCollection['segment'+k].destination.value)) ||
         ((window.segmentCollection['segment'+k].destinationSearch) && (window.segmentCollection['segment'+k].destinationSearch.value))){
          hide = false;
          window.segmentCollection['segment'+k].origin.disabled = false;
        }
/*        if (((window.segmentCollection['segment'+(k-1)].destination) && (window.segmentCollection['segment'+(k-1)].destination.value)) ||
         ((window.segmentCollection['segment'+(k-1)].destinationSearch) && (window.segmentCollection['segment'+(k-1)].destinationSearch.value))){
          hide = false;
        }
*/      if (k<=1) hide = false;
      }
      window.segmentCollection['segment'+k].style.display = hide ? 'none' : 'block'; // zobrazeni segemntu
      if (!hide){
         var way = 'destination';
         if (window.segmentCollection['segment'+k][way].tagName == "INPUT"){
//           window.segmentCollection['segment'+k][way].founderValue = window.segmentCollection['segment'+k][way+'Found'].value;
           window.segmentCollection['segment'+k][way].didSelection = true;
           window.segmentCollection['segment'+k][way].onchange();
           window.segmentCollection['segment'+k][way].AO3stepOne2SegmentDestinationKeyUpHandler();
         } else {
           window.segmentCollection['segment'+k][way].onchange();
           window.segmentCollection['segment'+k][way].AO3stepOne2SegmentDestinationKeyUpHandler();
         }
      }
    }
    for (var k = 0; k < window.segmentCollection.count; k++){
      window.segmentCollection['segment'+k]['origin'].propagation = false;
      window.segmentCollection['segment'+k]['destination'].propagation = (k-1 >= window.segmentCollection.count) ? false : 'soft';
    }
    if (window.segmentCollection.returnType === false || window.segmentCollection.returnType == 'on'){
    } else {
      window.segmentCollection['segment2']['origin'].setValue(window.segmentCollection['segment1']['destination'].getValue(false), window.segmentCollection['segment1']['destination'].getValue(true), 'set');
      window.segmentCollection['segment2']['origin'].lastSearchValue = window.segmentCollection['segment1']['destination'].getValue(false);
      window.segmentCollection['segment2']['origin'].lastExactValue = window.segmentCollection['segment1']['destination'].getValue(true);
    }

    window.segmentCollection.segment1.origin[window.segmentCollection.segment1.origin.tagName == 'SELECT' ? 'disabled' : 'readOnly'] = false;
    window.segmentCollection.segment1.destination[window.segmentCollection.segment1.destination.tagName == 'SELECT' ? 'disabled' : 'readOnly'] = false;
    if (window.segmentCollection.segment1.originButton) {
      window.segmentCollection.segment1.originButton.style.display = 'inline';
    }
    if (window.segmentCollection.segment1.destinationButton) {
      window.segmentCollection.segment1.destinationButton.style.display = 'inline';
    }
    if (window.segmentCollection.returnType != 'multi'){
      AO3stepOne2SearchTypeSwitchToReadOnly('FromFour', false);
    }
    window.segmentCollection.returnType = 'multi';
    segClass = 'multiple';
  }
//  alert(segClass);
  var returnTypes = ['Yes', 'No', 'Multi'];
  for (var iReturnType in returnTypes){    
    var elRT = window.segmentCollection['returnTicket'+returnTypes[iReturnType]];
    if (!elRT) continue;
    if (elRT.checked) Library_addClass(elRT.parentNode, 'activeReturn');
    else Library_removeClass(elRT.parentNode, 'activeReturn');
  }  
  var elSeg = window.segmentCollection.segmentsBox;
  if (elSeg) {elSeg.className = elSeg.defaultClass +' '+segClass+'Segments';}
  AO3stepOne2SearchTypeHandler();//muze se projevit nasledkem readonly nebo pri startu
}

function AO3stepOne2SearchTypeHandler() {
// cast spolecna pro searchType a returnTicket
  var el = window.segmentCollection.searchType;
  var type = (el) ?  el.options[el.selectedIndex].value : 'FromFour';
  var directFlightDisabled = false;
  var clockDisabled = false;
  var cabinDisabled = false;

//  alert(type);
    switch (type) {
      case 'FareDisplay':
        clockDisabled = true;
//        directFlightDisabled = true;
        cabinDisabled = true;
        break;
      case 'LowFare':
        clockDisabled = true;
        break;
      case 'FromFour':
        clockDisabled = false;
        break;
      default:
        break;
    }
  var elDirectFlight = document.getElementById('AO3_StepOne2_directFlight');
  if (elDirectFlight){
    elDirectFlight.disabled = directFlightDisabled;
  }

  for (var k = 0; k < window.segmentCollection.count; k++){
      if (window.segmentCollection['segment'+k].departureTime)
        window.segmentCollection['segment'+k].departureTime.disabled = clockDisabled;
      if (window.segmentCollection['segment'+k].arrivalTime)
        window.segmentCollection['segment'+k].arrivalTime.disabled = clockDisabled;
  }

  var cabins = document.getElementById('AO3_StepOne2_cabinDiv').getElementsByTagName('INPUT');
  for (var i = 0; i < cabins.length; i++) {
    cabins[i].disabled = cabinDisabled;
  }

  var ways = ['origin', 'destination'];
  for (var iway in ways){
    var way = ways[iway];
    if (window.segmentCollection.segment0[way].tagName == "INPUT"){
//      window.segmentCollection.segment0[way].founderValue = window.segmentCollection.segment0[way+'Found'].value;
      window.segmentCollection.segment0[way].didSelection = true;
      window.segmentCollection.segment0[way].onchange();
    }
  }
  
  AO3stepOne2flexiOptionsEnable(type == 'FromFour' && (window.segmentCollection.returnType == 'on'));  
  AO3stepOne2flexiOptionsShow(window.segmentCollection.returnType == 'on');
  return true;
}

function Library_CalendarHandlerExternalAdd(inp){
  var elImg = inp.parentNode.getElementsByTagName('IMG');
  for (var k = 0; k < elImg.length; k++){
    if (Library_hasClass(elImg[k], 'showCalendarIcon')){
      elImg[k].targetEl = inp;
      elImg[k].targetAction = "blur";
      elImg[k].onclick = CalendarIconOnclickHandler;
    }
    if (Library_hasClass(elImg[k], 'hiddenCalendarIcon')){
      elImg[k].targetEl = inp;
      elImg[k].targetAction = "focus";
      elImg[k].onclick = CalendarIconOnclickHandler;
    }
  }
  inp.format = window.parametr.dateFormat;
  inp.onchange = AO3CalendarInputOnchangeHandler;
  if (inp.id.indexOf('departure')>0) inp.way = 'departure';
  if (inp.id.indexOf('arrival')>0) inp.way = 'arrival';
  var seg = inp.id.substring(inp.id.lastIndexOf('_')+1);
  
  if (inp.way == 'departure'){
    inp.nextCalendar = document.getElementById('AO3_StepOne2_arrival_'+(seg*1+0));
    if (!inp.nextCalendar)
      inp.nextCalendar = document.getElementById('AO3_StepOne2_departure_'+(seg*1+1));
    inp.previousCalendar = document.getElementById('AO3_StepOne2_arrival_'+(seg*1-1));
    if (!inp.previousCalendar)
      inp.previousCalendar = document.getElementById('AO3_StepOne2_departure_'+(seg*1-1));
  } else {
    inp.nextCalendar = document.getElementById('AO3_StepOne2_departure_'+(seg*1+1));
    if (!inp.nextCalendar)
      inp.nextCalendar = document.getElementById('AO3_StepOne2_arrival_'+(seg*1+1));
    inp.previousCalendar = document.getElementById('AO3_StepOne2_departure_'+(seg*1-0));
    if (!inp.previousCalendar)
      inp.previousCalendar = document.getElementById('AO3_StepOne2_arrival_'+(seg*1-1));  
  }
}
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 && window.segmentCollection.returnType == 'on') {
    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);
    }
  }
}
// ---GuiSearchFormFlights2StepOneMultiple.ajax---
// need file: module/ForAll.destination.ajax.js

function AO3searchFormFlights2stepOneMultipleAjaxHandlerAdd(){
}

function AO3Empty(){}
function AO3True(){return true;}

function AO3stepOne2destinationElHandlerAdd(el){
  if (! el) return false;
  var hid = document.createElement('input');
  hid.setAttribute('type', 'hidden');
  hid.setAttribute('id', 'AO3_StepOne2_'+el.way+'Found_'+el.counter);
  hid.setAttribute('value', '');
  hid.counter = el.counter;
  hid.onchange = AO3True;
  hid.way = el.way;
//  hid.onchange = AO3stepOne2SegmentDestinationFoundChangeHandler;
  var way = el.way;
  if (el.tagName != "SELECT"){// pro input na zalohovani exaktnich hodnot
    AO3stepOne2destinationElHandlerAddInput(el, way);
    hid.name = el.name.substring(0, el.name.indexOf("[flights]"))+"[flights]["+el.counter+"]["+way+"]";
    el.valueTarget = hid;
  } else {
    AO3stepOne2destinationElHandlerAddSelect(el, way);
    el.hiddenInput.valueTarget = hid;
  }
  el.parentNode.appendChild(hid);
  el.AO3stepOne2SegmentDestinationKeyUpHandler = AO3stepOne2SegmentDestinationKeyUpHandler;
  el.AO3stepOne2SegmentDestinationChangeHandler = AO3stepOne2SegmentDestinationChangeHandler;
}

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

function AO3stepOne2destinationElHandlerAddInput(input, way) {
  if (! input) return false;
  input.way = way;
  if (window.ajaxDisable) return true;
  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 (!this.readOnly){
    AO3searchFormGetDestinations(this, this.kde);
    this.AO3stepOne2SegmentDestinationKeyUpHandler();
  }
}
function AO3stepOne2destinationOnKeyPress(e){
  if (!this.readOnly){
    return AO3searchFormDestinationsSelectionsCancelEnter(this);
  }
  return false;
}
function AO3stepOne2destinationOnKeyDown(e){
  if (!e) { e = window.event; }
  if (!this.readOnly){
    return AO3searchFormDestinationsSelection(e, this);
  }
  return false;
}
function AO3stepOne2destinationOnBlur(e){
  if (!this.readOnly){
    window.terminalResetTimer = setTimeout('AO3searchFormGetDestinationsTerminalReset()',300);
  }
}
function AO3stepOne2destinationOnFocus(e){
  if (!this.readOnly){
    this.last=''; AO3searchFormGetDestinations(this,'index.php');
  }
}

function AO3stepOne2destinationOnChange(e){
//  if (!e) { e = window.event; }
  if (!this.readOnly){

    var codeInput = Library_getNextSiblingByTagName(this, 'INPUT', 2);
    if (!this.didSelection){
      codeInput.name = '';
      codeInput.value = '';
    }
    AO3searchFunctionGetDestinationsSelectionReset(this);
    this.AO3stepOne2SegmentDestinationChangeHandler();
  }
}

function Library_isActivable(item){
 if (item.readonly) return false;
 if (item.disabled) return false;
 if (item.offsetWidth === 0 || item.offsetHeight === 0) return false;
 
 var itemStyle = item;
 while(itemStyle){
   if (itemStyle.style && itemStyle.style.display == 'none') return false;
   itemStyle = itemStyle.parentNode;
 }
 return true;
}

function AO3stepOne2destinationSelOnChange(e) {
  var select = this;
  var type = this.way;
  if (select.value == '') {
    if (window.disableChangeSelectToInput) return false;
    select.id = '';
    var input = select.hiddenInput; //zviditeleneni Inputu pro vyhledavani
    input.style.display = 'inline';
    input.id = 'AO3_StepOne2_'+select.way+'_'+select.counter;
    input.counter = select.counter;
    input.readOnly = select.disabled;
    input.AO3stepOne2SegmentDestinationKeyUpHandler = AO3stepOne2SegmentDestinationKeyUpHandler;
    input.AO3stepOne2SegmentDestinationChangeHandler = AO3stepOne2SegmentDestinationChangeHandler;
    input.lastSearchValue = select.lastSearchValue;
    input.lastExactValue = select.lastExactValue;
    input.valueTarget.name = "data[flights]["+select.counter+"]["+select.way+"]";
    input.propagation = select.propagation;
    if (input.counter > 0){
      window.segmentCollection['segment'+(select.counter-1)][select.way == 'origin' ? 'destination' : 'origin'].changesTarget = input;
    }
    if (input.counter+1 <  window.segmentCollection.count){
      input.changesTarget = window.segmentCollection['segment'+(input.counter+1)][input.way == 'origin' ? 'destination' : 'origin'];
    }
/*    switch (window.segmentCollection.returnType) {
      case 'multi':
        input.propagation = (input.way == 'destination' ? 'soft' : false);
      break;
      case 'on':
      default:
        input.propagation = input.counter == 0 ? 'force' : false;
        input.propagation = input.counter == 0 ? 'force' : false;
      break;
    }*/
    window.segmentCollection['segment'+select.counter][select.way] = input;

    select.parentNode.removeChild(select);
    input.onchange();
    if (Library_isActivable(input)){ input.focus();}
  } else {
    select.AO3stepOne2SegmentDestinationChangeHandler();
  }
}
// ---GuiSearchFormFlights2StepOneSpecialOffer---
function AO3searchFormFlights2stepOneSpecialOfferHandlerAdd() {
   AO3searchFormSetActiveTrHandlerAdd();
}

function AO3searchFormSetActiveTrHandlerAdd(){
  var trs = document.getElementsByTagName('TR');
  for (var i = 0; i < trs.length; i++) {
    if (Library_hasClass(trs[i], 'AO3_SpecialOfferFare')) {
      trs[i].onclick = AO3searchFormTrOnclickHandler;
      trs[i].onmouseover = AO3searchFormTrOnmouseOver;
      trs[i].onmouseout = AO3searchFormTrOnmouseOut;
      var hrefs = trs[i].getElementsByTagName('A');
      trs[i].mySrc = hrefs[0].href;
      trs[i].title = hrefs[0].title;
      hrefs[0].parentNode.innerHTML = hrefs[0].innerHTML;
//      alert (trs[i].mySrc);
    }
  }
}

function AO3searchFormTrOnclickHandler(e){
  if (window.parent) {
    window.parent.location = this.mySrc;
  } else {
    window.location = this.mySrc;
  }
}

function AO3searchFormTrOnmouseOver(e) {
  Library_addClass(this, 'active');
}
function AO3searchFormTrOnmouseOut(e) {
  Library_removeClass(this, 'active');
}