/*
Foundation.TabControl
Copyright © 2005-2010 Scott Nesin, all rights reserved.
Documentation: http://FoundationDotJS.org/Foundation.TabControl.htm
*/
/*
   ***** Preprocessed code, any modifications will be lost. *****
     Foundation.js, object oriented JavaScript framework:
     http://FoundationDotJS.org/
     Preprocessed for speed:
     http://FoundationDotJS.org/Foundation.Preprocessor.htm
*/
Foundation.TabControl=function()
{
   Foundation.Control.apply(this,arguments);
   this.tabs=new Array();
   this.nextUid=0;
   var tabs=this.resource("tabs");
   if (tabs.length>0)
   {
      for (var i=0;i<tabs.length;i++)
         this.pushTab(tabs[i]);
      this._setBegun=false;
      this.bringInitialTabToFront();
   }
};
Foundation.TabControl.$parentClass=Foundation.Control;
if (!Foundation.Control.$childClasses) Foundation.Control.$childClasses=new Array();
Foundation.Control.$childClasses.push(Foundation.TabControl);
Foundation.TabControl.$constructor=Foundation.Control.$constructor ? Foundation.Control.$constructor : function(){};
Foundation.TabControl.$interfaces=new Array();
Foundation.TabControl.$name="TabControl";
Foundation.TabControl.$childClasses=new Array();
Foundation.TabControl.$container=Foundation;
Foundation.TabControl.prototype={
   constructor:Foundation.TabControl,   
   beginNewTab:function(id,titleHtml,tabClass)
   {
      return this.beginNewTabClass(tabClass,{id:id,titleHtml:titleHtml});
   },   
   beginNewTabClass:function(tabClass,resourcePack)
   {
      var tab=new (tabClass ? tabClass : this.resource("tabClass"))(resourcePack,this);
      this.tabs.push(tab);
      var htmlBuilder=new Foundation.StringBuilder();
      if (!this._setBegun)
      {
         this.appendOpenHtml(htmlBuilder);
         this._setBegun=true;
      }
      else
         this.appendTabCloseHtml(htmlBuilder);
      this.appendTabOpenHtml(htmlBuilder,tab);
      tab.appendBodyHtml(htmlBuilder);
      document.write(htmlBuilder.toString());
      return tab;
   },   
   close:function(id,titleHtml)
   {
      var htmlBuilder=new Foundation.StringBuilder();
      this.appendTabCloseHtml(htmlBuilder);
      this.appendCloseHtml(htmlBuilder);
      document.write(htmlBuilder.toString());
      this._setBegun=false;
      this.updateTitles();
      this.bringInitialTabToFront();
   },   
   updateTitles:function(doNotTryAgain)
   {
      try
      {
         this.getElement("titleContainer").innerHTML=this.appendTitlesHtml(new Foundation.StringBuilder()).toString();
      }
      catch(e)
      {
         if (!doNotTryAgain)
            window.setTimeout(this.event("updateTitles(true)"),500);
      }
   },   
   bringInitialTabToFront:function()
   {
      var tab;
      if (!this.getFrontTab() &&
          ((this.resource("tiedToUrlHash") &&
            document.location.hash.length>1 &&
            (tab=this.findTabById(document.location.hash.substr(1)))) ||
           (tab=this.findDefaultTab()) ||
           (this.tabs.length>0 &&
            (tab=this.tabs[0]))))
      {
         this.bringTabToFront(tab,null,false,true);
         return tab;
      }
      return null;
         
   },   
   getNextUid:function()
   {
      return this.nextUid++;
   },   
   getTabButtonHtml:function(id,title)
   {
      return this.resource("buttonHtml"
                           ,'t',title ? title.htmlEncode() : this.findTabById(id).resource("titleHtml")
                           ,'c',this.event("findTabById(\""+id.cEncode()+"\").bringToFront(event,true)").htmlEncode()
                          );
   },   
   writeTabButton:function(id,title)
   {
      document.write(this.getTabButtonHtml(id,title));
   },   
   getInnerHtml:function(preBind)
   {
      return this.appendHtml(new Foundation.StringBuilder()).toString();
   },   
   findTabById:function(id)
   {
      for (var i=0;i<this.tabs.length;i++)
         if (this.tabs[i].id==id)
            return this.tabs[i];
      return null;
   },   
   findDefaultTab:function()
   {
      for (var i=0;i<this.tabs.length;i++)
         if (this.tabs[i].isDefault())
            return this.tabs[i];
      return null;
   },   
   getFrontTab:function()
   {
      for (var i=0;i<this.tabs.length;i++)
         if (this.tabs[i].isInFront)
            return this.tabs[i];
      return null;
   },   
   getColoredBorder:function(border,background)
   {
      border=border.split(" ");
      if (border.length==3)
         border[2]=background;
      return border.join(" ");
   },   
   extractColorFromStyle:function(style)
   {
      if (style.search(/(^|;)\s*color\s*:\s*([^;]+)\s*(;|$)/i)>=0)
         return RegExp.$2;
      return "";
   },   
   appendHtml:function(htmlBuilder)
   {
      this.appendOpenHtml(htmlBuilder);
      for (var i=0;i<this.tabs.length;i++)
         this.appendTabHtml(htmlBuilder,this.tabs[i])
      this.appendCloseHtml(htmlBuilder,false);
      return htmlBuilder;
   },   
   appendOpenHtml:function(htmlBuilder)
   {
      var frontTab=this.getFrontTab();
      var cBackground=frontTab ? frontTab.resourceEx("frontBackgroundColor") : "";
      var cBorder=frontTab ? frontTab.resourceEx("frontBorder") : "";
      htmlBuilder.append("<table cellspacing=0 cellpadding=0 border=0 width=\""+this.resource("width")+"\"><tr><td id=\""+this.elementId("titleContainer")+"\">");
      this.appendTitlesHtml(htmlBuilder);
      htmlBuilder.append("</td></tr>");
      htmlBuilder.append("<tr><td id=\""+this.elementId("content")+"\" style=\"background-color:"+cBackground+";border-bottom:"+cBorder+";border-right:"+cBorder+";border-left:"+cBorder+";"+this.resource("containerStyle")+"\">");
      return htmlBuilder;
   },   
   appendTitlesHtml:function(htmlBuilder)
   {
      var frontTab=this.getFrontTab();
      var cBorder=frontTab ? frontTab.resourceEx("frontBorder") : "";
      htmlBuilder.append("<table id=\""+this.elementId("tabs")+"\" cellspacing=0 cellpadding=0 border=0 width=\"100%\" style=\"cursor:default;\"><tr>");
      for (var i=0;i<this.tabs.length;i++)
      {
         var tab=this.tabs[i];
         var background=tab.resourceEx(tab.isInFront ? "frontBackgroundColor" : "backBackgroundColor");
         var border=tab.resourceEx(tab.isInFront ? "frontBorder" : "backBorder");
         var style=tab.resourceEx(tab.isInFront ? "frontTitleStyle" : "backTitleStyle");
         htmlBuilder.append("<td style=\"border-bottom:"+cBorder+";\">&nbsp;&nbsp;</td>");
         htmlBuilder.append("<td id=\""+this.elementId("title_"+tab.uid)+"\" "+tab.resourceEx("titleNoWrap")+" onclick=\""+tab.event("bringToFront(event)")+"\" style=\"background-color:"+background+";border-left:"+border+";border-top:"+border+";border-right:"+border+";border-bottom:"+(tab.isInFront ? this.getColoredBorder(border,background) : cBorder)+";"+style+"\">");
         tab.appendTitleHtml(htmlBuilder);
         htmlBuilder.append("</td>");
      }
      htmlBuilder.append("<td style=\"border-bottom:"+cBorder+";\" width=\"100%\">&nbsp;</td></tr></table>");
      return htmlBuilder;
   },   
   appendTabHtml:function(htmlBuilder,tab)
   {
      this.appendTabOpenHtml(htmlBuilder,tab);
      tab.appendBodyHtml(htmlBuilder);
      this.appendTabCloseHtml(htmlBuilder);
      return htmlBuilder;
   },   
   appendTabOpenHtml:function(htmlBuilder,tab)
   {
      htmlBuilder.append("<div id=\""+tab.elementId("body")+"\" style=\"display:"+(tab.isInFront ? "block" : "none")+"\">");
      return htmlBuilder;
   },   
   appendTabCloseHtml:function(htmlBuilder)
   {
      htmlBuilder.append("</div>");
      return htmlBuilder;
   },   
   appendCloseHtml:function(htmlBuilder)
   {
      htmlBuilder.append("</td></tr></table>");
      return htmlBuilder;
   },   
   bringTabToFront:function(tab,event,bringTitleIntoView,skipHash)
   {
      if (typeof(tab)=="string")
         tab=this.findTabById(tab);
      if (!tab || tab.isInFront)
         return;
      var old=this.getFrontTab();
      if (old)
      {
         old.isInFront=false;
         if (old.onToBack)
            old.onToBack(event);
      }
      tab.isInFront=true;
      if (!skipHash && this.resource("tiedToUrlHash") && tab.id!=null)
         window.location.replace("#"+tab.id.urlEncode());
      var e=old ? old.getElement("body") : null;
      if (e)
      {
         var bBackground=old.resourceEx("backBackgroundColor");
         var bBorder=old.resourceEx("backBorder");
         var bStyle=old.resourceEx("backTitleStyle");
         e.style.display="none";
         e=this.getElement("title_"+old.uid);
         e.style.cssText=bStyle;
         e.style.backgroundColor=bBackground;
         e.style.borderLeft=e.style.borderTop=e.style.borderRight=bBorder;
      }
      e=this.getElement("tabs");
      if (e)
      {
         var fBackground=tab.resourceEx("frontBackgroundColor");
         var fBorder=tab.resourceEx("frontBorder");
         var fStyle=tab.resourceEx("frontTitleStyle");
         e=e.rows[0];
         for (var i=0;i<e.cells.length;i++)
            e.cells[i].style.borderBottom=fBorder;
         e=this.getElement("title_"+tab.uid);
         e.style.cssText=fStyle;
         e.style.backgroundColor=fBackground;
         e.style.borderLeft=e.style.borderTop=e.style.borderRight=fBorder;
         e.style.borderBottom=this.getColoredBorder(fBorder,fBackground);
         e=this.getElement("content");
         e.style.backgroundColor=fBackground;
         e.style.borderLeft=e.style.borderBottom=e.style.borderRight=fBorder;
         e=tab.getElement("body");
         e.style.display="block";
         e=this.getElement("title_"+tab.uid);
         if (bringTitleIntoView && !Foundation.isElementInView(e))
            e.scrollIntoView();
      }
      if (tab.onToFront)
         tab.onToFront(event);
   },   
   getTabIndex:function(tab)
   {
      if (typeof(tab)=="number")
         return tab>=0 && tab<this.tabs.length ? tab : -1;
      if (typeof(tab)=="string")
      {
         for (var i=0;i<this.tabs.length;i++)
            if (this.tabs[i].id==tab)
               return i;
         return -1;
      }
      if (tab)
         for (var i=0;i<this.tabs.length;i++)
            if (this.tabs[i]==tab)
               return i;
      return -1;
   },   
   pushTab:function(tab,insertBeforeTab)
   {
      if (typeof(tab)=="function")
         tab=new (tab)(null,this);
      else
         if (Foundation.TabControl.Tab.isTab(tab))
            tab.setParent(this);
         else
            tab=new (this.resource("tabClass"))(tab,this);
      var insertIndex=this.getTabIndex(insertBeforeTab);
      if (insertIndex<0)
         insertIndex=this.tabs.length;
      for (var i=this.tabs.length;i>insertIndex;i--)
         this.tabs[i]=this.tabs[i-1];
      this.tabs[insertIndex]=tab;
      return tab;
   },   
   insertTab:function(tab,insertBeforeTab)
   {
      tab=this.pushTab(tab,insertBeforeTab);
      this.updateTitles(true);
      var e=this.getElement("content");
      if (e)
      {
         var tabBody=document.createElement("DIV");
         tabBody.id=tab.elementId("body");
         tabBody.style.display="none";
         tabBody.innerHTML=tab.appendBodyHtml(new Foundation.StringBuilder()).toString();
         e.appendChild(tabBody);
      }
      return tab;
   },   
   removeTab:function(tab)
   {
      var removeIndex=this.getTabIndex(tab);
      if (removeIndex<0)
         return null;
      tab=this.tabs[removeIndex];
      for (var i=removeIndex+1;i<this.tabs.length;i++)
         this.tabs[i-1]=this.tabs[i];
      this.tabs.length--;
      tab.setParent(null);
      this.updateTitles(true);
      var e=tab.getElement("body");
      if (e)
         if (e.removeNode)
            e.removeNode(true);
         else
            e.parentNode.removeChild(e);
      if (!this.getFrontTab())
         this.bringInitialTabToFront();
      return tab;
   },   
   bindToElement:function(element,postWrite,event)
   {
      if (!postWrite)
      {
         var table=document.createElement("TABLE");
         table.cellSpacing=0;
         table.cellPadding=0;
         table.border=0;
         table.width=this.resource("width");
         var titleCell=table.insertRow(-1).insertCell(-1);
         titleCell.id=this.elementId("titleContainer");

         var contentCell=table.insertRow(-1).insertCell(-1);
         contentCell.id=this.elementId("content");

         if (typeof(element)=="string")
            element=document.getElementById(element);
         var i=element.childNodes.length-1;
         var lastDiv=null;
         var anyDisplayed=false;
         while (i>=0)
         {
            if (element.childNodes[i].tagName=="DIV")
            {
               var tabClass=null;
               var tabDiv=element.childNodes[i];
               var display=tabDiv.style.display;
               if (tabDiv.currentStyle)
                  display=tabDiv.currentStyle.display;
               else
                  if (window.getComputedStyle)
                     display=window.getComputedStyle(tabDiv,null).display;
                  else
                     if (document.defaultView &&
                         document.defaultView.getComputedStyle)
                     {
                        var style=document.defaultView.getComputedStyle(tabDiv,null);
                        display=style ? style.getPropertyValue("display") : "none";
                     }
               if (typeof(tabDiv.className)=="string" &&
                   tabDiv.className.trim().length>0)
                  tabClass=Foundation.getGlobalObject(tabDiv.className.trim().replace(/_/g,"."));
               if (!tabClass)
                  tabClass=this.resource("tabClass");
               var rp=Foundation.TabControl.resourcePackFromElement(tabDiv);
               if (tabDiv.title)
                  rp.titleHtml=tabDiv.title.htmlEncode();
               if (display!="none" || rp.isDefault)
               {
                  anyDisplayed=true;
                  rp.isDefault=true;
               }
               var tab=new tabClass(rp);
               var ev=tabDiv.getAttribute("ontofront");
               if (ev)
                  tab.onToFront=new Function("event",ev);
               var ev=tabDiv.getAttribute("ontoback");
               if (ev)
                  tab.onToBack=new Function("event",ev);
               this.pushTab(tab,0);
               tabDiv.title="";
               tabDiv.id=tab.elementId("body");
               tabDiv.style.display=display;
               contentCell.insertBefore(tabDiv,lastDiv);
               lastDiv=tabDiv;
            }
            i=Math.min(i-1,element.childNodes.length);
         }
         if (!anyDisplayed)
         {
            if (this.tabs.length>0)
               this.tabs[0].resourcePack.isDefault=true;
            if(lastDiv)
               lastDiv.style.display="block";
         }
         this.bringInitialTabToFront(true);
         titleCell.innerHTML=this.appendTitlesHtml(new Foundation.StringBuilder()).toString();
         var frontTab=this.getFrontTab();
         contentCell.style.cssText=this.resource("containerStyle");
         contentCell.style.backgroundColor=frontTab ? frontTab.resourceEx("frontBackgroundColor") : "";
         contentCell.style.borderBottom=contentCell.style.borderRight=contentCell.style.borderLeft=(frontTab ? frontTab.resourceEx("frontBorder") : "");
         element.appendChild(table);
         var e;
         for (var i=0;i<this.tabs.length;i++)
            if (e=this.tabs[i].getElement('body'))
               e.style.display=(this.tabs[i].isInFront ? "block" : "none");
      }
      Foundation.Control.prototype.bindToElement.call(this,element,postWrite,event);
   },
   dispose:function()
   {
      if (Foundation.Control.prototype.dispose) Foundation.Control.prototype.dispose.call(this);
   },
   resource:Foundation.Control.prototype.resource,
   event:Foundation.Control.prototype.event,
   elementId:Foundation.Control.prototype.elementId,
   getElement:Foundation.Control.prototype.getElement,
   getElementValue:Foundation.Control.prototype.getElementValue,
   parseElementId:Foundation.Control.prototype.parseElementId,
   attachEvent:Foundation.Control.prototype.attachEvent,
   detachEvent:Foundation.Control.prototype.detachEvent,
   bindEvents:Foundation.Control.prototype.bindEvents,
   unbindFromElement:Foundation.Control.prototype.unbindFromElement,
   unbindEvents:Foundation.Control.prototype.unbindEvents,
   getScriptSearchKeys:Foundation.Control.prototype.getScriptSearchKeys,
   getResourceFolder:Foundation.Control.prototype.getResourceFolder,
   getResourcePath:Foundation.Control.prototype.getResourcePath,
   setValue:Foundation.Control.prototype.setValue,
   compareValues:Foundation.Control.prototype.compareValues,
   onValueChanged:Foundation.Control.prototype.onValueChanged,
   getValue:Foundation.Control.prototype.getValue,
   parseValue:Foundation.Control.prototype.parseValue,
   getDisabled:Foundation.Control.prototype.getDisabled,
   setDisabled:Foundation.Control.prototype.setDisabled,
   onDisabledChanged:Foundation.Control.prototype.onDisabledChanged,
   getHtml:Foundation.Control.prototype.getHtml
};
Foundation.TabControl.writeToPage=function(resourcePack)
   {
      var tabs=new this(resourcePack);
      document.write(tabs.getHtml());
      return tabs;
   };
Foundation.TabControl.addToPage=function(elementId,resourcePack)
   {
      var tabs=new this(resourcePack);
      document.getElementById(elementId).innerHTML(tabs.getHtml());
      return tabs;
   };
Foundation.TabControl.getCssRules=function()
   {
      if (window.navigator.appVersion.indexOf("MSIE 5")>=0)
         return "";
      return Foundation.Control.getCssRules.call(this,'frontBorder',this.resource("frontBorder")
                              ,'frontBackgroundColor',this.resource("frontBackgroundColor")
                              ,'containerStyle',this.resource("containerStyle")
                              ,arguments
                              );
   };
Foundation.TabControl.resourcePack={
      tabs:[],
      width:"100%",
      frontBorder:"1px solid #0000ff",
      frontBackgroundColor:"#eeeeff",
      backBorder:"1px solid #0000ff",
      backBackgroundColor:"#ddddff",
      frontTitleStyle:"color:#000000;font-weight:bold;padding:3px",
      backTitleStyle:"color:#000000;font-weight:bold;padding:3px",
      containerStyle:"padding:5px",
      tiedToUrlHash:false,
      bindElementTagName:"DIV",
      buttonHtml:"<input type=button value=\"%t\" onclick=\"%c\" style=\"font-weight:bold\">",
      cssRules:".%className > div:first-child {display:block}\n"
              +".%className > div {display:none;border:%frontBorder;background-color:%frontBackgroundColor;%containerStyle}\n"
   }
;
Foundation.TabControl.getTypePath=Foundation.Control.getTypePath;
Foundation.TabControl.resource=Foundation.Control.resource;
Foundation.TabControl.getById=Foundation.Control.getById;
Foundation.TabControl.getFirst=Foundation.Control.getFirst;
Foundation.TabControl.getNext=Foundation.Control.getNext;
Foundation.TabControl.isInstanceOf=Foundation.Control.isInstanceOf;
Foundation.TabControl.resourcePackFromElement=Foundation.Control.resourcePackFromElement;
Foundation.TabControl.bindToElement=Foundation.Control.bindToElement;
Foundation.TabControl.getCssName=Foundation.Control.getCssName;
Foundation.TabControl.bindToElements=Foundation.Control.bindToElements;
Foundation.TabControl.$constructor();


Foundation.TabControl.Tab=function(resourcePack,parent)
{
      Foundation.Elemental.call(this);
      Foundation.Resourceful.call(this);
   this.resourcePack=resourcePack ? resourcePack : new Object();
   this.setParent(parent);
   this.id=this.resource("id");
};
Foundation.TabControl.Tab.$parentClass=null;
Foundation.TabControl.Tab.$constructor=function(){};
Foundation.TabControl.Tab.$interfaces=new Array();
Foundation.TabControl.Tab.$interfaces.push(Foundation.Class);
Foundation.TabControl.Tab.$interfaces.push(Foundation.Elemental);
Foundation.TabControl.Tab.$interfaces.push(Foundation.Resourceful);
Foundation.TabControl.Tab.$name="Tab";
Foundation.TabControl.Tab.$childClasses=new Array();
Foundation.TabControl.Tab.$container=Foundation.TabControl;
Foundation.TabControl.Tab.prototype={
   constructor:Foundation.TabControl.Tab,   
   setParent:function(parent)
   {
      this.parent=parent ? parent : null;
      this.uid=this.parent ? this.parent.getNextUid() : -1;
      this.isInFront=false;
   },   
   resourceEx:function()
   {
      var r=this.resource.apply(this,arguments);
      if (r==null)
         r=this.parent.resource.apply(this.parent,arguments);
      return r;
   },   
   isDefault:function()
   {
      return this.resource("isDefault");
   },   
   appendTitleHtml:function(htmlBuilder)
   {
      return htmlBuilder.append(this.resource("titleHtml"));
   },   
   appendBodyHtml:function(htmlBuilder)
   {
      return htmlBuilder.append(this.resource("bodyHtml"));
   },   
   bringToFront:function(event,bringTitleIntoView)
   {
      this.parent.bringTabToFront(this,event,bringTitleIntoView);
   },
   dispose:function()
   {
      Foundation.Resourceful.prototype.dispose.call(this);
      Foundation.Elemental.prototype.dispose.call(this);
   },
   resource:Foundation.Resourceful.prototype.resource,
   event:Foundation.Elemental.prototype.event,
   elementId:Foundation.Elemental.prototype.elementId,
   getElement:Foundation.Elemental.prototype.getElement,
   getElementValue:Foundation.Elemental.prototype.getElementValue,
   parseElementId:Foundation.Elemental.prototype.parseElementId,
   attachEvent:Foundation.Elemental.prototype.attachEvent,
   detachEvent:Foundation.Elemental.prototype.detachEvent
};
Foundation.TabControl.Tab.isTab=function(o)
   {
      return (o && o.constructor && o.constructor.isInstanceOf && o.constructor.isInstanceOf(this));
   };
Foundation.TabControl.Tab.resourcePack={
      titleHtml:"",
      titleNoWrap:"nowrap",
      bodyHtml:"",
      isDefault:false
   }
;
Foundation.TabControl.Tab.getTypePath=Foundation.Class.getTypePath;
Foundation.TabControl.Tab.resource=Foundation.Resourceful.resource;
Foundation.TabControl.Tab.getById=Foundation.Elemental.getById;
Foundation.TabControl.Tab.getFirst=Foundation.Elemental.getFirst;
Foundation.TabControl.Tab.getNext=Foundation.Elemental.getNext;
Foundation.TabControl.Tab.isInstanceOf=Foundation.Class.isInstanceOf;
Foundation.TabControl.Tab.$constructor();

Foundation.TabControl.resourcePack.tabClass=Foundation.TabControl.Tab;
