/**
 * @fileoverview Objekty a kody pro uvodni stranku CFN/Kinobox
 * 
 * <ul> 
 *  <li>objekt videobox</li> 
 * </ul>   
 * 
 * @author Oranges.s.r.o. & Laki <info@laki.cz>
 * @version 1.0 <15-09-2009>
 */  

/*
 Bloky kodu uzavrene mezi komentari /(star)deb(star)/ slouzi pouze pro ladeni kodu a ve finalnim kodu maji byt automatizovane odstraneny vcetne techto komentaru. 
 */

/**
 * Objekt pro rozpohybovani videoboxu na uvodni strance.
 * 
 * <p>Struktura vstupniho objektu:</p> 
 * <pre>
 *    id     - string - povinny
 *           - identifikator tabulky filmografie, ktera se ma nacist a nahradit
 * </pre>
 * 
 * @example Typicke pouziti  
 *  var fotoramecek = new videobox( {id:"fotoramecek"} );  
 *   
 * @class videobox - obsluha videoboxu
 * @extends cfn
 * @version 1.1
 * @constructor
 * @requires events Udalosti  
 * @param {object} p Objekt vstupnich parametru
 */
function videobox(p)
{
  /*deb*/
  /**
   * Priznak vypisovani debug informaci. Je-li hodnota true, vypisuji se debug informace objektu.
   * @type boolean
   * @private      
   */     
  this.debug = false;
  /*deb*/
  
  /**
   * Element videoboxu
   * @type object HTMLDivElement
   * @private
   */     
  this.el = null;
  
  /**
   * Index pole {@link menu#videos} urcujici vybranou polozku videoboxu.
   * Hodnota null znaci, ze neni nic vybrano (tedy vlastne je vybrano vychozi video).
   * @type int
   * @private
   */ 
  this.openIndex = null;
    
  //nalezeni elementu videoboxu, jinak konec
  if ((!p) || (typeof(p.id) != "string") ) return; 
  this.el = document.getElementById(p.id);
  if (this.el == null) return;
  if (this.el.tagName.toUpperCase() != "DIV") return;

  /**
   * Pole objektu popisujici vsechna videa ve videoboxu.
   * 
   * <pre>
   * Struktura objektu v poli:
   *    obj (object HTMLDivElement} 
   *         element popisu videa   
   *    sel {boolean}
   *          priznak vychoziho vybraneho videa            
   * </pre>
   * @type array
   * @private                      
   */
  this.videos = new Array();
  
  //prohledat videobox a najit vsechna videa
  for (var i=0; i<this.el.childNodes.length; i++)
  { 
    //najit div class="miniatury"
    if ( (this.el.childNodes[i].tagName == "DIV") && (this.getClass(this.el.childNodes[i]).toLowerCase() == "miniatury") )
    {
      //projit vsechny miniatury
      for (var j=0; j<this.el.childNodes[i].getElementsByTagName("DIV").length; j++)
      {

        this.videos.push( { 
          obj: this.el.childNodes[i].getElementsByTagName("DIV")[j],
          sel: ( (this.getClass(this.el.childNodes[i].getElementsByTagName("DIV")[j].getElementsByTagName("A")[0]) == "vybrany") ? true : false) 
        } );
        
      }
    }
  }
  
  //projit vsechna videa a pripadne navazat udalosti pro rozpohybovani
  for (var i=0; i<this.videos.length; i++)
  {
    /*deb*/
    this.deb( 
      this.videos[i].obj + " " +
      this.videos[i].sel );
    /*deb*/
      
    if (this.videos[i].sel) this.openIndex = i;   //nastavit index vybraneho videa na vychozi video
      
    events.addEventListener(this.videos[i].obj, "mouseover", this.show, this);  //zavesit udalosti
  }
}

//videobox je rozsirenim objektu cfn
videobox.prototype = new cfn;

/*deb*/
/**
 * Redefinice metody deb pro vypisovani debug zprav.
 *
 * @param {mixed} text Obsah poslany do debug okna 
 * @private
 */    
videobox.prototype.deb = function(text)
{
  if (this.debug)
  {
    //volej predka s prefixem
    cfn.prototype.deb.call(this, text, "videobox-> ");
  } 
}
/*deb*/


/**
 * Metoda zobrazi vybranou miniaturu jako hlavni video.
 *
 * @param {object event} e Udalostni objekt, ktery predava jadro obsluznym funkcim (ev. se ziskava jinak) 
 * @private
 */
videobox.prototype.show = function(e)
{  
  if (!e) var e = window.event;

  if (this.openIndex != null) this.hide(e); //pokud je neco otevreno, okamzite to zavri

  // najit vybrane video v poli this.videos
  for (var i=0; i<this.videos.length; i++)
  {     
    if ( ( (events.eventSource(e).tagName == "A") && (this.videos[i].obj == events.eventSource(e).parentNode) ) || 
         ( (events.eventSource(e).tagName == "IMG") && (this.videos[i].obj == events.eventSource(e).parentNode.parentNode) ) )
    {      
      this.addClass(this.videos[i].obj.getElementsByTagName("A")[0], "vybrany");    //prirazeni tridy zajisti zvyrazneni miniatury jako vybrane
 
      //nalezeni informaci o miniature a jejich prirazeni hlavnimu videu     
      for (j=0; j<this.el.getElementsByTagName("div").length; j++)
      {
        if (this.getClass(this.el.getElementsByTagName("div")[j]) == "text")
        {
          /*deb*/
          this.deb(
            "show " + 
            this.getText( this.videos[i].obj.getElementsByTagName("H4")[0] )
          );
          /*deb*/
          
          //nadpis videa
          this.changeText(
            this.el.getElementsByTagName("div")[j].getElementsByTagName("H4")[0], 
            this.getText( this.videos[i].obj.getElementsByTagName("H4")[0] )
          );
          
          //popis videa
          this.changeText(
            this.el.getElementsByTagName("div")[j].getElementsByTagName("P")[0], 
            this.getText( this.videos[i].obj.getElementsByTagName("P")[0] )
          );
          
          //link na videoclanek
          this.el.getElementsByTagName("A")[0].setAttribute(
            "href",
            this.videos[i].obj.getElementsByTagName("A")[0].getAttribute("href") 
          );
          
          //vytvoreni odkazu na velky obrazek videa
          var src = this.videos[i].obj.getElementsByTagName("IMG")[0].getAttribute("src");
          src = src.replace(/thumb/, "big");
          
          this.el.getElementsByTagName("IMG")[0].setAttribute("src", src);
          
        }
      }
      
      this.openIndex = i;   //aktualne vybrane video
      break;
    }
  }
    
  //zrusit dalsi probublavani udalosti
  e.cancelBubble = true;
  if (e.stopPropagation) e.stopPropagation();
}

/**
 * Metoda skryje vybrane video.
 *
 * @param {object event} e Udalostni objekt, ktery predava jadro obsluznym funkcim (ev. se ziskava jinak) 
 * @private
 */
videobox.prototype.hide = function(e)
{
  if (!e) var e = window.event;
 
  if (this.openIndex != null)
  {
    this.removeClass(this.videos[this.openIndex].obj.getElementsByTagName("A")[0], "vybrany");  //odstrani vyber miniatury
    
    /*deb*/
    this.deb(
      "hide " + 
      this.getText( this.videos[this.openIndex].obj.getElementsByTagName("H4")[0] )
    );
    /*deb*/
    
    this.openIndex = null; 
  }
}


/**
 * Objekt pro ovladani tabulatoru.
 * 
 * <p>Struktura vstupniho objektu:</p> 
 * <pre>
 *    id        - string - povinny
 *                - identifikator bloku ve kterem jsou definovany zalozky tabulatoru a jejich obsah
 *    tabclass  - string - nepovinny
 *                - trida odkazu definujici zalozku tabulatoru
 *                - pokud neni definovana, pouzije se "tab" 
 *    tabactive - string - nepovinny
 *                - trida odkazu (zalozky) definujici vybrany tabulator
 *                - pokud neni definovana, pouzije se "active"
 *    cntactive - string - nepovinny
 *                - trida definujici zobrazeny obsah vybraneho tabulatoru
 *                - pokud neni definovana, pouzije se "active" 
 *    tabsblock - string - nepovinny
 *                - element bloku, kde se hledaji odkazy definujici zalozky tabulatoru
 *                - pokud neni definovana, pouzije se element s identifikatorem ID (vyz vyse)
 * </pre>
 * 
 * <p>Typicka struktura bloku s definici tabulatoru:</p> 
 * <pre>
 *  &lt;div id="blok"&gt;
 *    &lt;a href="#id1" title="Link1"&gt;Link1&lt;/a&gt;
 *    &lt;a href="#id2" title="Link2"&gt;Link2&lt;/a&gt;
 *    &lt;div id="id1"&gt;
 *      content
 *    &lt;/div&gt;
 *    &lt;div id="id2"&gt;
 *      content
 *    &lt;/div&gt;
 *  &lt;/div&gt;
 * </pre>
 * <p>Zalozky tabulatoru se definuji odkazy (A) s tridou TAB. Obsah zalozek se 
 * definuje HTML blokovym elementem s identifikatorem ID. Tento identifikator je  
 * pak pouzit v odkazu definujici zalozku jako lokalni odkaz na navesti ID (#id).</p> 
 * 
 * <p>Poznamka: neni nutne mit definovany obsah pro tabulator. V pripade vyberu 
 * takoveho tabulatoru budou vsechny ostatni skryty.</p>
 * 
 * @example Typicke pouziti  
 *  var tabs0 = new tabs( {id: "nejnejnej"} ); 
 
 * @example Redefinovane pouziti
 *  var tabs1 = new tabs( {id: "nejnejnej", tabactive: "vybrano", cntactive: "vybrano"} );   
 *   
 * @class tabs - obsluha tabulatoru
 * @extends cfn
 * @version 1.2
 * @constructor
 * @requires events Udalosti  
 * @param {object} p Objekt vstupnich parametru
 */
function tabs(p)
{
  /*deb*/
  /**
   * Priznak vypisovani debug informaci. Je-li hodnota true, vypisuji se debug informace objektu.
   * @type boolean
   * @private      
   */     
  this.debug = false;
  /*deb*/
  
  /**
   * Element definice tabulatoru
   * @type object HTMLElement
   * @private
   */     
  this.el = null;
 
  /**
   * Index pole {@link tabs#tabs} urcujici aktualni vybranou polozku tabulatoru.
   * Hodnota null znaci, ze neni nic vybrano
   * @type int
   * @private
   */ 
  this.openIndex = null;
    
  //nalezeni elementu tabulatoru, jinak konec
  if ((!p) || (typeof(p.id) != "string") ) return; 
  this.el = document.getElementById(p.id);
  if (this.el == null) return;

  /**
   * Trida odkazu definujici zalozku tabulatoru.</br>
   * <i>Lze nastavit jine hodnoty pri inicializaci objektu vlastnosti tabclass vstupniho objektu.</i></br>
   * Vychozi hodnota: "tab"   
   * @type string
   * @private   
   */      
  this._tabClass = "tab";
  if ( (p.tabclass != null) && (typeof(p.tabclass) == "string") && (p.tabclass != "") )
  {
    this._tabClass = p.tabclass;
  }
  
  /**
   * Trida odkazu (zalozky) definujici vybrany tabulator.</br>
   * <i>Lze nastavit jine hodnoty pri inicializaci objektu vlastnosti tabactive vstupniho objektu.</i></br>
   * Vychozi hodnota: "active"   
   * @type string
   * @private
   */
  this._tabActive = "active";
  if ( (p.tabactive != null) && (typeof(p.tabactive) == "string") && (p.tabactive != "") )
  {
    this._tabActive = p.tabactive;
  }
  
  /**
   * Trida definujici zobrazeny obsah vybraneho tabulatoru.</br>
   * <i>Lze nastavit jine hodnoty pri inicializaci objektu vlastnosti cntactive vstupniho objektu.</i></br>
   * Vychozi hodnota: "active"   
   * @type string
   * @private
   */
  this._cntActive = "active";
  if ( (p.cntactive != null) && (typeof(p.cntactive) == "string") && (p.cntactive != "") )
  {
    this._cntActive = p.cntactive;
  }
  
  /**
   * Element bloku, kde se hledaji odkazy definujici zalozky tabulatoru.</br>
   * <i>Lze nastavit jine hodnoty pri inicializaci objektu vlastnosti tabsblock vstupniho objektu.</i>
   * @type string
   * @private
   */
  this._tabsBlock = this.el; 
  if ( (typeof(p.tabsblock) != "string") && (document.getElementById(p.tabsblock) != null) )
  {
    this._tabsBlock = document.getElementById(p.tabsblock);
  } 

  /**
   * Pole objektu popisujici vsechny nalezene zalozky tabulatoru.
   * 
   * <pre>
   * Struktura objektu v poli:
   *    obj (object HTMLAnchorElement} 
   *         element odkazu definujici zalozku   
   *    sel {boolean}
   *         priznak vybrane zalozky
   *    txt {string}
   *         text zalozky tabulatoru
   *    lnk {string}
   *         odkaz na obsah tabulatoru (propojovaci ID obsahu)
   *    cnt {object HTMLElement)
   *         element bloku s obsahem tabulatoru. Pokud je hodnota null, pak obsah zalozky nebyl nalezen                  
   * </pre>
   * @type array
   * @private   
   */
  this.tabs = new Array();
  
  var links = this._tabsBlock.getElementsByTagName("A");    //vsechny nalezene odkazy, ktere by mohly byt definici zalozek
  //prohledat blok a najit vsechny zalozky
  for (var i=0; i<links.length; i++)
  {
    if ( this.hasClass(links[i], this._tabClass) ) 
    {

      this.tabs.push( { 
        obj: links[i],
        sel: ( (this.hasClass(links[i], this._tabActive) ? true : false) ),
        txt: this.getText(links[i]),
        lnk: ( (links[i].hasAttribute("href")) ? links[i].getAttribute("href").replace(/#/, "") : null )
      } );
      
    }
  }
  
  if (this.tabs.length == 0) return;    //nejsou-li zadne tabulatory nalezeny, zrus celou akci
  
  //projit vsechny zalozky a dohledat obsahy
  for (var i=0; i<this.tabs.length; i++)
  {
    //najit obsah tabulatoru
    var content = document.getElementById(this.tabs[i].lnk);    
    if (content == undefined) content = null;
    
    this.tabs[i].cnt = content;   //priradit obsah tabulatoru do pole informaci
    
    if (this.tabs[i].sel) this.openIndex = i;   //zobrazit obsah vybraneho tabulatoru
    
    /*deb*/
    this.deb(
      i + " " +
      this.tabs[i].txt + " " +
      this.tabs[i].sel + " " + 
      this.tabs[i].lnk + " " +
      this.tabs[i].cnt
    );
    /*deb*/

    events.addEventListener(this.tabs[i].obj, "click", this.select, this);  //zavesit udalost
  }
  if (this.openIndex == null) this.openIndex = 0;   //neni-li zadny tabulator vybran, vyber ten prvni
  
  this.show();    //zobraz vychozi stav tabulatoru
  
  /*deb*/
  this.deb("openindex: " + this.openIndex);
  /*deb*/
}

//nej je rozsirenim objektu cfn
tabs.prototype = new cfn;

/*deb*/
/**
 * Redefinice metody deb pro vypisovani debug zprav.
 *
 * @param {mixed} text Obsah poslany do debug okna 
 * @private
 */    
tabs.prototype.deb = function(text)
{
  if (this.debug)
  {
    //volej predka s prefixem
    cfn.prototype.deb.call(this, text, "tabs-> ");
  } 
}
/*deb*/


/**
 * Metoda vybere aktualni zalozku. Vola se po kliknuti na zalozku.
 *
 * @param {object event} e Udalostni objekt, ktery predava jadro obsluznym funkcim (ev. se ziskava jinak) 
 * @private
 */
tabs.prototype.select = function(e)
{
  if (!e) var e = window.event;

  //najit vybranou zalozku v poli this.tabs
  for (var i=0; i<this.tabs.length; i++)
  {     
    if (events.eventSource(e) == this.tabs[i].obj)
    {      
      this.openIndex = i;   //aktualne vybrana zalozka
      break;
    }
  }
  
  this.show();  //zobrazit zmeneny stav zalozek
    
  //zrusit dalsi probublavani udalosti
  e.cancelBubble = true;
  if (e.stopPropagation) e.stopPropagation();
  e.returnValue = false;
}

/**
 * Metoda "prekresli" zalozky. Skryje vsechny tabulatory a jejich obsah, pote zobrazi jen aktualni.
 *
 * @private 
 */  
tabs.prototype.show = function()
{ 
  for (var i=0; i<this.tabs.length; i++)
  {
    //projit vsechny tabulatory, zrusit jim tridu active a nastavit ji u aktualne vybraneho tabulatoru
    this.removeClass(this.tabs[i].obj, this._tabActive);
    if (this.openIndex == i) this.addClass(this.tabs[i].obj, this._tabActive);
    
    //taktez zajistit u obsahu tabulatoru
    if (this.tabs[i].cnt != null)
    {
      this.removeClass(this.tabs[i].cnt, this._cntActive);
      if (this.openIndex == i) this.addClass(this.tabs[i].cnt, this._cntActive);  
    }
  } 
  
}


/**
 * Objekt pro ovladani obsahu bloku NEJ.
 * 
 * <p>Struktura vstupniho objektu:</p> 
 * <pre>
 *    id - string - povinny
 *       - identifikator bloku nejnejnej
 * </pre>
 * 
 * @example Typicke pouziti  
 *  var nejnovejsi = new nej( {id: "nejnovejsi"} );  
 *   
 * @class nej - obsluha obsahu nej bloku
 * @extends cfn
 * @version 1.2
 * @constructor
 * @requires events Udalosti  
 * @param {object} p Objekt vstupnich parametru
 */
function nej(p)
{
  /*deb*/
  /**
   * Priznak vypisovani debug informaci. Je-li hodnota true, vypisuji se debug informace objektu.
   * @type boolean
   * @private      
   */     
  this.debug = false;
  /*deb*/
  
  /**
   * Element definice tabulatoru
   * @type object HTMLDivElement
   * @private
   */     
  this.el = null;
 
  /**
   * Index pole {@link nej#links} urcujici aktualni vybrany odkaz
   * Hodnota null znaci, ze neni nic vybrano
   * @type int
   * @private
   */ 
  this.openIndex = null;
    
  //nalezeni elementu tabulatoru, jinak konec
  if ((!p) || (typeof(p.id) != "string") ) return; 
  this.el = document.getElementById(p.id);
  if (this.el == null) return;

  /**
   * Trida definujici vybrany odkaz.</br>
   * <i>Lze nastavit jine hodnoty pri inicializaci objektu vlastnosti active vstupniho objektu.</i></br>
   * Vychozi hodnota: "vybrano"
   * @type string
   * @private
   */
  this._active = "vybrano";
  if ( (p.active != null) && (typeof(p.active) == "string") && (p.active != "") )
  {
    this._active = p.active;
  }
  
  /**
   * Pole objektu popisujici vsechny linky clanku (LI).
   * @type array of HTMLLIElement
   * @private
   */
  this.links = new Array();
  
  this.links = this.el.getElementsByTagName("LI");  //vsechny v bloku linky
  if (this.links.length == 0) return;    //nejsou-li zadne linky nalezeny, zrus celou akci
  
  //najdi vychozi polozku
  for (var i=0; i<this.links.length; i++)
  {
    if (this.hasClass(this.links[i], this._active))
    {
      this.openIndex = i;
    }
    
    var link = this.getLink(i);   //najdi odkaz z linku
    if ( (link != null) && (typeof(link.title) != "undefined") && (link.title != "") )
    {
      this.links[i].title = link.title;   //zkopiruj popis odkazu na cely link clanku
    }
    
    //zavesit udalosti
    events.addEventListener(this.links[i], "mouseover", this.select, this);
    events.addEventListener(this.links[i], "click", this.click, this);
  }

  if (this.openIndex == null) this.openIndex = 0;   //neni-li zadny link vybran, vyber ten prvni
  
  this.show();    //zobraz vychozi stav tabulatoru
  
  /*deb*/
  this.deb(this.links.length);
  this.deb("openindex: " + this.openIndex);
  /*deb*/
}

//nej je rozsirenim objektu cfn
nej.prototype = new cfn;

/*deb*/
/**
 * Redefinice metody deb pro vypisovani debug zprav.
 *
 * @param {mixed} text Obsah poslany do debug okna 
 * @private
 */    
nej.prototype.deb = function(text)
{
  if (this.debug)
  {
    //volej predka s prefixem
    cfn.prototype.deb.call(this, text, "nej-> ");
  } 
}
/*deb*/


/**
 * Metoda vybere aktualni clanek. Vola se po najeti mysi na nadpis.
 *
 * @param {object event} e Udalostni objekt, ktery predava jadro obsluznym funkcim (ev. se ziskava jinak) 
 * @private
 */
nej.prototype.select = function(e)
{
  if (!e) var e = window.event;

  var oldIndex = this.openIndex;    //ulozit si stavajici index
  
  this.getIndex(e);
  
  if (this.openIndex == oldIndex) return;   //uz je to otevrena polozka, neresit to
  
  /*deb*/
  this.deb("select " + this.openIndex);
  /*deb*/
  
  this.show();  //zobrazit zmeneny stav linku
    
  //zrusit dalsi probublavani udalosti
  e.cancelBubble = true;
  if (e.stopPropagation) e.stopPropagation();
  e.returnValue = false;
}

/**
 * Metoda vybere aktualni clanek. Vola se po kliknuti na clanek (kamkoliv - obrazek, text, link...).
 *
 * @param {object event} e Udalostni objekt, ktery predava jadro obsluznym funkcim (ev. se ziskava jinak) 
 * @private
 */
nej.prototype.click = function(e)
{
  if (!e) var e = window.event;

  this.getIndex(e);
  
  var link = this.getLink(this.openIndex);
  if (link == null)
  {
    return;   //nenalezen odkaz, skonci
  }
  link = link.href;    //ziskat odkaz clanku
  
  /*deb*/
  this.deb("click " + this.openIndex + " " + link);
  /*deb*/
  
  window.location = link;   //prejit na clanek
    
  //zrusit dalsi probublavani udalosti
  e.cancelBubble = true;
  if (e.stopPropagation) e.stopPropagation();
  e.returnValue = false;
}

/**
 * Metoda "prekresli" zobrazeni linku. Skryje vsechny clanky a jejich obsah, pote zobrazi jen aktualni.
 *  
 * @private 
 */  
nej.prototype.show = function()
{ 
  for (var i=0; i<this.links.length; i++)
  {
    //projit vsechny tabulatory, zrusit jim tridu active a nastavit ji u aktualne vybraneho tabulatoru
    this.removeClass(this.links[i], this._active);
    if (this.openIndex == i) this.addClass(this.links[i], this._active);
  } 
  
}

/**
 * Metoda najde odkaz na clanek v linku. Hleda v poli linku {@link nej#links} polozku s indexem index.
 *
 * @param {int} index Index do pole links, kde je ulozen hledany clanek
 * @return {string} Nalezeny odkaz clanku nebo hodnotu null  
 * @type {string} 
 * @private
 */
nej.prototype.getLink = function(index)
{
  var link = this.links[index].getElementsByTagName("A");
  if (link.length == 0)
  {
    return null;   //nenalezen odkaz, skonci
  }
  return link[0];   //prvni odkaz
}

/**
 * Metoda najde odkaz, ve kterem byla generovana udalost s udalostnim objektem e a nastavi lokalni vlastnost {@link nej#openIndex} na ukazatel na tento clanek.
 *
 * @param {object event} e Udalostni objekt, ktery predava jadro obsluznym funkcim (ev. se ziskava jinak)  
 * @private
 */
nej.prototype.getIndex = function(e)
{
  var s = events.eventSource(e);
  while (s.tagName != "LI")
  {
    s = s.parentNode;   //najit root clanku
  }

  //najit vybranou zalozku v poli this.links
  for (var i=0; i<this.links.length; i++)
  {     
    if (s == this.links[i])
    {      
      this.openIndex = i;   //aktualne vybrana zalozka
      break;
    }
  }
}
