/**
 * SM_TabPane.js
 *
 * Javascriptovy panel zalozek.
 * - vyuziva jQuery, verze od 1.3.2
 *
 * @author Ing. Ondrej Dvoracek
 * @copy Symedia s. r. o. 2009
 */

/**
 * Trida realizujici panel zalozek
 */
var SM_TabPane = {};

/**
 * Pole skupin panelu zalozek.
 */
SM_TabPane.tabGroups = new Array();

/**
 * Funkce pro pridani zalozky do urcite skupiny zalozek.
 * @param group Retezec identifikujici skupinu zalozek.
 * @param tab Objekt SM_Tab s informacemi o zalozce.
 * @return Vraci true pokud pridani zalozky probehlo v poradku, jinak false.
 */
SM_TabPane.addTab = function(group, tab)
{
  if(tab != 'undefined' && typeof tab == 'object' && tab.tabId && tab.tabId != null)
  {
    if(group && group != '')
    {
      // Kontrola existence skupiny
      if(SM_TabPane.tabGroups[group] == 'undefined' || SM_TabPane.tabGroups[group] == null)
      {
         SM_TabPane.tabGroups[group] = new Array();
      }
      
      // Kontrola existence zalozky
      if(SM_TabPane.tabGroups[group][tab.tabId] == 'undefined' || SM_TabPane.tabGroups[group][tab.tabId] == null)
      {
        SM_TabPane.tabGroups[group][tab.tabId] = tab;

        // Nastaveni udalosti pro klik na hlavicku
        if(tab.headerId != null && tab.headerElem != null)
        {
          tab.headerElem.tabId = tab.tabId;
          tab.headerElem.tabGroup = group;
          tab.headerElem.onclick = function()
                                   {
                                     SM_TabPane.selectTab(this.tabGroup, this.tabId);
                                   };
        }
      }
      else
      {
        return false;
      }
    }
    else
    {
      return false;
    }
  }
  else
  {
    return false;
  }
  
  return true;
} // addTab()

/**
 * Funkce pro vybrani zadane zalozky.
 * @param group Retezec identifikujici skupinu zalozek.
 * @param tabId ID HTML elementu, ktery je bran jako zalozka a ma byt vybran.
 * @return Vraci true, pokud vyber zalozky probehl v poradku.
 */
SM_TabPane.selectTab = function(group, tabId)
{
  if(SM_TabPane.tabGroups[group] == 'undefined' || SM_TabPane.tabGroups[group] == null)
    return false;

  var tabs = SM_TabPane.tabGroups[group];
  var tab = null;

  // Zneaktivneni vybranych zalozek
  var tabSelected = false;

  for(tId in tabs)
  {
    tab = tabs[tId];

    if(tab != 'undefined' && typeof tab == 'object' && tab.tabId != null)
    {
      if(tab.tabId == tabId && tab.selected == true) // zalozka, ktera se ma vybrat je jiz vybrana
      {
        tabSelected = true;
      }
      else
      {
        if(tab.selected == true) // pokud je zalozka vybrana, zrusi se jeji vyber
        {
          SM_TabPane.deselectTab(group, tab.tabId);
        }
      }
    }
  }

  if(tabSelected == false)
  {
    tab = SM_TabPane.tabGroups[group][tabId];
    if(tab != 'undefined' && typeof tab == 'object' && tab.tabId != null && tab.selected == false)
    {
      if(tab.showType == 'toggle')
      {
        if(tab.tabClassSelected != null && tab.tabClassSelected != '')
          tab.tabElem.className = tab.tabClassSelected;
        else
          $("#"+tab.tabId).show();
      }
      if(tab.showType == 'fade')
      {
        $("#"+tab.tabId).fadeIn(tab.showDelay);
      }
      if(tab.showType == 'slide')
      {
        $("#"+tab.tabId).slideDown(tab.showDelay);
      }

      if(tab.headerElem != null)
      {
        if(tab.headerClassSelected != null && tab.headerClassSelected != '')
          tab.headerElem.className = tab.headerClassSelected;
      }

      SM_TabPane.tabGroups[group][tab.tabId].selected = true;

      // Nakonec provedeni callback funkce
      if(tab.onSelect != null && (typeof tab.onSelect == 'function' || typeof tab.onSelect == 'object'))
      {
        tab.onSelect(tab.tabId);
      }

      // Zacatek casovani dalsi zalozky
      if(tab.tabElem.tabSwitchPeriod > 0)
        SM_TabPane.switchCycle(group);
    }
  }

  return true;
} // selectTab

/**
 * Funkce pro zruseni vyberu zadane zalozky.
 * @param group Retezec identifikujici skupinu zalozek.
 * @param tabId ID HTML elementu, ktery je bran jako zalozka a jeji vyber ma byt zrusen.
 * @return Vraci true, pokud zruseni vyberu zalozky probehlo v poradku.
 */
SM_TabPane.deselectTab = function(group, tabId)
{
  if(SM_TabPane.tabGroups[group] == 'undefined' || SM_TabPane.tabGroups[group] == null)
    return false;

  var tab = SM_TabPane.tabGroups[group][tabId];
  if(tab != 'undefined' && typeof tab == 'object' && tab.tabId != null && tab.selected == true)
  {
    // Zruseni vyberu zalozky
    if(tab.tabElem != null)
    {
      // Inicializace promennych automatickeho prepinani
      if(tab.tabElem.tabSwitchTimeout)
        window.clearTimeout(tab.tabElem.tabSwitchTimeout);

      if(tab.tabElem.tabSwitchActualTime)
        tab.tabElem.tabSwitchActualTime = 0;

      if(tab.tabElem.tabSwitchPause)
        tab.tabElem.tabSwitchPause = false;

      if(tab.showType == 'toggle')
      {
        if(tab.tabClass != null && tab.tabClass != '')
          tab.tabElem.className = tab.tabClass;
        else
          $("#"+tab.tabId).hide();
      }
      if(tab.showType == 'fade')
      {
        $("#"+tab.tabId).hide(); //fadeOut(tab.showDelay);
      }
      if(tab.showType == 'slide')
      {
        $("#"+tab.tabId).hide(); //slideUp(tab.showDelay);
      }
    }

    if(tab.headerElem != null)
    {
      if(tab.headerClass != null && tab.headerClass != '')
        tab.headerElem.className = tab.headerClass;
    }

    SM_TabPane.tabGroups[group][tab.tabId].selected = false;

    // Nakonec provedeni callback funkce
    if(tab.onDeselect != null && (typeof tab.onDeselect == 'function' || typeof tab.onDeselect == 'object'))
    {
      tab.onDeselect(tab.tabId);
    }
  }
  else
  {
    return false;
  }

  return true;
} // deselectTab

/**
 * Funkce pro nastaveni automatickeho prepinani zalozek v ramci skupiny.
 * Po najeti na telo zalozky se perioda prepnuti pozastavi.
 * @param group Retezec identifikujici skupinu zalozek.
 * @param period Casova perioda v sekundach, po ktere ma dojit ke zmene zalozek.
 * @return Vraci true, pokud nastaveni automatickeho prepinani probehlo v poradku, jinak false.
 */
SM_TabPane.autoSwitchTabs = function(group, period)
{
  if(SM_TabPane.tabGroups[group] == 'undefined' || SM_TabPane.tabGroups[group] == null)
    return false;

  var p = parseInt(period);
  if(p <= 0)
    return false;

  var tabs = SM_TabPane.tabGroups[group];
  var tab = null;

  for(tId in tabs)
  {
    tab = tabs[tId];

    if(tab != 'undefined' && typeof tab == 'object' && tab.tabId != null && tab.tabElem != null)
    {
      tab.tabElem.tabSwitchPeriod = p*1000;
      tab.tabElem.tabSwitchActualTime = 0;
      tab.tabElem.tabSwitchPause = false;
      tab.tabElem.tabSwitchTimeout = null;
      tab.tabElem.onmouseover = function()
                                {
                                  this.tabSwitchPause = true;
                                  window.clearTimeout(this.tabSwitchTimeout);
                                };
      tab.tabElem.onmouseout = function()
                               {

                                 this.tabSwitchPause = false;
                                 window.clearTimeout(this.tabSwitchTimeout);
                                 this.tabSwitchTimeout = window.setTimeout("SM_TabPane.switchCycle(\'"+group+"\')", 500);
                               };
    }
  }
  
  // Zacatek prepinani
  SM_TabPane.switchCycle(group);

  return true;
} // autoSwitchTabs()

/**
 * Periodicka funkce pro automaticke prepinani zalozek.
 *
 */
SM_TabPane.switchCycle = function(group)
{
  if(SM_TabPane.tabGroups[group] == 'undefined' || SM_TabPane.tabGroups[group] == null)
    return false;

  var tabs = SM_TabPane.tabGroups[group];
  var tab = null;
  var i = 0;
  var nextTab = null;
  var selectNext = false;
  var selectedTab = null;

  for(tId in tabs)
  {
    tab = tabs[tId];

    if(tab != 'undefined' && typeof tab == 'object' && tab.tabId != null && tab.tabElem != null)
    {
      if((i == 0 || selectNext == true) && tab.selected == false)
      {
        nextTab = tab;
        selectNext = false;
      }

      if(tab.selected == true)
      {
        selectNext = true;
        selectedTab = tab;
      }

      i = i + 1;
    }
  }

  if(selectedTab != null && selectedTab.tabElem != null)
  {
    var elem = selectedTab.tabElem;

    if(elem.tabSwitchPause != true)
    {
      if(elem.tabSwitchActualTime >= elem.tabSwitchPeriod)
      {
        // Prepnout na dalsi zalozku
        if(nextTab != null)
        {
          SM_TabPane.selectTab(group, nextTab.tabId);
        }
      }
      else
      {
        elem.tabSwitchActualTime = elem.tabSwitchActualTime + 500;
        elem.tabSwitchTimeout = window.setTimeout("SM_TabPane.switchCycle(\'"+group+"\')", 500);
      }
    }
  }

  return true;
} // switchCycle

/**
 * Trida pro jednu zalozku.
 * @param tId ID HTML elementu, ktery je bran jako zalozka.
 * @param hId ID HTML elementu, ktery je bran jako hlavicka zalozky.
 * @param opt Asociovane pole dalsich vlastnosti panelu:
 *              tabClassSelected     ... trida stylu, ktera ma byt nastavena panelu pri jeho zaktivneni
 *              headerClass          ... trida stylu neaktivni hlavicky zalozky
 *              headerClassSelected  ... trida stylu aktivni hlavicky zalozky
 *              showType             ... zpusob, jakym ma dojit k prepnuti zalozky, hodnoty: fade, slide, toggle
 *              showDelay            ... delka (ms) jak dlouho ma trvat prepnuti, plati poze pro typ fade a slide
 *              onSelect             ... callback funkce provedena pri vybrani zalozky
 *              onDeselect           ... callback funkce provedena pri zruseni vyberu zalozky
 */
function SM_Tab(tId, hId, opt)
{ 
  this.tabId = null;
  this.tabElem = null;
  this.headerId = null;
  this.headerElem = null;
  this.selected = false;
  this.tabClass = null;
  this.tabClassSelected = null;
  this.headerClass = null;
  this.headerClassSelected = null;
  this.showType = 'toggle';
  this.showDelay = 100;
  this.onSelect = null;
  this.onDeselect = null;

  var elem = null;

  // Kontrola a nastaveni id zalozky
  if(document &&  document.getElementById && tId != '')
  {
    elem = document.getElementById(tId);
  }

  if(elem != null)
  {
    this.tabId = tId;
    this.tabElem = elem;
    this.tabClass = (elem.className != '') ? elem.className : null;
  }

  // Kontrola a nastaveni id hlavicky zalozky
  elem = null;
  if(document &&  document.getElementById && hId != '')
    elem = document.getElementById(hId);

  if(elem != null)
  {
    this.headerId = hId;
    this.headerElem = elem;
    this.headerClass = (elem.className != '') ? elem.className : null;
  }

  // Nastaveni dalsich vlastnosti panelu
  if(opt)
  {
    // Nastaveni tridy stylu NEvybrane zalozky
    if(opt.tabClass && opt.tabClass != '')
    {
      this.tabClass = opt.tabClass;
    }

    // Nastaveni tridy stylu vybrane zalozky
    if(opt.tabClassSelected && opt.tabClassSelected != '')
    {
      this.tabClassSelected = opt.tabClassSelected;
    }

    // Nastaveni tridy stylu hlavicky NEvybrane zalozky
    if(opt.headerClass && opt.headerClass != '')
    {
      this.headerClass = opt.headerClass;
    }

    // Nastaveni tridy stylu hlavicky vybrane zalozky
    if(opt.headerClassSelected && opt.headerClassSelected != '')
    {
      this.headerClassSelected = opt.headerClassSelected;
    }

    // Nastaveni zpusobu prepnuti zalozky
    if(opt.showType && opt.showType != '')
    {
      switch(opt.showType)
      {
        case 'fade':
          // Nastaveni delky prepnuti
          if(opt.showDelay && parseInt(opt.showDelay) > 0)
          {
            this.showDelay = parseInt(opt.showDelay);
          }
          this.showType = 'fade';
          break;
        case 'slide':
          // Nastveni delky prepnuti
          if(opt.showDelay && parseInt(opt.showDelay) > 0)
          {
            this.showDelay = parseInt(opt.showDelay);
          }
          this.showType = 'slide';
          break;
        case 'toggle':
        default:
          break;
      }
    }

    // Nastaveni callback funkce po vyberu zalozky
    if(opt.onSelect && (typeof opt.onSelect == 'function' || typeof opt.onSelect == 'object'))
    {
      this.onSelect = opt.onSelect;
    }

    // Nastaveni callback funkce po zruseni vyberu zalozky
    if(opt.onDeselect && (typeof opt.onDeselect == 'function' || typeof opt.onDeselect == 'object'))
    {
      this.onDeselect = opt.onDeselect;
    }
  }
} // SM_Tab

// SM_TabPane.js