  /**
   *  fScript JS Library Module - fTabs
   *  ------------------------------------------------------------------------
   *  @copyright Copyright (c) 2009 fCMS Development Team
   *  @author Arne Blankerts <theseer@fcms.de>
   *  
   *  @version $Id: ftabs.fscript.js,v 1.4 2009/01/19 18:36:55 theseer Exp $
   *
   *  Usage sample:
   *       
   *       var foo=new fTabs('tabsContainer');
   *       foo.setEventType('click');
   *       foo.setTabClasses('tab_active','tab_inactive');
   *       foo.setPanelClasses('panel_active','panel_inactive');
   *       foo.init('defaultTab');
   *  
   */

   /*
    * fTabs class
    */  
   function fTabs(id) {
      this.id = id;
      this.container = document.getElementById(id);
      if (!this.container) {
         throw 'Element with id "'+id+'" not found';
      }
   }
   
   fTabs.prototype = {
      
      id: null,
      container: null,
      
      tabPanels: {},
      
      eventType: 'click',
            
      tabClasses:   { active:'', inactive:''},
      panelClasses: { active:'', inactive:''},
      
      selectedPanel: null,
      firstPanel: null,
      
      init: function(asDefault) {
         this.registerTabs();
         for (var x in this.tabPanels) {
            if (x==asDefault) { // active
               continue;
            }
            this._hideTab(x);
         }         
         this._showTab(asDefault ? asDefault : this.firstPanel);
      },
      
      setEventType: function(type) {
         if (type!='click' && type!='mouseover') {
            throw 'Unsupported event type:'+type;
         } 
         this.eventType = type;
      },
      
      setTabClasses: function(active,inactive) {
         this.tabClasses.active   = active;
         this.tabClasses.inactive = inactive;
      },
      
      setPanelClasses: function(active,inactive) {
         this.panelClasses.active   = active;
         this.panelClasses.inactive = inactive;
      },
      
      registerTabs: function() {
         var myself = this;
         var tabs = this.container.getElementsByTagName('A');
         if (tabs.length == 0) {
            throw 'Container does not seem to have any links';
         }
         
         for(var x=0; x<tabs.length; x++) {
            var a=tabs[x];
            var link=a.href.replace(window.location.href.split('#')[0],'');
            if (link.substr(0,1)=='#') {
               var id=link.substr(1);
               var panel=document.getElementById(id);
               if (!panel) {
                  throw 'Element with id "'+id+'" not found';
               }
               this.tabPanels[id] = {panel:panel, tab:a.parentNode};
               
               if (!this.firstPanel) this.firstPanel = id;
               
               fScript.registerEvent(this.eventType, function(evt, id){
                  myself._toggleTab(id); return false;
                  }, a, id);
               if (this.eventType == 'mouseover') {
                  fScript.registerEvent('click', function(e){return false;}, a);                  
               }
            } 
         }
      },
      
      _toggleTab: function(id) {
          this._hideTab(this.selectedPanel);
          this._showTab(id);
      },
      
      _hideTab: function(id) {
         //dump('hiding tab:'+id+'\n');
         if (this.tabClasses.inactive) {
            this.tabPanels[id].tab.className = this.tabClasses.inactive;
         }
         if (this.panelClasses.inactive) {
            this.tabPanels[id].panel.className = this.panelClasses.inactive;
         } else {
            this.tabPanels[id].panel.style.display = 'none';
         }
      },
      
      _showTab: function(id) {
         if (this.tabClasses.active) {
            this.tabPanels[id].tab.className = this.tabClasses.active;
         }
         if (this.panelClasses.active) {
            this.tabPanels[id].panel.className = this.panelClasses.active;
         } else {
            this.tabPanels[id].panel.style.display = 'block';
         }
         this.selectedPanel = id;
      }      
   }
   
   function fMultiTabs() {}
   fMultiTabs.prototype={

      instances: {},
      
      eventType: 'click',
            
      tabClasses:   { active:'', inactive:''},
      panelClasses: { active:'', inactive:''},
      
      setEventType: function(type) {
         if (type!='click' && type!='mouseover') {
            throw 'Unsupported event type:'+type;
         } 
         this.eventType = type;
      },
      
      setTabClasses: function(active, inactive) {
         this.tabClasses.active   = active;
         this.tabClasses.inactive = inactive;
      },
      
      setPanelClasses: function(active, inactive) {
         this.panelClasses.active   = active;
         this.panelClasses.inactive = inactive;
      },
      
      findByClassName: function(className, root) {
         if (!root) {
            root = document.getElementsByTagName('BODY')[0];            
         }
         var list=fScript.getElementsByClassName(className, root);
         if (list.length==0) {
            return false;
         }
                  
         for(var x=0; x<list.length; x++) {
            if (list[x].id!='') {
               this.addContainer(list[x].id);
            }
         }
         return true;
      },
      
      addContainer: function(id) {
         this.instances[id] = new fTabs(id);
         this.instances[id].setEventType(this.eventType);               
         this.instances[id].setPanelClasses(this.panelClasses.active, this.panelClasses.inactive);
         this.instances[id].setTabClasses(this.tabClasses.active, this.tabClasses.inactive);
         this.instances[id].init();
         return this.instances[id]; 
      },
      
      getInstanceFor: function(id) {
         return this.instances[id];  
      }
   }

