﻿var utilities = new (function() {
    this.stretchToBottom = function(panel, onResize) {
        this.stretchPanelToBottom(panel);

        if (!onResize)
            return;

        var self = this;

        $(window).bind('resize', function() {
            self.stretchPanelToBottom(panel);
        });
    }

    this.stretchPanelToBottom = function(panel) {

        var windowHeight = $(window).height();
        var top = panel.position().top;
        var panelHeight = panel.height();
        var panelOuter = panel.outerHeight(true);
        var edgeHeight = panelOuter - panelHeight; // border padding margin etc

        var tolerance = 5;
        var height = (windowHeight - top - edgeHeight) - tolerance;


        //        if (panel.attr("id") === "conceptsTree" || panel.attr("id") === "optionsAndTree") {
        //            alert(panel.attr("id"));
        //            alert("windowHeight: " + windowHeight);
        //            alert("top: " + top);
        //            alert("panelHeight: " + panelHeight);
        //            alert("panelOuter: " + panelOuter);
        //            alert("edgeHeight: " + edgeHeight);
        //            alert("height: " + height);
        //        }

        panel.height(height);
    }
})();

// the fragment can be of the form {schemeUri}#/{conceptUri}?tab={tabName}
var fragmentHelper = {

    // functions that are called when the fragment changes
    onChangeFunctions: new Array(),

    init: function() {
        $.address.init(function(event) { });
        $.address.change(function(event) {
            for (var i = 0; i < fragmentHelper.onChangeFunctions.length; i++) {
                var fn = fragmentHelper.onChangeFunctions[i];
                fn();
            }
        });
    },

    // example: {schemeUri}#/{conceptUri}?tab={tabName}
    // readProperty('tab') will return {tabName}
    readProperty: function(name) {
        // uses the jQuery address plugin to read the fragment,
        // then extracts the query string parameters
        var fragment = $.address.value();
        var parameters = $(document).getUrlParameters(fragment);

        return parameters[name];
    },

    // example: {schemeUri}#/{conceptUri}?tab={tabName}
    // readUrl() will return {conceptUri} (without the tab information)
    readUrl: function() {
        var fragment = $.address.value();
        var url = new String($(document).removeUrlQueryString(fragment));
        if (url.length > 0 && url.charAt(0) === '/') {
            url = url.substring(1);
        }

        return url.valueOf();
    },

    // example: {schemeUri}#/{conceptUri}?tab={tabName}
    // setProperty('tab', '{newTabName)') will set the url to {schemeUri}#/{conceptUri}?tab={newTabName}
    setProperty: function(name, value) {

        var fragment = $.address.value();
        var url = this.readUrl();
        var parameters = $(document).getUrlParameters(fragment);

        if (parameters[name] === value) // already set
            return;

        parameters[name] = value;
        var queryString = $(document).createQueryStringParameters(parameters);

        this.setFragment(url, queryString);
    },

    // example: {schemeUri}#/{conceptUri}?tab={tabName}
    // setUrl('{newConceptUri}') will set the url to {schemeUri}#/{newConceptUri}?tab={tabName}
    // (the tab will be unaffected).
    setUrl: function(url) {
        var fragment = $.address.value();
        var parameters = $(document).getUrlParameters(fragment);
        var queryString = $(document).createQueryStringParameters(parameters);

        this.setFragment(url, queryString);
    },

    // example: {schemeUri}#/{conceptUri}?tab={tabName}
    // setFragment('{newConceptUri}', 'a=1&b=2') will return {schemeUri}#/{newConceptUri}?a=1&b=2
    setFragment: function(url, queryString) {
        var fragment = url;
        if (queryString && queryString !== '') {
            fragment = url + '?' + queryString;
        }

        $.address.value(fragment);
    }
}

var constants = {
    tab: 'tab',
    search: 'search',
    resource: 'resource',
    childResource: 'childResource'
}


var tabHelper = {

    init: function() {

        this.dataTabs = $('#data-tabs').tabs();

        this.setTabHeight();

        fragmentHelper.onChangeFunctions.push(function() {
            var tabCode = fragmentHelper.readProperty(constants.tab);

            var selectedCode = tabHelper.getSelectedTabCode();

            if (tabCode === selectedCode) // already selected
                return;

            tabHelper.selectTab(tabCode);
        });

        var selectedTabCode = fragmentHelper.readProperty(constants.tab);
        this.selectTab(selectedTabCode);

        this.dataTabs.bind('tabsshow', function(event, ui) {
            var tabCode = new String(ui.tab.hash).substring(1);
            var selectedCode = fragmentHelper.readProperty(constants.tab);
            if (!selectedCode && ui.index === 0) {
                // do nothing - assume that no tab code means we want the first tab (index === 0)
                return;
            }

            fragmentHelper.setProperty(constants.tab, tabCode.valueOf());
        });
    },

    selectTab: function(tabCode) {
        if (tabCode === undefined || tabCode === '') {
            this.dataTabs.tabs('select', 0);
            return;
        }

        this.dataTabs.tabs('select', tabCode);
    },

    getSelectedTabCode: function() {
        var index = this.dataTabs.tabs('option', 'selected');
        if (index === undefined) {
            index = 0;
        }

        var tabs = $('.data-tab', this.dataTabs);
        return tabs[index].id;
    },

    setTabHeight: function() {

        var tabs = $('.data-tab');
        if (tabs.length > 0) {
            utilities.stretchToBottom(tabs, true);
        }
    }
}



var tooltipHelper = {

    settings: { defaultDelimiter: ' : ' },

    init: function(settings) {
        if (settings) {
            this.settings = settings
        }

        this.setTooltips($('.helpIcon'), settings);
    },

    setTooltips: function(helpIcons, settings) {

        if (settings) {
            this.settings = settings
        }

        helpIcons.tooltip({
            showURL: false,
            fixPNG: true,
            extraClass: "tooltip",
            showBody: this.settings.defaultDelimiter,
            bodyHandler: this.bodyHandler
        }); //.bgiframe();
    },

    bodyHandler: function() {

        var text = tooltipHelper.splitTooltipText(this);

        var popup = $("<div />");
        var content = $("<span class='Content' />");

        for (var i = 0; i < text.body.length; i++) {
            if (i > 0) {
                content.append($("<br />"));
            }
            content.append(text.body[i]);
        }

        popup.append($("<span class='Heading'><span>" + text.heading + "</span></span>"));
        popup.append(content);

        return popup;
    },

    splitTooltipText: function(tooltip) {

        var text = {
            heading: '',
            body: new Array()
        }

        var title = tooltip.tooltipText;
        var settings = $.data(tooltip, "tooltip");

        if (settings.showBody) {
            var parts = title.split(settings.showBody);

            for (var i = 0; i < parts.length; i++) {
                if (i === 0) {
                    text.heading = parts[0];
                    continue;
                }
                text.body.push(parts[i]);
            }
        }
        else {
            body.push(title);
        }

        return text;
    }
}



var externalResourceLoader = {

    init: function(asycLoadPath, cssClass) {
        this.asycLoadPath = asycLoadPath;
        if (!cssClass) {
            this.cssClass = '.data-external';
        }
        else {
            this.cssClass = cssClass;
        }
    },


    loadingClass: 'loading',


    toLoadStack: [],


    load: function() {
        var externalData = $(this.cssClass);
        if (externalData.length === 0)
            return;

        for (var i = 0; i < externalData.length; i++) {
            var container = $(externalData[i]);

            this.toLoadStack.push(container);
        }

        this.loadNext();
    },


    loadNext: function() {
        if (this.toLoadStack.length === 0)
            return;

        var container = this.toLoadStack.pop();

        var anchor = container.children('.uri');
        var resourceDiv = container.children('.resource');
        resourceDiv.addClass(this.loadingClass);

        var uri = anchor.attr("href");
        var url = this.asycLoadPath + constants.resource + '=' + uri;

        var self = this;

        $.ajax({
            type: "GET",
            url: url,
            cache: false,
            success: function(data) {
                anchor.hide();
                resourceDiv.removeClass(self.loadingClass);
                resourceDiv.html(data);

                tooltipHelper.setTooltips(resourceDiv.find('.helpIcon'));

                self.loadNext();
            }
        });
    }
}


var formPostHelper = {
    init: function() {
        var form = $('form#changeLanguage');
        form.submit(function(event) {
            $(this).attr('action', window.location);
        });
    }
}


var tableSortHelper = {
    initOtherReferences: function() {
        var otherReferencesTable = $('#otherReferencesTable');
        if (otherReferencesTable.length !== 0) {
            otherReferencesTable.tablesorter({
                textExtraction: function(node) {
                    return $.trim($(node).text()); // extract data from markup and return it
                }
            });
        }
    }
}


//var languageHelper = {

//    preferredLanguage: "preferredLanguage",
//    defaultLanguage: "en",

//    init: function() {
//        var self = this;
//        $('div.language-options ul li').click(function() {
//            var language = $(this).html();
//            self.setLanguage(language);
//        });

//        var language = $.cookie(languageHelper.preferredLanguage);
//        if (language == null) {
//            language = this.defaultLanguage;
//        }

//        this.setLanguage(language);
//    },

//    setLanguage: function(language) {
//        var containers = $('ul.language-list');

//        $.cookie(languageHelper.preferredLanguage, language);

//        for (var i = 0; i < containers.length; i++) {
//            var children = $(containers[i]).children('li');

//            if (children.length <= 1) {
//                continue; // don't change lists with only one option
//            }

//            var currentLanguage = language;
//            var toShow = children.filter('[lang=' + currentLanguage + ']');
//            if (toShow.length === 0) {
//                currentLanguage = this.defaultLanguage;
//                toShow = children.has('[lang=' + currentLanguage + ']');
//            }

//            toHide = children.not('[lang=' + currentLanguage + ']');

//            toHide.hide();
//            toShow.show();

//            //            alert(language);

//            //            var toShow = lis.has('[lang=' + language + ']');
//            //            alert(toShow.length);
//            //            if (toShow.length === 0) {
//            //                language = this.defaultLanguage;
//            //                alert(language);
//            //                toShow = lis.has('[lang=' + language + ']');
//            //            }

//            //            if (toShow.length === 0) {
//            //                toShow = lis.first();
//            //            }

//            //            var toHide = lis.not('[lang=' + language + ']');

//            //            alert("toHide.length : " + toHide.length);
//            //            alert("toShow.length : " + toShow.length);

//            //            toHide.hide();
//            //            toShow.show();
//        }
//    }
//}
