﻿/** ABOS Javascript file
  *
  * Contains definitions for reusable functions for the ABOS Page
  *
  * By: Mbonisi Masilela (9/14/2008)
  *
  */

var BOAT_BUILDER_SEARCH_DEFAULT_VALUE   = "Select a Builder";
var BOAT_MODEL_SEARCH_DEFAULT_VALUE     = "Select a Model";
var BOAT_BUILDER_CUSTOM                 = "Custom";
var BOAT_BUILDER_OTHER                  = "Other";
var BOAT_BUILDER_HOMEBUILT              = "Homebuilt";

var BOAT_LENGTH_PLUS_MINUS              = 2;
var ICON_NONE_SRC_PATH                  = "images/spacer.gif";
var ICON_WAIT_SRC_PATH                  = "images/wait20.gif";
var MSG_TYPE_ERR                        = 1;
var MSG_TYPE_INFO                       = 2;

var LastSelectedBoatBuilder = "";
var LastSelectedBoatModelBuilder = "";
var LastSelectedBoatModel = "";
var LastSearchYear = "";
var LastSearchBoatLength = "";
var LastSearchedBuilder = ""
var LastSearchBuilderFirstCharacter = "";
var BoatBuilderSearchType;

var IconNone, IconWait;
    //Preload Image Icons for faster
    IconNone = new Image();
    IconNone.src = ICON_NONE_SRC_PATH;
    IconWait = new Image();                
    IconWait.src = ICON_WAIT_SRC_PATH; 

function ValidateUserInformation()
{
    if(IsSpaces(document.getElementById('my_boat_builder').value))
    {
        DisplayMsg('user_info_msg','Enter a Boat Builder ',MSG_TYPE_ERR);   
        document.getElementById('my_boat_builder').className="error_class";
        document.getElementById('my_boat_builder').focus();
        return false;
    }
    if(IsSpaces(document.getElementById('my_boat_model').value))
    {
        DisplayMsg('user_info_msg','Enter a Boat Model ',MSG_TYPE_ERR);                    
        document.getElementById('my_boat_model').className="error_class";
        document.getElementById('my_boat_model').focus();
        return false;
    }              
    DisplayMsg('user_info_msg','&nbsp;',MSG_TYPE_INFO);
    document.getElementById('my_boat_builder').className="default_class";
    document.getElementById('my_boat_model').className="default_class";   
    return true;
}

function ClearBuilderFirstLetter()
{
    document.getElementById('boat_builder_first_letter').value = '';
}
                          
function IsValidYearAndLength(showMsg)
{
    var boat_year = document.getElementById("boat_year");
    var boat_length = document.getElementById("boat_length");
    var message = "";
    
    var errObj;
    
    boat_year.className = "default_class";
    boat_length.className = "default_class";
    
    if(!IsNumeric(boat_length.value) || boat_length.value.length == 0)
    {
        message = "Enter a valid Boat Length";
        errObj = boat_length;
    }
    if(!IsNumeric(boat_year.value) ||  
       parseInt(boat_year.value) < 1900 || 
       parseInt(boat_year.value) > GetCurrentYear() + 1)
    {
        message = "Enter the valid Boat Year";                    
        errObj = boat_year;
    }

    if(message == "")
    {
        DisplayMsg('global_error_msg','&nbsp;', MSG_TYPE_INFO);
        return true;
    }
    else
    {
        if(showMsg)
        {
            DisplayMsg('global_error_msg', message, MSG_TYPE_ERR);
            errObj.className="error_class";
            //errObj.focus();
        }
        return false;
    } 
}

function SaveSearchParameters()
{
    LastSearchYear = document.getElementById('boat_year').value;
    LastSearchBoatLength = document.getElementById('boat_length').value;
    LastSearchBuilderFirstCharacter = document.getElementById('boat_builder_first_letter').value;
}

function AnyChangesInSearchParameters()
{
    if(LastSearchYear == document.getElementById('boat_year').value &&
       LastSearchBoatLength == document.getElementById('boat_length').value &&
       LastSearchBuilderFirstCharacter == document.getElementById('boat_builder_first_letter').value)
       return false;
    else
       return true;         
}

function IsValidBuilderFirstCharacter()
{
    if(!IsAlphaNumeric(document.getElementById('boat_builder_first_letter').value))
    {
        DisplayMsg('global_error_msg','Enter the first letter of the Boat Builder only!',MSG_TYPE_ERR);
        document.getElementById('boat_builder_first_letter').className = "error_class";
        //document.getElementById('boat_builder_first_letter').focus();                    
        return false;
    }
    else
    {
        DisplayMsg('global_error_msg','&nbsp;',MSG_TYPE_INFO);
        document.getElementById('boat_builder_first_letter').className = "default_class";
        return true;                    
    }
}

function AutoRetrieveBoatBuilderInfo()
{                    
    if(IsValidYearAndLength(true) && IsValidBuilderFirstCharacter())
    {                    
        UpdateBoatBuilderList();
    }
}

function DisplayMsg(obj,text, msg_type)
{
    if(msg_type == MSG_TYPE_ERR)
    {
        document.getElementById(obj).className = "msg_err";
        document.getElementById(obj).innerHTML = '* ' + text;       
    }    
    else
    {
        document.getElementById(obj).className = "msg_info";
        document.getElementById(obj).innerHTML = text;                       
    }
}

function SetBoatBuilderSearchInputsDisabled(b)
{
    if(b == "true")
    {
        document.getElementById('boat_builder_list').disabled = true;
        document.getElementById('boat_builder_search').disabled = true;                
    }
    else
    {
        document.getElementById('boat_builder_list').disabled = false;
        document.getElementById('boat_builder_search').disabled = false;                
    }
}

function SetBoatModelSearchInputsDisabled(b)
{
    if(b == "true")
    {
        document.getElementById('boat_model_list').disabled = true;
        document.getElementById('boat_model_search').disabled = true; 
    }                
    else
    {
        document.getElementById('boat_model_list').disabled = false;
        document.getElementById('boat_model_search').disabled = false;                 
    }              
}            

function SetBoatBuilderListOption()
{
    var builder_list = document.getElementById('boat_builder_list');
    if(builder_list.selectedIndex != 0 && !IsSpaces(builder_list.options[builder_list.selectedIndex].value))
    {
        document.getElementById('boat_builder_search').value = builder_list.options[builder_list.selectedIndex].value;
        document.getElementById('my_boat_builder').value = builder_list.options[builder_list.selectedIndex].value;                    
        if(LastSelectedBoatBuilder != document.getElementById('boat_builder_search').value)
            document.getElementById('my_boat_model').value = '';
        LastSelectedBoatBuilder = document.getElementById('boat_builder_search').value
        UpdateBoatModelList();
    }
}

function SetBoatModelListOption()
{
    var model_list = document.getElementById('boat_model_list');
    if(model_list.selectedIndex > 2)
    {
        var str = model_list.options[model_list.selectedIndex].value;
        document.getElementById('boat_model_search').value = str.substr(0,29);
        document.getElementById('my_boat_model').value =  Trim(str.substr(0,29));
        LastSelectedBoatModel = document.getElementById('boat_model_search').value;
        LastSelectedBoatModelBuilder = document.getElementById('boat_builder_search').value;
    }
}                    

function AJAXQuery(list,url,search_type,list_error_msg)
{
    var query_success = false;
    var ajax = new AJAX();
    if(ajax.objectCreated())
    {
        try
        {
            ajax.query("AJAXDBQuery.asp?" + url);            
            if(ajax.getStatus() == 200)
            {
                var serverResponse = ajax.getResponseText();
                if(serverResponse != "~")
                {
                    var boatBuilders = serverResponse.split(";");
                    SELECT_ClearList(list);
                    for(i = 0; i < boatBuilders.length; i++)
                        if(boatBuilders[i] != "")
                            SELECT_AddItemToList(list,boatBuilders[i]);
                    
                    SELECT_RemoveDuplicateOptions(list);
                    var result_count = document.getElementById(list).length - 1;
                    
                    if(list == 'boat_model_list')
                        result_count = result_count - 2;
                        
                    DisplayMsg(list_error_msg,(result_count) + ' ' + search_type + ' Found', MSG_TYPE_INFO);  
                                                                             
                }
                else
                {
                    SELECT_ClearList(list);
                    DisplayMsg(list_error_msg,'No ' + search_type + ' were found.', MSG_TYPE_ERR);
                }
                query_success = true;                  
            }
            else
                DisplayMsg(list_error_msg,'Error Looking up ' + search_type + ' - ' + ajax.status, MSG_TYPE_ERR);
        }
        catch(e)
        {
            DisplayMsg(list_error_msg,'Failed to Retrieve Boat Information - (' + ajax.status + ')', MSG_TYPE_ERR);
        }
    }
    else
    {
        //Return false as if server does not exist
        //This should never happen unless the client is using a really old browser 
        //or if JS is disabled.
        alert('Browser too old, cannot use AJAX');
    }      
    return query_success;                   
}

function UpdateBoatBuilderList()
{                     
    if(!IsValidYearAndLength(true) || !IsValidBuilderFirstCharacter())
        return;
        
    //User have not chosen anything from the Builder List or
    //they have not changed the search after a successful retrieval of boat information
    if(document.getElementById('boat_builder_search').value == BOAT_BUILDER_SEARCH_DEFAULT_VALUE &&
       document.getElementById('boat_builder_search').disabled != true && !AnyChangesInSearchParameters())
        return;
 
    //If the user just moved away from the Builder List Select Box without changing the search, do nothing
    if(LastSelectedBoatBuilder == document.getElementById('boat_builder_search').value &&
       !AnyChangesInSearchParameters())
        return;
                        
    if(LastSearchedBuilder == document.getElementById('boat_builder_search').value &&
       !AnyChangesInSearchParameters())
       return;
       
    //Boat Builder did not changes, so Boat year or length was changed, then just check for models
    if(LastSelectedBoatBuilder == document.getElementById('boat_builder_search').value && !AnyChangesInSearchParameters())
    {
        UpdateBoatModelList();
    }
    else
    {
        SaveSearchParameters();
        document.getElementById('BuilderWaitIcon').src = IconWait.src;
        DisplayMsg('builder_msg','Searching .... Please wait', MSG_TYPE_INFO);
        DisplayMsg('model_msg','&nbsp;', MSG_TYPE_INFO);
        setTimeout("SearchAndUpdateBoatBuilderInformation();", 5);   
        setTimeout("document.getElementById('BuilderWaitIcon').src = IconNone.src;",500);        
    }
}

function SearchAndUpdateBoatBuilderInformation()
{
    var searchType = "BBS";            
    var searchString = document.getElementById("boat_builder_first_letter").value; 
    var boat_length_upper = parseInt(document.getElementById('boat_length').value) + BOAT_LENGTH_PLUS_MINUS;
    var boat_length_lower = parseInt(document.getElementById('boat_length').value) - BOAT_LENGTH_PLUS_MINUS;
        
    searchString = searchString.replace("&","%26");                 
    
    SetBoatModelSearchInputsDisabled('true');
    
    var url = "searchType=" + searchType + "&BoatBuilder=" + searchString + "&" +
              "BoatYear=" + document.getElementById('boat_year').value + "&" +
              "BoatLengthLower=" + boat_length_lower + "&" +
              "BoatLengthUpper=" + boat_length_upper;

    if(AJAXQuery('boat_builder_list',url,'Boat Builder(s)', 'builder_msg'))
    {
        SELECT_AddItemToList('boat_builder_list',' ');
        SELECT_AddItemToList('boat_builder_list',BOAT_BUILDER_CUSTOM);
        SELECT_AddItemToList('boat_builder_list',BOAT_BUILDER_OTHER);
        SELECT_AddItemToList('boat_builder_list',BOAT_BUILDER_HOMEBUILT);
        
        SetBoatBuilderSearchInputsDisabled('false');   
        document.getElementById('boat_builder_search').value = BOAT_BUILDER_SEARCH_DEFAULT_VALUE;  
        
        //Only one builder found (the other is a empty option)
        /*if(document.getElementById('boat_builder_list').length == 2)      
        {
            document.getElementById('boat_builder_list').selectedIndex = 1;
            SetBoatBuilderListOption();
        }*/
    }
    else
    {
        document.getElementById('boat_builder_search').value = '';          
        document.getElementById('my_boat_builder').value = '';
        document.getElementById('my_boat_model').value = '';
    }
}

function UpdateBoatModelList()
{   
    if(document.getElementById('boat_builder_search').value == BOAT_BUILDER_CUSTOM ||
       document.getElementById('boat_builder_search').value == BOAT_BUILDER_OTHER ||
       document.getElementById('boat_builder_search').value == BOAT_BUILDER_HOMEBUILT)
    {
        document.getElementById('boat_model_search').value = '';
        SELECT_ClearList('boat_model_list');
        DisplayMsg('model_msg','&nbsp;',MSG_TYPE_INFO);
        DisplayMsg('user_info_msg','Enter the Model Name for your Boat ',MSG_TYPE_INFO);                    
        document.getElementById('my_boat_model').className="error_class";
        document.getElementById('my_boat_model').focus();        
        return;
    }

    DisplayMsg('user_info_msg','&nbsp;',MSG_TYPE_INFO);                    
    document.getElementById('my_boat_model').className="default_class"; 
           
    if(!IsValidYearAndLength(true) || !IsValidBuilderFirstCharacter())
        return;    
                                            
    SaveSearchParameters();
    document.getElementById('ModelWaitIcon').src = IconWait.src;
    DisplayMsg('model_msg','Searching .... Please wait', MSG_TYPE_INFO);
    setTimeout("SearchAndUpdateBoatModelInformation();", 5);   
    setTimeout("document.getElementById('ModelWaitIcon').src = IconNone.src;",500);                
}

function SearchAndUpdateBoatModelInformation()
{                
    var searchType = "BMA";                 
    var boat_length_upper = parseInt(document.getElementById('boat_length').value) + BOAT_LENGTH_PLUS_MINUS;
    var boat_length_lower = parseInt(document.getElementById('boat_length').value) - BOAT_LENGTH_PLUS_MINUS;
    
    var boatBuilderText = document.getElementById('boat_builder_search').value;
    boatBuilderText = boatBuilderText.replace("&","%26");
    
    var url = "searchType=" + searchType +  "&" +
              "BoatYear=" + document.getElementById('boat_year').value + "&" +
              "BoatLengthLower=" + boat_length_lower + "&" +
              "BoatLengthUpper=" + boat_length_upper + "&" +
              "BoatBuilder=" + boatBuilderText;

    if(AJAXQuery('boat_model_list',url,'Boat Model(s)','model_msg'))
    {
        SetBoatModelSearchInputsDisabled('false'); 
        document.getElementById('boat_model_search').value = BOAT_MODEL_SEARCH_DEFAULT_VALUE;   
        if(document.getElementById('boat_model_list').length == 4)      
        {
            document.getElementById('boat_model_list').selectedIndex = 3;
            SetBoatModelListOption();
        }                                   
    }
    else
    {
        document.getElementById('boat_model_search').value = '';
    }             
}

function setup()
{
    document.getElementById('boat_builder_search').value = BOAT_BUILDER_SEARCH_DEFAULT_VALUE;
    document.getElementById('boat_model_search').value = BOAT_MODEL_SEARCH_DEFAULT_VALUE;
    
     
}