// --- INIT --------------------------------------------------------------------
window.onload=function(){ init(); };

function init() {
  inputNumbersOnlyInit('numbersonly');
  if(top.length != self.length) top.location.href = self.location.href; //je-li stranka nactena v ramu, nacte se do top ramu
  
  //na stránce category.php nabinduji zvyrazneni aktualni stranky
  //loc = top.location.href.toString();
  //if(loc.indexOf("category.php")!=-1) { show_hide('filterContainer', 'filterBind', true); }

}


// --- CONSTANTS ---------------------------------------------------------------

//rozlišení prohlížečů
var ua = navigator.userAgent;
var isMSIE = (navigator.appName == "Microsoft Internet Explorer"); // používáme Internet Explorer?
var isMSIE5 = isMSIE && (ua.indexOf('MSIE 5') != -1); // používáme Internet Explorer 5?
var isMSIE6 = isMSIE && (ua.indexOf('MSIE 6') != -1); // používáme Internet Explorer 6?
var isMSIE7 = isMSIE && (ua.indexOf('MSIE 7') != -1); // používáme Internet Explorer 7?
var isGecko = ua.indexOf('Gecko') != -1; // používáme Gecko? (na Safari také true)?
var isSafari = ua.indexOf('Safari') != -1; // používáme Safari?
var isOpera = window['opera'] && opera.buildNumber ? true : false; // používáme Operu?
var isMac = ua.indexOf('Mac') != -1; // používáme Mac?
var isNS7 = ua.indexOf('Netscape/7') != -1; // používáme Netscape7 ?
var isNS71 = ua.indexOf('Netscape/7.1') != -1; // používáme Netscape7.1 ?
// používáme opravdu Internet Explorer (odliší Operu vydávající se za IE)?
if(isOpera) { isMSIE = true; isGecko = false; isSafari =  false; } // emulace MSIE na Opere
isIE = isMSIE && !isOpera;


// --- FUNCTIONS ---------------------------------------------------------------

/** Pokud je hodnota pole rovna default hodnotě, vymaže ji a odstraní i třídu pro šedý text
 */
function defaultValueClear(o, defaultValue, inactiveClass) {
  if(!inactiveClass) { inactiveClass = 'inactive'; }

  if(o.value==defaultValue) {
    o.value=''; //vymažu pole
    //odstraním třídu pro šedý text
    var re = new RegExp("\s*" + inactiveClass);
    o.className = o.className.replace(re, "");
  }
}

/** Změní vybranou hodnotu v elementu na value
 *  @todo upravit nejen i pro textarea, radibuttony apod.
 *  @param {integer|string} region  číslo kraje, pro který máme načíst hodnoty (okresy)
 *  @param {element} elementId  id SELECTu, kde mám změnit hodnotu
 */
function synchronizeValue(value, elementId) {
  o = getObj(elementId);
  tagName = o.nodeName.toLowerCase();
  
  //nelze pouzit o.value=value kvuli IE; a take hodnota v cilovem poli nemusi vubec byt k dispozici
  if(tagName=='select') {
    for(a=o.options.length-1; a>=0; a--) {
      if(o.options[a].value==value) { o.options[a].selected = true; break; } //prochazim cilovy SELECT a pokud naleznu hodnotu, vyberu ji
    }
  } else if(tagName=='input') {
    o.value = value;
  }
}

/** Změní hodnoty v SELECtu element na hodnoty v poli okresy[region]
 *  @param {integer} region  číslo kraje, pro který máme načíst hodnoty (okresy)
 *  @param {element} districtId  id SELECTu s okresy
 */
function switchDistrict(region, districtId) {
  o = getObj(districtId);
  for(a=o.options.length-1; a>=0; a--) { o.options[a]=null; } //vymazu aktualni hodnoty
  for(a=0; a<okresy[region].length; a++) {
    if(okresy[region][a]) { o.options[o.options.length] = new Option(okresy[region][a], a); } //pokud je polozka definovana, pridame ji do SELECTu
  }
}

/** Přidá do url odkazu zbylé parametry vyhledávacího formuláře
 *
 */
function searchHrefAdd(anchor) {
  anchor.href = dataToQuery(anchor.href);
  return true;
}

/** Přidá k url parametry z vyhledávacího formuláře lékaře, kromě těch, které již v url jsou obsaženy
 *  @param {string} url
 */
function dataToQuery(url) {
  params = getParamsFromURL(url); //nactu si jiz predane parametry
  if(url.indexOf("?")==-1) { url = url + "?"; } //pokud neni v url otaznik, doplnime
  formName = 'searchForm'; //nazev formulare, ze ktereho nacitam hodnoty

  //nactu aktualni hodnoty selectu a textovych inputu
  cId = getObj('cId');
  region = getObj('r');
  district = getObj('d');
  city = getObj('c');
  surname = getObj('su');
  //pridam nepouzite parametry, dle kterych vyhledavam
  if(params['cId']==undefined) { if(cId!=undefined) { params['cId']=cId.value; } }
  if(params['r']==undefined) { if(region!=undefined) { params['r']=region.value; } }
  if(params['d']==undefined) { if(district!=undefined) { params['d']=district.value; } }
  if(params['c']==undefined) { if(city!=undefined) { params['c']=city.value; } }
  if(params['su']==undefined) { if(surname!=undefined) { params['su']=surname.value; } }
  if(params['g']==undefined) { params['g']=getRadioValue(formName, 'g'); }
  if(params['se']==undefined) { params['se']=getRadioValue(formName, 'se'); }
  if(params['np']==undefined) { params['np']=getRadioValue(formName, 'np'); }

  //vytvorim kompletni url
  var baseUrl = url.substr(0, url.indexOf("?")+1).toLowerCase(); //oddelim cast pred ?
  for(i in params) { //pridam parametry do url
    if(params[i]==0 || params[i]=="" || (params[i]==2 && i=='np')) { continue; } //vynechavam parametry s default hodnotou
    baseUrl += i + "=" + params[i] + "&";
  }
  url = baseUrl.substr(0, baseUrl.length-1); //odstranim & na konci
  return url;
}

/** Vrátí vybranou hodnotu radiobuttonů radiobuttonsName ve formuláři formName
 */
function getRadioValue(formName, radiobuttonsName) {
  oForm = document.forms[formName];
  if(!oForm) { return false; }
  
  for(var i=0; i<oForm[radiobuttonsName].length; i++) {
    if(oForm[radiobuttonsName][i].checked) {
      return oForm[radiobuttonsName][i].value;
    }
  }
  return false;
}


/** Nalezne v předaném URL všechny parametry a vrátí je v poli array(name=>value, ...)
 *  @param {string} url url adresa k rozparsování
 *  @return {array|false} pole názvů a hodnot parametrů nalezených v URL, prázdné pole pokud nejsou žádné parametry ale url obsahuje ?, false pokud URL neobsahuje ani ?
 */
function getParamsFromURL(url) {
  params = new Array();
  if(url.indexOf("?") > -1) {
    var strQueryString = url.substr(url.indexOf("?")+1).toLowerCase(); //oddelim cast za ?
    var aQueryString = strQueryString.split("&"); //rozdelim po parametrech
    for(var iParam = 0; iParam < aQueryString.length; iParam++ ) {
      if(aQueryString[iParam].indexOf("=") > -1 ) {
        var aParam = aQueryString[iParam].split("=");  //rozdelim nazev a hodnotu
        params[aParam[0]] = aParam[1]; //ulozim parametry
      }
    }
  }
  return params;
}


/** Nabinduje k INPUTům třídy className funkci, která omezuje psaní pouze na čísla
 *  @param {string} className  CSS třída, která označuje elementy kde lze psát jen čísla
 */
function inputNumbersOnlyInit(className) {
  els = getElementsByClass(className);
  for(i=0; i<els.length; i++) {
    addEventListener(els[i], 'keyup', onlyDigits, false);
  }
}

/** Umožní psát do elementu pouze čísla
 *  @param {event} e  event z browseru, spuštěný na stisk klávesy
 */
function onlyDigits(e) {
  evt = adaptEvent(e);
  object = evt['target'];

  var chars = "0123456789-.,"; //validni znaky
  var s = object.value;
  var output = '';

  for(var i=0; i<s.length; i++) {
    if(chars.indexOf(s.charAt(i))!==-1) { output = output + s.charAt(i); } //pridam jen validni znaky
  }
  object.value = output;
}

/** Zobrazení/skrytí elementu, případně nabindovaní klikáni na určitý element
 *  @param {string} elementId  element pro skrytí/zobrazení
 *  @param {string} attachId   na který element nabindovat skrytí/zobrazení elementId
 *  @param {boolean} init      zda se jedná o inicializaci (=budeme nastavovat počáteční zobrazení)
 */
function show_hide(elementId, attachId, init) {
  //nabindujeme skrývání/zobrazení elementu
  if(attachId!=null) {
    addEventListener(attachId, 'click', function() { show_hide(elementId); } );
  }

  //pokud jde o inicializaci, nastavíme počáteční stav, jinak provedeme změnu
  o = getObj(elementId);
  if(!o) { return; } //nejsou parametry -> není co filtrovat, ukončím
  
  if(init==true) {
    o.style.display = 'none';
  } else {
    if(o.style.display=='none') { o.style.display = 'block'; } else { o.style.display = 'none'; }
  }

  return true;
}


/** Otevře pop-up okno (pro obrázek)
 *  @param {string} url      adresa otevírané stránky
 *  @param {integer} width   šířka okna v px
 *  @param {integer} height  výška šířka v px
 */
function show(odkaz, width, height) {
  window.open(odkaz+"&width="+width+"&height="+height, "foto", "width="+(width)+",height="+(height)+", toolbar=no, status=no, location=no, menubar=no, resizable=no");
  return false; //pokud funguje javascript, zastavim provadeni akce, ktera je v HREF
}


/** Otevře pop-up okno (pro stránku)
 *  @param {string} url      adresa otevírané stránky
 *  @param {integer} width   šířka okna v px
 *  @param {integer} height  výška šířka v px
 */
function show_page(url, width, height) {
  window.open(odkaz, "page", "width="+width+",height="+height+", toolbar=no, status=yes, location=no, menubar=no, scrollbars=yes");
  return false;
}


/** Přidá url do záložek / oblíbených
 *  @example <a href="#" title="Přidat stránku k oblíbeným odkazům" rel="sidebar" onclick="return add_favorite(this, 'http://www.seznam.cz', 'Seznam.cz - najdu tam co neznám');">přidat k oblíbeným</a>
 *  @param {object} linkObj   link objekt
 *  @param {string} addUrl    url pro přidání
 *  @param {string} addTitle  popis odkazu
 */
function add_favorite(linkObj, addUrl, addTitle) {
  if(document.all && !window.opera) { //IE
    window.external.AddFavorite(addUrl, addTitle);
    return false;

  } else if(window.opera && window.print) { //Opera
    linkObj.title = addTitle;
    linkObj.rel = "sidebar";
    return true;

  } else if((typeof window.sidebar=='object') && (typeof window.sidebar.addPanel=='function')) { //Mozilla
    if(window.confirm('Přidat stránku do záložek?')) {
      window.sidebar.addPanel(addTitle, addUrl, '');
      return false;
    }
  }

  //nerozpoznán prohlížeč
  window.alert('Po potvrzení stiskněte CTRL-D,\nstránka bude přidána k Vašim oblíbeným odkazům.');
  return false;
}


// --- CORE --------------------------------------------------------------------

/** Nalezne v dokumentu element s daným id
 *  @param {string} id id elementu pro nalezení
 */
function getObj(id) {
  var obj = document.getElementById ? document.getElementById(id) : document.all[id];
  return obj;
};


/** Vyhledá elementu s danou třídou (class)
 *  @param {string} searchClass hledaný název třídy
 *  @param {object} [node] DOM element, kde hledáme (default=document)
 *  @param {string} [tagName] název tagu, na který omezit prohledávání (default=všechny tagy)
 *  @param {boolean} [allowSubstrings] zda prohledávat přesně, nebo i jako podřetězce názvu třídy (default=false)
 *  @return {array} pole DOM elementů
 */
function getElementsByClass(searchClass, node, tagName, allowSubstrings) {
  var classElements = new Array();
  if(node == null) { node = document; }
  if(tagName == null) { tagName = '*'; }
  if(allowSubstrings == null ) { allowSubstrings = false; }
  
  var els = node.getElementsByTagName(tagName);
  var elsLen = els.length;
  var regExpStr =  allowSubstrings ? searchClass : "(^|\\s)"+ searchClass +"(\\s|$)";
  var pattern = new RegExp(regExpStr);
  
  for(i=0,j=0; i<elsLen; i++) {
    if(pattern.test(els[i].className)) {
      classElements[j] = els[i];
      j++;
    }
  }
  return classElements;
}


/** Vyhledá hodnotu parametru strParamName předaného metodou GET
 *  @param {string} strParamName název hledaného parametru
 *  @return {string} hodnota parametru
 */
function getURLParam(strParamName){
  var strReturn = "";
  var strHref = window.location.href;
  if(strHref.indexOf("?") > -1) {
    var strQueryString = strHref.substr(strHref.indexOf("?")).toLowerCase();
    var aQueryString = strQueryString.split("&");
    for( var iParam = 0; iParam < aQueryString.length; iParam++ ) {
      if( aQueryString[iParam].indexOf(strParamName.toLowerCase() + "=") > -1 ) {
        var aParam = aQueryString[iParam].split("=");
        strReturn = aParam[1];
        break;
      }
    }
  }
  return unescape(strReturn);
}

/** Vygeneruje ID, unikátní v rámci elementu doc (implicitně celý dokument)
 *  @param {object} [doc] element, ve kterém musí být ID unikántí [default=document]
 *  @return {string} unikátní ID
 */
function genUid(doc) {
  if(!doc) { doc = document; }
  var uid, collide = 0;

  do {
    uid = ((new Date()).getTime() + "" + Math.floor(Math.random() *  1000000)).substr(0, 18);
    if(doc.getElementById(uid)) { collide = 1; }
  } while(collide);
  return uid;
}

/** Zjistí, zda a obsahuje externí odkaz
 *  @param {object} a  element s href odkazem
 *  @return {boolean}  míří odkaz mimo aktuální doménu?
 */
function isExternalLink(a) {
  var external=false;
  test_exp = new RegExp("^(http(s)?://"+self.location.host+"|mailto:)"); // regulární výraz, který zjistí, zda vede odkaz na jiný server
  if(!test_exp.test(a.href)) external=true; // vede odkaz na jiný server?
  //if(a.className.indexOf("external")>-1) nove_okno=true; // má přiřazenu třídu „external?“
  //if(a.rel=="external") nove_okno=true; // má nastaven atribut rel na „external?“?
  return external;
}


/**
 * Připojení zpracování události k elementu na určitou událost. Kompatibilní se všemi prohlížeči.
 * @param {string|object} element  id elementu / DOM element, na který handler zavěsit
 * @param {string} eventType       na jakou událost handler zavěsit
 * @param {function} handler       obsluha události (funkce)
 * @param {boolean} capture        zastavit probublávání událostí dál
 * @return {boolean}               úspěch/neúspěch
 */
function addEventListener(element, eventType, handler, capture) {
  if(typeof element == 'string') { element = getObj(element); } //mohu předat i ID elementu
  
  //i když opera zvládá standardní addEventListener, u iframe přes něj nezvládá onload a je třeba použít attachEvent
  //viz. http://dotnetslackers.com/Ajax/re-28191_r_a_d_controls_Event_handing_Atlas_and_Opera.aspx
  if(element.addEventListener && !isOpera) {
		element.addEventListener(eventType, handler, capture); return true;
	} else if(element.attachEvent) {
		var r = element.attachEvent("on" + eventType, handler); return r;
  } else { return false; }
}

/**
 * Standardizuje událost tak, aby měla ve všech prohlížečích stejnou strukturu
 * @param {object} e zachycená událost z browseru
 * @return {object} standardizovaný objekt události
 */
function adaptEvent(e) {
  if(typeof e=='undefined') { e = window.event; } //vezmeme z parametru, pripadne z hlavniho okna prohlizece
  ret = e;
  if(isIE && (typeof ret['srcElement']!='undefined')) { ret['target'] = ret['srcElement']; } //IE ma cilovy element jinde nez ostatni
  return ret;
}


/**
 * Vrací text obsažený v elementu
 * @param {string|object} element id elementu / DOM element
 * @return {string} text obsažený v elementu
 */
function getText(element) {
  if(typeof element == 'string') { element = getObj(element); } //mohu předat i ID elementu
  hasInnerText = (document.getElementsByTagName("body")[0].innerText != undefined) ? true : false;
  return hasInnerText ? element.innerText : element.textContent;
}

