﻿/* utility.js functions */


function ConvertDateTimeToDate(dt) {
    var n = dt.match('(\-)?[0-9]+');
    var d = new Date();
    d.setTime(parseInt(n));
    return d;
}


// Add the trim functions for strings 
// These functions are built in Firefox 3.1+
if (!String.trim) {
    String.prototype.trim = function trim() {
        return this.replace(/^\s+|\s+$/g, "");
    }
}

if (!String.trimLeft) {
    String.prototype.trimLeft = function trimLeft() {
        return this.replace(/^\s+/, "");
    }
}

if (!String.trimRight) {
    String.prototype.trimRight = function trimRight() {
        return this.replace(/\s+$/, "");
    }
}

if (!String.empty) {
    String.prototype.empty = function empty() {
        if (this.length > 0)
            return false;

        return (this == null);
    }
}

if (!Date.format) {
    Date.prototype.format = function format(formatStr) {
        var re = /(%[a-zA-Z])/g;
        var values = formatStr.match(re);

        for (var i = 0; i < values.length; i++) {
            switch (values[i]) {
                case "%a":
                    var txt = (this.getHours() > 12) ? "pm" : "am";
                    formatStr = formatStr.replace("%a", txt, "g");
                    break;
                case "%A":
                    var txt = (this.getHours() > 12) ? "PM" : "AM";
                    formatStr = formatStr.replace("%A", txt, "g");
                    break;
                case "%d":
                    var txt = (this.getDate() < 10) ? "0" + this.getDate() : this.getDate();
                    formatStr = formatStr.replace("%d", txt, "g");
                    break;
                case "%g":
                    var txt = (this.getHours() > 12) ? this.getHours() - 12 : this.getHours();
                    formatStr = formatStr.replace("%g", txt, "g");
                    break;
                case "%G":
                    formatStr = formatStr.replace("%G", this.getHours(), "g");
                    break;
                case "%h":
                    var txt = (this.getHours() > 12) ? this.getHours() - 12 : this.getHours();
                    txt = (txt < 10) ? "0" + txt : txt;
                    formatStr = formatStr.replace("%h", txt, "g");
                    break;
                case "%H":
                    var txt = (this.getHours() < 10) ? "0" + this.getHours() : this.getHours();
                    formatStr = formatStr.replace("%H", txt, "g");
                    break;
                case "%i":
                    var txt = (this.getMinutes() < 10) ? "0" + this.getMinutes() : this.getMinutes();
                    formatStr = formatStr.replace("%i", txt, "g");
                    break;
                case "%L":
                    var txt = (((this.getFullYear() % 4 == 0) && (this.getFullYear() % 100 != 0)) || (this.getFullYear() % 400 == 0)) ? 1 : 0
                    formatStr = formatStr.replace("%L", txt, "g");
                    break;
                case "%m":
                    var txt = ((this.getMonth() + 1) < 10) ? "0" + (this.getMonth() + 1) : (this.getMonth() + 1);
                    formatStr = formatStr.replace("%m", txt, "g");
                    break;
                case "%n":
                    formatStr = formatStr.replace("%n", (this.getMonth() + 1), "g");
                    break;
                case "%s":
                    var txt = (this.getSeconds() < 10) ? "0" + this.getSeconds() : this.getSeconds();
                    formatStr = formatStr.replace("%s", this.getSeconds(), "g");
                    break;
                case "%w":
                    formatStr = formatStr.replace("%w", this.getDay(), "g");
                    break;
                case "%Y":
                    formatStr = formatStr.replace("%Y", this.getFullYear(), "g");
                    break;
            }
        }

        return formatStr;
    }
}

if (!String.parseTime) {
    String.prototype.parseTime = function parseTime() {
        var time = this.match(/^([0-1]?[0-9]{1}):([0-5]{1}[0-9]{1})(\s[p]{1}[m]{1})?/i);
        var h = parseInt(time[1], 10);
        var m = parseInt(time[2], 10);

        if (time[3] && h != 12) {
            h += 12;
        }

        var d = new Date();
        d.setHours(h);
        d.setMinutes(m);

        return d.getTime();
    }
}

if (!String.parseDate) {
    String.prototype.parseDate = function parseDate(delimiter) {
        if (!delimiter || delimiter.empty())
            delimiter = '/';

        var parts = this.split(delimiter);
        var d = new Date(parts[2], parts[0], parts[1], 0, 0, 0);

        return d.getTime();
    }
}

/* end utility.js functions */


$(document).ready(function() {
    $("a[rel*=external]").click(function(e) {
        e.preventDefault();
        window.open($(this).attr("href"), "_blank");
    });

    // Inner Labels
    $(".inner_labels").each(function() {
        $(this).attr("alt", $(this).val());
    }).focus(function() {
        if ($(this).val() == $(this).attr("alt")) {
            $(this).val("");
            $(this).css("color", "#343434");
        }
    }).blur(function() {
        if ($(this).val() == "") {
            $(this).val($(this).attr("alt"));
            $(this).css("color", "#BBB");
        }
    });

    //////////////////////////////////////
    // start print events
    /////////////////////////////////////

    $(".site_tools_button_providers_print,.site_tools_button_library_print,.site_tools_button_events_print,.site_tools_button_fhm_print").click(function() {
        var pa = $("#PrintArea");
        if (pa.length == 0) { pa = $("body"); }
        pa.printArea();
    });
    //////////////////////////////////////
    // end print events
    /////////////////////////////////////

    //////////////////////////////////////
    // start feedback events
    /////////////////////////////////////

    $('#feedback,.feedbackLink').fancybox({
        'height': '85%',
        'width': 760,
        'autoScale': false,
        'autodimensions': true,
        'transitionIn': 'fade',
        'transitionOut': 'fade',
        'type': 'iframe',
        'scrolling': 'no',
        'href': '/home/feedback'
    });


    //////////////////////////////////////
    // end feedback events
    /////////////////////////////////////

    //////////////////////////////////////
    // begin events search event
    /////////////////////////////////////

    $("#EventTopic").change(function() {
        var topic = $(this).val();
        if (topic != "") {
            //go back and get the events that match this topic
            var en = $("#EventName");
            en.html("<option value=''>Loading...</option>");
            $.post("/events/queryevents/", "topic=" + encodeURIComponent(topic), function(data) {
                en.html(data);
                //en.fadeIn();
                en.width("95%");
            });
        }
    });

    $('#eventSearchSubmit').click(function() {
        var errors = "";
        if ($('#EventTopic').val() == '' || $('#EventSeries').val() == '0') {
            errors += "Please choose a Topic and Class Series.\n";
        }
        if ($('#Zip').val() != '') {
            var zipVal = $('#Zip').val().replace("-","");
            if (zipVal.length < 5 || zipVal.length > 9) {
                errors += "Please enter a valid ZIP Code.\n";
            }
        }

        if (errors != "") {
            alert(errors);
            return false;
        } else {
            //$('#pageNumber').val('1'); // reset paging
            $('#eventSearch').submit();
            $("#searchMessage").dialog("open");
        }
    });

    $("#StartDate").datepicker({ changeYear: true, changeMonth: true, yearRange: '1920:2015', beforeShow: function() { $('#ui-datepicker-div').css('z-index', '2'); } });
    $("#EndDate").datepicker({ changeYear: true, changeMonth: true, yearRange: '1920:2015' });

    //////////////////////////////////////
    // end events search event
    /////////////////////////////////////   


    //////////////////////////////////////
    // begin user registration/login events
    /////////////////////////////////////

    $('#logout').live('click', function() {
        $.post('/account/logout', "message", function(data) {
            if (data.isValid) {
                location.href = location.href;
            }
        });
    });

    $('#get_started').live('click', function() {
        $('#createProfile').click();
    });

    // forgot password link
    $('#forgotPasswordLink').live('click', function() {
        $('#forgotpassword .loginerror2').text('');
        $('#forgotpassword .loginerror2').hide();
        $('.loginerror2').next().find(".fhmsplash_signin_row:eq(0)").show();

        $('#forgotpassword .message').show();
        $('#signin').hide();
        $('#forgotpassword').show();
    });

    $('#forgotpassword_back').live('click', function() {
        $('#forgotpassword').hide();
        $('#signin').show();
    });

    $('#forgotpassword_send').live('click', function() {
        // validate the email before sending to database
        var pattern = /^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\.([a-zA-Z])+([a-zA-Z])+/;
        if (!pattern.test($('#forgotpassword_username').val())) {
            $('.loginerror2').text('Invalid email address, please try again.').show();
            $('#forgotpassword .message').hide();
            return false;
        }

        // check to see if we have that email address
        $('.loadingGraphic_sidealign').show();
        $.post("/account/CheckEmailAddress/" + $('#forgotpassword_username').val() + "?" + myTimestamp(),
                    function(data) {
                        if (!data.isValid) {
                            $.post('/account/RequestPassword/?' + myTimestamp(), $("#RequestPasswdFrm").serialize(), function(data) {
                                var le = $(".loginerror2");
                                le.text(data.message).show();
                                le.next().find(".fhmsplash_lockedout_row:eq(0)").hide();
                                if (le.parents("#fhmsplash_signin_1").length > 0) {
                                    $(".fhmsplash_signin_row_button").hide();
                                    le.next().prepend("<div class=\"fhmsplash_signin_row_button\" style=\"text-align:center;\"><a href=\"/fhm\"><span>Back to Sign in</span></a></div>");
                                    $(".fhmsplash_lockedout_row").hide();
                                }
                                $('#forgotpassword .message').hide();
                                $('.loadingGraphic_sidealign').hide();
                            });
                        }
                        else {
                            $('.loginerror2').text('Sorry, we have no record of that email address.').show();
                            $('.loadingGraphic_sidealign').hide();
                        }
                    });
    });

    $('#leftHandLogin').live('click', function() {
        // validate the email before attempting login
        var pattern = /^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\.([a-zA-Z])+([a-zA-Z])+/;
        if (!pattern.test($('#signin_username').val())) {
            $('.loginerror').text('Please enter your email address and try again.').show();
            return false;
        }

        $.post('/account/LogOn?' + myTimestamp(), $("#logonFrmLeft").serialize(), function(data) {
            if (data.isValid) {
                if (data.isReset) {
                    location.href = "/fhm/settings?pw=true";
                } else if (data.message == "foreignAccount") {
                    location.href = "/account/foreignaccount";
                } else if (location.href.indexOf("ReturnUrl") != -1) {
                    location.href = location.href.substring(location.href.indexOf("ReturnUrl") + 10);
                } else {
                    location.href = location.href;
                }
            }
            else {
                if (data.message == "locked out") {
                    location.href = "/account/lockedout";
                } else {
                    $('.loginerror').html(data.message);
                    $('.loginerror').show();
                }
            }
        });
    });

    $("#createProfile").live("click", function() {
        location.href = "/account/CreateAccountForm";
    });

    //////////////////////////////////////
    // end user registration/login events
    /////////////////////////////////////

    //////////////////////////////////////
    // begin data/form events
    /////////////////////////////////////

    $(".underConstruction").click(function(e) {
        e.preventDefault();
        alert("This feature is under construction. Please submit any feedback you have about the concept. We appreciate your ideas!");
    });

    $('#searchMessage').dialog({
        'autoOpen': false,
        'modal': true,
        'height': 125,
        'width': 250,
        'closeOnEscape': false,
        'beforeClose': function() { return false; },
        'open': function(event, ui) { $(".ui-dialog-titlebar-close").hide(); }
    });

    window.onbeforeunload = function() {
        if ($(".checkBeforeUnload:visible").length > 0) {
            if (isChanged) {
                return "Are you sure you want to leave this page without saving? Press OK to continue or Cancel to stay on the current page.";
            }
        }
    };

    var isChanged = false;
    $(".checkBeforeUnload input[type!='hidden'], .checkBeforeUnload textarea[type!='hidden']").change(function() { isChanged = true; });
}).konami(function() { $("<div id='horses'></div>").prependTo("body").fadeIn(3000).click(function() { $("#horses").fadeOut("slow", function() { $(this).remove(); }); }); });

function myTimestamp() {
    tstmp = new Date();
    return tstmp.getTime();
}

//Registration Validation

var error = false;
var req;

$(function() {

    $("input.val-passwordStrength").focus(function() {
        $(this).keyup(function() {
            var reg = /.*/;
            var value = $(this).val();

            reg = /.{0,5}/;
            var weak = reg.test(value);
            reg = /(?=.*\d).{6,}/;
            var ok = reg.test(value);
            reg = /(?=.*\d).{8,}/;
            var good = reg.test(value);
            reg = /(?=.*\d)((?=.*[A-Z])|((?=.*\W+)|(?=.*[_]))).{8,}/;
            var verygood = reg.test(value);
            reg = /(?=.*\d)(?=.*[A-Z])(?=.*[a-z])((?=.*\W+)|(?=.*[_])).{8,}/;
            var excellent = reg.test(value);

            $("#password_strength_indicator").css("display", "inline-block");

            if (excellent) {
                $(".password_strength_indicator_bar").css("background-color", "#0c0").css("color", "white").html("Excellent");
            } else if (verygood) {
                $(".password_strength_indicator_bar").css("background-color", "#9f0").css("color", "white").html("Very Good");
            } else if (good) {
                $(".password_strength_indicator_bar").css("background-color", "#ff4").css("color", "#343434").html("Good");
            } else if (ok) {
                $(".password_strength_indicator_bar").css("background-color", "#f94").css("color", "white").html("OK");
            } else if (weak) {
                $(".password_strength_indicator_bar").css("background-color", "#f44").css("color", "white").html("Weak");
            }
        });
    });

    $("form.check input[type='text'], form.check input[type='password'], form.check textarea").blur(function() {
        checkText($(this));
    });

    $("form.check select").change(function() {
        checkSelect($(this));
    });

    $("form.check input[type='checkbox']").click(function() {
        checkCheckbox($(this));
    });

    $("form.check input[type='radio']").change(function() {
        //checkCheckbox(field);
        var name = $(this).attr("name");
        if ($("input[name=" + name + "]:checked").val()) {
            $(this).parents("span.invalid").removeClass("invalid");
        }
    });

    $("textarea.maxlen").each(function() {
        var chars = $(this).attr("class");
        var idx = chars.indexOf("len_");
        if (idx > -1) {
            idx = idx + 4;
            var eidx = chars.indexOf(" ", idx);
            chars = eidx > -1 ? chars.substring(idx, eidx) : chars.substr(idx);
        }
        var char_left = parseInt(chars, 10) - $(this).val().length;

        $(this).parent().append('<span class="max_characters"><span id="' + $(this).attr("name") + '_maxlength">' + char_left + '</span> characters remaining.</span>');
    }).keyup(function() {
        setTimeout('checkMaxlength("' + $(this).attr("name") + '")', 1);
    });
});

function recheckForm(form) {
    $(form).find("input[type='text'], form.check input[type='password']").each(function() {
        checkText($(this));
    });
    $(form).find("select").each(function() {
        checkSelect($(this));
    });
    $(form).find("input[type='checkbox'], form.check input[type='radio']").each(function() {
        checkCheckbox($(this));
    });
    return formCheck(form);
}

function formCheck(form) {
    var req = false;
    var error = false;
    var isIE7 = ($.browser.msie && $.browser.version.substr(0, 1) < 9);
    var frm = $(form);

    // Check for required fields
    frm.find(".val-required").each(function() {
        var sub_req = 0;
        var field_count = 0;
        var is_checkbox = false;
        var is_radio = false;
        var is_select = false;
        var is_url = false;

        $(this).find("input, select, textarea").each(function() {
            var type = this.nodeName;
            var ths = $(this);

            if (type == "SELECT") {
                is_select = true;
            }

            if (type == "INPUT") {
                if (ths.attr("type") == "checkbox") {
                    is_checkbox = true;
                } else if (ths.attr("type") == "radio") {
                    is_radio = true;
                }
            }

            if (ths.hasClass("val-url")) {
                is_url = true;
            }

            var value;
            if (!is_checkbox && !is_radio) {
                value = ths.val().trim();
            } else {
                value = ths.is(':checked');
            }

            if (!value || value == "" || value === null || (is_select && value == "0") || (is_url && value == "http://")) {
                var par = ths.parents("td");
                if (par == undefined || par == null) {
                    par = ths.parents("div");
                }
                if (is_radio) {
                    $("input:radio").each(function() {
                        var name = ths.attr("name");
                        if (!$("input[name=" + name + "]:checked").val()) {
                            sub_req++;
                            ths.parents("span.invalid").removeClass("invalid");
                            if (par != undefined && par != null) {
                                par.wrapInner('<span class="invalid" />');
                            }
                        } else {
                            ths.parents("span.invalid").removeClass("invalid");
                        }
                    });
                }
                else if (is_checkbox) {
                    sub_req++;
                    ths.parents("span.invalid").removeClass("invalid");
                    if (par != undefined && par != null) {
                        par.wrapInner('<span class="invalid" />');
                    }
                } else { //select box
                    sub_req++;
                    if (isIE7) {
                        if (ths.parents("span.invalid").length == 0) {
                            $(this).parent().wrapInner('<span class="invalid" />');
                        }
                    } else {
                        ths.addClass("invalid");
                    }
                }
            } else {
                ths.removeClass("invalid");
                ths.parents("span.invalid").removeClass("invalid");
            }

            field_count++;
        });

        if (is_checkbox || is_radio) {
            if (sub_req == field_count) {
                req = true;
            }
        } else {
            if (sub_req != 0) {
                req = true;
            }
        }
    });

    //Make sure there are no other validation errors
    if (frm.find(":input.invalid").length > 0 || frm.find(".validation_error").length > 0) {
        error = true;
    }

    return !(req || error);
}

function checkText(field) {
    var value = field.val();
    var error_msg = "";
    var reg = /.*/;

    if (value != "") {
        if (field.hasClass("val-blob")) {
            // Do Nothing
        } else if (field.hasClass("val-zip")) {
            reg = /^[0-9]{5}$/;
            error_msg = "Please enter a valid ZIP code in ##### or #####-#### format (i.e. 55346 or 55346-1234).";
        } else if (field.hasClass("val-url")) {
            if (value != "http://") {
                reg = /^http:\/\/[a-z0-9-\.]+\.[a-z]{2,4}\/?([^\s<>\#%"\,\{\}\\|\\\^\[\]`]+)?$/;
                error_msg = "Please enter a valid web address, starting with \"http://\".";
            }
        } else if (field.hasClass("val-phone")) {
            if (value.replace(/_/gi, "").length > 2) {
                reg = /^\d{3}-\d{3}-\d{4}$/;
                error_msg = "Please enter a valid phone number.";
            }
        } else if (field.hasClass("val-email")) {
            reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
            error_msg = "Please enter a valid email address.";
        } else if (field.hasClass("val-emailmulti")) {
            reg = /^((\s*[A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})\s*[;,]?){1,3}$/;
            error_msg = "Please enter up to 3 valid email addresses.";
        } else if (field.hasClass("val-password")) {
            reg = /(?=.*\d).{6,}/;
            error_msg = "Please enter a valid password.";
        } else if (field.hasClass("val-password2")) {
            var name = field.attr("name");
            var password1 = $("input[name='" + name.substr(0, name.length - 1) + "1']").val();
            var password2 = field.val();
            value = "a";
            if (password1 != password2) {
                reg = /b/;
            } else {
                reg = /a/;
            }
            error_msg = "Your password and confirm password fields do not match.";
        } else if (field.hasClass("val-email2")) {
            var name = field.attr("name");
            var email1 = $("input[name='" + name.substr(0, name.length - 1) + "1']").val();
            var email2 = field.val();
            value = "a";
            if (email1 != email2) {
                reg = /b/;
            } else {
                reg = /a/;
            }
            error_msg = "Your email and confirm email fields do not match.";
        } else if (field.hasClass("val-date")) {
            var d = new Date(field.val());
            if (d > new Date()) {
                reg = /b/;
                error_msg = "Please enter a date that has already happened.";
            }
        } else if (field.hasClass("val-datefuture")) {
            if (value != "") {
                var d = new Date(field.val());
                if (d <= new Date()) {
                    reg = /b/;
                    error_msg = "Please enter a date that hasn't already happened.";
                }
            }
        } else if (field.hasClass("val-time")) {
            if (value != "") {
                reg = /\d+/;
                error_msg = "Please enter a valid time.";
            }
        }

        field.parent().find(".validation_error").remove();

        if (!reg.test(value)) {
            field.addClass("invalid");
            field.parent().append('<div class="validation_error">' + error_msg + '</div>');
        } else {
            field.removeClass("invalid");
            clearInvalid(field);
        }
    } else {
        field.parent().find(".validation_error").remove();
        if (field.parents(".val-required").length == 0) {
            field.removeClass("invalid");
        }
    }
}

function checkSelect(field) {
    if (field.val() != "") {
        if (field.parents("span.invalid").length > 0) {
            clearInvalid(field);
        } else {
            field.removeClass("invalid");
        }
    }
}

function clearInvalid(obj) {
    var par = obj.parent();
    var sels = par.find("select");
    var empty = false;
    for (var i = 0; i < sels.length; i++) {
        if ($(sels[i]).val() == "") {
            empty = true;
            break;
        }
    }
    if (!empty) {
        par.removeClass("invalid");
    }
}

function checkCheckbox(field) {
    if (field.is(":checked")) {
        field.parents("span.invalid").removeClass("invalid");
    }
}

function checkMaxlength(name) {
    var obj = $("[name='" + name + "']");

    if (obj.hasClass("maxlen")) {
        var chars = obj.attr("class");
        var idx = chars.indexOf("len_");
        if (idx > -1) {
            idx = idx + 4;
            var eidx = chars.indexOf(" ", idx);
            chars = eidx > -1 ? chars.substring(idx, eidx) : chars.substr(idx);
        }
        var char_total = parseInt(chars, 10);
        var char_left = char_total - obj.val().length;

        if (char_left < 0) {
            obj.val(obj.val().substr(0, char_total));
            char_left = 0;
        }

        $("#" + name + "_maxlength").html(char_left);
    }
}

function parseDate(dateval) {
    var d = new Date(parseInt(dateval.substr(6)));
    return (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear();
}

//this function came from http://papermashup.com/read-url-get-variables-withjavascript/
var getUrlVars = (function() {
    var vars;
    return function() {
        if (vars !== undefined) return vars;
        vars = {};
        window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m, key, value) {
            vars[key] = urldecode(value);
        });
        return vars;
    }
})();

//this function came from http://stackoverflow.com/questions/4292914/javascript-url-decode-function
function urldecode(str) {
    return decodeURIComponent((str + '').replace(/\+/g, '%20'));
}
