///<reference path="/Web/Js/TESCO.js" />
///<reference path="/Web/Js/system/event.js" />
///<reference path="/Web/Js/system/event.manager.js" />
///<reference path="/Web/Js/system/exception.js" />
///<reference path="/Web/Js/system/DOM.node.js" />

/*

Sample HTML:

<!-- BEGIN SAMPLE HTML -->
<div class="tabbedBox detailsBox" id="detailsBox">

    <!-- Navigation container -->
    <div class="navWrapper1">
        <ul class="tabbedBoxNav">
            <li id="nav-detailsBox-productDetail" class="first"> <a href="#detailsBox-productDetail"><span><strong>Product Detail</strong></span></a> </li>
            <li id="nav-detailsBox-ingredients" class="follow selected"> <a href="#detailsBox-ingredients"><span><strong>Ingredients</strong></span></a> </li>
            <li id="nav-detailsBox-nutrition"> <a href="#detailsBox-nutrition"><span><strong>Nutrition</strong></span></a> </li>
        </ul>
    </div>

    <!-- Content container -->
    <div class="tabbedBoxContent">

        <div class="inner1">

            <div id="detailsBox-productDetail" class="tab">
                <h3 class="nojsFallback">Product Detail</h3>
                <h4>Deum et dominum meum</h4>
                <p><strong>Page 1</strong> - ... more text ...</p>
                <p class="nojsFallback"> <a title="Back to Product Detail" href="#detailsBox-productDetail">Back to Product Detail</a> </p>
            </div>
            <div id="detailsBox-ingredients" class="tab selected">
                ...blah...
            </div>
            <div id="detailsBox-nutrition" class="tab">
                ...blah...
            </div>

        </div>

        <script type="text/javascript">
            new TESCO.sites.retail.UI.Tabs("detailsBox");
        </script>
    </div>
</div>
<!-- END SAMPLE HTML -->

*/

TESCO.$("sites.retail.UI").Tabs = (function() {

    var NODE = TESCO.system.DOM.node;
    var _classContainerNav = "navWrapper1";
    var _classContainerContent = "tabbedBoxContent";
    var _classContent = "tab";
    var _classSelected = "selected";
    var _prefixNav = "nav-";

    //private static
    function _initContainer() {
        var _containerNavElements;
        var _containerContentElements;

        // get the tab navigation div
        _containerNavElements = NODE.getElementsByClassName(this.container, _classContainerNav);
        if (!_containerNavElements.length) {
            return;
        }
        this.containerNav = _containerNavElements[0];

        // get the tab content div
        _containerContentElements = NODE.getElementsByClassName(this.container, _classContainerContent);
        if (!_containerContentElements.length) {
            return;
        }
        this.containerContent = _containerContentElements[0];

        // get the list of ids of content
        _divContentItems = NODE.getElementsByClassName(this.containerContent, _classContent);
        if (!_divContentItems) {
            return;
        }
        for (var i = 0, len = _divContentItems.length; i < len; i++) {
            var _divContent = _divContentItems[i];
            var _idDivContent = _divContent.getAttribute("id");
            if (!_idDivContent) {
                continue;
            }
            var _idDivNav = _prefixNav + _idDivContent;
            var _divNav = document.getElementById(_idDivNav);
            if (!_divNav) {
                continue;
            }
            _addTabObject.call(this, _divNav, _divContent, _idDivContent);
        }
    }

    function _addTabObject(oNav, oContent, oId) {
        //var _newTabObject = new Object;
        if (!oNav || !oContent || !oId) {
            return;
        }
        this.tabNavObjects.push(oNav);
        this.tabContentObjects.push(oContent);
        this.tabIdObjects.push(oId);
    }

    function _handleClick(e) {
        var _parentLi;
        var _classParentLi;
        switch (e.target.nodeName.toLowerCase()) {
            case "a":
            case "strong":
                if (NODE.getAncestorByAttributeRegExp(e.target, "class", new RegExp('tabbedBoxNav'))) {
                    _parentLi = NODE.getAncestor(e.target, "li");
                    if (!_parentLi) {
                        return;
                    }
                    _selectTabById.call(this, _parentLi.getAttribute("id"));
                    e.prevent();
                }
        }
    }

    function _selectTabById(id) {
        _selectTabByIndex.call(this, _findTabById.call(this, id));
        return;
    }


    function _findTabById(findId) {
        var _defaultId = 0;
        findId = _removePrefix.call(this, findId, _prefixNav);
        for (var i = 0, len = this.tabIdObjects.length; i < len; i++) {
            if (this.tabContentObjects[i].getAttribute("id") == findId) {
                return i;
            }
        }
        return _defaultId;
    }

    function _selectTabByIndex(index) {
        for (var i = 0, len = this.tabIdObjects.length; i < len; i++) {
            if (i == index) {
                NODE.addClassName(this.tabNavObjects[i], _classSelected);
                NODE.addClassName(this.tabContentObjects[i], _classSelected);
            } else {
                NODE.removeClassName(this.tabNavObjects[i], _classSelected);
                NODE.removeClassName(this.tabContentObjects[i], _classSelected);
            }
        }
    }

    function _removePrefix(string, prefix) {
        var _s = new String(string);
        var _p = new String(prefix);
        if (_s.substr(0, _p.length) == _p) {
            var _r = _s.substr(_p.length);
        }
        return _r;
    }

    //	constructor
    function _constructor(containerId) {
        var _self = this;

        this.containerNav;
        this.containerContent;
        this.tabNavObjects = new Array();
        this.tabContentObjects = new Array();
        this.tabIdObjects = new Array();

        this.container = document.getElementById(containerId);
        if (!this.container) {
            return;
        }
        _initContainer.call(this);
        TESCO.system.event.attach(this.container, "click",
			function(e) {
			    _handleClick.call(_self, e);
			}, false
		);
        return this;
    }

    _constructor.prototype.NAME = "TESCO.sites.retail.UI.Tabs";

    return _constructor;
})();