/* base.html functions
 * These functions are available on every page
 *
 * They are used for global tasks (like setting languages) or as
 * common functions used on multiple pages.
 */


/***********************************************/
/*          HELPER FUNCTIONS                   */
/***********************************************/

/*
* This is forEach fix for IE.
*/
if (!Array.prototype.forEach) {
    Array.prototype.forEach = function (fun /*, thisp*/) {
        var len = this.length;
        if (typeof fun != "function")
            throw new TypeError();
        var thisp = arguments[1];
        for (var i = 0; i < len; i++) {
            if (i in this)
                fun.call(thisp, this[i], i, this);
        }
    };
}

/*
* We use this to check if GET variables are set.
* This is currently used for the scrollto method.
*/
function getUrlVars() {
    var url = new URI();
    var vars = url.search(true);
    return vars;
}

function getUrlVar(name) {
    return getUrlVars()[name];
}

function url_set_param(url, key, value) {
    var newurl = new URI(url);
    var urlparams = newurl.search(true);
    urlparams[key] = encodeURIComponent(value).replace(/%20/g, "+");
    newurl.search(urlparams)
    return newurl;
}

function closepopup() {
    self.close();
}

function getUri(url) {
    if (url && server_prefix) {
        return new URI(server_prefix + url);
    } else {
        return new URI();
    }
}


/********** END HELPER FUNCTIONS *******************/



function content_resize() {
    var $this = $("#tab_contents");
    if ($this.length) {
        var offset_y = 50;
        // MSIE[6|7] hack
        if ($.browser.msie && $.browser.version <= 7) offset_y = -offset_y;
        var height = $(window).height() - $this.offset().top - offset_y;
        $this.height(height);
    }
}


function tab_clicked(e) {
    var tab_name = this.id.match(/tab_(.*)/)[1];
    var newurl = getUri('/edition-' + selected_edition + '/' + tab_name + '/');
    window.location = newurl;
}


function edition_version_change(e) {
    var editionVersion = $(this).val();
    if (editionVersion != "0") {
        var editionurl = getUri("/edition-" + $(this).val());
        window.location = editionurl;
    }
}

function official_version_select(e) {
    var $selector = $('#official_versions option:selected');
    var current_request = getUri();
    var edition_url = $selector.data('versionUrl');
    var new_request = new URI(edition_url + request_url);
    new_request.search(current_request.search(true))
    new_request = url_set_param(new_request, "lang", $selector.val());
    window.location = new_request;
}


function detectClassHeading() {
    if (getUrlVar("class_number") != null) {
        scroll_to_class_heading(parseInt(getUrlVar("class_number")));
    }
}

function detectGors() {
    if (getUrlVar('gors') != null) {
        scroll_to_indication(getUrlVar('gors'));
    }
}


function interaction_bar_checkbox(e, box_name, on_value, off_value, refresh) {
    if ($("#" + box_name + "_checkbox").is(":checked")) {
        var new_value = on_value;
        $('.' + box_name).show();
    }
    else {
        var new_value = off_value;
        $('.' + box_name).hide();
    }
    $('input[name="' + box_name + '"]').val(new_value);
    var url = getUri();
    var newurl = url_set_param(url, box_name, new_value);
    if (!refresh) {
        History.replaceState({}, document.title, newurl);
        /* Dirty Hack: We're calling the taxonomy update_params regardless of what
         * interaction bar is being serialized. This works only because the options
         * for the taxonomy tab is a superset of the interaction bar options for other tabs.
         */
        var url = getUri("/taxonomy/update_params/");
        url = url_set_param(url, box_name, new_value);
        $.get(url);
        detectClassHeading();
    }
    else {
        var url = getUri();
        var newurl = url_set_param(url, box_name, new_value);
        window.location = newurl;
    }
}


/* TAXONOMY TAB FUNCTIONS ---------------------------------------------------*/
function toggle_explanatory_notes(e) {
    interaction_bar_checkbox(e, "explanatory_notes", "show", "hide", false);
}


function toggle_basic_numbers(e) {
    interaction_bar_checkbox(e, "basic_numbers", "show", "hide");
}


function toggle_pagination(e) {
    interaction_bar_checkbox(e, "pagination", "yes", "no", true);
}


function toggle_hierarchy_group(e) {
    $(this).parent().toggleClass("collapsed");
    $(this).parent().toggleClass("expanded");
}


function go_to_page(page_number) {
    var url = getUri();
    var newurl = url_set_param(url, "page", page_number);
    window.location = newurl;
}


/* SEARCH TAB FUNCTIONS -----------------------------------------------------*/
function select_search_classes(start, end) {
    $('#class_boxes input:checkbox').prop("checked", false);
    for (var i = start; i <= end; i = i + 1) {
        $('#class_box_' + i).prop("checked", true);
    }
}


function toggle_search_button(e) {
    if ($(this).val().match(/^\s*\d\d\d\d\d\d\s*$/)) {
        $('#select_buttons').hide();
        $('#term_search_button').hide();
        $('#basic_number_search_button').show();
        $('#class_boxes input').attr('disabled', true);
        $('#info_files').attr('disabled', true);
        $('#exact_search').attr('disabled', true);
        $('#search_row input[type=radio]').attr('disabled', true);
    }
    else {
        $('#select_buttons').show();
        $('#basic_number_search_button').hide();
        $('#term_search_button').show();
        $('#class_boxes input').removeAttr('disabled');
        $('#info_files').removeAttr('disabled');
        $('#exact_search').removeAttr('disabled');
        $('#search_row input[type=radio]').removeAttr('disabled');
    }
}


function submit_search(e) {
    var params = $('#interaction_bar_form').serialize();
    if ($("#q").val().match(/^\s*\d\d\d\d\d\d\s*$/)) {
        var url = "basic_number/?";
    }
    else {
        var url = "results/?";
    }
    var search_params = $('#search_form').serialize();
    params = params + "&" + search_params;
    window.location = url + params;
    return false;
}


/* HELPER FUNCTIONS ---------------------------------------------------------*/
function load_tab_content(url, indication, extra_params) {
    // Could be ajaxified in some cases, but that tends to mess up history too much
    // The history plugin is buggy enough that I don't like to use it
    var params = $('#interaction_bar_form').serialize();
    if (params.length) {
        url = url + '?' + params;
    }
    if (indication) {
        url = url + '&gors=' + indication
    }
    if (extra_params && extra_params.length) {
        for (var key in extra_params) {
            url = url + "&" + key + "=" + extra_params[key];
        }
    }
    window.location = url;
}


function load_info_file_parent(url, indication) {
    var params = window.opener.$('#interaction_bar_form').serialize();
    if (params.length) {
        url = url + '?' + params;
    }
    if (indication) {
        url = url + '&gors=' + indication
    }
    window.opener.location = url;
    window.opener.focus();
    // WARNING: FF4+ prevernt window raising and lower by default
    // See: http://stackoverflow.com/a/7319439
    // And: https://bugzilla.mozilla.org/show_bug.cgi?id=357814
}


function show_info_file(e) {
    //info_file_type, file_number, highlight_query
    e.stopPropagation();
    var info_file_type = $(e.target).data('type');
    var file_number = $(e.target).attr('data-number');
    var highlight_query = $(e.target).data('q');

    var url = getUri("?notion=information_files&version=" + escape(selected_edition));
    if (info_file_type == "hierarchy_group") {
        url += "hierarchy_group/";
    }
    else if (info_file_type == "class") {
        url += "&class_number=" + escape(file_number);
    }
    else if (info_file_type == "gors") {
        url += "&gors=" + escape(file_number);
    }
    if (highlight_query) {
        url += "&highlighted=true";
    }
    url = url + "&lang=" + escape($('input:radio[name=lang]:checked').val());
    if (highlight_query) {
        url = url + "&q=" + escape(highlight_query);
    }
    window.open(url, "", "height=768,width=744,resizable=yes,scrollbars=yes,status=no");
}

/** NICEPUB 2014 REFACTORINGS **/

/*
* Scroll to class heading, this is used when viewing the class headings tab
* when the user selects a class, the tab is focused to the selected class.
*/

function scroll_to_class_heading(class_number, toloadSpecificClass) {
    // We set the class number in the url in case we toggle options.
    /*var url = getUri();
    $('#tab_contents').scrollTo('#class_heading_'+class_number);
    var newurl = url_set_param(url, "class_heading", class_number)
    History.replaceState({}, document.title, newurl);*/

    //By Dinesh Verma
    scrollToBasicNumber = '';
    if (toloadSpecificClass == true) {
        PF("ncl_tabVar").select(0);
        ncl_ajaxClassloading([{name: 'ClassNum', value: class_number}]);
    } else {
        $("[id='ncl_content_form:nicepub_tabs:ClassHeadingsScrollable']").scrollTo('#class_heading_' + class_number);

        var iSelectedTabIndex = PF("ncl_tabVar").cfg.selected;
        if (iSelectedTabIndex == 2)//For Class Headings tab
        {
            $("[id='ncl_content_form:nicepub_tabs:ClassHeadingsScrollable']").scrollTo('#class_heading_' + class_number);
        } else if (iSelectedTabIndex == 0)//For Classes  tab
        {
            ncl_ajaxClassloading([{name: 'ClassNum', value: class_number}]);
        } else if (iSelectedTabIndex == 4)//For Modification  tab
        {
            ncl_ajaxModifcationloading([{name: 'ClassNum', value: class_number}]);
        }
    }
}

var scrollToBasicNumber = '';

function scroll_to_basic_Number_in_class(classNumber, basicNumber) {
    scroll_to_class_heading(classNumber, true);
    scrollToBasicNumber = basicNumber;
}

function showAjaxLoader() {
    PF("blockUIWidget").show();
    $("[id='ncl_content_form:loadingDialog']").attr('style', 'z-index: 5001;top: 50%;left: 50%;');
}

function OnCompleteOfAjax() {
    if (scrollToBasicNumber.length > 0) {
        $("[id='ncl_content_form:nicepub_tabs:ClassScrollable']").scrollTo('#' + scrollToBasicNumber);
        var scrollToBasicNumberID = "#" + scrollToBasicNumber;
        $(scrollToBasicNumberID).addClass('highlighted');
        $(scrollToBasicNumberID + '-i1').addClass('highlighted');
        $(scrollToBasicNumberID + '-i2').addClass('highlighted');

    }
    hideAjaxLoader();
}

function hideAjaxLoader() {
    PF("blockUIWidget").hide();
}

function check_Selected_Edition(selValue) {
    if (selValue.length != 0) {
        $("[id='ncl_leftpanel_form:ncl_btn_editionChnage']").click();
    }

}

function loadGoodsServiceAlphabetically(alphabet, goodOrService) {
    ncl_ajaxforAlphabetGoodsService([{name: 'Alphabet', value: alphabet}, {
        name: 'GoodOrService',
        value: goodOrService
    }]);
}

function scroll_to_search_class(class_number) {
    var offset = $('#class_heading_' + class_number).position();
    var $this = $("#tab_contents")
    $this.scrollTop(offset.top - $this.offset().top);
}

function scroll_to_indication(indication) {
    // We set the class number in the url in case we toggle options.
    var url = getUri();
    var newurl = url_set_param(url, "gors", indication)
    var $gors_indication = $('#gors_' + indication);
    $gors_indication.siblings('div').addClass("highlighted");
    var $parents = $('#gors_' + indication).parents(".hierarchy_group");
    $parents.removeClass('collapsed').addClass('expanded');
    $gors_indication.parent('li').siblings().map(function () {
        $(this).removeClass('gors-hidden').addClass('gors').show();
    });
    $gors_indication.parent('li').removeClass('gors-hidden').addClass('gors').show();
    $('#tab_contents').scrollTo('#gors_' + indication, {offset: {top: -18}});
    History.replaceState({}, document.title, newurl);
}

function showLinksWindow() {
    var params_window = $.map({
        fullscreen: 'no',
        tooltbar: 'no',
        location: 'yes',
        directories: 'no',
        status: 'no',
        menubar: 'no',
        scrollbars: 'no',
        resizable: 'no',
        copyhistory: 'no',
        width: 750,
        height: 350
    }, function (value, key) {
        return key.toString() + '=' + value;
    }).join(', ');

    var url = new URI(server_prefix + "/edition-" + selected_edition + "/bridge/");
    var lang = $('input:radio[name=lang]:checked').val();
    url = url_set_param(url, "lang", lang);
    window.open(url, "", params_window);
}


function showBridge(indication_number) {

    var params_window = $.map({
        fullscreen: 'no',
        tooltbar: 'no',
        location: 'yes',
        directories: 'no',
        status: 'no',
        menubar: 'no',
        scrollbars: 'no',
        resizable: 'no',
        copyhistory: 'no',
        width: 750,
        height: 350
    }, function (value, key) {
        return key.toString() + '=' + value;
    }).join(', ');

    var url = new URI(server_prefix + "/edition-" + selected_edition + "/bridge/" + indication_number + "/");
    var lang = $('input:radio[name=lang]:checked').val();
    url = url_set_param(url, "lang", lang);
    window.open(url, "", params_window);
}

function toggle_hierarchy_group() {
    var $li = $(this).parent('li');
    if ($li.hasClass('expanded')) {
        $li.children('ul:first').children('.gors').map(function () {
            $(this).removeClass('gors').addClass('gors-hidden').hide();
        });
        $li.removeClass('expanded').addClass('collapsed');
    } else if ($li.hasClass('collapsed')) {
        $li.children('ul:first').children('.gors-hidden').map(function () {
            $(this).removeClass('gors-hidden').addClass('gors').show();
        });
        $li.removeClass('collapsed').addClass('expanded');
    }
}

document.addEventListener('wipoLanguageChange', function (e) {
    var current_request = getUri();
    var new_request = url_set_param(current_request, "menulang", e.target.language);
    window.location = new_request;
});
/** END NICEPUB 2014 REFACTORINGS **/
