function trim(text) {
    return text.toString().replace(/^\s*(.*)$/, "$1").replace(/(.*?)\s*$/, "$1");
}

function normalizePhoneNumber(phone) {
    var numbers = phone.toString().replace(/\D/g, "").replace(/^1(\d*)/, "$1").split("");
    
    var out = "";
    
    for (var i = 0; i < numbers.length; i++) {
        if (i == 3 || i == 6) {
            out += "-";
        } else if (i == 10) {
            out += " ext ";
        }
        
        out += numbers[i];
    }
    
    return out;
}

function isUsPhoneNumber(phone) {
    return new RegExp("^\\D*1?\\D*[2-9][0-8]\\d\\D*[2-9]\\d{2}\\D*\\d{4}\\D*\\d*\\D*$").test(phone.toString());
}

function isEmailFormat(emailAddress) {
    return /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/.test(emailAddress);
}

function normalizePhoneNumber(phone) {
    if (isUsPhoneNumber(phone)) {
        var matches = new RegExp("^1?(\\d{3})(\\d{3})(\\d{4})(\\d*)$").exec(phone.toString().replace(/\D/g, ""));
        
        return matches[1] + "-" + matches[2] + "-" + matches[3] + (matches[4] && matches[4].length > 0 ? " ext " + matches[4] : "");
    }
    
    return false;
}

function normalizeZipCode(zip) {
    var numbers = zip.toString().replace(/\D/g, "").split("");
    
    var out = "";
    
    for (var i = 0; i < numbers.length; i++) {
        if (i == 5) {
            out += "-";
        }
        
        out += numbers[i];
    }
    
    return out;
}

function isUsZipCode(zip) {
    return new RegExp("^\\d{5,}$").test(zip.toString().replace(/\D/g, ""));
}

var rxName     = new RegExp("^first\\s+name$", "i");
var rxLastName = new RegExp("^last\\s+name$", "i");
var rxPhone    = new RegExp("^phone", "i");
var rxPhone2   = new RegExp("^alt\\s+phone", "i");
var rxEmail    = new RegExp("^e-?mail$", "i");
var rxAddress  = new RegExp("^address$", "i");
var rxCity     = new RegExp("^city$", "i");
var rxZip      = new RegExp("^zip", "i");
var rxComments = new RegExp("^comments$", "i");
var rxVerify   = new RegExp("^code$", "i");

function onFocusHandler() {
    var jqObject = jQuery(this);
    
    jqObject.removeClass("required");
    
    var name  = jqObject.attr("name");
    var value = trim(jqObject.val());
    
    if (
        (name == "name" && rxName.test(value))
            ||
        (name == "name_last" && rxLastName.test(value))
            ||
        (name == "phone" && rxPhone.test(value))
            ||
        (name == "phone2" && rxPhone2.test(value))
            ||
        (name == "email" && rxEmail.test(value))
            ||
        (name == "address" && rxAddress.test(value))
            ||
        (name == "city" && rxCity.test(value))
            ||
        (name == "zip" && rxZip.test(value))
            ||
        (name == "comments" && rxComments.test(value))
            ||
        (name == "verificationText" && rxVerify.test(value))
    ) {
        jqObject.val("");
    }
}

function onBlurHandler() {
    var jqObject = jQuery(this);
    
    jqObject.val(trim(jqObject.val()));
    
    var name  = jqObject.attr("name");
    var value = jqObject.val();
    
    var flagRequired = false;
    
    if (name == "name") {
        if (value.length == 0 || rxName.test(value)) {
            jqObject.val("Your Name");
            jqObject.addClass("required");
        }
    } else if (name == "name_last") {
        if (value.length == 0 || rxLastName.test(value)) {
            jqObject.val("Last Name");
            jqObject.addClass("required");
        }
    } else if (name == "phone") {
        if (value.length == 0 || !isUsPhoneNumber(value)) {
            jqObject.val("Phone");
            jqObject.addClass("required");
        } else {
            jqObject.val(normalizePhoneNumber(value));
        }
    } else if (name == "phone2") {
        if (value.length == 0 || !isUsPhoneNumber(value)) {
            jqObject.val("Alt Phone");
        } else {
            jqObject.val(normalizePhoneNumber(value));
        }
    } else if (name == "email") {
        if (value.length == 0 || !isEmailFormat(value)) {
            jqObject.val("E-mail");
            jqObject.addClass("required");
        }
    } else if (name == "address") {
        if (value.length == 0 || rxAddress.test(value)) {
            jqObject.val("Address");
            jqObject.addClass("required");
        }
    } else if (name == "city") {
        if (value.length == 0 || rxCity.test(value)) {
            jqObject.val("City");
            jqObject.addClass("required");
        }
    } else if (name == "zip") {
        if (value.length == 0 || !isUsZipCode(value)) {
            jqObject.val("Zip");
            jqObject.addClass("required");
        } else {
            jqObject.val(normalizeZipCode(value));
        }
    } else if (name == "verificationText") {
        if (value != jQuery('#sampleRequestForm2 input[name="verificationHidden"]').val()) {
            jqObject.val("Code");
            jqObject.addClass("required");
        }
    }
}

function validateRequestForm() {
    // Get form elements into jQuery objects.
    var verificationHidden = jQuery(this.elements["verificationHidden"]);
    var name               = jQuery(this.elements["name"]);
    var name_last          = jQuery(this.elements["name_last"]);
    var phone              = jQuery(this.elements["phone"]);
    var phone2             = jQuery(this.elements["phone2"]);
    var email              = jQuery(this.elements["email"]);
    var address            = jQuery(this.elements["address"]);
    var city               = jQuery(this.elements["city"]);
    var state              = jQuery(this.elements["state"]);
    var zip                = jQuery(this.elements["zip"]);
    var sincerity          = jQuery(this.elements["sincerity"]);
    var source_id          = jQuery(this.elements["source_id"]);
    var comments           = jQuery(this.elements["comments"]);
    var verificationText   = jQuery(this.elements["verificationText"]);
    
    // Trim the user-set form values from inputs and textareas.
    name.val(trim(name.val()));
    name_last.val(trim(name_last.val()));
    phone.val(trim(phone.val()));
    phone2.val(trim(phone2.val()));
    email.val(trim(email.val()));
    address.val(trim(address.val()));
    city.val(trim(city.val()));
    zip.val(trim(zip.val()));
    comments.val(trim(comments.val()));
    
    // Variable to track readiness to submit.
    var maySubmit = true;
    
    // Begin the validation.
    if (name.val().length == 0 || rxName.test(name.val())) {
        maySubmit = false;
        name.val("First Name");
        name.addClass("required");
    } else {
        name.removeClass("required");
    }
    
    if (name_last.val().length == 0 || rxLastName.test(name_last.val())) {
        maySubmit = false;
        name_last.val("Last Name");
        name_last.addClass("required");
    } else {
        name_last.removeClass("required");
    }
    
    if (phone.val().length == 0 || !isUsPhoneNumber(phone.val())) {
        maySubmit = false;
        phone.addClass("required");
        
        if (phone.val().length == 0) {
            phone.val("Phone");
        }
    } else {
        phone.val(normalizePhoneNumber(phone.val()));
        phone.removeClass("required");
    }
    
    // Phone2 is optional, but it still flags an error if it's not blank AND it's not a valid phone number.
    var phone2Value = phone2.val().toString();
    
    if (phone2Value.length == 0 || rxPhone2.test(phone2Value) || isUsPhoneNumber(phone2Value)) {
        phone2.removeClass("required");
        
        if (isUsPhoneNumber(phone2Value)) {
            phone2.val(normalizePhoneNumber(phone2Value));
        } else {
            phone2.val("Alt Phone");
        }
    } else {
        maySubmit = false;
        phone2.addClass("required");
    }
    
    if (email.val().length == 0 || !isEmailFormat(email.val())) {
        maySubmit = false;
        email.addClass("required");
        
        if (email.val().length == 0) {
            email.val("E-mail");
        }
    } else {
        email.removeClass("required");
    }
    
    if (address.val().length == 0 || rxAddress.test(address.val())) {
        maySubmit = false;
        address.val("Address");
        address.addClass("required");
    } else {
        address.removeClass("required");
    }
    
    if (city.val().length == 0 || rxCity.test(city.val())) {
        maySubmit = false;
        city.val("City");
        city.addClass("required");
    } else {
        city.removeClass("required");
    }
    
    if (state.val() == "") {
        maySubmit = false;
        state.addClass("required");
    } else {
        state.removeClass("required");
    }
    
    if (zip.val().length == 0 || !isUsZipCode(zip.val())) {
        maySubmit = false;
        zip.addClass("required");
        
        if (zip.val().length == 0) {
            zip.val("Zip");
        }
    } else {
        zip.val(normalizeZipCode(zip.val()));
        zip.removeClass("required");
    }
    
    if (sincerity.val() == "") {
        maySubmit = false;
        sincerity.addClass("required");
    } else {
        sincerity.removeClass("required");
    }
    
    if (source_id.val() == "") {
        maySubmit = false;
        source_id.addClass("required");
    } else {
        source_id.removeClass("required");
    }
    
    if (verificationText.val() != verificationHidden.val()) {
        maySubmit = false;
        verificationText.addClass("required");
    } else {
        verificationText.removeClass("required");
    }
    
    if (maySubmit) {
        if (rxComments.test(comments.val())) {
            comments.val("");
        }
        
        // Code to track the usage of this form via Google Analytics.
        var typeofPageTracker = typeof(pageTracker);
        
        if (typeofPageTracker == "object" || typeofPageTracker == "xml") {
            pageTracker._trackPageview("/click/form-submit");
        }
    } else {
        if (comments.val().length == 0) {
            comments.val("Comments");
        }
    }
    
    return maySubmit;
}

function slideToGroup(groupNumber) {
    var sliderTable = jQuery(".content.testimonials .slider table");
    
    if (sliderTable.length > 0) {
        sliderTable.css("left", (groupNumber * -936).toString() + "px");
    }
}

var qaItems     = null;
var faqQuestion = null;
var faqAnswer   = null;

function assembleFAQs(wrapper) {
    qaItems     = jQuery(".qaItem");
    faqQuestion = jQuery("#faqQuestion");
    faqAnswer   = jQuery("#faqAnswer");
    
    if (qaItems.length > 0) {
        wrapper.append("<ul />");
        
        var ul = wrapper.children("ul");
        
        qaItems.each(function(index, htmlElement) {
            ul.append("<li><a href=\"javascript:showFAQ(" + index + ")\">" + jQuery(htmlElement).children(".question").text() + "</a></li>");
        });
    }
}

function showFAQ(targetIndex) {
    if (qaItems && qaItems.length && qaItems.length > 0) {
        qaItems.each(function(index, htmlElement) {
            if (index == targetIndex) {
                var source = jQuery(htmlElement);
                
                faqQuestion.text(source.children(".question").text());
                faqAnswer.html(source.children(".answer").html());
            }
        });
    }
}

function showLabel(labelName) {
    var labelImgs = jQuery(".content .packaging .labels img");
    var focusImg  = jQuery("#label_" + labelName);
    
    if (labelImgs.length > 0 && focusImg.length > 0) {
        labelImgs.each(function() { jQuery(this).removeClass("active"); });
        
        focusImg.addClass("active");
    }
}

function playAudio(url) {
    var audioFrame = jQuery("#audioFrame");
    
    audioFrame.addClass("active");
    audioFrame.attr("src", url);
}

function showVideo(videoID) {
    jQuery("#videoFrame").attr("src", "http://www.youtube.com/embed/" + videoID + "?rel=0");
}

jQuery(document).ready(function() {
    var sampleRequestForm = this.getElementById("sampleRequestForm2");
    
    if (sampleRequestForm) {
        sampleRequestForm.onsubmit = validateRequestForm;
        
        for (var i = 0; i < sampleRequestForm.elements.length; i++) {
            if (
                sampleRequestForm.elements[i].nodeName.toLowerCase() == "input"
                    &&
                sampleRequestForm.elements[i].getAttribute("type") == "text"
            ) {
                sampleRequestForm.elements[i].onfocus = onFocusHandler;
                sampleRequestForm.elements[i].onblur  = onBlurHandler;
            } else if (sampleRequestForm.elements[i].nodeName.toLowerCase() == "select") {
                sampleRequestForm.elements[i].onchange = function() {
                    if (this.selectedIndex == 0) {
                        jQuery(this).addClass("required");
                    } else {
                        jQuery(this).removeClass("required");
                    }
                };
            }
        }
    }
    
    var sampleRequestFormLink = jQuery("#sampleRequestFormLink");
    
    if (sampleRequestFormLink.length > 0) {
        sampleRequestFormLink.fancybox({
            "width"         : 331,
            "height"        : 554,
            "autoScale"     : false,
            "transitionIn"  : "none",
            "transitionOut" : "none",
            "type"          : "iframe"
        });
    }
    
    var headerRotatorDiv = jQuery("#headerRotatorDiv");
    
    if (headerRotatorDiv.length > 0) {
        headerRotatorDiv.cycle();
    }
    
    var indexRotatorDiv = jQuery("#indexRotatorDiv");
    
    if (indexRotatorDiv.length > 0) {
        indexRotatorDiv.cycle();
    }
    
    var commentsForm = jQuery("#commentsForm");
    
    if (commentsForm.length > 0) {
        commentsForm.validate();
    }
    
    var faqList = jQuery("#faqList");
    
    if (faqList.length > 0) {
        assembleFAQs(faqList);
        
        faqList.jScrollPane({ "showArrows" : true, "dragMaxHeight" : 100 });
    }
    
    var alertMessage = jQuery(".alertMessage");
    
    if (alertMessage.length > 0) {
        var message = trim(alertMessage.text().replace(/\r?\n/g, " ").replace(/\s{2,}/g, " "));
        
        if (message.length > 0) {
            alert(message);
        }
    }
});

