if (typeof (formName) == "undefined") {
    var formName = "frm";
}

if (typeof (QASAddressList) == "undefined") {
    var QASAddressList = "dAddressList";
}

var carDataXML;
var $carData; //Jquery parsed version of car data = $(carDataXML)

var resetInputArray = new Array();
var disabled = 'disabled';

$(document).ready(function () {


    // CommPrefs - Email (Old)
    if ($('#CommPrefs_1\\/PrefSuppType').length) {
        $('#CommPrefs_1\\/PrefSuppType').livequery('click', function () {
            toggleSubjectPref('CommPrefs_1/PrefSuppType', 'CommPrefs_1\\/CommPrefValue');
        });
    }

    // CommPrefs - Email (New - Radio Buttons)
    if ($('#CommPrefs_1\\/PrefSuppType_Yes').length) {
        $('#CommPrefs_1\\/PrefSuppType_Yes, #CommPrefs_1\\/PrefSuppType_No').livequery('click', function () {
            checkMarketedByHonda();
        });
    }

    // CommPrefs - Post
    if ($('#X_CommPrefs_4\\/PrefSuppType').length) {
        $('#X_CommPrefs_4\\/PrefSuppType').livequery('click', function () {
            toggleCommPref('CommPrefs_4\\/PrefSuppType');
        });
    }

    // CommPrefs - Telephone
    if ($('#X_CommPrefs_5\\/PrefSuppType').length) {
        $('#X_CommPrefs_5\\/PrefSuppType').livequery('click', function () {
            toggleCommPref('CommPrefs_5\\/PrefSuppType');
        });
    }


    // Newsletter - Honda (Old)
    if ($('#SubjectPrefs_1\\/PrefSuppType').length) {
        $('#SubjectPrefs_1\\/PrefSuppType').livequery('click', function () {
            toggleSubjectPref('SubjectPrefs_1/PrefSuppType', 'SubjectPrefs_1\\/SubjectPrefValue');
        });
    }

    // Newsletter - Motorcycles
    if ($('#SubjectPrefs_2\\/PrefSuppType').length) {
        $('#SubjectPrefs_2\\/PrefSuppType').livequery('click', function () {
            toggleSubjectPref('SubjectPrefs_2/PrefSuppType', 'SubjectPrefs_2\\/SubjectPrefValue');
        });
    }

    // Newsletter - Corporate
    if ($('#SubjectPrefs_3\\/PrefSuppType').length) {
        $('#SubjectPrefs_3\\/PrefSuppType').livequery('click', function () {
            toggleSubjectPref('SubjectPrefs_3/PrefSuppType', 'SubjectPrefs_3\\/SubjectPrefValue');
        });
    }

    // Dream Magazine
    if ($('#SubjectPrefs_4\\/PrefSuppType').length) {
        $('#SubjectPrefs_4\\/PrefSuppType').livequery('click', function () {
            toggleSubjectPref('SubjectPrefs_4/PrefSuppType', 'SubjectPrefs_4\\/SubjectPrefValue');
        });
    }

    // Preferred method of contact
    var contactMedium = $('#Entity\\/PrefContactMedium');

    if (contactMedium.length) {
        contactMedium.empty();
        contactMedium.append('<option value="">Please select ...</option><option value="M">Post</option><option value="E">Email</option><option value="T">Telephone</option>');
    }

    // Title
    if ($('#X_title').length) {
        $('#X_title').livequery('change', function () {
            titleOtherCheck('#X_title', '#otherTitleDiv');
        });
    }

    // Load the Car Data XML file
    $.get('/_assets/data/carData.xml', function (xml) {
        carDataXML = xml;
        $carData = $(carDataXML);
    });

});

// -- UTILITIES -- 

/*
* Name:		lovService
* Description:	A JavaScript (AJAX) function to use the Java LOV service.
* 
* Parameters:	batch - a boolean to indicate whether this is a single call or a batch call ( false = single,true = batch)
* 				strParam_or_itemArray  - if used for a single call then this will be the lov ID e.g. TITLE (or equivalent numeric ID)
*									   - can also be used to supply the filter to the lov service e.g. TITLE&startFilter=1
*				      				   - if used for a batch call then this is the JavaScript Array reference
*			               				(example format of Array : lovArray = [['TITLE&startFilter=1',frm.title],['FUEL_TYPE',frm.fuel]]
*										 > Each element in the inner arrays refers to a parameter that would normally be passed in e.g. 1st item = strParam_or_itemArray                  
*				element_or_currentItem - 1. If used for a single call (Dropdown) then this will be the HTML Form Element reference
*									   - 2. If used for a single call (Radio/Checkbox Elements) then this will be the name required for the elements
*		    		       			   - NOT USED FOR A BATCH CALL
*				holdingDiv			   - Used for Radio / Checkbox usage. To identify where to write the HTML source
*				elementType			   - Used for Radio / Checkbox usage. To idenitfy whether "Radio" or "Checkbox" elements are required
*				firstSelected		   - (boolean) Used for Radio / Checkbox usage. To signify whether the first item should be default selected
*				onClickJS			   - Used for Radio / Checkbox usage. To add any JavaScript to the onClick method of the Radio/Checkbox elements
*									   
* Usage:	1. Single one-off
* 		   lovService(false,'<LOV ID>',<FORM ELEMENT REFERENCE>)
*			2. Startup / batch
*		   lovService(true,<JAVASCRIPT ARRAY NAME>)				   
*/
function arrayTest(arrayElement) {
	if(typeof(arrayElement) == 'undefined') return false;
	if(arrayElement == "") return false;
	
	return true;
}

function lovService(batch, strParam_or_itemArray, element_or_currentItem, holdingDiv, elementType, firstSelected, onClickJS, callback, parameters) {

    var LOVServiceUrl = "/SSDiffService/lovService.do";
    var urlParam;
    var formElement;
    var divName;
    var typeOfElement;
    var selectFirst;
    var onClickCode;

    if (batch && typeof (element_or_currentItem) == "undefined") {
        urlParam = strParam_or_itemArray[0][0];
        formElement = strParam_or_itemArray[0][1];
        divName = strParam_or_itemArray[0][2];
        typeOfElement = strParam_or_itemArray[0][3];
        selectFirst = strParam_or_itemArray[0][4];
        onClickCode = strParam_or_itemArray[0][5];
        element_or_currentItem = 0;
    } else if (batch) {
        urlParam = strParam_or_itemArray[element_or_currentItem][0];
        formElement = strParam_or_itemArray[element_or_currentItem][1];
        divName = strParam_or_itemArray[element_or_currentItem][2];
        typeOfElement = strParam_or_itemArray[element_or_currentItem][3];
        selectFirst = strParam_or_itemArray[element_or_currentItem][4];
        onClickCode = strParam_or_itemArray[element_or_currentItem][5];
    } else {
        urlParam = strParam_or_itemArray;
        formElement = element_or_currentItem;
        divName = holdingDiv;
        typeOfElement = elementType;
        selectFirst = firstSelected;
        onClickCode = onClickJS;
    }

    $.get(LOVServiceUrl + '?codeType=' + urlParam, function (xmldoc) {
        if (typeof (formElement) != "string") {
            formElement.options.length = 0;
            formElement.options[0] = new Option("Please select ...", "", false, false);
        }
        var itemCount = 0;
        var lovXML = $(xmldoc).find('LookupValue').each(function () {

            var description = $(this).find('Description').text();

            // Special exception - Exclude the UNKNOWN item from the list
            if (description.toUpperCase() == 'UNKNOWN') return true;
            if (description == 'INVALID') return false;

            var value = $(this).find('Value').text();
            var displayOrder = $(this).find('DisplayOrder').text();

            if (typeof (formElement) == "string") {

                var html = [];

                html.push(['<li><input type="', typeOfElement, '" name="', formElement, '" id="', formElement, '" value="', value, '" onClick="', onClickCode, '"'].join(''));
                if (selectFirst && $itemCount == 0) html.push(' checked');
                html.push(['>&nbsp;&nbsp;', description, '</li>'].join(''));

                divName.innerHTML = divName.innerHTML + html.join('');

            } else {

                if (itemCount == 0 && formElement.options.length > 0 && formElement.options[0].value != '') formElement.options.length = 0;
                formElement.options[formElement.length] = new Option(description, value, false, false);
            }
            itemCount++;
        });


        if (typeof (formElement) == "string") divName.innerHTML = ['<ul>', divName.innerHTML, '</ul>'].join('');

        if (batch) {
            element_or_currentItem++;
            if (element_or_currentItem < strParam_or_itemArray.length) lovService(true, strParam_or_itemArray, element_or_currentItem, holdingDiv, elementType, firstSelected);
        }

        if (typeof (callback) === "function") callback(parameters);
    });
}

function makeModel(makeElement, modelElement, detailsDiv) {

    var $modelElement = $(modelElement);

    if (makeElement.value != '') {

        $modelElement.empty();
        $modelElement.append('<option value="">Loading models ...</option>');

        lovService(false, '213&startFilter=' + makeElement.value, modelElement)

        $modelElement.attr(disabled, disabled);

        if (typeof (detailsDiv) != "undefined") $(detailsDiv).show();

    } else {

        $modelElement.removeAttr(disabled);
        $modelElement.empty();

        if (typeof (detailsDiv) != "undefined") $(detailsDiv).hide();
    }
}

function updateMakeModel(makeElement, modelElement, data) { // prepopulate is a string that matches the item that should be selected.
    var ssdif_this_var_is_undefined;
    var $modelElement = $(modelElement);

    if ($(makeElement).val() != '') {
        $modelElement.empty();
        $modelElement.append('<option value="">Loading models ...</option>');

        var parameters = [$modelElement, data];
        lovService(false, '213&startFilter=' + $(makeElement).val(), $modelElement.get(0), ssdif_this_var_is_undefined, ssdif_this_var_is_undefined, ssdif_this_var_is_undefined, ssdif_this_var_is_undefined, populateDropdown, parameters)

        $modelElement.removeAttr(disabled);

    } else {
        $modelElement.attr(disabled, disabled);
        $modelElement.empty();
    }
}

function dateFuture(theDay, theMonth, theYear, allowCurrent) { // input numbers should all be 1 based, e.g. 01 == Jan (NOT Feb)
    // allowCurrentMonth is Bool, for fields that require MM-YYYY submission, should the current month be allowed?
    // e.g. if the date is 12-03-2010, a date entered of March 2010, could be either future, or past. 

    var currentDate = new Date();

    // Default to current if input is missing
    if (theDay === '') {
        theDay = currentDate.getDate();
    } else {
        theDay = parseInt(theDay, 10);
    }

    if (theMonth === '') {
        theMonth = currentDate.getMonth();
    } else {
        theMonth = parseInt(theMonth, 10) - 1; // convert from 1 based month (from user input) to zero based (for date object)
    }

    if (theYear === '') {
        theYear = currentDate.getFullYear();
    } else {
        theYear = parseInt(theYear, 10);
    }

    // if those don't produce a valid date object, return.	
    if (!dateValid(theDay, theMonth + 1, theYear)) { // month expected as 1 based.
        return false;
    }
    //Build up a full date object to compare against 
    var compareDate = new Date(theYear, theMonth, theDay, currentDate.getHours(), currentDate.getMinutes(), currentDate.getSeconds(), currentDate.getMilliseconds());

    if (allowCurrent === true) { // change the compare opperator if we're including current dates
        returnVal = (compareDate.getTime() >= currentDate.getTime());
    } else {
        returnVal = (compareDate.getTime() > currentDate.getTime());
    }
    if (allowCurrent === true && returnVal === false && theDay === 1 && theMonth === currentDate.getMonth() && theYear === currentDate.getFullYear()) {
        // If the date isn't already in the future (returnVal === false), then check if the day is 1 and the month/year are current then allow.
        // (This handles the scenario where the entry is MM-YYYY only, defaulting to 01 as DD, but we want people who sign up on the 15th May to 
        // be able to specify May this year (which would be a past date, if we followed the convention of just adding one to turn MM-YYYY to DD, MM-YYYY
        returnVal = true;
    }
    return returnVal;
}

function getCurrentDate(returnYear, returnMonth, returnDay) {
    var currentDate = new Date();
    var currentMonth;
    var currentDay;

    if ((currentDate.getMonth() + 1) < 10) {
        currentMonth = "0" + (currentDate.getMonth() + 1);
    } else {
        currentMonth = (currentDate.getMonth() + 1);
    }

    if (currentDate.getDate() < 10) {
        currentDay = "0" + currentDate.getDate();
    } else {
        currentDay = currentDate.getDate();
    }

    if (returnYear && returnMonth && returnDay) {
        return currentDate.getFullYear() + "-" + currentMonth + "-" + currentDay;
    } else if (returnYear && returnMonth) {
        return currentDate.getFullYear() + "-" + currentMonth;
    } else {
        return currentDate.getFullYear();
    }
}

function formatSSDIFDate(currentDate, isUTC) {
    var currentMonth;
    var currentDay;

    if (isUTC) {
        if ((currentDate.getUTCMonth() + 1) < 10) {
            currentMonth = "0" + (currentDate.getUTCMonth() + 1);
        } else {
            currentMonth = (currentDate.getUTCMonth() + 1);
        }

        if (currentDate.getUTCDate() < 10) {
            currentDay = "0" + currentDate.getUTCDate();
        } else {
            currentDay = currentDate.getUTCDate();
        }

        return currentDate.getUTCFullYear() + "-" + currentMonth + "-" + currentDay;
    } else {
        if ((currentDate.getMonth() + 1) < 10) {
            currentMonth = "0" + (currentDate.getMonth() + 1);
        } else {
            currentMonth = (currentDate.getMonth() + 1);
        }

        if (currentDate.getDate() < 10) {
            currentDay = "0" + currentDate.getDate();
        } else {
            currentDay = currentDate.getDate();
        }

        return currentDate.getFullYear() + "-" + currentMonth + "-" + currentDay;
    }
}

function initDay(dayElement) {
    var build = [];

    for (x = 1; x < 32; x++) {

        var value = (x < 10) ? '0' + x : x;
        build.push("<option value='", value, "'>", x, "</option>");
    }

    $(dayElement).append(build.join(''));
}

function initMonth(monthElement) {
    var build = [];

    for (x = 1; x < 13; x++) {
        var value = (x < 10) ? '0' + x : x;
        build.push("<option value='", value, "'>", x, "</option>");
    }

    $(monthElement).append(build.join(''));
}

function initYear(yearElement, averageYear, minYear, maxYear) {
    var build = [];
    var fullyear = new Date().getFullYear();

    pushYear = function (year) {
        build.push("<option value='", year, "'>", year, "</option>");
    }

    if (maxYear >= 0) {
        for (x = 0 + minYear; x < maxYear; x++) {
            pushYear(fullyear + x);
        }
    } else {
        for (x = 0 - minYear; x > maxYear; x--) {
            pushYear(fullyear - x);
        }
    }

    if (minYear < 0) for (x = minYear; x > maxYear; x--) pushYear(fullyear + x);
    $(yearElement).empty().append(build.join(''));
}


//yearElement - e.g. #CurrentProduct\\/RegYear
//start - e.g. 30 to start 30 years in the future, -30 to start 30 years in the past
//length - how many years from the START (THIS SHOULD BE >= 0)
//isOrderAsc - true if you want it ascending (starts from START), false if you want it descending (starts from START + LENGTH)

function initYearList(yearElement, start, length, isOrderAsc) {
    var currentDate = new Date();
    currentDate.setFullYear(currentDate.getFullYear() + start);

    var fullYear = currentDate.getFullYear();
    var build = [];

    var appendOption = function (year) {
        build.push("<option value='", year, "'>", year, "</option>");
    }

    if (isOrderAsc) {
        for (x = 0; x <= length; x++) {
            appendOption(fullYear + x);
        }
    } else {
        for (x = length; 0 <= x; x--) {
            appendOption(fullYear + x);
        }
    }

    $(yearElement).append(build.join(''));
}

function initDateOfBirth(dayElement, monthElement, yearElement, minAge) {
    initDay(dayElement);
    initMonth(monthElement);
    var MIN_AGE = 18;
    var currentDate = new Date();
    initYearList(yearElement, -100, (100 - MIN_AGE), false);
}

function dateValid(dayElement, monthElement, yearElement) {
    if (dayElement == '' || monthElement == '' || yearElement == '') return false;
    monthElement = parseInt(monthElement, 10) - 1;

    var testDate = new Date(yearElement, monthElement, dayElement)
    if ((parseInt(dayElement, 10) != testDate.getDate()) || (parseInt(monthElement, 10) != testDate.getMonth()) || (parseInt(yearElement, 10) != testDate.getFullYear())) return false;

    return true;
}

function forenameValidate(textStr) {

    var regExPattern = /^([a-zA-Z\s'-]+)$/
    return (textStr.match(regExPattern) != null);
}

function surnameValidate(textStr) {

    var regExPattern = /^([a-zA-Z\s'-]+?){2}$/; // The +? is needed for Opera support. Beware or cross browser reg exp differences.
    return (textStr.match(regExPattern) != null);
}

function telephoneValidate(telStr) {

    var regExPattern = /^([0-9]){10,13}$/

    telStr = removeAllSpaces(telStr);

    if (telStr == '') return false;
    if (telStr.substring(0, 1) != '0') return false;
    if (telStr.match(regExPattern) == null) return false;

    return true;
}

function vehicleRegValidate(regStr) {
    var regExPattern = /^([a-zA-Z0-9]){2,7}$/

    regStr = removeAllSpaces(regStr);
    if (regStr == '') return false;
    if (regStr.match(regExPattern) == null) return false;

    return true;
}

function engineCCValidate(ccStr) {
    var regExPattern = /^([0-9]){1,4}$/

    ccStr = removeAllSpaces(ccStr);

    if (ccStr == '') return false;
    if (ccStr.substring(0, 1) == '0') return false;
    if (ccStr.match(regExPattern) == null) return false;

    return true;
}

function cleanName(textStr) {
    return textStr.substring(0, 1).toUpperCase() + textStr.substring(1);
}


function titleOtherCheck(titleElement, otherTitleID) {

    if ($(titleElement + ' option:selected').val() == 14) {
        $(otherTitleID).show();
    } else {
        $(otherTitleID).hide();
    }
}

function businessRecreationVisibility() {
    var formId = '#' + formName;

    if (radioSelectedValue('ContactWithHonda/Questions_15/Responses/Response') == '1') {
        $(formId + ' #useBusinessDiv').show();
        $(formId + ' #businessLabel').show();
        $(formId + ' #ContactWithHonda\\/Questions_16\\/Responses\\/Response').show();
        $(formId + ' #ContactWithHonda\\/Questions_16\\/QuestionCode').removeAttr(disabled);
        $(formId + ' #ContactWithHonda\\/Questions_16\\/Responses\\/Response').removeAttr(disabled);
        $(formId + ' #useRecreationDiv').hide();
        $(formId + ' #recreationLabel').hide();
        $(formId + ' #Person\\/Occupation').hide();
        $(formId + ' #Person\\/Occupation').attr(disabled, disabled);
    } else {
        $(formId + ' #useBusinessDiv').hide();
        $(formId + ' #businessLabel').hide();
        $(formId + ' #ContactWithHonda\\/Questions_16\\/Responses/Response').hide();
        $(formId + ' #ContactWithHonda\\/Questions_16\\/QuestionCode').attr(disabled, disabled);
        $(formId + ' #ContactWithHonda\\/Questions_16\\/Responses/Response').attr(disabled, disabled);
        $(formId + ' #useRecreationDiv').show();
        $(formId + ' #recreationLabel').show();
        $(formId + ' #Person\\/Occupation').show();
        $(formId + ' #Person\\/Occupation').removeAttr(disabled);
    }
}

function currentlyOwn() {

    var formId = '#' + formName;

    if (radioSelectedValue('ContactWithHonda/Questions_14/Responses/Response') == 'Y') {
        $(formId + ' #ownATVDiv').show();
        $(formId + ' #CurrentProduct\\/PowerEquipment\\/Brand').show().removeAttr(disabled);
        $(formId + ' #CurrentProduct\\/PowerEquipment\\/ATVData\\/Range').removeAttr(disabled);
        $(formId + ' #CurrentProduct\\/PowerEquipment\\/ATVData\\/Model').removeAttr(disabled);
        $(formId + ' #CurrentProduct\\/PowerEquipment\\/ATVData\\/EngineSizeCC').show().removeAttr(disabled);
        $(formId + ' #CurrentProduct\\/Division').removeAttr(disabled);
        $(formId + ' #CurrentProduct\\/ProductSegment').removeAttr(disabled);
        $(formId + ' #X_ownershipMonth').show().removeAttr(disabled);
        $(formId + ' #X_ownershipYear').show().removeAttr(disabled);
        $(formId + ' #CurrentProduct\\/RelationshipStartDate').removeAttr(disabled);
        $(formId + ' #ContactWithHonda\\/Questions_17\\/QuestionCode').removeAttr(disabled);

        $(formId + ' #atvUseDiv').show();

        $(formId + ' #ContactWithHonda\\/Questions_17\\/Responses\\/Response').each(function () {
            $(this).show().removeAttr(disabled);
        });

    } else {
        $(formId + ' #ownATVDiv').hide();
        $(formId + ' #CurrentProduct\\/PowerEquipment\\/Brand').hide().attr(disabled, disabled);
        $(formId + ' #CurrentProduct\\/PowerEquipment\\/ATVData\\/Range').attr(disabled, disabled);
        $(formId + ' #CurrentProduct\\/PowerEquipment\\/ATVData\\/Model').attr(disabled, disabled);
        $(formId + ' #CurrentProduct\\/PowerEquipment\\/ATVData\\/EngineSizeCC').hide();
        $(formId + ' #CurrentProduct\\/Division').attr(disabled, disabled);
        $(formId + ' #CurrentProduct\\/ProductSegment').attr(disabled, disabled);
        $(formId + ' #X_ownershipMonth').hide().attr(disabled, disabled);
        $(formId + ' #X_ownershipYear').hide().attr(disabled, disabled);
        $(formId + ' #CurrentProduct\\/RelationshipStartDate').attr(disabled, disabled);
        $(formId + ' #ContactWithHonda\\/Questions_17\\/QuestionCode').attr(disabled, disabled);
        $(formId + ' #atvUseDiv').hide();

        $(formId + ' #ContactWithHonda\\/Questions_17\\/Responses\\/Response').each(function () {
            $(this).hide().attr(disabled, disabled);
        });
    }
}

function radioSelectedValue(elementName) {
    return $(['#', formName, ' input[name="', elementName, '"]:checked'].join('')).val();
}

function radioSelected(elementName) {
    return Boolean($(['#', formName, ' input[name="', elementName, '"]:checked'].join('')).val());
}

function selectSelected(elementName) {
    return Boolean($(['#', elementName, ' option:selected'].join('')).val());
}

function disableRadio(buttonGroup) {
    if (buttonGroup) {
        for (var i = 0; i < buttonGroup.length; i++) {
            buttonGroup[i].disabled = true;
        }
    }
    return false;
}

function removeAllSpaces(original) {
    while (original.indexOf(' ') > -1) {
        original = original.replace(' ', '');
    }
    return original;
}

function removeAllWhitespace(original) {
    var regExPattern = /\s+/;

    while (original.match(regExPattern)) {
        original = original.replace(regExPattern, '');
    }

    return original;
}

function emailCheck(emailStr) {
    var emailPat = /^(.+)@(.+)$/
    var specialChars = "\\(\\)<>@,;:\\\\\\\"\\.\\[\\]&{}~#"
    var validChars = "\[^\\s" + specialChars + "\]"
    var quotedUser = "(\"[^\"]*\")"
    var ipDomainPat = /^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
    var atom = validChars + '+'
    var word = "(" + atom + "|" + quotedUser + ")"
    var userPat = new RegExp("^" + word + "(\\." + word + ")*$")
    var domainPat = new RegExp("^" + atom + "(\\." + atom + ")*$")

    var matchArray = emailStr.match(emailPat)
    if (matchArray == null) return false;
    var user = matchArray[1];
    var domain = matchArray[2];

    if (user.match(userPat) == null) return false;

    var IPArray = domain.match(ipDomainPat);
    if (IPArray != null) {
        // this is an IP address
        for (var i = 1; i <= 4; i++) {
            if (IPArray[i] > 255) return false;
        }
        return true;
    }

    var domainArray = domain.match(domainPat);
    if (domainArray == null) return false;

    var atomPat = new RegExp(atom, "g");
    var domArr = domain.match(atomPat);
    var len = domArr.length;
    if (domArr[domArr.length - 1].length < 2 || domArr[domArr.length - 1].length > 4) return false;

    if (len < 2) return false;

    return true;
}


//Appends the days of the week into a nominated select element identified by argument 'id'
function appendDaysOfWeek(id) {
    var DOW = new Array("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday");
    for (i = 0; i < DOW.length; i++) {
        $('#' + id).append(['<option value="', DOW[i], '">', DOW[i], '</option>'].join(''));
    }
}

//Appends the timeslots of a day into a nominated select selement identified by argument 'id'
function appendTimeslots(id) {
    var timeSlots = new Array("9am - 11am", "11am - 1pm", "1pm - 3pm", "3pm - 5pm");
    for (i = 0; i < timeSlots.length; i++) {
        $('#' + id).append(['<option value="', timeSlots[i], '">', timeSlots[i], '</option>'].join(''));
    }
}

// -- SSDIF - VALIDATION FUNCTIONS --

function SSDIF_Validate_Title() {
    if ((($('#X_title' + ' option:selected').val() == 14) && (($('#X_titleOther').val() == '') || ($('#X_titleOther').val() == ' '))) || $('#X_title' + ' option:selected').val() == '') {
        alert("Please enter a valid title");
        return false;
    } else {
        // Set the Person/Title field
        if ($('#X_title' + ' option:selected').val() == 14) {
            $('#Person\\/Title').val($('#X_titleOther').val());
        } else { $('#Person\\/Title').val($('#X_title' + ' option:selected').val()); }
    }
    return true;
}

function SSDIF_Validate_Forename_Surname() {

    var names = $('#Person\\/Name1');
    var surnames = $('#Person\\/Name3');

    if (!forenameValidate(names.val())) {
        alert("Please enter a valid Firstname");
        return false;

    } else if (!surnameValidate(surnames.val())) {
        alert("Please enter a valid Surname");
        return false;

    } else {
        // Clean up the Firstname & Surname

        if (names.val().length == 1) {
            names.attr("name", "Person/Initials");
            names.val(names.val().toUpperCase());
        } else {
            names.attr("name", "Person/Name1");
            names.val(cleanName(names.val()));
        }

        surnames.val(cleanName(surnames.val()));
    }
    return true;
}

function SSDIF_Validate_Address() {
    var postcodes = $('#X_postcode').val();

	
	if ($("#Address\\/Address1").val() == '' || $("#Address\\/Town").val() == '' || !isValidPostcode(postcodes)) {
        alert("Please enter a complete address");
		return false;
    } 
    else {

		if ($('#Address\\/Postcode1').val() == '') $('#Address\\/Postcode1').val(postcodes.toUpperCase().replace(' ', '').substring(0, postcodes.replace(' ', '').length - 3));
		if ($('#Address\\/Postcode2').val() == '') $('#Address\\/Postcode2').val(postcodes.toUpperCase().replace(' ', '').substring(postcodes.replace(' ', '').length - 3));

		//Use typeof to check if ssdifcampaignValues has been declared
        if (typeof ssdifCampaignValues !== 'undefined' && arrayTest(ssdifCampaignValues['DealerPreferences'])) ssdifDealer.init(postcodes.toUpperCase().replace(' ', ''));
	}

	return true;
}

function SSDIF_Validate_Date_Of_Birth() {
    var birthDay = $('#X_birthDay').val();
    var birthMonth = $('#X_birthMonth').val();
    var birthYear = $('#X_birthYear').val();

    if (birthDay != '' || birthMonth != '' || birthYear != '') {

        if (!dateValid(birthDay, birthMonth, birthYear)) {
            alert('Please enter a valid date of birth');
            return false;
        } else {
            $('#Person\\/BirthDate').val([birthYear, '-', birthMonth, '-', birthDay].join(''));
        }
    }

    return true;
}

// This function refactored 29/01/2010 uidyw, to aid debug.
function SSDIF_Validate_Planned_Purchase_Date(monthInput, yearInput) {
    var monthVal, yearVal;
    var dayVal = '01'; // DC guidelines state to add 01 (1st day of month) to the month and year to build a valid date. 

    if (typeof (monthInput) === 'undefined' || typeof (yearInput) === 'undefined') {
        monthVal = $('#X_replaceMonth').val();
        yearVal = $('#X_replaceYear').val();
    }
    else {
        monthVal = $(monthInput).val();
        yearVal = $(yearInput).val();
    }
    if (!dateFuture(dayVal, monthVal, yearVal, true) || (monthVal === '' || yearVal === '')) { // dateFuture allows empty strings. We can't.
        alert('Please enter a valid planned purchase date');
        return false;
    }
    $('#ContactWithHonda\\/ProspectInterest\\/PlannedPurchaseDate').val([yearVal, '-', monthVal, '-', dayVal].join(''));
    return true;
}

function SSDIF_Validate_CurrentCar() {

    //Check for :
    //a. Full Registration Number
    //b. Make
    //c. Model
    //d. Registration Year
    //e. Private / Company
    //f. Ownership start date
    //g. Replacement Date
    //h. Insurance Renewal Date
    var registration = $("#CurrentProduct\\/Registration").val();


    // Check to see if any of the form has been filled it. If one part has, it all needs to be.
    if (registration != '' || selectSelected("CurrentProduct\\/CarData\\/Brand") || selectSelected("CurrentProduct\\/CarData\\/ModelGroup")
		|| radioSelected("CurrentProduct/RetailCorporate") || selectSelected("CurrentProduct\\/RegYear") || selectSelected("X_currentCarOwnershipStartMonth")
		|| selectSelected("X_currentCarOwnershipStartYear") || selectSelected("X_currentCarReplacementDateMonth") || selectSelected("X_currentCarReplacementDateYear")) {

        // Check for either Registration or Registration Year
        if (registration == '' && !selectSelected("CurrentProduct\\/RegYear")) {
            alert("Please enter your Full Registration Number or Registration Year");
            return false;
        }

        // Check Registration
        if (registration != '') {
            if (!SSDIF_Validate_Current_Car_Registration()) return false;
        }

        // Make and Model
        if (!selectSelected("CurrentProduct\\/CarData\\/Brand") || !selectSelected("CurrentProduct\\/CarData\\/ModelGroup")) {
            alert("Please select your current car's make and model");
            return false;
        }

        // Validate Private / Corporate
        if (!SSDIF_Validate_Private_Corporate_Current(true)) return false;

        // Ownership Start Date
        if (!selectSelected("X_currentCarOwnershipStartMonth") || !selectSelected("X_currentCarOwnershipStartYear")) {
            alert("Please enter a ownership start date");
            return false;
        }

        if (!SSDIF_Validate_Ownership_Start_Date("#X_currentCarOwnershipStartMonth", "#X_currentCarOwnershipStartYear")) return false;

        if (typeof ssdifCampaignValues !== 'undefined' && arrayTest(ssdifCampaignValues["ReplacementDate"]) && !SSDIF_Validate_Replacement_Date("#X_currentCarReplacementDateMonth", "#X_currentCarReplacementDateYear")) return false;

        // Check Registration Year (needs to happen after Ownership Start Date)
        if (selectSelected("CurrentProduct\\/RegYear")) {
            if (!SSDIF_Validate_Registration_Year()) return false;
        }

        disableEmptyOptionalQuestions('9');

        // Validate future month for renewal date
        if (typeof ssdifCampaignValues !== 'undefined' && arrayTest(ssdifCampaignValues.CurrentInsurance) && !SSDIF_Validate_Insurance_Date($("#X_currentCarInsuranceDateMonth"), $("#X_currentCarInsuranceDateYear"))) {
            return false;
        }

        //Division and Product Segment			
        $("#CurrentProduct\\/Division,#CurrentProduct\\/ProductSegment").removeAttr(disabled);
    } else {
        $("#CurrentProduct\\/Division,#CurrentProduct\\/ProductSegment").attr(disabled, disabled);
    }

    return true;
}

function SSDIF_Validate_Current_Car_Registration() {

    var regString = $("#CurrentProduct\\/Registration").val().toUpperCase().replace(/\ /g, "");
    return SSDIF_Validate_Registration(regString);
}

function SSDIF_Validate_Registration_Year() {
    var regYear = parseInt($("#CurrentProduct\\/RegYear").val(), 10);
    var ownershipYear = parseInt($("#X_currentCarOwnershipStartYear").val(), 10);

    if (regYear > ownershipYear) {
        alert("Please select a valid registration year");
        return false;
    }
    return true;

}

function SSDIF_Validate_Ownership_Start_Date(monthInput, yearInput) {
    if (dateFuture(1, $(monthInput).val(), $(yearInput).val(), true)) {
        alert("Please enter a valid ownership start date");
        return false;
    }
    $('#CurrentProduct\\/RelationshipStartDate').val($(yearInput).val() + "-" + $(monthInput).val() + "-01");
    return true;
}

function SSDIF_Validate_Insurance_Date(monthInput, yearInput) {
    var month = $(monthInput).val();
    var year = $(yearInput).val();
    if (year === "" || month === "" || !dateFuture(1, month, year, true)) {
        alert("Please enter a valid insurance renewal date");
        return false;
    }
    $('#CurrentProduct\\/InsuranceRenewalDate').val($(yearInput).val() + "-" + $(monthInput).val() + "-01");
    return true;
}

function SSDIF_Validate_Replacement_Date(monthInput, yearInput) {
    var month = $(monthInput).val();
    var year = $(yearInput).val();
    if (year === "" || month === "" || !dateFuture(1, month, year, true)) {
        alert("Please enter a valid replacement date");
        return false;
    }
    var date = year + "-" + month + "-01";
    $('#CurrentProduct\\/ReplacementDate').val(date);

    // if Planned Car is shown, then also populate this area and hide that field.			
    if (typeof ssdifCampaignValues !== 'undefined' && arrayTest(ssdifCampaignValues["PlannedCar1"]) || arrayTest(ssdifCampaignValues["PlannedCar2"])) {
        $('#ContactWithHonda\\/ProspectInterest\\/PlannedPurchaseDate').val(date);
        $("#DIV_PlannedPurchaseDate").css("display", "none");
    }
    return true;
}

function SSDIF_Validate_Private_Corporate_Current() {
    var displayAlert = false;
    var relationships = $('#CurrentProduct\\/Relationship');

    if (radioSelected('CurrentProduct/RetailCorporate')) {
        relationships.removeAttr(disabled);
        (radioSelectedValue('CurrentProduct/RetailCorporate') == 'C') ? relationships.val('U') : relationships.val('O');
    } else {
        displayAlert = true;
    }

    if (displayAlert) {
        alert("Please select either Privately owned or Company Car");
        return false;
    }
    return true;
}


function SSDIF_Validate_Private_Corporate_Prospect(createHiddenInputs) {
    var displayAlert = false;

    if (createHiddenInputs) {
        var relationships = $('#ContactWithHonda\\/ProspectInterest\\/Relationship');

        if (radioSelected('ContactWithHonda/ProspectInterest/CorporatePrivateUser')) {
            relationships.removeAttr(disabled);
            if (radioSelectedValue('ContactWithHonda/ProspectInterest/CorporatePrivateUser') == 'C') {
                relationships.val('U');
            } else {
                relationships.val('O');
            }
        } else {
            displayAlert = true;
        }
    } else if (!radioSelected('X_corpPrivUser')) {
        displayAlert = true;
    }

    if (displayAlert) {
        alert("Please select either Privately owned or Company Car");
        return false;
    }
    return true;
}

function SSDIF_Validate_New_Used_Prospect() {
    if (!radioSelected('X_newUsed')) {
        alert("Please select either New or Used");
        return false;
    }
    return true;
}

function SSDIF_Validate_Preferred_Method_Contact() {
    var mediums = $('#Entity\\/PrefContactMedium option:selected').val();

    if (mediums == '') {
        alert("Please select a preferred method of contact");
        return false;
    }

    if (mediums == 'T' && !validateTelephone()) return false;
    if (mediums == 'E' && !validateEmail()) return false;

    return true;
}

function SSDIF_Validate_Telephone_Number_Type() {
    if (radioSelected('TelephoneEmail/PrefTelephone') && !validateTelephone()) return false;
    return true;
}

function SSDIF_Validate_Mandatory_Telephone_Number_Type() {
    if (!radioSelected('TelephoneEmail/PrefTelephone')) {
        alert("Please select a preferred telephone number type");
        return false;
    }
    return true;
}

function SSDIF_Validate_Telephone() {
    if ($('#X_phonenumber').val() != '' && !validateTelephone()) return false;
    return true;
}

function SSDIF_Validate_Registration(regString) {

    regString = regString.replace(/\ /g, ""); // Remove whitespace
    var regExPattern = /^([a-zA-Z0-9]{2,7})$/; // This matches the data capture guidelines (max 7 chars alphanumeric)
    if (regString.match(regExPattern) === null) {
        alert("Please enter a valid registration");
        return false;
    }
    return true;
}

function SSDIF_Validate_SMS() {
    if ($('#TelephoneEmail\\/SMSNo').val() != '') {
        if (!telephoneValidate($('#TelephoneEmail\\/SMSNo').val())) {
            alert("Please enter a valid SMS number");
            return false;
        } else {
            $('#CommPrefs_2\\/PrefSuppType').val('Y');
            checkMarketedByHonda();
        }
    } else {
        $('#CommPrefs_2\\/PrefSuppType').val('N');
        checkMarketedByHonda();
    }

    return true;
}


function SSDIF_Validate_Mandatory_Telephone() {
    return (validateTelephone());
}

function SSDIF_Validate_Email_Newsletters() {
    if ($('input[name="SubjectPrefs_1/PrefSuppType"]:checked, input[name="SubjectPrefs_2/PrefSuppType"]:checked, input[name="SubjectPrefs_3/PrefSuppType"]:checked').length) {
        if (!validateEmail()) return false;
    }
    return true;
}

function SSDIF_Validate_Email_Implicit() {
    if ($('#TelephoneEmail\\/HomeEmail').val() != '') {
        if (!validateEmail()) {
            return false;
        } else {
            $('#CommPrefs_1\\/PrefSuppType').removeAttr(disabled);
            $('#CommPrefs_1\\/CommPrefValue').removeAttr(disabled);
            checkMarketedByHonda();
        }
    } else {
        $('#CommPrefs_1\\/PrefSuppType').attr(disabled, disabled);
        $('#CommPrefs_1\\/CommPrefValue').attr(disabled, disabled);
        checkMarketedByHonda();
    }

    return true;
}

function SSDIF_Validate_Email_Explicit() {
    if (!emailCheck($('#TelephoneEmail\\/HomeEmail').val())) {
        alert("Please enter a valid email address");
        return false;
    }
    return true;
}

function SSDIF_Validate_Email_Optional() {
    if ($('#TelephoneEmail\\/HomeEmail').val() != '') {
        if (!emailCheck($('#TelephoneEmail\\/HomeEmail').val())) {
            alert("Please enter a valid email address");
            return false;
        }
    }

    return true;
}

function SSDIF_Validate_Email_Mandatory() {
    if (!emailCheck($('#TelephoneEmail\\/HomeEmail').val())) {
        alert("Please enter a valid email address");
        return false;
    }
    return true;
}


//Validates the telephone/email choice checkboxes, the user has to choose either or, the following checks are carried out:
//if both 'contactByTel' and 'contactByEmail' are not checked an appropriate error message is alerted.
function SSDIF_Validate_Telephone_Email_Checkbox() {
    if (($("#contactByTel:checked").length == 0) && ($("#contactByEmail:checked").length == 0)) {
        alert("Please choose either to be contacted by telephone or by email.");
        return false;
    }
    return true;
}

//Validates the contact day and time fields on a SSDIF (form), following checks are carried out:
// - both 'contactDay' and 'contactTime' are selected (if not an appropriate error message is alerted)
// - 'contactDay' is not selected (user is prompted to select a day of the week)
// - 'contactTime' is not selected (user is promoted to select a time period)

function SSDIF_Validate_Contact_Day_Time() {
    var contactDay = $("#X_contactDay").val();
    var contactTime = $("#X_contactTime").val();

    if (contactDay == "" && contactTime == "") {
        alert("Please select a day and time for us to contact you.");
        return false;
    } else if (contactTime == "") {
        alert("Please select a time for us to contact you.");
        return false;
    } else if (contactDay == "") {
        alert("Please select a day for us to contact you.");
        return false;
    }
    return true;
}

function SSDIF_Validate_Contact_Time() {
    if ($("#X_contactTime").val() == "") {
        alert("Please select a time for us to contact you.");
        return false;
    }
    return true;
}

function SSDIF_Validate_Telephone_Basic() {
    if (!telephoneValidate($('#telephoneNumber').val())) {
        alert("Please enter a valid telephone number");
        return false;
    }
    return true;
}

function SSDIF_Validate_PlannedCar1() {
    //Check for :
    //a. Planned Purchase Date
    //b. New or Used
    //c. Private or Company

    // Possible Scenario: ReplacementDate flag = true. Date completed in Current car and is populated to plannedPurchase Year here.
    // If plannedPurchaseMonth and plannedPurchaseYear are selected & hidden input is already populated, but no other fields are, plannedPurchase date must have been populated from CurrentCar.

    var propectInterest = $("#ContactWithHonda\\/ProspectInterest\\/Division, #ContactWithHonda\\/ProspectInterest\\/ProductSegment, #ContactWithHonda\\/ProspectInterest\\/CarData\\/Brand, #ContactWithHonda\\/ProspectInterest\\/CarData\\/ModelGroup");
    if ($('#ContactWithHonda\\/ProspectInterest\\/PlannedPurchaseDate').val() || selectSelected("X_plannedPurchaseMonth") || selectSelected("X_plannedPurchaseYear") || radioSelected("ContactWithHonda/ProspectInterest/IntentNewUsed") || radioSelected("ContactWithHonda/ProspectInterest/CorporatePrivateUser")) {

        // Validate Planned Purchase Date, but only if it hasn't been populated from the CurrentCar replacement date.
        // If planned purchase date is the same as CurrentCar replacement date and the planned purchase date dropdowns haven't been selected,
        // assume this field has been populated from CurrentCar.
        if (!$('#ContactWithHonda\\/ProspectInterest\\/PlannedPurchaseDate').val() ||
			(($('#ContactWithHonda\\/ProspectInterest\\/PlannedPurchaseDate').val() !== $('#CurrentProduct\\/ReplacementDate').val()) &&
			(!selectSelected("X_plannedPurchaseMonth") || !selectSelected("X_plannedPurchaseYear")))
		) {
            if (!selectSelected("X_plannedPurchaseMonth") || !selectSelected("X_plannedPurchaseYear")) {
                alert("Please enter a valid planned purchase date");
                return false;
            }
            if (!SSDIF_Validate_Planned_Purchase_Date("#X_plannedPurchaseMonth", "#X_plannedPurchaseYear")) return false;
        }

        // Validate New / Used
        if (!radioSelected("ContactWithHonda/ProspectInterest/IntentNewUsed")) {
            alert("Please select whether your next purchase would be either New or Used");
            return false;
        }

        // Validate Private / Corporate
        if (!SSDIF_Validate_Private_Corporate_Prospect(true)) return false;
        disableEmptyOptionalQuestions("10");

        propectInterest.removeAttr(disabled);
    } else {
        propectInterest.attr(disabled, disabled);
    }

    return true;
}

function SSDIF_Validate_PlannedCar2() {
    /*
    Check for :
    a. Type of car
    b. Fuel
    */
    if ($('#ContactWithHonda\\/ProspectInterest\\/PlannedPurchaseDate').val() || selectSelected("X_plannedPurchaseMonth") || selectSelected("X_plannedPurchaseYear") || radioSelected("ContactWithHonda/ProspectInterest/IntentNewUsed") || radioSelected("ContactWithHonda/ProspectInterest/CorporatePrivateUser") || selectSelected("ContactWithHonda\\/Questions_11\\/Responses\\/Response") || selectSelected("ContactWithHonda\\/ProspectInterest\\/CarData\\/FuelType")) {
        if (!SSDIF_Validate_PlannedCar1()) return false;
        // Validate Type of Car
        if (!selectSelected("ContactWithHonda\\/Questions_11\\/Responses\\/Response")) {
            alert("Please select what type of car your next purchase would be");
            return false;
        } else {
            $("#ContactWithHonda\\/Questions_11\\/QuestionCode").removeAttr(disabled);
        }
        // Validate Fuel
        if (!selectSelected("ContactWithHonda\\/ProspectInterest\\/CarData\\/FuelType")) {
            alert("Please select what type of fuel your next purchase would have");
            return false;
        }
    } else {
        $("#ContactWithHonda\\/ProspectInterest\\/Division, #ContactWithHonda\\/ProspectInterest\\/ProductSegment, #ContactWithHonda\\/ProspectInterest\\/CarData\\/Brand, #ContactWithHonda\\/ProspectInterest\\/CarData\\/ModelGroup, #ContactWithHonda\\/Questions_11\\/Responses\\/Response, #ContactWithHonda\\/Questions_11\\/QuestionCode, #ContactWithHonda\\/ProspectInterest\\/CarData\\/FuelType").attr(disabled, disabled);
    }
    return true;
}

function SSDIF_Validate_Email_Optin() {

    // If email is entered then make the user select their email preference
    if ($('#TelephoneEmail\\/HomeEmail').val() != '') {
        if (!radioSelected('CommPrefs_1/PrefSuppType')) {
            alert("Please select whether you are happy to receive emails other than e-news");
            return false;
        }
    }

    var commPref = $("#CommPrefs_1\\/CommPrefValue");
    if (radioSelected('CommPrefs_1/PrefSuppType')) {
        if (radioSelectedValue('CommPrefs_1/PrefSuppType') == 'Y' && !validateEmail()) return false;
        commPref.removeAttr(disabled);
    } else {
        commPref.attr(disabled, disabled);
    }
    return true;
}

function SSDIF_Validate_Email_Newsletter_Optin() {
    // If email is entered then make the user select their email newsletter preference
    if ($('#TelephoneEmail\\/HomeEmail').val() != '') {
        if (!radioSelected('SubjectPrefs_1/PrefSuppType')) {
            alert("Please select whether you are happy to receive e-news");
            return false;
        }
    }

    if (radioSelected('SubjectPrefs_1/PrefSuppType')) {
        if (radioSelectedValue('SubjectPrefs_1/PrefSuppType') == 'Y') {
            if (!validateEmail()) { return false; }
        }
        $("#SubjectPrefs_1\\/SubjectPrefValue").removeAttr(disabled);
    } else {
        $("#SubjectPrefs_1\\/SubjectPrefValue").attr(disabled, disabled);
    }
    return true;
}

function SSDIF_Validate_Dream_Magazine_Optin() {
    var subPref = $("#SubjectPrefs_4\\/SubjectPrefValue");

    if (radioSelected('SubjectPrefs_4/PrefSuppType')) {
        if (radioSelectedValue('SubjectPrefs_4/PrefSuppType') == 'Y') {
            if (!validateEmail()) { return false; }
        }
        subPref.removeAttr(disabled);
    } else {
        subPref.attr(disabled, disabled);
    }
    return true;
}


// -- SSDIF - UTILITY FUNCTIONS -/

function initSSDIFReset() {
    $("#" + formName + " input, #" + formName + " select").each(function () {
        resetInputArray.push(new Array(this, $(this).val(), $(this).attr(disabled)));
    });
}

function resetSSDIFForm() {
    // Reset Values
    for (inputPos = 0; inputPos < resetInputArray.length; inputPos++) {
        $(resetInputArray[inputPos][0]).val(resetInputArray[inputPos][1]);

        if (resetInputArray[inputPos][2]) {
            $(resetInputArray[inputPos][0]).attr(disabled, disabled);
        } else {
            $(resetInputArray[inputPos][0]).removeAttr(disabled);
        }
    }
}

function toggleCompany(theSelection, companyDiv, companyText, companyCode) {
    if (radioSelectedValue(theSelection) == 'C') {
        $('#' + companyDiv).show();
        $('#' + companyText).removeAttr(disabled);
        $('#' + companyCode).removeAttr(disabled);
    } else {
        $('#' + companyDiv).hide();
        $('#' + companyText).attr(disabled, disabled);
        $('#' + companyCode).attr(disabled, disabled);
    }
}

function toggleCommPref(theSelection) {
    if ($('#' + theSelection).val() == 'Y') {
        $('#' + theSelection).val('N');
    } else {
        $('#' + theSelection).val('Y');
    }

    checkMarketedByHonda();
}

function checkMarketedByHonda() {
    var yesPrefs = false;

    $("[id^=CommPrefs]").each(function (i) {
        if ($(this).attr("id").indexOf("PrefSuppType") > -1) {
            if (($(this).val() == 'Y') && (!$(this).attr(disabled)) && (($(this).is("input[type='checkbox']") && $(this).is(':checked')) || ($(this).is("input[type='radio']") && $(this).is(':checked')) || ($(this).not("input[type='checkbox']").length && $(this).not("input[type='radio']").length))) yesPrefs = true;
        }
    });

    var marketed = $("#Entity\\/MarketedByHonda");
    if (yesPrefs) {
        marketed.val("Y");
    } else {
        marketed.val("");
    }
}

function toggleSubjectPref(theSelection, hiddenElement) {
    var hidden = $('#' + hiddenElement);
    if (radioSelected(theSelection)) {
        hidden.removeAttr(disabled);
    } else {
        hidden.attr(disabled, disabled);
    }
    checkMarketedByHonda();
}

function validateEmail() {
    // Validate Email
    if (!emailCheck($('#TelephoneEmail\\/HomeEmail').val())) {
        alert("Please enter a valid email address");
        return false;
    }
    return true;
}


function validateTelephone() {
    if (!telephoneValidate($('#X_phonenumber').val())) {
        alert("Please enter a valid telephone number");
        return false;
    }

    if (!radioSelected('TelephoneEmail/PrefTelephone')) {
        alert("Please select your telephone number type");
        return false;
    }

    var daytime = $('#TelephoneEmail\\/DaytimeNo');
    var evening = $('#TelephoneEmail\\/EveningNo');
    var mobile = $('#TelephoneEmail\\/MobileNo');

    switch ($('input[name="TelephoneEmail/PrefTelephone"]:checked').val()) {
        case 'D': 
            {
                daytime.val(removeAllSpaces($('#X_phonenumber').val()));
                daytime.removeAttr(disabled);
                evening.attr(disabled, disabled);
                mobile.attr(disabled, disabled);
                break;
            }
        case 'E': 
            {
                evening.val(removeAllSpaces($('#X_phonenumber').val()));
                evening.removeAttr(disabled);
                daytime.attr(disabled, disabled);
                mobile.attr(disabled, disabled);
                break;
            }
        case 'M': 
            {
                mobile.val(removeAllSpaces($('#X_phonenumber').val()));
                mobile.removeAttr(disabled);
                daytime.attr(disabled, disabled);
                evening.attr(disabled, disabled);
                break;
            }
    }
    return true;
}


//Checks whether the question is empty. If it is, it will disable the question and the response.
//Param : Comma-separated list of question numbers
function disableEmptyOptionalQuestions(questionNumbers) {
	var questions = questionNumbers.split(",");
	for (questionPos = 0; questionPos < questions.length; questionPos++) {
		var question = "#ContactWithHonda\\/Questions_" + questions[questionPos];
		if ($(question + "\\/Responses\\/ResponseText").val() == "") $(question + "\\/QuestionCode, " + question + "\\/Responses\\/ResponseText").attr(disabled, disabled);
	}
}

function getDealerByPostcode(postcode, destination) {
    postcode = postcode.toString().replace(/\+/g, "").replace(/^\s*/, "").replace(/\s*$/, "").replace(/%20/g, "").replace(/ /g, "");
    postcode = postcode.toUpperCase().substring(0, postcode.length - 3) + " " + postcode.toUpperCase().substring(postcode.length - 3);
    var isDealerFound = false;

    var urlPath = constants.ENTERPRISE;

    $.ajax({ url: '/_assets/behaviour/loader.asp?url=' + urlPath.toString() + 'GetDealerForTerritory?postcodePrefix=' + postcode, async: false, success: function (territoryXML) {
        var regex = new RegExp('^.*Dealership="([A-Z]*[a-z]*[0-9]* *)"/>.*$', 'm');
        var dealership = "";

        if (territoryXML.indexOf("Dealership=") > -1) {
            dealership = regex.exec(territoryXML)[1];
            $(destination).val(dealership);
            isDealerFound = true;
        } else {
            isDealerFound = false;
            //clear hidden postcode fields
            $('#Address\\/Postcode1, #Address\\/Postcode2').val("");
        }

    } 
    });

    return isDealerFound;
}

function setProspectInterestCarDetailsViaID(inputModelID, inputBodyID, inputBadgeID) {

    var actualBadge = inputBadgeID;
    var matchOne = inputModelID;
    var matchTwo = inputModelID + "_" + inputBodyID;
    var matchThree = inputModelID + "_" + inputBodyID;

    var actualMatch;

    if (inputBadgeID != "") {
        actualBadge = inputBadgeID.split(",")[0];
        matchThree = matchThree + "_" + actualBadge;
    }

    $("#ContactWithHonda\\/ProspectInterest\\/Division, #ContactWithHonda\\/ProspectInterest\\/ProductSegment").removeAttr(disabled);

    // Set Brand
    var brands = $("#ContactWithHonda\\/ProspectInterest\\/CarData\\/Brand");
    brands.val("HO");
    brands.removeAttr(disabled);

    $.ajax({ url: '/_assets/data/carData.xml', async: false, success: function (xmlDoc) {

        var modelGroups = $("#ContactWithHonda\\/ProspectInterest\\/CarData\\/ModelGroup");
        var bodyStyles = $("#ContactWithHonda\\/ProspectInterest\\/CarData\\/BodyStyle");
        var doors = $("#ContactWithHonda\\/ProspectInterest\\/CarData\\/Doors");

        modelGroups.removeAttr(disabled);
        bodyStyles.removeAttr(disabled);
        doors.removeAttr(disabled);

        if ($(xmlDoc).find("mbbitem[id='" + matchThree + "']").length > 0) {
            actualMatch = "mbbitem[id='" + matchThree + "']";
        } else if ($(xmlDoc).find("mbbitem[id='" + matchTwo + "']").length > 0) {
            actualMatch = "mbbitem[id='" + matchTwo + "']";
        } else if ($(xmlDoc).find("mbbitem[id='" + matchOne + "']").length > 0) {
            actualMatch = "mbbitem[id='" + matchOne + "']";
        }

        modelGroups.val($(xmlDoc).find(actualMatch).parent().parent().find("modelgroup").eq(0).text());
        doors.val($(xmlDoc).find(actualMatch).parent().parent().find("doors").eq(0).text());
        bodyStyles.val($(xmlDoc).find(actualMatch).parent().parent().find("bodystyle").eq(0).text());
    }
    });

}

function setProspectInterestCarDetails(inputModelGroup, inputBodyStyle, inputDoors, inputTransmission, inputFuelType) {
    var bodyStyles = $("#ContactWithHonda\\/ProspectInterest\\/CarData\\/BodyStyle");

    $("#ContactWithHonda\\/ProspectInterest\\/Division, #ContactWithHonda\\/ProspectInterest\\/ProductSegment").removeAttr(disabled);

    // Set Brand
    $("#ContactWithHonda\\/ProspectInterest\\/CarData\\/Brand").val("HO");
    $("#ContactWithHonda\\/ProspectInterest\\/CarData\\/Brand").removeAttr(disabled);

    // Set ModelGroup
    if (inputModelGroup != null) {

        var modelGroups = $("#ContactWithHonda\\/ProspectInterest\\/CarData\\/ModelGroup");

        modelGroups.removeAttr(disabled);

        $.ajax({ url: '/SSDiffService/lovService.do?codeType=213&startFilter=HO&startDescFilter=' + inputModelGroup, async: false, success: function (xmlDoc) {
            if ($(xmlDoc).find("LookupValue").length == 1) {
                modelGroups.val($(xmlDoc).find("Value").text());
            } else if ($(xmlDoc).find("LookupValue").length > 0) {
                $(xmlDoc).find("Description").each(function () {
                    var currentNode = $(this).text().toUpperCase();

                    if (currentNode == inputModelGroup.toUpperCase()) {
                        modelGroups.val($(this).parent().find("Value").text());
                    }

                });
            } else {
                modelGroups.attr(disabled, disabled);
            }
        } 
        });
    }

    // Set BodyStyle
    if (inputBodyStyle != null) {
        bodyStyles.removeAttr(disabled);

        $.ajax({ url: '/SSDiffService/lovService.do?codeType=11&startDescFilter=' + inputBodyStyle, async: false, success: function (xmlDoc) {
            if ($(xmlDoc).find("LookupValue").length == 1) {
                bodyStyles.val($(xmlDoc).find("Value").text());
            } else if ($(xmlDoc).find("LookupValue").length > 0) {
                $(xmlDoc).find("Description").each(function () {
                    var currentNode = $(this).text().toUpperCase();

                    if (currentNode == inputBodyStyle.toUpperCase()) {
                        bodyStyles.val($(this).parent().find("Value").text());
                    }

                });
            } else {
                bodyStyles.attr(disabled, disabled);
            }
        } 
        });
    }

    // Set Doors
    if (inputDoors != null) {
        var doors = $("#ContactWithHonda\\/ProspectInterest\\/CarData\\/Doors");
        doors.removeAttr(disabled);

        if (inputDoors != "") {
            doors.val(inputDoors);
        } else {
            doors.attr(disabled, disabled);
        }
    }

    // Set Transmission		
    if (inputTransmission != null) {
        var transmission = $("#ContactWithHonda\\/ProspectInterest\\/CarData\\/Transmission");
        transmission.removeAttr(disabled);

        $.ajax({ url: '/SSDiffService/lovService.do?codeType=283&startDescFilter=' + inputTransmission, async: false, success: function (xmlDoc) {
            if ($(xmlDoc).find("LookupValue").length == 1) {
                transmission.val($(xmlDoc).find("Value").text());
            } else if ($(xmlDoc).find("LookupValue").length > 0) {
                $(xmlDoc).find("Description").each(function () {
                    var currentNode = $(this).text().toUpperCase();

                    if (currentNode == inputTransmission.toUpperCase()) {
                        transmission.val($(this).parent().find("Value").text());
                    }

                });
            } else {
                transmission.attr(disabled, disabled);
            }
        } 
        });
    }

    // Set FuelType
    if (inputFuelType != null) {
        var fuelType = $("#ContactWithHonda\\/ProspectInterest\\/CarData\\/FuelType");
        fuelType.removeAttr(disabled);

        $.ajax({ url: '/SSDiffService/lovService.do?codeType=70&startDescFilter=' + inputFuelType, async: false, success: function (xmlDoc) {
            if ($(xmlDoc).find("LookupValue").length == 1) {
                fuelType.val($(xmlDoc).find("Value").text());
            } else if ($(xmlDoc).find("LookupValue").length > 0) {
                $(xmlDoc).find("Description").each(function () {
                    var currentNode = $(this).text().toUpperCase();

                    if (currentNode == inputFuelType.toUpperCase()) { // DW: Removed spurious .val()
                        fuelType.val($(this).parent().find("Value").text());
                    }

                });
            } else {
                fuelType.attr(disabled, disabled);
            }
        } 
        });
    }
}

function setProspectInterestCarDetailsUsedCars(inputModelGroup, inputBodyStyle, inputTransmission, inputFuelType) {
    setProspectInterestCarDetails(inputModelGroup, inputBodyStyle, null, inputTransmission, inputFuelType);
}

// -- SSDIF - BROCHURE REQUEST --
function buildCarDataTestDrive(mbb_model, mbb_body, mbb_badge) {
    if (!$carData.find(["mbbitem[id='", mbb_model, "_", mbb_body, "_", mbb_badge, "']"].join('')).length) {
        if (!$carData.find(["mbbitem[id='", mbb_model, "_", mbb_body, "']"].join('')).length) {
            if ($carData.find(["mbbitem[id='", mbb_model, "']"].join('')).length) {
				processCarDataTestDrive(mbb_model);
            }
        }
		else {
            processCarDataTestDrive(mbb_model + "_" + mbb_body);
        }
    } 
	else {
        processCarDataTestDrive(mbb_model + "_" + mbb_body + "_" + mbb_badge);
    }
}

function processCarDataTestDrive(searchString) {
    var inputTestDrive = '<input type="hidden" name="ContactWithHonda/TestDrive';
    var inputProspect = '<input type="hidden" name="ContactWithHonda/ProspectInterest';
    var carData = '/CarData';
    var idContact = 'id="ContactWithHonda';
    var testDriveCar = '/TestDrive/CarData';
    var prospectData = '/ProspectInterest/CarData';

    var carDataArray = new Array(
	    [inputTestDrive, '/Division" ', idContact, '/TestDrive/Division" value="20" />'].join(''),
	    [inputTestDrive, '/ProductSegment" ', idContact, '/TestDrive/ProductSegment" value="080" />'].join(''),	
		[inputTestDrive, carData, '/Brand" ', idContact, testDriveCar, '/Brand" value="HO" />'].join(''),
	    [inputTestDrive, carData, '/ModelGroup" ', idContact, testDriveCar, '/ModelGroup" />'].join(''),
	    [inputTestDrive, carData, '/Trim" ', idContact, testDriveCar, '/Trim" value="" />'].join(''),
	    [inputTestDrive, carData, '/Doors" ', idContact, testDriveCar, '/Doors" />'].join(''),
	    [inputTestDrive, carData, '/EngineSizeCC" ', idContact, testDriveCar, '/EngineSizeCC" value="" />'].join(''),
	    [inputTestDrive, carData, '/ModelYear" ', idContact, testDriveCar, '/ModelYear" />'].join(''),
	    [inputTestDrive, carData, '/BodyStyle" ', idContact, testDriveCar, '/BodyStyle" />'].join(''),
	    [inputTestDrive, carData, '/FuelType" ', idContact, testDriveCar, '/FuelType" />'].join(''),
	    [inputTestDrive, carData, '/Transmission" ', idContact, testDriveCar, '/Transmission" value="" />'].join(''),
		[inputProspect, '/Division" ', idContact, '/ProspectInterest/Division" value="20" />'].join(''),
	    [inputProspect, '/ProductSegment" ', idContact, '/ProspectInterest/ProductSegment" value="080" />'].join(''),
		[inputProspect, carData, '/Brand" ', idContact, prospectData, '/Brand" value="HO" />'].join(''),
		[inputProspect, carData, '/ModelGroup" ', idContact, prospectData, '/ModelGroup" />'].join(''),		
	    [inputProspect, carData, '/Trim" ', idContact, prospectData, '/Trim" value="" />'].join(''),
	    [inputProspect, carData, '/Doors" ', idContact, prospectData, '/Doors" />'].join(''),
	    [inputProspect, carData, '/EngineSizeCC" ', idContact, prospectData, '/EngineSizeCC" value="" />'].join(''),
	    [inputProspect, carData, '/ModelYear" ', idContact, prospectData, '/ModelYear" />'].join(''),
	    [inputProspect, carData, '/BodyStyle" ', idContact, prospectData, '/BodyStyle" />'].join(''),
	    [inputProspect, carData, '/FuelType" ', idContact, prospectData, '/FuelType" />'].join(''),
	    [inputProspect, carData, '/Transmission" ', idContact, prospectData, '/Transmission" value="" />'].join('')
	);

    $carData.find(["mbbitem[id='", searchString, "']"].join('')).each(function () {
        for (arrayNum = 0; arrayNum < carDataArray.length; arrayNum++) {
            var hiddenValues = $(carDataArray[arrayNum]);
            var brochure = $(this).parents("brochure");

            switch (arrayNum) {
                case 3: 
                    {
						hiddenValues.val(brochure.find("modelgroup").text());
                        break;
                    }
                case 5: 
                    {
                        hiddenValues.val(brochure.find("doors").text());
                        break;
                    }
                case 7: 
                    {
                        hiddenValues.val(brochure.find("modelyear").text());
                        break;
                    }
                case 8: 
                    {
                        hiddenValues.val(brochure.find("bodystyle").text());
                        break;
                    }
                case 9: 
                    {
                        hiddenValues.val(brochure.find("fueltype").text());
                        break;
                    }
                case 14: 
                    {
                        hiddenValues.val(brochure.find("modelgroup").text());
                        break;
                    }
                case 16: 
                    {
                        hiddenValues.val(brochure.find("doors").text());
                        break;
                    }
                case 18: 
                    {
                        hiddenValues.val(brochure.find("modelyear").text());
                        break;
                    }
                case 19: 
                    {
                        hiddenValues.val(brochure.find("bodystyle").text());
                        break;
                    }
                case 20: 
                    {
                        hiddenValues.val(brochure.find("fueltype").text());
                        break;
                    }
            }
			$('#' + formName).append(hiddenValues);
        }
    });
}

function buildCarBrochureElements() {

    var contact = '<input type="hidden" name="ContactWithHonda';
    var fulFil = '/FulfilmentRequest_~';
    var prospect = '/ProspectInterest_~';
    var carData = '/CarData';
    var withHonda = 'id="ContactWithHonda';

    var brochureArray = new Array(
		[contact, fulFil, '/RequestType" ', withHonda, fulFil, '/RequestType" value="B" />'].join(''),
		[contact, fulFil, '/RequestItemService" ', withHonda, fulFil, '/RequestItemService" />'].join(''),
		[contact, prospect, '/Division" ', withHonda, prospect, '/Division" value="20" />'].join(''),
		[contact, prospect, '/ProductSegment" ', withHonda, prospect, '/ProductSegment" value="080" />'].join(''),
		[contact, prospect, '/PlannedPurchaseDate" ', withHonda, prospect, '/PlannedPurchaseDate"/>'].join(''),
		[contact, prospect, carData, '/Brand" ', withHonda, prospect, '/CarData/Brand" value="HO" />'].join(''),
		[contact, prospect, carData, '/ModelGroup" ', withHonda, prospect, '/CarData/ModelGroup" />'].join(''),
		[contact, prospect, carData, '/Trim" ', withHonda, prospect, '/CarData/Trim" value="" />'].join(''),
		[contact, prospect, carData, '/Doors" ', withHonda, prospect, '/CarData/Doors" />'].join(''),
		[contact, prospect, carData, '/EngineSizeCC" ', withHonda, prospect, '/CarData/EngineSizeCC" value="" />'].join(''),
		[contact, prospect, carData, '/ModelYear" ', withHonda, prospect, '/CarData/ModelYear" />'].join(''),
		[contact, prospect, carData, '/BodyStyle" ', withHonda, prospect, '/CarData/BodyStyle" />'].join(''),
		[contact, prospect, carData, '/FuelType" ', withHonda, prospect, '/CarData/FuelType" />'].join(''),
		[contact, prospect, carData, '/Transmission" ', withHonda, prospect, '/CarData/Transmission" value="" />'].join(''),
		[contact, prospect, '/CorporatePrivateUser" ', withHonda, prospect, '/CorporatePrivateUser" value="" />'].join(''),
		[contact, prospect, '/Relationship" ', withHonda, prospect, '/Relationship" value="" />'].join(''),
		[contact, prospect, '/IntentNewUsed" ', withHonda, prospect, '/IntentNewUsed" value="" />'].join('')
	);

    /*
    The elements that need filling in are :
    1 - Brochure Code
    4 - Planned Purchase date : yyyy-mm-01
    6 - Model Group
    8 - Doors
    10 - Model Year
    11 - Body Style
    12 - Fuel Type		
    14 - Corporate / Private
    15 - Corporate / Private
    16 - New / Used
    */

    var queryString = unescape(getHttpGetParameters("brochures")).toString().replace("#", "").split(",");
    queryString = queryString.concat(getHttpGetParameters("acc").toString().replace("#", "").split(","));
    var fulfilElementNum = 0;
    var prospectElementNum = 0;

    for (brochureNum = 0; brochureNum < queryString.length; brochureNum++) {

        var currentBrochure = queryString[brochureNum];

        $carData.find("brochure[code='" + currentBrochure + "']").each(function () {
            var isAccessory = false;

            if ($(this).find("brand").text() == '') {
                isAccessory = true;
            } else {
                prospectElementNum++;
            }

            fulfilElementNum++;

            for (arrayNum = 0; arrayNum < brochureArray.length; arrayNum++) {

                var addElement = true;

                if (isAccessory && arrayNum >= 2) addElement = false;
                if (addElement) {
                    var hidden;

                    if (arrayNum < 2) {
                        hidden = $(brochureArray[arrayNum].replace(/\~/g, (fulfilElementNum)));
                    } else {
                        hidden = $(brochureArray[arrayNum].replace(/\~/g, (prospectElementNum)));
                    }

                    var hiddenValues = $(hidden);
                    var jthis = $(this);

                    switch (arrayNum) {
                        case 1: 
                            {
                                hiddenValues.val(currentBrochure);
                                break;
                            }
                        case 4: 
                            {
                                hiddenValues.val($('#X_replaceYear').val() + "-" + $('#X_replaceMonth').val() + "-01");
                                break;
                            }
                        case 6: 
                            {
                                hiddenValues.val(jthis.find("modelgroup").text());
                                break;
                            }
                        case 8: 
                            {
                                hiddenValues.val(jthis.find("doors").text());
                                break;
                            }
                        case 10: 
                            {
                                hiddenValues.val(jthis.find("modelyear").text());
                                break;
                            }
                        case 11: 
                            {
                                hiddenValues.val(jthis.find("bodystyle").text());
                                break;
                            }
                        case 12: 
                            {
                                hiddenValues.val(jthis.find("fueltype").text());
                                break;
                            }
                        case 14: 
                            {
                                hiddenValues.val(radioSelectedValue('X_corpPrivUser'));
                                break;
                            }
                        case 15: 
                            {
                                if (radioSelectedValue('X_corpPrivUser') == 'C') {
                                    hiddenValues.val('U');
                                } else {
                                    hiddenValues.val('O');
                                }
                                break;
                            }
                        case 16: 
                            {
                                hiddenValues.val(radioSelectedValue('X_newUsed'));
                            }
                    }

                    $('#' + formName).append(hidden);
                }
            }
        });
    }
}

function buildBrochureElements(businessArea,brochureListArray,validatePurchaseDate) {
	
	if ((!selectSelected("X_plannedPurchaseMonth") || !selectSelected("X_plannedPurchaseYear")) && validatePurchaseDate) {
        alert("Please enter a valid planned purchase date");
        return false;
    }
    if ( (!SSDIF_Validate_Planned_Purchase_Date("#X_plannedPurchaseMonth", "#X_plannedPurchaseYear")) && validatePurchaseDate) return false;
	
	// Remove the original element so that it can be used against each brochure
	$('#ContactWithHonda\\/ProspectInterest\\/PlannedPurchaseDate').remove();
	
	brochureListArray = unescape(brochureListArray.toString()).replace("#", "").split(",");
	var fulfilElementNum = 0;
	var prospectElementNum = 0;

	var powerDataXML;
	var jpowerData; //Jquery parsed version of power data = $(powerDataXML)
	
	var contact = '<input type="hidden" name="ContactWithHonda';		
	var fulFil = '/FulfilmentRequest_~';
	var prospect = '/ProspectInterest_~';
	var withHonda =  'id="ContactWithHonda';
	
	var firstBrochureArray = new Array(
		[contact, fulFil, '/RequestType" ', withHonda, fulFil, '/RequestType" value="B" />'].join(''),
		[contact, fulFil, '/RequestItemService" ', withHonda, fulFil, '/RequestItemService" />'].join(''),
		[contact, prospect, '/Division" ', withHonda, prospect, '/Division" />'].join(''),
		[contact, prospect, '/ProductSegment" ', withHonda, prospect, '/ProductSegment" />'].join(''),
		[contact, prospect, '/PlannedPurchaseDate" ', withHonda, prospect, '/PlannedPurchaseDate"/>'].join('')
	);
	
	var carBrochureArray = new Array(
		[contact, prospect, '/CarData', '/Brand" ', withHonda, prospect, '/CarData/Brand" value="HO" />'].join(''),
		[contact, prospect, '/CarData', '/ModelGroup" ', withHonda, prospect, '/CarData/ModelGroup" />'].join(''),
		[contact, prospect, '/CarData', '/Trim" ', withHonda, prospect, '/CarData/Trim" value="" />'].join(''),
		[contact, prospect, '/CarData', '/Doors" ', withHonda, prospect, '/CarData/Doors" />'].join(''),
		[contact, prospect, '/CarData', '/EngineSizeCC" ', withHonda, prospect, '/CarData/EngineSizeCC" value="" />'].join(''),
		[contact, prospect, '/CarData', '/ModelYear" ', withHonda, prospect, '/CarData/ModelYear" />'].join(''),
		[contact, prospect, '/CarData', '/BodyStyle" ', withHonda, prospect, '/CarData/BodyStyle" />'].join(''),
		[contact, prospect, '/CarData', '/FuelType" ', withHonda, prospect, '/CarData/FuelType" />'].join(''),
		[contact, prospect, '/CarData', '/Transmission" ', withHonda, prospect, '/CarData/Transmission" value="" />'].join(''),		
		[contact, prospect, '/CorporatePrivateUser" ', withHonda, prospect, '/CorporatePrivateUser" value="" />'].join(''),
		[contact, prospect, '/Relationship" ', withHonda, prospect, '/Relationship" value="" />'].join(''),
		[contact, prospect, '/IntentNewUsed" ', withHonda, prospect, '/IntentNewUsed" value="" />'].join('')
	);
	
	var powerBrochureArray = new Array(
		[contact, prospect, 'BUSINESS_AREA', '/Brand" ', withHonda, prospect, 'BUSINESS_AREA/Brand" value="H" />'].join(''),
		[contact, prospect, 'BUSINESS_AREA', '/Range" ', withHonda, prospect, 'BUSINESS_AREA/Range" />'].join(''),
		[contact, prospect, 'BUSINESS_AREA', '/Model" ', withHonda, prospect, 'BUSINESS_AREA/Model" value="" />'].join('')
	);
	

	for(brochureNum = 0; brochureNum < brochureListArray.length; brochureNum++) {
		
		var currentBrochure = brochureListArray[brochureNum];
		var dataSet;
		var division;
		var finalBrochureArray;
		
		switch(businessArea) {
			case "CAR": {
				dataSet = $carData;	
				division = 20;
				finalBrochureArray = firstBrochureArray.concat(carBrochureArray);
				break;
			}
			case "MOTORCYCLES": {
				break;
			}
			default: {
								
				$.ajax({
			        url: "/_assets/data/powerData.xml",
			        async: false,
			        success: function (response) {
			            powerDataXML = response;
						jpowerData = $(powerDataXML);	
			        }
			    });
				
				dataSet = jpowerData;
				division = 30;
				finalBrochureArray = firstBrochureArray.concat(powerBrochureArray);
				break;
			}
		}
		
		var currentBrochure = brochureListArray[brochureNum];
			
		dataSet.find("brochure[code='" + currentBrochure + "']").each(function(){		
			var isAccessory = false;
					
			if($(this).find("brand").text() == '') {
				isAccessory = true;							
			} else {
				prospectElementNum++;
			}
			
			fulfilElementNum++;
						
			for(arrayNum = 0; arrayNum < finalBrochureArray.length; arrayNum++) {

				var addElement = true;							
						
				if(isAccessory && arrayNum >= 2) addElement = false;

				if(addElement) {

					var hidden;
							
					if(arrayNum < 2) {
						hidden = $(finalBrochureArray[arrayNum].replace(/\~/g,(fulfilElementNum)));
					} else {
						hidden = $(finalBrochureArray[arrayNum].replace(/\~/g,(prospectElementNum)).replace(/BUSINESS_AREA/g,"/"+jthis.find("prospectInterest").text()) );
					}
							
					var hiddenValues = $(hidden);
					var jthis = $(this);
					
					// This applies to ALL Business Areas
					switch(arrayNum) {
						case 1 : {
							// 1. - Brochure Code
							hiddenValues.val(currentBrochure); 
							break;
						}
						case 2 : {
							// 2. - Division
							hiddenValues.val(division); 
							break;
						}
						case 3 : {
							// 3. - Product Segment						
							hiddenValues.val(jthis.find("productSegment").text());								
							break;
						}
						case 4 : {		
							// 4. - Planned Purchase Data
							hiddenValues.val($('#X_plannedPurchaseYear').val() + "-" + $('#X_plannedPurchaseMonth').val() + "-01");																 						
							break;
						}						
					}

					switch(businessArea) {
						case "CAR": {
							switch(arrayNum) {
								case 6 : {
									hiddenValues.val(jthis.find("modelgroup").text()); 
									break;
								}
								case 8 : {
									hiddenValues.val(jthis.find("doors").text()); 
									break;
								}
								case 10 : {
									hiddenValues.val(jthis.find("modelyear").text()); 
									break;
								}
								case 11 : {
									hiddenValues.val(jthis.find("bodystyle").text()); 
									break;
								}
								case 12 : {
									hiddenValues.val(jthis.find("fueltype").text()); 
									break;
								}
								case 14 : {
									hiddenValues.val(radioSelectedValue('ContactWithHonda/ProspectInterest/CorporatePrivateUser'));
									break;									
								}
								case 15 : {
									if(radioSelectedValue('ContactWithHonda/ProspectInterest/CorporatePrivateUser') == 'C') {
										hiddenValues.val('U');
									} else {
										hiddenValues.val('O');
									}
									break;
								}
								case 16 : {
									hiddenValues.val(radioSelectedValue('ContactWithHonda/ProspectInterest/IntentNewUsed'));
									
									// Now remove any elements that are no longer required
	$('#ContactWithHonda\\/ProspectInterest\\/IntentNewUsed_New','#ContactWithHonda\\/ProspectInterest\\/IntentNewUsed_Used','#ContactWithHonda\\/ProspectInterest\\/CorporatePrivateUser_Private','#ContactWithHonda\\/ProspectInterest\\/CorporatePrivateUser_Company','#ContactWithHonda\\/ProspectInterest\\/Relationship','#ContactWithHonda\\/ProspectInterest\\/CarData\\/Brand','#ContactWithHonda\\/ProspectInterest\\/CarData\\/ModelGroup','#ContactWithHonda\\/ProspectInterest\\/Division','#ContactWithHonda\\/ProspectInterest\\/ProductSegment').remove();

									break;
								}
							}
							break;
						}
						case "MOTORCYCLES": {
							break;
						}
						default: {
							switch(arrayNum) {
								case 6 : {
									hiddenValues.val(jthis.find("range").text()); 
									break;
								}
								case 7 : {
									hiddenValues.val(jthis.find("model").text()); 
									break;
								}
							}
							break;
						}
					}
					$('#'+formName).append(hidden);					
				        
				}
			}
		
		})
		
	}
	return true;
}


function fillPrefMethodOfContact() {
    var contact = $('#Entity\\/PrefContactMedium');

    if (contact.length) {

        var build = [];

        build.push('<option value="">Please select ...</option>');
        build.push('<option value="M">Post</option>');
        build.push('<option value="E">Email</option>');
        build.push('<option value="T">Telephone</option>');

        contact.empty().append(build.join(''));
    }
}

/*******************************************************************************************/
/**************************************** QAS **********************************************/
/*******************************************************************************************/

var qasServiceUrl = "/honda-utility/addressFinder.do"

var QASAddressList = "dAddressList";

var qas_houseTextBox;
var qas_postcodeTextBox;
var qas_addressList;
var addressArray = new Array();
var addressSelected = 0;

function qas_parseAddresses(strParam) {

    var counter = 0;


    $.get(qasServiceUrl + "?" + strParam, function (xmldoc) {

        var str = "";
        var jxmlDoc = $(xmldoc);

        var count = jxmlDoc.find("count").text();
        var found = jxmlDoc.find("found").text();

        qas_clearList();

        var i = 0;

        jxmlDoc.find("picklistItem, addressItem").each(function () {

            var thisItem = this;

            var addressHouseNo = qas_readValue(thisItem, "addressHouseNo");

            var addressStreet = qas_readValue(thisItem, "addressStreet");
            var addressDistrict = qas_readValue(thisItem, "addressDistrict");

            var addressArea = qas_readValue(thisItem, "addressArea");

            var addressTown = qas_readValue(thisItem, "addressTown");
            var addressCounty = qas_readValue(thisItem, "addressCounty");
            var addressPostCode = qas_readValue(thisItem, "addressPostCode");

            var monikerId = qas_readValue(thisItem, "qasApprovedAddress");

            qas_addToList(addressHouseNo, addressStreet, addressDistrict, addressArea, addressTown, addressCounty, addressPostCode, monikerId);

            i++;
        });

        if (jxmlDoc.find("picklistItem, addressItem").length > 1) {

            qas_displayList();
        }
        else if (jxmlDoc.find("picklistItem, addressItem").length == 0) {
            alert("Sorry, we couldn't find that address. Please try again");
        }

        if (count == 1) qas_setAddress(0);
    });
}


function qas_readValue(node, name) {
    if ($(node).find(name).length) {
        return $(node).find(name).text();
    }
    else {
        return "";
    }

}

function qas_clearList() {
    addressArray.length = 0;
}

function qas_addToList(num, street, district, area, town, county, pc, monikerId) {
    newAddress = new Array(num, street, district, area, town, county, pc, monikerId);
    addressArray.push(newAddress);
}

function qas_displayList() {
    qas_listStr = "";
    for (i = 0; i < addressArray.length; i++) {
        // Trim this down
        addressArray[i][0] = addressArray[i][0].substring(0, addressArray[i][0].indexOf(","));

        qas_listStr += "<a href=\"javascript:qas_retrieveAddress('" + addressArray[i][7] + "');\" class=\"qas\">" + addressArray[i][0] + "</a><br>";
    }
    $(qas_addressList).html(qas_listStr).show();
}

function qas_retrieveAddress(i) {
    qas_clearList();

    $.get(qasServiceUrl + "?monikerId=" + i, function (xmldoc) {
        $(xmldoc).find("addressItem").each(function () {
            var thisItem = this;

            var addressHouseNo = qas_readValue(thisItem, "addressHouseNo");

            var addressStreet = qas_readValue(thisItem, "addressStreet");
            var addressDistrict = qas_readValue(thisItem, "addressDistrict");

            var addressArea = qas_readValue(thisItem, "addressArea");

            var addressTown = qas_readValue(thisItem, "addressTown");
            var addressCounty = qas_readValue(thisItem, "addressCounty");
            var addressPostCode = qas_readValue(thisItem, "addressPostCode");

            var monikerId = qas_readValue(thisItem, "qasApprovedAddress");

            qas_addToList(addressHouseNo, addressStreet, addressDistrict, addressArea, addressTown, addressCounty, addressPostCode, monikerId);

            qas_setAddress(0);
        });
    });


}

function qas_setAddress(i) {
    addressSelected = i;
    qas_AddressSelected();
    $(qas_addressList).hide();
}

function qas_getTextValue(obj) {
    return obj.options[obj.selectedIndex].text;
}


//public functions

function qas_getHouse() {
    return addressArray[addressSelected][0];
}

function qas_getStreet() {
    return addressArray[addressSelected][1];
}

function qas_getDistrict() {
    return addressArray[addressSelected][2];
}

function qas_getArea() {
    return addressArray[addressSelected][3];
}

function qas_getTown() {
    return addressArray[addressSelected][4];
}

function qas_getCounty() {
    return addressArray[addressSelected][5];
}

function qas_getPostcode() {
    return addressArray[addressSelected][6];
}

function qas_getMonikerId() {
    return addressArray[addressSelected][7]
}

function qas_Submit() {

    qas_houseTextBox = $('#' + formName + ' #X_house');
    qas_postcodeTextBox = $('#' + formName + ' #X_postcode');
    qas_addressList = $('#' + QASAddressList);

    $(qas_addressList).hide();

    var formFilled = true;

    if ($(qas_postcodeTextBox).val().length == 0) {
        formFilled = false;
    }
    if ($(qas_houseTextBox).val().length == 0) {
        formFilled = false;
    }

    pc = $(qas_postcodeTextBox).val();
    testPC = isValidPostcode(pc);
    if (!testPC) { formFilled = false; }

    if (formFilled) {
        qas_parseAddresses('house=' + $(qas_houseTextBox).val() + '&postcode=' + $(qas_postcodeTextBox).val());
    }
    else {
        alert("Please enter a house number/name and a postcode");
    }

}

function qas_AddressesReturned() {
    alert("addresses returned");
}

function qas_AddressSelected() {
    $('#Address\\/Address1').val(qas_getHouse());
    $('#Address\\/Address2').val(qas_getStreet());
    $('#Address\\/Address3').val(qas_getDistrict());
    $('#Address\\/Address4').val(qas_getArea());
    $('#Address\\/Town').val(qas_getTown());

    if ($('#Address\\/County').length > 0) {
        $('#Address\\/County').val(qas_getCounty());
    }

    $('#Address\\/Postcode1').val($(qas_postcodeTextBox).val().toUpperCase().replace(' ', '').substring(0, $(qas_postcodeTextBox).val().replace(' ', '').length - 3));
    $('#Address\\/Postcode2').val($(qas_postcodeTextBox).val().toUpperCase().replace(' ', '').substring($(qas_postcodeTextBox).val().replace(' ', '').length - 3));
}

// This function adds a star if the optional testCondition is true and there isn't already one there.
(function ($) {
    $.fn.appendStar = function (testCondition) {
        if (typeof (testCondition) === "undefined" || testCondition) {
            this.each(function () {
                var element = $(this);
                var text = element.text();
                // check to see if there is a star in the last position ...
                if (text.indexOf("*", (text.length - 1)) === -1) {
                    //... if not, then add it:
                    element.append("*");
                }
            });
        }
        return this;
    }
})(jQuery);


/* Dynamic Comms and Campaign Code Support 
* ---------------------------------------
* Enables marketers to alter the Campaign and Comms codes dependant upon the source of the visitor by supplying different URLs to different mediums
* 
* - Enabled by setting DynamicCampaignId to true 
* - Reads campaignid from query string (or from passed parameter, for future support)
* - campaignid MUST be 12 alphanumeric characters long (alpha need to be upper case):
* 		- Division (one letter)
* 		- Activity Type (one letter)
* 		- Sequence Number (four digits)
* 		- Cell Ref (two digits)
* 		- Outbound medium (one letter)
* 		- Data Source (two digits)
* 		- Outbound Execution (one letter)
* 		
* 		Reg exp needs to match:
* 		- Start of string, letter, letter, four digits, two digits, letter, two digits, letter. End of string. See regexp below.
* - there should be values specified in the document already
*/
var ssdifDynamicCampaignId = function (passedCampaignId) {
    
    // If it's not enabled, exit with error.
    if (!ssdifCampaignValues['DynamicCampaignId']) return false;
    
    // read string
    // if id is passed into function, use that, otherwise get from query string:
    if (typeof (passedCampaignId) === "undefined" || passedCampaignId === null) {
        campaignid = getHttpGetParameters("campaignid")[0]; // Need to get first element in the returned array, it doesn't return as a string.
    } else {
        campaignid = passedCampaignId;
    }

    // check string (confirm it is string first)
    if (typeof (campaignid) !== "string") { // this prevents errors when trying to access the toUpperCase method on non strings
        return false;
    }
    // output needs to be uppercase, but input in either allowed:
    campaignid = campaignid.toUpperCase();
    var campaignid = removeAllSpaces(campaignid); // keep it trim - uses standard ssdif method
    // see comments above for the reasons behind this regular expression. 
    // Note the extensive use of round brackets, these create capture groups in the output, meaning this line splits as well as checking the string 
    var regexp = /^([A-Z])([A-Z])([0-9]{4})([0-9]{2})([A-Z])([0-9]{2})([A-Z])$/;
    var output = regexp.exec(campaignid); // run the regexp and store capture groups in array. output[0] is the full match, output[1] to [7] are the capture groups...

    // is the input string valid? (if the regexp doesn't match, it returns null
    if (output === null) { // no match	
        return false
    }

    // split string (uses previously created regular expression capture groups)
    var division = output[1];
    var activityType = output[2];
    var sequenceNumber = output[3];
    var cellRef = output[4];
    var outboundMedium = output[5];
    var dataSource = output[6];
    var outboundExecution = output[7];

    // write string to JS Object: (in case it gets reinitialised) 

    ssdifCampaignValues['ContactWithHonda/CampaignDivision'] = division;
    ssdifCampaignValues['ContactWithHonda/ActivityType'] = activityType;
    ssdifCampaignValues['ContactWithHonda/SequenceNumber'] = sequenceNumber;
    ssdifCampaignValues['ContactWithHonda/CellRef'] = cellRef;
    ssdifCampaignValues['ContactWithHonda/OutboundMedium'] = outboundMedium;
    ssdifCampaignValues['ContactWithHonda/DataSource'] = dataSource;
    ssdifCampaignValues['ContactWithHonda/OutboundExecution'] = outboundExecution;

    // write string to DOM: (so it gets used on submit)
    $("#ContactWithHonda\\/CampaignDivision").val(division);
    $("#ContactWithHonda\\/ActivityType").val(activityType);
    $("#ContactWithHonda\\/SequenceNumber").val(sequenceNumber);
    $("#ContactWithHonda\\/CellRef").val(cellRef);
    $("#ContactWithHonda\\/OutboundMedium").val(outboundMedium);
    $("#ContactWithHonda\\/DataSource").val(dataSource);
    $("#ContactWithHonda\\/OutboundExecution").val(outboundExecution);

    return true
}

/*************************************************
* 
* SSDIF Dealer Preferences
* 
* This code was requested, developed, tested locally 
* and then removed from the spec: it's finished, 
* but hasn't been properly tested.
* 
**************************************************/

/* Populate a dropdown list with dealers local to a postcode  */
var ssdifDealerSearch = function () { // This is a wrapper because Multimap's callback function doesn't support dots in callback function names.
    ssdifDealer.search();
};
var ssdifDealer = {
    // Note, this section relies on several AJAX calls, so makes extensive use of callbacks:
    // .init - loads necessary multimap javascript files, calls .search
    // .search - uses the loaded code to run a search, calls .getTerritory
    // .getTerrotiry - runs two ajax calls, one after the success of the other.

    region: "GB",
    postcode: "",
    searcher: {}, // The searcher object.
    init: function (postcode) { // added to support preferred dealer dropdown.
        // This function requires multimap.js and multimap.configuration.js
        // test for required files
        if (typeof (MULTIMAP_ROOT) === "undefined") {
            $.ajax({
                url: "/_assets/behaviour/multimap.configuration.js",
                type: "GET",
                dataType: "script",
                cache: true
            });
        }
        if (typeof (MULTIMAP_CLIENT_KEY) === "undefined") {
            $.ajax({
                url: "/cars/_assets/behaviour/multimap.configuration.js",
                type: "GET",
                dataType: "script",
                cache: true
            });
        }
        if (typeof (window.MM_DOMAIN_NAME) === "undefined") {
            $.ajax({
                url: "http://clients.multimap.com/API/maps/1.2/hondacars_api?callback=ssdifDealerSearch",
                type: "GET",
                dataType: "script",
                cache: true
            });
        } else {
            ssdifDealer.search();
        }

        // Set postcode in global object
        ssdifDealer.postcode = postcode;

        // Set up dropdown menues
        ssdifDealer.dropdowns = $("#PreferredDealer_1\\/SellingDealerCode, #PreferredDealer_1\\/ServicingDealerCode");
    },
    search: function () {
        var region = ssdifDealer.region, location = ssdifDealer.postcode;
        cachedLocation = location;
        ssdifDealer.searcher = MMFactory.createSearchRequester(ssdifDealer.getTerritory);

        var search = new MMSearch();
        search.data_source = MULTIMAP_CLIENT_KEY;
        search.address = new MMAddress({ qs: location, country_code: region });
        search.radius_units = MULTIMAP_DISTANCE_UNIT;
        search.route_modes = 'walking,driving';
        search.max_distance = Number(MULTIMAP_MAXIMUM_DISTANCE);
        search.min_distance = Number(MULTIMAP_MINIMUM_DISTANCE);
        search.count = Number(MULTIMAP_RESULTS_COUNT);
        search.start_index = Number(1);
        search.order_by_fields = 'driving_distance';
        search.order_by_order = 'asc';
        search.result_set_size = MULTIMAP_RESULTS_COUNT;
        search.filters = [];

        ssdifDealer.searcher.search(search);
    },
    parse: function (territoryDealer) {
        var options = [];
        var firstOptions = [];
        firstOptions.push('<option value="">No preferrence</option>');

        // Error checking. If nothing returned, do nothing. (might want to notify user in future?)
        if (ssdifDealer.searcher.record_sets.length > 0) {
            var l = ssdifDealer.searcher.record_sets[0].records.length
            if (l > 0) {
                $("#DIV_PreferredDealer").removeClass("defaultHIDE");

                // territoryDealer needs to be first.
                var parseData = function (dealerCode, dealerName) {
                    return '<option value="' + dealerCode + '">' + dealerName + '</option>';
                }

                for (var i = 0; i < l; i++) {
                    dealerCode = ssdifDealer.searcher.record_sets[0].records[i].hukdealercode;
                    if (dealerCode === territoryDealer) {
                        firstOptions.push(parseData(dealerCode, ssdifDealer.searcher.record_sets[0].records[i].name + ", " + ssdifDealer.searcher.record_sets[0].records[i].town));
                    } else {
                        options.push(parseData(dealerCode, ssdifDealer.searcher.record_sets[0].records[i].name + ", " + ssdifDealer.searcher.record_sets[0].records[i].town));
                    }
                }
                var html = firstOptions.join() + options.join();
                ssdifDealer.dropdowns.each(function () {
                    $(this).html(html);
                })
            }
        }
    },
    getTerritory: function () {// This call is a duplicte of one that exists in-page elsewhere - they should be standardised
        // call ASP script to get the location of ENTERPRISE
        var territoryDealer = null;
        $.ajax({
            url: "/_assets/behaviour/getglobalvar.asp?var=ENTERPRISE",
            async: false,
            success: function (response) {
                var enterpriseURL = response.toString();
                var postcode = ssdifDealer.postcode;

                postcode = postcode.toString().replace(/\+/g, "").replace(/^\s*/, "").replace(/\s*$/, "").replace(/%20/g, "").replace(/ /g, "");
                postcode = postcode.toUpperCase().substring(0, postcode.length - 3) + " " + postcode.toUpperCase().substring(postcode.length - 3);
                // call the dealer territories service and get the nominated dealership for their postcode (timeout of 10 seconds incase ENTERPRISE
                $.ajax({
                    url: "/_assets/behaviour/loader.asp?url=" + enterpriseURL + "GetDealerForTerritory?postcodePrefix=" + postcode,
                    async: false,
                    timeout: 10000,
                    success: function (response) {
                        var regex = new RegExp('^.*Dealership="([A-Z]*[a-z]*[0-9]*)"/>.*$', 'm');

                        // only proceed if we're able to extract the territory dealership from the response
                        if (response !== null && response != "" && response !== "<rows/>") {
                            territoryDealer = regex.exec(response)[1].toString();
                        }
                    }
                });
            },
            complete: function () { // This function wants to run on both success and error
                ssdifDealer.parse(territoryDealer);
            }
        });
    }
};

var populateDropdown = function (elementIn, dataIn) { // This function takes the data (string) in element (jQuery object), finds it, selects it and handles errors.
    var element, data;

    // There are some occassions where populateDropdown is used as a callback function 
    // (e.g. if the dropdown contents is being populated by an AJAX call), in these
    // situations, the function parameters need to be passed though as an array, we check 
    // for and handle that situation here:
    if (arguments.length === 1) { // assume options being passed in as array (from callback)
        element = arguments[0][0];
        data = arguments[0][1];
    } else {
        element = elementIn;
        data = dataIn;
    }
    if (element.length === 0) {
        return false; // No need to go any further if the element is empty
    }
    data = $.trim(data); // Keep it trim
    var optionElement = element.children("[value=" + data + "]"); // See if there is a matching value first

    // Try exact match on contents (case insensitive)
    if (optionElement.length === 0) {
        optionElement = element.children(":find(" + data + ")");
    }

    // Try partial match on contents
    if (optionElement.length === 0) { // if that's not found, try an exact match on the contents (using Honda custom jQuery filter :find)
        dataSplit = data.split(" ");
        optionElement = element.children(":find(" + dataSplit[0] + ")");
    }

    if (optionElement.length !== 0) { // only select it if it exists.
        optionElement.attr("selected", "selected");
    } else { // if the element doesn't exist, select the first item.
        element.find(":first-child").attr("selected", "selected"); // Reset the selector
        return false;
    }
}

/* SSDIF ideas for future: 
* proper name spacing for all functions.
* remove leading capital from ssdifCampaignValues properties (inline with convention that only Constructors have initial capital)
* separate files (validation functions, qas, lov, etc...)
* Implement more intelligent validation (e.g. with meta data about which fields are required and which are optional and what validation should be used, instead of an individual validation function for each field/set.)  
* build to a .min version for production
* have unit tests for all functions
* combine single and multipage form html
* remove duplicate functions (e.g. pastDate and futureDate) & consolidate similar functions, e.g. SSDIF_Validate_*_Date 
* go through and comment code
*/

