diff -r 00bfb7b29d9e -r 391ad752903e src/pyams_skin/resources/js/myams.js --- a/src/pyams_skin/resources/js/myams.js Mon Jan 18 18:41:23 2016 +0100 +++ b/src/pyams_skin/resources/js/myams.js Mon Jan 18 18:45:59 2016 +0100 @@ -10,27 +10,29 @@ * ©2014-2015 Thierry Florac */ -(function($) { +(function($, globals) { + + "use strict"; /** * String prototype extensions */ String.prototype.startsWith = function(str) { - var slen = this.length; - var dlen = str.length; + var slen = this.length, + dlen = str.length; if (slen < dlen) { return false; } - return (this.substr(0,dlen) == str); + return (this.substr(0,dlen) === str); }; String.prototype.endsWith = function(str) { - var slen = this.length; - var dlen = str.length; + var slen = this.length, + dlen = str.length; if (slen < dlen) { return false; } - return (this.substr(slen-dlen) == str); + return (this.substr(slen-dlen) === str); }; @@ -38,18 +40,19 @@ * Array prototype extensions */ if (!Array.prototype.indexOf) { - Array.prototype.indexOf = function(elt /*, from*/) { + Array.prototype.indexOf = function(elt, from) { var len = this.length; - var from = Number(arguments[1]) || 0; + from = Number(from) || 0; from = (from < 0) ? Math.ceil(from) : Math.floor(from); - if (from < 0) + if (from < 0) { from += len; + } for (; from < len; from++) { - if (from in this && - this[from] === elt) + if (from in this && this[from] === elt) { return from; + } } return -1; }; @@ -61,7 +64,7 @@ * Case insensitive contains expression */ $.expr[":"].econtains = function(obj, index, meta /*, stack*/) { - return (obj.textContent || obj.innerText || $(obj).text() || "").toLowerCase() == meta[3].toLowerCase(); + return (obj.textContent || obj.innerText || $(obj).text() || "").toLowerCase() === meta[3].toLowerCase(); }; @@ -70,7 +73,7 @@ * Case sensitive exact search expression */ $.expr[":"].withtext = function(obj, index, meta /*, stack*/) { - return (obj.textContent || obj.innerText || $(obj).text() || "") == meta[3]; + return (obj.textContent || obj.innerText || $(obj).text() || "") === meta[3]; }; @@ -88,7 +91,7 @@ */ if ($.scrollbarWidth === undefined) { $.scrollbarWidth = function() { - var parent = $('
').appendTo('body'); + var parent = $('
').appendTo('body'); var child = parent.children(); var width = child.innerWidth() - child.height(99).innerWidth(); parent.remove(); @@ -114,10 +117,11 @@ * otherwise looks for parents */ objectOrParentWithClass: function(klass) { - if (this.hasClass(klass)) + if (this.hasClass(klass)) { return this; - else + } else { return this.parents('.' + klass); + } }, /* @@ -139,16 +143,16 @@ // DOM node var node = this.get(0); // Ensure we have a DOM node - if (typeof node == 'undefined') { + if (typeof(node) === 'undefined') { return; } // CSSStyleDeclaration var style = this.get(0).style; // Getter/Setter - if (typeof styleName != 'undefined') { - if (typeof value != 'undefined') { + if (typeof(styleName) !== 'undefined') { + if (typeof(value) !== 'undefined') { // Set style property - priority = typeof priority != 'undefined' ? priority : ''; + priority = typeof(priority) !== 'undefined' ? priority : ''; style.setProperty(styleName, value, priority); return this; } else { @@ -167,9 +171,9 @@ removeClassPrefix: function (prefix) { this.each(function (i, it) { var classes = it.className.split(" ").map(function(item) { - return item.startsWith(prefix) ? "" : item + return item.startsWith(prefix) ? "" : item; }); - it.className = $.trim(classes.join(" ")) + it.className = $.trim(classes.join(" ")); }); return this; }, @@ -184,8 +188,9 @@ menu = $(settings.menuSelector)[direction](), position = mouse; // opening menu would pass the side of the page - if (mouse + menu > win && menu < mouse) + if (mouse + menu > win && menu < mouse) { position -= menu; + } return position; } @@ -197,8 +202,9 @@ }); $(this).on("contextmenu", function (e) { // return native menu if pressing control - if (e.ctrlKey) + if (e.ctrlKey) { return; + } //open menu $(settings.menuSelector).data("invokedOn", $(e.target)) .show() @@ -252,7 +258,7 @@ // avoid jumping to the top of the page when the href is an # var first_link = menu_item.find("A:first"); - if (first_link.attr('href') == "#") { + if (first_link.attr('href') === "#") { first_link.click(function() { return false; }); @@ -266,11 +272,15 @@ var active_item = active_parent.parent('LI'); active_parent.slideDown(settings.speed); active_item.find("b:first").html(settings.openedSign); - active_item.addClass("open") + active_item.addClass("open"); }); menu.find("LI A").on('click', function() { var link = $(this); + if (link.hasClass('active')) { + return; + } + var href = link.attr('href').replace(/^#/,''); var parent_ul = link.parent().find("UL"); if (settings.accordion) { var parents = link.parent().parents("UL"); @@ -278,28 +288,29 @@ visible.each(function(visibleIndex) { var close = true; parents.each(function(parentIndex) { - if (parents[parentIndex] == visible[visibleIndex]) { + if (parents[parentIndex] === visible[visibleIndex]) { close = false; return false; } }); if (close) { - if (parent_ul != visible[visibleIndex]) { - $(visible[visibleIndex]).slideUp(settings.speed, function() { - link.parent("LI") - .find("b:first") - .html(settings.closedSign); - link.parent("LI") - .removeClass("open"); - }); + if (parent_ul !== visible[visibleIndex]) { + var visibleItem = $(visible[visibleIndex]); + if (href || !visibleItem.hasClass('active')) { + visibleItem.slideUp(settings.speed, function () { + $(this).parent("LI") + .removeClass('open') + .find("B:first") + .delay(settings.speed) + .html(settings.closedSign); + }); + } } } }); } var first_ul = link.parent().find("UL:first"); - if (!link.attr('href').replace(/^#/,'') && - first_ul.is(":visible") && - !first_ul.hasClass("active")) { + if (!href && first_ul.is(":visible") && !first_ul.hasClass("active")) { first_ul.slideUp(settings.speed, function() { link.parent("LI") .removeClass("open") @@ -307,7 +318,7 @@ .delay(settings.speed) .html(settings.closedSign); }); - } else /*if (link.attr('href') != location.hash)*/ { + } else /*if (link.attr('href') !== location.hash)*/ { first_ul.slideDown(settings.speed, function() { link.parent("LI") .addClass("open") @@ -388,8 +399,8 @@ /** * MyAMS extensions to JQuery */ - if (window.MyAMS === undefined) { - window.MyAMS = { + if (globals.MyAMS === undefined) { + globals.MyAMS = { devmode: true, devext: '', lang: 'en', @@ -404,6 +415,7 @@ ismobile: (/iphone|ipad|ipod|android|blackberry|mini|windows\sce|palm/i.test(navigator.userAgent.toLowerCase())) }; } + var MyAMS = globals.MyAMS; var ams = MyAMS; /** @@ -424,16 +436,18 @@ */ MyAMS.getQueryVar = function(src, varName) { // Check src - if (src.indexOf('?') < 0) + if (src.indexOf('?') < 0) { return false; - if (!src.endsWith('&')) + } + if (!src.endsWith('&')) { src += '&'; + } // Dynamic replacement RegExp var regex = new RegExp('.*?[&\\?]' + varName + '=(.*?)&.*'); // Apply RegExp to the query string var val = src.replace(regex, "$1"); // If the string is the same, we didn't find a match - return false - return val == src ? false : val; + return val === src ? false : val; }; @@ -442,7 +456,7 @@ */ MyAMS.rgb2hex = function(color) { return "#" + $.map(color.match(/\b(\d+)\b/g), function(digit) { - return ('0' + parseInt(digit).toString(16)).slice(-2) + return ('0' + parseInt(digit).toString(16)).slice(-2); }).join(''); }; @@ -465,10 +479,11 @@ * Small piece of code by Jason Bunting */ MyAMS.getFunctionByName = function(functionName, context) { - if (functionName === undefined) + if (functionName === undefined) { return undefined; - else if (typeof(functionName) == 'function') + } else if (typeof(functionName) === 'function') { return functionName; + } var namespaces = functionName.split("."); var func = namespaces.pop(); context = (context === undefined || context === null) ? window : context; @@ -488,7 +503,7 @@ MyAMS.executeFunctionByName = function(functionName, context /*, args */) { var func = ams.getFunctionByName(functionName, window); - if (typeof(func) == 'function') { + if (typeof(func) === 'function') { var args = Array.prototype.slice.call(arguments, 2); return func.apply(context, args); } @@ -513,7 +528,7 @@ success: callback, error: ams.error.show, cache: !ams.devmode, - async: typeof(callback) == 'function' + async: typeof(callback) === 'function' }; var settings = $.extend({}, defaults, options); return $.ajax(settings); @@ -522,10 +537,11 @@ MyAMS.getCSS = function(url, id) { var head = $('HEAD'); var css = $('link[data-ams-id="' + id + '"]', head); - if (css.length == 0) { + if (css.length === 0) { var source = ams.getSource(url); - if (ams.devmode) + if (ams.devmode) { source += '?_=' + new Date().getTime(); + } $('').attr({rel: 'stylesheet', type: 'text/css', href: source, @@ -564,11 +580,12 @@ getInternetExplorerVersion: function() { var rv = -1; - if (navigator.appName == "Microsoft Internet Explorer") { + if (navigator.appName === "Microsoft Internet Explorer") { var ua = navigator.userAgent; var re = new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})"); - if (re.exec(ua) != null) + if (re.exec(ua) !== null) { rv = parseFloat(RegExp.$1); + } } return rv; }, @@ -577,22 +594,26 @@ var msg = "You're not using Windows Internet Explorer."; var ver = this.getInternetExplorerVersion(); if (ver > -1) { - if (ver >= 8) + if (ver >= 8) { msg = "You're using a recent copy of Windows Internet Explorer."; - else + } else { msg = "You should upgrade your copy of Windows Internet Explorer."; + } } - alert(msg); + if (globals.alert) { + globals.alert(msg); + } }, isIE8orlower: function() { var msg = "0"; var ver = this.getInternetExplorerVersion(); if (ver > -1) { - if (ver >= 9) + if (ver >= 9) { msg = 0; - else + } else { msg = 1; + } } return msg; }, @@ -601,8 +622,10 @@ return function() { var source = $(this); source.parents('.btn-group').removeClass('open'); - window.prompt(MyAMS.i18n.CLIPBOARD_COPY, source.text()); - } + if (globals.prompt) { + globals.prompt(MyAMS.i18n.CLIPBOARD_COPY, source.text()); + } + }; } }; @@ -615,15 +638,16 @@ /** * Default JQuery AJAX error handler */ - ajax: function(event, request /*, settings*/) { - if (request.statusText == 'OK') + ajax: function(event, response, request, error) { + if (response.statusText === 'OK') { return; - var response = ams.ajax.getResponse(request); - if (response.content_type == 'json') { - ams.ajax.handleJSON(response.data); + } + var ajax_response = ams.ajax.getResponse(response); + if (ajax_response.content_type === 'json') { + ams.ajax.handleJSON(ajax_response.data); } else { var title = event.statusText || event.type; - var message = request.responseText; + var message = response.responseText; ams.skin.messageBox('error', { title: ams.i18n.ERROR_OCCURED, content: '

' + title + '

' + message + '

', @@ -631,9 +655,9 @@ timeout: 10000 }); } - if (window.console) { - console.error(event); - console.debug(request); + if (globals.console) { + globals.console.error(event); + globals.console.debug(response); } }, @@ -641,10 +665,11 @@ * Show AJAX error */ show: function(request, status, error) { - if (!error) + if (!error) { return; + } var response = ams.ajax.getResponse(request); - if (response.content_type == 'json') { + if (response.content_type === 'json') { ams.ajax.handleJSON(response.data); } else { ams.skin.messageBox('error', { @@ -654,9 +679,9 @@ timeout: 10000 }); } - if (window.console) { - console.error(error); - console.debug(request); + if (globals.console) { + globals.console.error(error); + globals.console.debug(request); } } }; @@ -678,22 +703,24 @@ * @options: callback options */ check: function(checker, source, callback, options) { - if (typeof(callback) == 'object') { + if (typeof(callback) === 'object') { options = callback; callback = undefined; } var defaults = { - async: typeof(callback) == 'function' + async: typeof(callback) === 'function' }; var settings = $.extend({}, defaults, options); if (checker === undefined) { ams.getScript(source, function() { - if (typeof(callback) == 'function') + if (typeof(callback) === 'function') { callback(true, options); + } }, settings); } else { - if (typeof(callback) == 'function') + if (typeof(callback) === 'function') { callback(false, options); + } } }, @@ -727,45 +754,52 @@ * @param options: AJAX options */ progress: function(event) { - if (!event.lengthComputable) + if (!event.lengthComputable) { + return; + } + if (event.loaded >= event.total) { return; - if (event.loaded >= event.total) - return; - console.log(parseInt((event.loaded / event.total * 100), 10) + "%"); + } + if (globals.console) { + globals.console.log(parseInt((event.loaded / event.total * 100), 10) + "%"); + } }, /** * Post data to given URL */ post: function(url, data, options, callback) { - if (url.startsWith(window.location.protocol)) - var addr = url; - else + var addr; + if (url.startsWith(window.location.protocol)) { + addr = url; + } else { addr = this.getAddr() + url; - if (typeof(options) == 'function') { + } + if (typeof(options) === 'function') { callback = options; - options = {} + options = {}; } else if (!options) { options = {}; } - if (typeof(callback) == 'undefined') + if (typeof(callback) === 'undefined') { callback = options.callback; - if (typeof(callback) == 'string') + } + if (typeof(callback) === 'string') { callback = ams.getFunctionByName(callback); + } delete options.callback; - var result = undefined; + var result; var defaults = { url: addr, type: 'post', cache: false, - async: typeof(callback) == 'function', + async: typeof(callback) === 'function', data: $.param(data), dataType: 'json', success: callback || function(data /*, status*/) { result = data.result; - }, - error: ams.error.show + } }; var settings = $.extend({}, defaults, options); $.ajax(settings); @@ -792,9 +826,9 @@ result = request.responseText; } else { result = request.responseJSON; - if (result) + if (result) { data_type = 'json'; - else { + } else { try { result = JSON.parse(request.responseText); data_type = 'json'; @@ -844,15 +878,18 @@ var url; switch (status) { case 'alert': - alert(result.alert.title + '\n\n' + result.alert.content); + if (globals.alert) { + globals.alert(result.alert.title + '\n\n' + result.alert.content); + } break; case 'error': ams.form.showErrors(form, result); break; case 'info': case 'success': - if (result.close_form != false) + if (result.close_form !== false) { ams.dialog.close(form); + } break; case 'message': case 'messagebox': @@ -860,28 +897,32 @@ case 'notify': case 'callback': case 'callbacks': - if (result.close_form != false) + if (result.close_form !== false) { ams.dialog.close(form); + } break; case 'modal': ams.dialog.open(result.location); break; case 'reload': - if (result.close_form != false) + if (result.close_form !== false) { ams.dialog.close(form); + } url = result.location || window.location.hash; - if (url.startsWith('#')) + if (url.startsWith('#')) { url = url.substr(1); + } ams.skin.loadURL(url, result.target || target || '#content'); break; case 'redirect': - if (result.close_form == true) + if (result.close_form === true) { ams.dialog.close(form); + } url = result.location || window.location.href; if (result.window) { window.open(url, result.window, result.options); } else { - if (window.location.href == url) { + if (window.location.href === url) { window.location.reload(true); } else { window.location.href = url; @@ -889,52 +930,65 @@ } break; default: - console.log("Unhandled status: " + status); - break; + if (globals.console) { + globals.console.log("Unhandled status: " + status); + } } + + var index; + var content; + var container; if (result.content) { - var content = result.content; - var container = $(content.target || target || form || '#content'); - if (content.raw == true) { + content = result.content; + container = $(content.target || target || form || '#content'); + if (content.raw === true) { container.text(content.text); } else { container.html(content.html); ams.initContent(container); } - if (!content.keep_hidden) + if (!content.keep_hidden) { container.removeClass('hidden'); + } } if (result.contents) { var contents = result.contents; - for (var index in contents) { + for (index=0; index < contents.length; index++) { content = contents[index]; container = $(content.target); - if (content.raw == true) { + if (content.raw === true) { container.text(content.text); } else { container.html(content.html); ams.initContent(container); } - if (!content.keep_hidden) + if (!content.keep_hidden) { container.removeClass('hidden'); + } } } + + var message; if (result.message) { - var message = result.message; - if (typeof(message) == 'string') { - if ((status == 'info') || (status == 'success')) + message = result.message; + if (typeof(message) === 'string') { + if ((status === 'info') || (status === 'success')) { ams.skin.smallBox(status, - {title: message, - icon: 'fa fa-fw fa-info-circle font-xs align-top margin-top-10', - timeout: 3000}); - else + { + title: message, + icon: 'fa fa-fw fa-info-circle font-xs align-top margin-top-10', + timeout: 3000 + }); + } else { ams.skin.alert($(form || '#content'), status, message); - } else + } + } else { ams.skin.alert($(message.target || target || form || '#content'), message.status || 'success', message.header, message.body, message.subtitle); + } } if (result.smallbox) { ams.skin.smallBox(result.smallbox_status || status, @@ -944,32 +998,36 @@ } if (result.messagebox) { message = result.messagebox; - if (typeof(message) == 'string') + if (typeof(message) === 'string') { ams.skin.messageBox('info', - {title: ams.i18n.ERROR_OCCURED, - content: message, - timeout: 10000}); - else { + { + title: ams.i18n.ERROR_OCCURED, + content: message, + timeout: 10000 + }); + } else { var message_status = message.status || 'info'; - if (message_status == 'error' && form && target) + if (message_status === 'error' && form && target) { ams.executeFunctionByName(form.data('ams-form-submit-error') || 'MyAMS.form.finalizeSubmitOnError', form, target); + } ams.skin.messageBox(message_status, {title: message.title || ams.i18n.ERROR_OCCURED, content: message.content, icon: message.icon, number: message.number, - timeout: message.timeout == null ? undefined : (message.timeout || 10000)}); + timeout: message.timeout === null ? undefined : (message.timeout || 10000)}); } } - if (result.event) + if (result.event) { form.trigger(result.event, result.event_options); - if (result.callback) + } + if (result.callback) { ams.executeFunctionByName(result.callback, form, result.options); + } if (result.callbacks) { - for (index in result.callbacks) { - if (!$.isNumeric(index)) - continue; - var callback = result.callbacks[index]; + var callback; + for (index=0; index < result.callbacks.length; index++) { + callback = result.callbacks[index]; ams.executeFunctionByName(callback, form, callback.options); } } @@ -1002,42 +1060,49 @@ * - @callback: name of a callback which will be called on server response */ query: function(query, method, options, callback) { - ams.ajax.check($.jsonRpc, + ams.ajax.check($.jsonRPC, ams.baseURL + 'ext/jquery-jsonrpc' + ams.devext + '.js', function() { - var result; - if (typeof(options) == 'function') { + if (typeof(options) === 'function') { callback = options; options = {}; } - else if (!options) + else if (!options) { options = {}; - if (typeof(callback) == 'undefined') + } + if (callback === 'undefined') { callback = options.callback; - if (typeof(callback) == 'string') + } + if (typeof(callback) === 'string') { callback = ams.getFunctionByName(callback); + } delete options.callback; var params = {}; - if (typeof(query) == 'string') - params['query'] = query; - else if (typeof(query) == 'object') + if (typeof(query) === 'string') { + params.query = query; + } else if (typeof(query) === 'object') { $.extend(params, query); + } $.extend(params, options); - var settings = { - url: ams.jsonrpc.getAddr(options.url), - type: 'post', - cache: false, - method: method, + var result; + var defaults = { + id: new Date().getTime(), params: params, - async: typeof(callback) == 'function', - success: callback || function(data /*, status*/) { - result = data.result; + success: callback || function(data) { + result = data; }, error: ams.error.show }; - $.jsonRpc(settings); + var settings = $.extend({}, defaults, options); + $.jsonRPC.withOptions({ + endPoint: ams.jsonrpc.getAddr(options.url), + namespace: options.namespace, + cache: false + }, function() { + $.jsonRPC.request(method, settings); + }); return result; }); }, @@ -1054,16 +1119,19 @@ ams.ajax.check($.jsonRPC, ams.baseURL + 'ext/jquery-jsonrpc' + ams.devext + '.js', function() { - if (typeof(options) == 'function') { + if (typeof(options) === 'function') { callback = options; options = {}; } - else if (!options) + else if (!options) { options = {}; - if (typeof(callback) == 'undefined') + } + if (typeof(callback) === 'undefined') { callback = options.callback; - if (typeof(callback) == 'string') + } + if (typeof(callback) === 'string') { callback = ams.getFunctionByName(callback); + } delete options.callback; var result; @@ -1116,19 +1184,22 @@ ams.ajax.check($.xmlrpc, ams.baseURL + 'ext/jquery-xmlrpc' + ams.devext + '.js', function() { - var result; - if (typeof(options) == 'function') { + if (typeof(options) === 'function') { callback = options; options = {}; } - else if (!options) + else if (!options) { options = {}; - if (typeof(callback) == 'undefined') + } + if (typeof(callback) === 'undefined') { callback = options.callback; - if (typeof(callback) == 'string') + } + if (typeof(callback) === 'string') { callback = ams.getFunctionByName(callback); + } delete options.callback; + var result; var defaults = { url: ams.xmlrpc.getAddr(url), methodName: method, @@ -1158,10 +1229,12 @@ */ init: function(element) { // Activate form changes if required - if (ams.warn_on_form_change) - var forms = $('FORM[data-ams-warn-on-change!="false"]', element); - else + var forms; + if (ams.warn_on_form_change) { + forms = $('FORM[data-ams-warn-on-change!="false"]', element); + } else { forms = $('FORM[data-ams-warn-on-change="true"]', element); + } forms.each(function() { var form = $(this); $('INPUT[type="text"], ' + @@ -1185,6 +1258,26 @@ }, /** + * Set focus to first container input + */ + setFocus: function(container) { + var focused = $('[data-ams-focus-target]', container).first(); + if (!focused.exists()) { + focused = $('input, select', container).first(); + } + if (focused.exists()) { + if (focused.hasClass('select2')) { + setTimeout(function() { + focused.select2('focus'); + focused.select2('open'); + }, 100); + } else { + focused.focus(); + } + } + }, + + /** * Check for modified forms before exiting */ checkBeforeUnload: function() { @@ -1198,7 +1291,7 @@ * Check for modified forms before loading new inner content */ confirmChangedForm: function(element, callback) { - if (typeof(element) == 'function') { + if (typeof(element) === 'function') { callback = element; element = undefined; } @@ -1209,8 +1302,9 @@ content: '  ' + ams.i18n.FORM_CHANGED_WARNING, buttons: ams.i18n.BTN_OK_CANCEL }, function(button) { - if (button == ams.i18n.BTN_OK) + if (button === ams.i18n.BTN_OK) { callback.call(element); + } }); } else { callback.call(element); @@ -1223,9 +1317,10 @@ submit: function(form, handler, submit_options) { // Check params form = $(form); - if (!form.exists()) + if (!form.exists()) { return false; - if (typeof(handler) == 'object') { + } + if (typeof(handler) === 'object') { submit_options = handler; handler = undefined; } @@ -1242,15 +1337,17 @@ return false; } // Check submit validators - if (!ams.form._checkSubmitValidators(form)) + if (!ams.form._checkSubmitValidators(form)) { return false; + } // Remove remaining status messages - $('.alert-danger, SPAN.state-error', form).remove(); + $('.alert-danger, SPAN.state-error', form).not('.persistent').remove(); $('.state-error', form).removeClassPrefix('state-'); // Check submit button var button = $(form.data('ams-submit-button')); - if (button && !button.data('ams-form-hide-loading')) + if (button && !button.data('ams-form-hide-loading')) { button.button('loading'); + } ams.ajax.check($.fn.ajaxSubmit, ams.baseURL + 'ext/jquery-form-3.49' + ams.devext + '.js', function() { @@ -1260,23 +1357,29 @@ var button; var data = form.data(); var form_options = data.amsFormOptions; - - if (submit_options) - var form_data_callback = submit_options.formDataInitCallback; - if (form_data_callback) + var form_data; + var form_data_callback; + + if (submit_options) { + form_data_callback = submit_options.formDataInitCallback; + } + if (form_data_callback) { delete submit_options.formDataInitCallback; - else + } else { form_data_callback = data.amsFormDataInitCallback; + } if (form_data_callback) { var veto = {}; - if (typeof(form_data_callback) == 'function') - var form_data = form_data_callback.call(form, veto); - else + if (typeof(form_data_callback) === 'function') { + form_data = form_data_callback.call(form, veto); + } else { form_data = ams.executeFunctionByName(form_data_callback, form, veto); + } if (veto.veto) { button = form.data('ams-submit-button'); - if (button) + if (button) { button.button('reset'); + } ams.form.finalizeSubmitFooter.call(form); return false; } @@ -1292,32 +1395,43 @@ buttonTarget = button.data('ams-form-submit-target'); } + var url; var form_handler = handler || buttonHandler || data.amsFormHandler || ''; if (form_handler.startsWith(window.location.protocol)) { - var url = form_handler; + url = form_handler; } else { var action = form.attr('action').replace(/#/, ''); - if (action.startsWith(window.location.protocol)) + if (action.startsWith(window.location.protocol)) { url = action; - else + } else { url = ams.ajax.getAddr() + action; + } url += form_handler; } var target = null; - if (data.amsFormInitSubmitTarget) { - target = $(buttonTarget || data.amsFormSubmitTarget || '#content'); - ams.executeFunctionByName(data.amsFormInitSubmit || 'MyAMS.form.initSubmit', form, target); - } else if (!data.amsFormHideSubmitFooter) - ams.executeFunctionByName(data.amsFormInitSubmit || 'MyAMS.form.initSubmitFooter', form); - - var hasUpload = typeof(options.uuid) != 'undefined'; + if (submit_options && submit_options.initSubmitTarget) { + ams.executeFunctionByName(submit_options.initSubmitTarget); + } else { + if (data.amsFormInitSubmitTarget) { + target = $(buttonTarget || data.amsFormSubmitTarget || '#content'); + ams.executeFunctionByName(data.amsFormInitSubmit || 'MyAMS.form.initSubmit', form, target); + } else if (!data.amsFormHideSubmitFooter) { + ams.executeFunctionByName(data.amsFormInitSubmit || 'MyAMS.form.initSubmitFooter', form); + } + } + + var hasUpload = typeof(options.uuid) !== 'undefined'; if (hasUpload) { - if (url.indexOf('X-Progress-ID') < 0) + if (url.indexOf('X-Progress-ID') < 0) { url += "?X-Progress-ID=" + options.uuid; + } delete options.uuid; } + if (submit_options) { + form_data = $.extend({}, form_data, submit_options.form_data); + } var defaults = { url: url, type: 'post', @@ -1325,33 +1439,37 @@ data: form_data, dataType: data.amsFormDatatype, beforeSerialize: function(/*form, options*/) { - if (typeof(tinyMCE) != 'undefined') - tinyMCE.triggerSave(); + if (typeof(globals.tinyMCE) !== 'undefined') { + globals.tinyMCE.triggerSave(); + } }, beforeSubmit: function(data, form /*, options*/) { form.data('submitted', true); }, error: function(request, status, error, form) { - if (target) + if (target) { ams.executeFunctionByName(data.amsFormSubmitError || 'MyAMS.form.finalizeSubmitOnError', form, target); + } if (form.is(':visible')) { var button = form.data('ams-submit-button'); - if (button) + if (button) { button.button('reset'); + } ams.form.finalizeSubmitFooter.call(form); } form.data('submitted', false); form.removeData('ams-submit-button'); }, iframe: hasUpload - } - var download_target = data.amsFormDownloadTarget; + }; + var download_target = (submit_options && submit_options.downloadTarget) || data.amsFormDownloadTarget; if (download_target) { var iframe = $('iframe[name="' + download_target + '"]'); - if (!iframe.exists()) + if (!iframe.exists()) { iframe = $('').hide() .attr('name', download_target) .appendTo(form); + } defaults = $.extend({}, defaults, { iframe: true, iframeTarget: iframe, @@ -1362,13 +1480,16 @@ } else { var callback; var button = form.data('ams-submit-button'); - if (button) + if (button) { callback = button.data('ams-form-submit-callback'); - if (!callback) + } + if (!callback) { callback = ams.getFunctionByName(data.amsFormSubmitCallback) || ams.form._submitCallback; + } callback.call(form, result, status, request, form); - if (form.is(':visible') && button) + if (form.is(':visible') && button) { button.button('reset'); + } form.data('submitted', false); form.removeData('ams-submit-button'); form.removeAttr('data-ams-form-changed'); @@ -1378,12 +1499,14 @@ } else { defaults = $.extend({}, defaults, { error: function(request, status, error, form) { - if (target) + if (target) { ams.executeFunctionByName(data.amsFormSubmitError || 'MyAMS.form.finalizeSubmitOnError', form, target); + } if (form.is(':visible')) { var button = form.data('ams-submit-button'); - if (button) + if (button) { button.button('reset'); + } ams.form.finalizeSubmitFooter.call(form); } form.data('submitted', false); @@ -1392,13 +1515,16 @@ success: function(result, status, request, form) { var callback; var button = form.data('ams-submit-button'); - if (button) + if (button) { callback = button.data('ams-form-submit-callback'); - if (!callback) + } + if (!callback) { callback = ams.getFunctionByName(data.amsFormSubmitCallback) || ams.form._submitCallback; + } callback.call(form, result, status, request, form); - if (form.is(':visible') && button) + if (form.is(':visible') && button) { button.button('reset'); + } form.data('submitted', false); form.removeData('ams-submit-button'); form.removeAttr('data-ams-form-changed'); @@ -1415,8 +1541,9 @@ ams.dialog.close(form); } else { ams.form.finalizeSubmitFooter.call(form); - if (button) + if (button) { button.button('reset'); + } form.data('submitted', false); form.removeData('ams-submit-button'); form.removeAttr('data-ams-form-changed'); @@ -1436,8 +1563,9 @@ uuid: $.progressBar.submit(form) }); _submitAjaxForm(form, settings); - } else + } else { _submitAjaxForm(form, {}); + } }); return false; }, @@ -1452,10 +1580,12 @@ initSubmit: function(target, message) { var form = $(this); var spin = ''; - if (!message) + if (!message) { message = form.data('ams-form-submit-message'); - if (message) + } + if (message) { spin += '' + message + ''; + } $(target).html('
' + spin + '
'); $(target).parents('.hidden').removeClass('hidden'); }, @@ -1480,10 +1610,12 @@ initSubmitFooter: function(message) { var form = $(this); var spin = ''; - if (!message) + if (!message) { message = $(this).data('ams-form-submit-message'); - if (message) + } + if (message) { spin += '' + message + ''; + } var footer = $('footer', form); $('button', footer).hide(); footer.append('
' + spin + '
'); @@ -1523,25 +1655,31 @@ */ _submitCallback: function(result, status, request, form) { + var button; if (form.is(':visible')) { ams.form.finalizeSubmitFooter.call(form); - var button = form.data('ams-submit-button'); - if (button) + button = form.data('ams-submit-button'); + if (button) { button.button('reset'); + } } + var data = form.data(); - if (data.amsFormDatatype) - var data_type = data.amsFormDatatype; - else { + var data_type; + if (data.amsFormDatatype) { + data_type = data.amsFormDatatype; + } else { var request_data = ams.ajax.getResponse(request); data_type = request_data.content_type; result = request_data.data; } - if (button) - var target = $(button.amsFormSubmitTarget || data.amsFormSubmitTarget || '#content'); - else + var target; + if (button) { + target = $(button.data('ams-form-submit-target') || data.amsFormSubmitTarget || '#content'); + } else { target = $(data.amsFormSubmitTarget || '#content'); + } switch (data_type) { case 'json': @@ -1552,12 +1690,16 @@ case 'xml': break; case 'html': + /* falls through */ case 'text': + /* falls through */ default: - if (button && (button.data('ams-keep-modal') !== true)) + if (button && (button.data('ams-keep-modal') !== true)) { ams.dialog.close(form); - if (!target.exists()) + } + if (!target.exists()) { target = $('body'); + } target.parents('.hidden').removeClass('hidden'); $('.alert', target.parents('.alerts-container')).remove(); target.css({opacity: '0.0'}) @@ -1565,6 +1707,7 @@ .delay(50) .animate({opacity: '1.0'}, 300); ams.initContent(target); + ams.form.setFocus(target); } var callback = request.getResponseHeader('X-AMS-Callback'); if (callback) { @@ -1577,10 +1720,11 @@ * Get list of custom validators called before submit */ _getSubmitValidators: function(form) { - var validators = new Array(); + var validators = []; var form_validator = form.data('ams-form-validator'); - if (form_validator) + if (form_validator) { validators.push([form, form_validator]); + } $('[data-ams-form-validator]', form).each(function() { var source = $(this); validators.push([source, source.data('ams-form-validator')]); @@ -1599,30 +1743,31 @@ */ _checkSubmitValidators: function(form) { var validators = ams.form._getSubmitValidators(form); - if (!validators.length) + if (!validators.length) { return true; - var output = new Array(); + } + var output = []; var result = true; - for (var index in validators) { - if (!$.isNumeric(index)) // IE check ! - continue; + for (var index=0; index < validators.length; index++) { var validator = validators[index]; var source = validator[0]; var handler = validator[1]; var validator_result = ams.executeFunctionByName(handler, form, source); - if (validator_result === false) + if (validator_result === false) { result = false; - else if (typeof(validator_result) == 'string') + } else if (typeof(validator_result) === 'string') { output.push(validator_result); - else if (result.length && (result.length > 0)) + } else if (result.length && (result.length > 0)) { output = output.concat(result); + } } if (output.length > 0) { - var header = output.length == 1 ? ams.i18n.ERROR_OCCURED : ams.i18n.ERRORS_OCCURED; + var header = output.length === 1 ? ams.i18n.ERROR_OCCURED : ams.i18n.ERRORS_OCCURED; ams.skin.alert(form, 'danger', header, output); return false; - } else + } else { return result; + } }, /** @@ -1639,50 +1784,52 @@ * message: "Second error message"},...]} */ showErrors: function(form, errors) { - if (typeof(errors) == 'string') { - ams.skin.alert(form, 'error', ams.i18n.ERROR_OCCURED, errors) + var header; + if (typeof(errors) === 'string') { + ams.skin.alert(form, 'error', ams.i18n.ERROR_OCCURED, errors); } else if (errors instanceof Array) { - var header = errors.length == 1 ? ams.i18n.ERROR_OCCURED : ams.i18n.ERRORS_OCCURED; + header = errors.length === 1 ? ams.i18n.ERROR_OCCURED : ams.i18n.ERRORS_OCCURED; ams.skin.alert(form, 'error', header, errors); } else { $('.state-error', form).removeClass('state-error'); header = errors.error_header || (errors.widgets && (errors.widgets.length > 1) ? ams.i18n.ERRORS_OCCURED : ams.i18n.ERROR_OCCURED); - var message = new Array(); + var message = []; var index; - for (index in errors.messages) { - if (!$.isNumeric(index)) - continue; - if (errors.messages[index].header) { - message.push('' + errors.messages[index].header + '
' + errors.messages[index].message); - } else { - message.push(errors.messages[index].message || errors.messages[index]); + if (errors.messages) { + for (index = 0; index < errors.messages.length; index++) { + var msg = errors.messages[index]; + if (msg.header) { + message.push('' + msg.header + '
' + msg.message); + } else { + message.push(msg.message || msg); + } } } - for (index in errors.widgets) { - if (!$.isNumeric(index)) - continue; - // set widget status message - var widget_data = errors.widgets[index]; - var widget = $('[name="' + widget_data.name + '"]', form); - widget.parents('label:first') - .removeClassPrefix('state-') - .addClass('state-error') - .after('' + widget_data.message + ''); - // complete form alert message - if (widget_data.label) { - message.push(widget_data.label + ' : ' + widget_data.message); - } - // mark parent tab (if any) with error status - var tab_index = widget.parents('.tab-pane').index() + 1; - if (tab_index > 0) { - var nav_tabs = $('.nav-tabs', $(widget).parents('.tabforms')); - $('li:nth-child(' + tab_index + ')', nav_tabs).removeClassPrefix('state-') - .addClass('state-error'); - $('li.state-error:first a', form).click(); + if (errors.widgets) { + for (index = 0; index < errors.widgets.length; index++) { + // set widget status message + var widget_data = errors.widgets[index]; + var widget = $('[name="' + widget_data.name + '"]', form); + widget.parents('label:first') + .removeClassPrefix('state-') + .addClass('state-error') + .after('' + widget_data.message + ''); + // complete form alert message + if (widget_data.label) { + message.push(widget_data.label + ' : ' + widget_data.message); + } + // mark parent tab (if any) with error status + var tab_index = widget.parents('.tab-pane').index() + 1; + if (tab_index > 0) { + var nav_tabs = $('.nav-tabs', $(widget).parents('.tabforms')); + $('li:nth-child(' + tab_index + ')', nav_tabs).removeClassPrefix('state-') + .addClass('state-error'); + $('li.state-error:first a', form).click(); + } } } - ams.skin.alert(form, errors.error_level || 'error', header, message, errors.error_message); + ams.skin.alert($('fieldset:first', form), errors.error_level || 'error', header, message, errors.error_message); } } }; @@ -1706,8 +1853,10 @@ if (element) { dialog = element.objectOrParentWithClass('modal-dialog'); } + + var callbacks; if (dialog && dialog.exists()) { - var callbacks = dialog.data('shown-callbacks'); + callbacks = dialog.data('shown-callbacks'); if (callbacks === undefined) { callbacks = []; dialog.data('shown-callbacks', callbacks); @@ -1715,8 +1864,9 @@ } else { callbacks = ams.dialog._shown_callbacks; } - if (callbacks.indexOf(callback) < 0) + if (callbacks.indexOf(callback) < 0) { callbacks.push(callback); + } }, /** @@ -1732,8 +1882,10 @@ if (element) { dialog = element.objectOrParentWithClass('modal-dialog'); } + + var callbacks; if (dialog && dialog.exists()) { - var callbacks = dialog.data('hide-callbacks'); + callbacks = dialog.data('hide-callbacks'); if (callbacks === undefined) { callbacks = []; dialog.data('hide-callbacks', callbacks); @@ -1741,8 +1893,9 @@ } else { callbacks = ams.dialog._hide_callbacks; } - if (callbacks.indexOf(callback) < 0) + if (callbacks.indexOf(callback) < 0) { callbacks.push(callback); + } }, /** @@ -1764,21 +1917,25 @@ '
' + '
'; } - if (typeof(source) == 'string') { - var source_data = {}; - var url = source; + + var source_data; + var url; + if (typeof(source) === 'string') { + source_data = {}; + url = source; } else { source_data = source.data(); url = source.attr('href') || source_data.amsUrl; var url_getter = ams.getFunctionByName(url); - if (typeof(url_getter) == 'function') { + if (typeof(url_getter) === 'function') { url = url_getter.call(source); } } - if (!url) + if (!url) { return; + } $('body').modalmanager('loading'); - if (url.indexOf('#') == 0) { + if (url.indexOf('#') === 0) { // Inner hidden modal dialog $(url).modal('show'); } else { @@ -1802,15 +1959,18 @@ case 'xml': break; case 'html': + /* falls through */ case 'text': + /* falls through */ default: var content = $(result); var dialog = $('.modal-dialog', content.wrap('
').parent()); var dialog_data = dialog.data(); var data_options = { + backdrop: 'static', overflow: dialog_data.amsModalOverflow || '.modal-viewport', - maxHeight: dialog_data.amsModalMaxHeight === undefined - ? function() { + maxHeight: dialog_data.amsModalMaxHeight === undefined ? + function() { return $(window).height() - $('.modal-header', content).outerHeight(true) - $('footer', content).outerHeight(true) - 85; @@ -1842,15 +2002,17 @@ function resetViewport(ev) { var top = $('.scrollmarker.top', viewport); var top_position = viewport.scrollTop(); - if (top_position > 0) + if (top_position > 0) { top.show(); - else + } else { top.hide(); + } var bottom = $('.scrollmarker.bottom', viewport); - if (maxHeight + top_position >= viewport.get(0).scrollHeight) + if (maxHeight + top_position >= viewport.get(0).scrollHeight) { bottom.hide(); - else + } else { bottom.show(); + } } var modal = e.target; @@ -1858,7 +2020,7 @@ if (viewport.exists()) { var maxHeight = parseInt(viewport.css('max-height')); var barWidth = $.scrollbarWidth(); - if (viewport.height() == maxHeight) { + if (viewport.height() === maxHeight) { $('
').addClass('scrollmarker') .addClass('top') .css('top', 0) @@ -1879,17 +2041,22 @@ } // Call shown callbacks registered for this dialog + var index; var callbacks = $('.modal-dialog', modal).data('shown-callbacks'); if (callbacks) { - for (var index in callbacks) { + for (index=0; index < callbacks.length; index++) { callbacks[index].call(modal); } } // Call globally registered shown callbacks callbacks = ams.dialog._shown_callbacks; - for (index in callbacks) { - callbacks[index].call(modal); + if (callbacks) { + for (index=0; index < callbacks.length; index++) { + callbacks[index].call(modal); + } } + + ams.form.setFocus(modal); }, /** @@ -1899,8 +2066,9 @@ var modal = context.parents('.modal').data('modal'); if (modal) { var manager = $('body').data('modalmanager'); - if (manager && (manager.getOpenModals().indexOf(modal) >= 0)) + if (manager && (manager.getOpenModals().indexOf(modal) >= 0)) { modal.hide(); + } } }, @@ -1913,16 +2081,19 @@ // Call registered cleaning callbacks ams.skin.cleanContainer(modal); // Call hide callbacks registered for this dialog + var index; var callbacks = $('.modal-dialog', modal).data('hide-callbacks'); if (callbacks) { - for (var index in callbacks) { + for (index=0; index < callbacks.length; index++) { callbacks[index].call(modal); } } // Call globally registered hide callbacks callbacks = ams.dialog._hide_callbacks; - for (index in callbacks) { - callbacks[index].call(modal); + if (callbacks) { + for (index=0; index < callbacks.length; index++) { + callbacks[index].call(modal); + } } } }; @@ -1949,16 +2120,18 @@ select2FormatSelection: function(object, container) { if (object instanceof Array) { $(object).each(function() { - if (typeof(this) == 'object') + if (typeof(this) === 'object') { container.append(this.text); - else + } else { container.append(this); + } }); } else { - if (typeof(object) == 'object') + if (typeof(object) === 'object') { container.append(object.text); - else + } else { container.append(object); + } } }, @@ -1975,7 +2148,7 @@ break; case 'modal': $(this).data('select2').dropdown.hide(); - ams.dialog.open(result.location); + ams.dialog.open(data.location); break; default: return { @@ -1989,7 +2162,7 @@ /** Select2 JSON-RPC success callback */ select2QueryMethodSuccessCallback: function(data, status, options) { var result = data.result; - if (typeof(result) == 'string') { + if (typeof(result) === 'string') { try { result = JSON.parse(result); } catch (e) {} @@ -2019,25 +2192,26 @@ /** Context menu handler */ contextMenuHandler: function(target, menu) { var menu_data = menu.data(); - if (menu_data.toggle == 'modal') { + if (menu_data.toggle === 'modal') { ams.dialog.open(menu); } else { var href = menu.attr('href') || menu_data.amsUrl; - if (!href || href.startsWith('javascript:') || menu.attr('target')) + if (!href || href.startsWith('javascript') || menu.attr('target')) { return; + } ams.event.stop(); var href_getter = ams.getFunctionByName(href); - if (typeof(href_getter) == 'function') { + if (typeof(href_getter) === 'function') { href = href_getter.call(menu, target); } - if (typeof(href) == 'function') { + if (typeof(href) === 'function') { // Javascript function call href.call(menu, target); } else { // Standard AJAX or browser URL call // Convert %23 chars to # href = href.replace(/\%23/, '#'); - var target = menu.data('ams-target'); + target = menu.data('ams-target'); if (target) { ams.form.confirmChangedForm(target, function () { ams.skin.loadURL(href, target, menu.data('ams-link-options'), menu.data('ams-link-callback')); @@ -2045,17 +2219,19 @@ } else { ams.form.confirmChangedForm(function () { if (href.startsWith('#')) { - if (href != location.hash) { + if (href !== location.hash) { if (ams.root.hasClass('mobile-view-activated')) { ams.root.removeClass('hidden-menu'); window.setTimeout(function () { window.location.hash = href; }, 150); - } else + } else { window.location.hash = href; + } } - } else + } else { window.location = href; + } }); } } @@ -2093,66 +2269,132 @@ ams.plugins.initData(element); // Check for disabled plug-ins - var disabled = new Array(); + var disabled = []; $('[data-ams-plugins-disabled]', element).each(function() { var plugins = $(this).data('ams-plugins-disabled').split(/\s+/); - for (var name in plugins) { - disabled.push(plugins[name]); + for (var index=0; index < plugins.length; index++) { + disabled.push(plugins[index]); } }); - // Load and register new plug-ins + // Scan new element for plug-ins + var plugins = {}; + var plugin; var name; + $('[data-ams-plugins]', element).each(function() { + + function registerPlugin(name, new_plugin) { + if (plugins.hasOwnProperty(name)) { + var plugin = plugins[name]; + plugin.css = plugin.css || new_plugin.css; + if (new_plugin.callback) { + plugin.callbacks.push(new_plugin.callback); + } + if (new_plugin.register) { + plugin.register = true; + } + if (new_plugin.async === false) { + plugin.async = false; + } + } else { + plugins[name] = { + src: new_plugin.src, + css: new_plugin.css, + callbacks: new_plugin.callback ? [new_plugin.callback] : [], + register: new_plugin.register, + async: new_plugin.async + } + } + } + var source = $(this); - var plugins = {} - if (typeof(source.data('ams-plugins')) === 'string') { + var ams_plugins = source.data('ams-plugins'); + if (typeof(ams_plugins) === 'string') { var names = source.data('ams-plugins').split(/\s+/); - for (var index in names) { + for (var index = 0; index < names.length; index++) { name = names[index]; - var plugin_options = { + var new_plugin = { src: source.data('ams-plugin-' + name + '-src'), css: source.data('ams-plugin-' + name + '-css'), callback: source.data('ams-plugin-' + name + '-callback'), register: source.data('ams-plugin-' + name + '-register'), async: source.data('ams-plugin-' + name + '-async') - } - plugins[name] = plugin_options; + }; + registerPlugin(name, new_plugin); } } else { - plugins = source.data('ams-plugins'); - } - for (name in plugins) { - if (ams.plugins.enabled[name] === undefined) { - var plugin = plugins[name]; - ams.getScript(plugin.src, function() { - var callback = plugin.callback; - if (callback) { - var called = ams.getFunctionByName(callback); - if (plugin.register !== false) - ams.plugins.enabled[name] = called; - } else { - if (plugin.register !== false) - ams.plugins.enabled[name] = null; - } - var css = plugin['css']; - if (css) { - ams.getCSS(css, name + '_css'); - } - }, { - async: plugin.async === undefined ? true : plugin.async - }); + for (name in ams_plugins) { + if (!ams_plugins.hasOwnProperty(name)) { + continue; + } + registerPlugin(name, ams_plugins[name]); } } }); + // Load new plug-ins and execute async ones + for (name in plugins) { + if (ams.plugins.enabled[name] === undefined) { + plugin = plugins[name]; + ams.getScript(plugin.src, function() { + var index; + var callbacks = plugin.callbacks; + if (callbacks) { + for (index=0; index < callbacks.length; index++) { + var called = ams.getFunctionByName(callbacks[index]); + if (plugin.register !== false) { + var enabled = ams.plugins.enabled; + if (enabled.hasOwnProperty(name)) { + enabled[name].push(called); + } else { + enabled[name] = [called]; + } + } + } + } else { + if (plugin.register !== false) { + ams.plugins.enabled[name] = null; + } + } + var css = plugin.css; + if (css) { + ams.getCSS(css, name + '_css'); + } + // If running in async mode, registered plug-ins are run + // before callback is called so we call plug-in manually + if (callbacks && (plugin.async !== false)) { + for (index=0; index < callbacks.length; index++) { + callbacks[index](element); + } + } + }, { + async: plugin.async === undefined ? true : plugin.async + }); + } + } + // Run all enabled plug-ins for (var index in ams.plugins.enabled) { - if (disabled.indexOf(index) >= 0) + if (!ams.plugins.enabled.hasOwnProperty(index)) { + continue; + } + if (disabled.indexOf(index) >= 0) { continue; - var plugin = ams.plugins.enabled[index]; - if (typeof(plugin) == 'function') - plugin(element); + } + var callbacks = ams.plugins.enabled[index]; + switch (typeof(callbacks)) { + case 'function': + callbacks(element); + break; + default: + for (var cb_index = 0; cb_index < callbacks.length; cb_index++) { + var callback = callbacks[cb_index]; + if (typeof(callback) === 'function') { + callback(element); + } + } + } } }, @@ -2166,8 +2408,12 @@ $('[data-ams-data]', element).each(function() { var handler = $(this); var data = handler.data('ams-data'); - for (var index in data) { - handler.attr('data-' + index, data[index]); + if (data) { + for (var name in data) { + if (data.hasOwnProperty(name)) { + handler.attr('data-' + name, data[name]); + } + } } }); }, @@ -2180,17 +2426,18 @@ * @callback: a callback function which can be called after plug-in registry */ register: function(plugin, name, callback) { - if (typeof(name) == 'function') { + if (typeof(name) === 'function') { callback = name; name = null; } name = name || plugin.name; if (ams.plugins.enabled.indexOf(name) >= 0) { - if (window.console) - console.warn("Plugin "+name+" is already registered!"); + if (globals.console) { + globals.console.warn("Plugin " + name + " is already registered!"); + } return; } - if (typeof(plugin) == 'object') { + if (typeof(plugin) === 'object') { var src = plugin.src; if (src) { ams.ajax.check(plugin.callback, src, function(first_load) { @@ -2203,7 +2450,7 @@ ams.executeFunctionByName(callback); } } - }) + }); } else { ams.plugins.enabled[name] = ams.getFunctionByName(plugin.callback); if (plugin.css) { @@ -2213,7 +2460,7 @@ ams.executeFunctionByName(callback); } } - } else if (typeof(plugin) == 'function') { + } else if (typeof(plugin) === 'function') { ams.plugins.enabled[name] = plugin; if (callback) { ams.executeFunctionByName(callback); @@ -2241,33 +2488,34 @@ */ hint: function(element) { var hints = $('.hint:not(:parents(.nohints))', element); - if (hints.length > 0) + if (hints.length > 0) { ams.ajax.check($.fn.tipsy, ams.baseURL + 'ext/jquery-tipsy' + ams.devext + '.js', - function() { - ams.getCSS(ams.baseURL + '../css/ext/jquery-tipsy' + ams.devext + '.css', + function () { + ams.getCSS(ams.baseURL + '../css/ext/jquery-tipsy' + ams.devext + '.css', 'jquery-tipsy'); - hints.each(function() { - var hint = $(this); - var data = hint.data(); - var data_options = { - html: data.amsHintHtml, - title: ams.getFunctionByName(data.amsHintTitleGetter) || function() { - var hint = $(this); - return hint.attr('original-title') || + hints.each(function () { + var hint = $(this); + var data = hint.data(); + var data_options = { + html: data.amsHintHtml, + title: ams.getFunctionByName(data.amsHintTitleGetter) || function () { + var hint = $(this); + return hint.attr('original-title') || hint.attr(data.amsHintTitleAttr || 'title') || (data.amsHintHtml ? hint.html() : hint.text()); - }, - opacity: data.amsHintOpacity || 0.95, - gravity: data.amsHintGravity || 'sw', - offset: data.amsHintOffset || 0 - }; - var settings = $.extend({}, data_options, data.amsHintOptions); - settings = ams.executeFunctionByName(data.amsHintInitCallback, hint, settings) || settings; - var plugin = hint.tipsy(settings); - ams.executeFunctionByName(data.amsHintAfterInitCallback, hint, plugin, settings); - }); + }, + opacity: data.amsHintOpacity || 0.95, + gravity: data.amsHintGravity || 'sw', + offset: data.amsHintOffset || 0 + }; + var settings = $.extend({}, data_options, data.amsHintOptions); + settings = ams.executeFunctionByName(data.amsHintInitCallback, hint, settings) || settings; + var plugin = hint.tipsy(settings); + ams.executeFunctionByName(data.amsHintAfterInitCallback, hint, plugin, settings); + }); }); + } }, /** @@ -2302,15 +2550,16 @@ if (!data.amsSwitcher) { $('') .prependTo($(this)) - .addClass(data.amsSwitcherState == 'open' ? + .addClass(data.amsSwitcherState === 'open' ? (data.amsSwitcherMinusClass || 'fa-minus') : (data.amsSwitcherPlusClass || 'fa-plus')); legend.on('click', function(e) { e.preventDefault(); var veto = {}; legend.trigger('ams.switcher.before-switch', [legend, veto]); - if (veto.veto) + if (veto.veto) { return; + } if (fieldset.hasClass('switched')) { fieldset.removeClass('switched'); $('.fa', legend).removeClass(data.amsSwitcherPlusClass || 'fa-plus') @@ -2320,8 +2569,9 @@ if (id) { $('legend.switcher[data-ams-switcher-sync="'+id+'"]', fieldset).each(function() { var switcher = $(this); - if (switcher.parents('fieldset').hasClass('switched')) + if (switcher.parents('fieldset').hasClass('switched')) { switcher.click(); + } }); } } else { @@ -2331,8 +2581,9 @@ legend.trigger('ams.switcher.closed', [legend]); } }); - if (data.amsSwitcherState != 'open') + if (data.amsSwitcherState !== 'open') { fieldset.addClass('switched'); + } legend.data('ams-switcher', 'on'); } }); @@ -2357,7 +2608,7 @@ var marker = data.amsCheckerMarker || false; if (prefix) { hidden = $('').attr('name', prefix + fieldname) - .val(data.amsCheckerState == 'on' ? checkedValue : uncheckedValue) + .val(data.amsCheckerState === 'on' ? checkedValue : uncheckedValue) .prependTo(legend); } else if (marker) { $('').attr('name', marker) @@ -2369,7 +2620,7 @@ .data('ams-checker-hidden-input', hidden) .data('ams-checker-init', true) .val(data.amsCheckerValue || true) - .attr('checked', data.amsCheckerState == 'on' ? 'checked' : null); + .attr('checked', data.amsCheckerState === 'on' ? 'checked' : null); if (data.amsCheckerReadonly) { input.attr('disabled', 'disabled'); } else { @@ -2387,21 +2638,25 @@ if (!data.amsCheckerCancelDefault) { var hidden = input.data('ams-checker-hidden-input'); if (isChecked) { - if (data.amsCheckerMode == 'disable') + if (data.amsCheckerMode === 'disable') { fieldset.removeAttr('disabled'); - else + } else { fieldset.removeClass('switched'); - if (hidden) + } + if (hidden) { hidden.val(checkedValue); + } $('[data-required]', fieldset).attr('required', 'required'); legend.trigger('ams.checker.opened', [legend]); } else { - if (data.amsCheckerMode == 'disable') + if (data.amsCheckerMode === 'disable') { fieldset.prop('disabled', 'disabled'); - else + } else { fieldset.addClass('switched'); - if (hidden) + } + if (hidden) { hidden.val(uncheckedValue); + } $('[data-required]', fieldset).removeAttr('required'); legend.trigger('ams.checker.closed', [legend]); } @@ -2414,13 +2669,14 @@ .prependTo(legend); var required = $('[required]', fieldset); required.attr('data-required', true); - if (data.amsCheckerState == 'on') { + if (data.amsCheckerState === 'on') { input.attr('checked', true); } else { - if (data.amsCheckerMode == 'disable') + if (data.amsCheckerMode === 'disable') { fieldset.attr('disabled', 'disabled'); - else + } else { fieldset.addClass('switched'); + } required.removeAttr('required'); } legend.data('ams-checker', 'on'); @@ -2571,53 +2827,54 @@ allowClear: data.amsSelect2AllowClear === undefined ? true : data.amsSelect2AllowClear, width: data.amsSelect2Width || '100%', initSelection: ams.getFunctionByName(data.amsSelect2InitSelection), - formatSelection: data.amsSelect2FormatSelection === undefined - ? ams.helpers.select2FormatSelection + formatSelection: data.amsSelect2FormatSelection === undefined ? + ams.helpers.select2FormatSelection : ams.getFunctionByName(data.amsSelect2FormatSelection), formatResult: ams.getFunctionByName(data.amsSelect2FormatResult), - formatMatches: data.amsSelect2FormatMatches === undefined - ? function(matches) { - if (matches == 1) + formatMatches: data.amsSelect2FormatMatches === undefined ? + function(matches) { + if (matches === 1) { return ams.i18n.SELECT2_MATCH; - else + } else { return matches + ams.i18n.SELECT2_MATCHES; + } } : ams.getFunctionByName(data.amsSelect2FormatMatches), - formatNoMatches: data.amsSelect2FormatResult === undefined - ? function(term) { + formatNoMatches: data.amsSelect2FormatResult === undefined ? + function(term) { return ams.i18n.SELECT2_NOMATCHES; } : ams.getFunctionByName(data.amsSelect2FormatResult), - formatInputTooShort: data.amsSelect2FormatInputTooShort === undefined - ? function(input, min) { + formatInputTooShort: data.amsSelect2FormatInputTooShort === undefined ? + function(input, min) { var n = min - input.length; return ams.i18n.SELECT2_INPUT_TOOSHORT .replace(/\{0\}/, n) - .replace(/\{1\}/, n == 1 ? "" : ams.i18n.SELECT2_PLURAL); + .replace(/\{1\}/, n === 1 ? "" : ams.i18n.SELECT2_PLURAL); } : ams.getFunctionByName(data.amsSelect2FormatInputTooShort), - formatInputTooLong: data.amsSelect2FormatInputTooLong === undefined - ? function(input, max) { + formatInputTooLong: data.amsSelect2FormatInputTooLong === undefined ? + function(input, max) { var n = input.length - max; return ams.i18n.SELECT2_INPUT_TOOLONG .replace(/\{0\}/, n) - .replace(/\{1\}/, n == 1 ? "" : ams.i18n.SELECT2_PLURAL); + .replace(/\{1\}/, n === 1 ? "" : ams.i18n.SELECT2_PLURAL); } : ams.getFunctionByName(data.amsSelect2FormatInputTooLong), - formatSelectionTooBig: data.amsSelect2FormatSelectionTooBig === undefined - ? function(limit) { + formatSelectionTooBig: data.amsSelect2FormatSelectionTooBig === undefined ? + function(limit) { return ams.i18n.SELECT2_SELECTION_TOOBIG .replace(/\{0\}/, limit) - .replace(/\{1\}/, limit == 1 ? "" : ams.i18n.SELECT2_PLURAL); + .replace(/\{1\}/, limit === 1 ? "" : ams.i18n.SELECT2_PLURAL); } : ams.getFunctionByName(data.amsSelect2FormatSelectionTooBig), - formatLoadMore: data.amsSelect2FormatLoadMore === undefined - ? function (pageNumber) { + formatLoadMore: data.amsSelect2FormatLoadMore === undefined ? + function (pageNumber) { return ams.i18n.SELECT2_LOADMORE; } : ams.getFunctionByName(data.amsSelect2FormatLoadMore), - formatSearching: data.amsSelect2FormatSearching === undefined - ? function() { + formatSearching: data.amsSelect2FormatSearching === undefined ? + function() { return ams.i18n.SELECT2_SEARCHING; } : ams.getFunctionByName(data.amsSelect2FormatSearching), @@ -2639,7 +2896,7 @@ text: values_data[this] || this}); }); callback(data); - } + }; } } break; @@ -2648,7 +2905,7 @@ } if (select.attr('readonly')) { - if (select.attr('type') == 'hidden') { + if (select.attr('type') === 'hidden') { data_options.query = function () { return []; }; @@ -2734,8 +2991,9 @@ select.on('change', function() { var validator = $(select.get(0).form).data('validator'); - if (validator !== undefined) + if (validator !== undefined) { $(select).valid(); + } }); }); }); @@ -2755,7 +3013,8 @@ var mask = $(this); var data = mask.data(); var data_options = { - placeholder: data.amsMaskeditPlaceholder || 'X' + placeholder: data.amsMaskeditPlaceholder === undefined ? 'X' : data.amsMaskeditPlaceholder, + complete: ams.getFunctionByName(data.amsMaskeditComplete) }; var settings = $.extend({}, data_options, data.amsMaskeditOptions); settings = ams.executeFunctionByName(data.amsMaskeditInitCallback, mask, settings) || settings; @@ -2909,18 +3168,23 @@ errorClass: 'state-error', errorPlacement: function(error, element) { var label = element.parents('label:first'); - if (label.length) + if (label.length) { error.insertAfter(label); - else + } else { error.insertAfter(element); + } } }); if (ams.plugins.i18n) { for (var key in ams.plugins.i18n.validate) { + if (!ams.plugins.i18n.validate.hasOwnProperty(key)) { + continue; + } var message = ams.plugins.i18n.validate[key]; - if ((typeof(message) == 'string') && - (message.indexOf('{0}') > -1)) + if ((typeof(message) === 'string') && + (message.indexOf('{0}') > -1)) { ams.plugins.i18n.validate[key] = $.validator.format(message); + } } $.extend($.validator.messages, ams.plugins.i18n.validate); } @@ -2930,9 +3194,9 @@ var data = form.data(); var data_options = { ignore: null, - submitHandler: form.attr('data-async') !== undefined - ? data.amsFormSubmitHandler === undefined - ? function() { + submitHandler: form.attr('data-async') !== undefined ? + data.amsFormSubmitHandler === undefined ? + function() { // JQuery-form plug-in must be loaded synchronously!! // Otherwise, hidden input fields created by jquery-validate plug-in // and matching named buttons will be deleted (on first form submit) @@ -2944,11 +3208,11 @@ } : ams.getFunctionByName(data.amsFormSubmitHandler) : undefined, - invalidHandler: form.attr('data-async') !== undefined - ? data.amsFormInvalidHandler === undefined - ? function(event, validator) { + invalidHandler: form.attr('data-async') !== undefined ? + data.amsFormInvalidHandler === undefined ? + function(event, validator) { $('.state-error', form).removeClass('state-error'); - for (var index in validator.errorList) { + for (var index=0; index < validator.errorList.length; index++) { var error = validator.errorList[index]; var tab_index = $(error.element).parents('.tab-pane').index() + 1; if (tab_index > 0) { @@ -2982,7 +3246,7 @@ ams.baseURL + 'ext/jquery-dataTables-1.9.4' + ams.devext + '.js', function(first_load) { $(tables).each(function() { - ams.ajax.check($.fn.dataTableExt.oPagination['bootstrap_full'], + ams.ajax.check($.fn.dataTableExt.oPagination.bootstrap_full, ams.baseURL + 'myams-dataTables' + ams.devext + '.js'); var table = $(this); var data = table.data(); @@ -3002,13 +3266,14 @@ "><'dt-row dt-bottom-row'<'row'<'col-sm-6'" + (data.amsDatatableInformation === false ? '': 'i') + "><'col-sm-6 text-right'p>>"; + var index; // Check initial sorting var sorting = data.amsDatatableSorting; if (typeof(sorting) === 'string') { var sortings = sorting.split(';'); sorting = []; - for (index in sortings) { + for (index=0; index < sortings.length; index++) { var col_sorting = sortings[index].split(','); col_sorting[0] = parseInt(col_sorting[0]); sorting.push(col_sorting); @@ -3017,7 +3282,7 @@ // Check columns types var columns = []; var sort_types = $('th', table).listattr('data-ams-datatable-stype'); - for (index in sort_types) { + for (index=0; index < sort_types.length; index++) { var sort_type = sort_types[index]; if (sort_type) { var column = columns[index] || {}; @@ -3047,7 +3312,7 @@ }; var settings = $.extend({}, data_options, data.amsDatatableOptions); if (extensions.length > 0) { - for (index in extensions) { + for (index=0; index < extensions.length; index++) { switch (extensions[index]) { case 'autofill': ams.ajax.check($.fn.dataTable.AutoFill, @@ -3114,13 +3379,13 @@ var plugin = table.dataTable(settings); ams.executeFunctionByName(data.amsDatatableAfterInitCallback, table, plugin, settings); if (extensions.length > 0) { - for (index in extensions) { + for (index=0; index < extensions.length; index++) { switch (extensions[index]) { case 'autofill': var af_settings = $.extend({}, data.amsDatatableAutofillOptions, settings.autofill); af_settings = ams.executeFunctionByName(data.amsDatatableAutofillInitCallback, table, af_settings) || af_settings; - table.data('ams-autofill', data.amsDatatableAutofillConstructor === undefined - ? new $.fn.dataTable.AutoFill(table, af_settings) + table.data('ams-autofill', data.amsDatatableAutofillConstructor === undefined ? + new $.fn.dataTable.AutoFill(table, af_settings) : ams.executeFunctionByName(data.amsDatatableAutofillConstructor, table, plugin, af_settings)); break; case 'columnfilter': @@ -3129,29 +3394,29 @@ }; var cf_settings = $.extend({}, cf_default, data.amsDatatableColumnfilterOptions, settings.columnfilter); cf_settings = ams.executeFunctionByName(data.amsDatatableColumnfilterInitCallback, table, cf_settings) || cf_settings; - table.data('ams-columnfilter', data.amsDatatableColumnfilterConstructor === undefined - ? plugin.columnFilter(cf_settings) + table.data('ams-columnfilter', data.amsDatatableColumnfilterConstructor === undefined ? + plugin.columnFilter(cf_settings) : ams.executeFunctionByName(data.amsDatatableColumnfilterConstructor, table, plugin, cf_settings)); break; case 'editable': var ed_settings = $.extend({}, data.amsDatatableEditableOptions, settings.editable); ed_settings = ams.executeFunctionByName(data.amsDatatableEditableInitCallback, table, ed_settings) || ed_settings; - table.data('ams-editable', data.amsDatatableEditableConstructor === undefined - ? table.makeEditable(ed_settings) + table.data('ams-editable', data.amsDatatableEditableConstructor === undefined ? + table.makeEditable(ed_settings) : ams.executeFunctionByName(data.amsDatatableEditableConstructor, table, plugin, ed_settings)); break; case 'fixedcolumns': var fc_settings = $.extend({}, data.amsDatatableFixedcolumnsOptions, settings.fixedcolumns); fc_settings = ams.executeFunctionByName(data.amsDatatableFixedcolumnsInitCallback, table, fc_settings) || fc_settings; - table.data('ams-fixedcolumns', data.amsDatatableFixedcolumnsConstructor === undefined - ? new $.fn.dataTable.FixedColumns(table, fc_settings) + table.data('ams-fixedcolumns', data.amsDatatableFixedcolumnsConstructor === undefined ? + new $.fn.dataTable.FixedColumns(table, fc_settings) : ams.executeFunctionByName(data.amsDatatableFixedcolumnsConstructor, table, plugin, fc_settings)); break; case 'fixedheader': var fh_settings = $.extend({}, data.amsDatatableFixedheaderOptions, settings.fixedheader); fh_settings = ams.executeFunctionByName(data.amsDatatableFixedheadeInitCallback, table, fh_settings) || fh_settings; - table.data('ams-fixedheader', data.amsDatatableFixedheaderConstructor === undefined - ? new $.fn.dataTable.FixedHeader(table, fh_settings) + table.data('ams-fixedheader', data.amsDatatableFixedheaderConstructor === undefined ? + new $.fn.dataTable.FixedHeader(table, fh_settings) : ams.executeFunctionByName(data.amsDatatableFixedheaderConstructor, table, plugin, fh_settings)); break; case 'keytable': @@ -3161,22 +3426,22 @@ }; var kt_settings = $.extend({}, kt_default, data.amsDatatableKeytableOptions, settings.keytable); kt_settings = ams.executeFunctionByName(data.amsDatatableKeytableInitCallback, table, kt_settings) || kt_settings; - table.data('ams-keytable', data.amsDatatableKeytableConstructor === undefined - ? new KeyTable(kt_settings) + table.data('ams-keytable', data.amsDatatableKeytableConstructor === undefined ? + new KeyTable(kt_settings) : ams.executeFunctionByName(data.amsDatatableKeytableConstructor, table, plugin, kt_settings)); break; case 'rowgrouping': var rg_settings = $.extend({}, data.amsDatatableRowgroupingOptions, settings.rowgrouping); rg_settings = ams.executeFunctionByName(data.amsDatatableRowgroupingInitCallback, table, rg_settings) || rg_settings; - table.data('ams-rowgrouping', data.amsDatatableRowgroupingConstructor === undefined - ? table.rowGrouping(rg_settings) + table.data('ams-rowgrouping', data.amsDatatableRowgroupingConstructor === undefined ? + table.rowGrouping(rg_settings) : ams.executeFunctionByName(data.amsDatatableRowgroupingConstructor, table, plugin, rg_settings)); break; case 'rowreordering': var rr_settings = $.extend({}, data.amsDatatableRowreorderingOptions, settings.rowreordering); rr_settings = ams.executeFunctionByName(data.amsDatatableRowreorderingInitCallback, table, rr_settings) || rr_settings; - table.data('ams-rowreordering', data.amsDatatableRowreorderingConstructor === undefined - ? table.rowReordering(rr_settings) + table.data('ams-rowreordering', data.amsDatatableRowreorderingConstructor === undefined ? + table.rowReordering(rr_settings) : ams.executeFunctionByName(data.amsDatatableRowreorderingConstructor, table, plugin, rr_settings)); break; default: @@ -3186,7 +3451,7 @@ } var finalizers = (data.amsDatatableFinalizeCallback || '').split(/\s+/); if (finalizers.length > 0) { - for (index in finalizers) { + for (index=0; index < finalizers.length; index++) { ams.executeFunctionByName(finalizers[index], table, plugin, settings); } } @@ -3208,33 +3473,44 @@ function(first_load) { tables.each(function() { var table = $(this); - $(table).on('mouseover', 'tr', function() { - $(this.cells[0]).addClass('drag-handle'); - }).on('mouseout', 'tr', function() { - $(this.cells[0]).removeClass('drag-handle'); - }); var data = table.data(); + if (data.amsTabledndDragHandle) { + $('tr', table).addClass('no-drag-handle'); + } else { + $(table).on('mouseover', 'tr', function () { + $(this.cells[0]).addClass('drag-handle'); + }).on('mouseout', 'tr', function () { + $(this.cells[0]).removeClass('drag-handle'); + }); + } var data_options = { onDragClass: data.amsTabledndDragClass || 'dragging-row', - onDragStart: data.amsTabledndDragStart, + onDragStart: ams.getFunctionByName(data.amsTabledndDragStart), dragHandle: data.amsTabledndDragHandle, scrollAmount: data.amsTabledndScrollAmount, onAllowDrop: data.amsTabledndAllowDrop, - onDrop: data.amsTabledndDrop || function(dnd_table, row) { + onDrop: ams.getFunctionByName(data.amsTabledndDrop) || function(dnd_table, row) { var target = data.amsTabledndDropTarget; if (target) { + // Disable row click handler + $(row).data('ams-disabled-handlers', 'click'); var rows = []; $(dnd_table.rows).each(function() { var row_id = $(this).data('ams-element-name'); - if (row_id) + if (row_id) { rows.push(row_id); + } }); var local_target = ams.getFunctionByName(target); - if (typeof(local_target) == 'function') { + if (typeof(local_target) === 'function') { local_target.call(table, dnd_table, rows); } else { ams.ajax.post(target, {names: JSON.stringify(rows)}); } + // Restore row click handler + setTimeout(function() { + $(row).removeData('ams-disabled-handlers'); + }, 50); } return false; } @@ -3282,12 +3558,12 @@ language: ams.lang, plugins: [ "advlist autosave autolink lists link image charmap print preview hr anchor pagebreak", - "searchreplace wordcount visualblocks visualchars code fullscreen", + "searchreplace wordcount visualblocks visualchars code", "insertdatetime media nonbreaking save table contextmenu directionality", "emoticons paste textcolor colorpicker textpattern" ], toolbar1: "newdocument undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image", - toolbar2: "print preview media | forecolor backcolor emoticons | code fullscreen", + toolbar2: "print preview media | forecolor backcolor emoticons | code", content_css: data.amsTinymceContentCss, formats: data.amsTinymceFormats, style_formats: data.amsTinymceStyleFormats, @@ -3325,8 +3601,9 @@ ams.ajax.check($.fn.imgAreaSelect, ams.baseURL + 'ext/jquery-imgareaselect-0.9.10' + ams.devext + '.js', function(first_load) { - if (first_load) + if (first_load) { ams.getCSS(ams.baseURL + '../css/ext/jquery-imgareaselect' + ams.devext + '.css'); + } images.each(function() { var image = $(this); var data = image.data(); @@ -3361,7 +3638,7 @@ plugin.update(); }, 250); }); - }) + }); } }, @@ -3374,14 +3651,15 @@ ams.ajax.check($.fn.fancybox, ams.baseURL + 'ext/jquery-fancybox-2.1.5' + ams.devext + '.js', function(first_load) { - if (first_load) + if (first_load) { ams.getCSS(ams.baseURL + '../css/ext/jquery-fancybox-2.1.5' + ams.devext + '.css'); + } fancyboxes.each(function() { var fancybox = $(this); var data = fancybox.data(); var helpers = (data.amsFancyboxHelpers || '').split(/\s+/); if (helpers.length > 0) { - for (var index in helpers) { + for (var index=0; index < helpers.length; index++) { var helper = helpers[index]; switch (helper) { case 'buttons': @@ -3493,9 +3771,10 @@ ams.ajax.check($.fn.mCustomScrollbar, ams.baseURL + 'ext/jquery-mCustomScrollbar' + ams.devext + '.js', function(first_load) { - if (first_load) + if (first_load) { ams.getCSS(ams.baseURL + '../css/ext/jquery-mCustomScrollbar.css', - 'jquery-mCustomScrollbar'); + 'jquery-mCustomScrollbar'); + } scrollbars.each(function() { var scrollbar = $(this); var data = scrollbar.data(); @@ -3543,13 +3822,13 @@ function() { ams.executeFunctionByName(data.amsCallback, self, data.amsCallbackOptions); }); - } else if (window.console) { - console.warn("Undefined callback: " + data.amsCallback); + } else if (globals.console) { + globals.console.warn("Undefined callback: " + data.amsCallback); } } else { callback.call(self, data.amsCallbackOptions); } - }) + }); }, /** @@ -3653,8 +3932,12 @@ $('[data-ams-events-handlers]', element).each(function() { var element = $(this); var handlers = element.data('ams-events-handlers'); - for (var event in handlers) { - element.on(event, ams.getFunctionByName(handlers[event])); + if (handlers) { + for (var event in handlers) { + if (handlers.hasOwnProperty(event)) { + element.on(event, ams.getFunctionByName(handlers[event])); + } + } } }); } @@ -3693,14 +3976,14 @@ content: '  ' + ams.i18n.DELETE_WARNING, buttons: ams.i18n.BTN_OK_CANCEL }, function(button) { - if (button == ams.i18n.BTN_OK) { + if (button === ams.i18n.BTN_OK) { var table = link.parents('table'); var location = table.data('ams-location') || ''; var tr = link.parents('tr'); var delete_target = tr.data('ams-delete-target') || table.data('ams-delete-target') || 'delete-element.json'; var object_name = tr.data('ams-element-name'); MyAMS.ajax.post(location + '/' + delete_target, {'object_name': object_name}, function(result, status) { - if (result.status == 'success') { + if (result.status === 'success') { if (table.hasClass('datatable')) { table.dataTable().fnDeleteRow(tr[0]); } else { @@ -3710,7 +3993,7 @@ }); } }); - } + }; } }; @@ -3740,10 +4023,11 @@ * Check width for mobile devices */ _checkMobileWidth: function() { - if ($(window).width() < 979) - ams.root.addClass('mobile-view-activated') - else if (ams.root.hasClass('mobile-view-activated')) + if ($(window).width() < 979) { + ams.root.addClass('mobile-view-activated'); + } else if (ams.root.hasClass('mobile-view-activated')) { ams.root.removeClass('mobile-view-activated'); + } }, /** @@ -3755,7 +4039,7 @@ }, 200, 'easeOutCirc'); ams.root.addClass('shortcut-on'); }, - + _hideShortcutButtons: function() { ams.shortcuts.animate({ height: 'hide' @@ -3767,13 +4051,14 @@ * Check notification badge */ checkNotification: function() { - $this = $('#activity > .badge'); - if (parseInt($this.text()) > 0) - $this.removeClass("hidden") + var badge = $('#activity > .badge'); + if (parseInt(badge.text()) > 0) { + badge.removeClass("hidden") .addClass("bg-color-red bounceIn animated"); - else - $this.addClass("hidden") + } else { + badge.addClass("hidden") .removeClass("bg-color-red bounceIn animated"); + } }, /** @@ -3782,29 +4067,31 @@ _initDesktopWidgets: function(element) { if (ams.enable_widgets) { var widgets = $('.ams-widget', element); - if (widgets.length > 0) + if (widgets.length > 0) { ams.ajax.check($.fn.MyAMSWidget, ams.baseURL + 'myams-widgets' + ams.devext + '.js', - function() { - widgets.each(function() { - var widget = $(this); - var data = widget.data(); - var data_options = { - deleteSettingsKey: '#deletesettingskey-options', - deletePositionKey: '#deletepositionkey-options' - }; - var settings = $.extend({}, data_options, data.amsWidgetOptions); - settings = ams.executeFunctionByName(data.amsWidgetInitcallback, widget, settings) || settings; - widget.MyAMSWidget(settings); - }); - MyAMSWidget.initWidgetsGrid($('.ams-widget-grid', element)); - }); + function () { + widgets.each(function () { + var widget = $(this); + var data = widget.data(); + var data_options = { + deleteSettingsKey: '#deletesettingskey-options', + deletePositionKey: '#deletepositionkey-options' + }; + var settings = $.extend({}, data_options, data.amsWidgetOptions); + settings = ams.executeFunctionByName(data.amsWidgetInitcallback, widget, settings) || settings; + widget.MyAMSWidget(settings); + }); + globals.MyAMSWidget.initWidgetsGrid($('.ams-widget-grid', element)); + }); + } } }, _initMobileWidgets: function(element) { - if (ams.enable_mobile && ams.enable_widgets) + if (ams.enable_mobile && ams.enable_widgets) { ams.skin._initDesktopWidgets(element); + } }, /** @@ -3818,24 +4105,26 @@ * @margin: if true, a margin will be displayed around alert */ alert: function(parent, status, header, message, subtitle, margin) { - $('.alert', parent).remove(); - if (status == 'error') + if (status === 'error') { status = 'danger'; - var content = '
' + - '' + - '

' + - ' ' + header + - '

' + - (subtitle ? ('

' + subtitle + '

') : ''); - if (typeof(message) == 'string') + } + $('.alert-' + status, parent).remove(); + var content = '
' + + '' + + '

' + + ' ' + header + + '

' + + (subtitle ? ('

' + subtitle + '

') : ''); + if (typeof(message) === 'string') { content += '
  • ' + message + '
'; - else if (message) { + } else if (message) { content += '
    '; for (var index in message) { - if (!$.isNumeric(index)) // IE check + if (!$.isNumeric(index)) { // IE check continue; + } content += '
  • ' + message[index] + '
  • '; - }; + } content += '
'; } content += '
'; @@ -3844,7 +4133,7 @@ ams.ajax.check($.scrollTo, ams.baseURL + 'ext/jquery-scrollTo.min.js', function() { - $.scrollTo(parent, {offset: {top: -50}}); + $.scrollTo(parent, {offset: {top: -50}}); }); } }, @@ -3864,7 +4153,7 @@ * Medium notification message box, displayed on page's bottom right */ messageBox: function(status, options, callback) { - if (typeof(status) == 'object') { + if (typeof(status) === 'object') { callback = options; options = status || {}; status = 'info'; @@ -3872,22 +4161,22 @@ ams.ajax.check(ams.notify, ams.baseURL + 'myams-notify' + ams.devext + '.js', function() { - switch (status) { - case 'error': - case 'danger': - options.color = '#C46A69'; - break; - case 'warning': - options.color = '#C79121'; - break; - case 'success': - options.color = '#739E73'; - break; - default: - options.color = options.color || '#3276B1'; - } - options.sound = false; - ams.notify.bigBox(options, callback); + switch (status) { + case 'error': + case 'danger': + options.color = '#C46A69'; + break; + case 'warning': + options.color = '#C79121'; + break; + case 'success': + options.color = '#739E73'; + break; + default: + options.color = options.color || '#3276B1'; + } + options.sound = false; + ams.notify.bigBox(options, callback); }); }, @@ -3895,30 +4184,30 @@ * Small notification message box, displayed on page's top right */ smallBox: function(status, options, callback) { - if (typeof(status) == 'object') { + if (typeof(status) === 'object') { callback = options; options = status || {}; status = 'info'; } ams.ajax.check(ams.notify, ams.baseURL + 'myams-notify' + ams.devext + '.js', - function() { - switch (status) { - case 'error': - case 'danger': - options.color = '#C46A69'; - break; - case 'warning': - options.color = '#C79121'; - break; - case 'success': - options.color = '#739E73'; - break; - default: - options.color = options.color || '#3276B1'; - } - options.sound = false; - ams.notify.smallBox(options, callback); + function () { + switch (status) { + case 'error': + case 'danger': + options.color = '#C46A69'; + break; + case 'warning': + options.color = '#C79121'; + break; + case 'success': + options.color = '#739E73'; + break; + default: + options.color = options.color || '#3276B1'; + } + options.sound = false; + ams.notify.smallBox(options, callback); }); }, @@ -3927,9 +4216,12 @@ */ _drawBreadCrumb: function() { var crumb = $('#ribbon OL.breadcrumb'); - crumb.empty() - .append($('
  • ').append($('').text(ams.i18n.HOME) - .attr('href', $('nav a[href!="#"]:first').attr('href')))); + $('li', crumb).not('.parent').remove(); + if (!$('li', crumb).exists()) { + crumb.append($('
  • ').append($('').text(ams.i18n.HOME) + .addClass('padding-right-5') + .attr('href', $('nav a[href!="#"]:first').attr('href')))); + } $('nav LI.active >A').each(function() { var menu = $(this); var body = $.trim(menu.clone() @@ -3937,10 +4229,9 @@ .remove() .end() .text()); - var item = $("
  • ").append(menu.attr('href').replace(/^#/, '') - ? $("").html(body) - .attr('href', menu.attr('href')) - : body); + var item = $("
  • ").append(menu.attr('href').replace(/^#/, '') ? + $("").html(body).attr('href', menu.attr('href')) + : body); crumb.append(item); }); }, @@ -3951,26 +4242,30 @@ checkURL: function() { function updateActiveMenus(menu) { - $('nav .active').removeClass('active'); + $('.active', nav).removeClass('active'); menu.addClass('open') .addClass('active'); menu.parents('li').addClass('open active') - .children('ul').addClass('active') - .show(); + .children('ul').addClass('active') + .show(); menu.parents('li:first').removeClass('open'); menu.parents('ul').addClass(menu.attr('href').replace(/^#/, '') ? 'active' : '') - .show(); + .show(); } + var menu; + var nav = $('nav'); var hash = location.hash; var url = hash.replace(/^#/, ''); if (url) { var container = $('#content'); - if (!container.exists()) + if (!container.exists()) { container = $('body'); - var menu = $('nav A[href="' + hash + '"]'); - if (menu.exists()) + } + menu = $('A[href="' + hash + '"]', nav); + if (menu.exists()) { updateActiveMenus(menu); + } ams.skin.loadURL(url, container); document.title = $('[data-ams-page-title]:first', container).data('ams-page-title') || menu.attr('title') || @@ -3978,16 +4273,17 @@ } else { var active_url = $('[data-ams-active-menu]').data('ams-active-menu'); if (active_url) { - menu = $('nav A[href="' + active_url + '"]'); + menu = $('A[href="' + active_url + '"]', nav); } else { - menu = $('nav >UL >LI >A[href!="#"]').first(); + menu = $('>UL >LI >A[href!="#"]', nav).first(); } if (menu.exists()) { updateActiveMenus(menu); - if (active_url) + if (active_url) { ams.skin._drawBreadCrumb(); - else + } else { window.location.hash = menu.attr('href'); + } } } }, @@ -4004,8 +4300,9 @@ */ registerCleanCallback: function(callback) { var callbacks = ams.skin._clean_callbacks; - if (callbacks.indexOf(callback) < 0) + if (callbacks.indexOf(callback) < 0) { callbacks.push(callback); + } }, /** @@ -4013,7 +4310,7 @@ */ cleanContainer: function(container) { var callbacks = ams.skin._clean_callbacks; - for (var index in callbacks) { + for (var index=0; index < callbacks.length; index++) { callbacks[index].call(container); } }, @@ -4025,7 +4322,7 @@ if (url.startsWith('#')) { url = url.substr(1); } - if (typeof(options) == 'function') { + if (typeof(options) === 'function') { callback = options; options = {}; } @@ -4038,7 +4335,7 @@ beforeSend: function() { ams.skin.cleanContainer(container); container.html('

    Loading...

    '); - if (container[0] == $('#content')[0]) { + if (container[0] === $('#content')[0]) { ams.skin._drawBreadCrumb(); document.title = $('.breadcrumb LI:last-child').text(); $('html, body').animate({scrollTop: 0}, 'fast'); @@ -4047,9 +4344,9 @@ } }, success: function(data, status, request) { - if (callback) + if (callback) { ams.executeFunctionByName(callback, this, data, status, request, options); - else { + } else { var request_data = ams.ajax.getResponse(request); var data_type = request_data.content_type; var result = request_data.data; @@ -4063,8 +4360,11 @@ case 'xml': break; case 'html': + /* falls through */ case 'text': + /* falls through */ default: + // Show and init container container.parents('.hidden').removeClass('hidden'); $('.alert', container.parents('.alerts-container')).remove(); container.css({opacity: '0.0'}) @@ -4073,6 +4373,7 @@ .delay(50) .animate({opacity: '1.0'}, 300); ams.initContent(container); + ams.form.setFocus(container); } if (options && options.afterLoadCallback) { ams.executeFunctionByName(options.afterLoadCallback, this); @@ -4122,6 +4423,32 @@ /** + * Statistics management + */ + MyAMS.stats = { + + /** + * Send event to Google Analytics platform + * + * @param category + * @param action + * @param label + */ + logEvent: function(category, action, label) { + if (typeof(globals._gaq) === 'undefined') { + return; + } + if (typeof(category) === 'object') { + action = category.action; + label = category.label; + category = category.category; + } + globals._gaq.push(['_trackEvent', category, action, label]); + } + }; + + + /** * Main page initialization * This code is called only once to register global events and callbacks */ @@ -4132,7 +4459,7 @@ /* Init main components */ ams.root = body; ams.left_panel = $('#left-panel'); - ams.shortcuts = $('#shortcut'); + ams.shortcuts = $('#shortcuts'); ams.plugins.initData(body); // Init main AJAX events @@ -4142,7 +4469,7 @@ progressUpload: ams.ajax.progress, xhr: function() { var request = jquery_xhr(); - if (request && (typeof(request.addEventListener) == "function")) { + if (request && (typeof(request.addEventListener) === "function")) { var that = this; request.addEventListener("progress", function(evt) { that.progress(evt); @@ -4167,7 +4494,7 @@ ams.baseURL + '/ext/jquery-smartclick' + ams.devext + '.js', function() { $('NAV UL A').noClickDelay(); - $('#hide-menu A').noClickDelay(); + $('A', '#hide-menu').noClickDelay(); }); } } @@ -4179,7 +4506,7 @@ }); // Switch shortcuts - $('#show-shortcut').click(function(e) { + $('#show-shortcuts').click(function(e) { if (ams.shortcuts.is(":visible")) { ams.skin._hideShortcutButtons(); } else { @@ -4192,8 +4519,8 @@ }); $(document).mouseup(function(e) { - if (!ams.shortcuts.is(e.target) - && ams.shortcuts.has(e.target).length === 0) { + if (!ams.shortcuts.is(e.target) && + ams.shortcuts.has(e.target).length === 0) { ams.skin._hideShortcutButtons(); } }); @@ -4217,7 +4544,7 @@ activity.addClass('active'); } else { dropdown.fadeOut(150); - activity.removeClass('active') + activity.removeClass('active'); } e.preventDefault(); }); @@ -4234,12 +4561,12 @@ $('input[name="activity"]').change(function() { var url = $(this).data('ams-url'); - container = $('.ajax-notifications'); + var container = $('.ajax-notifications'); ams.skin.loadURL(url, container); }); // Logout button - $('#logout a').click(function(e) { + $('a', '#user-menu LI.logout').click(function(e) { e.preventDefault(); e.stopPropagation(); //get the link @@ -4251,16 +4578,17 @@ content : ams.i18n.LOGOUT_COMMENT, buttons : '['+ams.i18n.BTN_NO+']['+ams.i18n.BTN_YES+']' }, function(ButtonPressed) { - if (ButtonPressed == ams.i18n.BTN_YES) { + if (ButtonPressed === ams.i18n.BTN_YES) { ams.root.addClass('animated fadeOutUp'); - setTimeout(ams.skin.logout, 1000) + setTimeout(ams.skin.logout, 1000); } }); }); // Initialize left nav - $('NAV UL').myams_menu({ - accordion : true, + var nav = $('nav'); + $('UL', nav).myams_menu({ + accordion : nav.data('ams-menu-accordion') !== false, speed : ams.menu_speed }); @@ -4278,7 +4606,7 @@ content: ams.i18n.CLEAR_STORAGE_CONTENT, buttons: '['+ams.i18n.BTN_CANCEL+']['+ams.i18n.BTN_OK+']' }, function(buttonPressed) { - if (buttonPressed == ams.i18n.BTN_OK && localStorage) { + if (buttonPressed === ams.i18n.BTN_OK && localStorage) { localStorage.clear(); location.reload(); } @@ -4291,8 +4619,9 @@ var element = $(this); if (!element.is(e.target) && element.has(e.target).length === 0 && - $('.popover').has(e.target).length === 0) + $('.popover').has(e.target).length === 0) { element.popover('hide'); + } }); // Resize events @@ -4303,7 +4632,7 @@ ams.skin._setPageHeight(); ams.skin._checkMobileWidth(); }); - $('nav').resize(function() { + nav.resize(function() { ams.skin._setPageHeight(); }); }); @@ -4315,16 +4644,21 @@ }); $(document).on('click', 'a[href!="#"]:not([data-toggle]), [data-ams-url]:not([data-toggle])', function(e) { var link = $(e.currentTarget); + var handlers = link.data('ams-disabled-handlers'); + if ((handlers == true) || (handlers == 'click')) { + return; + } var href = link.attr('href') || link.data('ams-url'); - if (!href || href.startsWith('javascript:') || link.attr('target') || (link.data('ams-context-menu') === true)) + if (!href || href.startsWith('javascript') || link.attr('target') || (link.data('ams-context-menu') === true)) { return; + } e.preventDefault(); e.stopPropagation(); var href_getter = ams.getFunctionByName(href); - if (typeof(href_getter) == 'function') { + if (typeof(href_getter) === 'function') { href = href_getter.call(link); } - if (typeof(href) == 'function') { + if (typeof(href) === 'function') { // Javascript function call href.call(link); } else { @@ -4339,17 +4673,19 @@ } else { ams.form.confirmChangedForm(function () { if (href.startsWith('#')) { - if (href != location.hash) { + if (href !== location.hash) { if (ams.root.hasClass('mobile-view-activated')) { ams.root.removeClass('hidden-menu'); window.setTimeout(function () { window.location.hash = href; }, 50); - } else + } else { window.location.hash = href; + } } - } else + } else { window.location = href; + } }); } } @@ -4373,14 +4709,21 @@ $(document).off('click.modal') .on('click', '[data-toggle="modal"]', function(e) { var source = $(this); - if (source.data('ams-context-menu') === true) + var handlers = source.data('ams-disabled-handlers'); + if ((handlers == true) || (handlers == 'click')) { return; - if (source.data('ams-stop-propagation') === true) + } + if (source.data('ams-context-menu') === true) { + return; + } + if (source.data('ams-stop-propagation') === true) { e.stopPropagation(); + } e.preventDefault(); ams.dialog.open(source); - if (source.parents('#shortcut').exists()) + if (source.parents('#shortcut').exists()) { setTimeout(ams.skin._hideShortcutButtons, 300); + } }); // Initialize form buttons @@ -4392,28 +4735,41 @@ // Initialize custom click handlers $(document).on('click', '[data-ams-click-handler]', function(e) { var source = $(this); + var handlers = source.data('ams-disabled-handlers'); + if ((handlers == true) || (handlers == 'click')) { + return; + } var data = source.data(); if (data.amsClickHandler) { - if ((data.amsStopPropagation === true) || (data.amsClickStopPropagation === true)) + if ((data.amsStopPropagation === true) || (data.amsClickStopPropagation === true)) { e.stopPropagation(); - if (data.amsClickKeepDefault !== true) + } + if (data.amsClickKeepDefault !== true) { e.preventDefault(); + } var callback = ams.getFunctionByName(data.amsClickHandler); - if (callback !== undefined) + if (callback !== undefined) { callback.call(source, data.amsClickHandlerOptions); + } } }); // Initialize custom change handlers $(document).on('change', '[data-ams-change-handler]', function(e) { var source = $(this); + var handlers = source.data('ams-disabled-handlers'); + if ((handlers == true) || (handlers == 'change')) { + return; + } var data = source.data(); if (data.amsChangeHandler) { - if (data.amsChangeKeepDefault !== true) + if (data.amsChangeKeepDefault !== true) { e.preventDefault(); + } var callback = ams.getFunctionByName(data.amsChangeHandler); - if (callback !== undefined) + if (callback !== undefined) { callback.call(source, data.amsChangeHandlerOptions); + } } }); @@ -4423,6 +4779,7 @@ setTimeout(function() { form.find('.select2').trigger('change'); }, 10); + ams.form.setFocus(form); }); // Initialize custom reset handlers @@ -4430,11 +4787,13 @@ var form = $(this); var data = form.data(); if (data.amsResetHandler) { - if (data.amsResetKeepDefault !== true) + if (data.amsResetKeepDefault !== true) { e.preventDefault(); + } var callback = ams.getFunctionByName(data.amsResetHandler); - if (callback !== undefined) + if (callback !== undefined) { callback.call(form, data.amsResetHandlerOptions); + } } }); @@ -4468,13 +4827,15 @@ var link = $(e.target); var data = link.data(); if (data.amsUrl) { - if (data.amsTabLoaded) + if (data.amsTabLoaded) { return; + } try { link.append(''); ams.skin.loadURL(data.amsUrl, link.attr('href')); - if (data.amsTabLoadOnce) + if (data.amsTabLoadOnce) { link.data('ams-tab-loaded', true); + } } finally { $('i', link).remove(); @@ -4484,8 +4845,10 @@ // Init page content ams.initContent(document); - if (ams.ajax_nav && $('nav').exists()) + if (ams.ajax_nav && nav.exists()) { ams.skin.checkURL(); + } + ams.form.setFocus(document); // Add unload event listener to check for modified forms $(window).on('beforeunload', ams.form.checkBeforeUnload); @@ -4519,10 +4882,11 @@ ams.form.init(element); // Initialize widgets - if (ams.device === 'desktop') + if (ams.device === 'desktop') { ams.skin._initDesktopWidgets(element); - else + } else { ams.skin._initMobileWidgets(element); + } ams.skin._setPageHeight(); }; @@ -4601,4 +4965,4 @@ } }); -})(jQuery); +})(jQuery, this);