MV = MV || {};
MV.ProviderTypeDetail = (function() {

    // load up the templates from an ajax call and store in a variable that can be accessed via the closure
    var defaultTemplates = {};

    jQuery.get(Config.SiteTemplate.DetailURL, function(template) {
        MV.Page.Templates.TemplateDetail = $(template);
        MV.Page.Templates.DetailNavItem = MV.Page.Templates.TemplateDetail.find('#detailNavItemTemplate').clone().attr('id', '');
        MV.Page.Templates.DetailNav = MV.Page.Templates.TemplateDetail.find('#detailNavTemplate').clone().attr('id', '');
        MV.Page.Templates.TemplateDetail.find('#detailNavTemplate').remove();
        $.extend(defaultTemplates, { 'viewport': MV.Page.Templates.TemplateDetail, 'navMenu': MV.Page.Templates.DetailNav, 'navMenuItem': MV.Page.Templates.DetailNavItem });
    });

    jQuery.get(Config.Content.Location + '/provider_detail.html', function(template) {
        var ProviderDetail = $(template);
        var ProviderDetailTitle = ProviderDetail.find('#masterTitlePane');
        var ProviderDetailContent = ProviderDetail.find('#masterContentPane');
        $.extend(defaultTemplates, { 'masterTitle': ProviderDetailTitle, 'masterBody': ProviderDetailContent });

    });

    var createDetailNavigation = function createDetailNavigation(type, navs) {
        var templates = defaultTemplates;
        var menu = templates.navMenu.clone(true);
        var menuItem = templates.navMenuItem.clone(true);
        var navContainer = $('<div></div>').attr('id', type + 'DetailNavContainer').addClass('providerTypeDetailNavContainer');

        for (var i = 0, nl = navs.length; i < nl; i++) {
            var navItem = navs[i];
            var navItemId = navItem.Id;
            var navItemLinks = navItem.Links;
            var detailNav = menu.clone().attr('id', navItemId).find('dt span.label').html(navItem.Label).end();
            var navList = detailNav.find('dd ul');
            for (var j = 0, ll = navItemLinks.length; j < ll; j++) {
                var navItemLink = navItemLinks[j];
                var $navItem = menuItem.clone().find('a').attr('id', navItemId + '-' + navItemLink.Id).html(navItemLink.Label).end();
                navList.append($navItem)
            };
            navContainer.append(detailNav);
        };

        return navContainer;
    };

    var createDetailAttributes = function createDetailAttributes(attributes) {
        return attributes.split(/\s*,\s*/);
    };

    var createDetailContentSections = function createDetailContentSections(navs) {
        var contentSections = [];

        for (var i = 0, nl = navs.length; i < nl; i++) {
            var navItem = navs[i];
            var navItemId = navItem.Id;
            var navItemLinks = navItem.Links;
            for (var j = 0, ll = navItemLinks.length; j < ll; j++) {
                var navItemLinkId = navItemLinks[j].Id;
                var fullID = navItemId + '-' + navItemLinkId;
                // TODO - this better
                if (navItemLinkId in {medicalServices: null, surgicalInfectionPrevention: null, surgicalCare: null, patientExperience: null, mortalityReadmissions:null, mortalityRates: null, utilizationRates: null}) {
                    navItemLinkId = "qualityData";
                }
                contentSections[fullID] = {
                    title: defaultTemplates.masterTitle.clone().find('#' + navItemLinkId + "TitlePane"),
                    body: defaultTemplates.masterBody.clone().find('#' + navItemLinkId + "ContentPane")
                };
            }
        };

        return contentSections;
    };

    var createDetailViewport = function createDetailViewport(nav) {
        var templates = defaultTemplates;
        var v = templates.viewport.clone(true);
        v.find('#detailAuxilliaryMenu').before(nav);

        return v;
    };

    var createDetailController = function createDetailController(navs, controlFunctions) {
        var controls = {};

        for (var i = 0, nl = navs.length; i < nl; i++) {
            var navItem = navs[i];
            var menuId = navItem.Id;
            var navItemLinks = navItem.Links;
            for (var j = 0, ll = navItemLinks.length; j < ll; j++) {
                var navItemLinkId = navItemLinks[j].Id;
                var controlId = menuId + '-' + navItemLinkId;
                if (i == 0 && j == 0) {
                    controls.defaultControl = menuId + '-' + navItemLinkId
                };
                controls[controlId] = {
                    id: controlId,
                    listeners: {
                        onControlClick: $.extend(true, {}, MV.Listener)
                    }
                };
                
                // subscribe to the controls based on the Detail object settings
                controls[controlId].listeners.onControlClick.subscribe(controlFunctions[controlId]);
            };
        };

        return controls;
    };

    return {
        init: function(data, settings) {
            this.type = data.Type;
            this.navs = data.DetailNavs;

            this.contentSections = createDetailContentSections(this.navs);
            this.controls = createDetailController(this.navs, settings.controlFunctions);
            this.attributes = createDetailAttributes(data.DetailAttributes);

            this.navigation = null;
            this.viewport = {};
            return this;
        },
        create: function() {
            this.navigation = createDetailNavigation(this.type, this.navs)
            this.viewport = createDetailViewport(this.navigation);

            return this;
        },
        writeContent: function(title, body) {
            this.viewport.find('#headerDetail').append(title);
            this.viewport.find('#contentDetail').append(body);
        },
        printContent: function(title, body) {
            title = title || '';
            body = body || '';
            this.viewport.find('#printDetail').append(title).append(body);
        },
        clearContent: function() {
            this.viewport.find('#headerDetail').empty();
            this.viewport.find('#contentDetail').empty();
            this.viewport.find('#detailHeaderTable').empty();
        },
        printAll: function(e) {
            for (var detailControl in this.contentSections) {
                var printWindow = {
                    title: this.contentSections[detailControl].title.clone(true),
                    body: this.contentSections[detailControl].body.clone(true)
                }
                this.controls[detailControl].listeners.onControlClick.fire($.extend(true, e, { data: { 'viewport': this.viewport, 'window': printWindow, 'print': true, 'controlId': detailControl} }));
            }
        }
    };
    // module end

})();




MV = MV || {};
MV.Detail = (function() {

    var createDetail = function(data, settings) {
        var detail = $.extend(true, {}, MV.ProviderTypeDetail);
        return (data && settings) ? detail.init(data, settings) : {};
    };

    return {
        settings: {
            controlFunctions: {}
        },
        init: function() {
            return this;
        },
        create: function(providerType, data) {
            providerType.detail = createDetail(data, this.settings);
            return providerType;
        }
    };
})();