/*********************/
/* Utility Functions */
function getElement(el)
{
    if (document.getElementById){return document.getElementById(el);}
    else if (document.all){return document.all[el];}
    else if (document.layers){return document.layers[el];}
    return false;
}
function DisplayDiv(obj)
{
	if (typeof(obj)!="object"){ obj = getElement(obj); }
	if (obj===false){return;}
	if (obj.visibility){ obj.visibility="show"; return; }
	if (obj.style){ obj.style.display="block"; return; }
}
function UndisplayDiv(obj){
	if (typeof(obj)!="object"){ obj = getElement(obj); }
	if (obj===false){return;}
	if (obj.visibility){ obj.visibility="hide";  return;}
	if (obj.style){ obj.style.display="none";  return; }
}
function isHidden(obj){
	if (typeof(obj)!="object"){ obj = getElement(obj); }
	if (obj===false){ return true; }
	if (obj.visibility){ return (obj.visibility=="hide"); }
	if (obj.style){ return (obj.style.display=="none"); }
}
function ToggleDiv(div){
	d = getElement(div);
	if (d!==false&&d!==null){ 
		if (isHidden(d)){ 
			DisplayDiv(d); 
		}else{ 
			UndisplayDiv(d); 
		}
	}
	return false;
}
// This function should be removed in due course - kept for the moment for debugging
// Use addEvent function instead
function addOnLoad(fn)
{
    alert('addOnLoad call for function ' + fn + ' deprecated. Use addEvent instead');
    var oldonload = (window.onload) ? window.onload : function () {};
    window.onload = function () { oldonload(); fn(); };
}
function addEvent(obj,evt,fn,useCapture)
{
    if (typeof(obj)!="object"){ obj = getElement(obj); }
    if (obj.addEventListener){ obj.addEventListener(evt,fn,useCapture); return true;}
    else if (obj.attachEvent){ var ret = obj.attachEvent('on'+evt, fn); return ret; }
    else { return false; }
}
// Make all divs passed to the function the same height as the tallest one
function matchDivSizes()
{
    var h = 0;
    var els = Array();
    for (i=0;i<arguments.length;i++){ el = getElement(arguments[i]); h = (el.offsetHeight>h) ? el.offsetHeight : h ; els.push(el); }
    h = h + "px";
    for (i=0;i<els.length;i++){ 
        els[i].style.height = h;
    }
}
function resetDivSizes()
{
    for (i=0;i<arguments.length;i++){ 
        getElement(arguments[i]).style.height = 'auto';
    }
}
/********************************************************************/

/*************************************/
/* Function to clear fields on focus */
function modelClearer(fieldname)
{
    //if (!value_is_user_supplied(fieldname,getElement(fieldname).value)){ getElement(fieldname).value = ''; }
    if (!value_is_user_supplied(fieldname)){ getElement(fieldname).value = ''; }
}
/***********************************/
// Validate search for quicksearch form
function validate_search(f)
{
    var err = Array();
    var els = f.elements;
    var ids = Array();
    // Get element names
    for (i=0;i<els.length;i++)
    {
        if (    (els[i].type == "text" || els[i].type == "select-one") 
                && els[i].id != "curCurrency" 
                && els[i].id != "lengthunits" 
           )
        {
            ids[ids.length]=els[i].id;
        }
    }
    
    // At least one
    if (at_least_one_of(ids)===false) 
    {
        err[err.length] = "* You must enter at least one search parameter"; 
    }
    
    // Numbers
    if (!is_a_number('minlength') && value_is_user_supplied('minlength'))
    {
        err[err.length] = "* Minimum length must be a whole number greater than zero";    
    }
    if (!is_a_number('maxlength') && value_is_user_supplied('maxlength'))
    {
        err[err.length] = "* Maximum length must be a whole number greater than zero";
    }

    // Min length < Max length
    if (value_is_user_supplied('minlength') && value_is_user_supplied('maxlength'))
    {
        if (parseInt(get_value('minlength')) > parseInt(get_value('maxlength')))
        {
            err[err.length] = "* Minimum length must be less than maximum length";
        }
    }

    // Min price < Max price
    if (value_is_user_supplied('min_pr') && value_is_user_supplied('max_pr'))
    {
        if (parseInt(get_value('min_pr')) > parseInt(get_value('max_pr')))
        {
            err[err.length] = "* Minimum price must be less than maximum price";
        }
    }

    if (err.length > 0)
    {
        showError("error_panel_search", "error_text_search", err.join('<br />'));
        return false;
    }
    
    return true;
}
// Validation utility functions
var arrDefaultValues = new Array();
arrDefaultValues['manufacturer']        = "Make/Model";
arrDefaultValues['keyword']             = "Keywords";
arrDefaultValues['minlength']           = "Min Length";
arrDefaultValues['maxlength']           = "Max Length";
arrDefaultValues['channel']             = "0";
arrDefaultValues['country']             = "0";
arrDefaultValues['min_pr']              = "0";
arrDefaultValues['max_pr']              = "0";
arrDefaultValues['neworused']           = "B";
arrDefaultValues['boatstoview']         = "all";
arrDefaultValues['enquirer_name']       = "Name*";
arrDefaultValues['enquirer_email']      = "Email*";
arrDefaultValues['enquirer_telephone']  = "Telephone";

// Function to check if the content of a given field is user supplied or not
function value_is_user_supplied(el)
{
    val = (arguments.length == 1) ? get_value(el) : arguments[1] ;
    if ( val == arrDefaultValues[el])
    {
        return false; // value is same as default
    }
    if ( val.length == 0 )
    {
        return false; // value has zero length
    }
    return true; // value is not default
}
/***************************************/
// Function to re-populate the quick search form fields if the focus is taken away without any new data being entered
function populate_search_fields(el)
{
    if(el.value.length == 0){ el.value = arrDefaultValues[el.id]; }
}

// Returns the value of a form element whatever its type
function get_value(el)
{
    el = (typeof(el)!="object") ? getElement(el) : el ;
    switch(el.type) {
        case "select-one":
            var val = el.options[el.selectedIndex].value;
            break;
        default:
            var val = el.value;
            break;
    }
    return val;
}
// Returns true if at least one of the ids passed to it (assumed to be form field elements) has a non-default, non-zero-length value
// Expects 1 arg - an array of ids or objects
function at_least_one_of(ids)
{
    for (i=0;i<ids.length;i++)
    {
        obj = (typeof(ids[i])!="object") ? getElement(ids[i]) : ids[i] ;
        if (value_is_user_supplied(obj.id))
        {
            return true;
        }
    }
    return false;
}
// This function will return true if the argument is a number and false if any other datatype..
function is_a_number(el) {    var re = /^\d+$/;
    var val = get_value(el);
    if (val.match(re)){
        return true;
    }
    return false;
}
var timeoutHandle;
function showError(panel, textarea, str)
{
	var errorMessageTimeout = 5000;
    t = getElement(textarea);
    t.innerHTML = str;
	DisplayDiv(panel);
	clearTimeout(timeoutHandle);
	timeoutHandle = setTimeout("UndisplayDiv('" + panel + "')", errorMessageTimeout);
}
/***********************************/

/***********************************/
/* Functions for QuickSearch Panel */
function addCommas(num){
	num += '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(num)){num = num.replace(rgx, '$1' + ',' + '$2');}
	return num;
}
function changeCombos(cur){
	var rng = arrRanges[cur];
	var prc = arrPrices;
	for (i=1;i<arguments.length;i++){
		var obj = getElement(arguments[i]);var sel = obj.selectedIndex;obj.options.length = 0;var h = 0;
		obj.options[obj.options.length] = new Option(getOptionText(obj.id), '0');
		for (j=0;j<prc.length;j++){obj.options[obj.options.length]=new Option(addCommas(prc[j] * rng[1]),prc[j] * rng[1]);h = prc[j] * rng[1];}
		obj.options[obj.options.length] = new Option('> ' + addCommas(h), h+1); obj.selectedIndex = sel;
	}
}
function setComboValues(){
    for (i=0;i<arguments.length;i++){ 
        p = arguments[i]; 
        el = getElement(p.el);        
        for (j=0;j<el.options.length;j++) { if (el.options[j].value == p.val) { el.options[j].selected = true; break; } }
    }
}
function getOptionText(obj){
	switch(obj){
		case "min_pr":
			return "Min";
		case "max_pr":
			return "Max";
		default:
			return "Select";
	}
}
/***********************************/
// Function to control max length for textareas
function checklength(el,l){ if (el.value.length>l) {el.value=el.value.substring(0,l)} }
// Function to turn off autocomplete attribute for manufacturer tag
function autocompleteOff() { getElement('manufacturer').setAttribute('autocomplete', 'off'); }
