﻿/*
* The programming and software materials herein are copyright Cyberhomes LLC (CH).
* The programming and software materials are owned, held, or licensed by CH. Personal, educational,
* non-commercial, commercial or any other use of these materials, without the written permission of the
* CH, is strictly prohibited.
*/

/*********************************************************
This file contains JavaScript for Quick Search Widget. 
**********************************************************/

// General functions

function IsLetter(sText) {
    var ValidChars = "-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\'. &,()";
    var isLetter = true;
    var Char;
    for (var i = 0; i < sText.length && isLetter; i++) {
        Char = sText.charAt(i);
        if (ValidChars.indexOf(Char) == -1) {
            isLetter = false;
        }
    }
    return isLetter;

}
function IsChar(sText) {
    var ValidChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var isChar = true;
    var Char;
    for (var i = 0; i < sText.length && isChar; i++) {
        Char = sText.charAt(i);
        if (ValidChars.indexOf(Char) == -1) {
            IsChar = false;
        }
    }
    return isChar;

}

function IsCharPlusSpecial(sText) {
    var ValidChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^*()_+-=";
    var IsChar = true;
    var Char;
    for (var i = 0; i < sText.length && IsChar; i++) {
        Char = sText.charAt(i);
        if (ValidChars.indexOf(Char) == -1) {
            IsChar = false;
        }
    }
    return IsChar;
}

function clearTitle(frm, name) {
    var el = frm.elements[name];
    if (el.value == el.title) {
        el.value = '';
    }
}

function validateAddressProperty(frm) {
    if (!frm || !frm.elements) {
        return false;
    }

    var validMsg = '';

    var streetnum = null;
    var streetname = null;
    var city = null;
    var state = null;
    var zip = null;
    var streetNumDisplayed = false;
    var streetNameDisplayed = false;

    // Get the form values, and remove the labels
    if (frm.elements['Criteria/StreetNumber']) {
        // Remove the value if it equals the title
        clearTitle(frm, 'Criteria/StreetNumber');
        // The legacy quicksearch js replaced any single quotes in the form, doing so here too
        streetnum = frm.elements['Criteria/StreetNumber'].value.trim().replace("'", "");
        streetNumDisplayed = !(frm.elements['Criteria/StreetNumber'].style.display == 'none');
        frm.elements['Criteria/StreetNumber'].value = streetnum;
    }
    if (frm.elements['Criteria/StreetName']) {
        // Remove the value if it equals the title
        clearTitle(frm, 'Criteria/StreetName');
        streetname = frm.elements['Criteria/StreetName'].value.trim().replace("'", "");
        streetNameDisplayed = !(frm.elements['Criteria/StreetName'].style.display == 'none');
        frm.elements['Criteria/StreetName'].value = streetname;
    }
    if (frm.elements['Criteria/City']) {
        // Remove the value if it equals the title
        clearTitle(frm, 'Criteria/City');
        city = frm.elements['Criteria/City'].value.trim();
    }
    if (frm.elements['Criteria/StateOrProvinceCode']) {
        state = frm.elements['Criteria/StateOrProvinceCode'].value;
    }
    if (frm.elements['Criteria/ZipCode']) {
        // Remove the value if it equals the title
        clearTitle(frm, 'Criteria/ZipCode');
        zip = frm.elements['Criteria/ZipCode'].value.trim();
    }

    // If they are all empty add a validation message and just return
    if ((!streetnum || streetnum === '') && (!streetname || streetname === '') && (!city || city === '') && (!state || state === '') && (!zip || zip === '')) {
        alert('Please enter at least one address element.');
        jQuery(frm).find('input').blur();
        return false;
    }

    // Make sure we don't have a streetnum element defined without a streetname, just return if this is the case
    if (streetNumDisplayed && !streetNameDisplayed) {
        alert('Search is not set up properly (Street Number without Street Name).  Please contact administrator.\n\n');
        jQuery(frm).find('input').blur();
        return false;
    }
  
    // Validate the street address elements
    validMsg += validateStreetAddress(streetnum, streetname);

    // Validate the city
    validMsg += validateCity(city);

    // Validate the zip
    validMsg += validateZipCode(zip);

    // Show a validation message if necessary, and return the validation results
    if (validMsg.length > 0) {
        alert(validMsg);
        jQuery(frm).find('input').blur();
        return false;
    }
    return true;
}

function validateStreetAddress(streetnum, streetname) {
    var validMsg = '';

    // For validation purposes
    if (!streetnum) {
        streetnum = '';
    }
    if (!streetname) {
        streetname = '';
    }
    
    // We put the two together, to treat them as one unstructured address
    // This is because Edina uses this to put both in just streetname, so 
    // validating together makes sure we get all the cases.
    var unstructured = streetnum + streetname;
    
    // We just make sure we have letters and numbers (and a few other chars) in the values)
    if (!IsChar(unstructured.replace('.', '').replace(' ', ''))) {
        validMsg = 'Please enter only numbers and letters in the street address.\n';
    }

    return validMsg;
}

function validateCity(city) {
    var validMsg = '';

    if (city && city.length == 1) {
        validMsg += 'City must be at least 2 characters.\n';
    }
    if (city && city.length > 250) {
        validMsg += 'City must not be more than 250 characters.\n';
    }

    if (city && !IsLetter(city.replace(' ', ''))) {
        validMsg += 'City contains invalid characters.\n';
    }
        
    return validMsg;
}

function validateZipCode(zip) {
    var validMsg = '';

    if (zip && zip.length > 0 && zip.length != 5) {
        validMsg += 'Zip code must be 5 digits.\n';
    }
    if (zip && !IsNumeric(zip)) {
        validMsg += 'Zip code must be numeric.\n';
    }

    return validMsg;
}

// Validate Hotline Code
function validateHotline(frm) {
    if (!frm || !frm.elements) {
        return false;
    }

    var validMsg = '';

    // Get the hotline code from the form
    var hotlineCd = null;
    if (frm.elements['Criteria/HotlineCode']) {
        clearTitle(frm, 'Criteria/HotlineCode');
        hotlineCd = frm.elements['Criteria/HotlineCode'].value.trim();
    }

    if (hotlineCd) {
        if (hotlineCd.length === 0) {
            validMsg += 'Please enter a Hotline code.\n';
        }
        if (hotlineCd.length > 10) {
            validMsg += 'Hotline code should be less than 10 characters.\n';
        }
        if (!IsCharPlusSpecial(hotlineCd.replace(' ', ''))) {
            validMsg += 'Hotline code should be letters and numbers.\n';
        }
    }

    if (validMsg.length > 0) {
        alert(validMsg);
        jQuery(frm).find('input').blur();
        return false;
    }
    return true;
}

// Validate Price Range form
function validatePriceRange(frm) {
    if (!frm || !frm.elements) {
        return false;
    }
        
    var validMsg = '';
    var priceMin = null;
    var priceMax = null;

    if (frm.elements['Criteria/MinPrice']) {
        clearTitle(frm, 'Criteria/MinPrice');
        priceMin = frm.elements['Criteria/MinPrice'].value.trim();
    }
    if (frm.elements['Criteria/MaxPrice']) {
        clearTitle(frm, 'Criteria/MaxPrice');
        priceMax = frm.elements['Criteria/MaxPrice'].value.trim();
    }

    if (priceMin && priceMax) {
        var min = priceMin.replace(',','').replace('.','').replace('$','');
        var max = priceMax.replace(',','').replace('.','').replace('$','');
        if (min === '' && max === '') {
            validMsg += 'Please enter a price range.\n';
        }
        if (!IsNumeric(min) || !IsNumeric(max)) {
            validMsg += 'Price Range should be numeric. For example: 500000\n';
        } else if (max - 0 < min - 0) {
            validMsg += 'Minimum price should be less than the maximum price.\n';
        }
    }

    if (validMsg.length > 0) {
        alert(validMsg);
        jQuery(frm).find('input').blur();
        return false;
    }
    return true;
}


// Validate MLS#
function validateMLSNumber(frm) {

    if (!frm || !frm.elements) {
        return false;
    }

    var validMsg = '';
    var mlsNum = null;

    if (frm.elements['Criteria/ListingNumber']) {
        clearTitle(frm, 'Criteria/ListingNumber');
        mlsNum = frm.elements['Criteria/ListingNumber'].value.trim();
    }

    if (mlsNum) {
        if (mlsNum.length === 0) {
            validMsg += 'Please enter MLS number.\n';
        }
        if (!IsChar(mlsNum.replace('-', '').replace(' ', '').replace(',', ''))) {
            validMsg += 'MLS number should be only letters or numbers.\n';
        }
    }

    if (validMsg.length > 0) {
        alert(validMsg);
        jQuery(frm).find('input').blur();
        return false;
    }
    return true;
}

// Validate Agent Last Name
function validateAgentSearch(frm) {
    if (!frm || !frm.elements) {
        return false;
    }

    var validMsg = '';

    if (frm.elements['FirstName']) {
        clearTitle(frm, 'FirstName');
        if (frm.elements['FirstName'].value.trim().length > 50) {
            validMsg += 'First Name cannot be more than 50 characters\n.';
        }
    }
    if (frm.elements['LastName']) {
        clearTitle(frm, 'LastName');
        if (frm.elements['LastName'].value.trim().length > 50) {
            validMsg += 'Last Name cannot be more than 50 characters\n.';
        }
    }
    if (frm.elements['City']) {
        clearTitle(frm, 'City');
        if (frm.elements['City'].value.trim().length > 50) {
            validMsg += 'City cannot be more than 50 characters\n.';
        }
    }
    if (frm.elements['Zip']) {
        clearTitle(frm, 'Zip');
        validMsg += validateZipCode(frm.elements['Zip'].value.trim());
    }


    if (validMsg.length > 0) {
        alert(validMsg);
        jQuery(frm).find('input').blur();
        return false;
    }
    return true;
}

function validateOfficeSearch(frm) {
    if (!frm || !frm.elements) {
        return false;
    }

    var validMsg = '';

    if (frm.elements['OfficeName']) {
        clearTitle(frm, 'OfficeName');
        if (frm.elements['OfficeName'].value.trim().length > 50) {
            validMsg += 'Office name cannot be more than 50 characters\n.';
        }
    }
    if (frm.elements['City']) {
        clearTitle(frm, 'City');
        if (frm.elements['City'].value.trim().length > 50) {
            validMsg += 'City cannot be more than 50 characters\n.';
        }
    }
    if (frm.elements['Zip']) {
        clearTitle(frm, 'Zip');
        validMsg += validateZipCode(frm.elements['Zip'].value.trim());
    }


    if (validMsg.length > 0) {
        alert(validMsg);
        jQuery(frm).find('input').blur();
        return false;
    }
    return true;
}

function setSelectedOption(selectID, selectVal) {
    var sel = document.getElementById(selectID);
    if (sel) {
        jQuery(sel).val(selectVal);
    }
}

/*
Functions for powering the quick search utility
*/

(function(jQuery) {
    jQuery.fn.quickSearch = function(options) {

        var defaults = {
            links: "h5>a",
            clear: "clear",
            at: "selected"
        };
        var options = jQuery.extend(defaults, options);

        return this.each(function() {

            var obj = jQuery(this);

            jQuery(options.links, obj).click(function() {
                selectTab(this);
                return false;
            });

            jQuery("." + options.clear, obj).click(function() {
                jQuery(this).siblings("form").clearForm();
                jQuery(this).siblings("form").find("input").blur();
                return false;
            });

            function selectTab(newSelection) {
                jQuery("." + options.at, obj).removeClass(options.at);
                jQuery(jQuery(newSelection).attr("href"), obj).addClass(options.at);
                jQuery(newSelection).addClass(options.at);
            }
        });
    };
})(jQuery);


jQuery.fn.clearForm = function() {
    return this.each(function() {
        var type = this.type, tag = this.tagName.toLowerCase(), id = this.id.toLowerCase();
        if (tag == 'form') {
            return jQuery(':input', this).clearForm();
        }
        if (type == 'text' || type == 'password' || tag == 'textarea') {
            this.value = '';
        } else if (type == 'checkbox' || type == 'radio') {
            this.checked = false;
        } else if (tag == 'select') {
            if (id.indexOf('state') > -1 && defaultStateCode) {
                setSelectedOption(id, defaultStateCode);
            } else {
                this.selectedIndex = -1;
            }
        }
    });
};
