if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (elt /*, from*/) {
        var len = this.length;

        var from = Number(arguments[1]) || 0;
        from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
        if (from < 0)
            from += len;

        for (; from < len; from++) {
            if (from in this &&
          this[from] === elt)
                return from;
        }
        return -1;
    };
}

(function ($) {
    $.common = {
        options: {},
        loadingDialog: {},
        _init: function (options) {
            this.options = $.extend({}, $.defaults, options);
            this.loadingDialog = $(this.options.loadingDialogSelector).dialog({
                modal: true,
                height: 150,
                width: 375,
                autoOpen: false,
                draggable: false,
                closeOnEscape: false,
                dialogClass: "no-title"
            });

            $('button,.button,input[type=submit]').button();
//            $('.buttonset').buttonset();

            $('select.language').each(function () {
                $(this).change(function () {
                    window.location.href = $(this).val();
                });
            });

            $('input[type=checkbox]').addClass('checkbox');
            $('input[type=radio]').addClass('radio');
            $('input[type=submit]').addClass('button');
            $("#myMenu").dialog({
                autoOpen: false,
                position: ['right', 30]
            });
            $("#myMenuButton").click(function () {
                if ($("#myMenu").dialog("isOpen")) {
                    $("#myMenu").dialog("close");
                } else {
                    $("#myMenu").dialog("open");
                }
                return false;
            });

        },

        populateLocations: function (select, locations) {


        },

        ajaxPost: function (url, data, callback) {
            var $this = this;
            $.ajax({
                type: 'POST',
                dataType: 'json',
                data: data,
                url: url,
                success: function (obj) {
                    if ($.isFunction(callback))
                        callback(obj);
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    $this.closeLoadingModal();
                    $this.openErrorHappenedDialog(xhr.statusText);
                }
            });
        },

        //////////////////////////////////////////////////////////
        // common validation methods
        //////////////////////////////////////////////////////////
        validateRequired: function (control, message) {
            var $this = this;
            var valid = true;
            $(control).each(function () {
                $.validity.start();
                $(this).require(" "); // pass in empty message, we're using the tooltip. 
                var result = $.validity.end();

                if (!result.valid) { // no? open a tooltip.
                    $(this).select();
                    $this.openErrorMessage($(this), message);
                }
                valid = result.valid;
                return result.valid;
            });
            return valid;
        },

        validateExactLength: function (control, length, message) {
            var $this = this;
            var valid = false;
            $(control).each(function () {
                valid = $(this).val().length == length;
                if (!valid) { // no? open a tooltip.
                    $(this).select();
                    $this.openErrorMessage(this, message);
                }
                if (!valid) return false;
            });
            return valid;
        },

        validateRoutingNumber: function (control, message) {
            var $this = this;
            var valid = false;
            $(control).each(function () {
                var s = $(this).val();
                var i, n, t;
                // First, remove any non-numeric characters.
                t = "";
                for (i = 0; i < s.length; i++) {
                    c = parseInt(s.charAt(i), 10);
                    if (c >= 0 && c <= 9)
                        t = t + c;
                }
                // Check the length, it should be nine digits.
                if (t.length != 9) {
                    valid = false;
                    $(this).select();
                    $this.openErrorMessage(this, message);
                } else {
                    // Now run through each digit and calculate the total.
                    n = 0;
                    for (i = 0; i < t.length; i += 3) {
                        n += parseInt(t.charAt(i), 10) * 3
                      + parseInt(t.charAt(i + 1), 10) * 7
                      + parseInt(t.charAt(i + 2), 10);
                    }
                    // If the resulting sum is an even multiple of ten (but not zero),
                    // the aba routing number is good.
                    if (n != 0 && n % 10 == 0)
                        valid = true;
                    else {
                        valid = false;
                        $(this).select();
                        $this.openErrorMessage(this, message);
                    }
                }
            });
            return valid;
        },

        validate: function (type, control, message) {
            var $this = this;
            var valid = false;
            $(control).each(function () {
                $.validity.start();
                $(this).match(type, " "); // pass in empty message, we're using the tooltip. 
                var result = $.validity.end();

                if (!result.valid) { // no? open a tooltip.
                    $(this).select();
                    $this.openErrorMessage(this, message);
                }
                valid = result.valid;
                if (!valid) return false;
            });
            return valid;
        },

        getIndividualAddress: function (instanceId, form) {
            $this = this;

            $this.loadingDialog.dialog("open");
            $this.setLoadingStatus("Fetching address...");

            $.cmsajax.getIndividualAddress(instanceId, function (individualAddress) {
                if (individualAddress) {
                    $(form).find("input[name$=.Address.Line1]").val(individualAddress.Address1);
                    $(form).find("input[name$=.Address.Line2]").val(individualAddress.Address2);
                    $(form).find("input[name$=.Address.City]").val(individualAddress.City);
                    $(form).find("select[name$=.Address.State] option[value='" + individualAddress.State + "']").attr('selected', true);
                    $(form).find("input[name$=.Address.Zip]").val(individualAddress.Zip);
                }
            });
            $this.loadingDialog.dialog("close");
        },

        validateAddress: function (form, callback) {
            var $this = this;

            var address = {
                Id: 0,
                Address1: $(form).find("input[name$=.Address.Line1]").val(),
                Address2: $(form).find("input[name$=.Address.Line2]").val(),
                City: $(form).find("input[name$=.Address.City]").val(),
                State: $(form).find("select[name$=.Address.State]").val(),
                Zip: $(form).find("input[name$=.Address.Zip]").val()
            };

            var add = $.cmsajax.validateAddress(address);

            var validatedAddress = null;
            if (add.length > 0) {
                validatedAddress = eval('(' + add + ')');
            }

            if (validatedAddress == null) {
                $.common.openDecisionDialog($("<div>Unable to validate address.<br />Please try again."), "Cannot Validate Address", function () {
                    return false;
                }, 400, 250);
            } else {

                var html = validatedAddress.Address1 + "<br />";
                html += validatedAddress.Address2 + "<br />";
                html += validatedAddress.City + "<br />";
                html += validatedAddress.State + "<br />";
                html += validatedAddress.Zip + "<br />";

                $this.openDecisionDialog($("<div id='dlgAddressChoice'><input type='checkbox' id='useRecommended' checked onclick=\"$('#useMyAddress').attr('checked', false);\" /> Use recommended address?<div style='margin-left: 20px;'>" + html +
                    "</div><br /><div><input type='checkbox' id='useMyAddress' onclick=\"$('#useRecommended').attr('checked', false);\">Reenter Address.</a></div></div>"),
                    "Validate Address", function () {
                        if ($("#useRecommended:checked").length > 0) {
                            $(form).find("input[name$=.Address.Line1]").val(validatedAddress.Address2);
                            $(form).find("input[name$=.Address.Line2]").val("");
                            $(form).find("input[name$=.Address.City]").val(validatedAddress.City);
                            $(form).find("select[name$=.Address.State] option[value='" + validatedAddress.State + "']").attr('selected', true);
                            $(form).find("input[name$=.Address.Zip]").val(validatedAddress.Zip);
                            $(form).find("input[name$=.Address.Validated]").val("1");

                            callback(true);
                        }
                        else {
                            return false;
                        }
                    }, 400, 250);

            }


            //            $.cmsajax.validateAddress(address, function (validatedAddress) {
            //                if (validatedAddress == null) {
            //                    $.common.openDecisionDialog($("<div>Unable to validate address.<br />Please try again."), "Cannot Validate Address", function () {
            //                        return false;
            //                    }, 400, 250);
            //                }

            //                var html = validatedAddress.Address1 + "<br />";
            //                html += validatedAddress.Address2 + "<br />";
            //                html += validatedAddress.City + "<br />";
            //                html += validatedAddress.State + "<br />";
            //                html += validatedAddress.Zip + "<br />";

            //                $.common.openDecisionDialog($("<div id='dlgAddressChoice'><input type='checkbox' id='useRecommended' checked onclick=\"$('#useMyAddress').attr('checked', false);\" /> Use recommended address?<div style='margin-left: 20px;'>" + html +
            //                    "</div><br /><div><input type='checkbox' id='useMyAddress' onclick=\"$('#useRecommended').attr('checked', false);\">Reenter Address.</a></div></div>"),
            //                    "Validate Address", function () {
            //                        if ($("#useRecommended:checked").length > 0) {
            //                            $(form).find("input[name$=.Address.Line1]").val(validatedAddress.Address2);
            //                            $(form).find("input[name$=.Address.Line2]").val("");
            //                            $(form).find("input[name$=.Address.City]").val(validatedAddress.City);
            //                            $(form).find("select[name$=.Address.State] option[value='" + validatedAddress.State + "']").attr('selected', true);
            //                            $(form).find("input[name$=.Address.Zip]").val(validatedAddress.Zip);
            //                            $(form).find("input[name$=.Address.Validated]").val("1");

            //                            submitForm();
            //                        }
            //                        else {
            //                            return false;
            //                        }
            //                    }, 400, 250);
            //            });
        },

        validateUrl: function (control, message) {
            var $this = this;
            return $this.validate("url", control, message);
        },

        validateZip: function (control, message) {
            var $this = this;
            return $this.validate("zip", control, message);
        },

        validateUsd: function (control, message) {
            var $this = this;
            return $this.validate("usd", control, message);
        },

        validateDate: function (control, message) {
            var $this = this;
            return $this.validate("date", control, message);
        },

        validateEmail: function (control, message) {
            var $this = this;
            return $this.validate("email", control, message);
        },

        validateNumber: function (control, message) {
            return this.validate("number", control, message);
        },

        validateSame: function (control, message) {
            var $this = this;
            $.validity.start();
            $(control).equal("");
            var result = $.validity.end();

            if (!result.valid) { // no? open a tooltip.
                $(control).select();
                $this.openErrorMessage(control[1], message);
            }
            return result.valid;
        },
        //////////////////////////////////////////////////////////
        // end common validation methods
        //////////////////////////////////////////////////////////

        //////////////////////////////////////////////////////////
        // open and close dialogs functionality
        //////////////////////////////////////////////////////////
        openFormDialog: function (control, title, createCallback, width, height) {
            $(control).dialog({
                modal: true, title: title, height: height || 350, width: width || 350,
                draggable: true, resizable: true, closeOnEscape: true,
                buttons: {
                    'Save': function () { if ($.isFunction(createCallback)) { createCallback(this); } },
                    Cancel: function () { $(this).dialog('close'); }
                }
            });
        },

        openDecisionDialog: function (control, title, callback, width, height) {
            $(control).dialog({
                modal: true, title: title, height: height || 250, width: width || 350,
                draggable: true, resizable: true, closeOnEscape: true,
                buttons: {
                    'Ok': function () { callback(this); $(this).dialog('close'); },
                    Cancel: function () { $(this).dialog('close'); }
                }
            });
        },

        openErrorHappenedDialog: function (msg) {
            $($('<div><h2>Error!</h2><div class="greySep5" /><p>' + msg + '</p></div>')).dialog({
                modal: true, title: "An Error Has Occurred.", height: 250, width: 350,
                draggable: false, resizable: false, closeOnEscape: true,
                buttons: {
                    'Ok': function () { $(this).dialog('close'); }
                }
            });
        },

        closeFormDialog: function (form) {
            $(form).dialog('close');
        },

        openModalDialog: function (control, title, width, height, callback) {
            $(control).dialog({
                modal: true, title: title, height: height || 350, width: width || 350,
                draggable: true, resizable: true, closeOnEscape: true,
                buttons: {
                    Close: function () {
                        $(this).dialog('close');
                        if ($.isFunction(callback)) {
                            callback($(control));
                        }
                    }
                }
            });
        },

        openErrorMessage: function (control, message) {

            $(control).qtip({
                content: message,
                position: {
                    corner: {
                        target: 'rightMiddle',
                        tooltip: 'leftMiddle'
                    }
                },
                style: {
                    title: { 'font-family:': 'Verdana', 'font-size': '8pt', 'color': '#999' },
                    width: 125,
                    border: { width: 1, radius: 3 },
                    padding: 5,
                    background: '#eee',
                    textAlign: 'left',
                    tip: 'leftMiddle', // Give it a speech bubble tip with automatic corner detection
                    name: 'red'
                },
                show: {
                    when: false, // Don't specify a show event
                    ready: true // Show the tooltip when ready
                },
                hide: {
                    when: "unfocus"
                }
            });
        },

        openLoadingModal: function (message) {
            var $this = this;
            // -- open the loading dialog to give people something to look at while waiting... 
            // -- the idea is the loading dialog will report back whatever is going on, as visual status to the user
            // -- just in case a spinning gif isn't enough.
            $this.loadingDialog.dialog("open");
            // -- set the status for people to know whats going on
            $this.setLoadingStatus(message);
        },

        setLoadingStatus: function (message) {
            var $this = this;
            $($this.options.loadingStatusSelector).text(message);
        },

        closeLoadingModal: function () {
            var $this = this;
            $this.loadingDialog.dialog("close");
        },
        //////////////////////////////////////////////////////////
        // end open and close dialogs functionality
        //////////////////////////////////////////////////////////

        objectInArray: function (obj, itemSelector, arr) {
            for (var i = 0; i < arr.length; i++) {
                if (obj[itemSelector] == arr[i][itemSelector])
                    return true;
            }
            return false;
        },
        stringInArray: function (str, arr) {
            for (var i = 0; i < arr.length; i++) {
                if (str == arr[i])
                    return true;
            }
            return false;
        },
        dateDeserialize: function (dateStr) {
            try {
                return eval('new' + dateStr.replace(/\//g, ' '));
            } catch (err) {
                return null;
            }

        },
        dateTimeFriendly: function (dateStr) {
            var dt = this.dateDeserialize(dateStr);
            if (dt != null)
                return (dt.getMonth() + 1) + '/' +
                    dt.getDate() + '/' +
                    dt.getFullYear() + ' ' +
                    (dt.getHours() == 0 ? "12" :
                        (dt.getHours() > 12 ? dt.getHours() - 12 : dt.getHours())
                    ) + ":"
                    + (dt.getMinutes() < 10 ? "0" + dt.getMinutes() : dt.getMinutes()) + " " +
                    (dt.getHours() > 12 ? "pm" : "am");

            else return "";

        },
        dateFriendly: function (dateStr) {
            var dt = this.dateDeserialize(dateStr);
            if (dt != null)
                return (dt.getMonth() + 1) + '/' + dt.getDate() + '/' + dt.getFullYear();
            else return "";
        },
        padNumber: function (num) {
            var strNum = num.toString();
            return (strNum.length < 2 ? "0" + strNum : strNum);
        },
        getDatepickerText: function (dateObj) {
            if (dateObj == null)
                return "–";
            return this.padNumber(dateObj.getMonth() + 1) + "/" +
                this.padNumber(dateObj.getDate()) + "/" +
                    dateObj.getFullYear();
        },
        createDocumentUploadForm: function (urlOverride, data, icid, category, callback, hideExpires) {
            if (hideExpires == null) hideExpires = false;
            // type can be insurance or enrollment
            var $this = this;
            var form = $('<div></div>');
            form.append('<h2>Upload New ' + category + ' Document</h2><div class="greySep5"></div>');
            form.append('<div class="form clearfix">' + (hideExpires ? '' :
                ('<div class="fieldSmall">Expiry <span class="info">(optional)</span>: </div>' +
                    '<div class="valueSmall"><input class="expiry date" type="text" /></div>')
                    ) +
                    '<div class="fieldSmall"></div>' +
                    '<div class="valueSmall" style="max-height: 45px;">' +
                    '   <div style="vertical-align: top;" id="uploadDocumentModalWrapper"><div style="margin-top: 0"><a href="javascript:" class="actionLink">Select file and upload</a></div></div>' +
                    '</div>' +
                '</div>');

            $(form).dialog({
                modal: true,
                title: "Upload Document", height: 260, width: 400,
                draggable: true, resizable: true, closeOnEscape: true,
                buttons: {
                    Close: function () {
                        $(form).dialog('destroy');
                    }
                },
                open: function (event, ui) {
                    $(form).find('input.expiry').click(function () {
                        $(this).datepicker();
                        $(this).datepicker('show');
                    });

                    var uploader = new qq.FileUploaderBasic({
                        // pass the dom node (ex. $(selector)[0] for jQuery users)
                        element: $(form).find('#uploadDocumentModalWrapper')[0], //document.getElementById('file-uploader'),
                        button: $(form).find('#uploadDocumentModalWrapper')[0], // path to server-side upload script
                        action: urlOverride || '/ICPortal/ICHome/UploadDocument',  //'/server/upload'\
                        //params : {
                        //    icid: icid,
                        //    category: category,
                        //    expires: form.find('input.expiry').datepicker('getDate')
                        //  },
                        onSubmit: function (id, filename) {
                            var d = data || {
                                icid: icid,
                                category: category
                            };
                            if (!hideExpires && form.find('input.expiry').datepicker('getDate') != null)
                                d.expires = form.find('input.expiry').val();
                            uploader.setParams(d);
                            $this.openLoadingModal("Uploading... ");

                            //                    $(form).remove();
                        },
                        onComplete: function (id, fileName, responseJSON) {
                            //                            alert(responseJSON);
                            if ($.isFunction(callback)) {
                                callback(responseJSON);
                            }
                            $(form).dialog('destroy');
                            $this.closeLoadingModal();
                        }
                    });

                },
                close: function (event, ui) {
                    $(form).find('input.expiry').datepicker('destroy');
                    $(form).dialog('destroy');
                }
            });

        },

        openManageBreachConditionsForm: function (docId, docName) {

            var $this = this;

            var $f = $('<div class="breachConditionsManagement">' +
                    '<div class="right">' +
                        '<a href="javascript:" class="addNewCondition actionLink">Add New Breach Condition</a>' +
                    '</div>' +
                    '<div class="loading breachConditions"></div>' +
                '</div>');

            $.common.openModalDialog($f, "Manage Breach Conditions for " + docName, 620, 400);

            $.cmsajax.getBreachConditions(docId, function (breachConditions) {
                $this.populateBreachConditions($f, breachConditions);
            });

            $f.find('.addNewCondition').unbind().click(function () {
                $this.openBreachDialog(docId, docName, $f);
            });
        },

        openBreachDialog: function (docId, docName, $f) {
            var $this = this;
            $('#breachConditionDlg').find('input[value=NotificationDiscussionResolution]').attr('checked', true);
            $('#breachConditionDlg').find('.resolution').parent().buttonset();

            $this.openFormDialog($('#breachConditionDlg'), "Create Breach Condition for " + docName, function (form) {

                if ($this.validateBreachCondition(form)) {
                    var $cond = $this.getBreachConditionObject(form);
                    $cond.DocumentId = docId;
                    $.cmsajax.saveBreachCondition($cond, function () {

                        $this.clearBreachConditionForm(form);

                        $f.find('.breachConditions').empty().addClass('loading');

                        $.cmsajax.getBreachConditions(docId, function (breachConditions) {
                            $this.populateBreachConditions($f, breachConditions);
                        });

                        $this.closeFormDialog(form);

                    });
                }
            }, 650, 360);
        },

        populateBreachConditions: function (form, conditions) {
            form.find('.breachConditions').empty().removeClass('loading');
            if (conditions.length < 1) {
                form.find('.breachConditions').html('No conditions have been created yet for this document.');
            } else {
                var table = $('<table width="580" cellpadding="0" cellspacing="5"></table>');
                table.append('<tr><td><h3>Description</h3></td><td><h3>Resolution Action</h3></td></tr>');
                $(conditions).each(function (idx, condition) {
                    table.append($('<tr><td colspan="2"><div class="greySep5" /></td></tr>'));
                    table.append($('<tr class="breachItem"><td><a href="javascript:" bid="' + condition.Id + '">' + condition.Description + '</a></td><td>' + (condition.ResolutionAction == 0 ? "Immediate Termination" : "Notification, Discussion, And Resolution") + '</td></tr>'));
                    table.find('a[bid=' + condition.Id + ']').unbind().click(function () {
                        $.common.openModalDialog($('<div><div>' + condition.Description + '</div><div class="greySep5"></div><div>' + condition.DocumentClause + '</div></div>'), "Breach Conditions", 600, 400);
                    });
                });
                form.find('.breachConditions').append(table);
            }
        },

        validateBreachCondition: function (form) {
            var valid = $.common.validateRequired($(form).find('.description'), "Description is required.");
            if (valid) valid = $.common.validateRequired($(form).find('.clause'), "Document Clause is required.");
            if (valid) valid = $.common.validateRequired($(form).find('input[name=action]'), "Resolution Action is required.");
            return valid;
        },

        clearBreachConditionForm: function (form) {
            $(form).find('.description').val('');
            $(form).find('.clause').val('');
            $(form).find('.resolution').attr('checked', false);
        },

        getBreachConditionObject: function (form) {
            return {
                Description: $(form).find('.description').val(),
                DocumentClause: $(form).find('.clause').val(),
                ResolutionAction: $(form).find('.resolution:checked').val()
            }
        }
    };



    $.defaults = {
        languageselector: '#language', loadingDialogSelector: '#loadingDialog'
    };

})(jQuery);

String.prototype.beginsWith = function(t, i) {
    if (!i) {
        return (t == this.substring(0, t.length));
    } else {
        return (t.toLowerCase() == this.substring(0, t.length).toLowerCase());
    }
};

String.prototype.endsWith = function(t, i) { 
	if (!i) {
		return (t == this.substring(this.length - t.length)); 
	} else { 
		return (t.toLowerCase() == this.substring(this.length - t.length).toLowerCase()); 
	} 
};

(function($) {
		$.widget("ui.combobox", {
			_create: function() {
				var self = this;
				var select = this.element.hide();
				var input = $("<input>")
					.insertAfter(select)
					.autocomplete({
						source: function(request, response) {
							var matcher = new RegExp(request.term, "i");
							response(select.children("option").map(function() {
								var text = $(this).text();
								if (this.value && (!request.term || matcher.test(text)))
									return {
										id: this.value,
										label: text.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + $.ui.autocomplete.escapeRegex(request.term) + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>"),
										value: text
									};
							}));
						},
						delay: 0,
						change: function(event, ui) {
							if (!ui.item) {
								// remove invalid value, as it didn't match anything
								$(this).val("");
								return false;
							}
							select.val(ui.item.id);
							self._trigger("selected", event, {
								item: select.find("[value='" + ui.item.id + "']")
							});

						},
						minLength: 0
					})
					.addClass("ui-widget ui-widget-content ui-corner-left");
				$("<button>&nbsp;</button>")
				.attr("tabIndex", -1)
				.attr("title", "Show All Items")
				.insertAfter(input)
				.button({
					icons: {
						primary: "ui-icon-triangle-1-s"
					},
					text: false
				}).removeClass("ui-corner-all")
				.addClass("ui-corner-right ui-button-icon")
				.click(function() {
					// close if already visible
					if (input.autocomplete("widget").is(":visible")) {
						input.autocomplete("close");
						return;
					}
					// pass empty string as value to search for, displaying all results
					input.autocomplete("search", "");
					input.focus();
				});
			}
		});

	})(jQuery);


(function($) {
  $.fluid =
  {
    fluidGrid: function(options)
    {
      var grid = $(this);
      var settings = $.extend(
                        {
                          example: grid.closest('.ui-jqgrid').parent(),
                          offset: 0
                        }, options || {});

      var width = $(settings.example).innerWidth() + settings.offset;
      var height = $(settings.example).innerHeight() + settings.offset;
      grid.setGridWidth(width);
      grid.setGridHeight(height);
    }
  }
})(jQuery);
$.fn.extend({ fluidGrid : $.fluid.fluidGrid });

/*
 * timeago: a jQuery plugin, version: 0.8.2 (2010-02-16)
 * @requires jQuery v1.2.3 or later
 *
 * Timeago is a jQuery plugin that makes it easy to support automatically
 * updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
 *
 * For usage and examples, visit:
 * http://timeago.yarp.com/
 *
 * Licensed under the MIT:
 * http://www.opensource.org/licenses/mit-license.php
 *
 * Copyright (c) 2008-2010, Ryan McGeary (ryanonjavascript -[at]- mcgeary [*dot*] org)
 */
(function($) {
  $.timeago = function(timestamp) {
    if (timestamp instanceof Date) return inWords(timestamp);
    else if (typeof timestamp == "string") return inWords($.timeago.parse(timestamp));
    else return inWords($.timeago.datetime(timestamp));
  };
  var $t = $.timeago;

  $.extend($.timeago, {
    settings: {
      refreshMillis: 60000,
      allowFuture: false,
      strings: {
        prefixAgo: null,
        prefixFromNow: null,
        suffixAgo: "ago",
        suffixFromNow: "from now",
        ago: null, // DEPRECATED, use suffixAgo
        fromNow: null, // DEPRECATED, use suffixFromNow
        seconds: "less than a minute",
        minute: "about a minute",
        minutes: "%d minutes",
        hour: "about an hour",
        hours: "about %d hours",
        day: "a day",
        days: "%d days",
        month: "about a month",
        months: "%d months",
        year: "about a year",
        years: "%d years"
      }
    },
    inWords: function(distanceMillis) {
      var $l = this.settings.strings;
      var prefix = $l.prefixAgo;
      var suffix = $l.suffixAgo || $l.ago;
      if (this.settings.allowFuture) {
        if (distanceMillis < 0) {
          prefix = $l.prefixFromNow;
          suffix = $l.suffixFromNow || $l.fromNow;
        }
        distanceMillis = Math.abs(distanceMillis);
      }

      var seconds = distanceMillis / 1000;
      var minutes = seconds / 60;
      var hours = minutes / 60;
      var days = hours / 24;
      var years = days / 365;

      var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
        seconds < 90 && substitute($l.minute, 1) ||
        minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||
        minutes < 90 && substitute($l.hour, 1) ||
        hours < 24 && substitute($l.hours, Math.round(hours)) ||
        hours < 48 && substitute($l.day, 1) ||
        days < 30 && substitute($l.days, Math.floor(days)) ||
        days < 60 && substitute($l.month, 1) ||
        days < 365 && substitute($l.months, Math.floor(days / 30)) ||
        years < 2 && substitute($l.year, 1) ||
        substitute($l.years, Math.floor(years));

      return $.trim([prefix, words, suffix].join(" "));
    },
    parse: function(iso8601) {
      var s = $.trim(iso8601);
      s = s.replace(/-/,"/").replace(/-/,"/");
      s = s.replace(/T/," ").replace(/Z/," UTC");
      s = s.replace(/([\+-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
      return new Date(s);
    },
    datetime: function(elem) {
      // jQuery's `is()` doesn't play well with HTML5 in IE
      var isTime = $(elem).get(0).tagName.toLowerCase() == "time"; // $(elem).is("time");
      var iso8601 = isTime ? $(elem).attr("datetime") : $(elem).attr("title");
      return $t.parse(iso8601);
    }
  });

  $.fn.timeago = function() {
    var self = this;
    self.each(refresh);

    var $s = $t.settings;
    if ($s.refreshMillis > 0) {
      setInterval(function() { self.each(refresh); }, $s.refreshMillis);
    }
    return self;
  };

  function refresh() {
    var data = prepareData(this);
    if (!isNaN(data.datetime)) {
      $(this).text(inWords(data.datetime));
    }
    return this;
  }

  function prepareData(element) {
    element = $(element);
    if (!element.data("timeago")) {
      element.data("timeago", { datetime: $t.datetime(element) });
      var text = $.trim(element.text());
      if (text.length > 0) element.attr("title", text);
    }
    return element.data("timeago");
  }

  function inWords(date) {
    return $t.inWords(distance(date));
  }

  function distance(date) {
    return (new Date().getTime() - date.getTime());
  }

  function substitute(stringOrFunction, value) {
    var string = $.isFunction(stringOrFunction) ? stringOrFunction(value) : stringOrFunction;
    return string.replace(/%d/i, value);
  }

  // fix for IE6 suckage
  document.createElement("abbr");
  document.createElement("time");
})(jQuery);



jQuery.fn.anchorAnimate = function (settings) {

    settings = jQuery.extend({
        speed: 1100
    }, settings);

    return $(this).each(function () {
        var caller = this;
        $(caller).click(function (event) {
            event.preventDefault();
            var locationHref = window.location.href;
            var elementClick = $(caller).attr("href");

            var destination = $(elementClick).offset().top;
            $("html:not(:animated),body:not(:animated)").animate({ scrollTop: destination }, settings.speed, function () {
                window.location.hash = elementClick
            });
            return false;
        });
    });
};

(function ($) {
    $.formatCurrency = {}; $.formatCurrency.regions = []; $.formatCurrency.regions[""] = { symbol: "$", positiveFormat: "%s%n", negativeFormat: "(%s%n)", decimalSymbol: ".", digitGroupSymbol: ",", groupDigits: true };
    $.fn.formatCurrency = function (destination, settings) {
        if (arguments.length == 1 && typeof destination !== "string") {
            settings = destination; destination = false
        } var defaults = { name: "formatCurrency", colorize: false, region: "", global: true, roundToDecimalPlace: 2, eventOnDecimalsEntered: false }; defaults = $.extend(defaults, $.formatCurrency.regions[""]);
        settings = $.extend(defaults, settings); if (settings.region.length > 0) { settings = $.extend(settings, getRegionOrCulture(settings.region)) } settings.regex = generateRegex(settings);
        return this.each(function () {
            $this = $(this); var num = "0"; num = $this[$this.is("input, select, textarea") ? "val" : "html"](); if (num.search("\\(") >= 0) {
                num = "-" + num
            } if (num === "") { return } if (isNaN(num)) {
                num = num.replace(settings.regex, ""); if (num === "") { return } if (settings.decimalSymbol != ".") {
                    num = num.replace(settings.decimalSymbol, ".")
                } if (isNaN(num)) { num = "0" }
            } var numParts = String(num).split("."); var isPositive = (num == Math.abs(num)); var hasDecimals = (numParts.length > 1); var decimals = (hasDecimals ? numParts[1].toString() : "0");
            var originalDecimals = decimals; num = Math.abs(numParts[0]); if (settings.roundToDecimalPlace >= 0) {
                decimals = parseFloat("1." + decimals); decimals = decimals.toFixed(settings.roundToDecimalPlace);
                if (decimals.substring(0, 1) == "2") { num = Number(num) + 1 } decimals = decimals.substring(2)
            } num = String(num); if (settings.groupDigits) {
                for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3);
i++) { num = num.substring(0, num.length - (4 * i + 3)) + settings.digitGroupSymbol + num.substring(num.length - (4 * i + 3)) }
            } if ((hasDecimals && settings.roundToDecimalPlace == -1) || settings.roundToDecimalPlace > 0) {
                num += settings.decimalSymbol + decimals
            } var format = isPositive ? settings.positiveFormat : settings.negativeFormat; var money = format.replace(/%s/g, settings.symbol); money = money.replace(/%n/g, num);
            var $destination = $([]); if (!destination) { $destination = $this } else { $destination = $(destination) } $destination[$destination.is("input, select, textarea") ? "val" : "html"](money);
            if (hasDecimals && settings.eventOnDecimalsEntered) { $destination.trigger("decimalsEntered", originalDecimals) } if (settings.colorize) {
                $destination.css("color", isPositive ? "black" : "red")
            }
        })
    }; $.fn.toNumber = function (settings) {
        var defaults = $.extend({ name: "toNumber", region: "", global: true }, $.formatCurrency.regions[""]); settings = jQuery.extend(defaults, settings);
        if (settings.region.length > 0) { settings = $.extend(settings, getRegionOrCulture(settings.region)) } settings.regex = generateRegex(settings); return this.each(function () {
            var method = $(this).is("input, select, textarea") ? "val" : "html";
            $(this)[method]($(this)[method]().replace("(", "(-").replace(settings.regex, ""))
        })
    }; $.fn.asNumber = function (settings) {
        var defaults = $.extend({ name: "asNumber", region: "", parse: true, parseType: "Float", global: true }, $.formatCurrency.regions[""]);
        settings = jQuery.extend(defaults, settings); if (settings.region.length > 0) { settings = $.extend(settings, getRegionOrCulture(settings.region)) } settings.regex = generateRegex(settings);
        settings.parseType = validateParseType(settings.parseType); var method = $(this).is("input, select, textarea") ? "val" : "html"; var num = $(this)[method]();
        num = num ? num : ""; num = num.replace("(", "(-"); num = num.replace(settings.regex, ""); if (!settings.parse) { return num } if (num.length == 0) { num = "0" } if (settings.decimalSymbol != ".") {
            num = num.replace(settings.decimalSymbol, ".")
        } return window["parse" + settings.parseType](num)
    }; function getRegionOrCulture(region) {
        var regionInfo = $.formatCurrency.regions[region]; if (regionInfo) {
            return regionInfo
        } else { if (/(\w+)-(\w+)/g.test(region)) { var culture = region.replace(/(\w+)-(\w+)/g, "$1"); return $.formatCurrency.regions[culture] } } return null
    } function validateParseType(parseType) {
        switch (parseType.toLowerCase()) {
            case "int": return "Int";
            case "float": return "Float"; default: throw "invalid parseType"
        }
    } function generateRegex(settings) {
        if (settings.symbol === "") {
            return new RegExp("[^\\d" + settings.decimalSymbol + "-]", "g")
        } else { var symbol = settings.symbol.replace("$", "\\$").replace(".", "\\."); return new RegExp(symbol + "|[^\\d" + settings.decimalSymbol + "-]", "g") }
    }
})(jQuery);


