﻿
var filterData, redirectUrl;
function initFacetedSearch(url, data) {
    filterData = data;
    redirectUrl = url;
}

function updateFilter(category, selected, type, id) {

    for (var i = 0; i < filterData.length; i++) {
        if (!filterData[i]) {
            break;
        }

        if (filterData[i].field == category) {

            var found = false;

            for (var j = filterData[i].values.length - 1; j >= 0; j--) {
                if (filterData[i].values[j] == id) {
                    filterData[i].values.splice(j, 1);
                    found = true;
                    break;
                }
            }
            if (!found) {
                filterData[i].values.push(id);
            }
        }
    }

    updateFromFilter();
}

function updateRangeFilter(category, selected, type, ids) {

    var filter = {
        field: category,
        type: type,
        values: ids
    }

    for (var i = 0; i < filterData.length; i++) {
        if (!filterData[i]) {
            break;
        }

        if (filterData[i].field == category) {
            filterData[i] = filter;
        }
    }

    updateFromFilter();
}

function updateFromFilter() {
    var filter = buildFilter();

    if (typeof (customUpdate) == 'function') {
        customUpdate(filter);
    }
    else {
        document.location.href = redirectUrl + (redirectUrl.indexOf('?') > -1 ? '&' : '?') + 'filter=' + encodeURIComponent(filter);
    }
}

function getSelectRange(a, b) {
    var arr = [];
    var aSelectIndex = jqClix(a).attr('selectedIndex');
    var bSelectIndex = jqClix(b).attr('selectedIndex');

    for (var i = aSelectIndex; i <= bSelectIndex; i++) {
        arr.push(jqClix(a).get(0).options[i].value);
    }

    return arr;
}

function setSelectedRange(select, values) {

    jqClix('#' + select + ' option').removeAttr('selected');

    for (var i = 0; i < values.length; i++) {
        jqClix('#' + select + " option[value='" + values[i] + "']").attr('selected', 'selected');
    }
}

function toggleExtraItems(categoryId, maxItems, off) {
    var selector = (off ? ':visible' : '');
    var items = jqClix('#' + categoryId + '>li' + selector + ':gt(' + (maxItems - 1) + ')');
    if (off)
        items.hide();
    else
        items.show();
}


function initToggleButton(categoryId, maxItems, moreText, lessText) {
    jqClix('#' + categoryId + '>li.nonselected>ul.subitems').hide();

    if (maxItems <= 0)
        return;

    jqClix('#' + categoryId + '>li.nonselected:visible:gt(' + (maxItems - 1) + ')').hide();
    jqClix('#' + categoryId + '>li>a.opensubitems').click(function () {
        var self = jqClix(this);
        self.toggleClass('closed')
			.toggleClass('opened');

        jqClix('ul.subitems', self.attr('parentNode')).toggle();
    });

    jqClix('#a' + categoryId).click(function () {
        var self = jqClix(this);
        var visible = self.attr('visible') == 'true';
        toggleExtraItems(categoryId, maxItems, visible);
        self.text(visible ? moreText : lessText)
        self.attr('visible', !visible);
    });
}

function buildFilter() {
    var filters = [];

    for (var i = 0; i < filterData.length; i++) {
        if (!filterData[i]) {
            break;
        }

        var field = filterData[i].field;
        var type = filterData[i].type;
        var values = filterData[i].values;

        if (!values.length)
            continue;

        if (type == 'a') {
            filters.push('[' + field + '][[ID] In (' + values.join(',') + ')]');
        }
        else if (type == 'b') {
            var subfilters = [];
            for (var j = 0; j < values.length; j++) {
                subfilters.push('[' + field + '] = \'' + values[j].replace(/'/g, "''") + '\'');
            }

            if (subfilters.length) {
                filters.push('(' + subfilters.join(' Or ') + ')');
            }
        }
        else if (type == 'c') {
            filters.push('[' + field + '] In (' + values.join(',') + ')');
        }
    }

    return filters.length ? ('(' + filters.join(' And ') + ')') : '';
}

function buildSearchFilter(id, jobsearch_collectionfields, redirectUrl) {

    jqClix('#' + id + ' .input-transfer-left option').removeAttr('selected');
    jqClix('#' + id + ' .input-transfer-right option').attr('selected', 'selected');

    var all = jqClix('#' + id + ' .searchselectors *').not(".searchselectors input[name='query']").serializeArray();
    var filters = [];
    var groupFilters = [];
    var filter = '';
    var fromzip, maxdist;

    for (var i = 0; i < all.length; i++) {

        if (!all[i].value || all[i].value.length == 0 || all[i].name.indexOf('min_') === 0 || all[i].name.indexOf('max_') === 0)
            continue;

        if (all[i].name.toLowerCase() == 'fromzip') {
            fromzip = all[i].value;
        }
        else if (all[i].name.toLowerCase() == 'fromzip.maxdist') {
            maxdist = all[i].value;
        }
        else {
            var relation = all[i].name;
            var idValue = all[i].value;

            if (!filters[relation]) {
                filters[relation] = [];
            }
            filters[relation].push(idValue);
        }
    }

    var searchAutoFill = false;

    if (typeof (regionId) != 'undefined' && regionId) {
        var relation = 'Regions';
        if (!filters[relation]) {
            filters[relation] = [];
        }
        filters[relation].push(regionId);

        searchAutoFill = true;
    }

    if (typeof (functionNameId) != 'undefined' && functionNameId) {
        var relation = 'FunctionName';
        if (!filters[relation]) {
            filters[relation] = [];
        }
        filters[relation].push(functionNameId);

        searchAutoFill = true;
    }

    for (var f in filters) {
        filter += (filter ? ' And ' : '') + '(';
        if (jqClix.inArray(f, jobsearch_collectionfields) >= 0) {
            filter += '[' + f + '][[ID] In (' + filters[f].join(',') + ')]';
        }
        else {
            filter += '[' + f + '] In (\'' + filters[f].join('\',\'') + '\')';
        }

        filter += ')';
    }

    var q = '';
    if (!searchAutoFill) {

        //build querystring
        var phrases = findSearchPhrases(id);

        if (phrases.length > 0) {
            var searchOption = jqClix('#' + id + ' .searchoptions').attr('value');
            if (searchOption == '1') {
                for (var i = 0; i < phrases.length; i++) {
                    phrases[i] = phrases[i].replace(/ /gi, '* ');
                    phrases[i] += '*';
                }
            }
            q = 'query=' + encodeURIComponent('(' + phrases.join(') OR (') + ')') + '&';
        }
    }

    q += (q ? '' : 'justfilter=true&') + 'filter=' + encodeURIComponent(filter);

    if (fromzip && fromzip.length) { q += '&fromzip=' + fromzip };
    if (maxdist && maxdist.length) { q += '&fromzip.maxdist=' + maxdist };
    if (jqClix('#' + id + ' .titleonly input').is(':checked')) { q += '&searchfields=Title' };
    if (q && q.length) { document.location.href = redirectUrl + q.replace(/%20/g, "+") };
}

function findSearchPhrases(id) {
    var phrases = [];
    jqClix('#' + id + '_phrases li a').each(function () {
        phrases.push(jqClix(this).text());
    });

    var searchInput = jqClix('#' + id + '_txtsearch');
    var searchValue = searchInput.val();
    if (searchValue && searchValue != '' && !searchInput.hasClass('highlight')) {
        phrases.push(searchValue);
    }

    return phrases;
}

function addSearchPhrase(searchId, phrasesId) {
    var searchField = jqClix('#' + searchId);
    if (!searchField || searchField.val() == '' || searchField.hasClass('highlight'))
        return;

    jqClix('#' + phrasesId)
        .append('<li><a href="javascript://" onclick="removeSearchPhrase(this);">' + searchField.val() + '</a></li>')
        .show();

    searchField.val('');
}

function removeSearchPhrase(item) {
    var li = jqClix(item).parent('li');
    var ul = li.parent('ul');
    if (li.parent('ul').find('li').length == 1) {
        ul.hide();
    }

    li.remove();
}

function splitColumns(id, columns) {

    var listItems = jqClix('#' + id + ' li');
    var itemCount = listItems.length;
    var columnLength = Math.ceil(listItems.length / columns);

    for (var i = 0; i < itemCount; i++) {
        var self = jqClix(listItems[i]);
        self.addClass("column" + Math.floor(i / columnLength));
        if (i != 0 && i % columnLength == 0) {
            self.css('margin-top', '-' + parseInt(self.css('line-height')) * columnLength + 'px');
        }
    }
}

function sortSelect(id) {
    var selElem = document.getElementById(id);
    var tmpAry = new Array();
    for (var i = 0; i < selElem.options.length; i++) {
        tmpAry[i] = new Array();
        tmpAry[i][0] = selElem.options[i].text;
        tmpAry[i][1] = selElem.options[i].value;
    }
    tmpAry.sort();
    while (selElem.options.length > 0) {
        selElem.options[0] = null;
    }
    for (var i = 0; i < tmpAry.length; i++) {
        var op = new Option(tmpAry[i][0], tmpAry[i][1]);
        selElem.options[i] = op;
    }
    return;
}

var initToggleButtonCalls = [];
(function () {
    // log all calls to setArray
    var proxied = initToggleButton;
    initToggleButton = function (categoryId, maxItems, moreText, lessText) {
        initToggleButtonCalls.push(arguments);
        return proxied.apply(this, arguments);
    };
})();
