  //======================================================================================================
  //  Ajax framework
  //======================================================================================================

  function TAjax(ResultFunction,type)
  //Konstruktor tridy Ajax. Generuje novy XML (type==XML) ci TEXT (type==TEXT) POST Ajax objekt v zavislosti
  //na prohlizecich.
  {
    this.Ajax=false;
    this.ResultExternal=ResultFunction;
    this.ExternalTag=Array();
    this.ExternalFunction=Array();
    this.ExternalTags="";

    this.Send=AJAX_Send;
    this.ComputeNod=AJAX_ComputeNod;
    this.ComputeText=AJAX_ComputeText;
    this.AddExternal=AJAX_AddExternal;

    //Verze pro IE a ostatni
    if (document.all)
      this.Ajax=new ActiveXObject("Microsoft.XMLHTTP");
        else
      {
        this.Ajax=new XMLHttpRequest();
        if (type=="XML")
          this.Ajax.overrideMimeType("text/xml");
            else
          this.Ajax.overrideMimeType("text/html");
      }
  }
  //------------------------------------------------------------------------------------------------------

  function AJAX_AddExternal(tag,func)
  //Prida do objektu novou externi funkci zpracovavajici pri textovem zpracovani tag tag na objektu obj.
  {
    this.ExternalTag[this.ExternalTag.length]=tag;
    this.ExternalFunction[this.ExternalFunction.length]=func;

    this.ExternalTags=","+this.ExternalTag.toString()+",";
  }
  //------------------------------------------------------------------------------------------------------

  function AJAX_Send(target,data)
  //Post metodou kontaktuje Ajaxe Ajax na cili target s daty data. Ta jsou kodovana jako parametry v URL
  //jen bez znaku ? na zacatku.
  {
    //Kontrola podpory Ajaxu
    if (!this.Ajax)
      {
        window.alert("Váš prohlížeč nepodporuje nezbytné technologie nutné pro funkčnost stránek (javaskript a Ajax). Případně se může jednat o zakázání ActiveX ve Vašem prohlížeči. Podporované prohlížeče: IE 5.0 a novější, Firefox, Netscape, Mozilla, Opera, Safari, Chrome.");
        return;
      }
    var Object=this; //Trik aby funkce na zpracovani vysledku jenz nalezi XMLHttpRequest vedela jakou nastavenou metodu Ajaxe zavolat.

    this.Ajax.open("POST",target);
    this.Ajax.setRequestHeader('Content-Language','cz');
    this.Ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=windows-1250');
    this.Ajax.onreadystatechange=function()
      {
        if (Object.Ajax.readyState!=4 || Object.Ajax.status!=200) return;
        if (Object.ResultExternal) Object.ResultExternal();
      }
    this.Ajax.send(data);
  }
  //------------------------------------------------------------------------------------------------------

  function AJAX_ComputeNod(nod)
  //Funkce pro rekurzivni zpracovani nodu nod XML. Provede rozpleteni nodu a update stranky jeho daty.
  {
    var i,j;
    var empty;

    if (!nod) return;

    //Zpracovani koncoveho uzlu
    if (nod.attributes &&
        nod.attributes.getNamedItem("data") &&
        nod.attributes.getNamedItem("data").nodeValue=="1" &&
        nod.childNodes)
      {
        var element=document.getElementById(nod.nodeName);
        if (element)
          {
            empty=true;
            for (i=0;i<nod.childNodes.length;i++)
              if (nod.childNodes[i] && nod.childNodes[i].nodeType==1 && nod.childNodes[i].firstChild)
                {
                  if (nod.childNodes[i].nodeName=="src")
                    {
                      element.src=nod.childNodes[i].firstChild.nodeValue;
                      empty=false;
                    }
                  if (nod.childNodes[i].nodeName=="text")
                    {
                      if (nod.attributes.getNamedItem("br") && nod.attributes.getNamedItem("br").nodeValue=="1")
                        element.innerHTML=nod.childNodes[i].firstChild.nodeValue+"<br>";
                          else
                        element.innerHTML=nod.childNodes[i].firstChild.nodeValue;
                      empty=false;
                    }
                  if (nod.childNodes[i].nodeName=="url")
                    {
                      element.href=nod.childNodes[i].firstChild.nodeValue;
                      empty=false;
                    }
                  if (nod.childNodes[i].nodeName=="display" && nod.childNodes[i].firstChild.nodeValue=="1")
                    empty=false;
                }

            if (empty) element.style.display='none';
              else element.style.display='inline';
          }
        return;
      }

    //Zpracovani hromadneho uzlu
    for (i=0;i<nod.childNodes.length;i++)
      if (nod.childNodes[i] && nod.childNodes[i].nodeType==1)
        this.ComputeNod(nod.childNodes[i]);
  }
  //------------------------------------------------------------------------------------------------------

  function AJAX_ComputeText(text)
  //Provede zpracovani predaneho textu text a jeho zacleneni do struktury stranky. Text je rozdelen na
  //bloky metaznaky |-| ktere jsou rozdeleny znakem | na casti kde prvni predstavuje id ciloveho elementu
  //na strance, druha parametr umisteni v elementu (text/src/url/display/disabled/value) a treti vlastni hodnotu.
  {
    var output=text.split("|/|");
    var parts;
    var element;
    var code;
    var i;

    for (i=0;i<output.length;i++)
      {
        parts=output[i].split("|");

        if (parts.length>1) parts[1]=parts[1].trim();
        element=document.getElementById(parts[0].trim());
        if (element)
          {
            if (parts[1]=="text") element.innerHTML=parts[2];
            if (parts[1]=="src") element.src=parts[2];
            if (parts[1]=="url") element.href=parts[2];
            if (parts[1]=="display")
              if (parts[2]=="1") element.style.display="block";
                  else
                if (parts[2]=="2") element.style.display="inline";
                  else element.style.display="none";
            if (parts[1]=="disabled")
              if (parts[2].trim()=="1") element.disabled=true;
                else element.disabled=false;
            if (parts[1]=="value" && (parts[2]!="" || element.nodeName!="SELECT")) element.value=parts[2];
            if (parts[1]=="color" && parts[2].trim()!="") element.style.color=parts[2];
          }
            else
          //Pripadne externi zpracovani
          if (parts.length>1 && parts[1]!="" && this.ExternalTags.indexOf(","+parts[1]+",")>=0)
            {
              var j=0;
              while (this.ExternalTag[j]!=parts[1])
                j++;
              this.ExternalFunction[j](parts[2]);
            }
      }
  }
  //------------------------------------------------------------------------------------------------------

  //======================================================================================================
  //  Pomocne funkce
  //======================================================================================================

  function ShowPartnerIcon(tag,color)
  //Zobrazuje partnerskou ikonu tagu tag v barve color.
  {
    document.getElementById("partner_"+tag).src=rel_path+"_templates/all/partners/"+tag+"_[100x30_"+color+"].png";
  }
  //------------------------------------------------------------------------------------------------------

  function get(element)
  //Parser funkce na funkci document.getElementById().
  {
    return document.getElementById(element);
  }
  //------------------------------------------------------------------------------------------------------

  String.prototype.ltrim = function()
  {
    var k;
    for (k=0;k<this.length && isWhitespace(this.charAt(k));k++);
    return this.substring(k,this.length);
  }
  //------------------------------------------------------------------------------------------------------

  String.prototype.rtrim = function()
  {
    var j;
    for (j=this.length-1;j>=0 && isWhitespace(this.charAt(j));j--);
    return this.substring(0,j+1);
  }
  //------------------------------------------------------------------------------------------------------

  String.prototype.trim = function()
  {
    return this.ltrim(this.rtrim());
  }
  //------------------------------------------------------------------------------------------------------

  function isWhitespace(char)
  {
    var WhitespaceChars=" \t\n\r\f";
    return (WhitespaceChars.indexOf(char)!=-1);
  }
  //------------------------------------------------------------------------------------------------------

  //======================================================================================================
  //  Sprava subpanelu
  //======================================================================================================

  function SubPanelClose()
  //Skryva subpanel.
  {
    document.getElementById("subpanel").style.display='none';
    if (error_url=="EMPTY") return;
    window.location.href=error_url;
  }
  //------------------------------------------------------------------------------------------------------

  function SubPanelDelete()
  //Zavre subpanel a vynuluje jeho obsah.
  {
    document.getElementById("subpanel").style.display='none';
    SubPanelControlsReset();
    get("subpanel_text").innerHTML="";
  }
  //------------------------------------------------------------------------------------------------------

  function SubPanelShow()
  //Zobrazuje subpanel tak jak je.
  {
    document.getElementById("subpanel").style.display="block";
    window.scrollTo(0,0);
  }
  //------------------------------------------------------------------------------------------------------

  function SubPanelText(text)
  //Nastavuje do subpanelu text text a zobrazuje jej.
  {
    document.getElementById("subpanel_text").innerHTML=text;
    document.getElementById("subpanel_text").style.textAlign="left";
    document.getElementById("subpanel_text").style.fontWeight="bold";
    document.getElementById("subpanel").style.display="block";
    window.scrollTo(0,0);
  }
  //------------------------------------------------------------------------------------------------------

  function SubPanelControlsReset()
  //Vyresetuje vsechny ovladaci prvky subpanelu do neviditelneho stavu.
  {
    document.getElementById("subpanel_yes").style.display="none";
    document.getElementById("subpanel_no").style.display="none";
    document.getElementById("subpanel_ok").style.display="none";
    document.getElementById("subpanel_cancel").style.display="none";
    document.getElementById("subpanel_save").style.display="none";

    document.getElementById("subpanel_yes_separator").style.display="none";
    document.getElementById("subpanel_no_separator").style.display="none";
    document.getElementById("subpanel_ok_separator").style.display="none";
    document.getElementById("subpanel_cancel_separator").style.display="none";
    document.getElementById("subpanel_save_separator").style.display="none";
  }
  //------------------------------------------------------------------------------------------------------

  function SubPanelControl(type,link,status,separator)
  //Nastavuje na subpanelu ovladaci moznost type na aktivni stav (status TRUE) nebo pasivni stav
  //(status FALSE) s odkazem na link. Pokud je separator TRUE tak zobrazuje u volby i separator.
  //Zajistuje zobrazeni ci skryti vsech voleb jako celku.
  {
    if (!document.getElementById("subpanel_"+type)) return;
    var display="inline";
    if (!status) display="none";

    //Nastaveni ovladani
    document.getElementById("subpanel_"+type).style.display=display;
    document.getElementById("subpanel_"+type).href=link;

    //Nastaveni viditelnosti celku
    if (status ||
        (document.getElementById("subpanel_yes").style.display=="none" &&
         document.getElementById("subpanel_no").style.display=="none" &&
         document.getElementById("subpanel_ok").style.display=="none" &&
         document.getElementById("subpanel_cancel").style.display=="none" &&
         document.getElementById("subpanel_save").style.display=="none"))
      document.getElementById("subpanel_controls").style.display=display;

    //Nastaveni viditelnosti separatoru
    if (separator)
      document.getElementById("subpanel_"+type+"_separator").style.display="inline";
        else
      document.getElementById("subpanel_"+type+"_separator").style.display="none";
  }
  //------------------------------------------------------------------------------------------------------

  function SubPanelControlOK(link,text)
  //Restartuje subpanel, nastavuje na nem tlacitko OK na link link a zobrazuje jej s textem text.
  {
    SubPanelControlsReset();
    SubPanelControl("ok",link,true,false);
    SubPanelText(text);
  }
  //------------------------------------------------------------------------------------------------------

  function SubPanelControlYESNO(link,text)
  //Restartuje subpanel, nastavuje na nem tlacitko YES na link link, tlacitko na NO na uzavreni subpanelu
  //a zobrazuje jej s textem text.
  {
    SubPanelControlsReset();
    SubPanelControl("yes",link,true,true);
    SubPanelControl("no","javascript:SubPanelClose();",true,false);
    SubPanelText(text);
  }
  //------------------------------------------------------------------------------------------------------

  function SubPanelControlSAVECANCEL(link,text)
  //Restartuje subpanel, nastavuje na nem tlacitko SAVE na link link, tlacitko na CANCEL na uzavreni
  //subpanelu a zobrazuje jej s textem text.
  {
    SubPanelControlsReset();
    SubPanelControl("save",link,true,true);
    SubPanelControl("cancel","javascript:SubPanelClose();",true,false);
    SubPanelText(text);
  }
  //------------------------------------------------------------------------------------------------------

  //======================================================================================================
  //  Zobrazeni nahledu fotografii
  //======================================================================================================

  function TGaleries()
  //Konstruktor tridy shromazdujicim pole galerii.
  {
    this.Galeries=Array();

    this.New=GALERIES_New;
    this.Add=GALERIES_Add;
    this.Show=GALERIES_Show;
    this.Next=GALERIES_Next;
    this.Back=GALERIES_Back;
  }
  //------------------------------------------------------------------------------------------------------

  function GALERIES_New(index,width,height)
  //Vytvari novou galerii na indexu index o velikosti okna pro nahledy width x height.
  {
    this.Galeries[index]=new TGalery(index,width,height);
  }
  //------------------------------------------------------------------------------------------------------

  function GALERIES_Add(gindex,index,url,info)
  //Nastavuje novy obrazek indexu index do galerie indexu gindex s url url a popiskem info.
  {
    this.Galeries[gindex].Add(index,url,info);
  }
  //------------------------------------------------------------------------------------------------------

  function GALERIES_Show(index,image)
  //Zobrazuje obrazek indexu image v galerii indexu index.
  {
    this.Galeries[index].Show(image);
  }
  //------------------------------------------------------------------------------------------------------

  function GALERIES_Next(index)
  //Zobrazuje dalsi obrazek z galerie indexu index po zobrazenem.
  {
    this.Galeries[index].Next();
  }
  //------------------------------------------------------------------------------------------------------

  function GALERIES_Back(index)
  //Zobrazuje predchozi obrazek z galerie indexu index pred zobrazenem.
  {
    this.Galeries[index].Back();
  }
  //------------------------------------------------------------------------------------------------------

  function TGalery(index,width,height)
  //Konstruktor tridy TGalery pro zobrazeni velkych obrazku velikosti width x height pix.
  //Index je index galerie v Galeries.
  {
    this.Info=Array();
    this.Images=Array();
    this.Width=width;
    this.Height=height;
    this.Index=index;
    this.Displayed=-1;

    this.Add=GALERY_Add;
    this.Show=GALERY_Show;
    this.Next=GALERY_Next;
    this.Back=GALERY_Back;
  }
  //------------------------------------------------------------------------------------------------------

  function GALERY_Add(index,url,info)
  //Pridava na index-tou pozici do seznamu obrazku obrazek na url url s popiskem info.
  {
    this.Info[index]=info;
    this.Images[index]=url;
  }
  //------------------------------------------------------------------------------------------------------

  function GALERY_Show(index)
  //Zobrazuje nahled indexu index.
  {
    if (this.Images[index]=="") return;

    var inner='<div style="position:relative">';
    //inner='<p align="center"><a href="javascript:SubPanelClose();"><img src="'+this.Images[index]+'" width="'+this.Width+'" height="'+this.Height+'"></a></p>\n';
    inner='<p align="center"><img src="'+this.Images[index]+'"></p>\n';
    inner+='<table width="100%">\n';
    inner+='<col width="10%"><col width="80%"><col width="10%">\n';
    inner+='<tr>\n';
    inner+='  <td align="left">';
    if (index>0) inner+='<a href="javascript:Galery.Back('+this.Index+');"><img src="./img/predchozi.png" class="border_no"></a>';
    inner+='</td>\n';
    inner+='<td align="center">'+this.Info[index]+'</td>\n';
    inner+='<td align="right">';
    if (index+1<this.Images.length) inner+='<a href="javascript:Galery.Next('+this.Index+');"><img src="./img/dalsi.png" class="border_no"></a>\n';
    inner+='</td></tr>\n';
    inner+='</table></div>\n';

    if (index>0)
      {
        inner+='<a href="javascript:Galery.Back('+this.Index+');" style="position:absolute;display:block;top:0px;left:0px;width:30%;height:90%;top:25px;" title="předchozí">';
        inner+='<div style="width:100%;height:100%;"></div></a>\n';
      }
    if (index+1<this.Images.length)
      {
        inner+='<a href="javascript:Galery.Next('+this.Index+');" style="position:absolute;display:block;top:0px;right:0px;width:30%;height:90%;top:25px;" title="následující">';
        inner+='<div style="width:100%;height:100%;"></div></a>\n';
      }

    SubPanelControlsReset();
    get("subpanel_text").innerHTML=inner;
    get("subpanel_text").style.textAlign="center";
    get("subpanel_text").style.fontWeight="bold";

    if (get("subpanel").childNodes[1])
      get("subpanel").childNodes[1].style.width=String(this.Width+40)+"px";
        else
      if (get("subpanel").childNodes[0])
        get("subpanel").childNodes[0].style.width=String(this.Width+40)+"px";

    get("subpanel_close").style.display="block";
    get("subpanel").style.display="block";
    window.scrollTo(0,0);

    this.Displayed=index;
  }
  //------------------------------------------------------------------------------------------------------

  function GALERY_Next()
  //Zobrazuje dalsi obrazek v poradi.
  {
    if (this.Displayed+1>=this.Images.length) return;

    var index=this.Displayed;
    do {
      index++;
    } while(this.Images[index]=="" && index<this.Images.length);

    if (index<this.Images.length) this.Show(index);
  }
  //------------------------------------------------------------------------------------------------------

  function GALERY_Back()
  //Zobrazuje predchozi obrazek v poradi.
  {
    if (this.Displayed<=0) return;

    var index=this.Displayed;
    do {
      index--;
    } while(this.Images[index]=="" && index>=0);

    if (index>=0) this.Show(index);
  }
  //------------------------------------------------------------------------------------------------------

  //======================================================================================================
  //  Definice galerie
  //======================================================================================================

  var Galery=new TGaleries();




