﻿//TabControlV2
//Set-Soft A.Ş.
//http://www.set-soft.com 

TYPE.registerNamespace('TabControl');

TabControl.Theme=function(themeName)
{
    this.name=themeName;
    this.cssNames={};
    this.cssNames.tabPageTable='';
    this.cssNames.tabPageLeftCell='';
    this.cssNames.tabPageMiddleCell='';
    this.cssNames.tabPageRightCell='';
    this.cssNames.tabPageSelectedLeftCell='';
    this.cssNames.tabPageSelectedMiddleCell='';
    this.cssNames.tabPageSelectedRightCell='';
    this.cssNames.tabPageImage='';
    
    this.cssNames.tabControlMainContainerUl='';
    this.cssNames.tabControlHeaderContainerLi='';
    this.cssNames.tabControlHeaderSplitterUl='';
    this.cssNames.tabControlTabPagesContainerLi='';
    this.cssNames.tabControlControlsContainerLi='';
    this.cssNames.tabControlFramesContainerLi='';
    this.cssNames.tabControlControlButtonsSplitterUl='';
    this.cssNames.tabControlControlButtonsInnerContainerLi='';
    this.cssNames.tabControlControlButtonsBottomBackgroundLi='';
    
    this.imagesDir='';
    
    this.images={};
    this.images.reloadTabPageImageSrc='';
    this.images.reloadTabPageHoverImageSrc='';
    this.images.closeTabPageImageSrc='';
    this.images.closeTabPageHoverImageSrc='';
    this.images.scrollLeftImageSrc='';
    this.images.scrollLeftHoverImageSrc='';
    this.images.scrollRightImageSrc='';
    this.images.scrollRightHoverImageSrc='';
    
    
    this.setThemeValues=function(tabPageTableCssClassName,tabPageLeftCellCssClassName,tabPageMiddleCellCssClassName,
                                 tabPageRightCellCssClassName,tabPageSelectedLeftCellCssClassName,tabPageSelectedMiddleCellCssClassName,
                                 tabPageSelectedRightCellCssClassName,tabPageImageCssClassName,tabControlMainContainerUlCssClassName,
                                 tabControlHeaderContainerLiCssClassName,tabControlHeaderSplitterUlCssClassName,
                                 tabControlTabPagesContainerLiCssClassName,tabControlControlsContainerLiCssClassName,
                                 tabControlFramesContainerLiCssClassName,tabControlControlButtonsSplitterUlClassName,
                                 tabControlControlButtonsInnerContainerLiClassName,tabControlControlButtonsBottomBackgroundLiClassName,
                                 reloadTabPageImageSrc,reloadTabPageHoverImageSrc,closeTabPageImageSrc,closeTabPageHoverImageSrc,
                                 scrollLeftImageSrc,scrollLeftHoverImageSrc,scrollRightImageSrc,scrollRightHoverImageSrc)
    {
        var css = this.cssNames;
        css.tabControlControlsContainerLi= tabControlControlsContainerLiCssClassName;
        css.tabControlFramesContainerLi=tabControlFramesContainerLiCssClassName;
        css.tabControlHeaderContainerLi=tabControlHeaderContainerLiCssClassName;
        css.tabControlHeaderSplitterUl=tabControlHeaderSplitterUlCssClassName;
        css.tabControlMainContainerUl=tabControlMainContainerUlCssClassName;
        css.tabControlTabPagesContainerLi=tabControlTabPagesContainerLiCssClassName;
        css.tabPageImage=tabPageImageCssClassName;
        css.tabPageLeftCell=tabPageLeftCellCssClassName;
        css.tabPageMiddleCell=tabPageMiddleCellCssClassName;
        css.tabPageRightCell=tabPageRightCellCssClassName;
        css.tabPageSelectedLeftCell=tabPageSelectedLeftCellCssClassName;
        css.tabPageSelectedMiddleCell=tabPageSelectedMiddleCellCssClassName;
        css.tabPageSelectedRightCell=tabPageSelectedRightCellCssClassName;
        css.tabPageTable=tabPageTableCssClassName;
        css.tabControlControlButtonsSplitterUl=tabControlControlButtonsSplitterUlClassName;
        css.tabControlControlButtonsInnerContainerLi=tabControlControlButtonsInnerContainerLiClassName;
        css.tabControlControlButtonsBottomBackgroundLi=tabControlControlButtonsBottomBackgroundLiClassName;
        
        var img = this.images;
        img.reloadTabPageImageSrc = reloadTabPageImageSrc;
        img.reloadTabPageHoverImageSrc = reloadTabPageHoverImageSrc;
        img.closeTabPageImageSrc = closeTabPageImageSrc;
        img.closeTabPageHoverImageSrc = closeTabPageHoverImageSrc;
        img.scrollLeftImageSrc = scrollLeftImageSrc;
        img.scrollRightImageSrc = scrollRightImageSrc;
        img.scrollLeftHoverImageSrc = scrollLeftHoverImageSrc;
        img.scrollRightHoverImageSrc = scrollRightHoverImageSrc;
    }
}

TabControl.TabProperties=function(containerElement)
{
    this.containerElement=containerElement;
    this.alternativeIE6Image='';
    this.alternativePassiveIE6Image='';
    this.currentTheme = new TabControl.Theme('Default');
}

TabControl.TabPage=function(key,url,titleText,imageSrc,allowMultipleUrl,tag)
{
    var me=this;
    this.key=key;
    this.url=url;
    this.title=titleText;
    this.imageSrc=imageSrc;
    this.tag=tag;
    this.allowMultipleUrls=allowMultipleUrl;
    this.locked=false;
    this.state='uninitialized';
    
    this._selected=false;
    this._hitCount=0;
    this._tabControl=null;
    
    this._domElements = {};
    this._domElements.mainTable=null;
    this._domElements.frame=null;
    
    this._domElementsCreated=false;
        
    this.createDomElements=function()
    {
        if(this._domElementsCreated)return;
        
        var browserManager = this._tabControl.browser;
        
        this._domElements.mainTable=browserManager.createElement('TABLE');
        this._domElements.mainTableTBody=browserManager.createElement('TBODY');
        this._domElements.mainTableRow=browserManager.createElement('TR');
        this._domElements.mainTableLeftCell=browserManager.createElement('TD');
        this._domElements.mainTableCenterCell=browserManager.createElement('TD');
        this._domElements.mainTableRightCell=browserManager.createElement('TD');
        this._domElements.tabPageImage=browserManager.createElement('image');
        this._domElements.frame=browserManager.createElement('iframe');
        this._domElements.titleSpan=browserManager.createElement('span');
        
        this._domElements.mainTable.border='0';
        this._domElements.mainTable.cellPadding='0';
        this._domElements.mainTable.cellSpacing='0';
        this._domElements.mainTableCenterCell.setAttribute('noWrap','-1');
        this._domElements.mainTableLeftCell.innerHTML='';
        this._domElements.mainTableRightCell.innerHTML='&nbsp;';
        this._domElements.tabPageImage.align='absmiddle';
        this._domElements.titleSpan.unselectable='on';
        this._domElements.titleSpan.style.cursor='default';
        this._domElements.frame.frameBorder='0';
        this._domElements.frame.width='100%';
        this._domElements.frame.style.display='none';
        this._domElements.frame.id=this.key;
        
        this._domElements.mainTable.appendChild(this._domElements.mainTableTBody);
        this._domElements.mainTableTBody.appendChild(this._domElements.mainTableRow);
        this._domElements.mainTableRow.appendChild(this._domElements.mainTableLeftCell);
        this._domElements.mainTableRow.appendChild(this._domElements.mainTableCenterCell);
        this._domElements.mainTableRow.appendChild(this._domElements.mainTableRightCell);
        this._domElements.mainTableCenterCell.appendChild(this._domElements.tabPageImage);
        this._domElements.mainTableCenterCell.appendChild(this._domElements.titleSpan);
        
        this._domElements.mainTable.onclick=this._processTabSelectRequest;
        this._domElements.mainTable.ondblclick=this._processTabCloseRequest;
        
        if(browserManager.browser.name == 'IE')
            this._domElements.frame.onreadystatechange=this._processReadyStateChange;
        else
            this._domElements.frame.onload=this._processReadyStateChange;
        
        this.applyTheme(this._tabControl.props.currentTheme);
        this.setTitle(this.title);
        this.setImage(this.imageSrc);
        this.setUrl(this.url);
        
        this._domElementsCreated=true;
    }
    
    this._processReadyStateChange=function()
    {
        if(me._tabControl.browser.browser.name=='IE')
            me.state = me._domElements.frame.readyState;
        else
            me.state = 'complete';
                
        me._tabControl.onTabPageStateChanged.fire(me);
    }
    
    this._processTabSelectRequest=function()
    {
        me._tabControl.selectTabPage(me);
    }
    
    this._processTabCloseRequest=function()
    {
        me._tabControl.closeTabPage(me);
    }
    
    this.close=function()
    {
        me._processTabCloseRequest();
    }
    
    this.applyTheme=function(theme)
    {
        this._domElements.mainTable.className=theme.cssNames.tabPageTable;
        if(this._selected==false)
        { 
            this._domElements.mainTableLeftCell.className=theme.cssNames.tabPageLeftCell;
            this._domElements.mainTableCenterCell.className=theme.cssNames.tabPageMiddleCell;
            this._domElements.mainTableRightCell.className=theme.cssNames.tabPageRightCell;
            if(this._tabControl.browser.browser.is('IE',6))
                if(this._tabControl.props.alternativePassiveIE6Image!='')
                    this.setImage(this._tabControl.props.alternativePassiveIE6Image);
        }
        else
        {
            this._domElements.mainTableLeftCell.className=theme.cssNames.tabPageSelectedLeftCell;
            this._domElements.mainTableCenterCell.className=theme.cssNames.tabPageSelectedMiddleCell;
            this._domElements.mainTableRightCell.className=theme.cssNames.tabPageSelectedRightCell;
            if(this._tabControl.browser.browser.is('IE',6))
                if(this._tabControl.props.alternativePassiveIE6Image!='')
                    this.setImage(this._tabControl.props.alternativeIE6Image);
        }
        this._domElements.tabPageImage.className=theme.cssNames.tabPageImage;
    }
    
    this.setImage=function(imageSrc)
    {
        if(imageSrc != null && imageSrc != '')
        {
            this._domElements.tabPageImage.style.display='inline';
            this._domElements.tabPageImage.src=imageSrc;
            this._domElements.tabPageImage.alt=this.title;
        }
        else
        {
            this._domElements.tabPageImage.style.display='none';
        }
        this.imageSrc=imageSrc;
    }
    
    this.setTitle=function(titleText)
    {
        this._domElements.titleSpan.innerHTML=titleText;
        this.title=titleText;
        if(titleText == '' || titleText == null)
        {
            this._domElements.tabPageImage.style.paddingLeft='3px';
            this._domElements.tabPageImage.style.paddingRight='3px';
        }
    }
    
    this.setUrl=function(url)
    {
        this._domElements.frame.src=url;
        this.url=url;
    }
    
    this.setSelected=function(selected)
    {
        if(this._selected == selected)return;
        this._selected=selected;
        this.applyTheme(this._tabControl.props.currentTheme);
        this._domElements.frame.style.display=(selected) ? 'block' : 'none';
        if(selected)
        {
            this._tabControl.selectedTabKey=this.key;
            this.fixLayout();
            //this._domElements.frame.focus();
        }   
    }
    
    this.fixLayout=function()
    {
        if(this._tabControl.browser.browser.is('IE','6'))
            this._domElements.frame.style.height='20px';
        
        var frameHeight = this._tabControl.props.containerElement.clientHeight - this._tabControl._domElements.headerContainerLi.clientHeight;
        if(frameHeight > 0)
        {
             if(this._tabControl.browser.browser.is('IE','6'))
                frameHeight = frameHeight - 2;

             this._domElements.frame.style.height=frameHeight + 'px';
        }
    }
    
    this.getSelected=function()
    {
        return this._selected;
    }
    
    this.reload=function()
    {
        me._domElements.frame.contentWindow.location.reload();
    }
    
    this.dispose=function()
    {
        if(me._tabControl.browser.browser.name == 'IE')
            this._domElements.frame.onreadystatechange=null;
        else
            this._domElements.frame.onload=null;
        
        this._domElements.frame.src='about:blank';
        this._domElements.mainTable.onclick=null;
        this._domElements.mainTable.ondblclick=null;
        this._domElements.frame=null;
        this._domElements = null;
    }
}

TabControl.TabControl=function()
{
    //Internal hack for visual basic developers :D
    var me=this;
    
    //Tab Spesific
    this.props = new TabControl.TabProperties();
    this.tabPages=new Web.Collections.Dictionary();
    this.hitCount=0;
    this.selectedTabKey=null;
    this._initialized=false;
    
    //Inner Dom Elements
    this.browser = new Web.Core.BrowserManager();
    this._domElements={};
    this._domElements.mainContainerUl=null;
    
    //Events
    this.onBeforeTabControlInitialized=new Web.Core.Event(this,false);
    this.onTabControlInitialized=new Web.Core.Event(this,false);
    this.onBeforeTabPageAdded=new Web.Core.Event(this,true);
    this.onTabPageAdded=new Web.Core.Event(this,false);
    this.onBeforeSelectedTabPageChanged=new Web.Core.Event(this,true);
    this.onSelectedTabPageChanged=new Web.Core.Event(this,false);
    this.onBeforeTabPageRemoved=new Web.Core.Event(this,true);
    this.onTabPageRemoved=new Web.Core.Event(this,false);
    this.onTabPageStateChanged=new Web.Core.Event(this,false);
    this.onBeforeTabContentRefreshed=new Web.Core.Event(this,true);
    
    //Extenders & Plug-Ins
    this.extenders={};
    this.extenders.tabControl=this;
    this.extenders._extenders=new Web.Collections.Dictionary();
    
    this._scrollTabPage=function(direction)
    {
        if(me.scrollInterval == null)
           me.scrollInterval = window.setInterval(function(){me._scrollTabPageInner(direction)},1);
    }
    
    this._finishScrollingProcess=function()
    {
        window.clearInterval(me.scrollInterval);
        me.scrollInterval=null;
    }
    
    this._scrollTabPageInner=function(direction)
    {
        if(direction=='left')
        {
            me._domElements.tabPagesContainerLi.scrollLeft-=10;
            if(me._domElements.tabPagesContainerLi.scrollLeft==0)
            {
                me._finishScrollingProcess();
            }
        }
        else
        {
            me._domElements.tabPagesContainerLi.scrollLeft+=10;
            if(me._domElements.tabPagesContainerLi.scrollLeft>(me._domElements.tabPagesContainerLi.scrollWidth - me._domElements.tabPagesContainerLi.clientWidth))
            {
                me._finishScrollingProcess();
            }
        }
    }
    
    this.initialize=function()
    {
        for(var ex=0;ex<this.extenders._extenders.count;ex++)
            this.extenders._extenders.getValueByIndex(ex).initialize();
            
        this.onBeforeTabControlInitialized.fire(null);
        
        var browser = this.browser;
        
        this._domElements.mainContainerUl=browser.createElement('Ul');
        this._domElements.headerContainerLi=browser.createElement('li');
        this._domElements.framesContainerLi=browser.createElement('li');
        this._domElements.headerSplitterUl=browser.createElement('Ul');
        this._domElements.tabPagesContainerLi=browser.createElement('li');
        this._domElements.controlButtonsContainerLi=browser.createElement('li');
        this._domElements.controlButtonsSplitterUl=browser.createElement('Ul');
        this._domElements.controlButtonsInnerContainerLi=browser.createElement('li');
        this._domElements.controlButtonsBottomBackgroundLi=browser.createElement('li');
        this._domElements.reloadTabPageImg=browser.createElement('img');
        this._domElements.closeTabPageImg=browser.createElement('img');
        this._domElements.scrollLeftImg=browser.createElement('img');
        this._domElements.scrollRightImg=browser.createElement('img');
        
        this._domElements.tabPagesContainerTable=browser.createElement('Table');
        this._domElements.tabPagesContainerTBody=browser.createElement('TBody');
        this._domElements.tabPagesContanerRow=browser.createElement('tr');
        this._domElements.tabPagesContainerCell=browser.createElement('td');
        
        this._domElements.tabPagesContainerTable.border='0';
        this._domElements.tabPagesContainerTable.width='100%';
        this._domElements.tabPagesContainerTable.cellPadding='0';
        this._domElements.tabPagesContainerTable.cellSpacing='0';
        this._domElements.tabPagesContainerCell.style.width='100%';
        
        this._domElements.reloadTabPageImg.align='absmiddle';
        this._domElements.closeTabPageImg.align='absmiddle';
        this._domElements.scrollLeftImg.align='absmiddle';
        this._domElements.scrollRightImg.align='absmiddle';
        this._domElements.reloadTabPageImg.style.cursor='pointer';
        this._domElements.closeTabPageImg.style.cursor='pointer';
        this._domElements.scrollLeftImg.style.cursor='pointer';
        this._domElements.scrollRightImg.style.cursor='pointer';
        
        this._domElements.controlButtonsInnerContainerLi.appendChild(this._domElements.reloadTabPageImg);
        this._domElements.controlButtonsInnerContainerLi.appendChild(this._domElements.closeTabPageImg);
        this._domElements.controlButtonsInnerContainerLi.appendChild(this._domElements.scrollLeftImg);
        this._domElements.controlButtonsInnerContainerLi.appendChild(this._domElements.scrollRightImg);
        
        this._domElements.controlButtonsSplitterUl.appendChild(this._domElements.controlButtonsInnerContainerLi);
        this._domElements.controlButtonsSplitterUl.appendChild(this._domElements.controlButtonsBottomBackgroundLi);
        this._domElements.controlButtonsContainerLi.appendChild(this._domElements.controlButtonsSplitterUl);
                
        this._domElements.tabPagesContainerTable.appendChild(this._domElements.tabPagesContainerTBody);
        this._domElements.tabPagesContainerTBody.appendChild(this._domElements.tabPagesContanerRow);
        this._domElements.tabPagesContanerRow.appendChild(this._domElements.tabPagesContainerCell);
        
        this._domElements.mainContainerUl.appendChild(this._domElements.headerContainerLi);
        this._domElements.mainContainerUl.appendChild(this._domElements.framesContainerLi);
        
        this._domElements.headerSplitterUl.appendChild(this._domElements.tabPagesContainerLi);
        this._domElements.headerSplitterUl.appendChild(this._domElements.controlButtonsContainerLi);
        
        this._domElements.tabPagesContainerLi.appendChild(this._domElements.tabPagesContainerTable);
        this._domElements.headerContainerLi.appendChild(this._domElements.headerSplitterUl);
        
        this.applyTheme(this.props.currentTheme);
        
        if(this.props.currentTheme.images.reloadTabPageHoverImageSrc != '')
        {
            this._domElements.reloadTabPageImg.onmouseover=function(){this.src=me.props.currentTheme.imagesDir + me.props.currentTheme.images.reloadTabPageHoverImageSrc;}
            this._domElements.reloadTabPageImg.onmouseout=function(){this.src=me.props.currentTheme.imagesDir + me.props.currentTheme.images.reloadTabPageImageSrc;}
        }
        
        if(this.props.currentTheme.images.closeTabPageHoverImageSrc != '')
        {
            this._domElements.closeTabPageImg.onmouseover=function(){this.src=me.props.currentTheme.imagesDir + me.props.currentTheme.images.closeTabPageHoverImageSrc;}
            this._domElements.closeTabPageImg.onmouseout=function(){this.src=me.props.currentTheme.imagesDir + me.props.currentTheme.images.closeTabPageImageSrc;}            
        }
        
        if(this.props.currentTheme.images.scrollLeftHoverImageSrc != '')
        {
            browser.attachEvent(this._domElements.scrollLeftImg,'onmouseover',function(){me._domElements.scrollLeftImg.src=me.props.currentTheme.imagesDir + me.props.currentTheme.images.scrollLeftHoverImageSrc;});
            browser.attachEvent(this._domElements.scrollLeftImg,'onmouseout',function(){me._domElements.scrollLeftImg.src=me.props.currentTheme.imagesDir + me.props.currentTheme.images.scrollLeftImageSrc;});
        }
        
        if(this.props.currentTheme.images.scrollRightHoverImageSrc != '')
        {
            browser.attachEvent(this._domElements.scrollRightImg,'onmouseover',function(){me._domElements.scrollRightImg.src=me.props.currentTheme.imagesDir + me.props.currentTheme.images.scrollRightHoverImageSrc;});
            browser.attachEvent(this._domElements.scrollRightImg,'onmouseout',function(){me._domElements.scrollRightImg.src=me.props.currentTheme.imagesDir + me.props.currentTheme.images.scrollRightImageSrc;});
        }

        this._domElements.closeTabPageImg.onclick=function(){me._closeTaskImageClicked()}
        this._domElements.reloadTabPageImg.onclick=function(){me.reloadTabPage()} 
        this._domElements.scrollLeftImg.onmousedown=function(){me._scrollTabPage('left')}
        this._domElements.scrollRightImg.onmousedown=function(){me._scrollTabPage('right')}
        this._domElements.scrollLeftImg.onmouseup=function(){me._finishScrollingProcess()}
        this._domElements.scrollRightImg.onmouseup=function(){me._finishScrollingProcess()}    
        
        browser.attachEvent(this._domElements.scrollRightImg,'onmouseout',function(){me._finishScrollingProcess()});
        browser.attachEvent(this._domElements.scrollLeftImg,'onmouseout',function(){me._finishScrollingProcess()});
        
        this.props.containerElement.appendChild(this._domElements.mainContainerUl);

        this.fixLayout();

        this._initialized = true;
        this.onTabControlInitialized.fire(null);
    }
    
    this.applyTheme=function(theme)
    {
        //theme = new TabControl.Theme();
        this._domElements.mainContainerUl.className=theme.cssNames.tabControlMainContainerUl;
        this._domElements.headerContainerLi.className=theme.cssNames.tabControlHeaderContainerLi;
        this._domElements.framesContainerLi.className=theme.cssNames.tabControlFramesContainerLi;
        this._domElements.headerSplitterUl.className=theme.cssNames.tabControlHeaderSplitterUl;
        this._domElements.tabPagesContainerLi.className=theme.cssNames.tabControlTabPagesContainerLi;
        this._domElements.controlButtonsContainerLi.className=theme.cssNames.tabControlControlsContainerLi;
        this._domElements.controlButtonsSplitterUl.className=theme.cssNames.tabControlControlButtonsSplitterUl;
        this._domElements.controlButtonsInnerContainerLi.className=theme.cssNames.tabControlControlButtonsInnerContainerLi;
        this._domElements.controlButtonsBottomBackgroundLi.className=theme.cssNames.tabControlControlButtonsBottomBackgroundLi;
        
        this._domElements.reloadTabPageImg.src=theme.imagesDir + theme.images.reloadTabPageImageSrc;
        this._domElements.closeTabPageImg.src=theme.imagesDir + theme.images.closeTabPageImageSrc;
        this._domElements.scrollLeftImg.src=theme.imagesDir + theme.images.scrollLeftImageSrc;
        this._domElements.scrollRightImg.src=theme.imagesDir + theme.images.scrollRightImageSrc;
                
        if(this.tabPages.count>0)
        {
            for(var i=0;i<this.tabPages.count;i++)
            {
                this.tabPages.getValueByIndex(i).applyTheme(theme);
            }
        }
        this.props.currentTheme = theme;
    }
    
    this.getSelectedTabPage=function()
    {
        ///<value type="TabControl.TabPage" />
        if(this.selectedTabKey == null)return null;
        return this.tabPages.getValue(this.selectedTabKey);
    }
        
    this.generateRandomTabKey=function()
    {
          var key = '';
          do
          {
             key = Math.ceil(Math.random() * 1000);
          }
          while(this.tabPages.containsKey(key))
          
          return key;
    }
        
    this.ensureVisible=function()
    {
        var activeTabPage = this.getSelectedTabPage();
        if(activeTabPage==null)return;
        
        var k=this._domElements.tabPagesContainerLi.clientWidth;
        var y=this._domElements.tabPagesContainerLi.scrollLeft;
        var q=activeTabPage._domElements.mainTable.offsetWidth;
        var m=this.browser.findElementPos('x',activeTabPage._domElements.mainTable) - this.browser.findElementPos('x',this._domElements.tabPagesContainerLi);
        
        var t=m-y;
        var z=t+q;
        
        if(t<0)
        {
            this._domElements.tabPagesContainerLi.scrollLeft-=(t * (-1));
            return;
        }
        
        if(z>k)
        {
            this._domElements.tabPagesContainerLi.scrollLeft+=(z-k);
            return;
        }
    }
    
    this.selectTabPage=function(tabPage)
    {
        //INTELLISENSE HACK!!
        //tabPage = new TabControl.TabPage();
        
        var cancelled=this.onBeforeSelectedTabPageChanged.fire(tabPage);
        if(cancelled)return;
        
        var selectedTabPage = this.getSelectedTabPage();
        if(selectedTabPage != null)
        {
            if(selectedTabPage.key != tabPage.key)
            {
                selectedTabPage.setSelected(false);
            }
        }
        
        this.hitCount++;
        tabPage._hitCount = this.hitCount;
                
        tabPage.setSelected(true);
        
        this.ensureVisible();
        
        this.onSelectedTabPageChanged.fire(tabPage);
    }
    
    this._closeTaskImageClicked=function()
    {
        var activeTabPage = this.getSelectedTabPage();
        if(activeTabPage != null)this.closeTabPage(activeTabPage);  
    }
    
    this.reloadTabPage=function()
    {
        var activeTabPage = this.getSelectedTabPage();
        if(activeTabPage != null)
        {   
            var cancelled = this.onBeforeTabContentRefreshed.fire(activeTabPage);
            if(cancelled)return;
            
            activeTabPage.reload();
        }
    }
    
    this.getLastSelectedTabPage=function()
    {
        var lastHitCount = 0;
        var tabPage=null;
        
        var currentTabPage = null;
        for(var i=0;i<this.tabPages.count;i++)
        {
           currentTabPage = this.tabPages.getValueByIndex(i);
           if(currentTabPage._selected)continue;
           if(currentTabPage._hitCount > lastHitCount)
           {
               lastHitCount = currentTabPage._hitCount;
               tabPage = currentTabPage;
           }
        }
        
        return tabPage;
    }
    
    this.closeTabPage=function(tabPage)
    {
       //INTELLISENSE HACK!!
       //tabPage = new TabControl.TabPage();
       if(tabPage == null)return;
       if(tabPage.locked)return;
       
       var cancelled = this.onBeforeTabPageRemoved.fire(tabPage);
       if(cancelled)return;
       
       var lastSelectedTabPage = null;
       if(tabPage._selected)
          lastSelectedTabPage = this.getLastSelectedTabPage();
            
       this._domElements.tabPagesContanerRow.removeChild(tabPage._domElements.mainTable.parentNode);
       this._domElements.framesContainerLi.removeChild(tabPage._domElements.frame);
       
       this.tabPages.remove(tabPage.key);
       this.selectedTabKey=null;
       this.onTabPageRemoved.fire(tabPage);
       
       tabPage.dispose();       
       
       if(lastSelectedTabPage != null)
          this.selectTabPage(lastSelectedTabPage)       
    }
    
    this.fixLayout=function()
    {
        //fix header width
        var containerWidth=this.props.containerElement.clientWidth;
        var controlsLiWidth = this._domElements.controlButtonsContainerLi.offsetWidth;
        var tabPagesWidth = containerWidth - controlsLiWidth;
        if(tabPagesWidth > 0)
            this._domElements.tabPagesContainerLi.style.width= tabPagesWidth + 'px';
        
        //fix frame height
        var selectedTabPage = this.getSelectedTabPage();
        if(selectedTabPage != null)
            selectedTabPage.fixLayout();        
    }
    
    this.addTabPage=function(tabPage)
    {   
        //INTELLISENSE HACK!!
        //tabPage = new TabControl.TabPage();
        
        tabPage._tabControl = this;
        
        if(tabPage.key==null)
        {
            tabPage.key=this.generateRandomTabKey();
        }
        
        if(this.tabPages.containsKey(tabPage.key))
        {
            var selectedTabPage = this.getSelectedTabPage();
            for(var i=0;i<this.tabPages.count;i++)
            {
                 if(this.tabPages.getValueByIndex(i).key==tabPage.key && selectedTabPage.key != tabPage.key)
                 {
                    this.selectTabPage(this.tabPages.getValueByIndex(i));
                    return;
                 }
            }
            return;
            
        }
        
        if(tabPage.allowMultipleUrls == false || tabPage.allowMultipleUrls == "false")
        {
            for(var i=0;i<this.tabPages.count;i++)
            {
                if(this.tabPages.getValueByIndex(i).url==tabPage.url)
                {
                    this.selectTabPage(this.tabPages.getValueByIndex(i));
                    return;
                }
            }
        }
        
        
        var cancelled=this.onBeforeTabPageAdded.fire(tabPage);
        if(cancelled)return;
        
        this.tabPages.add(tabPage.key,tabPage);
        
        if(this.browser.browser.is('IE',6))
            tabPage.imageSrc=this.props.alternativeIE6Image;
        
        tabPage.createDomElements();
        
        var containerCell = this.browser.createElement('td');
        containerCell.appendChild(tabPage._domElements.mainTable);
        
        this._domElements.tabPagesContanerRow.insertBefore(containerCell,this._domElements.tabPagesContainerCell);
        this._domElements.framesContainerLi.appendChild(tabPage._domElements.frame);
        
        this.onTabPageAdded.fire(tabPage);
        this.selectTabPage(tabPage);
    }
    
    this.extenders.add=function(extenderKey,extender)
    {
        if(this._extenders.containsKey(extenderKey))
            throw ('An extender already exists with that name:' + extenderKey)
        
        this._extenders.add(extenderKey,extender);
        extender.tabControl=this.tabControl;
        if(this.tabControl._initialized)
            extender.initialize(); 
    }
    
    this.extenders.get=function(extenderKey)
    {
        return this._extenders.getValue(extenderKey);
    }
    
    this.extenders.remove=function(extenderKey)
    {
        if(this._extenders.containsKey(extenderKey))
        {
            var extenderToRemove = this._extenders.getValue(extenderKey);
            if(extenderToRemove.detach)
                extenderToRemove.detach();
            if(extenderToRemove.dispose)
                extenderToRemove.dispose();
            this._extenders.remove(extenderKey); 
        }
    }
}

//----------------------------------EXTENDERS & PLUG-INS------------------------------

TYPE.registerNamespace('Referans.Layout.TabExtenders');

Referans.Layout.TabExtenders.AutoHeightExtender=function(initialHeight,minimumHeight)
{
    var me=this;
    this.tabControl=null;
    
    this.initialHeight = initialHeight;
    this.minimumHeight = minimumHeight;
    
    this.initialize=function()
    {
        this.tabControl.onTabControlInitialized.addHandler(this,this.tabControl_onTabControlInitialized);
    }
    
    this.tabControl_onTabControlInitialized=function(sender,args)
    {
        me.tabControl.onTabPageStateChanged.addHandler(this,this.processForStateChange);
        me.tabControl.onBeforeSelectedTabPageChanged.addHandler(this,this.process);
        me.tabControl.onSelectedTabPageChanged.addHandler(this,this.process);
    }
    
    this.processForStateChange=function(sender,tabPage)
    {
        var selectedTabPage = this.tabControl.getSelectedTabPage();
        if(selectedTabPage != null)
            if(selectedTabPage.key != tabPage.key)
                return;
        
        this.process(sender,tabPage);
    }
    
    this.process=function(sender,tabPage)
    {
        //return;
        
        var page = (tabPage.args) ? tabPage.args : tabPage;
        var containerElement = this.tabControl.props.containerElement;
        if(page.state == 'complete')
        {
            var targetHeight = me.tabControl._domElements.headerContainerLi.offsetHeight + 
                      page._domElements.frame.contentWindow.document.body.offsetHeight;
                               
            if(targetHeight < this.minimumHeight)
                targetHeight = this.minimumHeight;
            containerElement.style.height = targetHeight + 'px';
            
//            if(targetHeight > 1200)
//                pwindow.setTimeout(function(){me.process(sender,tabPage);},1);
        }
        else
        {
            containerElement.style.height = me.initialHeight + 'px';
        }
        
        if(sender.browser.browser.name=='IE')
        {
            page.fixLayout();
        }
        else
        {
            window.setTimeout(function(){
                page.fixLayout();},100);
        }
    }
}

Referans.Layout.TabExtenders.CommandTextExtender=function(reloadTabText,closeTabText,scrollLeftText,scrollRightText)
{
    this.reloadTabText=reloadTabText;
    this.closeTabText=closeTabText;
    this.scrollLeftText=scrollLeftText;
    this.scrollRightText=scrollRightText;
    
    this.tabControl=null;
    
    this.initialize=function()
    {
        this.tabControl.onTabControlInitialized.addHandler(this,this.tabControl_onTabControlInitialized);
    }
    
    this.tabControl_onTabControlInitialized=function(sender,args)
    {
        this.update();
    }
    
    this.update=function()
    {
        var domElements = this.tabControl._domElements;
        domElements.reloadTabPageImg.alt=this.reloadTabText;
        domElements.closeTabPageImg.alt=this.closeTabText;
        domElements.scrollLeftImg.alt=this.scrollLeftText;
        domElements.scrollRightImg.alt=this.scrollRightText;
    }
    
    this.detach=function()
    {
        var domElements = this.tabControl._domElements;
        domElements.reloadTabPageImg.alt='';
        domElements.closeTabPageImg.alt='';
        domElements.scrollLeftImg.alt='';
        domElements.scrollRightImg.alt='';
    }
    
    this.dispose=function()
    {
        this.tabControl.onTabControlInitialized.removeHandler(this,this.tabControl_onTabControlInitialized);
    }
}

Referans.Layout.TabExtenders.LoadingPlaceHolderExtender=function(divId,loadingImageSrc)
{
    var me=this;
    
    this.tabControl=null;
    
    this.divId=divId;
    this.loadingImgSrc=loadingImageSrc;
    this.div=null;
    this.eventAttached=false;
        
    this.initialize=function()
    {
        this.tabControl.browser.preLoadImage(this.loadingImgSrc);
    
        var br = this.tabControl.browser;
        this.div=br.getElementById(me.divId);
        
        this.div.style.display='none';
        this.div.style.position='absolute';
        this.tabControl.onTabControlInitialized.addHandler(this,this.tabControl_onTabControlInitialized);
    }
    
    this.tabControl_onTabControlInitialized=function(sender,args)
    {
         sender._domElements.framesContainerLi.appendChild(me.div);
         
         me.tabControl.onTabPageStateChanged.addHandler(this,this.process);
         me.tabControl.onSelectedTabPageChanged.addHandler(this,this.process);
         me.tabControl.onTabPageRemoved.addHandler(this,function(sender){if(sender.tabPages.count==0)this.div.style.display='none';});
    }
    
    this.reCalcSize=function()
    {
        if(me.div.style.display!='none')
        {
            me.div.style.width=me.tabControl._domElements.framesContainerLi.clientWidth + 'px';

            var h = me.tabControl._domElements.mainContainerUl.offsetHeight - me.tabControl._domElements.headerContainerLi.offsetHeight;
            if(h>0)
                me.div.style.height=h + 'px';
        }
    }
        
    this.process=function(sender,tabPage)
    {
        if(me.tabControl.getSelectedTabPage().key==tabPage.key)
        {    
            if(tabPage.state=='complete')
            {
                if(me.eventAttached)
                {
                    me.tabControl.browser.detachEvent(window,'onresize',me.reCalcSize);
                    me.eventAttached=false;
                }
                
                me.div.style.display='none';
                //tabPage._domElements.frame.visibility='visible';
                if(tabPage.originalImg)
                    tabPage.setImage(tabPage.originalImg);
            }
            else
            {
                //if(tabPage._domElements.frame.visibility!='hidden')
                  //  tabPage._domElements.frame.visibility='hidden';
                
                if(!tabPage.originalImg)
                    tabPage.originalImg=tabPage.imageSrc;
                
                tabPage.setImage(me.loadingImgSrc);
                
                if(me.eventAttached==false)
                {
                    me.tabControl.browser.attachEvent(window,'onresize',me.reCalcSize);
                    me.eventAttached=true;
                }
                
                me.div.style.display='block';
                this.reCalcSize();
            }
        }
        else
        {
            if(tabPage.state=='complete')
            {
                if(tabPage.originalImg)
                    tabPage.setImage(tabPage.originalImg);
            }
            else
            {
                if(!tabPage.originalImg)
                {
                    tabPage.originalImg=tabPage.imageSrc;
                    tabPage.setImage(me.loadingImgSrc);
                }
            }
        }
    }
}
