/* Minification failed. Returning unminified contents.
(1777,36-37): run-time error JS1014: Invalid character: `
(1777,37-38): run-time error JS1195: Expected expression: <
(1777,86-87): run-time error JS1014: Invalid character: `
 */


//--------------------------------------------------------------------
// Ajax Handlers 
//--------------------------------------------------------------------

// IIFE - Immediately Invoked Function Expression
(function (library) {
    library(window.jQuery, window, document);
}(function ($, window, document) {
    // init
    var initDataAttributes = function ($scope) {
        if (typeof $scope === 'undefined' || $scope === null || $scope.length === 0)
            return;
    };

    // init
    var init = function ($scope) {
        if (typeof $scope === 'undefined' || $scope === null || $scope.length === 0)
            return;

        initDataAttributes($scope);
    };
    window.initSiteAjax = init;

    $(function () { //dom is ready!

        var siteInit = function () {
            var $scope = $(document);
            init($scope);
        }();
    });
}));


//---------------------------------------------------------------------------------------------------------------------

var AjaxPostHandler = (function ($, window, document) {
    //Private Methods
    var begin = function (xhr, form, callback) {
    };
    var complete = function (xhr, status, form, callback) {
    };

    var success = function (data, status, xhr, form, callback) {
    };

    var failure = function (xhr, status, error, form, callback) {
    };

    //Public methods
    var onBeginHandler = function (xhr, form, callback) {
        AjaxGlobalHandler.onBeginHandler(xhr, form, callback);
        begin(xhr, form, callback);
    };
    var onCompleteHandler = function (xhr, status, form, callback) {
        AjaxGlobalHandler.onCompleteHandler(xhr, status, form, callback);
        complete(xhr, status, form, callback);
    };
    var onSuccessHandler = function (data, status, xhr, form, callback) {
        //debugger;
        AjaxGlobalHandler.onSuccessHandler(data, status, xhr, form, callback);
        success(data, status, xhr, form, callback);
    };
    var onFailureHandler = function (xhr, status, error, form, callback) {
        //debugger;
        AjaxGlobalHandler.onFailureHandler(xhr, status, error, form, callback);
        failure(xhr, status, error, form, callback);
    };

    //Return scope
    return {
        onBeginHandler: onBeginHandler,
        onCompleteHandler: onCompleteHandler,
        onSuccessHandler: onSuccessHandler,
        onFailureHandler: onFailureHandler
    };
})(jQuery, window, document);

//---------------------------------------------------------------------------------------------------------------------

var AjaxGetHandler = (function ($, window, document) {
    //Private Methods
    var begin = function (xhr, form, callback) {
    };
    var complete = function (xhr, status, form, callback) {
    };

    var success = function (data, status, xhr, form, callback) {
    };

    var failure = function (xhr, status, error, form, callback) {
    };

    //Public methods
    var onBeginHandler = function (xhr, form, callback) {
        AjaxGlobalHandler.onBeginHandler(xhr, form, callback);
        begin(xhr, form, callback);
    };
    var onCompleteHandler = function (xhr, status, form, callback) {
        AjaxGlobalHandler.onCompleteHandler(xhr, status, form, callback);
        complete(xhr, status, form, callback);
    };
    var onSuccessHandler = function (data, status, xhr, form, callback) {
        AjaxGlobalHandler.onSuccessHandler(data, status, xhr, form, callback);
        success(data, status, xhr, form, callback);
    };
    var onFailureHandler = function (xhr, status, error, form, callback) {
        AjaxGlobalHandler.onFailureHandler(xhr, status, error, form, callback);
        failure(xhr, status, error, form, callback);
    };

    //Return scope
    return {
        onBeginHandler: onBeginHandler,
        onCompleteHandler: onCompleteHandler,
        onSuccessHandler: onSuccessHandler,
        onFailureHandler: onFailureHandler
    };
})(jQuery, window, document);

//---------------------------------------------------------------------------------------------------------------------

var AjaxPostMappingWithSelectListHandler = (function ($, window, document) {
    //Private Methods
    var begin = function (xhr, form, callback) {
    };
    var complete = function (xhr, status, form, callback) {
    };

    var success = function (data, status, xhr, form, callback) {
        if (xhr.readyState === 4) {
            //200=OK, 201=Created, 202=Accepted
            if ((xhr.status === 200 || xhr.status === 201 || xhr.status === 202)) {
                if (typeof form === 'undefined' || form === null || $(form).length === 0 || typeof data === 'undefined') {
                    return;
                }

                var $form = $(form);
                var $selectList = $form.find('select');
                if ($selectList.length > 0) {
                    //remove list item.
                    $selectList.find('option:selected').remove();

                    //if last one, hide form.
                    var itemCount = $selectList.find('option').length;
                    if (itemCount === 0) {
                        $form.fadeOut();
                    }
                }
            }
        }
    };

    var failure = function (xhr, status, error, form, callback) {
    };

    //Public methods
    var onBeginHandler = function (xhr, form, callback) {
        AjaxGlobalHandler.onBeginHandler(xhr, form, callback);
        begin(xhr, form, callback);
    };
    var onCompleteHandler = function (xhr, status, form, callback) {
        AjaxGlobalHandler.onCompleteHandler(xhr, status, form, callback);
        complete(xhr, status, form, callback);
    };
    var onSuccessHandler = function (data, status, xhr, form, callback) {
        AjaxGlobalHandler.onSuccessHandler(data, status, xhr, form, callback);
        success(data, status, xhr, form, callback);
    };
    var onFailureHandler = function (xhr, status, error, form, callback) {
        AjaxGlobalHandler.onFailureHandler(xhr, status, error, form, callback);
        failure(xhr, status, error, form, callback);
    };

    //Return scope
    return {
        onBeginHandler: onBeginHandler,
        onCompleteHandler: onCompleteHandler,
        onSuccessHandler: onSuccessHandler,
        onFailureHandler: onFailureHandler
    };
})(jQuery, window, document);

//---------------------------------------------------------------------------------------------------------------------

var AjaxDeleteTableRowHandler = (function ($, window, document) {
    //Private Methods
    var begin = function (xhr, form, callback) {
    };
    var complete = function (xhr, status, form, callback) {
    };

    var success = function (data, status, xhr, form, callback) {
        if (xhr.readyState === 4) {
            //200=OK, 201=Created, 202=Accepted
            if ((xhr.status === 200 || xhr.status === 201 || xhr.status === 202)) {
                if (typeof form === 'undefined' || form === null || $(form).length === 0 || typeof data === 'undefined') {
                    return;
                }

                var $form = $(form);
                if ($form.closest('table').find('tr').length === 2) { //last row, remove the header as well.

                    var $row = $form.closest('tr');
                    var $prev = $form.closest('tr').prev();
                    $row.remove();
                    $prev.remove();
                }
                else {
                    $form.closest('tr').remove();
                }
            }
        }
    };

    var failure = function (xhr, status, error, form, callback) {
        if (xhr.status !== 0)
        {
            return;
        }
    };

    //Public methods
    var onBeginHandler = function (xhr, form, callback) {
        AjaxGlobalHandler.onBeginHandler(xhr, form, callback);
        begin(xhr, form, callback);
    };
    var onCompleteHandler = function (xhr, status, form, callback) {
        AjaxGlobalHandler.onCompleteHandler(xhr, status, form, callback);
        complete(xhr, status, form, callback);
    };
    var onSuccessHandler = function (data, status, xhr, form, callback) {
        debugger;
        AjaxGlobalHandler.onSuccessHandler(data, status, xhr, form, callback);
        success(data, status, xhr, form, callback);
    };
    var onFailureHandler = function (xhr, status, error, form, callback) {
        AjaxGlobalHandler.onFailureHandler(xhr, status, error, form, callback);
        failure(xhr, status, error, form, callback);
    };

    //Return scope
    return {
        onBeginHandler: onBeginHandler,
        onCompleteHandler: onCompleteHandler,
        onSuccessHandler: onSuccessHandler,
        onFailureHandler: onFailureHandler
    };
})(jQuery, window, document);

//---------------------------------------------------------------------------------------------------------------------

var AjaxDeleteTableHandler = (function ($, window, document) {
    //Private Methods
    var begin = function (xhr, form, callback) {
    };
    var complete = function (xhr, status, form, callback) {
    };

    var success = function (data, status, xhr, form, callback) {
        if (xhr.readyState === 4) {
            //200=OK, 201=Created, 202=Accepted
            if ((xhr.status === 200 || xhr.status === 201 || xhr.status === 202)) {
                if (typeof form === 'undefined' || form === null || $(form).length === 0 || typeof data === 'undefined') {
                    return;
                }

                var $form = $(form);
                $form.closest('table').find('tr').each(function (i, item) {
                    $(this).remove();
                });
            }
        }
    };

    var failure = function (xhr, status, error, form, callback) {
        if (xhr.status !== 0)
        {
            return;
        }
    };

    //Public methods
    var onBeginHandler = function (xhr, form, callback) {
        AjaxGlobalHandler.onBeginHandler(xhr, form, callback);
        begin(xhr, form, callback);
    };
    var onCompleteHandler = function (xhr, status, form, callback) {
        AjaxGlobalHandler.onCompleteHandler(xhr, status, form, callback);
        complete(xhr, status, form, callback);
    };
    var onSuccessHandler = function (data, status, xhr, form, callback) {
        AjaxGlobalHandler.onSuccessHandler(data, status, xhr, form, callback);
        success(data, status, xhr, form, callback);
    };
    var onFailureHandler = function (xhr, status, error, form, callback) {
        AjaxGlobalHandler.onFailureHandler(xhr, status, error, form, callback);
        failure(xhr, status, error, form, callback);
    };

    //Return scope
    return {
        onBeginHandler: onBeginHandler,
        onCompleteHandler: onCompleteHandler,
        onSuccessHandler: onSuccessHandler,
        onFailureHandler: onFailureHandler
    };
})(jQuery, window, document);

//---------------------------------------------------------------------------------------------------------------------

var AjaxPostCreateFormHandler = (function ($, window, document) {
    //Private Methods
    var begin = function (xhr, form, callback) {
    };
    var complete = function (xhr, status, form, callback) {
    };

    var success = function (data, status, xhr, form, callback) {
        if (xhr.readyState === 4) {
            //200=OK, 201=Created, 202=Accepted
            if ((xhr.status === 200 || xhr.status === 201 || xhr.status === 202)) {
                if (typeof form === 'undefined' || form === null || $(form).length === 0 || typeof data === 'undefined') {
                    return;
                }

                var $form = $(form);
                var $submitButton = $form.find(':submit');
                $('<p><i class="fa fa-fw fa-check"></i>item added.').insertBefore($submitButton).queue(function () {
                    $submitButton.prev().remove().dequeue();
                });

                AjaxGlobalHandler.clearForm($(form));

                //hide alert.
                $('#AlertMessage').fadeOut();
            }
        }
    };

    var failure = function (xhr, status, error, form, callback) {
        if (xhr.status !== 0) {
            if (typeof form === 'undefined' || form === null || $(form).length === 0 || typeof data === 'undefined') {
                return;
            }

            var $form = $(form);
            var $submitButton = $form.find(':submit');
            $('<p><i class="fa fa-fw fa-ban"></i>failed to add!').insertBefore($submitButton).queue(function () {
                $submitButton.prev().remove().dequeue();
            });
        }
    };

    //Public methods
    var onBeginHandler = function (xhr, form, callback) {
        AjaxGlobalHandler.onBeginHandler(xhr, form, callback);
        begin(xhr, form, callback);
    };
    var onCompleteHandler = function (xhr, status, form, callback) {
        AjaxGlobalHandler.onCompleteHandler(xhr, status, form, callback);
        complete(xhr, status, form, callback);
    };
    var onSuccessHandler = function (data, status, xhr, form, callback) {
        AjaxGlobalHandler.onSuccessHandler(data, status, xhr, form, callback);
        success(data, status, xhr, form, callback);
    };
    var onFailureHandler = function (xhr, status, error, form, callback) {
        AjaxGlobalHandler.onFailureHandler(xhr, status, error, form, callback);
        failure(xhr, status, error, form, callback);
    };

    //Return scope
    return {
        onBeginHandler: onBeginHandler,
        onCompleteHandler: onCompleteHandler,
        onSuccessHandler: onSuccessHandler,
        onFailureHandler: onFailureHandler
    };
})(jQuery, window, document);

//---------------------------------------------------------------------------------------------------------------------

var AjaxPostSiteModalFormHandler = (function ($, window, document) {
    //Site Modal
    var siteModalId = '#SiteModal';
    var $siteModal = $(siteModalId);

    //Private Methods
    var begin = function (xhr, form, callback) {
    };
    var complete = function (xhr, status, form, callback) {
        $('[data-target="#' + siteModalId + '"]').button('reset');
    };

    var success = function (data, status, xhr, form, callback) {
        if (xhr.readyState === 4) {
            //200=OK, 201=Created, 202=Accepted
            if ((xhr.status === 200 || xhr.status === 201 || xhr.status === 202)) {
                if (typeof form === 'undefined' || form === null || $(form).length === 0 || typeof data === 'undefined') {
                    return;
                }

                var $form = $(form);
                $siteModal.modal('hide');

                //clear modal cache, so that new content can be loaded
                $siteModal.removeData('bs.modal');
            }
        }
    };


    var failure = function (xhr, status, error, form, callback) {
        //debugger;
    };

    //Public methods
    var onBeginHandler = function (xhr, form, callback) {
        AjaxGlobalHandler.onBeginHandler(xhr, form, callback);
        begin(xhr, form, callback);
    };
    var onCompleteHandler = function (xhr, status, form, callback) {
        AjaxGlobalHandler.onCompleteHandler(xhr, status, form, callback);
        complete(xhr, status, form, callback);
    };
    var onSuccessHandler = function (data, status, xhr, form, callback) {
        AjaxGlobalHandler.onSuccessHandler(data, status, xhr, form, callback);
        success(data, status, xhr, form, callback);
    };
    var onFailureHandler = function (xhr, status, error, form, callback) {
        AjaxGlobalHandler.onFailureHandler(xhr, status, error, form, callback);
        failure(xhr, status, error, form, callback);
    };

    //Return scope
    return {
        onBeginHandler: onBeginHandler,
        onCompleteHandler: onCompleteHandler,
        onSuccessHandler: onSuccessHandler,
        onFailureHandler: onFailureHandler
    };
})(jQuery, window, document);

//---------------------------------------------------------------------------------------------------------------------

var AjaxPostResponseContainerFormHandler = (function ($, window, document) {
    var begin = function (xhr, form) {
    };
    var complete = function (xhr, status, form) {
    };
    var success = function (data, status, xhr, form) {
        if (xhr.readyState === 4) {
            //200=OK, 201=Created, 202=Accepted
            if ((xhr.status === 200 || xhr.status === 201 || xhr.status === 202)) {
                if (typeof form === 'undefined' || form === null || $(form).length === 0 || typeof data === 'undefined') {
                    return;
                }

                var $form = $(form);
                var insertionMode = $form.attr('data-ajax-mode');
                var updateTargetId = $form.attr('data-ajax-update');
                var $container = $form.find('.response-container');

                if (!insertionMode) {
                    insertionMode = 'replace';
                }

                if ($container.length > 0) {
                    var html = '';
                    if (data && data.message && data.message.length > 0) { //display confirmation.

                        html = '<span class="text-success"><i class="fa fa-fw fa-check"></i>' + data.message + '</span>';
                    }

                    if (insertionMode === 'replace') {
                        $container.html(html);
                    }
                    else if (insertionMode === 'insertAfter') {
                        $container.insertAfter(html);
                    }
                    else if (insertionMode === 'insertBefore') {
                        $container.insertBefore(html);
                    }
                }
            }
        }
    };
    var failure = function (xhr, status, error, form) {
        if (xhr.readyState === 4) {
            if (typeof form === 'undefined' || form === null || $(form).length === 0) {
                return false;
            }

            var message = status;
            if (xhr.status === 0) {
                message = 'Check your network (offline)';
            }
            else if (xhr.status === 404) {
                message = 'Check request url';
            }
            else if (xhr.status === 500) {
                message = 'Error';
            }
            else if (status === 'parsererror') {
                message = 'JSON error';
            }
            else if (status === 'timeout') {
                message = 'Timeout';
            }
            else {
                if (error && error.length > 0) {
                    message = error;
                }
                else if (xhr && xhr.statusText) {
                    message = xhr.statusText;
                }
            }

            var $form = $(form);
            var insertionMode = $form.attr('data-ajax-mode');
            var updateTargetId = $form.attr('data-ajax-update');
            var $container = $form.find('.response-container');

            if (!insertionMode) {
                insertionMode = 'replace';
            }

            if ($container.length > 0) {
                var html = '';
                if (data && data.message && data.message.length > 0) { //display confirmation.

                    html = '<span class="text-danger"><i class="fa fa-fw fa-danger"></i>' + message + '</span>';
                }

                if (insertionMode === 'replace') {
                    $container.html(html);
                }
                else if (insertionMode === 'insertAfter') {
                    $container.insertAfter(html);
                }
                else if (insertionMode === 'insertBefore') {
                    $container.insertBefore(html);
                }
            }

            //enable button
            $(form).find(':submit').attr('disabled', false);
        }
        return false;
    };

    //Public methods
    var onBeginHandler = function (xhr, form, callback) {
        AjaxGlobalHandler.onBeginHandler(xhr, form, callback);
        begin(xhr, form, callback);
    };
    var onCompleteHandler = function (xhr, status, form, callback) {
        AjaxGlobalHandler.onCompleteHandler(xhr, status, form, callback);
        complete(xhr, status, form, callback);
    };
    var onSuccessHandler = function (data, status, xhr, form, callback) {
        AjaxGlobalHandler.onSuccessHandler(data, status, xhr, form, callback);
        success(data, status, xhr, form, callback);
    };
    var onFailureHandler = function (xhr, status, error, form, callback) {
        AjaxGlobalHandler.onFailureHandler(xhr, status, error, form, callback);
        failure(xhr, status, error, form, callback);
    };

    //Return scope
    return {
        onBeginHandler: onBeginHandler,
        onCompleteHandler: onCompleteHandler,
        onSuccessHandler: onSuccessHandler,
        onFailureHandler: onFailureHandler
    };
})(jQuery, window, document);

//---------------------------------------------------------------------------------------------------------------------

var AjaxGlobalHandler = (function ($, window, document) {
    var execCallback = function (callback) {
        if (callback) {
            if (typeof (callback) === 'function') {
                callback.call();
            }
            else if (typeof (callback) === 'string') {
                if (typeof (window[callback]) !== 'undefined' && $.isFunction(window[callback])) {
                    window[callback]();
                }
                else {
                    var functionCall = callback;
                    if (callback.startsWith('return')) {
                        functionCall = callback;
                    }
                    else if (callback.startsWith('function')) {
                        functionCall = 'return ' + functionCall;
                    }

                    if (callback.endsWith('}')) {
                        functionCall = functionCall + ';';
                    }

                    var func = new Function(functionCall)();
                    func();
                }
            }
        }
    };

    var onBeginHandler = function (xhr, form, callback) {
        //alert("begin");
        //alert('xhr.readyState:' + xhr.readyState); //0

        if (typeof form !== 'undefined' && form !== null && $(form).length !== 0) {
            var $form = $(form);
            var $submitButton = $form.find(':submit');
            if ($submitButton.length) {
                $submitButton.prop('disabled', true);
            }
        }

        //callback
        execCallback(callback);
    };
    var onCompleteHandler = function (xhr, status, form, callback) {
        //debugger;
        //alert("completed");
        //alert('status:' + status); //success
        //alert('xhr.readyState:' + xhr.readyState); //4
        //alert('xhr.status:' + xhr.status); //200
        //alert('xhr.status:' + xhr.status); //OK
        //alert('xhr.getAllResponseHeaders:' + xhr.getAllResponseHeaders()); //response headers

        //reset buttons
        $(document).find(':submit[data-loading-text]').button('reset');

        //callback
        if (typeof callback !== 'undefined' && callback && typeof (callback) === 'function') {
            callback(xhr, status, form);
        }

        if (typeof form !== 'undefined' && form !== null && $(form).length !== 0) {
            var $form = $(form);
            if ($form.length) {
                var $scope = $form;

                //rebind scripts
                var updateTargetId = $form.attr('data-ajax-update');
                if (updateTargetId) {
                    var $target = $(updateTargetId);
                    if ($target.length) {
                        $scope = $target;
                    }
                    AjaxGlobalHandler.rebindScripts($scope, callback);
                }
            }
        }

    };
    var onSuccessHandler = function (data, status, xhr, form, callback) {
        //debugger;
        //alert('success');
        //alert('status:' + status); //success
        //alert('xhr.readyState:' + xhr.readyState); //4
        //alert('xhr.status:' + xhr.status); //200
        //alert('xhr.status:' + xhr.status); //OK
        //alert('xhr.getAllResponseHeaders:' + xhr.getAllResponseHeaders()); //response headers

        var message = status;
        if (AjaxGlobalHandler.isApplicationJsonResponse(xhr)) {
            if (data.message) {
                message = data.message;
            }
        }

        if (xhr.readyState === 4) {
            //200=OK, 201=Created, 202=Accepted
            if (xhr.status === 200 || xhr.status === 201 || xhr.status === 202) {
                //update target
                AjaxGlobalHandler.updateTarget(data, status, xhr, form);
            }
            else {
                alert('HTTP' + xhr.status.toString() + ': ' + message + '\n' + xhr.responseText);
            }

            //reset submit button
            resetSubmitButton(form);
        }

        //callback
        execCallback(callback);
    };
    var onFailureHandler = function (xhr, status, error, form, callback) {
        //debugger;
        //alert("failure");
        //alert('error:' + error); //error
        //alert('status:' + status); //error
        //alert('xhr.readyState:' + xhr.readyState); //4
        //alert('xhr.status:' + xhr.status); //200
        //alert('xhr.status:' + xhr.status); //OK
        //alert('xhr.getAllResponseHeaders:' + xhr.getAllResponseHeaders()); //response headers

        var message = status;
        if (xhr.status === 0) { //Offline

            message = 'Check your network (offline).';
        }
        else if (xhr.status === 404) { //HttpNotFound

            message = 'No item found.';
        }
        else if (xhr.status === 500) {
            message = 'Failed.';
        }
        else if (status === 'parsererror') {
            message = 'Failed (Json).';
        }
        else if (status === 'timeout') {
            message = 'Request timed out!';
        }
        else {
            if (xhr && xhr.statusText) {
                message = xhr.statusText;
            }
        }

        if (typeof form === 'undefined' || form === null || $(form).length === 0) {
            //display error.
            //alert('HTTP' + xhr.status.toString() + ': ' + message + '\n\n' + xhr.responseText);
            alert('HTTP' + xhr.status.toString() + ': ' + message);
        }

        var $form = $(form);
        if (!String.prototype.isNullOrWhitespace(message)) {
            var $submitButton = $form.find(':submit');

            //remove any existing.
            $submitButton.prev('.response-message').remove();

            //add message.
            $('<p class="response-message"><i class="fa fa-fw fa-ban"></i>' + message + '</p>').insertBefore($submitButton).delay(5000).queue(function () {
                $submitButton.prev('.response-message').remove().dequeue();
            });
        }

        //reset submit button
        resetSubmitButton(form);

        //callback
        execCallback(callback);
    };

    var rebindScripts = function ($scope, callback) {
        //check scope
        //var $entityListTable = $scope.closest('table');
        //if($entityListTable.hasClass('table-entity-list'))
        //{
        //    $scope = $entityListTable;
        //}

        //rebind libraries  
        if (window.initSiteLibraries && typeof (window.initSiteLibraries) === 'function' && window.initSiteLibraries !== callback) {
            //calls window.initValidation($scope)
            window.initSiteLibraries($scope);
        }
        //rebind forms
        if (window.initSiteForm && typeof (window.initSiteForm) === 'function' && window.initSiteForm !== callback) {
            window.initSiteForm($scope);
        }
        //rebind select list
        if (window.initSiteFormEntitySelect && typeof (window.initSiteFormEntitySelect) === 'function' && window.initSiteModal !== callback) {
            window.initSiteFormEntitySelect($scope);
        }
        //rebind site
        if (window.initSiteAll && typeof (window.initSiteAll) === 'function' && window.initSiteAll !== callback) {
            window.initSiteAll($scope);
        }
        //rebind modal
        if (window.initSiteModal && typeof (window.initSiteModal) === 'function' && window.initSiteModal !== callback) {
            window.initSiteModal();
        }
    };

    var getResponseContentType = function (xhr) {
        return xhr.getResponseHeader('Content-Type').split(';');
    };

    var getResponseMimeContentType = function (xhr) {
        return getResponseContentType(xhr)[0];
        //application/json; charset=UTF-8
        //text/html; charset=UTF-8
        //application/x-www-form-urlencoded; charset=UTF-8
    };

    var isApplicationJsonResponse = function (xhr) {
        return getResponseMimeContentType(xhr) === 'application/json';
    };

    var isHtmlTextResponse = function (xhr) {
        return getResponseMimeContentType(xhr) === 'text/html';
    };

    var isJsonResponse = function (xhr) {
        return getResponseMimeContentType(xhr) === 'application/json';
    };

    var updateTarget = function (data, status, xhr, form) {
        if (typeof form === 'undefined' || form === null || $(form).length === 0 || typeof data === 'undefined') {
            return;
        }

        var $form = $(form);
        var insertionMode = $form.attr('data-ajax-mode');
        var updateTargetId = $form.attr('data-ajax-update');

        if (AjaxGlobalHandler.isApplicationJsonResponse(xhr)) { //application/json - "return JsonPartialViewHttpResult"

            if (!insertionMode) {
                insertionMode = 'replace';
            }

            if (Boolean(updateTargetId) && insertionMode === 'replace') {
                if (data && data.view && data.view.trim().length > 0) { //BaseController.JsonPartialViewHttpResult

                    $(updateTargetId).html(data.view);
                }
            }
        }
        else { //text/html - "return PartialView"

            if (!insertionMode) {
                insertionMode = 'replace';
            }

            if (Boolean(updateTargetId) && insertionMode === 'replace') {
                if (data && data.trim().length > 0) { //PartialView

                    $(updateTargetId).html(data);
                }
            }
        }
        return;
    };

    var resetSubmitButton = function (form) {
        if (typeof form === 'undefined' || form === null || $(form).length === 0) {
            return false;
        }

        var $form = $(form);
        var $submitButton = $form.find(':submit');
        if ($submitButton.length) {
            $submitButton.prop('disabled', false);
            if ($submitButton.attr('data-loading-text')) {
                $submitButton.button('reset');
            }
        }
        return true;
    };

    var clearForm = function ($form) {
        $form[0].reset();
    };

    //Return scope
    return {
        onBeginHandler: onBeginHandler,
        onCompleteHandler: onCompleteHandler,
        onSuccessHandler: onSuccessHandler,
        onFailureHandler: onFailureHandler,

        rebindScripts: rebindScripts,
        getResponseContentType: getResponseContentType,
        getResponseMimeContentType: getResponseMimeContentType,
        isJsonResponse: isJsonResponse,
        isApplicationJsonResponse: isApplicationJsonResponse,
        isHtmlTextResponse: isHtmlTextResponse,
        updateTarget: updateTarget,
        resetSubmitButton: resetSubmitButton,
        clearForm: clearForm
    };
})(jQuery, window, document);;
//--------------------------------------------------------------------
// Master 
//--------------------------------------------------------------------

// IIFE - Immediately Invoked Function Expression
(function (library) {
    library(window.jQuery, window, document);
}(function ($, window, document) {
    var scrollTo = function (targetId) {

        if (typeof targetId === 'undefined' || targetId === null || targetId.length === 0)
            return false;

        var $target = $(targetId);
        if ($target.length) {

            //iff fixed / sticky navigation
            var stickyNavHeight = 90;
            var navOffset = stickyNavHeight - 1;

            //TODO: MUST consider when nav .collapse.in is open.
            //var $fixedNav = $('#TopNav.navbar-fixed-top');
            //if ($fixedNav.length)
            //{
            //    navOffset = $fixedNav.outerHeight();
            //}

            var offset = $target.offset().top - navOffset;
            $('html,body').animate({ scrollTop: offset }, 1000);

            window.location.hash = targetId;
        }
        return true;
    };

    var initActivateLists = function()
    {
        //// If URL is http://www.somedomain.com/account/search?filter=a#top
        //window.location.pathname // /account/search
        //// For reference:
        //window.location.host     // www.somedomain.com (includes port if there is one)
        //window.location.hostname // www.somedomain.com
        //window.location.hash     // #top
        //window.location.href     // http://www.somedomain.com/account/search?filter=a#top
        //window.location.port     // (empty string)
        //window.location.protocol // http:
        //window.location.search   // ?filter=a  

        var pathArray = window.location.pathname.split('/');
        pathArray = $.grep(pathArray,
            function(n)
            {
                return (n);
            });

        $('li > a:not(a[href*="#"])').each(function(i, item)
        {
            var href = $(this).attr('href');
            if(typeof href !== 'undefined' && href !== null)
            {
                let hrefParts = href.split('/');
                hrefParts = $.grep(hrefParts,
                    function(n)
                    {
                        return (n);
                    });

                let activate = false;
                if(pathArray.length === hrefParts.length)
                {
                    for(let j = 0; j < pathArray.length; j++)
                    {
                        if(pathArray[j] === hrefParts[j])
                        {
                            activate = true;
                            continue;
                        }
                        else
                        {
                            activate = false;
                            break;
                        }
                    }
                }
                else if(pathArray.length > 2 && hrefParts.length === 2)
                {
                    for(let k = 0; k < 2; k++)
                    {
                        if(pathArray[k] === hrefParts[k])
                        {
                            activate = true;
                            continue;
                        }
                        else
                        {
                            activate = false;
                            break;
                        }
                    }
                }

                if(activate)
                {
                    $(this).parent().addClass('active');
                }
            }
        });
    };

    var initNavigation = function ($scope) {

        if (typeof $scope === 'undefined' || $scope === null || $scope.length === 0)
            return;

        var $topNav = $('#TopNav');
        var $logo = $topNav.find('.navbar-brand img');
        var $header = $('header');
        var $backToTop = $('#BackToTop');

        //iff fixed / sticky navigation
        var stickyNavHeight = 142; /* no idea why this height */
        var navOffset = stickyNavHeight - 1;

        //TODO: MUST consider when nav .collapse.in is open.
        var $fixedNav = $('#TopNav.navbar-fixed-top');
        if ($fixedNav.length)
        {
            navOffset = $fixedNav.outerHeight();
        }

        //scrollspy
        $('body').scrollspy({ target: '#TopNavBar', offset: navOffset });

        //show navbar [data-offset-top]
        var headerOffset = $header.outerHeight() - navOffset; /* subtract height for smoother transition in */
        $topNav.affix({ offset: { top: headerOffset } });

        var offsetTop = $topNav.data('offset-top');
        if (offsetTop === undefined)
        {
            offsetTop = headerOffset;
            $topNav.data('offset-top', offsetTop);
        }

        var deactivateNavBars = function () {
            if ($topNav.length) {
                $topNav
                    .removeClass('navbar-default').removeClass('navbar-fixed-top').removeClass('navbar-inverse')
                    .addClass('navbar-fixed-top').addClass('navbar-inverse');
            }

            $logo.attr('src', '/assets/img/sbl-solutions-navbar-brand-logo.png');
            $backToTop.fadeIn();
        };

        var activateNavBars = function () {
            if ($topNav.length) {
                $topNav
                    .removeClass('navbar-default').removeClass('navbar-fixed-top').removeClass('navbar-inverse')
                    .addClass('navbar-default');
            }

            $logo.attr('src', '/assets/img/sbl-solutions-logo.png');
            $backToTop.hide();

            $('.navbar-collapse.in').collapse('hide');
        };

        var refreshNavBars = function () {
            if ($(window).scrollTop() > offsetTop) {
                deactivateNavBars();
            }
            else {
                activateNavBars();
            }
        };

        setTimeout(refreshNavBars, 1000);

        $(window).scroll(function (e) {
            refreshNavBars();
        });

        $scope.off('click.navbar-collapse').on('click.navbar-collapse',
            '.navbar-collapse.in a',
            function (e) {
                var $self = $(e.currentTarget);
                $self.closest('.navbar-collapse.in').collapse('hide');
            });

        $scope.off('click.navbar-toggle').on('click.navbar-toggle',
            '#TopNav .navbar-toggle',
            function (e) {
                if ($topNav.length) {
                    $topNav.removeClass('navbar-default').removeClass('navbar-fixed-top').removeClass('navbar-inverse').addClass('navbar-fixed-top').addClass('navbar-inverse');
                }
            });

        //correct hash links - to javascript(void)
        $scope.find('a[href="#"]').each(function (i, item) {
            $(item).attr('href', 'javascript:void(0);');
        });

        //scroll to
        $scope.off('click.scrollto').on('click.scrollto',
            'a[href*="#"]:not(a[href="#"]):not([data-toggle])',
            function (e) {
                if (window.location.pathname.replace('/^\//, \'\'') === this.pathname.replace('/^\//, \'\'') &&
                    window.location.hostname === this.hostname) {
                    var targetId = this.hash;
                    return scrollTo(targetId);
                }
                return true;
            });

        //back to top
        $scope.off('click.back-to-top').on('click.back-to-top', '#BackToTop, a[href="/"], a[href="/"]',
            function (e) {
                e.preventDefault();
                $('html,body').animate({ scrollTop: 0 }, 1000);
                window.location.hash = '';
                return false;
            });

        //goto location hash if in url
        if (window.location.hash !== null && window.location.hash.length) {
            setTimeout(function () {
                var $target = $(window.location.hash);
                if ($target.length) {
                    scrollTo(window.location.hash);
                }
            }, 1500);
        }

        initActivateLists($scope);
    };

    var initElements = function ($scope) {
        if (typeof $scope === 'undefined' || $scope === null || $scope.length === 0) {
            return;
        }

        $scope.find('h1, h2, h3, h4, h5, h6, label, a, .btn').not('.dropdown-menu').each(function (i, item) {
            var title = $(this).prop('title');
            if (title.length > 0) {
                $(this).attr('title', $(this).text().trim().replace(/(\r\n|\n|\r)/gm, ':').singleSpace());
            }
        });
    };

    var initDataAnnotations = function ($scope) {
        if (typeof $scope === 'undefined' || $scope === null || $scope.length === 0) {
            return;
        }

        //data-action = submit
        $scope.off('click.data_action_submit').on('click.data_action_submit',
            '[data-action="submit"]',
            function (e) {
                $(this).attr('disabled', true);

                $(this).closest('form').submit();
                return false;
            });

        //data-action = reload
        $scope.off('click.data_action_reset_reload').on('click.data_action_reset_reload',
            'button:reset[data-action="reload"]',
            function (e) {
                //location.href = location.href;
                location.href = location.pathname; //remove all querystring and go to address.
                return true;
            });

        //data-action = reload
        $scope.off('click.data_action_reload').on('click.data_action_reload',
            'a[data-action="reload"]',
            function (e) {
                //location.href = location.href;
                location.href = location.pathname; //remove all querystring and go to address.
                return false;
            });

        //back - previous page.
        $scope.off('click.data_action_back').on('click.data_action_back',
            'a[data-action="back"]',
            function (e) {
                window.history.go(-1);
                return false;
            });

        //print
        $scope.off('click.data_action_print').on('click.data_action_print',
            'a[data-action="print"]',
            function (e) {
                self.print();
                return false;
            });

        //safe email (rel="info/contimac.com.au)
        $scope.find('a[data-protect="email"]').each(function (i, item) {
            var $self = $(item);
            var email = $self.attr('data-protect-email').replace('/', '@');
            $self.attr('href', 'mailto:' + email);

            var replace = true;
            if ($self.data('protect-replace') !== undefined) {
                replace = Boolean($self.data('protect-replace'));
            }

            if (replace) {
                var innerHtml = $self.html();
                var innerText = $self.text();
                if (String.prototype.isNullOrWhitespace(innerHtml)) {
                    $self.html(email);
                }
                else if (String.prototype.isNullOrWhitespace(innerText)) {
                    $self.append(email);
                }
            }
        });
    };

    var init = function ($scope) {
        if (typeof $scope === 'undefined' || $scope === null || $scope.length === 0) {
            return;
        }

        //no scope.
        //initAlertMessage();

        //scope.
        initNavigation($scope);
        initElements($scope);
        initDataAnnotations($scope);
    };

    window.initSiteAll = init;
    window.scrollTo = scrollTo;

    // listen for the jQuery ready event on the document
    $(function () { //dom is ready!

        var siteInit = function () {
            var $scope = $(document);
            init($scope);
        }();
    });
}));;
'use strict';

//--------------------------------------------------------------------
// Site Form Script
//--------------------------------------------------------------------

// IIFE - Immediately Invoked Function Expression
(function (library) {
    'use strict';

    library(window.jQuery, window, document);
}(function ($, window, document) {
    'use strict';

    var clickButton = function ($button) {
        //add spinning icon to loading text.
        var loadingText = $button.attr('data-loading-text');
        if (loadingText) {
            var buttonType = $button.prop('tagName');
            if (buttonType.toLowerCase() === 'button') { //<button>
                var $form = $button.closest('form');
                var buttonHtml = $button.html();
                $button
                    .html('<i class="fa fa-fw fa-spinner fa-spin"></i>' + loadingText);
                /*.delay(20000).queue(function ()
                                {
                                    $button.html(buttonHtml);
                                    $button.dequeue();
                                });*/

                //disable submit button initially (to help avoid double click)
                if ($button.is(':submit')) {
                    var isAjaxForm = $form.attr('data-ajax');
                    if (!isAjaxForm) {
                        $button.prop('disabled', true);
                    }
                }
            }
            else {
                $button.attr('data-loading-text', '<i class="fa fa-fw fa-refresh fa-spin"></i>' + loadingText)
                    .button('loading'); /*.delay(20000).queue(function ()
                {
                    $button.button('reset');
                    $button.dequeue();
                });*/
            }
        }
    }

    ///Returns false if for is submitted. Important if using with submit buttons and or form.submit events.
    ///e.g. $form.on('submit', function(e){ return !submitForm(e.currentTarget); }); $submitButton.on('click', function(e){ return !submitForm($(e.currentTarget).closest('form')); });
    var submitForm = function ($form) {
        if ($form === undefined || $form === null || $form.length === 0)
            return false;

        $form.validate();
        if ($.validator !== undefined && $form.valid()) {
            var $button = $form.find(':submit');
            if ($button.length) {
                clickButton($button);
            }

            if ($form.attr('data-ajax')) {
                //BUG FIX: Must submit the $form - if you use $form.get(0).submit() the MVC AJAX Form events are not submitted.
                $form.submit();
            }
            else {

                //BUG: THIS NORMALLY DOESNT WORK SO IF HAVING ISSUES WITH FORM SUBMIT LOOK HERE!!!!!!!!!!!!! Use $form.get(0).submit();
                $form.submit();
                //$form.get(0).submit();
            }
            return true;
        }
        return false;
    }

    var initForm = function ($scope) {
        //tooltips
        $('[data-toggle="tooltip"]').tooltip({ container: 'body' }); //{ container: 'body' } ensure 'always on top'!

        //enter key handler.
        $scope.off('keypress.input_text').on('keypress.input_text', 'input:text', function (e) {
            if (e.which === 13) {
                var $form = $(e.currentTarget).closest('form');
                return !submitForm($form);
            }
            return true;
        });


        //------------------- formatters

        //uppercase
        $scope
            .off('change.input_text_uppercase blur.input_text_uppercase')
            .on('change.input_text_uppercase blur.input_text_uppercase',
                'input:text.uppercase, input:text.zipcode', function (e) {
                    var $self = $(e.currentTarget);
                    $self.val($self.val().toUpperCase());
                });

        //lowercase
        $scope
            .off('change.input_text_lowercase blur.input_text_lowercase')
            .on('change.input_text_lowercase blur.input_text_lowercase',
                'input:text.lowercase, input:text.email, input:text.url, input:text.url-handle, input:text.keywords, input:text.tags', function (e) {
                    var $self = $(e.currentTarget);
                    $self.val($self.val().toLowerCase());
                });

        //nospace
        $scope
            .off('change.input_text_nospace blur.input_text_nospace')
            .on('change.input_text_nospace blur.input_text_nospace',
                'input:text.nospace, input:text.url, input:text.url-pathandquery, input:text.url-handle', function (e) {
                    var $self = $(e.currentTarget);
                    $self.val($self.val().singleSpace().replace(' ', ''));
                });
    };

    var initButtonLoading = function ($scope) {
        //plain buttons (not submit)
        $scope.find('a.btn[data-loading-text], button.btn[data-loading-text]').not(':submit').button('reset')
            .off('click.data_loading_text_btn')
            .on('click.data_loading_text_btn', function (e) {
                var $button = $(e.currentTarget);
                clickButton($button);
                return true;
            });

        //submit buttons
        $scope.find('button:submit[data-loading-text]').button('reset')
            .off('click.data_loading_text_button')
            .on('click.data_loading_text_button', function (e) {
                var $button = $(e.currentTarget);
                var $form = $button.closest('form');
                if ($form === undefined || $form === null || $form.length === 0) {
                    clickButton($button);
                    return true;
                }

                //return false - form submitted by submit method.
                return !submitForm($form);
            });
    };

    var initOptionalProperties = function ($scope) {
        $scope.find('.form-group input, .form-group textarea, .input-group input, .input-group textarea').each(function (i, item) {
            var $self = $(item);
            if (!$self.attr('data-val-required')) {
                var placeHolder = $self.attr('placeholder');
                if (!placeHolder || placeHolder.trim().length === 0) {
                    $self.attr('placeholder', 'optional');
                }
            }
        });
    };

    var initDataTypeProperties = function ($scope) {
        var refreshInputEmail = function ($input, doValidate) {
            if (doValidate && $.validator && !$input.valid()) {
                return;
            }

            var mailto = $input.val();
            if (!String.prototype.isNullOrWhitespace(mailto)) {
                var $btn = $input.closest('.form-group').find('[rel="input-email"]');
                var html = '<a rel="input-email" class="btn btn-xxs btn-link pull-right" href="mailto:' + mailto + '"><i class="fa fa-fw fa-envelope"></i>' + mailto + '</a>';

                var $inputGroup = $input.closest('.input-group');
                if ($inputGroup.length) {
                    $inputGroup.after(html);
                }
                else {
                    var $formGroup = $input.closest('.form-group');
                    if ($formGroup.length) {
                        $input.after(html);
                    }
                }
                if ($btn.length > 0) {
                    $btn.remove();
                }
            }
        };

        $scope.find('.form-group input.email, .form-group input[type="email"]').not('#LoginForm input').not('.no-append').each(function () {
            refreshInputEmail($(this), false);
            $(this).off('change.inputEmail').on('change.inputEmail', function (e) {
                refreshInputEmail($(e.target), true);
            });
        });
    };

    var bindTargetAndAutoFill = function ($from, $target, hyphenate, lowercase, sanitize) {
        if (typeof $from === 'undefined' || $from === null || $from.length === 0) {
            return;
        }
        if (typeof $target === 'undefined' || $target === null || $target.length === 0) {
            return;
        }

        if (typeof hyphenate === 'undefined' || hyphenate === null) {
            hyphenate = false;
        }
        if (typeof lowercase === 'undefined' || lowercase === null) {
            lowercase = false;
        }
        if (typeof sanitize === 'undefined' || sanitize === null) {
            sanitize = false;
        }

        $from.on('change keyup blur', function (e) {
            var hasInitVal = false;
            var initVal = $target.attr('data-init-val');
            if (typeof initVal === 'undefined' || initVal === null || initVal.length === 0) {
                hasInitVal = true;
            }

            var $self = $(e.currentTarget);
            var val = $self.val();
            if (hasInitVal && initVal !== val) {
                if (hyphenate) {
                    val = val.replace(/\s+/g, '-');

                    //replace '---' with '--'
                    val = val.replace('---', '--');
                }
                if (lowercase) {
                    val = val.toLowerCase();
                }
                if (sanitize) {//http://www.deliveron.com/blog/seo-friendly-routes-aspnet-mvc-3/

                    //replace '&' with 'and'
                    val = val.replace('&', 'and');

                    //remove invalid characters - quotes
                    val = val.replace('\'', '');
                    val = val.replace('"', '');

                    //remove invalid characters - non alphanumeric
                    val = val.replace(/[^a-zA-Z0-9]-_/g, '');
                }
                $target.val(val);
            }
            else {
                $target.val(initVal);
            }
            return true;
        });
    };

    //------------------------------------------------------------------------------------------------------------------
    // --- Functions
    //------------------------------------------------------------------------------------------------------------------
    var init = function ($scope) {
        if (typeof $scope === 'undefined' || $scope === null || $scope.length === 0)
            return;

        initForm($scope);
        initButtonLoading($scope);
        initOptionalProperties($scope);
        initDataTypeProperties($scope);
    };
    window.initSiteForm = init;
    window.bindTargetAndAutoFill = bindTargetAndAutoFill;

    $(function () { //dom is ready!

        var siteInit = function () {
            var $scope = $(document);
            init($scope);
        }();
    });
}));;


//--------------------------------------------------------------------
// Site Form Libraries Script
//--------------------------------------------------------------------

// IIFE - Immediately Invoked Function Expression
(function (library) {
    library(window.jQuery, window, document);
}(function ($, window, document) {
    // jQuery Validation
    var initValidation = function ($scope) {
        // override jquery validate plugin defaults - fix for 'input-group'
        //http://stackoverflow.com/questions/18754020/bootstrap-3-with-jquery-validation-plugin
        if ($.validator) {
            $.validator.setDefaults({
                ignore: '.ignore',
                highlight: function (element, errorClass, validClass) {
                    if (element.type === 'radio') {
                        this.findByName(element.name).addClass(errorClass).removeClass(validClass);
                    }
                    else {
                        var $fg = $(element).closest('.form-group');
                        $fg.removeClass('has-success has-feedback').addClass('has-error has-feedback');
                        $fg.find('i.fa').remove();
                        $fg.append('<i class="fa fa-exclamation fa-lg form-control-feedback"></i>');
                    }
                },
                unhighlight: function (element, errorClass, validClass) {
                    if (element.type === 'radio') {
                        this.findByName(element.name).removeClass(errorClass).addClass(validClass);
                    }
                    else {
                        var $fg = $(element).closest('.form-group');
                        $fg.removeClass('has-error has-feedback').addClass('has-success has-feedback');
                        $fg.find('i.fa').remove();
                        $fg.append('<i class="fa fa-check fa-lg form-control-feedback"></i>');
                    }
                },
                errorElement: 'span',
                errorClass: 'help-block',
                errorPlacement: function (error, element) {
                    if (element.parent('.input-group').length) {
                        error.insertAfter(element.parent());
                    }
                    else {
                        error.insertAfter(element);
                    }
                }
            });
        }

        if (typeof $scope === 'undefined' || $scope === null || $scope.length === 0) {
            return;
        }
    };

    // Alphanum
    //https://github.com/KevinSheedy/jquery.alphanum
    var initAlphanumLibrary = function ($scope) {
        if (typeof $scope === 'undefined' || $scope === null || $scope.length === 0) {
            return;
        }

        //form inputs
        if ($.fn.alphanum) {
            //var DEFAULT_SETTINGS_ALPHANUM = {
            //    allow: '',    // Allow extra characters
            //    disallow: '',    // Disallow extra characters
            //    allowSpace: true,  // Allow the space character
            //    allowNumeric: true,  // Allow digits 0-9
            //    allowUpper: true,  // Allow upper case characters
            //    allowLower: true,  // Allow lower case characters
            //    allowCaseless: true,  // Allow characters that do not have both upper & lower constiants
            //    // eg Arabic or Chinese
            //    allowLatin: true,  // a-z A-Z
            //    allowOtherCharSets: true,  // eg é, Á, Arabic, Chinese etc
            //    forceUpper: false, // Convert lower case characters to upper case
            //    forceLower: false, // Convert upper case characters to lower case
            //    maxLength: NaN    // eg Max Length
            //}

            //var DEFAULT_SETTINGS_NUM = {
            //    allowPlus: false, // Allow the + sign
            //    allowMinus: true,  // Allow the - sign
            //    allowThouSep: true,  // Allow the thousands separator, default is the comma eg 12,000
            //    allowDecSep: true,  // Allow the decimal separator, default is the fullstop eg 3.141
            //    allowLeadingSpaces: false,
            //    maxDigits: NaN,   // The max number of digits
            //    maxDecimalPlaces: NaN,   // The max number of decimal places
            //    maxPreDecimalPlaces: NaN,   // The max number digits before the decimal point
            //    max: NaN,   // The max numeric value allowed
            //    min: NaN    // The min numeric value allowed
            //}

            //var CONVENIENCE_SETTINGS_NUMERIC = {
            //"integer"         : {
            //    allowPlus:    false,
            //    allowMinus:   true,
            //    allowThouSep: false,
            //    allowDecSep:  false
            //},
            //"positiveInteger" : {
            //    allowPlus:    false,
            //    allowMinus:   false,
            //    allowThouSep: false,
            //    allowDecSep:  false
            //}
            //};

            //nocaps: true, allcaps: true - omits the excepted characters when typed (it doesnt convert them).    
            $scope.find('input.alphanum').alphanum({ allow: '-_' });
            $scope.find('input.number').numeric({ allowSpace: false });
            $scope.find('input.name').alpha({ allow: ' \'`-' });
            $scope.find('input.zipcode').alphanum({ allowSpace: false });
            $scope.find('input.zipcode-au').numeric({ allowSpace: false });

            //email
            $scope.find('input.email').alpha({
                allow: '@./-_0123456789', allowSpace: false /*, forceLower: true*/
            });

            //url
            $scope.find('input.url').alphanum({
                allow: ':./-_', allowSpace: false /*, forceLower: true*/
            });
            $scope.find('input.url-pathandquery').alphanum({ allow: './-_', allowSpace: false });
            $scope.find('input.url-handle').alphanum({ allow: '-_' });

            //phones
            $scope.find('input.phone, input.mobile, input.fax').numeric({ allow: '+() ' });

            //credit card
            $scope.find('input.creditcard').numeric({ allowSpace: false, forceLower: true });

            //dates
            $scope.find('input.date').alphanum({ allow: '/', disallow: 'abcdefghijklmnopqrstuvwxyz', allowSpace: false });
            $scope.find('input.datetime').alphanum({ allow: '/:', disallow: 'abcdefghijklmnopqrstuvwxyz', allowSpace: false });

            $scope.off('change.input-currency').on('change.input-currency', 'input.currency', function (e) {
                var $self = $(e.currentTarget);
                var currencyValue = $self.val();

                if (!String.prototype.isNullOrWhitespace(currencyValue)) {
                    if (isNaN(currencyValue)) {
                        $self.val(parseFloat(0).toFixed(2));
                    }
                    else {
                        $self.val(parseFloat(currencyValue).toFixed(2));
                    }
                }
            });
        }
    };

    var initLightbox = function ($scope) {
        if ($.iLightBox) {
            $scope.off('click.lightbox').on('click.lightbox',
                '[data-lightbox-type]',
                function (e) {
                    e.preventDefault();

                    var $self = $(e.currentTarget);
                    var type = $self.data('lightbox-type');
                    var url = $self.attr('href');
                    //var title = $self.attr('alt') ? $self.attr('alt') : '';
                    //var caption = $self.attr('title') ?$self.attr('title') : '';

                    var urlOptions = [
                        {
                            URL: url,
                            type: type
                        }
                    ];

                    var api = $.iLightBox(urlOptions,
                        {
                            skin: 'dark',
                            controls: {
                                arrows: false,
                                thumbnail: false,
                                keyboard: false,
                                mousewheel: false,
                                swipe: false
                            }
                        });

                    return false;
                });
        }
    };


    //http://fancyapps.com/fancybox/3/docs/#api
    var initFancybox = function ($scope) {
        if ($.fancybox) {
            //THIS IS DEFAULT BEHAVIOUR AND CANNOT STOP PARENT/FIRST CALLERS
            //$scope.off('click.fancybox').on('click.fancybox',
            //    '[data-fancybox-type]',
            //    function (e)
            //    {
            //        if (!Modernizr.touch)
            //        {
            //            e.preventDefault();

            //            var $self = $(e.currentTarget);
            //            //var type = $self.data('fancybox-type');
            //            var src = $self.attr('href');
            //            //var title = $self.attr('alt') ? $self.attr('alt') : '';
            //            var caption = $self.attr('title') ? $self.attr('title') : '';

            //            var items = [
            //                {
            //                    src: src,
            //                    toolbar: false,
            //                    smallBtn: true,
            //                    iframe: {
            //                        preload: false
            //                    },
            //                    opts: {
            //                        caption: caption
            //                    }
            //                }
            //            ];

            //            var opts = { loop: false };


            //            //only works on desktop
            //            $.fancybox.open(items, opts);
            //            return false;
            //        }
            //        return true;
            //    });
        }
    };


    //https://mynameismatthieu.com/WOW/docs.html
    var initWow = function ($scope) {
        try {
            new WOW().init();
        }
        catch (e) {
            return false;
        }
    };

    // Galleria
    // http://galleria.io
    var initGalleria = function ($scope) {
        if (typeof $scope === 'undefined' || $scope === null || $scope.length === 0)
            return;


        //CACHE RESULTS GETJSON! Must turn off if not wanted for ALL other AJAX Requests
        $.ajaxSetup({ cache: true });


        $scope.find('.galleria:visible').each(function (i, item) {

            var $galleria = $(item);

            var watermarkUrl = $galleria.attr('data-galleria-watermark');
            if (watermarkUrl)
            {
                var $container = $galleria.closest('.project-gallery');
                $container.prepend(`<img class="watermark" src="${ watermarkUrl }" />`);
            }

            var themeUrl = $galleria.attr('data-galleria-theme');
            if (!themeUrl) {
                themeUrl = './jquery-plugins/galleria/twelve/galleria.twelve.min.js" )';
            }

            var start = $galleria.attr('data-galleria-start');
            if (!start) {
                start = 0;
            }

            var flickrCommand = $galleria.attr('data-flickr-command');
            if (!flickrCommand) {
                flickrCommand = 'user:sblsolutions';
                //command="user:xxx"
                //command="set:111"
                //command="search:stuff"
            }

            var flickrCount = $galleria.attr('data-flickr-count');
            if(!flickrCount){
                flickrCount = 100;
            }
            //alert(`${themeUrl}/${start}/${flickrCommand}/${flickrCount}`);

            //load theme.
            Galleria.loadTheme(themeUrl);

            var ratio = window.devicePixelRatio || 1;
            var w = screen.width * ratio;
            var h = screen.height * ratio;

            var imageSize = 'original';
            if (w < 480)
                imageSize = 'small';
            else if (w < 768)
                imageSize = 'medium';
            else
                imageSize = 'big';

            //configure options.
            Galleria.configure({
                debug: false, // debug is now off for deployment (no errors - supposedly!grr!!)
                flickr: flickrCommand,
                flickrOptions:
                {
                    max: flickrCount,
                    imageSize: imageSize, // [thumb,small,medium,big,original]
                    thumbSize: 'thumb', // [thumb,small,medium,big,original]
                    sort: 'date-posted-desc', // [date-posted-asc, date-posted-desc, date-taken-asc, date-taken-desc, interestingness-desc, interestingness-asc, relevance]
                    description: true,
                    backlink: false
                },
                max: flickrCount,
                show: start,
                thumbCrop: false,
                imageCrop: 'width',
                height: 0.5625, //relative height (16/9 ratio) - http://galleria.io/docs/options/height/
                transition: 'pulse',
                lightbox: true,
                fullscreenDoubleTap: true,
                preload: 2,
                thumbnails: 'lazy'
            });


            //run galleria.
            var galleria = Galleria.run($galleria,
                {
                    extend: function () {
                        var galleria = this;

                        var slideCount = galleria.getDataLength();
                        if (slideCount > 0) {
                            galleria.play();
                            //$(".start").click(function ()
                            //{
                            //	galleria.play();
                            //	return false;
                            //});
                        }
                        else {
                            $galleria.hide();

                            //var $parentSection = $('#FlickrPhotoSection');
                            //if ($parentSection.length) {
                            //    $parentSection.hide();
                            //}
                        }
                    }
                });
        });
    };

    //------------------------------------------------------------------------------------------------------------------
    // --- Functions
    //------------------------------------------------------------------------------------------------------------------
    var init = function ($scope) {
        if (typeof $scope === 'undefined' || $scope === null || $scope.length === 0) {
            $scope = $(document);
        }

        //priority
        initGalleria($scope);
        initWow($scope);

        //lazy
        initValidation($scope);
        initAlphanumLibrary($scope);
        initLightbox($scope);
        initFancybox($scope);

        
    };

    //------------------------------------------------------------------------------------------------------------------
    // --- Global Functions
    //------------------------------------------------------------------------------------------------------------------'
    window.initGalleria = initGalleria;

    window.initAlphanumLibrary = initAlphanumLibrary;
    window.initValidation = initValidation;
    window.initSiteLibraries = init;

    $(function () { //dom is ready!

        var siteInit = function () {
            var $scope = $(document);
            init($scope);
        }();
    });
}));;
