﻿///<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" />
///<reference path="basket.js" />

TESCO.UI.Basket.Shelf = (function() {

    var NODE = TESCO.system.DOM.node;

    function _findType(type) {
        var i = 0;
        var _found = false;
        for (L = _types.length; i < L; i++) {
            if (_types[i] === type) {
                _found = true;
                break;
            }
        }
        return (_found) ? i : -1;
    }

    //  public static
    //#region 
    _constructor.getByType = function(type) {  //  return shelf object
        return _shelves[type].shelf;
    }

    _constructor.getTypeFromNode = function(basket, node) {
        return node.id ? node.id : basket.defaultShelfType;
    }

    _constructor.getTypeFromTr = function(basket, tr) {
        var _shelfContainer = NODE.getAncestorByAttributeRegExp(tr, "class", new RegExp('(\\s|^)shelf(\\s|$)'), 7);
        return _constructor.getTypeFromNode(basket, _shelfContainer);
    }

    _constructor.getTypeFromThead = function(basket, row) {
        var _shelfHeader = NODE.getAncestorByAttributeRegExp(row, "class", new RegExp('(\\s|^)deptHeader(\\s|$)'), 7);
        return _shelfHeader.id;
    }
    
    _constructor.removeAllTypes = function() {
        _types.splice(0, _types.length);
    }

    _constructor.types = {
        "add": function(type) {
            if (!this.exists(type)) {
                _types.push(type.toString());
            }
        },
        "exists": function(type) {
            return _findType(type) > -1;
        },
        "remove": function(type) {
            var _i = _findType(type);
            if (_i > -1) {
                _types.splice(_i, 1);
            }
        }
    }

    _constructor.create = function(basket, type, title) {

        var _shelf = {};

        var thead = document.createElement("thead");
        thead.setAttribute("id", "h-" + type);
        NODE.addClassName(thead, "deptHeader");
        var trow = document.createElement("tr");
        NODE.addClassName(trow, "department open");

        var cell = document.createElement("td");
        var _colspan;
        if (basket.view == TESCO.UI.Basket.views.maxi) {
            _colspan = 8;
        } else {
            _colspan = 6;
        }
        cell.setAttribute("colspan", _colspan);
        cell.colSpan = _colspan; // Needed for IE to work
        var text = document.createTextNode(title);
        cell.appendChild(text);
        trow.appendChild(cell);
        thead.appendChild(trow);

        _shelf.thead = thead;

        var tbody = document.createElement("tbody");
        tbody.setAttribute("id", "Active-Active-" + type);
       // tbody.style.display = "table-row-group"; //Fix for expanding after optimistic insert
        tbody.setAttribute("style", "display:table-row-group;"); 
        NODE.addClassName(tbody, "shelf");

        _shelf.tbody = tbody;

        this.types.add(type);

        return _shelf;
    }

    _constructor.insert = function(basket, shelf) {
        var _table = basket.container.getElementsByTagName("table")[0];
        _table.insertBefore(shelf.tbody, _table.childNodes[2]);
        _table.insertBefore(shelf.thead, _table.childNodes[2]);
    }


    //#endregion

    //  private static
    var _shelves = {}
    var _types = [];
    var _registary = {}

    function _hidden(tr) {
        return tr.style.display === "none";
    }

    //  constructor
    //#region
    function _constructor(type, container, tbody, collapsed) {
        _constructor.types.add(type);
        _shelves[type] = {
            "container": container,
            "tbody": tbody,
            "shelf": this
        }
        this.type = type;
        _constructor.base.constructor.call(this, container, collapsed, null, TESCO.system.browser.ie);
        return this;
    }
    //TODO: Change this to instance based on container node
    _constructor.extend(TESCO.UI.Collapse); //  derive from collapse
    //#endregion

    //  public instance
    //#region 
    _constructor.prototype.NAME = "TESCO.UI.Basket.Shelf";
    _constructor.prototype.VERSION = "1.0.0";

    _constructor.prototype.tbody = function() {
        return _shelves[this.type].tbody;
    }

    _constructor.prototype.container = function() {
        return _shelves[this.type].container;
    }

    _constructor.prototype.expand = function(settings) {
        _constructor.base.expand.call(this, settings);
    }

    _constructor.prototype.collapse = function(settings) {
        _constructor.base.collapse.call(this, settings);
    }

    _constructor.prototype.isEmpty = function() {
        var _isEmpty = true;
        var _trs = _shelves[this.type].tbody.getElementsByTagName("tr");
        for (var i = 0, L = _trs.length; i < L; i++) {
            if (_hidden(_trs[i])) {
                continue;
            }
            _isEmpty = false;
            break;
        }
        return _isEmpty;
    }
    //#endregion 

    return _constructor;
})();

TESCO.UI.Basket.Shelf.Default = (function() {

    //  public static
    //#region 
    _constructor.type = {
        "set": function(basket, type) {
            TESCO.UI.Basket.Shelf.types.add(type);
            basket.defaultShelfType = type;
        },
        "compare": function(basket, type) {
            return basket.defaultShelfType === type;
        }
    }
    //#endregion

    //  constructor
    //#region
    function _constructor(basket, container, tbody, collapsed) {
        _constructor.base.constructor.call(this, basket.defaultShelfType, container, tbody, collapsed);
        return this;
    }
    _constructor.extend(TESCO.UI.Basket.Shelf); //  derive from shelf
    //#endregion

    //  public instance
    //#region 
    _constructor.prototype.NAME = "TESCO.UI.Basket.Shelf.Default";
    _constructor.prototype.VERSION = "1.0.0";

    _constructor.prototype.collapse = function(callback) {	//	augment base
        var _shelf = this;
        this.addEventListener("complete",
		    function(e) {
		        _shelf.removeEventListener("complete", arguments.callee);
		        callback();
		    }
        );
        _constructor.base.collapse.call(this);
    }
    //#endregion 

    return _constructor;
})();