var possible_portal_types = Array('Person', 'Institution', 'Resource',
                                  'Project', 'Network', 'Dataset');

var possible_criteria = Array('topics', 'disciplines', 'locations', 
                              'institutional_location', 'geographic_locations',
                              'country', 'people_other', 'institution_other',
                              'resource_other');

var element_cache = Array();

function $_(id) {
    var el = element_cache[id];
    if (el == null) {
        el = $(id);
        element_cache[id] = el;
    }

    return el;
}

var valid_criteria = {
    'Person': Array('topics', 'disciplines', 
                    'locations', 'institutional_location', 'people_other'),
    'Institution': Array('topics', 'country', 'institution_other'),
    'Resource': Array('topics', 'geographic_locations', 'resource_other'),
    'Project': Array('topics'),
    'Network': Array('topics'),
    'Dataset': Array('topics', 'geographic_locations')
 };

function toggle_search_tab(portal_type) {
    var was_selected = null;

    for (var x = 0; x < possible_portal_types.length; x++) {
        var possible = possible_portal_types[x];
        if (Element.hasClassName($_('tab-'+possible), 'selected'))
            was_selected = possible;
        Element.removeClassName($_('tab-'+possible), 'selected');
    }

    for (var x = 0; x < possible_criteria.length; x++) {
        var possible = possible_criteria[x];
        Element.removeClassName($_('subtab-'+possible), 'visible');
    }

    if (portal_type != was_selected) {
        Element.addClassName($_('tab-'+portal_type), 'selected');
        for (var x = 0; x < valid_criteria[portal_type].length; x++) {
            var possible = valid_criteria[portal_type][x];
            Element.addClassName($_('subtab-'+possible), 'visible');
        }
        $_('portal_types').value = portal_type;

        activate_criteria_tab(valid_criteria[portal_type][0]);
    } else {
        $_('portal_types').value = '';
        activate_criteria_tab('topics');
    }

    if (portal_type != was_selected) {
        var el = $_('portlet-search-item-types');
        if (el != null)
            el.innerHTML = portal_type;
    } else {
        var el = $_('portlet-search-item-types');
        if (el != null)
            el.innerHTML = 'All';
    }
}

function activate_criteria_tab(criteria) {
    for (var x = 0; x < possible_criteria.length; x++) {
        var possible = possible_criteria[x];
        Element.removeClassName($_('subtab-'+possible), 'selected');
        Element.removeClassName($_('criteria-'+possible), 'visible');
    }

    Element.addClassName($_('subtab-'+criteria), 'selected');
    Element.addClassName($_('subtab-'+criteria), 'visible');
    Element.addClassName($_('criteria-'+criteria), 'visible');
}

function toggle_advanced() {
    var search_block = $_('advanced-search-block');
    var search_link = $_('advanced-search-link');
    if (Element.hasClassName(search_block, 'visible')) {
        Element.removeClassName(search_block, 'visible');
        Element.removeClassName(search_link, 'active');
    } else {
        Element.addClassName(search_block, 'visible');
        Element.addClassName(search_link, 'active');
    }
}

function reset_search_portlet() {
    var portlet = $('portlet-advanced-search');
    if (portlet != null) {
        portlet.innerHTML = '<dt class="portletHeader"><span class="portletTopLeft"></span><span>Searching</span><span class="portletTopRight"></span></dt><dd class="portletItem" id="portlet-search-data"><dl id="portlet-search-terms"><dt>RDB Type(s)</dt><dd id="portlet-search-item-types">All</dd></dl></dd>';
    }
}

function clear_search() {
    var form = document.forms.rdb_search;
    reset_search_portlet();
    form.reset();
    unactivate_search_tab();
}

function unactivate_search_tab() {
    var was_selected = null;
    for (var x = 0; x < possible_portal_types.length; x++) {
        var possible = possible_portal_types[x];
        if (Element.hasClassName($_('tab-'+possible), 'selected'))
            was_selected = possible;
    }

    if (was_selected != null)
        toggle_search_tab(was_selected);
}

function preserve_search_criteria(form) {
    for (var x = 0; x < form.elements.length; x++) {
        var el = form.elements[x];
        var name = el.name;
        if (name.indexOf('form.') > -1 && name != 'form.portal_types' && name != 'form.search_text') {
            var value = el.value;
            if (value.length > 0) {
                var group = extract_group_from(name);
                toggle_portlet_value(group, value);
            }
        }
    }
}

function _init_search_form() {
    reset_search_portlet();

    activate_criteria_tab('topics');
    var el = document.forms.rdb_search['form.portal_types'];
    if (el != null && el.value != "")
        toggle_search_tab(el.value);

    preserve_search_criteria(document.forms.search_args);
}

function init_search_form() {
    if (window.addEventListener)
        window.addEventListener("load", _init_search_form, false);
    else
        window.attachEvent('onload', _init_search_form);
}

function _init_search_results_form() {
    reset_search_portlet();

    preserve_search_criteria(document.forms.search_args);

    var el = $_('portlet-search-item-types');
    var pt_el = document.forms.search_args['form.portal_types'];
    if (el != null && pt_el != null && pt_el.value.length > 0)
        el.innerHTML = pt_el.value;
}

function init_search_results_form() {
    if (window.addEventListener)
        window.addEventListener("load", _init_search_results_form, false);
    else
        window.attachEvent('onload', _init_search_results_form);
}
