/*
 *   JS used to submit and validate search form
 */

    var initForm = false;
    function initializeForm() {
        toggleAdvancedOptions();
    
        //var makes = getAllSelections('makeList');
        //if ( makes != null && makes[0] != 'ALL' ) {
        //    var preSelectedModels = getCookieValueAsArray('manheim.powersearch.model', '|');
        //    reloadAllModels(makes, preSelectedModels, '');
        //}
        
        var sellerTypes = getAllSelections('sellerTypeList');
        if ( sellerTypes != null && sellerTypes[0] != 'ALL' ) {
            var preSelectedSellers = getCookieValueAsArray('manheim.powersearch.seller', '|');
            reloadSellers(sellerTypes, preSelectedSellers);
        }
        
        initForm = true;
    }

    function concatArrays( array1, array2 ) {
        if ( array1 != null ){
            if (array2 != null){
                for ( var i = 0; i < array2.length; i++ ) {
                    array1[array1.length] = array2[i];
                }
            } 
            return array1;
        } else if ( array2 != null ) {
            return array2;
        }
        
         return new Array();
    }

    var executeTrimAjax = true;
    function reloadAllTrims( makes, models, defaults, inventory ) {
        if ( executeTrimAjax ) {
            if ( makes.length == 0 || makes[0] == 'ALL' || models.length == 0 || models[0] == 'ALL' ) {
                var trimList = $('trimList');
                trimList.update('');
                trimList.appendChild(createTrimCheck(allLabel, 'ALL', true));
            } else {
                var ajaxUrlParams = 'inventory=' + inventory;
                for (var i = 0; i < makes.length; i++) {
                    ajaxUrlParams += '&make=' + makes[i];
                }
                for (var i = 0; i < models.length; i++) {
                    ajaxUrlParams += '&model=' + models[i];
                }

                var preSelectedTrims = concatArrays( defaults, getAllSelections('trimList') );
                new Ajax.Request('/auctions/manheim/get_data.php?mode=trims',
                {
                    method: 'post',
                    evalJSON: true,
                    parameters: ajaxUrlParams,
                    onSuccess: function(transport) {
                        showTrims( transport.responseJSON.trims, preSelectedTrims );
                    },
                    onFailure: function(){}, 
                    onException: function(request, ex){}
                });
            }
        }
    }
    
    function showTrims( trims, preSelectedTrims ) {
        var trimList = $('trimList');
        trimList.update('');
    
        for ( i = 0; i < trims.length; i++ ) {
            trimList.appendChild(createTrimCheck(trims[i].label, trims[i].value, false));
        }
        
        setAllChecked('trimList', true, preSelectedTrims);
    }
    
    function createTrimCheck( label, value, disabled ) {
        var itemElement = document.createElement('li');
        var labelElement = document.createElement('label');
        var checkbox = document.createElement('input');
        checkbox.id = value;
        checkbox.type = 'checkbox';
        checkbox.name = 'series';
        checkbox.className = 'checkbox';
        checkbox.value = value;
        checkbox.disabled = disabled;
        
        checkbox.onclick = function() {
            toggleAllCheckbox(this, 'trimList');
        };
            
        labelElement.appendChild(checkbox);
        labelElement.appendChild(document.createTextNode(unescape(label)));
        itemElement.appendChild(labelElement);
        
        return itemElement;
    }

    var executeModelAjax = true;        
    function reloadAllModels( makes, defaults, inventory ) {
        if ( executeModelAjax ) {
            if ( makes.length == 0 || makes[0] == 'ALL' ) {
                var modelList = $('modelList');
                modelList.update('');
                modelList.appendChild(createModelCheck(allLabel, 'ALL', true));
                
                reloadAllTrims( makes, {}, {}, inventory );
            } else {
                var ajaxUrlParams = 'inventory=' + inventory;
                for (var i = 0; i < makes.length; i++) {
                    ajaxUrlParams += '&make=' + makes[i];
                }
                
                var preSelectedModels = concatArrays( defaults, getAllSelections('modelList') );
                new Ajax.Request('/auctions/manheim/get_data.php?mode=models',
                {
                    method: 'post',
                    evalJSON: true,
                    parameters: ajaxUrlParams,
                    onSuccess: function(transport) {
                        showModels( transport.responseJSON.models, preSelectedModels );
                    },
                    onFailure: function(){}, 
                    onException: function(request, ex){}
                });
            }
        }
    }

    var modelData = null;
    
    function showModels( models, preSelectedModels ) {
        var modelList = $('modelList');
        modelList.update('');
    
        for ( i = 0; i < models.length; i++ ) {
            modelList.appendChild(createModelCheck(models[i].label, models[i].value, false));
        }
        
        setAllChecked('modelList', true, preSelectedModels, false);
        
        var trimDefaults = null;
        if ( initForm ) {
            trimDefaults = getCookieValueAsArray('manheim.powersearch.trim', '|');
            initForm = false;
        }
        
        reloadAllTrims(getAllSelections('makeList'), getAllSelections('modelList'), trimDefaults, '');
    }
    
    function createModelCheck( label, value, disabled ) {
        var itemElement = document.createElement('li');
        var labelElement = document.createElement('label');
        var checkbox = document.createElement('input');
        checkbox.id = value;
        checkbox.type = 'checkbox';
        checkbox.name = 'model';
        checkbox.className = 'checkbox';
        checkbox.value = value;
        checkbox.disabled = disabled;
        
        checkbox.onclick = function() {
            if ( this.value == 'ALL' ) {
                executeTrimAjax=false;
            }
            toggleAllCheckbox(this, 'modelList');
            if ( this.value == 'ALL' ) {
                executeTrimAjax=true;
            }
            reloadAllTrims(getAllSelections('makeList'), getAllSelections('modelList'), null, '');
            //toggleModels(this);
        };
            
        labelElement.appendChild(checkbox);
        labelElement.appendChild(document.createTextNode(unescape(label)));
        itemElement.appendChild(labelElement);
            
        return itemElement;
    }
    
    function toggleModels( checkbox ) {
        if ( modelData != null ) {
            for ( i = 0; i < modelData.length; i++ ) {
                if ( modelData[i].value == checkbox.value ) {
                    if ( modelData[i].parentId > 0 ) {
                        var parentCheck = $(modelData[i].parentId);
                        if ( parentCheck != null ) {
                            parentCheck.checked = false;
                        }
                    }
                    if ( modelData[i].childIds != null && modelData[i].childIds.length > 0 ) {
                        for ( var j = 0 ; j < modelData[i].childIds.length; j++ ) {
                            var childCheck = $(modelData[i].childIds[j]);
                            if ( childCheck != null ) {
                                childCheck.checked = checkbox.checked;
                            }
                        }
                    }
                    break;
                }
            }
        }
    }

    function writeMakeCookie() {
        document.cookie = 'manheim.powersearch.make=' + getAllSelections('makeList').join('|') + ';';
    }

    function writeModelCookie() {
        document.cookie = 'manheim.powersearch.model=' + getAllSelections('modelList').join('|') + ';';
    }
    
    function writeTrimCookie() {
        document.cookie = 'manheim.powersearch.trim=' + getAllSelections('trimList').join('|') + ';';
    }
    
    function writeSellerTypeCookie() {
        document.cookie = 'manheim.powersearch.seller=' + getAllSelections('sellerList').join('|') + ';';
    }
    
   function writeMenuCookie(menuId, menuStatus) {
	    document.cookie = 'manheim.powersearch.' + menuId + '=' + escape(menuStatus) + '; path=/;';
	}
	
    function getCookieValue( cookieName ) {
        var cookieValue = '';
        if (document.cookie.length > 0) {
            var startIndex = document.cookie.indexOf(cookieName + '=');
            if (startIndex != -1) {
                startIndex = startIndex + cookieName.length + 1;
                var endIndex = document.cookie.indexOf(';', startIndex);
                if (endIndex == -1) {
                    endIndex = document.cookie.length;
                }
                cookieValue = document.cookie.substring(startIndex, endIndex);
            }
        }
        
        return cookieValue;
    }
    
    function getCookieValueAsArray( cookieName, delim ) {
        var valueArray = new Array();
        var cookieValue = getCookieValue( cookieName );
        if ( cookieValue != null && cookieValue.length > 0 ) {
            valueArray = cookieValue.split(delim);
        }
        
        return valueArray;
    }

    function submitSearch( newSearch, wtTracker ) {
        var formElement = $('searchForm');
        formElement.submittedQstr.value = '';
        if ( validateForm() ) {
            if ( newSearch ) {
                //clearRefinementCookies(document.cookie);
                writeMakeCookie();
                writeModelCookie();
                writeTrimCookie();
                writeSellerTypeCookie();
            }
            
            formElement.newSort.value = false;
            
            if (formElement.zipCode != null && formElement.zipCode.value == defaultZipText) {
                formElement.zipCode.value = '';
            }
            
            if (formElement.saleDate != null && formElement.saleDate.value == defaultSaleDateText) {
                formElement.saleDate.value = '';
            }
            
            if (formElement.searchTerms != null && formElement.searchTerms.value == defaultKeywordSearchText) {
                formElement.searchTerms.value = '';
            }
     
	 		addFormElement( formElement, 'wtTracker', wtTracker);

            formElement.searchOperation.value = 'Search';
            formElement.action = 'searchSubmit.do';
            formElement.submit();
        }
    }

    function validateForm() {
        var valid = validateZipCode();
        valid = valid && validateSaleDate();
        return valid;
    }
    
    function validateZipCode() {
        var distance = $('distanceList');
        var zipField = $('zipcode');
        if ( distance != null && zipField != null ) {
            zipField.value = zipField.value.strip();
            if ( distance.options[0].selected == false ) {
                if ( zipField.value == defaultZipText || isNaN(zipField.value) ) {
                    zipField.select();
                    alert(zipErrMsg);
                    return false;
                }
            }
        }
        return true;
    }
    
    function validateSaleDate() {
        var saleDateField = $('saleDate');
        if ( saleDateField != null ) {
            saleDateField.value = saleDateField.value.strip();
            if ( saleDateField.value == '' || saleDateField.value == defaultSaleDateText ) {
                saleDateField.value = '';
            } else if ( saleDateField.value.length != 10 || isNaN(saleDateField.value.substring(0, 2)) || isNaN(saleDateField.value.substring(3, 5)) || isNaN(saleDateField.value.substring(6)) ) {
                // Format = MM/DD/YYYY
                saleDateField.select();
                alert(saleDateErrMsg);
                return false;
            } else {
                var oldestDate = new Date();
                oldestDate.setDate(oldestDate.getDate() - 1);
                
                var day = saleDateField.value.substring(3, 5);
                var month = saleDateField.value.substring(0, 2);
                var year = saleDateField.value.substring(6);
                
                var selectedDate = new Date();
                selectedDate.setFullYear(year, month - 1, day);
                
                if ( selectedDate < oldestDate ) {
                    saleDateField.select();
                    alert(saleDateErrMsg);
                    return false;
                }
            }
        }
        return true;
    }
    
    function validateSaveSearchForm() {
        var valid = validateSearchName();
        valid = valid && validatePhoneNumber();
        valid = valid && validateNotification();
        return valid;
    }
    
    function validateEmailResultsForm() {
        if ( validateSearchName() ) {
	        var fromEmailAddress = $('fromEmailAddress');
	        if ( validateEmailAddress(fromEmailAddress) ) {
		        var toEmailAddress = $('toEmailAddress');
		        if ( validateEmailAddress(toEmailAddress) ) {
		        	return true;
		        }
		    }
        }
        
        return false;
    }
    
    function validateSearchName() {
        var nameField = $('searchName');
        if ( nameField != null ) {
            nameField.value = nameField.value.strip();
            if (nameField.value == '') {
                nameField.focus();
                alert(nameRequiredMsg);
                return false;
            }
        }
        return true;
    }
	
	function validateEmailAddress(emailAddress) {
        var emailFilter = new RegExp('^[\\w-_\.]*[\\w-_\.]\@[\\w]\.+[\\w]+[\\w]$');
        if ( emailAddress != null ) {
	         if ( ! emailFilter.test(emailAddress.value.strip()) ) {
	             emailAddress.focus();
	             alert(emailRequiredMsg);
	             return false;
	         }
	    }
        return true;
    }
    
    function validateNotification() {
        var format = $('searchForm').emailFormat;
        if ( format != null ) {
           for ( var i = 0; i < format.length; i++ ) {
              if ( format[i].checked ) {
                 if ( format[i].value == 'T' ) {
        			 var emailAddress = $('toEmailAddress');
                     if ( ! validateEmailAddress(emailAddress) ) {
                         return false;
                     }
                 } else if ( format[i].value == 'S' ) {
                     var phoneNumber = $('phone');
                     if ( phoneNumber != null && phoneNumber.value == '' ) {
                         phoneNumber.focus();
                         alert(phoneRequiredMsg);
                         return false;
                     }                 
                     var provider = $('sms');
                     if ( provider != null && provider.value == '' ) {
                         provider.focus();
                         alert(providerRequiredMsg);
                         return false;
                     }
                 }
              }
           }
        }
        return true;
    }

    function validatePhoneNumber() {
        var phoneField = $('phone');
        if ( phoneField != null ) {
            phoneField.value = phoneField.value.strip();
            if ( phoneField.value == '' || phoneField.value == defaultPhoneText ) {
                phoneField.value = '';
            } else {
                phoneField.value = phoneField.value.replace( /-/g, '' );
                if ( phoneField.value.length != 10 || isNaN(phoneField.value) ) {
                    phoneField.select();
                    alert(phoneErrMsg);
                    return false;
                }
            }
        }
        return true;
    }
    
    // enable/disable form elements as user selects different 
    // notification types on the saved search form
    function changeNotify( notifyType ) {
        // email
        if (notifyType == 'T') {
            $('notificationEnabled').value = 'true';
            $('emailAddress').removeClassName('disabledText').disabled = false;
            $('phone').addClassName('disabledText').disabled = true;
            $('sms').addClassName('disabledText').disabled = true;
            $('emailAddress').select();
        // sms
        } else if (notifyType == 'S') {
            $('notificationEnabled').value = 'true';
            $('emailAddress').addClassName('disabledText').disabled = true;
            $('phone').removeClassName('disabledText').disabled = false;
            $('sms').removeClassName('disabledText').disabled = false; 
            $('phone').select();
        // none
        } else {
            $('alertTo').checked = true;
            $('notificationEnabled').value = 'false';
            $('emailAddress').addClassName('disabledText').disabled = true;
            $('phone').addClassName('disabledText').disabled = true;
            $('sms').addClassName('disabledText').disabled = true;
        }
    }
    
    function resetSearchForm( refreshAll ) {
        $('searchForm').reset();
        
		// reset keyword search to default value
		var keywordTextElement = $('keywordTextSearch');
		if (keywordTextElement != null) {
			$('keywordTextSearch').removeClassName('on');
        	$('searchForm').searchTerms.value = defaultKeywordSearchText;
        }
        
        if ( refreshAll ) {
            var sortElement = $('sort');
            if ( sortElement != null ) {
                sortElement.value = '';
            }
        
            setOptions('vehicleType', 0);
            clearCheckedList( 'vehicleTypeList' );
        
            setOptions('year_begin', defaultFromYearIndex);
            setOptions('year_end', 0);
            
            reloadToYears('year_end');
            
            clearCheckedList( 'makeList' )
            clearCheckedList( 'modelList' );
            clearCheckedList( 'trimList' );
            
            // Location section
            clearCheckedList( 'regionList' );
            clearCheckedList( 'stateList' );
            clearCheckedList( 'locationList' );
            clearCheckedList( 'distanceList' ); 
        
            $('zipcode').value = '';
        
            clearCheckedList( 'inventoryList' );
            clearCheckedList( 'saleTypeCheck' );
        
            $('saleDate').value = '';
            
        	// clear advanced search options
            clearAdvancedOptions();
        }
        
        reloadMakes(getAllSelections('vehicleType'), null);
        reloadAllModels([], null, '');
        reloadAllTrims([], [], null, '');
        reloadSellers([], null);
        toggleAdvancedOptions();        
        
        if ( $('zipcode').value == '' ) {
            if ( defaultZipcode != null && defaultZipcode.length > 0 ) {
                $('zipcode').value = defaultZipcode;
            } else {
                $('zipcode').value = defaultZipText;
            }
        }
        
        if ( $('saleDate').value == '' ) {
            $('saleDate').value = defaultSaleDateText;
        }
    }
    
    function clearAdvancedOptions() {
		clearCheckedList( 'onlyWithPhoto' );
		clearCheckedList( 'onlyWithECR' );
		clearCheckedList( 'sellerTypeList' );
		clearCheckedList( 'sellerList' );
        
    	clearUncommonOptions();
    }
    
    function clearUncommonOptions() {
		clearCheckedList( 'odometerList' );
        clearCheckedList( 'conditionList' );
        clearCheckedList( 'mmrList' );
        clearCheckedList( 'driveTrainList' );
        clearCheckedList( 'transList' );
        clearCheckedList( 'engineList' );
        clearCheckedList( 'extColorList' );
        clearCheckedList( 'intColorList' );
        clearCheckedList( 'topList' );
        clearCheckedList( 'intTypeList' );
        clearCheckedList( 'doorsList' );
    }

    function toggleAllCheckbox( checkbox, containerId ) {
        if ( checkbox.value == 'ALL' ) {
            // check or uncheck all checkboxes
            resetCheckedList(containerId, checkbox.checked )
        } else if ( !checkbox.checked ) {
            // uncheck 'ALL' option if checked
            clearCheckedItem(containerId, 'ALL');
        }
        
        return false;
    }
    
    // ##################################################
    // Begin BY LOCATION functions
    // ##################################################
    
    function getChildLocations( parentId, relations ) {
        for ( var i = 0; i < relations.length; i++ ) {
            // Find the object with the correct parentId
            if ( parentId == relations[i].id ) {
                return relations[i].children;
            } else {
                var children = getChildLocations( parentId, relations[i].children )
                if ( children != null ) {
                    return children;
                }
            }
        }
        
        return null;
    }
    
    // relations is an array of objects that 
    // contain a parent ID and an array of child objects
    function toggleChildLocations( parentId, isChecked, relations ) {
        var children = getChildLocations( parentId, relations );
        
        if ( children != null && children.length > 0 ) {
            for (var i = 0; i < children.length; i++) {
                var childElement = $('location' + '-' + children[i].id);
                if ( childElement != null && isChecked != childElement.checked ) {
                    childElement.click();
                }
            }
        }
        
        return false;
    }
    
    function getParentLocationId( childId, relations ) {
        for ( var i = 0; i < relations.length; i++ ) {
            var childList = relations[i].children;
            for (var j = 0; j < childList.length; j++) {
                if ( childId == childList[j].id ) {
                    return relations[i].id;
                } else {
                    var parentId = getParentLocationId( childId, childList );
                    if ( parentId != null ) {
                        return parentId;
                    }
                }
            }
        }
        
        return null;
    }
    
    function toggleParentLocation( childId, isChecked, relations ) {
        var parentId = getParentLocationId(childId, relations);
        
        if ( !isChecked ) {
            while ( parentId != null ){
                var parentElement = $('location' + '-' + parentId);
                if ( parentElement != null ) {
                    parentElement.checked = false;
                }
                parentId = getParentLocationId( parentId, relations );
            }
        } else {
            // if all parent's children are checked, check parent
            var children = getChildLocations(parentId, relations);
            if ( children != null && children.length > 0 ) {
                var allChildrenChecked = true;
                for (var i = 0; i < children.length; i++) {
                    var childElement = $('location' + '-' + children[i].id);
                    if ( childElement != null && !childElement.checked ) {
                        allChildrenChecked = false;
                        break;
                    }
                }

                if ( allChildrenChecked ) {
                    var parentElement = $('location' + '-' + parentId);
                    if ( parentElement != null && !parentElement.checked ) {
                        parentElement.click();
                    }
                }
            }
        }
    }
    
    function toggleLocations( checkbox, relations ) {
        var locationId = checkbox.value;
        var isChecked = checkbox.checked;
        
        toggleChildLocations(locationId, isChecked, relations);
        toggleParentLocation(locationId, isChecked, relations);
    }
    
    // ##################################################
    // End BY LOCATION functions
    // ##################################################
    
    function setOptions(elementId, optionIndex) {
        var container = $(elementId);
        if ( container != null && optionIndex >= 0 ) {
            if ( container.nodeName.toUpperCase() == 'SELECT' && container.options.length > optionIndex ) {
                container.options[optionIndex].selected = true;
            }
        
            var elements = container.getElementsByTagName('select');
            for (var i = 0; i < elements.length; i++) {
                if ( elements[i].options.length > optionIndex ) {
                    elements[i].options[optionIndex].selected = true;
                }
            }
        }
    }
    
    // Finds all SELECT or INPUT tags within the specified element
    // and returns the values of all that are currently selected
    function getAllSelections(elementId) {
        var selectedValues = new Array();
        
        var container = $(elementId);
        if ( container != null ) {
            if ( container.nodeName.toUpperCase() == 'SELECT' ) {
                for (var i = 0; i < container.options.length; i++) {
                    if ( container.options[i].selected ) {
                        selectedValues[selectedValues.length] = container.options[i].value;
                    }
                }
            }
        
            if ( container.nodeName.toUpperCase() == 'INPUT' ) {
                if ( container.checked ) {
                    selectedValues[selectedValues.length] = container.value;
                }
            }
        
            var elements = container.getElementsByTagName('input');
            for (var i = 0; i < elements.length; i++) {
                if ( elements[i].checked ) {
                    selectedValues[selectedValues.length] = elements[i].value;
                }
            }
        }
        
        return selectedValues;
    }
    
    // Finds a SELECT or INPUT tag with the specified values
    // and makes sure it is selected or unselected depending 
    // on the isChecked parameter
    function setAllChecked(elementId, isChecked, itemValues, executeClick) {
        if ( itemValues != null ) {
            for (var i = 0; i < itemValues.length; i++) {
                setChecks(elementId, isChecked, itemValues[i], executeClick)
            }
        }
    }
    
    function clearCheckedItem( elementId, itemValue ) {
    	var isChecked = false;
    	var executeClick = false;
    	
    	return setChecks(elementId, isChecked, itemValue, executeClick)
    } 
    
    function resetCheckedItem( elementId, itemValue, isChecked ) {
    	var executeClick = true;
    	
    	return setChecks(elementId, isChecked, itemValue, executeClick)
    } 
    
    function clearCheckedList( elementId ) {
    	var isChecked = false;
    	var itemValue = null;
    	var executeClick = false;
    	
    	return setChecks(elementId, isChecked, itemValue, executeClick)
    }
    
    function resetCheckedList( elementId, isChecked ) {
    	var itemValue = null;
    	var executeClick = true;
    	
    	return setChecks(elementId, isChecked, itemValue, executeClick)
    }
    
    // Finds a SELECT or INPUT tag with the specified value
    // and makes sure it is selected or unselected depending 
    // on the isChecked parameter
    function setChecks(elementId, isChecked, itemValue, executeClick) {
        var container = $(elementId);
        if ( container != null ) {
            if ( container.nodeName.toUpperCase() == 'SELECT' ) {
                if ( isChecked && utemValue != null ) {
                    for (var i = 0; i < container.options.length; i++) {
                        if ( container.options[i].value == itemValue ) {
                            container.options[i].selected = isChecked;
                        }
                    }
                } else {
                    container.options[0].selected = true;
                }
            } 
        
            if ( container.nodeName.toUpperCase() == 'INPUT' ) {
                if ( (container.checked != isChecked && container.value == itemValue) ||
                     (container.checked != isChecked && itemValue == null) ) {
                    if ( executeClick == true ) {
                        container.click(); 
                    } else {
                        container.checked = isChecked;
                    }
                }
            }
        
            var elements = container.getElementsByTagName('input');
            for (var i = 0; i < elements.length; i++) {
                if ( (elements[i].checked != isChecked && elements[i].value == itemValue) ||
                     (elements[i].checked != isChecked && itemValue == null) ) {
                    if ( executeClick == true ) {
                        elements[i].click();
                    } else {
                        elements[i].checked = isChecked;
                    }
                }
            }
        }
    }
    
    // Was used to enable/disable form elements within a specified element
    function toggleElements(elementId, enabled) {
        var element = $(elementId);
       
        if (element != null) {
            if (enabled) {
                element.removeClassName('disabledText');
            } else {
                element.addClassName('disabledText');
            }
            
            // disable input fields
            setTagUsablility(element, 'input', enabled);
        
            // disable select fields
            setTagUsablility(element, 'select', enabled);
            
            // disable links
            setTagUsablility(element, 'a', enabled);
        }
    }
    
    function setTagUsablility( parentElement, tagType, enabled ) {
        var container = $(parentElement);
        
        var elements = container.getElementsByTagName(tagType);
        for (var i = 0; i < elements.length; i++) {
            elements[i].disabled = !enabled;
        }        
    }
    
