﻿// form.js

// We retrieve all vehicle information from this object
var db = new VehicleDB('FILES');
var nextFieldUsed = new Array(false, false, false);

function nextField(fieldNumber, name, len) {
    var current = document.getElementById(name + fieldNumber);
    var next = document.getElementById(name + (fieldNumber+1));
    
    if (fieldNumber == 3) {
        if (current.value.length >= len) {
            nextFieldUsed[fieldNumber-1] = true;
            return void(0);
        }
    }
    
    if (fieldNumber == 1) {
        if (current.value.length >= len) {
            nextFieldUsed[fieldNumber-1] = true;
            next.focus();
        }
    }
    
    if (fieldNumber == 2) {
        if (current.value.length >= len) {
            nextFieldUsed[fieldNumber-1] = true;
            next.focus();
        }
    }
}

// returns true if the key pressed was a number, dash, delete, or backspace
function onlyNumbersAndDashes(e)
{
    var keyCode;
    var c;
    
    if (window.event) { // Internet Explorer
        keyCode = e.keyCode;
    }
    else if (e.which) { // Everyone Else
        keyCode = e.which;
    }
    c = String.fromCharCode(keyCode);
    
    if (isNaN(c) && 
        keyCode != 109 && keyCode != 189 && // dash key
        (keyCode < 96 || keyCode > 105) && // number pad
        (keyCode < 37 || keyCode > 40) && // arrow keys
        keyCode != 9 && keyCode != 46 && keyCode != 8) // tab, backspace, delete
    { 
        return false;
    }
    return true;
}

function onlyEdit(e) {
    var keyCode;
    
    if (window.event) { // Internet Explorer
        keyCode = e.keyCode;
    }
    else if (e.which) { // Everyone Else
        keyCode = e.which;
    }
    
    if (keyCode != 9 && keyCode != 46 && keyCode != 8 && // tab, backspace, delete
        (keyCode < 37 || keyCode > 40))  // arrow keys
    { 
        return false;
    }
    return true;
}

function fieldCheckSize(fieldName, size) {
    var l = document.getElementById(fieldName).value.length;
    if (l < size) {
        return true;
    }
    return false;
}

function checkKeys(e, fieldName, size) {
	// expects the last character in the fieldName to be the number
	// of the group of digits.
	// ex) (248) 555-1212 ->  248=1  555=2  1212=3
	var name = fieldName.substring(0, fieldName.length-1);
	var fieldLen = fieldName.length - 1;
	var fieldNumber = parseInt(fieldName.substring(fieldLen, fieldLen+1));
	
    switch(fieldNumber)
    {
        case 1:
            if (onlyNumbersAndDashes(e)) {
                if (fieldCheckSize(fieldName, size)) {
                    setTimeout('nextField(1,"'+name+'",'+size+')', 1);
                    return true;
                } else {
                    return onlyEdit(e);
                }
            }
            break;
        case 2:
            if (onlyNumbersAndDashes(e)) {
                if (fieldCheckSize(fieldName, size)) {
                    setTimeout('nextField(2,"'+name+'",'+size+')', 1);
                    return true;
                } else {
                    return onlyEdit(e);
                }
            }
            break;
        case 3:
            if (onlyNumbersAndDashes(e)) {
                if (fieldCheckSize(fieldName, size)) {
                    setTimeout('nextField(3,"'+name+'",'+size+')', 1);
                    return true;
                } else {
                    return onlyEdit(e);
                }
            }
            break;
    }
    return false;
}

function GetCityStateFromZip(zip) {
    var setLocation = function(location) {
        if (location.State != null) {
            var city = document.getElementById('city');
            var state = document.getElementById('state');
            city.value = location.City;
            state.value = location.State;
        }
        else {
            alert('Please enter a valid U.S. zip code');
            var box = document.getElementById('zipCode');
            box.focus();
            box.select();
        }
    }
    CallWebMethod('GetCityStateFromZip', 'zipCode=' + zip, setLocation);
}

function OnZipBlur(zipBox) {
    var zip = zipBox.value;
    GetCityStateFromZip(zip);
}

function InitForm() {
    // we no longer have the year available as a drop-down
    // so we must init manually instead of on the year's onchange event.
    mergeQueryWithForm('NewCarPage1');
    var yearSelect = document.getElementById('year');
    var makeSelect = document.getElementById('make');
    if (get('make') == null || get('make') == '') {
        makeSelect.options.length = 0;
        db.GetMakeList(UpdateSelectBox, yearSelect.value);
    }
    else {
        if (get('model') != null || get('model') != '') {
            if (get('trim') != null || get('trim') != '') {
                // user passed in make and model but no trim so drop the trim field
                var delme = document.getElementById('trim');
                delme.parentNode.removeChild(delme);
                delme = document.getElementById('trimLabel');
                delme.parentNode.removeChild(delme);
                var hidden = document.createElement('input');
                hidden.setAttribute('type', 'hidden');
                hidden.setAttribute('name', 'trim');
                hidden.setAttribute('id', 'trim');
                hidden.setAttribute('name', 'trim');
                hidden.setAttribute('value', ' ');
                yearSelect.parentNode.insertBefore(hidden, yearSelect);
            }
        }
    }
    makeSelect.disabled = false;
}

function InitForm2() {
    mergeQueryWithForm('NewCarPage2');
}

function OnCarChange(current) {
    // get the make node
    var yearSelect = document.getElementById('year');
    var makeSelect = document.getElementById('make');
    var modelSelect = document.getElementById('model');
    var trimSelect = document.getElementById('trim');
    
    // the next box which will take the new option values
    var next;
    
    // clear the select boxes that come after the current selection
    // and get the values for the box that comes immediately after
    // the selection.
    switch(current) {
        case makeSelect:
        {
            modelSelect.options.length = 0;
            db.GetModelList(UpdateSelectBox, yearSelect.value, makeSelect.value);
            modelSelect.disabled = false;
        }
        case modelSelect:
        {
            trimSelect.options.length = 0;
            db.GetTrimList(UpdateSelectBox, yearSelect.value, makeSelect.value, modelSelect.value);
            trimSelect.disabled = false;
            break;
        }
    }
}

function UpdateSelectBox(box, optionValues) {
    // make sure we have something then...
    if (optionValues != null) {
        // always have the first option be blank
        var option = new Option('', '', false, false);
        box.options.add(option);
        
        // populate the select box
        for (var i = 0; i < optionValues.length; i++) {
            option = new Option(optionValues[i], optionValues[i], false, false);
            box.options.add(option);
        }
    }
}

var nameValuePairs;
function createNameValuePairs() {
    if (nameValuePairs == null) {
        var loc = decodeURIComponent(window.location);
        loc = loc.replace(/\+/g, ' ');
        if (loc.indexOf('?') > 0) {
            var nameValueStrings = loc.substring(
                    loc.indexOf('?') + 1,
                    loc.length).split('&');
            nameValuePairs = new Array();
            for (var i = 0; i < nameValueStrings.length; i++) {
                var t = nameValueStrings[i].split('=');
                nameValuePairs[t[0]] = t[1];
            }
        }
    }
    return nameValuePairs;
}

function get(varName) {
    var nv = createNameValuePairs();
    return (nv == null ? '' : nv[varName]);
}

// fix browser blanking page when query values are blank
function fillBlankFields(formId) {
	var form = document.getElementById(formId);
	for (var i = 0; i < form.elements.length; i++) {
		if (form.elements[i].type == 'text' &&
			form.elements[i].value == '') {
			form.elements[i].value = ' ';
		}
	}
}

function fillFormFromQuery(formId) {
    var nvPairs = createNameValuePairs();
    var form = document.getElementById(formId);
    for (var i = 0; i < form.elements.length; i++) {
        for (key in nvPairs) {
            if (form.elements[i].name == key) {
                form.elements[i].value = nvPairs[key];
            }
        }
    }
}

function mergeQueryWithForm(formId) {
	var nvPairs = createNameValuePairs();
    var form = document.getElementById(formId);
	for (key in nvPairs) {
	    if (form[key] != null) {
	        var targetValue = (nvPairs[key] == ' ' ? '' : nvPairs[key])
	        // match select box
	        if (form[key].nodeName.toLowerCase() == 'select') {
	            var isFound = false;
	            // find the option and use it
	            for (var i = 0; i < form[key].options.length; i++) {
	                if (form[key].options[i].value.toLowerCase() == targetValue.toLowerCase()) {
	                    form[key].options[i].selected = true;
	                    isFound = true;
	                    break;
	                }
	            }
	            // if we can't find an option, make it
	            if (!isFound && targetValue != '') {
	                form[key].disabled = false;
	                form[key].length = 0;
	                form[key].options.add(new Option(targetValue, targetValue, true, true));
	            }
	        }
	        else {
	            // for most text
	            form[key].value = targetValue;
	        }
	    }
	    else {
	        // create the element
		    var el = document.createElement('input');
		    el.setAttribute('type', 'hidden');
		    // remove spaces from fields with just a space in them when assigning
		    el.setAttribute('value', (nvPairs[key] == ' ' ? '' : nvPairs[key]));
		    el.setAttribute('name', key);
		    el.setAttribute('id', key);
		    form.appendChild(el);
		}
	}
}

function addHiddenElement(form, elementName, value) {
    var node = document.createElement('input');
    node.setAttribute('type', 'hidden');
    node.setAttribute('name', elementName);
    node.setAttribute('value', value);
    form.appendChild(node);
}

function submitToPage(formId, url) {
	var form = document.getElementById(formId);
	fillBlankFields(formId);
	form.method = 'get';
	form.action = url;
	form.submit();
}

function CheckFormPage2() {
    var form = document.getElementById('NewCarPage2');
    // put together the fields for submission
    form.homePhone.value = form.homePhone1.value + form.homePhone2.value + form.homePhone3.value;
    form.workPhone.value = form.homePhone.value;

    // check for errors or fields that are empty
    var error = '';
    if (form.firstName.value == '')
        error = 'No first name given.';
    if (form.lastName.value == '')
        error = 'No last name given.';
    if (form.zipCode.value == '')
        error = 'Invalid zip code.';
    if (form.address.value == '')
        error = 'No address given.';
    if (form.homePhone.value == '')
        error = 'No home phone given.';
    if (form.interiorColor.value == '')
        form.interiorColor.value = 'n/a';
    if (form.exteriorColor.value == '')
        form.exteriorColor.value = 'n/a';
    if (error != '') {
        alert(error);
    }
    else {
        //__doPostBack('imgNext2', '');
        form.method = 'post';
        form.action = 'http://www.dtagent.net/NewCarForm/Service.asmx/SubmitDtxNewCar';
        form.submit();
    }
}

function CheckFormPage1() {
    // check for errors or fields that are empty
    var error = '';
    var form = document.getElementById('NewCarPage1');
    if (form.city.value == '')
        error = 'Invalid city.';
    if (form.state == '')
        error = 'Invalid state.';
    if (form.zipCode.value == '')
        error = 'Invalid zip code.';
    if (form.email.value == '')
        error = 'No email given.';
    if (form.year.value == '' || form.make.value == '' || form.model.value == '')
        error = 'No vehicle selected.';
    if (error != '') {
        alert(error);
    }
    else {
        //__doPostBack('imgNext', '');
        submitToPage('NewCarPage1', "NewCar2.html");
    }
}


