////////////////////////////////////////////////////////////////////////////////
//
// Javascript file for compere
//
////////////////////////////////////////////////////////////////////////////////
var base_url = "/sinatra/compere/";
var SEARCH_CONTROL = "_srch_";

function getobj(objname)
{
    return ns6?document.getElementById(objname):document.all[objname];
}

var __uri_encode_apos_regexp = /'/;
function uri_encode(s)
{
    return encodeURIComponent(s).replace(__uri_encode_apos_regexp, '%27');
}


function switchCompanyMode(force_display, reset)
{
   var lookup_fieldname   = "search_company_lookup"
   var freetext_fieldname = "search_company"

   var lookup_container   = document.getElementById("company_lookup_container");
   var freetext_container = document.getElementById("company_freetext_container");
   var mode               = document.getElementById("company_mode");

   var description        = document.getElementById("searchfield_description_" + lookup_fieldname);

   var reset_fields       = (typeof(reset) == "undefined") || reset;


   var view_mode          = (force_display ? force_display :
                            (lookup_container.style.display == "inline" ? "freetext": "lookup"));

   var competitor_set     = document.getElementById("_srch_.saved_set");
   var competitor_selected = 0;
   if (competitor_set)
   {
       competitor_selected = competitor_set.selectedIndex;
   }

   if (view_mode == "lookup")
   {       
       lookup_container.style.display = "inline";                     // display lookup
       freetext_container.style.display = "none";                     // hide freetext

       mode.innerHTML="freetext";                                     // display 'switch to...' text

       description.innerHTML="Company Lookup";                        // set current description
       if (reset_fields && competitor_selected < 1)
       {
           resetCompanyFields(freetext_fieldname, lookup_fieldname);      // clear both freetext and lookup fields
       }

       if (competitor_selected > 0)
       {
           document.getElementById(SEARCH_CONTROL + ".search_company_lookup_lookup").disabled = true;
       }

   }
   else
   {       
       lookup_container.style.display = "inline";                     // display lookup
       lookup_container.style.display = "none";                       // hide lookup
       freetext_container.style.display = "inline";                   // display freetext
       document.getElementById(SEARCH_CONTROL + ".search_company_lookup_lookup").disabled = false;
       
       var saved_set = document.getElementById(SEARCH_CONTROL + ".saved_set");
       if (saved_set) saved_set.checked = false;

       mode.innerHTML="lookup";                                       // display 'switch to...' text

       description.innerHTML="Company Freetext";                      // set current description
       if (reset_fields && competitor_selected < 1)
       {
           resetCompanyFields(freetext_fieldname, lookup_fieldname);      // clear both freetext and lookup fields
       }

       if (competitor_selected > 0)
       {
           document.getElementById("search_company").disabled = true;
       }
       else
       {
           document.getElementById("search_company").disabled = false;
       }
   }
}

function resetCompanyFields(freetext_fieldname, lookup_fieldname)
{
    // reset the freetext
    var freetext_field = document.getElementById(freetext_fieldname);
    if (freetext_field)
        freetext_field.value="";

    // reset the lookup
    resetFieldLookup(lookup_fieldname);

}


function selectCustomReport(obj, num_tabs)
{
    var selected_id = obj.options[obj.selectedIndex].id;
    selectTab(selected_id, num_tabs);
}

function lookupValueSelected(object)
{
    if (object)
    {
        var fieldname = object.name;
        var value = object.value;

        if (object.checked == false)
        {
            var forminputs = document.getElementsByTagName("input");

            for (i = 0;i < forminputs.length;++i)
            {
                if (forminputs[i].type=='hidden'
                    && (forminputs[i].name == fieldname)
                    && (forminputs[i].value == value))
                {
                    forminputs[i].value='';
                }
            }
        }
    }
}

function lookupFieldSelection( fieldname, state )
{
    var results = document.getElementById(fieldname + "_values");

    if (results)
    {
        var inputs = results.getElementsByTagName("input");

        for (i = 0;i < inputs.length;++i)
        {
            // set selected checkbox state
            if (inputs[i].type=='checkbox')
            {
                inputs[i].checked = state;
            }
        }
    }

    if (state == false)
    {
        var forminputs = document.getElementsByTagName("input");
        // if we are clearing the selection, make sure any previous hidden
        // values are reset.
        for (i = 0;i < forminputs.length;++i)
        {
            if (forminputs[i].type=='hidden' && (forminputs[i].name == fieldname))
            {
                forminputs[i].value='';
            }
        }
    }
}


function resetFieldLookup( fieldname )
{
   var results  = document.getElementById(fieldname + "_values");
   var container  = document.getElementById(fieldname + "_container");
   var metainfo = document.getElementById(fieldname + "_metainfo");

   var lookup_input =  document.getElementById(SEARCH_CONTROL + "." + fieldname + "_lookup");

   if (lookup_input)
   {
       // clear lookup text
       lookup_input.value="";
   }

   if (results)
   {
       // remove selections
       lookupFieldSelection( fieldname, false );

       // hide results
       results.style.display="none";
       container.style.display="none";
   }

   if (metainfo)
   {
       // hide metainfo
       metainfo.style.display="none";

   }


}

// Bit hacky for now, this should not be hardcoded but written out
// by the search page (we only have one lookup value for now so its not
// too bad).

var timeouts = new Object;

// This function gets called by the onKeyUp event. To stop multiple
// requests being sent to the server, use a timeout - clear it each time its
// called then set it again.
function submitFieldLookup(event, fieldname, fieldname_value)
{
    if (typeof(timeouts[fieldname]) != "undefined")
    {
        clearTimeout(timeouts[fieldname]);
        delete timeouts[fieldname];
    }

    var func = "executeFieldLookup('" + fieldname + "','" + fieldname_value + "')";
    timeouts[fieldname] = setTimeout(func, 400);
}


var send_sequence = 1;
var rx_sequence = 0;

function executeFieldLookup( fieldname, fieldname_value, fieldname_values)
{
    // build url to lookup module
    var url = base_url + "company_lookup/";
    var results = document.getElementById(fieldname + "_values");
    var container = document.getElementById(fieldname + "_container");
    var metainfo = document.getElementById(fieldname + "_metainfo");
    // this field may have an initial text query, so check for this
    var obj = document.getElementById(fieldname_value + "_lookup");
    var mode = document.getElementById(fieldname_value + "_mode");
    var parent_lookup = document.getElementById(SEARCH_CONTROL + "." + fieldname_value + "_holding_only");

    var do_xml_request = false;

    var form_args = "fieldname=" + fieldname + "&sequence=" + send_sequence;
    send_sequence++;

    if (obj && obj.value.length)
    {
        form_args += "&lookup=" + escape(obj.value);
        do_xml_request = true;

        if (mode && mode.checked)
        {
            form_args += "&mode=substring";
        }

        if (parent_lookup)
        {
            form_args += "&parent_lookup";
        }
    }

    // append any previously selected values
    if (results)
    {
        // previously selected values
        var inputs = results.getElementsByTagName("input");
        for (i = 0;i < inputs.length;++i)
        {
            var inp = inputs[i];
            if (inp.type=='checkbox' && (inp.checked==true))
            {
                form_args+="&id=" + inp.id;
                do_xml_request = true;
            }
        }

       // previous selected values from original search criteria
       for (i = 0;i < inputs.length;++i)
       {
            var hidden_name = fieldname + "_hidden";
            if (inputs[i].type=='hidden' && (inputs[i].name == hidden_name))
            {
                form_args+="&id=" + inputs[i].value;
                do_xml_request = true;
            }
        }

        if (fieldname_values)
        {
            // previous selected values from original search criteria
            for (i = 0;i < fieldname_values.length;++i)
            {
               form_args+="&id=" + fieldname_values[i];
               do_xml_request = true;
            }
        }
    }


    // clear the lookup text else this will get submitted
    if (obj)
    {
        //obj.value = "";
    }

    if (do_xml_request)
    {
        var req = new AsynchRequest(url,

        //function on success - using response_text
        function(response_text, xmlhttp)
        {
          var sequence = parseInt(xmlhttp.getResponseHeader("X-Sequence"));
          if (sequence <= rx_sequence)
            return;
          rx_sequence = sequence;

          if (metainfo)
          {
              metainfo.style.display="block";
          }

          container.style.display="block";
          container.className="lookup_container";

          results.innerHTML=response_text;
          results.style.display="block";

        },

        //function on start of load
        function()
        {
          //results.innerHTML="<span class='alert'>Please wait, searching...</span>";
        },

        //function on error
        function(error_state)
        {
         results.innerHTML="<span class='alert'>An error occured, please try again.</span>";
        },

        "POST",
        form_args
      );

      req.send();
    }
    return false;
}

function submitInquiry()
{
    // valid form
    var form = document.emailForm;

    if (form.firstname.value.length &&
        form.email.value.length &&
        form.telephone.value.length)

    {
        form.submit();
    }
    else
    {
        alert("Please fill in all required fields");
    }
}

function submitFeedback()
{
    // valid form
    var form = document.feedbackForm;

    if (form.firstname.value.length &&
        form.email.value.length && form.comments.value.length)

    {
        form.submit();
    }
    else
    {
        alert("Please fill in all required fields");
    }
}

function radioButtonjumpTo(obj)
{
    // get selected value to jump to
    if (obj && obj.value.length)
        location.href=obj.value;
}

function jumpsite()
{
    var idx=document.forms['sites'].elements['site_list'].selectedIndex;
    var url=document.forms['sites'].elements['site_list'].options[idx].value;
    if (url != 'none')
    {
        var winname='newwindow';
        window.open(url,winname);
    }
}

function selectVariants( status )
{
    var variants = document.getElementsByTagName("input");

    for (i = 0;i < variants.length;++i)
    {
        if (variants[i].type=='checkbox')
        {
            if ((variants[i].name.substr(0,4) == "var_") || (variants[i].name == "campaign_text"))
            {
               variants[i].checked=status;
               selectVariantComponent(variants[i]);
            }
        }
    }

    return false;
}

function selectImages( status )
{
    var images = document.getElementsByTagName("input");

    for (i = 0;i < images.length;++i)
    {
        if (images[i].type=='checkbox')
        {
            if (images[i].name.substr(0,4) == "img_")
            {
                images[i].checked=status;
                selectVariantComponent(images[i]);
            }
        }
    }
}


function setDownloadType( obj )
{
    if (obj)
    {
        // Default value
        var download_type = obj.options[obj.selectedIndex];
        var form = document.forms["download_form"];
        form.campaign_download.value=download_type.value;

        var download_message          = document.getElementById("download_message");
        var custom_download_container = document.getElementById("custom_download_container");

        // Set download message (displays a message telling the user what they are downloading)
        //download_message.innerHTML = download_type.innerHTML;

        // If we are downloading selected items, show tick boxes

        if (download_type.value == "selected_only" || download_type.value == "-1")
        {
            custom_download_container.style.display="";
        }
        else
        {
            custom_download_container.style.display="none";
        }
        
        // if download method contains images, show image quality drop down
        var image_quality_container = document.getElementById("image_download_quality");
        
        if (download_type.value == "selected_only" || download_type.value == "images_only"
          || download_type.value == "everything" || download_type.value == "-1")
        {
            image_quality_container.style.display="";
        }
        else
        {
            image_quality_container.style.display="none";
        }
        
    }       
}

function setFileFormat( obj )
{
    if(obj)
    {
        var file_format = obj.options[obj.selectedIndex].value;
        var form = document.forms["download_form"];

        if (file_format == "pdf")
        {
            form.action="postpdf/download.pdf";
        }
        else
        {
            form.action="postrtf/download.rtf";
        }
    }
}

function submitCustomDownload()
{
    var form = document.forms["download_form"];

    var inputs = form.getElementsByTagName("input");

    var file_format = "";
    var image_download_quality = "";
    var selected_variants = [];
    var selected_images = [];
    var include_campaign_text = 0;
    for (var i = 0; i < inputs.length; i++)
    {
        var input = inputs[i];
        var name = input.name;

        if (input.type == "checkbox" && input.checked)
        {
            if (name == "campaign_text")
            {
                include_campaign_text = 1;
            }
            else if (name.search("var_") != "-1")
            {
                selected_variants.push(name);
            }
            else if (name.search("img_") != "-1")
            {
                selected_images.push(name);
            }
        }
        else if (input.type == "radio" && input.checked)
        {
            if (name == "file_format")
            {
                file_format = input.value;
            }
            else if (name == "image_download_quality")
            {
                image_download_quality = input.value;
            }
        }
    }

    var text_count = selected_variants.length;
    var image_count = selected_images.length;

    var do_text = (text_count > 0) || include_campaign_text;

    var campaign_download = "";
    if (do_text && image_count == 0)
    {
        campaign_download = "text_only";
    }
    else if (!do_text && image_count > 0)
    {
        campaign_download = "images_only";
    }
    else if (do_text && image_count > 0)
    {
        campaign_download = "selected_only";
    }
    else
    {
        alert("Please select at least one component to include in the download.")
        return false;
    }


    if (validateCustomDownload(file_format, image_download_quality, campaign_download))
    {
        var form = document.forms["download_form"];

        if (file_format == "rtf")
        {
            document.getElementById("campaign_download").value = "selected_only";
            form.action = "/sinatra/compere/postrtf/download.rtf";

            return true;
        }
        else
        {
            // is a PDF download
            var item_id = document.getElementById("id").value;
            var url = "/pdf_client/?id=" + item_id;
            url = url + "&image_download_quality=" + image_download_quality;
            url = url + "&campaign_download=" + campaign_download;
            url = url + "&campaign_text=" + include_campaign_text;

            url = url + "&selected_variants=0.0|";
            if (text_count > 0)
            {
                for (var v_ind = 0; v_ind < text_count; v_ind++)
                {
                    url = url + selected_variants[v_ind].substr(4) + "|"
                }
            }

            url = url + "&selected_images=0|";
            if (image_count > 0)
            {
                for (var i_ind = 0; i_ind < image_count; i_ind++)
                {
                    var string_parts = selected_images[i_ind].split("\.");
                    url = url + string_parts[2] + "|";
                }
            }

            downloadPDF(url);

            return false;
        }
    }
    else
    {
        return false;
    }
}

function validateCustomDownload(file_format, image_download_quality, campaign_download)
{
    if (file_format == "-1")
    {
        alert("Please choose a file format for your download.");
        return false;
    }
    else
    {
        if (image_download_quality == "-1" && campaign_download != "text_only")
        {
            alert("Please choose the image quality of your download.");
            return false;
        }
        else
        {
            return true;
        }
    }
}

function setVariantDownloadComponents(variant_id, checked_flag)
{
    var checkboxes = document.getElementsByTagName("input");

    for (var i = 0; i < checkboxes.length; i++)
    {
        checkbox = checkboxes[i];

        name = checkbox.name;

        if (name)
        {
            if ((name.search("var_"+variant_id) != "-1") || (name.search("img_"+variant_id) != "-1"))
            {
                checkbox.checked = checked_flag;
                selectVariantComponent(checkbox);
            }
        }
    }

    return false;
}

function selectVariantComponent( checkbox )
{
    if (checkbox)
    {
        var id = checkbox.name;
        var component = document.getElementById(id + '_div');
        if (checkbox.checked)
        {
            component.style.backgroundColor = '#FFF09E';
            component.style.fontWeight = 'bold';
        }
        else
        {
            component.style.backgroundColor = 'white';
            component.style.fontWeight = 'normal';
        }
    }

    return false;
}

function styleVariantComponents()
{
    var checkboxes = document.getElementsByTagName("input");

    for (var i = 0; i < checkboxes.length; i++)
    {
        checkbox = checkboxes[i];

        name = checkbox.name;

        if (name)
        {
            var prefix = name.substr(0,4);
            if ((prefix == "img_") || (prefix == "var_") || (name == "campaign_text"))
            {
                selectVariantComponent(checkbox);
            }
        }
    }

    return false;
}

function printItem( item_id, only_images )
{
    var url = '/item/' + escape(item_id) + '/?print_layout=';
    if (only_images)
    {
        url += 'images';
    }
    else
    {
        url += 'campaign';
    }

    window.open( url, 'print_item', 'width=900,height=600,menu=yes,menubar=yes,scrollbars=yes,resizable=yes' );
    return false;
}

function customDownload( item_id )
{
    var url = base_url + 'custom_download/&itemid=' + item_id + "&custom_download";

    window.open( url, 'custom_download', 'width=670,height=700,menu=yes,menubar=yes,scrollbars=yes,resizable=yes' );
    return false;
}

function loadPageItem()
{
    var index = document.forms['page_list'].elements['page_list'].selectedIndex;

    if (index)
    {
        var href = document.forms['page_list'].elements['page_list'].options[index].value;
        open(href, '_self');
    }
}

function setCheckboxStyle( checkbox )
{
    /* 
        Allow this to work for checkbox inputs wrapped in 
        LABEL tags (current) and checkox imputs that are 
        not. In the latter, div wrapper is parent not grandparent
        node.
    */
    var surrounding_div = checkbox.parentNode;
    if (surrounding_div.nodeName != "DIV")
    {
        surrounding_div = surrounding_div.parentNode;
    }

    if (checkbox && surrounding_div && surrounding_div.nodeName == "DIV")
    {
        if (checkbox.checked)
        {
            surrounding_div.className="checked_on";
        }
        else
        {
            surrounding_div.className="checked_off";
        }
    }
}

var categoryMapping = [];
function showValidCategories()
{
    var datasets = YAHOO.util.Dom.getElementsBy(function(elem){return (elem.name=='Dataset' && elem.type=='checkbox' && elem.checked);},'input');
    var sectors = YAHOO.util.Dom.getElementsBy(function(elem){return (elem.name=='Sector' && elem.type=='checkbox' && elem.checked);},'input');
    var countries = YAHOO.util.Dom.getElementsBy(function(elem){return (elem.name=='Country' && elem.type=='checkbox' && elem.checked);},'input');
    if (countries.length == 0)
    {
        countries = YAHOO.util.Dom.getElementsBy(function(elem){return (elem.name=='Country' && elem.type=='checkbox');},'input');
    }

    var allowed_categories = [];
    for (var d=0; d<datasets.length; d++)
    {
        var dataset = datasets[d].value;
        for (var s=0; s<sectors.length; s++)
        {
            var sector = sectors[s].value;
            for (var c=0; c<countries.length; c++)
            {
                var country = countries[c].value;

                var category_list = categoryMapping[dataset + '|' + sector + '|' + country];
                for (var x=0; x<category_list.length; x++)
                {
                    allowed_categories[category_list[x]] = true;
                }
            }
        }
    }

    var categories = YAHOO.util.Dom.getElementsBy(function(elem){return (elem.name=='Category' && elem.type=='checkbox');},'input');

    var available_count = 0;
    for (var j=0; j<categories.length; j++)
    {
        var category = categories[j];
        var parent_div = category.parentNode.parentNode;
        if (allowed_categories[category.value])
        {
            parent_div.style.display = 'block';
            category.disabled = false;
            available_count++;
        }
        else
        {
            category.checked = false;
            category.disabled = true;
            parent_div.style.display = 'none';
            parent_div.className = 'checked_off';
        }
    }

    var main_div = document.getElementById('Category_field');
    if (main_div)
    {
        if (available_count > 0)
        {
            main_div.style.display = 'block';
            if (available_count > 10)
            {
                main_div.style.height = '200px';
                main_div.style.overflow = 'auto';
            }
            else
            {
                main_div.style.height = '';
                main_div.style.overflow = 'visible';
            }
        }
        else
        {
            main_div.style.display = 'none';
        }
    }

    var select_all_links = document.getElementById('Category_select_all_links');
    if (select_all_links)
    {
        if (available_count > 0)
        {
            select_all_links.style.display = 'block';
        }
        else
        {
            select_all_links.style.display = 'none';
        }
    }

    addCheckboxStyle();
}

function showValidMailingTypes(hide_if_producer)
{
    // By default (eg., Offer Tool Launch Page), Mailing Type values will not be hidden if a Dataset 
    // is selected. 'hide_if_producer' will hide Mailing Type if a Producer Dataset is selected.
    if ('undefined' == typeof(hide_if_producer))
    {
        hide_if_producer = false;
    }

    var datasets = YAHOO.util.Dom.getElementsBy(function(elem){return (elem.name=='Dataset' && elem.type=='checkbox');},'input');
    var mailing_types = YAHOO.util.Dom.getElementsBy(function(elem){return (elem.name=='Mailing Type' && elem.type=='checkbox');},'input');
    var dm_checked = 0;
    var email_checked = 0;
    var producer_checked = 0;
    for (var i=0; i<datasets.length; i++)
    {
        var dataset = datasets[i];
        if (dataset.checked)
        {
            if (dataset.value.indexOf('Direct Mail') != -1 && dataset.value.indexOf('Producer') == -1)
            {
                dm_checked++;
            }
            if (dataset.value.indexOf('Email') != -1 && dataset.value.indexOf('Producer') == -1)
            {
                email_checked++;
            }
            if (dataset.value.indexOf('Producer') != -1)
            {
                producer_checked++;
            }
        }
    }

    var available_count = 0;
    for (var j=0; j<mailing_types.length; j++)
    {
        var mailing_type = mailing_types[j];
        var parent_div = mailing_type.parentNode;
        var is_email = (mailing_type.value.indexOf('E-mail') != -1);
        if (is_email)
        {
            if (email_checked > 0 && (!hide_if_producer || 0 == producer_checked))
            {
                parent_div.style.display = 'block';
                mailing_type.disabled = false;
                available_count++;
            }
            else
            {
                mailing_type.checked = false;
                mailing_type.disabled = true;
                parent_div.style.display = 'none';
            }
        }
        else
        {
            if (dm_checked > 0 && (!hide_if_producer || 0 == producer_checked))
            {
                parent_div.style.display = 'block';
                mailing_type.disabled = false;
                available_count++;
            }
            else
            {
                mailing_type.checked = false;
                mailing_type.disabled = true;
                parent_div.style.display = 'none';
            }
        }
    }

    // Mailing Type container id will be either 'Mailing Type_search_field_container','Mailing Type_offer_tool_search_field_container'..
    var main_div = YAHOO.util.Dom.getElementsBy(function(elem){return (elem.id=='Mailing Type_quick_search_field_container' || elem.id=='Mailing Type_offer_tool_search_field_container');},'div')[0];
    if (main_div)
    {
        if (available_count > 0)
        {
            main_div.style.display = 'block';
        }
        else
        {
            main_div.style.display = 'none';
        }
    }

    var select_all_links = document.getElementById('Mailing Type_select_all_links');
    if (select_all_links)
    {
        if (available_count > 0)
        {
            select_all_links.style.display = 'block';
        }
        else
        {
            select_all_links.style.display = 'none';
        }
    }

    addCheckboxStyle();
}


function validateQuickSearchInput(from_launch_page)
{
    var has_error = false;
    var error_field = '';

    if (!validateFulltextField('Keyword Search'))
    {
        has_error = true;
        if (error_field == '')
        {
            error_field = 'Keyword Search';
        }
    }

    if (has_error)
    {
        if (from_launch_page)
        {
            window.location.href = '#' + error_field.toLowerCase().replace(' ','-');
        }
        return false;
    }
    else
    {
        return true;
    }
}


function getFieldRangeValues(field_name)
{
    var input_min = document.getElementById(field_name);
    var input_max = document.getElementById(field_name + '_max');
    var values = [];
    if (input_min)
    {
        values.push(input_min.value);
    }
    if (input_max)
    {
        values.push(input_max.value);
    }
    return values;
}


function validateRangeField(field_name, test_function, error_message)
{
    var values = getFieldRangeValues(field_name);

    var has_error = false;
    for (var i=0; i<values.length; i++)
    {
        var value =values[i];
        if (value != '')
        {
            if (!test_function(value))
            {
                has_error = true;
                break;
            }
        }
    }

    if (has_error)
    {
        var error_div = document.getElementById(field_name + '_error_message');
        if (error_div)
        {
            error_div.innerHTML = error_message;
        }
        else
        {
            alert(error_message);
        }

        return false;
    }
    else
    {
        return true;
    }
}


function validateDateField(field_name)
{
    var test_function = function(test_value) { return validateDateFormat(test_value) && validateDateValue(test_value); };
    var error_message = 'Invalid date entered.  (Dates must be in the format MM/DD/YYYY.)';
    return validateRangeField(field_name, test_function, error_message);
}


function validateIntegerField(field_name)
{
    var test_function = function(test_value) { return (parseInt(test_value, 10) == test_value); };
    var error_message = 'Values must be integers.';
    return validateRangeField(field_name, test_function, error_message);
}


function validateDecimalField(field_name)
{
    var test_function = function(test_value) { return (parseFloat(test_value) == test_value); };
    var error_message = 'Values must be numeric.';
    return validateRangeField(field_name, test_function, error_message);
}


function validateFulltextField(field_name)
{
    var is_ok = true;
    var input = document.getElementById(field_name);
    if (input)
    {
        var input_string = input.value;
        if (input_string == '')
        {
            // allow nothing to be entered in field
            return true;
        }

        var error_message = '';

        var first_char = input_string.substr(0, 1);
        var regex = /^[a-zA-Z_0-9]$/;
        if (regex.test(first_char) || first_char == '"')
        {
            if (!validateFulltextValue(input_string))
            {
                is_ok = false;
                error_message = 'Your search string must contain an even number of double quotation marks.';
            }
        }
        else
        {
            is_ok = false;
            error_message = 'The first character of your search string must be a letter, number, or double quotation mark.';
        }

        if (!is_ok)
        {
            var error_div = document.getElementById(field_name + '_error_message');
            if (error_div)
            {
                error_div.innerHTML = error_message;
            }
            else
            {
                alert(error_message);
            }
        }
    }
    return is_ok;
}


function selectFilterCheckboxes(field_name, check_all)
{
    var checkboxes = document.getElementsByName(field_name);
    for (var i=0; i<checkboxes.length; i++)
    {
        var checkbox = checkboxes[i];
        if (checkbox.type == 'checkbox')
        {
            var allow_selection = true;
            var parent_div = checkbox.parentNode.parentNode;
            if (parent_div && parent_div.style.display == 'none')
            {
                allow_selection = false;
            }

            if (check_all && allow_selection)
            {
                checkbox.checked = 'true';
            }
            else
            {
                checkbox.checked = false;
            }
            setCheckboxStyle(checkbox);
        }
    }
}
 


function toggleSavedViewListDisplay(view_type)
{
    var container = document.getElementById(view_type + '_saved_views');
    if (container)
    {
        var replace_function = function(text) { return text; };
        var current_display = container.style.display;
        if (current_display == 'none')
        {
            container.style.display = 'block';
            replace_function = function(text) {
                return text.replace('Show', 'Hide').replace('plus', 'minus');
            }
        }
        else
        {
            container.style.display = 'none';
            replace_function = function(text) {
                return text.replace('Hide', 'Show').replace('minus', 'plus');
            }
        }

        var link = document.getElementById(view_type + '_saved_views_expander');
        if (link)
        {
            link.title = replace_function(link.title);
        }

        var image = document.getElementById(view_type + '_saved_views_plus_minus_image');
        if (image)
        {
            image.title = replace_function(image.title);
            image.src = replace_function(image.src);
        }
    }
}


// Special Set object here...
function Set( items )
{
    var setList = [];
    if (items)
    {
        outer:for (var i=0;i<items.length;++i)
        {
            for (var h=0;h<setList.length;++h)
            {
                if (items[i] == setList[h])
                {
                    continue outer;
                }
            }
            setList.push(items[i]);
        }
    }

    // An accessor
    this.list = function(){ return setList; };
    this.length = function(){ return setList.length; };

    // Modifier(s?)
    this.push = function(item){
        for (var j=0;j<setList.length;++j)
        {
            if (item == setList[j])
                return;
        }
        setList.push(item);
    };

    // Comparison methods..
    this.contains = function( item ){
        for (var j=0;j<setList.length;++j)
        {
            if (item == setList[j])
            {
                return true;
            }
        }
        return false;
    };

    this.hasSubset = function(set){
        var l = set.list();
        for (var j=0;j<l.length;++j)
        {
            if (!this.contains(l[j]))
            {
                return false;
            }
        }
        return true;
    };

    this.intersection = function(set){
        var returnSet = new Set();
        var l = set.list();
        for (var j=0;j<l.length;++j)
        {
            if (this.contains(l[j]))
            {
                returnSet.push(l[j])
            }
        }
        return returnSet;
    };
}


function insuranceSearchSpecialCheckboxLogic()
{
    var allow_state = true;
    var allow_province = true;
    var allow_agent_communications = false;
    var allow_policy_type = false;
    var allow_worksite_voluntary = false;
    var allow_mailing_type = false;
    var allow_email_mailing_type = false;
    var allow_contest_fields = false;
    var allow_juvenile_life_policy = false;

    var producer_values = new Array(
        'Producer - Direct Mail',
        'Producer - Email',
        'Producer - Print Advertisement');

    var business_values = new Array (
        'Business - Direct Mail',
        'Business - Print Advertisement');

    var print_values = new Array (
        'Business - Print Advertisement',
        'Consumer - Print Advertisement',
        'Producer - Print Advertisement');

    var consumer_values = new Array (
        'Consumer - Direct Mail',
        'Consumer - Email',
        'Consumer - Print Advertisement');

    var agentCommunicationsSet = new Set( producer_values );
    var contestFieldsSet = new Set( producer_values );
    var worksiteVoluntarySet = new Set( producer_values.concat(business_values) );
    var mailingTypeSet = new Set( ['Consumer - Direct Mail', 'Business - Direct Mail'] );
    var emailMailingTypeSet = new Set( ['Consumer - Email'] );
    var policyTypeSet = new Set( producer_values.concat(business_values) );
    var printSet = new Set( print_values );
    var juvenileLifePolicySet = new Set( consumer_values );

    var datasets = YAHOO.util.Dom.getElementsBy(function(elem){return (elem.name=='Dataset' && elem.type=='checkbox');},'input');
    var checkedDatasets = new Set();
    var uncheckedDatasets = new Set();
    for (var i = 0;i < datasets.length;++i)
    {
        if (datasets[i].checked)
        {
            checkedDatasets.push(datasets[i].value);
        }
        else
        {
            uncheckedDatasets.push(datasets[i].value);
        }
    }

    var countries = YAHOO.util.Dom.getElementsBy(function(elem){return (elem.name=='Country' && elem.type=='checkbox');},'input');
    var checkedCountries = new Set();
    for (var x=0;x<countries.length;++x)
    {
        if (countries[x].checked)
        {
            checkedCountries.push(countries[x].value)
        }
    }

    if (0 < checkedDatasets.length())
    {
        allow_agent_communications = agentCommunicationsSet.hasSubset(checkedDatasets);
        allow_policy_type = policyTypeSet.hasSubset(checkedDatasets);
        allow_mailing_type = mailingTypeSet.hasSubset(checkedDatasets);
        allow_email_mailing_type = emailMailingTypeSet.hasSubset(checkedDatasets);
        allow_worksite_voluntary = worksiteVoluntarySet.hasSubset(checkedDatasets);
        allow_contest_fields = contestFieldsSet.hasSubset(checkedDatasets);
        allow_juvenile_life_policy = juvenileLifePolicySet.hasSubset(checkedDatasets);

        if (0 < printSet.intersection(checkedDatasets).length())
        {
            allow_state = false;
            allow_province = false;
        }
    }
    else
    {
        allow_agent_communications = agentCommunicationsSet.hasSubset(uncheckedDatasets);
        allow_policy_type = policyTypeSet.hasSubset(uncheckedDatasets);
        allow_mailing_type = mailingTypeSet.hasSubset(uncheckedDatasets);
        allow_email_mailing_type = emailMailingTypeSet.hasSubset(uncheckedDatasets);
        allow_worksite_voluntary = worksiteVoluntarySet.hasSubset(uncheckedDatasets);
        allow_contest_fields = contestFieldsSet.hasSubset(uncheckedDatasets);
        allow_juvenile_life_policy = juvenileLifePolicySet.hasSubset(uncheckedDatasets);

        if (0 < printSet.intersection(uncheckedDatasets).length())
        {
            allow_state = false;
            allow_province = false;
        }
    }

    if (allow_province && checkedCountries.contains('USA'))
        allow_province = false;

    if (allow_state && checkedCountries.contains('Canada'))
        allow_state = false;

    allowSearchField("State",allow_state);
    allowSearchField("Province",allow_province);
    allowSearchField("Agent Communications",allow_agent_communications);
    allowSearchField("Policy Type",allow_policy_type);
    allowSearchField("Worksite/Voluntary",allow_worksite_voluntary);
    allowSearchField("Contest Type",allow_contest_fields);
    allowSearchField("Contest Date",allow_contest_fields);
    allowSearchField("Contest Status",allow_contest_fields);
    allowSearchField("Mailing Type",allow_mailing_type);
    allowSearchField("Email Mailing Type",allow_email_mailing_type);
    allowSearchField("Juvenile Life Policy (Life Insurance Field)",allow_juvenile_life_policy);
}

function clearCheckboxes(field_name)
{
    var checkboxes = document.getElementsByName(field_name);

    for (var i = 0; i < checkboxes.length; i++)
    {
        checkboxes[i].checked = false;
        setCheckboxStyle(checkboxes[i]);
    }
}

function insuranceSearchSpecialGeographicLogic(field_name)
{
    var checkboxes = document.getElementsByName(field_name);
    var force_USA = false;
    var force_Canada = false;

    if (field_name == "State")
    {
        var force_USA = false;
        for (var i = 0; i < checkboxes.length; i++)
        {
            if (checkboxes[i].checked)
            {
                force_USA = true;
            }
        }
    }
    else if (field_name == "Province")
    {
        var force_Canada = false;
        for (var i = 0; i < checkboxes.length; i++)
        {
            if (checkboxes[i].checked)
            {
                force_Canada = true;
            }
        }
    }

    var country_value = 0;

    if (force_USA)
    {
        country_value = "USA";
    }
    else if (force_Canada)
    {
        country_value = "Canada";
    }

    countries = document.getElementsByName("Country");
    for (var j=0; j < countries.length; j++)
    {
        if (country_value)
        {
            if (countries[j].value == country_value)
            {
                countries[j].checked = true;
            }
            else
            {
                countries[j].checked = false;
            }
        }
        setCheckboxStyle(countries[j]);
    }
    insuranceSearchSpecialCheckboxLogic();
}

// Called on page load to assign a standard onclick to checkboxes that don't have one
function markUpCheckboxes()
{
    var checkList = document.getElementsByTagName('input');
    var delay = 5;

    for (var i = 0; i < checkList.length; i++)
    {
        var node = checkList[i];
        if (node.getAttribute("type") == "checkbox")
        {
            if (typeof(node.onclick) == "undefined" || typeof(node.onclick) == "object")
            {
                var makeFixer = function(node)
                {
                    return function()
                    {
                        node.onclick = function() { setCheckboxStyle(this); };
                        var lab = node.parentNode;
                        // The following is required to patch id's and for's into checkboxes
                        // and labels, for browsers that don't understand the implicit label
                        // behaviour defined by the HTML 4.01 standard (i.e., IE 6)
                        if (lab.nodeName == "LABEL" && lab.htmlFor == "")
                        {
                            // generate a unique ID for node
                            lab.htmlFor = YAHOO.util.Event.generateId(node);
                        }
                    }
                }
                setTimeout(makeFixer(node), delay);
                delay += 5;
            }
        }
    }
}

function allowSearchField( field_name, is_allowed )
{
    var checkboxes = document.getElementsByName(field_name);
    var title = document.getElementById("searchfield_description_" + field_name);
    var div = document.getElementById(field_name+"_insurance_search_field_container");

    // Only allow fields that exist. 
    if (!checkboxes || !title || !div)
    {
        return;
    }

    if (is_allowed)
    {
        title.style.fontWeight = "bold";
        title.style.fontStyle = "normal";
        div.style.display = "block";
    }
    else
    {
        title.style.fontWeight = "normal";
        title.style.fontStyle = "italic";
        div.style.display = "none";
    }

    for(var i = 0;i < checkboxes.length;++i)
    {
        if (checkboxes[i].type == "checkbox")
        {
            if (is_allowed)
            {
                checkboxes[i].disabled = false;
            }
            else
            {
                checkboxes[i].disabled = true;
                checkboxes[i].checked = false;
            }
            setCheckboxStyle(checkboxes[i]);
        }
    }
}

function validateSearchForm()
{
   var search_ok = true;

   var form = document["searchform"]

   var company_lookup         = form[SEARCH_CONTROL + ".search_company_lookup_lookup"];
   var company_contents       = document.getElementById("company_selection");

   if (company_lookup)
   {

      if (company_lookup.value.length)
      {
          var checkboxes = company_contents.getElementsByTagName("input");
          search_ok = false;

          for (i = 0;i < checkboxes.length;++i)
          {
              if (checkboxes[i].type=="checkbox" && checkboxes[i].checked)
              {
                 search_ok = true;
                 break;
              }
          }
      }
   }

   if (!search_ok)
   {
       alert("You have entered a value into the Company Lookup but not selected a company");
   }

   return search_ok;
}

function submitSearch()
{
    if (!validateSearchForm())
    {
        return false;
    }

    setLastSearchCookie();

    var form = document.forms["searchform"];
    //form[SEARCH_CONTROL + ".search_mode"].value='header';
    form[SEARCH_CONTROL + ".action"].value='submit';
    form.submit();

    return false;
}

function submitRefineSearch(refine_tab)
{
    if (!validateSearchForm())
    {
        return false;
    }

    setLastSearchCookie();

    var form = document.searchform;
    form[SEARCH_CONTROL + ".search_mode"].value='refine';
    form[SEARCH_CONTROL + ".selected_tab"].value=refine_tab;
    form.submit();

    return false;
}

function setLastSearchCookie()
{

    var form = document.forms["searchform"];
    var last_submit_hidden = form[SEARCH_CONTROL + ".last_submit_time"];

    // This is a little trick to test whether the user clicked the back
    // button. We store the current time in a cookie and in a hidden form var.
    // These values are retrieved and compared when the page is loaded, if they
    // match then the user clicked back.
    var date_obj = new Date();
    var now = date_obj.getMilliseconds();

    last_submit_hidden.value = now;
    setCookie("lastSearchSubmitTime", now);
}

function checkSearchBackButton()
{
   var searchform = document.forms["searchform"];
   var last_search_hidden    = searchform[SEARCH_CONTROL + ".last_submit_time"].value;
   var last_search_cookieval = getCookie("lastSearchSubmitTime");

   if (last_search_hidden == last_search_cookieval)
   {
       document.location.href="?load_partial_search";
   }
}

function back_to_advanced_search()
{
    // Need to clear 'refine_fields'
}

function selectSearchTab(id)
{
   requestSearchPage(1,id);
}

function requestSearchPage(id,selected_tab)
{
   var form = document.searchform;
   form[SEARCH_CONTROL + ".request_search_page"].value=id;
   form[SEARCH_CONTROL + ".selected_tab"].value=selected_tab;
   form.submit();
}

function storeItemView(id)
{
    var pageitem = document.getElementById("item_detail" + id);
    /*setCookie(id, pageitem.style.display);*/
}

function loadItemView()
{
   var items         = document.getElementsByTagName("tr");
   var page_format  = document.getElementById("display");

   for (i = 0;i < items.length;i++)
   {
      var id = items[i].id;
      if (id.substr(0, 11) == "item_detail")
      {
        var pageitem = items[i];

        var item_id = id.substr(11, id.length);
        var pageitem_header = document.getElementById("item_header" + item_id);

        if (pageitem)
        { 
          if (getCookie(item_id)== "none")
          {
            // hide it
            pageitem.style.display = "none";
            pageitem.style.visibility = "hidden";
            pageitem_header.className="";
          }
          else 
          {
            if (getCookie(item_id) != null)
            {
                // show it
                pageitem.style.display = "";
                pageitem.style.visibility = "visible";
                pageitem_header.className="detailed_item_header"; 
            }
            else
            {
                // do whatever the default is
                if (page_format.value == "list")
                {
                    // hide it
                    pageitem.style.display = "none";
                    pageitem.style.visibility = "hidden";
                    pageitem_header.className="";
                }
                else
                {
                    // show it
                    pageitem.style.display = "";
                    pageitem.style.visibility = "visible";
                    pageitem_header.className="detailed_item_header";
                }

            }
          } 
        }
     }
  }
}

function changePageItemView()
{
   var items         = document.getElementsByTagName("tr");
   var page_format  = document.getElementById("display");

   // toggle page_foramt
   page_format.value = (page_format.value=="abridged" ? "list" : "abridged");

   for (i = 0;i < items.length;i++)
   {
      var id = items[i].id;
      if (id.substr(0, 11) == "item_detail")
      {
        var pageitem = items[i];

        var item_id = id.substr(11, id.length);
        var pageitem_header = document.getElementById("item_header" + item_id);

        if (pageitem)
        {
          if (page_format.value == "list")
          {
            // hide it
            pageitem.style.display = "none";
            pageitem.style.visibility = "hidden";
            pageitem_header.className="";
          }
          else
          {
            // show it
            pageitem.style.display = "";
            pageitem.style.visibility = "visible";
            pageitem_header.className="detailed_item_header";
          }
          /*setCookie(id, pageitem.style.display);*/
        }
     }
  }
}

function changeItemView(id)
{
   //
   // show or hide the selected tab group
   //
   var pageitem        = document.getElementById("item_detail" + id);
   var pageitem_header = document.getElementById("item_header" + id);

   if (pageitem && typeof(pageitem) != "undefined")
   {
      if (pageitem.style.display != "none")
      {
          // hide item
          pageitem.style.display = "none";
          pageitem.style.visibility ="hidden";

          pageitem_header.className="";
      }
      else
      {
          // show item
          pageitem.style.display = "";
          pageitem.style.visibility = "visible";
          pageitem_header.className="detailed_item_header";
      }
   }
}

function selectGroup(id, show)
{
   //
   // show or hide the selected tab group
   //
   var group = document.getElementById("tab_group" + id);

   if (group && typeof(group) != "undefined")
   {
      if (typeof(show) != "undefined")
      {
        if (show)
        {
          // show group
          group.style.display = "inline";
          group.style.visibility = "visible";
          selectGroupArrowControls(group, true);
        }
        else
        {
          // hide group
          group.style.display = "none";
          group.style.visibility ="hidden";
          selectGroupArrowControls(group, false);
        }
      }
      else
      {
        if (group.style.display == "inline")
        {
          // hide group
          group.style.display = "none";
          group.style.visibility ="hidden";
          selectGroupArrowControls(group, false);
        }
        else
        {
          // show group
          group.style.display = "inline";
          group.style.visibility = "visible";
          selectGroupArrowControls(group, true);
        }
      }
   }
}


function selectGroupArrowControls(group, showing)
{
    var up_arrow   = document.getElementById(group.id + "_up_arrow");
    var down_arrow = document.getElementById(group.id + "_down_arrow");

    if (up_arrow && down_arrow)
    {
        if (showing)
        {
            // we are showing group, so hide down arrow and show up arrow
            up_arrow.style.display    = "inline";
            up_arrow.style.visibility = "visible";
            down_arrow.style.display  = "none";
            down_arrow.visible        = "hidden";
        }
        else
        {
            // we are hiding group, so hide up arrow and show down arrow
            down_arrow.style.display    = "inline";
            down_arrow.style.visibility = "visible";
            up_arrow.style.display      = "none";
            up_arrow.style.visibility   = "hidden";

        }
    }
}

function switchArrowIcon( arrowElementId, orientation, smoke)
{
    var arrowElement = document.getElementById(arrowElementId);
    var upArrowImg = "/images/compere/big_arrow.gif";
    var downArrowImg = "/images/compere/down_arrow.gif";


    // If orientation not set, then try to flip
    if ((orientation != 'up' || orientation != 'down') && 0 <= ((arrowElement.src).search(upArrowImg)))
    {
        orientation = 'down';
    }

    arrowElement.src = (orientation == 'down') ? downArrowImg : upArrowImg;
}

function expandCollapse(id)
{
    var heading = document.getElementById("section_heading_" + id);
    var section = document.getElementById("section_" + id);

    if (section.style.display != "none")
    {
        heading.className = "collapsed";
        section.style.display = "none";
    }
    else
    {
        heading.className = "expanded";
        section.style.display = "";
    }

    return false;
}


function selectTab(id, num_tabs)
{
   var tabs = document.getElementsByTagName("div");

   for (i = 1;i < tabs.length;i++)
   {
      var tab = document.getElementById("tab_" + i);
      if (tab)
      {
         if (typeof(tab) != "undefined")
         {
            tab.style.display = "none";
         }

         var anchor = document.getElementById("tab_link_" + i);
         if (anchor)
         {
             anchor.className = "";
         }
      }
   }

   var tab = document.getElementById("tab_" + id);

   if (tab && typeof(tab) != "undefined")
   {
       tab.style.display = "inline";
       var anchor = document.getElementById("tab_link_" + id);
       if (anchor)
       {
          anchor.className = "active";
       }
   }
}

function updateSavedSearch(property, id)
{
    if (id)
    {
        checkbox = document.getElementById(property+id);
        if (checkbox)
        {
            value = 0;
            if (checkbox.checked)
            {
                value = 1;
            }
            var url = "/search/saved_searches/?update=1&property=is_" + property + "&value=" + value + "&search_id=" + id;
            location.href = url;
        }
    }
}

function updateInboxView(base_url, action, id)
{
    if (id)
    {
        var url = base_url + "saved_filters/?" + action + "&search_id=" + id;
        location.href = url;
    }
}

function homepageSearch(obj)
{
   var homepage_id = obj.options[obj.selectedIndex].id;
   var url=base_url + "frontpage/?homepage_id=" + homepage_id;
   location.href=url;
}

function runStandardReport(obj)
{
   var report_id = obj.options[obj.selectedIndex].id;

   if (report_id > 0)
   {
      // standard combination planit report
      var url=base_url + "planit/combination?command=submit&format=run&template_id=" + report_id;
      location.href=url;
   }
   else if (report_id == -1)
   {
      var custom_report_id = obj.options[obj.selectedIndex].value;
      // special case static report
      var url=base_url + "custom_reports/?group=" + custom_report_id;
      location.href=url;
   }
}

function switchHomepageView(mode)
{
   var custom_content_div = document.getElementById("homepage_custom_content");
   var records_div        = document.getElementById("homepage_records");

   if (mode == "custom_content")
   {
       custom_content_div.style.display="inline";
       records_div.style.display="none";
   }
   else
   {
       custom_content_div.style.display="none";
       records_div.style.display="inline";
   }
}

function showFullText(val)
{
    var fulltext_div         = document.getElementById('fulltextsearch');
    var fulltext_option_hide = document.getElementById('fulltextsearch_hide');
    var fulltext_option_show = document.getElementById('fulltextsearch_show');

    if (!val)
    {
        fulltext_div.style.display = "none";
        fulltext_option_hide.style.display = "none";
        fulltext_option_show.style.display = "inline";
    }
    else
    {
        fulltext_div.style.display = "inline";
        fulltext_option_hide.style.display = "inline";
        fulltext_option_show.style.display = "none";
    }
}

function changeImageState(nameSuffix, state)
{
    var img = document.getElementById("img_" + nameSuffix);
    var IMG_PATH = "/images/compere/search/";

    if (state == "and")
    {
        img.src = IMG_PATH + "and.jpg";
    }
    else if (state == "not")
    {
        img.src = IMG_PATH + "not.jpg";
    }
    else
    {
        img.src = IMG_PATH + "blank.jpg";
    }
}

displayRandomImage.lastImage1 = -1;
displayRandomImage.lastImage2 = -1;
displayRandomImage.lastImage3 = -1;
function displayRandomImage(path, name, limit)
{
    //this function should now not select the same image twice during
    //three consecutive executions.  This ensures that there are always
    //FOUR distinct images displayed on the front page.
    index = -1;
    while (index == displayRandomImage.lastImage1 ||
           index == displayRandomImage.lastImage2 ||
           index == displayRandomImage.lastImage3 ||
           index == -1)
    {
        index = Math.floor(Math.random()*limit);
    }

    displayRandomImage.lastImage3 = displayRandomImage.lastImage2;
    displayRandomImage.lastImage2 = displayRandomImage.lastImage1;
    displayRandomImage.lastImage1 = index;

    new_filename=path + name + index + ".gif";

    document.write("<img alt='' src='" + new_filename + "' border=0>");
}

function popupWindowBox(url)
{
   var params = 'width=450,height=300,menubar=no,top=150,left=150,resizable=yes,toolbar=no,scrollbars=yes';
   open(url, 'newWindow', params);
}

function popupSizedWindowBox(url, size_attributes)
{
   var params = size_attributes + ',menubar=no,top=150,left=150,resizable=yes,toolbar=no,scrollbars=yes';
   open(url, 'newWindow', params);
}


function popupNamedWindowBox(url, name)
{
   var params = 'width=450,height=300,menubar=no,top=150,left=150,resizable=yes,toolbar=no,scrollbars=yes';
   open(url, 'newWindow', params);
}

function popupWindowBrowser(url,width,height,scroll)
{
   var params = 'width=' + width + ',height=' + height + ',menubar=yes,resizable=yes,toolbar=yes,scrollbars=' + scroll;
   open(url, 'newWindow', params);
}

function setUpHelpPopups()
{
    var currentPopup = 0;
    function generateListener(icon) {
        // Use the icon's id to identify the searchfield (strip off leading 'help_')
        var fieldName = icon.id.substring(5);
        var panel = null;

        // create the listener as a closure and return it
        var listener = function(e, obj) {
            var fieldTitleEl = document.getElementById('searchfield_description_' + fieldName);
            if (!fieldTitleEl) return;

            // Use the field's title on page to set the tooltip panel's header. 
            var fieldDesc = fieldTitleEl.innerHTML;
            if (!fieldDesc || "" == fieldDesc)
            {
                // Should never happen
                fieldDesc = fieldName;
            }

            // use field's wrapper (an html table) for positioning the panel 
            var fieldWrapperEl = fieldTitleEl;
            while (!YAHOO.util.Dom.hasClass(fieldWrapperEl, 'popup_subject') && fieldWrapperEl != document)
            {
                fieldWrapperEl = fieldWrapperEl.parentNode;
            }
            if (fieldWrapperEl == document)
            {
                fieldWrapperEl = fieldTitleEl;  // couldn't find wrapping table, use the title
            }

            var panelId = 'help_panel_' + fieldName;

            function layoutPanel()
            {
                // This only works if the panel exists and has been rendered
                if (!document.getElementById(panelId)) return;

                // if popup is too tall for browser, shrink it (scrollbar will appear)
                var clientHeight = YAHOO.util.Dom.getViewportHeight() - 20;
                if (panel.element.offsetHeight > clientHeight)
                {
                    panel.cfg.setProperty("height", ""+clientHeight+"px");
                    var hd = YAHOO.util.Dom.getElementsByClassName('hd','div',panel.element)[0];
                    var bd = YAHOO.util.Dom.getElementsByClassName('bd','div',panel.element)[0];
                    bd.style.height=""+(clientHeight-(hd.offsetHeight)-8)+"px";
                }

                panel.cfg.setProperty("width", "" + fieldWrapperEl.clientWidth + "px");
                var spaceAboveTable = YAHOO.util.Dom.getY(fieldWrapperEl) - YAHOO.util.Dom.getDocumentScrollTop(document);
                if (panel.element.offsetHeight <= spaceAboveTable)
                {
                    // there's room above the subject, so place popup there.
                    panel.cfg.setProperty("context", [fieldWrapperEl,"bl","tl"]);
                }
                else
                {
                    // if there's no room above the subject, so put the popup beside it.
                    var centerOfBrowser = YAHOO.util.Dom.getClientWidth() / 2;
                    var fieldWrapperRegion = YAHOO.util.Dom.getRegion(fieldWrapperEl);
                    var centerOfField = (fieldWrapperRegion.left + fieldWrapperRegion.right) / 2;
                    // if subject is on the left, put popup on the right, else the left.
                    if (centerOfField < centerOfBrowser)
                    {
                        panel.cfg.setProperty("context", [fieldWrapperEl,"tl","tr"]);
                    }
                    else
                    {
                        panel.cfg.setProperty("context", [fieldWrapperEl,"tr","tl"]);
                    }
                }
            }

            // create the panel if it does not already exist
            var panelId = 'help_panel_' + fieldName;
            if (!document.getElementById(panelId))            
            {
                panel = new YAHOO.widget.Panel(panelId,
                {
                    draggable:true,
                    dragOnly:true,
                    visible:false,
                    constraintoviewport:true,
                    close:true
                });

                if (!panel) return;

                // Initialize panel header and body.
                panel.setHeader( fieldDesc );
                panel.setBody("");
                panel.render(document.body);


                var panelEl = document.getElementById(panelId);
                YAHOO.util.Dom.addClass(panelEl, 'help_popup');
                panel.hideEvent.subscribe(function() { currentPopup = 0; });

                // AJAX request to get tooltip 
                var fieldNameEsc  = fieldName;
                fieldNameEsc.replace(" ","+");
                var tooltip_url = '/search/field_tooltip/?field_name=' + fieldNameEsc;
                var all_inputs = document.getElementsByTagName('input');
                for (var i=0; i<all_inputs.length; i++)
                {
                    var this_input = all_inputs[i];
                    if (this_input.name == fieldNameEsc && 'checkbox' == this_input.type)
                    {
                        tooltip_url += '&field_values=' + this_input.value;
                    }
                }
                var form_args;
                var tooltipReq = new AsynchRequest(tooltip_url,
                
                    //function on success - using response_text
                    function(response_text)
                    {
                        panel.setBody( response_text );
                        layoutPanel();
                    },
                
                    //function on start of load
                    function()            
                    {
                        panel.setBody( '...' );
                    },
                
                    //function on error
                    function(error_state)
                    {
                        panel.destroy();
                    },
                
                    "GET",
                    form_args
                );
                tooltipReq.send();
            }

            if (!panel.cfg.getProperty("visible"))
            {
                layoutPanel();
                panel.cfg.setProperty("zIndex", "500");

                if (currentPopup) 
                    currentPopup.hide();
                currentPopup = panel;
                panel.show();
            }
            else
            {
                currentPopup = panel;
                panel.hide();
            }
        }
        
        return listener;
    }

    var icons = YAHOO.util.Dom.getElementsByClassName('help_link','img',document.body);
    for (var i = 0; i < icons.length; i++)
    {
        var icon = icons[i];
        YAHOO.util.Event.addListener(icon, "click", generateListener(icon));
   }
}

// written by Simon Willison originally, borrowed from http://www.dustindiaz.com/top-ten-javascript/
// It's only here to avoid the dependency on YUI, really.
function addLoadEvent(func) {
    var oldonload = window.onload;
    if (typeof window.onload != 'function')
    {
        window.onload = func;
    }
    else
    {
        window.onload = function()
        {
            oldonload();
            func();
        }
    }
}

function downloadPDF(url)
{
    var params = 'width=525,height=150,menubar=no,top=150,left=150,resizable=no,toolbar=no,scrollbars=yes';
    open(url, '_blank', params);
}

function submitDownload(form_name, action, zipped)
{
    // either postRTF or postCSV, take the last 3 chars
    var ext = action.substr(action.length-3, action.length);

    if (zipped)
        ext = ext + ".gz";

    // note this relies on the form having a hidden value named 'zipped'
    document.forms[form_name].elements['zipped'].value = zipped;
    document.forms[form_name].action = base_url + action + '/download.' + ext;
    document.forms[form_name].submit();
}


function updateItemListDownload(form_name)
{
    var form = document.forms["download_options"];
    var format       = form.format.options[form.format.selectedIndex].value;

    if (format == "images")
    {
        // image downloads from an itemlist have to be zipped, so update the zipped
        // checkbox
        form.zipped_option.checked = true;

        // also disable the zipped option
        form.zipped_option.disabled = true;
    }
    else
    {
        form.zipped_option.checked = false;
        form.zipped_option.disabled = false;
    }

    // enable "Whole List" option for CSV only
    var list_selection = form.list_selection.options;
    for (var i=0; i<list_selection.length; i++)
    {
        var list_option = list_selection[i];
        if (list_option.value == "list")
        {
            if (format == "csv")
            {
                list_option.disabled = false;
            }
            else
            {
                list_option.disabled = true;
                if (list_option.selected == true)
                {
                    form.list_selection.selectedIndex = 0;
                }
            }
        }
    }
}


function submitItemDownload(item_id)
{
   var form = document.forms["item_download_form"];

   var format            = form.format.options[form.format.selectedIndex].value;
   var campaign_download = form.campaign_download.options[form.campaign_download.selectedIndex].value;
   var image_quality     = form.image_download_quality.options[form.image_download_quality.selectedIndex].value;

   if (format == -1)
   {
       alert("Please select a download format.");
       return false;
   }

   if (format == "pdf")
   {
       url = "/pdf_client/?id=" + item_id + "&image_download_quality=" + image_quality;
       url = url + "&campaign_download=" + campaign_download;
       downloadPDF(url);
   }
   else
   {
       form.action = "/sinatra/compere/handle_item/post" + format + "/";
       form.id.value = item_id;

       form.submit();
   }

   return false;

}

function submitItemListDownload(form_name)
{

    var form = document.forms["download_options"];

    var format            = form.format.options[form.format.selectedIndex].value;
    var selected          = form.list_selection.options[form.list_selection.selectedIndex].value;
    var zipped            = form.zipped_option.checked;
    var campaign_download = form.campaign_download.options[form.campaign_download.selectedIndex].value;
    var image_quality     = form.image_download_quality.options[form.image_download_quality.selectedIndex].value;
    var list_command      = "download";
    var base_url          = document.forms[form_name].elements['base_url'].value;

    if (format == -1)
    {
        alert("Please select a download format.");
        return false;
    }

    if (format == "pdf")
    {
        var url = "/pdf_client/?id="
        var checkboxes = document.getElementsByTagName("input");
        for (var i = 0; i < checkboxes.length; i++)
        {
            var this_box = checkboxes[i];
            if (this_box.type == "checkbox" && this_box.name == "id")
            {
                if (this_box.checked || selected == "page")
                {
                    url = url + this_box.value + "|";
                }
            }
        }

        url = url + "&image_download_quality=" + image_quality;
        url = url + "&campaign_download=" + campaign_download;
        url = url + "&include_landing_pages=" + (form.include_landing_pages.checked ? 1 : 0);

        downloadPDF(url);
    }
    else
    {
        document.forms[form_name].action = base_url + "/";

        ///////////////////////////////////////////////////////////////////////////
        //
        // Bit of a hack for IE, it works out the associated application
        // based on filename, not content type!
        //
        var filename = "download." + format;    
        //
        ///////////////////////////////////////////////////////////////////////////

        document.forms[form_name].action = base_url + "/" + filename;

        document.forms[form_name].elements['list_selection'].value    = selected;
        document.forms[form_name].elements['list_command'].value      = list_command;      
        document.forms[form_name].elements['zipped'].value          = zipped;
        document.forms[form_name].elements['format'].value            = format;
        document.forms[form_name].elements['campaign_download'].value = campaign_download;
        document.forms[form_name].elements['image_download_quality'].value     = image_quality;
        document.forms[form_name].elements['mode'].value              = "list";

        document.forms[form_name].submit();
    }

}

function submitItemListExport(form_name)
{
    var form = document.forms["export_options"];

    var selected     = form.list_selection.options[form.list_selection.selectedIndex].value;
    var list_command = "export";
    var base_url  = document.forms[form_name].elements['base_url'].value;

    document.forms[form_name].action = base_url + "/";

    list_command = "export_basket";

    document.forms[form_name].elements['list_selection'].value   = selected;
    document.forms[form_name].elements['list_command'].value     = list_command;
    document.forms[form_name].elements['mode'].value             = "list";

    document.forms[form_name].submit();

}


function submitItemSelection(form_name)
{
    var form = document.forms["list_options"];

    var format       = form.format.options[form.format.selectedIndex].value;
    var selected     = form.list_selection.options[form.list_selection.selectedIndex].value;
    var zipped       = form.zipped_option.checked;
    var list_command = "download";
    var base_url  = document.forms[form_name].elements['base_url'].value;

    document.forms[form_name].action = base_url + "/";

    if (format == "export")
    {
      zipped = false;
      list_command = "export_basket";
    }
    else
    {
      ///////////////////////////////////////////////////////////////////////////
      //
      // Bit of a hack for IE, it works out the associated application
      // based on filename, not content type!
      //
      var filename = "download." + format;
      if (zipped)
      {
        filename += ".gz";
      }
      //
      //
      ///////////////////////////////////////////////////////////////////////////

      document.forms[form_name].action = base_url + "/" + filename;

    }

    document.forms[form_name].elements['list_selection'].value   = selected;
    document.forms[form_name].elements['list_command'].value     = list_command;
    document.forms[form_name].elements['zipped'].value           = zipped;
    document.forms[form_name].elements['format'].value           = format;
    document.forms[form_name].elements['mode'].value             = "list";

    document.forms[form_name].submit();

}

function clearBasket(form_name, clear_url)
{
    if (confirm("Delete all items from this list?"))
    {
        document.forms[form_name].action = clear_url;
        document.forms[form_name].submit();
    }
}

function deleteSelected(form_name, action)
{
    if (confirm("Delete selected items?"))
    {
        document.forms[form_name].zipped.value = 'false';
        document.forms[form_name].action = action;
        document.forms[form_name].submit();
    }
}

function exportItem(item_id)
{
  var url=base_url + "export/?id=" + item_id;

  // current url
  url += "&submit_url=" + escape(location.href);

  location.href=url;

}

function returnPressed(event, tagname)
{
    if (event)
    {
        // get keycode
        var key = event.keyCode||event.which;

        // get src
        var src = event.srcElement||event.target;
        // if src is valid, and return was pressed return true!
        if (src && (key==13) && (src.name==tagname))
        {
            return true;
        }
    }


    return false;
}

function setListCheckBoxes(setting)
{
    for (var i=0; i < document.select_items.elements.length; ++i) {
        if (document.select_items.elements[i].name == 'id')
        {
            document.select_items.elements[i].checked = setting;
        }
    }
}

function setEmailAlert(search_id)
{
    var list_name = 'alert' + search_id;
    var index = document.forms['searches'].elements[list_name].selectedIndex;
    var value = document.forms['searches'].elements[list_name].options[index].value;
    var url = '/search/saved_searches/?update=1&property=email_send_interval&value=' + value + '&search_id=' + search_id;
    location.href = url;
}

function setSearchReportMonth()
{
   var form = document.searchform;
 
 
   var reportmonth = document.getElementById("report_month");

   if (reportmonth)
   {
      // set to latest reportmonth
      var latest_id = document.getElementById("latest_report_month");
      if (latest_id)
      {
          for (x = 0;x < reportmonth.options.length;++x)
          {
              if (reportmonth.options[x].value == latest_id.value)
              {
                  reportmonth.options[x].selected = true;
                  break;
              }
          }
      }
   }
}


function clearConflict(conflict)
{
    var conflictEl = document.getElementById(conflict);
    if (conflictEl)
        conflictEl.value = '';
    return true;
}

function addressRangeConflicts( this_select, conflict_select_id, start, descending )
{
    var conflict_select = document.getElementById( conflict_select_id );

    // Auto-fill conflicting range part if empty.
    if (!conflict_select.selectedIndex)
    {
        conflict_select.selectedIndex = this_select.selectedIndex;
        return;
    }

    // Adjust other range input if current selection invalidates it. 
    // That is, you can't have min=4 && max=2 ..
}

function populateRecipients()
{
    document.emailform.recipient.value="";

    for (i=0; i<document.emailform.lookup.length; i++)
    {
        if(document.emailform.lookup.options[i].selected)
        {
            if (i != 0)
            {
                document.emailform.recipient.value += ", ";
            }
            
            document.emailform.recipient.value += document.emailform.lookup.options[i].value;
        }
    }
}

function showProfileList(showprofiles)
{
    var profile_list = document.getElementById('profile_list');
    var submit_window = document.getElementById('submit_window');

    if (showprofiles) {
        profile_list.style.display = 'block';
        submit_window.style.display = 'none';
    }
    else {
       profile_list.style.display = 'none';
       submit_window.style.display = 'block';
    }
}

function submitCampaignDownload(base_url, item_id, action)
{
   var f  = document.forms["campaign_download_form"];
   f.action = base_url + "/post" + action + "/download." + action;
   f.submit();
}

function display_advanced_download_options(status)
{
   var advanced_options = document.getElementById("advanced_download_options");

   if (typeof(status) == "undefined")
   {
       status = false;
       if (advanced_options.style.display == "none")
       {
           status = true;
       }
   }
   
   if (status == true)
   {
       advanced_options.style.display="inline";
   }
   else
   {
       advanced_options.style.display="none";   
       // clear text area
       document.getElementById("advanced_download_options");
   }
}

function downloadTrendReport(item_id, format)
{
   var url = "file/&id=" + item_id + "&format=" + format;
   
   var zipped = document.getElementById("zipped_option");
   if (zipped && zipped.checked)
   {
      url += "&zipped";
   }
   
   document.location.href=url;
}

function toggleOutOfOffice()
{
   if (!document.profile_form.Enable_Out_Of_Office.checked)
   {
      // Grey out select controls
      document.profile_form.Out_Of_Office_Start_day.disabled=true;
      document.profile_form.Out_Of_Office_Start_month.disabled=true;
      document.profile_form.Out_Of_Office_Start_year.disabled=true;
      document.profile_form.Out_Of_Office_End_day.disabled=true;
      document.profile_form.Out_Of_Office_End_month.disabled=true;
      document.profile_form.Out_Of_Office_End_year.disabled=true;
   }
   else
   {
      // Unlock select controls
      document.profile_form.Out_Of_Office_Start_day.disabled=false;
      document.profile_form.Out_Of_Office_Start_month.disabled=false;
      document.profile_form.Out_Of_Office_Start_year.disabled=false;
      document.profile_form.Out_Of_Office_End_day.disabled=false;
      document.profile_form.Out_Of_Office_End_month.disabled=false;
      document.profile_form.Out_Of_Office_End_year.disabled=false;
   }
}


function submitNewsAjaxRequest(page_num)
{
    var form         = document.forms["web_services_news_form"];    
    var action_url   = "web_service_news/";
    
    var form_args;

    if (typeof(page_num) == "undefined")
    {
        form["page"].value = 0;        
    }
    else
    {
        form["page"].value = page_num;
    }
    
    for (x=0;x < form.elements.length;++x)
    {
       var tag = form.elements[x];
       form_args += "&" + tag.name + "=" + tag.value;       
    }

    var container = document.getElementById("news_results_container");

    var req = new AsynchRequest(action_url,                

        //function on success - using response_text
        function(response_text) 
        { 
            container.innerHTML = response_text;            
        },

        //function on start of load
        function() 
        {
          container.innerHTML="<div style='padding:50px;font-size:1.5em;'><img src='/images/compere/busy.gif' alt'loading'/><span style='padding-left:5px;'>Searching News...</span></div>";
        },
                
        //function on error
        function(error_state)
        {
         container.innerHTML="<span class='alert'>An error occured, please try again.</span>";                              
        },

        "POST",
        form_args
      );

  req.send();  
  return false;

}

function selectCompetitorSet(selected_id, obj)
{
   if (!obj)
   {
      // we have a selected competitor set
      if (selected_id)
      {
         var competitor_obj = document.getElementById(SEARCH_CONTROL + ".saved_set");
         // get selected competitor set
         
         for (x = 0;x < competitor_obj.options.length;++x)
         {
             
             competitor_obj.options[x].selected = false;
             
             if (competitor_obj.options[x].value == selected_id)
             {
                 // select lookup view
                 switchCompanyMode("lookup", true);
                 // disable lookup
                 document.getElementById(SEARCH_CONTROL + ".search_company_lookup_lookup").disabled = true;
                 // set selected value in drop down
                 competitor_obj.options[x].selected = true;
                 break;
             }
         }         
      }
   }
   else
   {
      if (obj.selectedIndex > 0)
      {
         var value = obj.options[obj.selectedIndex].value;
         switchCompanyMode("lookup", true);
         document.getElementById(SEARCH_CONTROL + ".search_company_lookup_lookup").disabled = true;
      }
      else
      {
         document.getElementById(SEARCH_CONTROL + ".search_company_lookup_lookup").disabled = false;
      }

      var competitor_selects = document.getElementsByName(SEARCH_CONTROL + ".saved_set");

      for(j = 0; j < competitor_selects.length; ++j)
      {
         competitor_selects[j].selectedIndex = obj.selectedIndex;
      }
   }
}


function searchCompetitorSetOLD(checked_status, competitor_checkbox)
{
   var selected_checkbox = (checked_status ? checked_status : competitor_checkbox.checked);
   
   if (selected_checkbox)
   {
      // reset company search fields and switch to lookup view
      switchCompanyMode("lookup", true);
      document.getElementById(SEARCH_CONTROL + ".search_company_lookup_lookup").disabled = true;
   }
   else
   {
      // enable company search fields      
      document.getElementById(SEARCH_CONTROL + ".search_company_lookup_lookup").disabled = false;
   }
}

function editCompetitorSet(id)
{
   var form = document.forms["competitor_set"];
   form["action"].value="edit";
   form["set_id"].value=id;
   form.submit();
}

function deleteCompetitorSet(id)
{
   if (confirm("Are you sure you want to delete this competitor set?"))
   {
      var form = document.forms["competitor_set"];
      form["action"].value="delete";
      form["set_id"].value=id;
      form.submit();
   }      
}

function copyCompetitorSet(id)
{
   var form = document.forms["competitor_set"];
   form["action"].value="copy";
   form["set_id"].value=id;
   form.submit();
}

function shareCompetitorSet(id)
{
   var form = document.forms["competitor_set"];
   form["action"].value="share";
   form["set_id"].value=id;
   form.submit();
}

function switchSectorURL(obj)
{
    var sector_id = obj.options[obj.selectedIndex].value;

    var url;
    if (sector_id == "email")
    {
        // email innovation page
        url = "email";
    }
    else if (sector_id > 0)
    {
        // standard combination planit report
        url = sector_id;
    }
    else
    {
        url = "all";
    }

    location.href=url;
}

function checkInsightOnlyFields()
{
    var form = document.forms["edit_document"];
    var subhead = document.getElementById("subhead_input");
    var image = document.getElementById("image_upload_input");

    if (form["document_type"].value == 1)
    {
        subhead.disabled = false;
        image.disabled = false;
    }
    else
    {
        subhead.disabled = true;
        image.disabled = true;
    }
}

function verifyEmailReportInput()
{
    var form = document.forms["edit_document"];
    var isOK = true;

    // if no document type is selected or report
    // name is blank, return false
    var message = "The following fields are required:";
    if (form["document_type"].value == 0)
    {
        message = message + "\n\tReport Type";
        isOK = false;
    }
    if (form["name"].value == "")
    {
        message = message + "\n\tReport Name";
        isOK = false;
    }

    if (!isOK)
        alert(message);

    return isOK;
}

function verifyEmailResearchHighlightsInput()
{
    var form = document.forms["edit_research_highlights"];
    var isOK = true;

    // if both title and body are blank, return false
    var message = "Title and Body fields cannot both be blank.";
    if (form["title"].value == "" && form["body"].value == "")
    {
        isOK = false;
    }

    if (!isOK)
        alert(message);

    return isOK;
}

function documentTypeSelected()
{
    checkSectorDropdownField();
    checkImageField();
}

function checkSectorDropdownField()
{
    var form = document.forms["edit_document"];
    var sector_menu = document.getElementById("sector_input");

    if (form["type"].value == 6)
    {
        sector_menu.disabled = false;
    }
    else
    {
        sector_menu.value = 0;
        sector_menu.disabled = true;
    }
}

function checkImageField()
{
    var form = document.forms["edit_document"];
    var image_row = document.getElementById("image_row");

    if (form["type"].value == 4 || form["type"].value == 6 || form["type"].value == 8 || form["type"].value == 9)
    {
        image_row.style.visibility = "visible";
        image_row.style.display = "";
    }
    else
    {
        image_row.style.visibility = "hidden";
        image_row.style.display = "none";
    }
}

function verifyDocumentManagementInput()
{
    var form = document.forms["edit_document"];
    var isOK = true;

    var message = "The following fields are required:";
    if (form["type"].value == 0)
    {
        message = message + "\n\tDocument Type";
        isOK = false;
    }
    if (form["type"].value == 6 && form["sector"].value == 0)
    {
        message = message + "\n\tSector";
        //isOK = false;
    }
    if (form["title"].value == "")
    {
        message = message + "\n\tTitle";
        isOK = false;
    }
    if ((form["type"].value != 8 && form["type"].value != 9) && form["body"].value == "")
    {
        message = message + "\n\tBody";
        isOK = false;
    }
    if (form["modifiedby"].value == "")
    {
        message = message + "\n\tModified By";
        isOK = false;
    }

    var display_date_value = form["display_date"].value;
    if (display_date_value != "")
    {
        if (!validateDateFormat(display_date_value) || !validateDateValue(display_date_value))
        {
            message = message + "\n\nDisplay Date must be in the format MM/DD/YYYY";
            isOK = false;
        }
        else
        {
            // convert to mysql date (YYYY-MM-DD) if no other fields were invalid
            if (isOK)
            {
                var split_date = display_date_value.split('/');
                form["display_date"].value = split_date[2] + '-' + split_date[0] + '-' + split_date[1];
            }
        }
    }

    var link_url = form["link_url"].value;
    if (isOK && link_url != "" && link_url.substr(0,4) != 'http')
    {
        form["link_url"].value = 'http://' + link_url;
    }

    if (!isOK)
        alert(message);

    return isOK;
}

function verifyDownloadWebinar()
{
    var alert_message = "The following fields must be populated:";

    var form = document.forms["download_webinar_form"];
    var isOK = true;

    // check user_name, company, email, and phone fields - NONE CAN BE BLANK
    if (form["user_name"].value == "")
    {
        alert_message += "\n\tName";
        isOK = false;
    }
    if (form["company"].value == "")
    {
        alert_message += "\n\tCompany";
        isOK = false;
    }
    if (form["email"].value == "")
    {
        alert_message += "\n\tEmail";
        isOK = false;
    }
    if (form["phone"].value == "")
    {
        alert_message += "\n\tPhone";
        isOK = false;
    }

    if (!isOK)
    {
        alert(alert_message);
    }

    return isOK;
}

function addCheckboxStyle()
{
    var inputs = document.getElementsByTagName('input');
    for (i=0;i<inputs.length;i++)
    {
        if ('checkbox' == inputs[i].type && inputs[i].checked)
        {
            setCheckboxStyle(inputs[i]);
        }
    }
}

function toggleDivDisplay(div_id, show) 
{
    var div = document.getElementById(div_id);
    
    if (div)
    {
      if (show)
      {
        div.style.display = 'block';
      }
      else 
      {
        div.style.display = 'none';
      }
    }
}

var loadedCalendars = {}
function loadCalendarPopup(input_id, is_max)
{
    if (loadedCalendars[input_id])
    {
        // already loaded a calendar for this field
        return;
    }
    loadedCalendars[input_id] = true;
    var cal_id = input_id + '_cal';
    var cal_div_id = cal_id + '_container';

    var input_text = document.getElementById(input_id);
    var selected = '';
    var pagedate = '';
    if (input_text)
    {
        selected = input_text.value + '';
    }

    var date_array = selected.split('/');
    if (date_array[0] && date_array[2])
    {
        pagedate = date_array[0] + '/' + date_array[2];
    }

    var title;
    if (is_max)
    {
        title = 'End:';
    }
    else
    {
        title = 'Start:';
    }

    var calendar = new YAHOO.widget.Calendar(cal_id, cal_div_id, {
        title: title,
        close: true,
        navigator: true,
        hide_blank_weeks: true,
        selected: selected,
        pagedate: pagedate,
        mindate: '1/1/1900',
        maxdate: '12/31/9999',
        locale_months: 'short',
        locale_weekdays: '1char'
    });
    calendar.render();
    calendar.name = input_id;

    YAHOO.util.Event.addListener(input_id+'_button', 'click', calendar.show, calendar, true);
    calendar.selectEvent.subscribe(handleDateSelection, calendar, true);
    calendar.beforeShowEvent.subscribe(toggleCalendarDisplay, calendar, true);
}

function handleDateSelection(type, args, obj)
{
    var dates = args[0];
    var date = dates[0];
    var year = date[0], month = date[1], day = date[2];

    var input_id = obj.name;
    var input_text = document.getElementById(input_id);
    if (input_text)
    {
        input_text.value = month + '/' + day + '/' + year;
    }

    obj.hide();
}

function toggleCalendarDisplay(type, args, calendar)
{
    var cal_id = calendar.id;
    var cal_div_id = cal_id + '_container';
    var cal_div = document.getElementById(cal_div_id);

    var is_visible = 0;
    if (cal_div)
    {
        if (cal_div.style.display == 'block')
        {
            is_visible = 1;
        }
    }

    if (is_visible)
    {
        calendar.hide();
        return false;
    }
    else
    {
        var cal_name = calendar.name;
        var is_max = (cal_name.substr(cal_name.length-4, 4) == '_max');

        var this_input = document.getElementById(cal_name);
        var other_input_id = is_max ? cal_name.substr(0, cal_name.length-4) : cal_name+'_max';
        var other_input = document.getElementById(other_input_id);

        var input_date = '';
        if (this_input)
        {
            input_date = this_input.value;
            if (!validateDateFormat(input_date) && other_input)
            {
                input_date = other_input.value;
            }
        }

        if (validateDateFormat(input_date) && validateDateValue(input_date))
        {
            calendar.setMonth(input_date.split('/')[0]-1);
            calendar.setYear(input_date.split('/')[2]);
            calendar.render();
        }
        return true;
    }
}

function submitSearchForm( inputButton,validate )
{
    if (typeof(validate)=='undefined')
        validate=true;

    // Validate the form's numeric and date inputs
    if (validate && !validateFormFields(this.form))
    {
        return false;
    }

    // Select all if select none for dataset, country and sector
    if (validate)
    {
        validateFormForPlanit(this.form)
    }

    var hiddenSubmitInput = document.getElementById( 'submit_input' );
    if (inputButton.name && hiddenSubmitInput )
    {
        hiddenSubmitInput.name = inputButton.name;
        hiddenSubmitInput.form.submit();
    }
    return true;
}

function expandPopulatedSearchGroups()
{
    // Searching by tagName b/c ie cannot search by elemName onload
    var searchGroups = document.getElementsByTagName('div');
    var leest = [];
    for (i=0;i<searchGroups.length;++i)
    {   
        if ('tab_group' != searchGroups[i].id.substr(0,9))
        {
            continue;
        }

        // Group will not be expanded by default 
        var expandGroup = false;

        // Go through the text and checkbox inputs
        searchGroupInputs = searchGroups[i].getElementsByTagName('input');
        for (j=0;j<searchGroupInputs.length;++j)
        {
            if ('text' == searchGroupInputs[j].type)
            {
                if ("" != searchGroupInputs[j].value)
                {
                    expandGroup = true;
                    break;
                }
            }
            else if ('checkbox' == searchGroupInputs[j].type)
            {
                if (true == searchGroupInputs[j].checked)
                {
                    expandGroup = true;
                    break;
                }
            }
        }

        // Go through selects (unless expansion's already been determined)
        if (!expandGroup)
        {
            // Go through the selects
            var searchGroupSelects = searchGroups[i].getElementsByTagName('select');
            for (k=0;k<searchGroupSelects.length;++k)
            {
                if (searchGroupSelects[k].selectedIndex && 0 < searchGroupSelects[k].selectedIndex)
                {
                    expandGroup = true;
                    break;
                }
            }
        }

        if (expandGroup)
        {
            var groupName = searchGroups[i].id.substr(9);
            selectGroup(groupName,true);
        }
    }
}

function validateFormForPlanit(formEl)
{
    function selectNoneSelectAll( listInputs )
    {
        var selected = false;
        for (i=0;i<listInputs.length;++i)
        {   
            // 'hidden' handles special case of sector on the
            if ('hidden' == listInputs[i].type || ('checkbox' == listInputs[i].type && listInputs[i].checked))
            {
                selected = true;
                break;
            }
        }
        if (!selected)
        {
            for (j=0;j<listInputs.length;++j)
            {
                listInputs[j].checked = true;
            }
        }
    }

    selectNoneSelectAll(YAHOO.util.Dom.getElementsBy(function(elem){return (elem.name=='Country');},'input',formEl));
    selectNoneSelectAll(YAHOO.util.Dom.getElementsBy(function(elem){return (elem.name=='Sector');},'input',formEl));
    selectNoneSelectAll(YAHOO.util.Dom.getElementsBy(function(elem){return (elem.name=='Dataset');},'input',formEl));
}

/* Validate form's text inputs before submission
    - For input(s) of the numeric or date class: verify non-empty fields are valid.
    - If not valid:
        * Use the YUI.util.Dom library to highlight invalid inputs
        * Add a listener to the input that'll remove the highighting when it's edited
        * Use page's infobox to alert() to tell user that field(s) were invalid */
function validateFormFields(formEl)
{
    var textBoxFocused = function( event ) {
        var target = YAHOO.util.Event.getTarget( event );
        target.value = '';
        YAHOO.util.Dom.removeClass(target,'invalid_input');
    };

    var errorMsgs = [];
    // Validate decimal inputs - as long as these are numeric, we're ok
    var decimalInputs = YAHOO.util.Dom.getElementsByClassName('decimal_field','input',formEl);
    for (i=0;i<decimalInputs.length;++i)
    {
        if (isNaN(decimalInputs[i].value))
        {
            errorMsgs.push("<em>" + decimalInputs[i].value + "</em> entered where a numeric value expected.");
            YAHOO.util.Dom.addClass(decimalInputs[i],'invalid_input');
            YAHOO.util.Event.addListener(decimalInputs[i],"focus",textBoxFocused);
        }
    }

    // Validate integer inputs
    var integerInputs = YAHOO.util.Dom.getElementsByClassName('integer_field','input',formEl);
    for (n=0;n<integerInputs.length;++n)
    {
        val = integerInputs[n].value;
        int_cast = parseInt(val);
        if (val && val != int_cast)
        {
            errorMsgs.push("<em>" + val + "</em> entered where an integer value expected.");
            YAHOO.util.Dom.addClass(integerInputs[n],'invalid_input');
            YAHOO.util.Event.addListener(integerInputs[n],"focus",textBoxFocused);
        }
    }

    // Validate date inputs
    var dateInputs = YAHOO.util.Dom.getElementsByClassName('date_field','input',formEl);
    for (j=0;j<dateInputs.length;++j)
    {
        if (dateInputs[j].value)
        {
            if (!validateDateFormat(dateInputs[j].value))
            {
                errorMsgs.push("<em>" + dateInputs[j].value + "</em> was entered where a date ('mm/dd/yyyy') is expected. ");
                YAHOO.util.Dom.addClass(dateInputs[j],'invalid_input');
                YAHOO.util.Event.addListener(dateInputs[j],"focus",textBoxFocused);
            }
            else if (!validateDateValue(dateInputs[j].value))
            {
                errorMsgs.push("<em>" + dateInputs[j].value + "</em> is not a valid date value. ");
                YAHOO.util.Dom.addClass(dateInputs[j],'invalid_input');
                YAHOO.util.Event.addListener(dateInputs[j],"focus",textBoxFocused);
            }
        }
    }

    // Validate fulltext inputs
    var fulltextInputs = YAHOO.util.Dom.getElementsByClassName('fulltext_field','input',formEl);
    for (var m=0;m<fulltextInputs.length;++m)
    {
        // Skip validation of empty fulltext fields
        if (0 == fulltextInputs[m].value.length)
            continue;
   
        // Drop trailers that muck up lucene.
        var search = /[\"\s]?(?:and|or|not|\+|\!|\&\&)\s*$/i;
        var replace = /(?:and|or|not|\+|\!|\&\&)\s*$/i;
        for (var n = 0; (0 < fulltextInputs[m].value.search(search) && n < 10); ++n)
        {
            fulltextInputs[m].value = fulltextInputs[m].value.replace(replace,'');
        }

        if (!validateFulltextValue(fulltextInputs[m].value))
        {
            errorMsgs.push("<em>" + fulltextInputs[m].value.replace(/"/g,"\"") + "</em> contains unbalanced double quotes.");
            YAHOO.util.Dom.addClass(fulltextInputs[m],'invalid_input');
            YAHOO.util.Event.addListener(fulltextInputs[m],"focus",textBoxFocused);
        }
    }

    // Inform user that fields are invalid
    if (0 < errorMsgs.length)
    {
        var errorMsg = "";
        errorMsg += "You entered " + ((1==errorMsgs.length) ? "an invalid search criterion" : "invalid search criteria" ) + ":<br/>";
        errorMsg += "<ul style=\"margin-top:0px;margin-bottom:0px;position:relative;\">";
        for (i=0;i<errorMsgs.length;++i)
            errorMsg += "<li style=\"position:relative;\">"+ errorMsgs[i] +"</li>";
        errorMsg += "</ul>";
        errorMsg += "Please correct before continuing your search.";

        var infobox = document.getElementById('form_error');
        if (infobox)
        {
           infobox.innerHTML = errorMsg;
           infobox.style.display = 'block';
        }
        else
        {
            alert("You have entered invalid inputs. Please correct highlighted inputs before continuing your search.");
        }

        // Send to the top of page
        document.location.href="#";
        return false;
    }
    return true;
}

/* validateDateField
   - Pieces of this code comes courtesty of SmartWebby.com (http://www.smartwebby.com/dhtml/)
   - Verifies the date is a fwd-slash separated list of three integers 30/30/30 would pass, jan 20 2008 would not.*/
function validateDateFormat(strDate)
{
    // Split date on '/' separator
    var splitDate = strDate.split('/');

    // Expect three fields
    if (3 != splitDate.length)
        return false;

    // All should be numbers
    for (i=0;i<splitDate.length;++i)
    {
        if (isNaN(splitDate[i]))
        {
            return false;
        }
    }
    return true;
}

/* validateDateValue
    - Pieces of this code comes courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
    - Verifies that the date is valid: ie., 2/30/08 would fail.
*/
function validateDateValue(strDate)
{
    /*if (!validdateDateFormat(strDate))
        return false;*/

    var splitDate = strDate.split('/');
    
    // Validate the year
    if (splitDate[2] < 1900 || 2100 < splitDate[2])
        return false;

    // Validate the month
    if (splitDate[0] < 1 || 12 < splitDate[0])
        return false;

    // Verify the date
    if (splitDate[1] < 1)
        return false;

    if (1 == splitDate[0] || 3 == splitDate[0] || 5 == splitDate[0] || 7 == splitDate[0] || 8 == splitDate[0] || 10 == splitDate[0] || 12 == splitDate[0])
    {
        if (31 < splitDate[1])
            return false;
    }
    else if (4 == splitDate[0] || 6 == splitDate[0] || 9 == splitDate[0] || 11 == splitDate[0])
    {
        if (30 < splitDate[1])
            return false;
    }
    else if (2 == splitDate[0])
    {
        if ((splitDate[2] % 4) == 0)
        {
            if (29 < splitDate[1])
                return false;
        }
        else
        {
            if (28 < splitDate[1])
                return false;
        }
    }
    return true;
}

// Verifies double quotes exist in matching pairs
function validateFulltextValue(strValue)
{
    if (strValue && (0 < strValue.length))
    {
        var dblQuotePosition = 0;
        var dblQuoteCount = 0;
        while (dblQuotePosition != -1)
        {
            dblQuotePosition = strValue.indexOf('"',dblQuotePosition);
            if (dblQuotePosition != -1)
            {
                dblQuotePosition++;
                dblQuoteCount++;
            }
        }
        
        if ((dblQuoteCount % 2) != 0)
        {
            return false;
        }
    }
    return true;
}

function validateSavedSearchName()
{
    var input = document.getElementById('search_name');
    if (input)
    {
        if (input.value == '')
        {
            alert('Please enter a name for your search.');
            return false;
        }
        else
        {
            return true;
        }
    }
    else
    {
        return false;
    }
}

function manageProfileSavedSearches()
{
    var action_input = document.getElementById("action");
    var profile_id_input = document.getElementById("profile_id");
    var search_boxes = document.getElementsByName("profile_saved_search");
    var profiles_input = document.getElementById("other_profiles");

    var action = "";
    var profile_id = 0;

    if (action_input)
    {
        action = action_input.value;
        if (action == '')
        {
            alert("Please select an action to perform");
            return;
        }
    }

    var go = true;
    if (action == 'delete')
    {
        go = confirm('Are you sure you want to delete the selected search(es)?');
    }

    if (!go)
    {
        return;
    }

    if (profile_id_input)
    {
        profile_id = profile_id_input.value;
    }

    var url = "/manage_profile_saved_searches/?profile_id="+profile_id+"&action="+action+"&search_id=";

    var search_count = 0;
    for (var i=0; i<search_boxes.length; i++)
    {
        var search_box = search_boxes[i];
        var search_id;
        if (search_box)
        {
            search_id = search_box.id;
            if (search_box.checked)
            {
                url = url + search_id + "|";
                search_count++;
            }
        }
    }

    if (search_count == 0)
    {
        alert("Please select at least one search to "+action);
        return;
    }

    url = url + "&dest_profile=";
    if (profiles_input)
    {
        var other_profiles = profiles_input.options;
        var dest_profile_count = 0;
        for (var j=0; j<other_profiles.length; j++)
        {
            var other_profile = other_profiles[j];
            if (other_profile.selected)
            {
                url = url + other_profile.value + "|";
                dest_profile_count++;
            }
        }

        if (dest_profile_count == 0 && action != "delete")
        {
            alert("Please select at least one profile to "+action+" to");
            return;
        }
        else if (dest_profile_count > 1 && action == "move")
        {
            alert("You cannot move a search to more than one profile")
            return;
        }
    }

    location.href = url;
}

function submitSavedSearch(search_id)
{

    var saved_searches_form = document.getElementById('saved_searches_form');
    var search_id_input = document.getElementById('saved_searches_form_search_id');
    search_id_input.value = search_id;
    saved_searches_form.submit();
    return true;
}

function manageEmailAlert(search_id)
{
    var list_name = 'alert' + search_id;
    var index = document.forms['profile_searches'].elements[list_name].selectedIndex;
    var value = document.forms['profile_searches'].elements[list_name].options[index].value;

    var profile_id_input = document.getElementById("profile_id");
    var profile_id = 0;
    if (profile_id_input)
    {
        profile_id = profile_id_input.value;
    }

    var url = "/manage_profile_saved_searches/?profile_id="+profile_id+"&action=set_email_alert&search_id="+search_id+"&value="+value;

    location.href = url;
}

function manageProfileOfferToolViews()
{
    var action_input = document.getElementById('action');
    var profile_id_input = document.getElementById('profile_id');
    var view_boxes = document.getElementsByName('profile_saved_view');
    var profiles_input = document.getElementById('other_profiles');

    var action = '';
    var profile_id = 0;

    if (action_input)
    {
        action = action_input.value;
        if (action == '')
        {
            alert('Please select an action to perform');
            return;
        }
    }

    var go = true;
    if (action == 'delete')
    {
        go = confirm('Are you sure you want to delete the selected Interactive Analysis View(s)?');
    }

    if (!go)
    {
        return;
    }

    if (profile_id_input)
    {
        profile_id = profile_id_input.value;
    }

    var url = '/offer_tool_manage_profile_views/?profile_id=' + encodeURIComponent(profile_id) + '&action=' + encodeURIComponent(action) + '&saved_view_id=';

    var view_count = 0;
    for (var i=0; i<view_boxes.length; i++)
    {
        var view_box = view_boxes[i];
        if (view_box)
        {
            var view_id = view_box.id;
            if (view_box.checked)
            {
                url = url + encodeURIComponent(view_id) + '|';
                view_count++;
            }
        }
    }

    if (view_count == 0)
    {
        alert('Please select at least one Interactive Analysis View to ' + action);
        return;
    }

    url = url + '&dest_profile=';
    if (profiles_input)
    {
        var other_profiles = profiles_input.options;
        var dest_profile_count = 0;
        for (var j=0; j<other_profiles.length; j++)
        {
            var other_profile = other_profiles[j];
            if (other_profile.selected)
            {
                url = url + encodeURIComponent(other_profile.value) + '|';
                dest_profile_count++;
            }
        }

        if (dest_profile_count == 0 && action != 'delete')
        {
            alert('Please select at least one profile to ' + action + ' to');
            return;
        }
        else if (dest_profile_count > 1 && action == 'move')
        {
            alert('You cannot move an Interactive Analysis View to more than one profile');
            return;
        }
    }

    location.href = url;
}

function manageOfferToolEmailAlert(saved_view_id)
{
    var list_name = 'alert' + saved_view_id;
    var index = document.forms['profile_saved_views'].elements[list_name].selectedIndex;
    var value = document.forms['profile_saved_views'].elements[list_name].options[index].value;

    var profile_id_input = document.getElementById('profile_id');
    var profile_id = 0;
    if (profile_id_input)
    {
        profile_id = profile_id_input.value;
    }

    var url = '/offer_tool_manage_profile_views/?profile_id=' + encodeURIComponent(profile_id) + '&action=set_email_alert&saved_view_id=' + encodeURIComponent(saved_view_id) + '&value=' + encodeURIComponent(value);

    location.href = url;
}

function getRecentCampaignsForFrontpage()
{
    var div = document.getElementById('recent_campaigns_body');
    if (div)
    {
        var url = '/recent_campaigns/';
        var args;
        var request = new AsynchRequest(url,
                        // function on success
                        function(response_text)
                        {
                            div.innerHTML = response_text;
                        },
                        // function on start of load
                        function() {},
                        // function on error
                        function ()
                        {
                            div.innerHTML = '<div>There are no recent campaigns at this time.</div>';
                        },
                        "GET",
                        args
                    );
        request.send();
    }
}

function showHomepageDropdowns(show)
{
    var display_type = 'none';
    if (show)
    {
        display_type = 'inline';
    }
    var dropdowns = document.getElementsByTagName('select');
    for (var i=0; i<dropdowns.length; i++)
    {
        dropdowns[i].style.display = display_type;
    }
}

function jumpToOfferToolView()
{
    var dropdown = document.getElementById('saved_views_dropdown');
    if (dropdown)
    {
        var value = dropdown.value;
        if (value != '')
        {
            location.href = '/offer_tool/load_view/?saved_view_id=' + value + '&force_redirect=1';
        }
    }
}

function getSimilarRecords(item_id)
{
    var div = document.getElementById('similar_records_div');
    if (div)
    {
        var url = '/similar_records/' + escape(item_id) + '/';
        var args;
        var request = new AsynchRequest(url,
                // function on success
                function(response_text)
                {
                    div.innerHTML = response_text;
                    var help_link = document.getElementById('similar_records_help_link');
                    if (help_link)
                    {
                        help_link.style.display = '';
                    }
                },
                // function on start of load
                function() {},
                // function on error
                function()
                {
                    div.style.color = 'red';
                    div.innerHTML = 'Unable to get similar offers.'
                },
                "GET",
                args
        );
        request.send();
    }
}

function toggleHiddenSimilarRecords(total_rows, show)
{
    var row_display = 'none';
    var show_link_display = '';
    var hide_link_display = 'none';
    if (show)
    {
        // don't do display:block, it causes entire row to get condensed into one cell
        row_display = '';
        show_link_display = 'none';
        hide_link_display = '';
    }

    for (var i=0; i<total_rows; i++)
    {
        var row = document.getElementById('hidden_similar_record_row_' + i);
        if (row)
        {
            row.style.display = row_display;
        }
    }

    var show_link_tag = document.getElementById('show_similar_records_link');
    if (show_link_tag)
    {
        show_link_tag.style.display = show_link_display;
    }

    var hide_link_tag = document.getElementById('hide_similar_records_link');
    if (hide_link_tag)
    {
        hide_link_tag.style.display = hide_link_display;
    }
}

function highlightOCRText(item_id)
{
    var ocr_input = document.getElementById('ocr_highlight_text');
    if (ocr_input)
    {
        var ocr_text = ocr_input.value;
        location.href = '/item/' + escape(item_id) + '/?ocr_highlight_text=' + escape(ocr_text);
    }
}

/* Fire AJAX request to log (in the appserver's logs) that the page has loaded. From the 
   perspective of the javascript, we don't care about the response.
   Note: This AJAX request will fire after the page is loaded. There may be additional onload
         events that are handled after this is fired, however. */
addLoadEvent(function(){
    var pageLoadedUrl = '/sinatra/compere/log_pageload/';
    var pageLoadedFormArgs; 
    var pageLoadedReq = new AsynchRequest(
        pageLoadedUrl,
        function(response_text){},
        function( ){},
        function(error_state){},
        "GET",
        pageLoadedFormArgs 
        );
    pageLoadedReq.send();
});
