﻿//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;
        var bodyHeight = 0;

        if (this._tabControl.browser.browser.is('IE', '8')) {
            var tabPg = this._tabControl.getSelectedTabPage();
            if (tabPg != null && tabPg != 'undefined') {
                var fr = tabPg._domElements.frame;
                if (fr != null && fr != 'undefined') {
                    if (fr.contentWindow != null && fr.contentWindow != 'undefined') {
                        if (fr.contentWindow.document != null && fr.contentWindow.document != 'undefined') {
                            if (fr.contentWindow.document.body != null && fr.contentWindow.document.body != 'undefined') {
                                //                        alert("doc" + fr.contentWindow.document);
                                //                        alert("doc.body" + fr.contentWindow.document.body);
                                //                        alert("doc.body.ch" + fr.contentWindow.document.body.clientHeight);
                                bodyHeight = fr.contentWindow.document.body.clientHeight;
                            }
                        }
                    }
                }
            }
            if (bodyHeight > frameHeight) frameHeight = bodyHeight;
        }

        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);
                }
            }
        }
    }
}

