/* Minification failed. Returning unminified contents.
(502,32-33): run-time error JS1195: Expected expression: )
(502,35-36): run-time error JS1195: Expected expression: >
(503,43-44): run-time error JS1195: Expected expression: )
(503,46-47): run-time error JS1195: Expected expression: >
(512,18-19): run-time error JS1195: Expected expression: ,
(512,35-36): run-time error JS1003: Expected ':': )
(515,9-10): run-time error JS1002: Syntax error: }
(516,30-31): run-time error JS1195: Expected expression: )
(516,32-33): run-time error JS1004: Expected ';': {
(518,10-11): run-time error JS1195: Expected expression: ,
(519,41-42): run-time error JS1004: Expected ';': {
(524,5-6): run-time error JS1002: Syntax error: }
(526,58-59): run-time error JS1004: Expected ';': {
(1560,1-2): run-time error JS1002: Syntax error: }
(1566,25-26): run-time error JS1004: Expected ';': {
(1600,2-3): run-time error JS1195: Expected expression: )
 */
/*
 * jQuery MultiSelect UI Widget 1.12
 * Copyright (c) 2011 Eric Hynds
 *
 * http://www.erichynds.com/jquery/jquery-ui-multiselect-widget/
 *
 * Depends:
 *   - jQuery 1.4.2+
 *   - jQuery UI 1.8 widget factory
 *
 * Optional:
 *   - jQuery UI effects
 *   - jQuery UI position utility
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 */

var MNI = MNI || {};

/* in SEO4 we use Select2*/
if (MNI.jQuery.widget) {
    (function (d) { var j = 0; d.widget("ech.multiselect", { options: { header: !0, height: 175, minWidth: 225, classes: "", checkAllText: "Check all", uncheckAllText: "Uncheck all", noneSelectedText: "Select options", selectedText: "# selected", selectedList: 0, show: "", hide: "", autoOpen: !1, multiple: !0, position: {} }, _create: function () { var a = this.element.hide(), b = this.options; this.speed = d.fx.speeds._default; this._isOpen = !1; a = (this.button = d('<button type="button"><span class="ui-icon ui-icon-triangle-2-n-s"></span></button>')).addClass("ui-multiselect ui-widget ui-state-default ui-corner-all").addClass(b.classes).attr({ title: a.attr("title"), "aria-haspopup": !0, tabIndex: a.attr("tabIndex") }).insertAfter(a); (this.buttonlabel = d("<span />")).html(b.noneSelectedText).appendTo(a); var a = (this.menu = d("<div />")).addClass("ui-multiselect-menu ui-widget ui-widget-content ui-corner-all").addClass(b.classes).appendTo(document.body), c = (this.header = d("<div />")).addClass("ui-widget-header ui-corner-all ui-multiselect-header ui-helper-clearfix").appendTo(a); (this.headerLinkContainer = d("<ul />")).addClass("ui-helper-reset").html(function () { return !0 === b.header ? '<li><a class="ui-multiselect-all" href="#"><span class="ui-icon ui-icon-check"></span><span>' + b.checkAllText + '</span></a></li><li><a class="ui-multiselect-none" href="#"><span class="ui-icon ui-icon-closethick"></span><span>' + b.uncheckAllText + "</span></a></li>" : "string" === typeof b.header ? "<li>" + b.header + "</li>" : "" }).append('<li class="ui-multiselect-close"><a href="#" class="ui-multiselect-close"><span class="ui-icon ui-icon-circle-close"></span></a></li>').appendTo(c); (this.checkboxContainer = d("<ul />")).addClass("ui-multiselect-checkboxes ui-helper-reset").appendTo(a); this._bindEvents(); this.refresh(!0); b.multiple || a.addClass("ui-multiselect-single") }, _init: function () { !1 === this.options.header && this.header.hide(); this.options.multiple || this.headerLinkContainer.find(".ui-multiselect-all, .ui-multiselect-none").hide(); this.options.autoOpen && this.open(); this.element.is(":disabled") && this.disable() }, refresh: function (a) { var b = this.element, c = this.options, e = this.menu, h = this.checkboxContainer, g = [], f = [], i = b.attr("id") || j++; b.find("option").each(function (b) { d(this); var a = this.parentNode, e = this.innerHTML, h = this.title, j = this.value, b = this.id || "ui-multiselect-" + i + "-option-" + b, k = this.disabled, m = this.selected, l = ["ui-corner-all"]; "optgroup" === a.tagName.toLowerCase() && (a = a.getAttribute("label"), -1 === d.inArray(a, g) && (f.push('<li class="ui-multiselect-optgroup-label"><a href="#">' + a + "</a></li>"), g.push(a))); k && l.push("ui-state-disabled"); m && !c.multiple && l.push("ui-state-active"); f.push('<li class="' + (k ? "ui-multiselect-disabled" : "") + '">'); f.push('<label for="' + b + '" title="' + h + '" class="' + l.join(" ") + '">'); f.push('<input id="' + b + '" name="multiselect_' + i + '" type="' + (c.multiple ? "checkbox" : "radio") + '" value="' + j + '" title="' + e + '"'); m && (f.push(' checked="checked"'), f.push(' aria-selected="true"')); k && (f.push(' disabled="disabled"'), f.push(' aria-disabled="true"')); f.push(" /><span>" + e + "</span></label></li>") }); h.html(f.join("")); this.labels = e.find("label"); this._setButtonWidth(); this._setMenuWidth(); this.button[0].defaultValue = this.update(); a || this._trigger("refresh") }, update: function () { var a = this.options, b = this.labels.find("input"), c = b.filter("[checked]"), e = c.length, a = 0 === e ? a.noneSelectedText : d.isFunction(a.selectedText) ? a.selectedText.call(this, e, b.length, c.get()) : /\d/.test(a.selectedList) && 0 < a.selectedList && e <= a.selectedList ? c.map(function () { return d(this).next().text() }).get().join(", ") : a.selectedText.replace("#", e).replace("#", b.length); this.buttonlabel.html(a); return a }, _bindEvents: function () { function a() { b[b._isOpen ? "close" : "open"](); return !1 } var b = this, c = this.button; c.find("span").bind("click.multiselect", a); c.bind({ click: a, keypress: function (a) { switch (a.which) { case 27: case 38: case 37: b.close(); break; case 39: case 40: b.open() } }, mouseenter: function () { c.hasClass("ui-state-disabled") || d(this).addClass("ui-state-hover") }, mouseleave: function () { d(this).removeClass("ui-state-hover") }, focus: function () { c.hasClass("ui-state-disabled") || d(this).addClass("ui-state-focus") }, blur: function () { d(this).removeClass("ui-state-focus") } }); this.header.delegate("a", "click.multiselect", function (a) { if (d(this).hasClass("ui-multiselect-close")) b.close(); else b[d(this).hasClass("ui-multiselect-all") ? "checkAll" : "uncheckAll"](); a.preventDefault() }); this.menu.delegate("li.ui-multiselect-optgroup-label a", "click.multiselect", function (a) { a.preventDefault(); var c = d(this), g = c.parent().nextUntil("li.ui-multiselect-optgroup-label").find("input:visible:not(:disabled)"), f = g.get(), c = c.parent().text(); !1 !== b._trigger("beforeoptgrouptoggle", a, { inputs: f, label: c }) && (b._toggleChecked(g.filter("[checked]").length !== g.length, g), b._trigger("optgrouptoggle", a, { inputs: f, label: c, checked: f[0].checked })) }).delegate("label", "mouseenter.multiselect", function () { d(this).hasClass("ui-state-disabled") || (b.labels.removeClass("ui-state-hover"), d(this).addClass("ui-state-hover").find("input").focus()) }).delegate("label", "keydown.multiselect", function (a) { a.preventDefault(); switch (a.which) { case 9: case 27: b.close(); break; case 38: case 40: case 37: case 39: b._traverse(a.which, this); break; case 13: d(this).find("input")[0].click() } }).delegate('input[type="checkbox"], input[type="radio"]', "click.multiselect", function (a) { var c = d(this), g = this.value, f = this.checked, i = b.element.find("option"); this.disabled || !1 === b._trigger("click", a, { value: g, text: this.title, checked: f }) ? a.preventDefault() : (c.focus(), c.attr("aria-selected", f), i.each(function () { if (this.value === g) this.selected = f; else if (!b.options.multiple) this.selected = !1 }), b.options.multiple || (b.labels.removeClass("ui-state-active"), c.closest("label").toggleClass("ui-state-active", f), b.close()), b.element.trigger("change"), setTimeout(d.proxy(b.update, b), 10)) }); d(document).bind("mousedown.multiselect", function (a) { b._isOpen && !d.contains(b.menu[0], a.target) && !d.contains(b.button[0], a.target) && a.target !== b.button[0] && b.close() }); d(this.element[0].form).bind("reset.multiselect", function () { setTimeout(d.proxy(b.refresh, b), 10) }) }, _setButtonWidth: function () { var a = this.element.outerWidth(), b = this.options; if (/\d/.test(b.minWidth) && a < b.minWidth) a = b.minWidth; this.button.width(a) }, _setMenuWidth: function () { var a = this.menu, b = this.button.outerWidth() - parseInt(a.css("padding-left"), 10) - parseInt(a.css("padding-right"), 10) - parseInt(a.css("border-right-width"), 10) - parseInt(a.css("border-left-width"), 10); a.width(b || this.button.outerWidth()) }, _traverse: function (a, b) { var c = d(b), e = 38 === a || 37 === a, c = c.parent()[e ? "prevAll" : "nextAll"]("li:not(.ui-multiselect-disabled, .ui-multiselect-optgroup-label)")[e ? "last" : "first"](); c.length ? c.find("label").trigger("mouseover") : (c = this.menu.find("ul").last(), this.menu.find("label")[e ? "last" : "first"]().trigger("mouseover"), c.scrollTop(e ? c.height() : 0)) }, _toggleState: function (a, b) { return function () { this.disabled || (this[a] = b); b ? this.setAttribute("aria-selected", !0) : this.removeAttribute("aria-selected") } }, _toggleChecked: function (a, b) { var c = b && b.length ? b : this.labels.find("input"), e = this; c.each(this._toggleState("checked", a)); c.eq(0).focus(); this.update(); var h = c.map(function () { return this.value }).get(); this.element.find("option").each(function () { !this.disabled && -1 < d.inArray(this.value, h) && e._toggleState("selected", a).call(this) }); c.length && this.element.trigger("change") }, _toggleDisabled: function (a) { this.button.attr({ disabled: a, "aria-disabled": a })[a ? "addClass" : "removeClass"]("ui-state-disabled"); this.menu.find("input").attr({ disabled: a, "aria-disabled": a }).parent()[a ? "addClass" : "removeClass"]("ui-state-disabled"); this.element.attr({ disabled: a, "aria-disabled": a }) }, open: function () { var a = this.button, b = this.menu, c = this.speed, e = this.options; if (!(!1 === this._trigger("beforeopen") || a.hasClass("ui-state-disabled") || this._isOpen)) { var h = b.find("ul").last(), g = e.show, f = a.offset(); d.isArray(e.show) && (g = e.show[0], c = e.show[1] || this.speed); h.scrollTop(0).height(e.height); d.ui.position && !d.isEmptyObject(e.position) ? (e.position.of = e.position.of || a, b.show().position(e.position).hide().show()) : b.css({ top: f.top + a.outerHeight(), left: f.left }).show(); this.labels.eq(0).trigger("mouseover").trigger("mouseenter").find("input").trigger("focus"); a.addClass("ui-state-active"); this._isOpen = !0; this._trigger("open") } }, close: function () { if (!1 !== this._trigger("beforeclose")) { var a = this.options, b = a.hide, c = this.speed; d.isArray(a.hide) && (b = a.hide[0], c = a.hide[1] || this.speed); this.menu.hide(); this.button.removeClass("ui-state-active").trigger("blur").trigger("mouseleave"); this._isOpen = !1; this._trigger("close") } }, enable: function () { this._toggleDisabled(!1) }, disable: function () { this._toggleDisabled(!0) }, checkAll: function () { this._toggleChecked(!0); this._trigger("checkAll") }, uncheckAll: function () { this._toggleChecked(!1); this._trigger("uncheckAll") }, getChecked: function () { return this.menu.find("input").filter("[checked]") }, destroy: function () { d.Widget.prototype.destroy.call(this); this.button.remove(); this.menu.remove(); this.element.show(); return this }, isOpen: function () { return this._isOpen }, widget: function () { return this.menu }, _setOption: function (a, b) { var c = this.menu; switch (a) { case "header": c.find("div.ui-multiselect-header")[b ? "show" : "hide"](); break; case "checkAllText": c.find("a.ui-multiselect-all span").eq(-1).text(b); break; case "uncheckAllText": c.find("a.ui-multiselect-none span").eq(-1).text(b); break; case "height": c.find("ul").last().height(parseInt(b, 10)); break; case "minWidth": this.options[a] = parseInt(b, 10); this._setButtonWidth(); this._setMenuWidth(); break; case "selectedText": case "selectedList": case "noneSelectedText": this.options[a] = b; this.update(); break; case "classes": c.add(this.button).removeClass(this.options.classes).addClass(b) }d.Widget.prototype._setOption.apply(this, arguments) } }) })(MNI.jQuery);
}

(function ($, undefined) {

    // Generic helpers

    function redirectTo(absolutePath) {
        window.location = MNI.BaseUrl + absolutePath;
    };

    // Popup window opening

    function openAsWindow(element, width, height, resizable, scrollbars, menubar, toolbar, location) {
        var href = $(element).attr('href'),
            target = $(element).attr('target'),
            features =
                'resizable=' + resizable +
                ',scrollbars=' + scrollbars +
                ',menubar=' + menubar +
                ',toolbar=' + toolbar +
                ',location=' + location;

        if (width !== undefined)
            features = features + ',width=' + width;

        if (height !== undefined)
            features = features + ',height=' + height;

        return window.open(href, target, features);
    };

    function openAsWindowDefault(element) {
        return openAsWindow(element, 640, 435, 1, 1, 1, 0, 0);
    };

    function openAsWindowDefaultRefer(element) {
        return openAsWindow(element, 580, 435, 1, 1, 0, 0, 0);
    };

    function openAsResponsive(element, resizable, scrollbars, menubar, toolbar, location) {
        var height = window.screen.height * 0.75,
            fullWidth = window.screen.width,
            width = fullWidth >= 1376 ? 1280 :
                fullWidth >= 1200 ? 1024 :
                fullWidth >= 992 ? 800 :
                null;

        if (width)
            return openAsWindow(element, width, height, resizable, scrollbars, menubar, toolbar, location);
    };

    function openNewWindow(absolutePath) {
        window.open(MNI.BaseUrl + absolutePath);
    };

    var printFrame;

    var windows = {
        HotDeals: openAsWindowDefault,
        MemberHotDeals: openAsWindowDefault,
        Jobs: openAsWindowDefault,
        VacancyInternal: function (element) {
            return openAsWindow(element, 650, 500, 1, 1, 0, 1, 1);
        },
        VacancyExternal: function (element) {
            return openAsWindow(element, 650, 500, 1, 1, 1, 1, 1);
        },
        ReferMember: openAsWindowDefaultRefer,
        ContactMember: openAsWindowDefault,
        ReferEvent: openAsWindowDefaultRefer,
        ReferJob: openAsWindowDefaultRefer,
        ReferMarketSpaceItem: openAsWindowDefaultRefer,
        RegisterEvent: function (element) {
            return openAsResponsive(element, 1, 1, 1, 0, 0);
        },
        EventPhoto: function (element, width, height) {
            return openAsWindow(element, width + 30, height + 40, 1, 1, 0, 0, 0);
        },
        MemberPdf: function (element) {
            return openAsWindow(element, undefined, undefined, 1, 1, 1, 0, 0);
        },
        Print: function (element) {
            var printWindow = window.open($(element).attr('href'));
            printWindow.closeMe = function () {
                printWindow.close();
            };
            return true;
        }
    };

    // Hit statistics modules

    function logHitStat(type, id) {
        return $.get(MNI.BaseUrl + '/hitstats/' + type + '/' + id);
    };

    var hitStats = {
        MemberMap: function (memid) {
            logHitStat("mbrmap", memid);
        },
        MemberWebsite: function (memid) {
            logHitStat("mbrws", memid);
        },
        MarketWebsiteOffer: function (itemid) {
            logHitStat("mrktwso", itemid);
        },
        MarketWebsiteDetail: function (itemid) {
            logHitStat("mrktwsd", itemid);
        }
    };

    // Path lookup helpers

    var paths = {
        Category: function (slug) {
            return '/' + this._getMemberFilter() + '/category/' + slug;
        },
        QuickLink: function (slug) {
            return '/' + this._getMemberFilter() + '/QL/' + slug;
        },
        Member: function (slug) {
            return '/' + this._getMemberFilter() + '/member/' + slug;
        },
        MemberMapGeoInfo: function (id) {
            return '/' + this._getMemberFilter() + '/GetGeoInfo?memId=' + id;
        },
        MemberMapPinInfo: function (id) {
            return '/' + this._getMemberFilter() + '/MemberMapPinInfo/' + id;
        },
        GeoInfoForMapMembers: function () {
            return '/' + this._getMemberFilter() + '/GetGeoInfoForMapMembers';
        },
        SEO3Plugins: function (path) {
            return '/Content/SEO3/plugins/' + (path || '');
        },
        Scripts: function (path) {
            return '/Content/Script/' + (path || '');
        },
        MemberKeywordSearch: function(keyword) {
            return '/' + this._getMemberFilter() + '/search?q=' + encodeURIComponent(keyword);
        },
        ContactFriend: function (itemType, itemId) {
            return '/inforeq/contactfriend?itemtype=' + itemType + '&itemid=' + itemId;
        },
        _getMemberFilter: function() {
           return (MNI.Page && MNI.Page.MemberFilter) || 'list';
    }
    };

    var preventDuplicateSubmissions = function (formSelector) {
        $(document).on('invalid-form.validate', formSelector, function () {
            var button = $(this).find('input[type="submit"]');
            setTimeout(function () {
                button.removeAttr('disabled');
            }, 1);
        });
        $(document).on('submit', formSelector, function () {
            var button = $(this).find('input[type="submit"]');
            setTimeout(function () {
                button.attr('disabled', 'disabled');
            }, 0);
        });
    }

    $.fn.scrollTo = function (duration, callback) {
        $('html, body').animate({
            scrollTop: $(this).offset().top
        }, duration, callback);
    };

    // Autocomplete for directory searches

    var autoComplete = {
        Defaults: {
            limit: 10
        },
        Init: function (selector, options) {
            var opts = $.extend({}, autoComplete.Defaults, options),
                elements = $(selector);

            if (!elements.length)
                return;

            // CM-2567 - in the newer version of jQuery, data-autocomplete is not initialized
            if (!elements.data('autocomplete'))
                elements.data('autocomplete', {});

            function getRawParams() {
                return $.isFunction(opts.rawParams) ?
                    opts.rawParams.apply(this, []) :
                    opts.rawParams;
            };

            function addParams(url, rawParams) {
                if (rawParams)
                    url += (url.indexOf('?') < 0 ? '?' : '&') + rawParams;

                return url;
            };

            elements.autocomplete({
                source: function (request, response) {
                    var $this = $(this),
                        store = $this.data('MNI_Autocomplete');

                    if (!store)
                        $this.data('MNI_Autocomplete', store = { cache: {} });

                    var term = request.term,
                        params = $.isFunction(opts.params) ? opts.params.apply(this, []) : opts.params,
                        paramsRaw = getRawParams(),
                        paramData = $.param(params || {}),
                        requestData = $.param({ q: term, limit: opts.limit }),
                        cachedItem;

                    if (paramData)
                        requestData = [requestData, paramData].join('&');

                    if (paramsRaw)
                        requestData = [requestData, paramsRaw].join('&');

                    cachedItem = store.cache[requestData];

                    if (cachedItem) {
                        response(cachedItem);
                    } else {
                        store.lastXhr = $.getJSON(
                            MNI.BaseUrl + opts.path,
                            requestData,
                            function (data, status, xhr) {
                                if (data) {
                                    $.each(data, function (index, item) {
                                        item.value = item.label = item.Name;
                                    });
                                }
                                store.cache[requestData] = data;
                                if (xhr === store.lastXhr) {
                                    response(data);
                                    delete store.lastXhr;
                                }
                            }
                        );
                    }
                },
                select: function (event, ui) {
                    $(this).val(ui.item.Name);
                    
                    var openInNewWindow = MNI.Page.MemberPagePopup,
                        doAction = openInNewWindow ? openNewWindow : redirectTo;

                    switch (ui.item.ResultType) {
                        case 1: // AutocompleteSearchResultType.Category
                            doAction(addParams(paths.Category(ui.item.SlugWithID), getRawParams()));
                            break;
                        case 2: // AutocompleteSearchResultType.QuickLink
                            doAction(addParams(paths.QuickLink(ui.item.SlugWithID), getRawParams()));
                            break;
                        case 3: // AutocompleteSearchResultType.Member
                            if (ui.item.MemberPageAction == 1) 
                            {
                                logHitStat("mbrws", ui.item.ID).then( function () {
                                var location = ui.item.WebParticipation < 10 ?
                                    paths.MemberKeywordSearch(ui.item.Name) :
                                    paths.Member(ui.item.SlugWithID);
                                doAction(location);
                                });
                            }
                            else
                            {
                                var location = ui.item.WebParticipation < 10 ?
                                    paths.MemberKeywordSearch(ui.item.Name) :
                                    paths.Member(ui.item.SlugWithID);
                                doAction(location);
                            }
                            break;
                    }

                    return false;
                }
            });

            elements.data('ui-autocomplete')._renderItem = function (ul, item) {
                $(ul).css({'z-index': 1000});
                var name = $('<span></span>').addClass('mn-autocomplete-name').text(item.Name),
                    type = $('<span></span>').addClass('mn-autocomplete-type'),
                    link = $('<a></a>').addClass('mn-autocomplete').append(name).append('<br />').append(type);

                switch (item.ResultType) {
                    case 1: // AutocompleteSearchResultType.Category
                        type.text('Category');
                        break;
                    case 2: // AutocompleteSearchResultType.QuickLink
                        type.text('Quicklink');
                        break;
                    case 3: // AutocompleteSearchResultType.Member
                        type.text('Type' in item ? (item.Type || '') : 'Member');
                        if (item.WebParticipation >= 30) // WebParticipation.Gold
                            link.addClass('mn-autocomplete-membergold');
                        break;
                }

                return $('<li></li>')
                    .data('item.autocomplete', item)
                    .append(link)
                    .appendTo(ul);
            };
        }
    };

    function getMapContentBasic(info) {
        var mapMember = $('<div class="mn-map-member"></div>'),
            mapInfo = $('<div class="mn-map-info"></div>').appendTo(mapMember);

        if (info.Name)
            $('<div class="mn-map-title"></div>').text(info.Name).appendTo(mapInfo);

        if (info.Address)
            $('<div class="mn-map-address"></div>').text(info.Address).appendTo(mapInfo);

        if (info.City || info.State || info.Zip) {
            var cszElement = $('<div class="mn-map-citystatezip"></div>').appendTo(mapInfo);

            if (info.City)
                $('<span class="mn-map-cityspan"></span>').text(info.City).appendTo(cszElement);

            if (info.City && info.State)
                $('<span class="mn-map-commaspan"></span>').text(', ').appendTo(cszElement);

            if (info.State)
                $('<span class="mn-map-stspan"></span>').text(info.State).appendTo(cszElement);

            if (info.Zip && (info.City || info.State))
                cszElement.append(document.createTextNode(' '));

            if (info.Zip)
                $('<span class="mn-map-zipspan"></span>').text(info.Zip).appendTo(cszElement);
        }

        if (info.Phone)
            $('<div class="mn-map-phone"></div>').text(info.Phone).appendTo(mapInfo);

        $('<div class="mn-clear"></div>').appendTo(mapMember);

        return mapMember[0];
    };

    function createMapDialog(memid, title) {

        var self = this,
            data = self._mapData;

        if (!data.isInitialized) {
            var container = $('<div></div>').attr('id', 'mn-dialog-member-map').height(400).addClass('mn-reset');
            data.dialog = $('<div></div>').append(container);

            data.mapObj = new google.maps.Map(container[0], {
                mapTypeId: google.maps.MapTypeId.ROADMAP,
                scaleControl: true,
                minZoom: 5,
                zoom: 8
            });

            data.dialog.dialog({
                title: name,
                width: 600,
                resizable: false
            });

            data.isInitialized = true;
        }

        if (data.marker) {
            data.marker.setMap(null);
            data.marker = null;
        }

        if (data.infoWindow) {
            data.infoWindow.setMap(null);
            data.infoWindow = null;
        }

        data.dialog.dialog({ title: title });

        $.getJSON(MNI.BaseUrl + paths.GeoInfoForMapMembers(), { memId: memid }, function (results) {
            var info = results[0],
                point = new google.maps.LatLng(info.Lat, info.Lon);

            data.marker = new google.maps.Marker({
                map: data.mapObj,
                position: point,
                title: title,
                icon: MNI.BaseUrl + '/Content/Images/map/greenpin.png'
            });

            google.maps.event.addListener(data.marker, 'click', function () {
                function openInfoWindow(content) {
                    if (!data.infoWindow) {
                        data.infoWindow = new google.maps.InfoWindow({
                            content: content,
                            maxWidth: 350
                        });
                    }
                    data.infoWindow.open(data.mapObj, data.marker);
                };

                if (info.Upg) {
                    $.ajax({
                        url: MNI.BaseUrl + MNI.Path.MemberMapPinInfo(memid),
                        success: function (html) {
                            var content = $(html);
                            content.find('.mn-actiondetails').remove();
                            openInfoWindow(content[0]);
                        },
                        error: function () {
                            openInfoWindow(getMapContentBasic(info));
                        }
                    });
                }
                else {
                    openInfoWindow(getMapContentBasic(info));
                }
            });

            data.mapObj.setCenter(point);
            data.mapObj.setZoom(13);
        });
    };

    function contactFriendDialog(url) {
        this._url = url;
    };

    function showSuccess(self) {
        var content = "<p>Your message has been sent to your friend's email address.</p>";
        self._updateButtons(function (buttons) { buttons[1].text = 'Close Window'; buttons.splice(0, 1); });
        self._container.dialog({ position: { 'my': 'center', 'at': 'center' } });
        self._container.html(content);
    }
    function showFailure(self, response) {
        var $stage = $('<div></div>');
        grecaptcha.reset();
        $stage.html(response);
        var $errorBox = self._container.find('.validation-summary-errors');
        if ($errorBox[0]) $errorBox.remove();

        self._container.prepend($stage.find('.validation-summary-errors'));
    }
    $.extend(contactFriendDialog.prototype, {
        open: function () {
            var self = this;

            if (self._container) {
                self._container.dialog('open');
            }
            else {
                $.getJSON(self._url, function (data) {
                    self._container = $('<div id="mn-dialog-contactfriend" class="mn-reset"></div>').append(data['Html']);
                    $.getScript("https://www.google.com/recaptcha/api.js");
                    self._container.dialog({
                        title: 'Tell A Friend About ' + data['Title'],
                        dialogClass: 'mn-dialog-contactfriend',
                        autoOpen: false,
                        modal: true,
                        width: 600,
                        buttons: [
                            { text: 'Send to Friend', click: function () { self._onSend.call(self); } },
                            { text: 'Cancel', click: function () { self._onCancel.call(self); } }
                        ]
                    }).dialog('open');
                });
            }
        },
        _onSend: function () {
            var self = this;
            var $form = $("form#mn-info-form");

            waitForGrecaptcha(() => {
                setReCaptchaToken($form, () => {
                    $.ajax({
                        url: self._url,
                        type: 'POST',
                        data: $('form', self._container).serialize()
                    }).then(function (result) {
                        if (result.Success) showSuccess(self);
                        else showFailure(self, result.Html);
                    });
                }, "contactFriend");
            })
      
        },
        _onCancel: function () {
            $(this._container).dialog('close');
        },
        _updateButtons: function (func) {
            var buttons = this._container.dialog('option', 'buttons');
            func(buttons);
            this._container.dialog('option', 'buttons', buttons);
        }
    });

    function createContactFriendDialog(itemType, itemId) {
        var url = MNI.BaseUrl + paths.ContactFriend(itemType, itemId),
            dialog = new contactFriendDialog(url);

        dialog.open();
        if ($('#shareModal')[0] && $('#shareModal').modal) $('#shareModal').modal("hide");
    };

    var dialogs = {
        _mapData: {},
        Map: createMapDialog,
        ContactFriend: createContactFriendDialog
    };

    function stripHash(url) {
        return url && url.replace(/#.*/, '');
    };

    var tabs = {
        _GetHashElement: function (link) {
            if (link.hash && stripHash(location.href) === stripHash(link.href)) {
                return $(link.hash, '#mn-content')[0];
            }
        },
        _OnLinkClick: function (event) {
            var tab = tabs._GetHashElement(this);
            if (tab) {
                event.preventDefault();
                $(tab).trigger('mn-tab-active');
            }
        },
        _InitLink: function () {
            var self = $(this),
                clone = self.clone();

            // Replace original hyperlink with a clone to remove conflicting
            // event handlers attached by several CMS plugins.
            clone.click(tabs._OnLinkClick);
            self.replaceWith(clone);
        },
        Init: function (selector) {
            $('.mn-tabs a', selector).each(tabs._InitLink);

            $(selector).on('mn-tab-active', function (event) {
                var activeClass = 'mn-active',
                    tab = event.target;

                $('.mn-tabs a', this).each(function () {
                    $(this).toggleClass(activeClass, tabs._GetHashElement(this) === tab);
                });
                $(tab).addClass(activeClass).siblings().removeClass(activeClass);
            });
        },
        InitExternal: function (selector) {
            $(selector).each(tabs._InitLink);
        }
    };

    var lightBox = {
        Init: function (selector, options) {
            var imagePath = paths.SEO3Plugins('lightbox/images/'),
                defaultOptions = {
                    imageLoading: imagePath + 'lightbox-ico-loading.gif',
                    imageBtnClose: imagePath + 'lightbox-btn-close.gif',
                    imageBtnPrev: imagePath + 'lightbox-btn-prev.gif',
                    imageBtnNext: imagePath + 'lightbox-btn-next.gif',
                    fixedNavigation: true
                };

            options = $.extend(defaultOptions, options);

            return $(selector).lightBox(options);
        }
    };

    var calendar = {
        Init: $.noop,
        SelectDate: function (element) {
            if (typeof (cultureDateFormat) == 'undefined' || cultureDateFormat == null) { cultureDateFormat = "m/d/yy" }
            $(element).closest('label').find(':text').datepicker({ showOn: '', dateFormat: cultureDateFormat }).datepicker('show');
        }
    };

    var calendar2 = {
        Init: $.noop,
        SelectDate: function (element) {
            $(element).closest('label').find(':text').datepicker({ showOn: '', dateFormat: 'd/m/yy' }).datepicker('show');
        }
    };

    var toggler = {
        Init: function (stateElements, stateSelector) {
            var clientState = $(stateSelector || '#mn-search-clientstate');

            stateElements = stateElements || { undefined: 1 };

            $('.mn-form-toggler a').click(function (event, initialize) {
                event.preventDefault();

                var toggler = $(this).closest('.mn-form-toggler'),
                    togglable = toggler.next('.mn-form-togglable'),
                    flag = stateElements[toggler.attr('id')],
                    stateValue = clientState.val(),
                    newState;

                if (initialize)
                {
                    newState = (stateValue == undefined || stateValue == "") ?
                        togglable.is(':visible') :
                        (stateValue & flag) == flag;
                }
                else
                {
                    newState = !toggler.is('.mn-form-toggler-active');

                    stateValue = newState ?
                        stateValue | flag :
                        stateValue & ~flag;

                    clientState.val(stateValue);
                }

                toggler.toggleClass('mn-form-toggler-active', newState).toggleClass('mn-form-toggler-inactive', !newState);
                togglable.toggleClass('mn-form-togglable-active', newState).toggleClass('mn-form-togglable-inactive', !newState);

            }).trigger('click', [true]);
        }
    };

    var printUrls = {
        Init: function (selector) {
            $(selector).each(function () {
                var self = $(this);

                if (self.is('a'))
                    printUrls._transform(self);
                else
                    self.find('a').each(function () { printUrls._transform(this); });
            });
        },
        _transform: function (element) {
            var self = $(element),
                href = self.attr('href'),
                match,
                text;

            if (href == undefined || !href.length || /^(#|javascript:)/i.test(href))
                return;

            if (match = href.match(/^(mailto|tel):(.*)/i)) {
                var val = match[2].toLowerCase();

                if (match[1].toLowerCase() == 'mailto')
                    val = val.replace(/^([^?]*)\?.*/i, '$1');

                if (self.text().toLowerCase().indexOf(val) < 0)
                    text = val;
            } else
                text = href

            if (text)
                self.append(document.createTextNode(' [' + text + ']'));
        }
    };

    var youTubeRegex = /(^|\/\/)(youtu\.be\/|([^\/]+\.)?youtube\.com\/((watch|embed|[ve])\/|.*?[?&]v=|.*?\/u\/[^\/]+\/))([\w-]+)/i,
        youTubeCallback = 'onYouTubeIframeAPIReady',
        youTubeReady = false,
        sliderCacheIds = [];

    $.fn.mediaSlider = function(opts) {
        opts = $.extend({
            slideshow: false,
            delay: 3000,
            rate: 0.35
        }, opts);

        $(this).each(function() {
            var base = $(this).addClass('mn-mediaslider-base').wrap('<div class="mn-mediaslider"><div class="mn-mediaslider-window"></div></div>'),
                slider = base.closest('.mn-mediaslider'),
                viewer = $('<div class="mn-mediaslider-viewer"></div>').prependTo(slider),
                cache = $('<div class="mn-mediaslider-cache"></div>').prependTo(viewer),
                index = 0,
                direction = 0,
                slideshowTimer,
                waitLock;

            function animateStop()
            {
                direction = 0;
            }

            function animateNext()
            {
                if (base.children().get(index + 1)) {
                    animateTo(++index, function() {
                        if (direction == 1)
                            animateNext();
                    });
                }
            };

            function animatePrev()
            {
                if (index > 0) {
                    animateTo(--index, function() {
                        if (direction == -1)
                            animatePrev();
                    });
                }
            };

            function animateTo(index, callback)
            {
                pause(3);
                var left = -base.children().eq(index).position().left;
                base.animate({ left: left + 'px' }, Math.abs(base.position().left - left) / opts.rate, 'linear', function () {
                    unpause(3);
                    if (callback)
                        callback();
                });
            };

            function pause(lockNo) {
                waitLock |= 1 << lockNo;
                slideshowStop();
            };

            function unpause(lockNo) {
                waitLock &= ~(1 << lockNo);
                slideshowStart();
            };

            function slideshowStart()
            {
                if (waitLock || slideshowTimer)
                    return;

                slideshowTimer = setInterval(function() {
                    var links = $('> *', base),
                        active = links.filter('.mn-mediaslider-selected');

                    index = (links.index(active) + 1) % links.length;
                    animateTo(index);
                    links.eq(index).trigger('click');
                }, opts.delay);
            };

            function slideshowStop()
            {
                if (slideshowTimer)
                    clearInterval(slideshowTimer);

                slideshowTimer = null;
            };

            function initYouTubeAPI() {
                var defer = $.Deferred();

                if (youTubeReady || (window['YT'] && YT.loaded)) {
                    defer.resolve();
                } else {
                    var oldCallback = window[youTubeCallback];

                    window[youTubeCallback] = function () {
                        var self = this,
                            args = arguments;

                        window[youTubeCallback] = oldCallback;
                        youTubeReady = true;
                        defer.resolve();

                        if (oldCallback) {
                            setTimeout(function () {
                                oldCallback.apply(self, args);
                            }, 0);
                        }
                    };

                    $('<script>', { src: 'https://www.youtube.com/iframe_api' }).appendTo('head');
                }

                return defer.promise();
            };

            if (!opts.slideshow)
                pause(0);

            slider.hover(function () {
                pause(1);
            }, function () {
                unpause(1);
            });

            $('<div class="mn-mediaslider-prev"></div>').appendTo(slider).mousedown(function() {
                direction = -1;
                animatePrev();
            }).mouseup(animateStop);

            $('<div class="mn-mediaslider-next"></div>').appendTo(slider).mousedown(function() {
                direction = 1;
                animateNext();
            }).mouseup(animateStop);

            $('> *', base).click(function(e) {
                e.preventDefault();
                var link = $('a', this),
                    img = $('img', link),
                    href = link.attr('href'),
                    youTubeMatch = href.match(youTubeRegex),
                    loadingClass = 'mn-mediaslider-loading',
                    activeClass = 'mn-mediaslider-active';

                viewer.children().not(cache).remove();
                $(this).addClass('mn-mediaslider-selected').siblings().removeClass('mn-mediaslider-selected');
                $(cache).children('.' + activeClass).removeClass(activeClass).each(function () {
                    var player = $(this).data('mniPlayer');
                    if (player)
                        player.pauseVideo();
                });

                var elementId = 'mn-mediaslider-cache-' + ($.inArray(href, sliderCacheIds) + 1 || sliderCacheIds.push(href)),
                    element = $('#' + elementId);

                if (!element[0])
                    element = $('<div>', { id: elementId }).addClass(loadingClass).appendTo(cache);

                if (youTubeMatch)
                {
                    initYouTubeAPI().then(function () {
                        if (element.hasClass(loadingClass)) {
                            var player = new YT.Player(elementId, {
                                height: '100%',
                                width: '100%',
                                videoId: youTubeMatch[6],
                                playerVars: { rel: 0 },
                                events: {
                                    'onStateChange': function (event) {
                                        if (event.data == YT.PlayerState.PLAYING || event.data == YT.PlayerState.BUFFERING)
                                            pause(2);
                                        else
                                            unpause(2);
                                    }
                                }
                            });

                            element = $('#' + elementId).data('mniPlayer', player).addClass('mn-mediaslider-video').removeClass(loadingClass);
                        }

                        element.addClass(activeClass);
                        slider.trigger('mniMediaSlideChanged', [viewer, link, element]);
                    });
                }
                else
                {
                    if (element.hasClass(loadingClass)) {
                        $('<div>')
                            .addClass('mn-mediaslider-center')
                            .append($('<img />', { src: href, title: img.attr('title'), alt: img.attr('alt') }))
                            .appendTo(element);

                        element.addClass('mn-mediaslider-image').removeClass(loadingClass);
                    }

                    element.addClass(activeClass);
                    slider.trigger('mniMediaSlideChanged', [viewer, link, element]);
                }
            }).eq(0).trigger('click');

            slideshowStart();
        });
    };

    $.fn.verifyUrl = function () {
        return $(this).hide().append('[ <a href="#" class="mn-link-arrow" target="_blank">Verify URL</a> ]').each(function () {
            var $this = $(this),
                link = $('a', $this).click(update),
                input = $this.siblings(':text').bind('change keyup keydown keypress', update);

            function update() {
                var url = input.val();

                $this.toggle(!!url);

                if (!url)
                    url = '#';
                else if (url.indexOf('://') < 0)
                    url = 'http://' + url;

                link.attr('href', url);
            };

            update();
        }).end();
    };

    $.fn.ensureSchema = function (opts) {
        opts = $.extend({
            'default': 'http'
        }, opts);

        function update() {
            var $this = $(this),
                url = $this.val();

            if (url && url.indexOf('://') < 0)
                $this.val(opts['default'] + '://' + url).trigger('change');
        }

        return $(this).bind('change blur', update).each(update);
    };

    $.fn.charsRemaining = function () {
        return $(this).each(function () {
            var self = $(this),
                input = self.attr('data-element'),
                html = (self.attr('data-format') || '{0} chars remaining.')
                    .replace('{0}', '<span class="chars-left mn-chars-remaining"></span>'),
                element = $('<div>').html(html),
                counter = $('.chars-left', element);

            input = input ? $('#' + input) : self.next(':input');

            input.bind('keypress keyup keydown change', onchange_update).trigger('change');
            function onchange_update(e) {
                var self = $(this),
                    maxlength = self.attr('maxlength'),
                    remaining = maxlength - self.val().length;

                if (remaining < 0) {
                    counter.text(0);
                }
                else {
                    counter.text(remaining);
                }

                if (remaining < 0 && e.keyCode != 46 && e.keyCode != 8) {
                    e.preventDefault();
                }
            }

            element.contents().appendTo(self);
        });
    };

    $.fn.formatPhoneCountry = function (country) {
        return this.each(function () {
            $(this).bind('blur', function (e) {
                var lowerCountry = $(country).val().toLowerCase();
                var formatted = $(this).val();
                var value = $(this).val();
                var digitsOnly = "";
                var containsText = false;
                if (lowerCountry == null ||
                    lowerCountry == "" ||
                    lowerCountry == "usa" ||
                    lowerCountry == "us" ||
                    lowerCountry == "united states" ||
                    lowerCountry == "united states of america" ||
                    lowerCountry == "canada" ||
                    lowerCountry == "can" ||
                    lowerCountry == "ca") {
                    for (j = 0; j < value.length; j++) {
                        if ((value.substr(j, 1) != "-") && isNumeric(value.substr(j, 1), false, true)) {
                            digitsOnly += value.substr(j, 1);
                        } else if ((value.substr(j, 1) >= 'A' && value.substr(j, 1) <= 'Z') || (value.substr(j, 1) >= 'a' && value.substr(j, 1) <= 'z')) {
                            containsText = true;
                            break;
                        }
                    }
                    if (containsText) {
                        formatted = value;
                    } else if (digitsOnly.length == 7) {
                        formatted = digitsOnly.substr(0, 3) + "-" + digitsOnly.substr(3);
                    } else if (digitsOnly.length == 10) {
                        formatted = "(" + digitsOnly.substr(0, 3) + ") " + digitsOnly.substr(3, 3) + "-" + digitsOnly.substr(6);
                    } else if (digitsOnly.length == 11) {
                        formatted = digitsOnly.substr(0, 1) + "-" + digitsOnly.substr(1, 3) + "-" + digitsOnly.substr(4, 3) + "-" + digitsOnly.substr(7);
                    } else {
                        formatted = value;
                    }
                }
                $(this).val(formatted);
            });
        });
    };

    function mapControl(element) {
        this._element = element;
        this._lat = 39.8333;
        this._lng = -98.5833;
        this._radius = 25;
        this._markerRadius = 1;
        this._items = {};
    };

    $.extend(mapControl.prototype, {
        create: function () {
            var self = this,
                items = self._items,
                mapContainer = $(this._element)[0];

            self._map = new google.maps.Map(mapContainer, {
                mapTypeId: google.maps.MapTypeId.ROADMAP,
                scaleControl: true
            });

            google.maps.event.addListener(self._map, 'click', $.proxy(self.closeWindow, self));

            self._updateCenter(self._lat, self._lng);
            self._updateRadius(self._radius);

            for (var id in items)
                items[id].marker.setMap(self._map);
        },
        setCenter: function (lat, lng) {
            this._lat = lat;
            this._lng = lng;
            this._updateCenter(lat, lng);
        },
        _updateCenter: function (lat, lng) {
            var self = this,
                position = new google.maps.LatLng(lat, lng);

            if (self._map)
                self._map.setCenter(position);
        },
        setRadius: function (radius) {
            this._radius = radius;
            this._updateRadius(radius);
        },
        _updateRadius: function (radius) {
            var self = this,
                circle = new google.maps.Circle();

            if (self._map) {
                circle.setRadius(radius * 1609.0);
                circle.setCenter(self._map.getCenter());

                self._map.fitBounds(circle.getBounds());
            }
        },
        setZoom: function (zoom) {
            var self = this;

            self._zoom = zoom;

            if (self._map)
                self._map.setPosition(self._zoom);
        },
        setMarkerRadius: function (radius) {
            this._markerRadius = radius;
        },
        addMarker: function (id, lat, lng, title, icon, html) {
            var self = this,
                point = new google.maps.LatLng(lat, lng),
                marker = new google.maps.Marker({
                    position: point,
                    title: title,
                    icon: icon
                });

            google.maps.event.addListener(marker, 'click', $.proxy(self.openWindow, self, id));

            self._items[id] = {
                marker: marker,
                html: html
            };

            if (self._map)
                marker.setMap(self._map);
        },
        removeMarker: function(id) {
            var item = this._items[id];

            if (item) {
                item.marker.setMap(null);
                delete this._items[id];
            }
        },
        clearMarkers: function () {
            var self = this;
            for (var id in self._items)
                self.removeMarker(id);
        },
        fitMarkers: function () {
            var self = this,
                bounds = new google.maps.LatLngBounds();

            for (var id in self._items) {
                var circle = new google.maps.Circle();
                circle.setCenter(self._items[id].marker.getPosition());
                circle.setRadius(self._markerRadius * 1609.0);

                bounds.union(circle.getBounds());
            }

            self._map.fitBounds(bounds);
        },
        openWindow: function (id) {
            var self = this,
                item = self._items[id];

            if (item && item.html) {
                if (!item.window) {
                    item.window = new google.maps.InfoWindow({
                        content: $.isFunction(item.html) ? item.html.call(self, id) : item.html,
                        maxWidth: 350
                    });
                }

                if (self._lastWindow && item.window !== self._lastWindow)
                    self._lastWindow.close();

                var bounds = self._map.getBounds(),
                    circle = new google.maps.Circle();

                circle.setCenter(item.marker.getPosition());
                circle.setRadius(self._markerRadius * 1609.0);

                if (self._map.getZoom() < self._getBoundsZoomLevel(circle.getBounds()))
                    self._map.fitBounds(circle.getBounds());
                else
                    self._map.panTo(item.marker.getPosition());

                item.window.open(self._map, item.marker);
                self._lastWindow = item.window;
            }
        },
        closeWindow: function () {
            if (this._lastWindow)
                this._lastWindow.close();
        },
        _getBoundsZoomLevel: function (bounds) {
            var WORLD_DIM = { height: 256, width: 256 },
                ZOOM_MAX = 21;

            function latRad(lat) {
                var sin = Math.sin(lat * Math.PI / 180),
                    radX2 = Math.log((1 + sin) / (1 - sin)) / 2;

                return Math.max(Math.min(radX2, Math.PI), -Math.PI) / 2;
            }

            function zoom(mapPx, worldPx, fraction) {
                return Math.floor(Math.log(mapPx / worldPx / fraction) / Math.LN2);
            }

            var element = $(this._element),
                ne = bounds.getNorthEast(),
                sw = bounds.getSouthWest(),
                latFraction = (latRad(ne.lat()) - latRad(sw.lat())) / Math.PI,
                lngDiff = ne.lng() - sw.lng(),
                lngFraction = ((lngDiff + 360) % 360) / 360;

            return Math.min(
                zoom(element.height(), WORLD_DIM.height, latFraction),
                zoom(element.width(), WORLD_DIM.width, lngFraction),
                ZOOM_MAX);
        }
    });

    function vacancyControl(memberName, vacancyUrl) {
        this._memberName = memberName;
        this._url = vacancyUrl;
    };

    $.extend(vacancyControl.prototype, {
        open: function () {
            var self = this;

            if (self._container) {
                self._container.dialog('open');
            }
            else {
                $.get(self._url, function (data) {
                    self._container = $('<div id="mn-dialog-vacancy" class="mn-reset"></div>').append(data);
                    self._container.dialog({
                        title: 'Vacancy Information - ' + self._memberName,
                        dialogClass: 'mn-dialog-vacancy',
                        autoOpen: false,
                        width: 750
                    }).dialog('open');
                    self._initControls();
                });
            }
        },
        _initControls: function () {
            var self = this,
                today = new Date(),
                minDate = new Date(today.getFullYear(), today.getMonth(), today.getDate()),
                maxDate = new Date(minDate.getFullYear() + 2, minDate.getMonth(), minDate.getDate() - 1);

            $('#mn-availability-date', self._container).datepicker({
                minDate: minDate,
                maxDate: maxDate,
                dateFormat: 'm/d/yy',
                onSelect: function () {
                    self.changeDate($(this).val());
                },
                beforeShow: function () {
                    var self = $(this),
                        dialog = self.closest('.ui-dialog');

                    if (dialog.length) {
                        setTimeout(function () {
                            // Elevate the z-index priority; overriding base stylesheet rule for datepicker.
                            self.datepicker('widget').attr('style', function (_, attr) {
                                var index = parseInt(dialog.css('zIndex')) + 1;
                                return attr + 'z-index:' + index + '!important;'
                            });
                        }, 0);
                    }
                }
            });

            $('.mn-availability-controls a', self._container).click(function () {
                self.changeDate($(this).data('date'));
                return false;
            });
        },
        changeDate: function (date) {
            var self = this;

            $.get(self._url, { date: date }, function (data) {
                self._container.empty().append(data);
                self._initControls();
            });
        }
    });

    /* Relative Time */
    function TimeAgo() {
    };

    $.extend(TimeAgo.prototype, {
        _round: Math.round,
        _thresholds: {
            s: 45,  // seconds to minute
            m: 45,  // minutes to hour
            h: 22,  // hours to day
            d: 26,  // days to month
            M: 11   // months to year
        },
        _formats: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years'
        },
        words: function (current, other) {
            function words(current, other, round, thresholds, formats) {
                var diff = round(other - current),
                    seconds = round(Math.abs(diff) / 1000),
                    minutes = round(seconds / 60),
                    hours = round(minutes / 60),
                    days = round(hours / 24);

                var years = current.getFullYear() - other.getFullYear(),
                    months = (current.getMonth() - other.getMonth()) + (12 * years);

                var data =
                    seconds < thresholds.s && ['s', seconds] ||
                    minutes === 1 && ['m', 1] ||
                    minutes < thresholds.m && ['mm', minutes] ||
                    hours === 1 && ['h', 1] ||
                    hours < thresholds.h && ['hh', hours] ||
                    days === 1 && ['d', 1] ||
                    days < thresholds.d && ['dd', days] ||
                    months === 1 && ['M', 1] ||
                    months < thresholds.M && ['MM', months] ||
                    years === 1 && ['y', 1] ||
                    ['yy', years];

                var format = formats[diff > 0 ? 'future' : 'past'],
                    units = formats[data[0]].replace(/%d/i, data[1]),
                    result = format.replace(/%s/i, units);

                return result;
            };

            var self = this;
            return words(current, other, self._round, self._thresholds, self._formats);
        }
    });

    function formatDate(date, format) {
        /**
        * @param {*} str
        * @param {number=} len
        */
        function pad(str, len) {
            str = String(str);
            for (len = len || 2; str.length < len;)
                str = '0' + str;
            return str;
        };

        function ordinal(day) {
            return (1 == day || 21 == day || 31 == day) ? "st" :
                (2 == day || 22 == day) ? "nd" :
                (3 == day || 23 == day) ? "rd" :
                "th";
        };

        var daysAbbr = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
            daysFull = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
            monthsAbbr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
            monthsFull = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
            designatorAbbr = ['A', 'P'],
            designatorFull = ['AM', 'PM'],
            tokens = /d{1,4}|M{1,4}|y{1,5}|o|"[^"]*"|'[^']*'|[hHmst]{1,2}/g,
            day = date.getDate(),
            weekDay = date.getDay(),
            month = date.getMonth(),
            year = date.getFullYear(),
            hours = date.getHours(),
            minutes = date.getMinutes(),
            seconds = date.getSeconds(),
            pattern = {
                d: day,
                dd: pad(day),
                ddd: daysAbbr[weekDay],
                dddd: daysFull[weekDay],
                M: month + 1,
                MM: pad(month + 1),
                MMM: monthsAbbr[month],
                MMMM: monthsFull[month],
                y: year,
                yy: pad(year % 100),
                yyy: pad(year % 1E3, 3),
                yyyy: pad(year % 1E4, 4),
                yyyyy: pad(year % 1E5, 5),
                o: ordinal(day),
                h: ((hours + 12) % 12) || 12,
                hh: pad(((hours + 12) % 12) || 12),
                H: hours,
                HH: pad(hours),
                m: minutes,
                mm: pad(minutes),
                s: seconds,
                ss: pad(seconds),
                t: designatorAbbr[hours < 12 ? 0 : 1],
                tt: designatorFull[hours < 12 ? 0 : 1]
            };

        return format.replace(tokens, function (segment) {
            return segment in pattern ? pattern[segment] : segment.slice(1, segment.length - 1);
        });
    };

    function CollectionPoller(fn, interval) {
        var self = this;

        self._fn = fn;
        self._interval = interval;
        self._items = [];
        self._timeout = null;
    };

    $.extend(CollectionPoller.prototype, {
        add: function (item) {
            var self = this,
                items = self._items;

            items.push(item);

            if (items.length) {
                self._enable();
            }
        },
        remove: function (item) {
            var self = this,
                items = self._items,
                index = items.indexOf(item);

            if (index >= 0) {
                items.splice(index, 1);

                if (!items.length) {
                    self._disable();
                }
            }
        },
        _enable: function () {
            var self = this;

            if (!self._timeout) {
                self._timeout = setTimeout($.proxy(self._tick, self), self._interval);
            }
        },
        _disable: function () {
            var self = this;

            if (self._timeout) {
                clearTimeout(self._timeout);
                self._timeout = null;
            }
        },
        _tick: function () {
            var self = this,
                caught = [];

            self._disable();

            $.each(self._items, function () {
                var item = this;
                try {
                    self._fn.call(item);
                } catch (ex) {
                    caught.push(item);
                }
            });

            $.each(caught, function () {
                self.remove(this);
            });

            self._enable();
        }
    });

    var timeAgoPoller = new CollectionPoller(function () {
        this.update();
    }, 10000);

    var timeAgoFunctions = {
        init: function (opts) {
            var self = $(this),
                timeAgo = new TimeAgo(),
                date = new Date(self.attr('datetime')),
                origText = self.text();

            var updateFn = function () {
                var data = this,
                    now = new Date();

                var absoluteFormat =
                    now.getFullYear() !== date.getFullYear() && opts.dateFormat ||
                    (now.getMonth() !== date.getMonth() || now.getDate() !== date.getDate()) && opts.monthFormat ||
                    opts.timeFormat;

                var text = formatDate(date, absoluteFormat)
                    + ' (' + timeAgo.words(now, date) + ')';

                if (data.lastText !== text) {
                    self.text(text);
                    data.lastText = text;
                }
            };

            var title = opts.titleFormat && formatDate(date, opts.titleFormat) || origText,
                data = { update: updateFn };

            self.attr('title', title).data('timeAgo', data);

            data.update();
            timeAgoPoller.add(data);
        },
        refresh: function() {
            var self = $(this),
                data = self.data('timeAgo');

            if (data) {
                data.update();
            }
        },
        dispose: function () {
            var self = $(this),
                data = self.data('timeAgo');

            if (data) {
                timeAgoPoller.remove(data);
                self.removeData('timeAgo');
            }
        }
    };

    $.fn.timeAgo = function (action, opts) {
        var fn = timeAgoFunctions[action];

        if (!fn) {
            fn = timeAgoFunctions.init;
            opts = action;
        }

        return this.each(function () {
            fn.call(this, opts);
        });
    };

    var plugins = {
        AutoComplete: autoComplete,
        Tabs: tabs,
        LightBox: lightBox,
        Calendar: calendar,
        Calendar2 : calendar2,
        Toggler: toggler,
        PrintUrls: printUrls,
        Map: mapControl,
        Vacancy: vacancyControl
    };

    // Assignment to the MicroNet namespace

    window['MNI'] = $.extend(window.MNI || {}, {
        Hit: hitStats,
        Path: paths,
        Plugins: plugins,
        Window: windows,
        Dialog: dialogs
    });

    $.extend(MNI, {
        getDateFormat: function () {
            return (MNI.CultureDateFormat || 'm/d/yy').replace('yyyy', 'yy').replace("M", "m").replace("mM", "m");
        },
        PreventDuplicateSubmission: function (formSelector) {
            preventDuplicateSubmissions(formSelector);
        },
        openNewWindow: openNewWindow,
        redirectTo: redirectTo,
        logHitStat: logHitStat
    });

})(MNI.jQuery);

// Optional feature for associations that choose to hide field names of
// textboxes. Input elements marked as placeholders will use its title value
// as placeholder text while its value is empty. Native support is used if
// HTML5 is supported by the browser
MNI.jQuery(function ($) {
    var test = document.createElement('input'),
        selector = '.mn-placeholder[title]',
        activeClass = 'mn-placeholder-active',
        elements = $(selector).not('#mn-directory-list #mn-search-keyword :text');

    function hideTitle() {
        var $this = $(this);

        if ($this.val() == $this.attr('title'))
            $this.removeClass(activeClass).val('');
    };

    function showTitle() {
        var $this = $(this);

        if (!$this.val())
            $this.addClass(activeClass).val($this.attr('title'));
    };

    // Use HTML5 placeholder feature, if the browser supports it. Otherwise
    // fallback to using manual JavaScript and events.
    if ('placeholder' in test) {
        elements.each(function () {
            var $this = $(this);
            $this.attr('placeholder', $this.attr('title'));
        });
    } else {
        $(selector).focus(hideTitle).blur(showTitle).each(showTitle);

        $('#mn-content form').submit(function () {
            $(selector, this).each(hideTitle);
        });
    }
});
;
