8 * Custom administration and application skin tools |
8 * Custom administration and application skin tools |
9 * Released under Zope Public License ZPL 1.1 |
9 * Released under Zope Public License ZPL 1.1 |
10 * ©2014-2015 Thierry Florac <tflorac@ulthar.net> |
10 * ©2014-2015 Thierry Florac <tflorac@ulthar.net> |
11 */ |
11 */ |
12 |
12 |
13 (function($) { |
13 (function($, globals) { |
|
14 |
|
15 "use strict"; |
14 |
16 |
15 /** |
17 /** |
16 * String prototype extensions |
18 * String prototype extensions |
17 */ |
19 */ |
18 String.prototype.startsWith = function(str) { |
20 String.prototype.startsWith = function(str) { |
19 var slen = this.length; |
21 var slen = this.length, |
20 var dlen = str.length; |
22 dlen = str.length; |
21 if (slen < dlen) { |
23 if (slen < dlen) { |
22 return false; |
24 return false; |
23 } |
25 } |
24 return (this.substr(0,dlen) == str); |
26 return (this.substr(0,dlen) === str); |
25 }; |
27 }; |
26 |
28 |
27 String.prototype.endsWith = function(str) { |
29 String.prototype.endsWith = function(str) { |
28 var slen = this.length; |
30 var slen = this.length, |
29 var dlen = str.length; |
31 dlen = str.length; |
30 if (slen < dlen) { |
32 if (slen < dlen) { |
31 return false; |
33 return false; |
32 } |
34 } |
33 return (this.substr(slen-dlen) == str); |
35 return (this.substr(slen-dlen) === str); |
34 }; |
36 }; |
35 |
37 |
36 |
38 |
37 /** |
39 /** |
38 * Array prototype extensions |
40 * Array prototype extensions |
39 */ |
41 */ |
40 if (!Array.prototype.indexOf) { |
42 if (!Array.prototype.indexOf) { |
41 Array.prototype.indexOf = function(elt /*, from*/) { |
43 Array.prototype.indexOf = function(elt, from) { |
42 var len = this.length; |
44 var len = this.length; |
43 |
45 |
44 var from = Number(arguments[1]) || 0; |
46 from = Number(from) || 0; |
45 from = (from < 0) ? Math.ceil(from) : Math.floor(from); |
47 from = (from < 0) ? Math.ceil(from) : Math.floor(from); |
46 if (from < 0) |
48 if (from < 0) { |
47 from += len; |
49 from += len; |
|
50 } |
48 |
51 |
49 for (; from < len; from++) { |
52 for (; from < len; from++) { |
50 if (from in this && |
53 if (from in this && this[from] === elt) { |
51 this[from] === elt) |
|
52 return from; |
54 return from; |
|
55 } |
53 } |
56 } |
54 return -1; |
57 return -1; |
55 }; |
58 }; |
56 } |
59 } |
57 |
60 |
264 menu.find("LI.active").each(function() { |
270 menu.find("LI.active").each(function() { |
265 var active_parent = $(this).parents('UL'); |
271 var active_parent = $(this).parents('UL'); |
266 var active_item = active_parent.parent('LI'); |
272 var active_item = active_parent.parent('LI'); |
267 active_parent.slideDown(settings.speed); |
273 active_parent.slideDown(settings.speed); |
268 active_item.find("b:first").html(settings.openedSign); |
274 active_item.find("b:first").html(settings.openedSign); |
269 active_item.addClass("open") |
275 active_item.addClass("open"); |
270 }); |
276 }); |
271 |
277 |
272 menu.find("LI A").on('click', function() { |
278 menu.find("LI A").on('click', function() { |
273 var link = $(this); |
279 var link = $(this); |
|
280 if (link.hasClass('active')) { |
|
281 return; |
|
282 } |
|
283 var href = link.attr('href').replace(/^#/,''); |
274 var parent_ul = link.parent().find("UL"); |
284 var parent_ul = link.parent().find("UL"); |
275 if (settings.accordion) { |
285 if (settings.accordion) { |
276 var parents = link.parent().parents("UL"); |
286 var parents = link.parent().parents("UL"); |
277 var visible = menu.find("UL:visible"); |
287 var visible = menu.find("UL:visible"); |
278 visible.each(function(visibleIndex) { |
288 visible.each(function(visibleIndex) { |
279 var close = true; |
289 var close = true; |
280 parents.each(function(parentIndex) { |
290 parents.each(function(parentIndex) { |
281 if (parents[parentIndex] == visible[visibleIndex]) { |
291 if (parents[parentIndex] === visible[visibleIndex]) { |
282 close = false; |
292 close = false; |
283 return false; |
293 return false; |
284 } |
294 } |
285 }); |
295 }); |
286 if (close) { |
296 if (close) { |
287 if (parent_ul != visible[visibleIndex]) { |
297 if (parent_ul !== visible[visibleIndex]) { |
288 $(visible[visibleIndex]).slideUp(settings.speed, function() { |
298 var visibleItem = $(visible[visibleIndex]); |
289 link.parent("LI") |
299 if (href || !visibleItem.hasClass('active')) { |
290 .find("b:first") |
300 visibleItem.slideUp(settings.speed, function () { |
291 .html(settings.closedSign); |
301 $(this).parent("LI") |
292 link.parent("LI") |
302 .removeClass('open') |
293 .removeClass("open"); |
303 .find("B:first") |
294 }); |
304 .delay(settings.speed) |
|
305 .html(settings.closedSign); |
|
306 }); |
|
307 } |
295 } |
308 } |
296 } |
309 } |
297 }); |
310 }); |
298 } |
311 } |
299 var first_ul = link.parent().find("UL:first"); |
312 var first_ul = link.parent().find("UL:first"); |
300 if (!link.attr('href').replace(/^#/,'') && |
313 if (!href && first_ul.is(":visible") && !first_ul.hasClass("active")) { |
301 first_ul.is(":visible") && |
|
302 !first_ul.hasClass("active")) { |
|
303 first_ul.slideUp(settings.speed, function() { |
314 first_ul.slideUp(settings.speed, function() { |
304 link.parent("LI") |
315 link.parent("LI") |
305 .removeClass("open") |
316 .removeClass("open") |
306 .find("B:first") |
317 .find("B:first") |
307 .delay(settings.speed) |
318 .delay(settings.speed) |
308 .html(settings.closedSign); |
319 .html(settings.closedSign); |
309 }); |
320 }); |
310 } else /*if (link.attr('href') != location.hash)*/ { |
321 } else /*if (link.attr('href') !== location.hash)*/ { |
311 first_ul.slideDown(settings.speed, function() { |
322 first_ul.slideDown(settings.speed, function() { |
312 link.parent("LI") |
323 link.parent("LI") |
313 .addClass("open") |
324 .addClass("open") |
314 .find("B:first") |
325 .find("B:first") |
315 .delay(settings.speed) |
326 .delay(settings.speed) |
613 MyAMS.error = { |
636 MyAMS.error = { |
614 |
637 |
615 /** |
638 /** |
616 * Default JQuery AJAX error handler |
639 * Default JQuery AJAX error handler |
617 */ |
640 */ |
618 ajax: function(event, request /*, settings*/) { |
641 ajax: function(event, response, request, error) { |
619 if (request.statusText == 'OK') |
642 if (response.statusText === 'OK') { |
620 return; |
643 return; |
621 var response = ams.ajax.getResponse(request); |
644 } |
622 if (response.content_type == 'json') { |
645 var ajax_response = ams.ajax.getResponse(response); |
623 ams.ajax.handleJSON(response.data); |
646 if (ajax_response.content_type === 'json') { |
|
647 ams.ajax.handleJSON(ajax_response.data); |
624 } else { |
648 } else { |
625 var title = event.statusText || event.type; |
649 var title = event.statusText || event.type; |
626 var message = request.responseText; |
650 var message = response.responseText; |
627 ams.skin.messageBox('error', { |
651 ams.skin.messageBox('error', { |
628 title: ams.i18n.ERROR_OCCURED, |
652 title: ams.i18n.ERROR_OCCURED, |
629 content: '<h4>' + title + '</h4><p>' + message + '</p>', |
653 content: '<h4>' + title + '</h4><p>' + message + '</p>', |
630 icon: 'fa fa-warning animated shake', |
654 icon: 'fa fa-warning animated shake', |
631 timeout: 10000 |
655 timeout: 10000 |
632 }); |
656 }); |
633 } |
657 } |
634 if (window.console) { |
658 if (globals.console) { |
635 console.error(event); |
659 globals.console.error(event); |
636 console.debug(request); |
660 globals.console.debug(response); |
637 } |
661 } |
638 }, |
662 }, |
639 |
663 |
640 /** |
664 /** |
641 * Show AJAX error |
665 * Show AJAX error |
642 */ |
666 */ |
643 show: function(request, status, error) { |
667 show: function(request, status, error) { |
644 if (!error) |
668 if (!error) { |
645 return; |
669 return; |
|
670 } |
646 var response = ams.ajax.getResponse(request); |
671 var response = ams.ajax.getResponse(request); |
647 if (response.content_type == 'json') { |
672 if (response.content_type === 'json') { |
648 ams.ajax.handleJSON(response.data); |
673 ams.ajax.handleJSON(response.data); |
649 } else { |
674 } else { |
650 ams.skin.messageBox('error', { |
675 ams.skin.messageBox('error', { |
651 title: ams.i18n.ERRORS_OCCURED, |
676 title: ams.i18n.ERRORS_OCCURED, |
652 content: '<h4>' + status + '</h4><p>' + error + '</p>', |
677 content: '<h4>' + status + '</h4><p>' + error + '</p>', |
653 icon: "fa fa-warning animated shake", |
678 icon: "fa fa-warning animated shake", |
654 timeout: 10000 |
679 timeout: 10000 |
655 }); |
680 }); |
656 } |
681 } |
657 if (window.console) { |
682 if (globals.console) { |
658 console.error(error); |
683 globals.console.error(error); |
659 console.debug(request); |
684 globals.console.debug(request); |
660 } |
685 } |
661 } |
686 } |
662 }; |
687 }; |
663 |
688 |
664 |
689 |
725 * @param event: the source event |
752 * @param event: the source event |
726 * @param request: the request |
753 * @param request: the request |
727 * @param options: AJAX options |
754 * @param options: AJAX options |
728 */ |
755 */ |
729 progress: function(event) { |
756 progress: function(event) { |
730 if (!event.lengthComputable) |
757 if (!event.lengthComputable) { |
731 return; |
758 return; |
732 if (event.loaded >= event.total) |
759 } |
|
760 if (event.loaded >= event.total) { |
733 return; |
761 return; |
734 console.log(parseInt((event.loaded / event.total * 100), 10) + "%"); |
762 } |
|
763 if (globals.console) { |
|
764 globals.console.log(parseInt((event.loaded / event.total * 100), 10) + "%"); |
|
765 } |
735 }, |
766 }, |
736 |
767 |
737 /** |
768 /** |
738 * Post data to given URL |
769 * Post data to given URL |
739 */ |
770 */ |
740 post: function(url, data, options, callback) { |
771 post: function(url, data, options, callback) { |
741 if (url.startsWith(window.location.protocol)) |
772 var addr; |
742 var addr = url; |
773 if (url.startsWith(window.location.protocol)) { |
743 else |
774 addr = url; |
|
775 } else { |
744 addr = this.getAddr() + url; |
776 addr = this.getAddr() + url; |
745 if (typeof(options) == 'function') { |
777 } |
|
778 if (typeof(options) === 'function') { |
746 callback = options; |
779 callback = options; |
747 options = {} |
780 options = {}; |
748 } else if (!options) { |
781 } else if (!options) { |
749 options = {}; |
782 options = {}; |
750 } |
783 } |
751 if (typeof(callback) == 'undefined') |
784 if (typeof(callback) === 'undefined') { |
752 callback = options.callback; |
785 callback = options.callback; |
753 if (typeof(callback) == 'string') |
786 } |
|
787 if (typeof(callback) === 'string') { |
754 callback = ams.getFunctionByName(callback); |
788 callback = ams.getFunctionByName(callback); |
|
789 } |
755 delete options.callback; |
790 delete options.callback; |
756 |
791 |
757 var result = undefined; |
792 var result; |
758 var defaults = { |
793 var defaults = { |
759 url: addr, |
794 url: addr, |
760 type: 'post', |
795 type: 'post', |
761 cache: false, |
796 cache: false, |
762 async: typeof(callback) == 'function', |
797 async: typeof(callback) === 'function', |
763 data: $.param(data), |
798 data: $.param(data), |
764 dataType: 'json', |
799 dataType: 'json', |
765 success: callback || function(data /*, status*/) { |
800 success: callback || function(data /*, status*/) { |
766 result = data.result; |
801 result = data.result; |
767 }, |
802 } |
768 error: ams.error.show |
|
769 }; |
803 }; |
770 var settings = $.extend({}, defaults, options); |
804 var settings = $.extend({}, defaults, options); |
771 $.ajax(settings); |
805 $.ajax(settings); |
772 return result; |
806 return result; |
773 }, |
807 }, |
842 handleJSON: function(result, form, target) { |
876 handleJSON: function(result, form, target) { |
843 var status = result.status; |
877 var status = result.status; |
844 var url; |
878 var url; |
845 switch (status) { |
879 switch (status) { |
846 case 'alert': |
880 case 'alert': |
847 alert(result.alert.title + '\n\n' + result.alert.content); |
881 if (globals.alert) { |
|
882 globals.alert(result.alert.title + '\n\n' + result.alert.content); |
|
883 } |
848 break; |
884 break; |
849 case 'error': |
885 case 'error': |
850 ams.form.showErrors(form, result); |
886 ams.form.showErrors(form, result); |
851 break; |
887 break; |
852 case 'info': |
888 case 'info': |
853 case 'success': |
889 case 'success': |
854 if (result.close_form != false) |
890 if (result.close_form !== false) { |
855 ams.dialog.close(form); |
891 ams.dialog.close(form); |
|
892 } |
856 break; |
893 break; |
857 case 'message': |
894 case 'message': |
858 case 'messagebox': |
895 case 'messagebox': |
859 break; |
896 break; |
860 case 'notify': |
897 case 'notify': |
861 case 'callback': |
898 case 'callback': |
862 case 'callbacks': |
899 case 'callbacks': |
863 if (result.close_form != false) |
900 if (result.close_form !== false) { |
864 ams.dialog.close(form); |
901 ams.dialog.close(form); |
|
902 } |
865 break; |
903 break; |
866 case 'modal': |
904 case 'modal': |
867 ams.dialog.open(result.location); |
905 ams.dialog.open(result.location); |
868 break; |
906 break; |
869 case 'reload': |
907 case 'reload': |
870 if (result.close_form != false) |
908 if (result.close_form !== false) { |
871 ams.dialog.close(form); |
909 ams.dialog.close(form); |
|
910 } |
872 url = result.location || window.location.hash; |
911 url = result.location || window.location.hash; |
873 if (url.startsWith('#')) |
912 if (url.startsWith('#')) { |
874 url = url.substr(1); |
913 url = url.substr(1); |
|
914 } |
875 ams.skin.loadURL(url, result.target || target || '#content'); |
915 ams.skin.loadURL(url, result.target || target || '#content'); |
876 break; |
916 break; |
877 case 'redirect': |
917 case 'redirect': |
878 if (result.close_form == true) |
918 if (result.close_form === true) { |
879 ams.dialog.close(form); |
919 ams.dialog.close(form); |
|
920 } |
880 url = result.location || window.location.href; |
921 url = result.location || window.location.href; |
881 if (result.window) { |
922 if (result.window) { |
882 window.open(url, result.window, result.options); |
923 window.open(url, result.window, result.options); |
883 } else { |
924 } else { |
884 if (window.location.href == url) { |
925 if (window.location.href === url) { |
885 window.location.reload(true); |
926 window.location.reload(true); |
886 } else { |
927 } else { |
887 window.location.href = url; |
928 window.location.href = url; |
888 } |
929 } |
889 } |
930 } |
890 break; |
931 break; |
891 default: |
932 default: |
892 console.log("Unhandled status: " + status); |
933 if (globals.console) { |
893 break; |
934 globals.console.log("Unhandled status: " + status); |
894 } |
935 } |
|
936 } |
|
937 |
|
938 var index; |
|
939 var content; |
|
940 var container; |
895 if (result.content) { |
941 if (result.content) { |
896 var content = result.content; |
942 content = result.content; |
897 var container = $(content.target || target || form || '#content'); |
943 container = $(content.target || target || form || '#content'); |
898 if (content.raw == true) { |
944 if (content.raw === true) { |
899 container.text(content.text); |
945 container.text(content.text); |
900 } else { |
946 } else { |
901 container.html(content.html); |
947 container.html(content.html); |
902 ams.initContent(container); |
948 ams.initContent(container); |
903 } |
949 } |
904 if (!content.keep_hidden) |
950 if (!content.keep_hidden) { |
905 container.removeClass('hidden'); |
951 container.removeClass('hidden'); |
|
952 } |
906 } |
953 } |
907 if (result.contents) { |
954 if (result.contents) { |
908 var contents = result.contents; |
955 var contents = result.contents; |
909 for (var index in contents) { |
956 for (index=0; index < contents.length; index++) { |
910 content = contents[index]; |
957 content = contents[index]; |
911 container = $(content.target); |
958 container = $(content.target); |
912 if (content.raw == true) { |
959 if (content.raw === true) { |
913 container.text(content.text); |
960 container.text(content.text); |
914 } else { |
961 } else { |
915 container.html(content.html); |
962 container.html(content.html); |
916 ams.initContent(container); |
963 ams.initContent(container); |
917 } |
964 } |
918 if (!content.keep_hidden) |
965 if (!content.keep_hidden) { |
919 container.removeClass('hidden'); |
966 container.removeClass('hidden'); |
920 } |
967 } |
921 } |
968 } |
|
969 } |
|
970 |
|
971 var message; |
922 if (result.message) { |
972 if (result.message) { |
923 var message = result.message; |
973 message = result.message; |
924 if (typeof(message) == 'string') { |
974 if (typeof(message) === 'string') { |
925 if ((status == 'info') || (status == 'success')) |
975 if ((status === 'info') || (status === 'success')) { |
926 ams.skin.smallBox(status, |
976 ams.skin.smallBox(status, |
927 {title: message, |
977 { |
928 icon: 'fa fa-fw fa-info-circle font-xs align-top margin-top-10', |
978 title: message, |
929 timeout: 3000}); |
979 icon: 'fa fa-fw fa-info-circle font-xs align-top margin-top-10', |
930 else |
980 timeout: 3000 |
|
981 }); |
|
982 } else { |
931 ams.skin.alert($(form || '#content'), status, message); |
983 ams.skin.alert($(form || '#content'), status, message); |
932 } else |
984 } |
|
985 } else { |
933 ams.skin.alert($(message.target || target || form || '#content'), |
986 ams.skin.alert($(message.target || target || form || '#content'), |
934 message.status || 'success', |
987 message.status || 'success', |
935 message.header, |
988 message.header, |
936 message.body, |
989 message.body, |
937 message.subtitle); |
990 message.subtitle); |
|
991 } |
938 } |
992 } |
939 if (result.smallbox) { |
993 if (result.smallbox) { |
940 ams.skin.smallBox(result.smallbox_status || status, |
994 ams.skin.smallBox(result.smallbox_status || status, |
941 {title: result.smallbox, |
995 {title: result.smallbox, |
942 icon: 'fa fa-fw fa-info-circle font-xs align-top margin-top-10', |
996 icon: 'fa fa-fw fa-info-circle font-xs align-top margin-top-10', |
943 timeout: 3000}); |
997 timeout: 3000}); |
944 } |
998 } |
945 if (result.messagebox) { |
999 if (result.messagebox) { |
946 message = result.messagebox; |
1000 message = result.messagebox; |
947 if (typeof(message) == 'string') |
1001 if (typeof(message) === 'string') { |
948 ams.skin.messageBox('info', |
1002 ams.skin.messageBox('info', |
949 {title: ams.i18n.ERROR_OCCURED, |
1003 { |
950 content: message, |
1004 title: ams.i18n.ERROR_OCCURED, |
951 timeout: 10000}); |
1005 content: message, |
952 else { |
1006 timeout: 10000 |
|
1007 }); |
|
1008 } else { |
953 var message_status = message.status || 'info'; |
1009 var message_status = message.status || 'info'; |
954 if (message_status == 'error' && form && target) |
1010 if (message_status === 'error' && form && target) { |
955 ams.executeFunctionByName(form.data('ams-form-submit-error') || 'MyAMS.form.finalizeSubmitOnError', form, target); |
1011 ams.executeFunctionByName(form.data('ams-form-submit-error') || 'MyAMS.form.finalizeSubmitOnError', form, target); |
|
1012 } |
956 ams.skin.messageBox(message_status, |
1013 ams.skin.messageBox(message_status, |
957 {title: message.title || ams.i18n.ERROR_OCCURED, |
1014 {title: message.title || ams.i18n.ERROR_OCCURED, |
958 content: message.content, |
1015 content: message.content, |
959 icon: message.icon, |
1016 icon: message.icon, |
960 number: message.number, |
1017 number: message.number, |
961 timeout: message.timeout == null ? undefined : (message.timeout || 10000)}); |
1018 timeout: message.timeout === null ? undefined : (message.timeout || 10000)}); |
962 } |
1019 } |
963 } |
1020 } |
964 if (result.event) |
1021 if (result.event) { |
965 form.trigger(result.event, result.event_options); |
1022 form.trigger(result.event, result.event_options); |
966 if (result.callback) |
1023 } |
|
1024 if (result.callback) { |
967 ams.executeFunctionByName(result.callback, form, result.options); |
1025 ams.executeFunctionByName(result.callback, form, result.options); |
|
1026 } |
968 if (result.callbacks) { |
1027 if (result.callbacks) { |
969 for (index in result.callbacks) { |
1028 var callback; |
970 if (!$.isNumeric(index)) |
1029 for (index=0; index < result.callbacks.length; index++) { |
971 continue; |
1030 callback = result.callbacks[index]; |
972 var callback = result.callbacks[index]; |
|
973 ams.executeFunctionByName(callback, form, callback.options); |
1031 ams.executeFunctionByName(callback, form, callback.options); |
974 } |
1032 } |
975 } |
1033 } |
976 } |
1034 } |
977 }; |
1035 }; |
1000 * - @method: name of JSON-RPC procedure to call |
1058 * - @method: name of JSON-RPC procedure to call |
1001 * - @options: additional JSON-RPC procedure parameters |
1059 * - @options: additional JSON-RPC procedure parameters |
1002 * - @callback: name of a callback which will be called on server response |
1060 * - @callback: name of a callback which will be called on server response |
1003 */ |
1061 */ |
1004 query: function(query, method, options, callback) { |
1062 query: function(query, method, options, callback) { |
1005 ams.ajax.check($.jsonRpc, |
1063 ams.ajax.check($.jsonRPC, |
1006 ams.baseURL + 'ext/jquery-jsonrpc' + ams.devext + '.js', |
1064 ams.baseURL + 'ext/jquery-jsonrpc' + ams.devext + '.js', |
1007 function() { |
1065 function() { |
1008 var result; |
1066 if (typeof(options) === 'function') { |
1009 if (typeof(options) == 'function') { |
|
1010 callback = options; |
1067 callback = options; |
1011 options = {}; |
1068 options = {}; |
1012 } |
1069 } |
1013 else if (!options) |
1070 else if (!options) { |
1014 options = {}; |
1071 options = {}; |
1015 if (typeof(callback) == 'undefined') |
1072 } |
|
1073 if (callback === 'undefined') { |
1016 callback = options.callback; |
1074 callback = options.callback; |
1017 if (typeof(callback) == 'string') |
1075 } |
|
1076 if (typeof(callback) === 'string') { |
1018 callback = ams.getFunctionByName(callback); |
1077 callback = ams.getFunctionByName(callback); |
|
1078 } |
1019 delete options.callback; |
1079 delete options.callback; |
1020 |
1080 |
1021 var params = {}; |
1081 var params = {}; |
1022 if (typeof(query) == 'string') |
1082 if (typeof(query) === 'string') { |
1023 params['query'] = query; |
1083 params.query = query; |
1024 else if (typeof(query) == 'object') |
1084 } else if (typeof(query) === 'object') { |
1025 $.extend(params, query); |
1085 $.extend(params, query); |
|
1086 } |
1026 $.extend(params, options); |
1087 $.extend(params, options); |
1027 |
1088 |
1028 var settings = { |
1089 var result; |
1029 url: ams.jsonrpc.getAddr(options.url), |
1090 var defaults = { |
1030 type: 'post', |
1091 id: new Date().getTime(), |
1031 cache: false, |
|
1032 method: method, |
|
1033 params: params, |
1092 params: params, |
1034 async: typeof(callback) == 'function', |
1093 success: callback || function(data) { |
1035 success: callback || function(data /*, status*/) { |
1094 result = data; |
1036 result = data.result; |
|
1037 }, |
1095 }, |
1038 error: ams.error.show |
1096 error: ams.error.show |
1039 }; |
1097 }; |
1040 $.jsonRpc(settings); |
1098 var settings = $.extend({}, defaults, options); |
|
1099 $.jsonRPC.withOptions({ |
|
1100 endPoint: ams.jsonrpc.getAddr(options.url), |
|
1101 namespace: options.namespace, |
|
1102 cache: false |
|
1103 }, function() { |
|
1104 $.jsonRPC.request(method, settings); |
|
1105 }); |
1041 return result; |
1106 return result; |
1042 }); |
1107 }); |
1043 }, |
1108 }, |
1044 |
1109 |
1045 /** |
1110 /** |
1240 }); |
1335 }); |
1241 } |
1336 } |
1242 return false; |
1337 return false; |
1243 } |
1338 } |
1244 // Check submit validators |
1339 // Check submit validators |
1245 if (!ams.form._checkSubmitValidators(form)) |
1340 if (!ams.form._checkSubmitValidators(form)) { |
1246 return false; |
1341 return false; |
|
1342 } |
1247 // Remove remaining status messages |
1343 // Remove remaining status messages |
1248 $('.alert-danger, SPAN.state-error', form).remove(); |
1344 $('.alert-danger, SPAN.state-error', form).not('.persistent').remove(); |
1249 $('.state-error', form).removeClassPrefix('state-'); |
1345 $('.state-error', form).removeClassPrefix('state-'); |
1250 // Check submit button |
1346 // Check submit button |
1251 var button = $(form.data('ams-submit-button')); |
1347 var button = $(form.data('ams-submit-button')); |
1252 if (button && !button.data('ams-form-hide-loading')) |
1348 if (button && !button.data('ams-form-hide-loading')) { |
1253 button.button('loading'); |
1349 button.button('loading'); |
|
1350 } |
1254 ams.ajax.check($.fn.ajaxSubmit, |
1351 ams.ajax.check($.fn.ajaxSubmit, |
1255 ams.baseURL + 'ext/jquery-form-3.49' + ams.devext + '.js', |
1352 ams.baseURL + 'ext/jquery-form-3.49' + ams.devext + '.js', |
1256 function() { |
1353 function() { |
1257 |
1354 |
1258 function _submitAjaxForm(form, options) { |
1355 function _submitAjaxForm(form, options) { |
1259 |
1356 |
1260 var button; |
1357 var button; |
1261 var data = form.data(); |
1358 var data = form.data(); |
1262 var form_options = data.amsFormOptions; |
1359 var form_options = data.amsFormOptions; |
1263 |
1360 var form_data; |
1264 if (submit_options) |
1361 var form_data_callback; |
1265 var form_data_callback = submit_options.formDataInitCallback; |
1362 |
1266 if (form_data_callback) |
1363 if (submit_options) { |
|
1364 form_data_callback = submit_options.formDataInitCallback; |
|
1365 } |
|
1366 if (form_data_callback) { |
1267 delete submit_options.formDataInitCallback; |
1367 delete submit_options.formDataInitCallback; |
1268 else |
1368 } else { |
1269 form_data_callback = data.amsFormDataInitCallback; |
1369 form_data_callback = data.amsFormDataInitCallback; |
|
1370 } |
1270 if (form_data_callback) { |
1371 if (form_data_callback) { |
1271 var veto = {}; |
1372 var veto = {}; |
1272 if (typeof(form_data_callback) == 'function') |
1373 if (typeof(form_data_callback) === 'function') { |
1273 var form_data = form_data_callback.call(form, veto); |
1374 form_data = form_data_callback.call(form, veto); |
1274 else |
1375 } else { |
1275 form_data = ams.executeFunctionByName(form_data_callback, form, veto); |
1376 form_data = ams.executeFunctionByName(form_data_callback, form, veto); |
|
1377 } |
1276 if (veto.veto) { |
1378 if (veto.veto) { |
1277 button = form.data('ams-submit-button'); |
1379 button = form.data('ams-submit-button'); |
1278 if (button) |
1380 if (button) { |
1279 button.button('reset'); |
1381 button.button('reset'); |
|
1382 } |
1280 ams.form.finalizeSubmitFooter.call(form); |
1383 ams.form.finalizeSubmitFooter.call(form); |
1281 return false; |
1384 return false; |
1282 } |
1385 } |
1283 } else { |
1386 } else { |
1284 form_data = data.amsFormData || {}; |
1387 form_data = data.amsFormData || {}; |
1290 if (button) { |
1393 if (button) { |
1291 buttonHandler = button.data('ams-form-handler'); |
1394 buttonHandler = button.data('ams-form-handler'); |
1292 buttonTarget = button.data('ams-form-submit-target'); |
1395 buttonTarget = button.data('ams-form-submit-target'); |
1293 } |
1396 } |
1294 |
1397 |
|
1398 var url; |
1295 var form_handler = handler || buttonHandler || data.amsFormHandler || ''; |
1399 var form_handler = handler || buttonHandler || data.amsFormHandler || ''; |
1296 if (form_handler.startsWith(window.location.protocol)) { |
1400 if (form_handler.startsWith(window.location.protocol)) { |
1297 var url = form_handler; |
1401 url = form_handler; |
1298 } else { |
1402 } else { |
1299 var action = form.attr('action').replace(/#/, ''); |
1403 var action = form.attr('action').replace(/#/, ''); |
1300 if (action.startsWith(window.location.protocol)) |
1404 if (action.startsWith(window.location.protocol)) { |
1301 url = action; |
1405 url = action; |
1302 else |
1406 } else { |
1303 url = ams.ajax.getAddr() + action; |
1407 url = ams.ajax.getAddr() + action; |
|
1408 } |
1304 url += form_handler; |
1409 url += form_handler; |
1305 } |
1410 } |
1306 |
1411 |
1307 var target = null; |
1412 var target = null; |
1308 if (data.amsFormInitSubmitTarget) { |
1413 if (submit_options && submit_options.initSubmitTarget) { |
1309 target = $(buttonTarget || data.amsFormSubmitTarget || '#content'); |
1414 ams.executeFunctionByName(submit_options.initSubmitTarget); |
1310 ams.executeFunctionByName(data.amsFormInitSubmit || 'MyAMS.form.initSubmit', form, target); |
1415 } else { |
1311 } else if (!data.amsFormHideSubmitFooter) |
1416 if (data.amsFormInitSubmitTarget) { |
1312 ams.executeFunctionByName(data.amsFormInitSubmit || 'MyAMS.form.initSubmitFooter', form); |
1417 target = $(buttonTarget || data.amsFormSubmitTarget || '#content'); |
1313 |
1418 ams.executeFunctionByName(data.amsFormInitSubmit || 'MyAMS.form.initSubmit', form, target); |
1314 var hasUpload = typeof(options.uuid) != 'undefined'; |
1419 } else if (!data.amsFormHideSubmitFooter) { |
|
1420 ams.executeFunctionByName(data.amsFormInitSubmit || 'MyAMS.form.initSubmitFooter', form); |
|
1421 } |
|
1422 } |
|
1423 |
|
1424 var hasUpload = typeof(options.uuid) !== 'undefined'; |
1315 if (hasUpload) { |
1425 if (hasUpload) { |
1316 if (url.indexOf('X-Progress-ID') < 0) |
1426 if (url.indexOf('X-Progress-ID') < 0) { |
1317 url += "?X-Progress-ID=" + options.uuid; |
1427 url += "?X-Progress-ID=" + options.uuid; |
|
1428 } |
1318 delete options.uuid; |
1429 delete options.uuid; |
1319 } |
1430 } |
1320 |
1431 |
|
1432 if (submit_options) { |
|
1433 form_data = $.extend({}, form_data, submit_options.form_data); |
|
1434 } |
1321 var defaults = { |
1435 var defaults = { |
1322 url: url, |
1436 url: url, |
1323 type: 'post', |
1437 type: 'post', |
1324 cache: false, |
1438 cache: false, |
1325 data: form_data, |
1439 data: form_data, |
1326 dataType: data.amsFormDatatype, |
1440 dataType: data.amsFormDatatype, |
1327 beforeSerialize: function(/*form, options*/) { |
1441 beforeSerialize: function(/*form, options*/) { |
1328 if (typeof(tinyMCE) != 'undefined') |
1442 if (typeof(globals.tinyMCE) !== 'undefined') { |
1329 tinyMCE.triggerSave(); |
1443 globals.tinyMCE.triggerSave(); |
|
1444 } |
1330 }, |
1445 }, |
1331 beforeSubmit: function(data, form /*, options*/) { |
1446 beforeSubmit: function(data, form /*, options*/) { |
1332 form.data('submitted', true); |
1447 form.data('submitted', true); |
1333 }, |
1448 }, |
1334 error: function(request, status, error, form) { |
1449 error: function(request, status, error, form) { |
1335 if (target) |
1450 if (target) { |
1336 ams.executeFunctionByName(data.amsFormSubmitError || 'MyAMS.form.finalizeSubmitOnError', form, target); |
1451 ams.executeFunctionByName(data.amsFormSubmitError || 'MyAMS.form.finalizeSubmitOnError', form, target); |
|
1452 } |
1337 if (form.is(':visible')) { |
1453 if (form.is(':visible')) { |
1338 var button = form.data('ams-submit-button'); |
1454 var button = form.data('ams-submit-button'); |
1339 if (button) |
1455 if (button) { |
1340 button.button('reset'); |
1456 button.button('reset'); |
|
1457 } |
1341 ams.form.finalizeSubmitFooter.call(form); |
1458 ams.form.finalizeSubmitFooter.call(form); |
1342 } |
1459 } |
1343 form.data('submitted', false); |
1460 form.data('submitted', false); |
1344 form.removeData('ams-submit-button'); |
1461 form.removeData('ams-submit-button'); |
1345 }, |
1462 }, |
1346 iframe: hasUpload |
1463 iframe: hasUpload |
1347 } |
1464 }; |
1348 var download_target = data.amsFormDownloadTarget; |
1465 var download_target = (submit_options && submit_options.downloadTarget) || data.amsFormDownloadTarget; |
1349 if (download_target) { |
1466 if (download_target) { |
1350 var iframe = $('iframe[name="' + download_target + '"]'); |
1467 var iframe = $('iframe[name="' + download_target + '"]'); |
1351 if (!iframe.exists()) |
1468 if (!iframe.exists()) { |
1352 iframe = $('<iframe></iframe>').hide() |
1469 iframe = $('<iframe></iframe>').hide() |
1353 .attr('name', download_target) |
1470 .attr('name', download_target) |
1354 .appendTo(form); |
1471 .appendTo(form); |
|
1472 } |
1355 defaults = $.extend({}, defaults, { |
1473 defaults = $.extend({}, defaults, { |
1356 iframe: true, |
1474 iframe: true, |
1357 iframeTarget: iframe, |
1475 iframeTarget: iframe, |
1358 success: function(result, status, request, form) { |
1476 success: function(result, status, request, form) { |
1359 var modal = $(form).parents('.modal-dialog'); |
1477 var modal = $(form).parents('.modal-dialog'); |
1360 if (modal.exists()) { |
1478 if (modal.exists()) { |
1361 ams.dialog.close(form); |
1479 ams.dialog.close(form); |
1362 } else { |
1480 } else { |
1363 var callback; |
1481 var callback; |
1364 var button = form.data('ams-submit-button'); |
1482 var button = form.data('ams-submit-button'); |
1365 if (button) |
1483 if (button) { |
1366 callback = button.data('ams-form-submit-callback'); |
1484 callback = button.data('ams-form-submit-callback'); |
1367 if (!callback) |
1485 } |
|
1486 if (!callback) { |
1368 callback = ams.getFunctionByName(data.amsFormSubmitCallback) || ams.form._submitCallback; |
1487 callback = ams.getFunctionByName(data.amsFormSubmitCallback) || ams.form._submitCallback; |
|
1488 } |
1369 callback.call(form, result, status, request, form); |
1489 callback.call(form, result, status, request, form); |
1370 if (form.is(':visible') && button) |
1490 if (form.is(':visible') && button) { |
1371 button.button('reset'); |
1491 button.button('reset'); |
|
1492 } |
1372 form.data('submitted', false); |
1493 form.data('submitted', false); |
1373 form.removeData('ams-submit-button'); |
1494 form.removeData('ams-submit-button'); |
1374 form.removeAttr('data-ams-form-changed'); |
1495 form.removeAttr('data-ams-form-changed'); |
1375 } |
1496 } |
1376 } |
1497 } |
1377 }); |
1498 }); |
1378 } else { |
1499 } else { |
1379 defaults = $.extend({}, defaults, { |
1500 defaults = $.extend({}, defaults, { |
1380 error: function(request, status, error, form) { |
1501 error: function(request, status, error, form) { |
1381 if (target) |
1502 if (target) { |
1382 ams.executeFunctionByName(data.amsFormSubmitError || 'MyAMS.form.finalizeSubmitOnError', form, target); |
1503 ams.executeFunctionByName(data.amsFormSubmitError || 'MyAMS.form.finalizeSubmitOnError', form, target); |
|
1504 } |
1383 if (form.is(':visible')) { |
1505 if (form.is(':visible')) { |
1384 var button = form.data('ams-submit-button'); |
1506 var button = form.data('ams-submit-button'); |
1385 if (button) |
1507 if (button) { |
1386 button.button('reset'); |
1508 button.button('reset'); |
|
1509 } |
1387 ams.form.finalizeSubmitFooter.call(form); |
1510 ams.form.finalizeSubmitFooter.call(form); |
1388 } |
1511 } |
1389 form.data('submitted', false); |
1512 form.data('submitted', false); |
1390 form.removeData('ams-submit-button'); |
1513 form.removeData('ams-submit-button'); |
1391 }, |
1514 }, |
1392 success: function(result, status, request, form) { |
1515 success: function(result, status, request, form) { |
1393 var callback; |
1516 var callback; |
1394 var button = form.data('ams-submit-button'); |
1517 var button = form.data('ams-submit-button'); |
1395 if (button) |
1518 if (button) { |
1396 callback = button.data('ams-form-submit-callback'); |
1519 callback = button.data('ams-form-submit-callback'); |
1397 if (!callback) |
1520 } |
|
1521 if (!callback) { |
1398 callback = ams.getFunctionByName(data.amsFormSubmitCallback) || ams.form._submitCallback; |
1522 callback = ams.getFunctionByName(data.amsFormSubmitCallback) || ams.form._submitCallback; |
|
1523 } |
1399 callback.call(form, result, status, request, form); |
1524 callback.call(form, result, status, request, form); |
1400 if (form.is(':visible') && button) |
1525 if (form.is(':visible') && button) { |
1401 button.button('reset'); |
1526 button.button('reset'); |
|
1527 } |
1402 form.data('submitted', false); |
1528 form.data('submitted', false); |
1403 form.removeData('ams-submit-button'); |
1529 form.removeData('ams-submit-button'); |
1404 form.removeAttr('data-ams-form-changed'); |
1530 form.removeAttr('data-ams-form-changed'); |
1405 }, |
1531 }, |
1406 iframe: hasUpload |
1532 iframe: hasUpload |
1521 * - redirect: redirect browser to given URL |
1653 * - redirect: redirect browser to given URL |
1522 * Each JSON response can also specify an HTML content, a message and a callback ( |
1654 * Each JSON response can also specify an HTML content, a message and a callback ( |
1523 */ |
1655 */ |
1524 _submitCallback: function(result, status, request, form) { |
1656 _submitCallback: function(result, status, request, form) { |
1525 |
1657 |
|
1658 var button; |
1526 if (form.is(':visible')) { |
1659 if (form.is(':visible')) { |
1527 ams.form.finalizeSubmitFooter.call(form); |
1660 ams.form.finalizeSubmitFooter.call(form); |
1528 var button = form.data('ams-submit-button'); |
1661 button = form.data('ams-submit-button'); |
1529 if (button) |
1662 if (button) { |
1530 button.button('reset'); |
1663 button.button('reset'); |
1531 } |
1664 } |
|
1665 } |
|
1666 |
1532 var data = form.data(); |
1667 var data = form.data(); |
1533 if (data.amsFormDatatype) |
1668 var data_type; |
1534 var data_type = data.amsFormDatatype; |
1669 if (data.amsFormDatatype) { |
1535 else { |
1670 data_type = data.amsFormDatatype; |
|
1671 } else { |
1536 var request_data = ams.ajax.getResponse(request); |
1672 var request_data = ams.ajax.getResponse(request); |
1537 data_type = request_data.content_type; |
1673 data_type = request_data.content_type; |
1538 result = request_data.data; |
1674 result = request_data.data; |
1539 } |
1675 } |
1540 |
1676 |
1541 if (button) |
1677 var target; |
1542 var target = $(button.amsFormSubmitTarget || data.amsFormSubmitTarget || '#content'); |
1678 if (button) { |
1543 else |
1679 target = $(button.data('ams-form-submit-target') || data.amsFormSubmitTarget || '#content'); |
|
1680 } else { |
1544 target = $(data.amsFormSubmitTarget || '#content'); |
1681 target = $(data.amsFormSubmitTarget || '#content'); |
|
1682 } |
1545 |
1683 |
1546 switch (data_type) { |
1684 switch (data_type) { |
1547 case 'json': |
1685 case 'json': |
1548 ams.ajax.handleJSON(result, form, target); |
1686 ams.ajax.handleJSON(result, form, target); |
1549 break; |
1687 break; |
1550 case 'script': |
1688 case 'script': |
1551 break; |
1689 break; |
1552 case 'xml': |
1690 case 'xml': |
1553 break; |
1691 break; |
1554 case 'html': |
1692 case 'html': |
|
1693 /* falls through */ |
1555 case 'text': |
1694 case 'text': |
|
1695 /* falls through */ |
1556 default: |
1696 default: |
1557 if (button && (button.data('ams-keep-modal') !== true)) |
1697 if (button && (button.data('ams-keep-modal') !== true)) { |
1558 ams.dialog.close(form); |
1698 ams.dialog.close(form); |
1559 if (!target.exists()) |
1699 } |
|
1700 if (!target.exists()) { |
1560 target = $('body'); |
1701 target = $('body'); |
|
1702 } |
1561 target.parents('.hidden').removeClass('hidden'); |
1703 target.parents('.hidden').removeClass('hidden'); |
1562 $('.alert', target.parents('.alerts-container')).remove(); |
1704 $('.alert', target.parents('.alerts-container')).remove(); |
1563 target.css({opacity: '0.0'}) |
1705 target.css({opacity: '0.0'}) |
1564 .html(result) |
1706 .html(result) |
1565 .delay(50) |
1707 .delay(50) |
1566 .animate({opacity: '1.0'}, 300); |
1708 .animate({opacity: '1.0'}, 300); |
1567 ams.initContent(target); |
1709 ams.initContent(target); |
|
1710 ams.form.setFocus(target); |
1568 } |
1711 } |
1569 var callback = request.getResponseHeader('X-AMS-Callback'); |
1712 var callback = request.getResponseHeader('X-AMS-Callback'); |
1570 if (callback) { |
1713 if (callback) { |
1571 var options = request.getResponseHeader('X-AMS-Callback-Options'); |
1714 var options = request.getResponseHeader('X-AMS-Callback-Options'); |
1572 ams.executeFunctionByName(callback, form, options === undefined ? {} : JSON.parse(options), request); |
1715 ams.executeFunctionByName(callback, form, options === undefined ? {} : JSON.parse(options), request); |
1597 * - an array containing a list of string error messages |
1741 * - an array containing a list of string error messages |
1598 * Any other value (undefined, null, True...) will lead to a successful submit. |
1742 * Any other value (undefined, null, True...) will lead to a successful submit. |
1599 */ |
1743 */ |
1600 _checkSubmitValidators: function(form) { |
1744 _checkSubmitValidators: function(form) { |
1601 var validators = ams.form._getSubmitValidators(form); |
1745 var validators = ams.form._getSubmitValidators(form); |
1602 if (!validators.length) |
1746 if (!validators.length) { |
1603 return true; |
1747 return true; |
1604 var output = new Array(); |
1748 } |
|
1749 var output = []; |
1605 var result = true; |
1750 var result = true; |
1606 for (var index in validators) { |
1751 for (var index=0; index < validators.length; index++) { |
1607 if (!$.isNumeric(index)) // IE check ! |
|
1608 continue; |
|
1609 var validator = validators[index]; |
1752 var validator = validators[index]; |
1610 var source = validator[0]; |
1753 var source = validator[0]; |
1611 var handler = validator[1]; |
1754 var handler = validator[1]; |
1612 var validator_result = ams.executeFunctionByName(handler, form, source); |
1755 var validator_result = ams.executeFunctionByName(handler, form, source); |
1613 if (validator_result === false) |
1756 if (validator_result === false) { |
1614 result = false; |
1757 result = false; |
1615 else if (typeof(validator_result) == 'string') |
1758 } else if (typeof(validator_result) === 'string') { |
1616 output.push(validator_result); |
1759 output.push(validator_result); |
1617 else if (result.length && (result.length > 0)) |
1760 } else if (result.length && (result.length > 0)) { |
1618 output = output.concat(result); |
1761 output = output.concat(result); |
|
1762 } |
1619 } |
1763 } |
1620 if (output.length > 0) { |
1764 if (output.length > 0) { |
1621 var header = output.length == 1 ? ams.i18n.ERROR_OCCURED : ams.i18n.ERRORS_OCCURED; |
1765 var header = output.length === 1 ? ams.i18n.ERROR_OCCURED : ams.i18n.ERRORS_OCCURED; |
1622 ams.skin.alert(form, 'danger', header, output); |
1766 ams.skin.alert(form, 'danger', header, output); |
1623 return false; |
1767 return false; |
1624 } else |
1768 } else { |
1625 return result; |
1769 return result; |
|
1770 } |
1626 }, |
1771 }, |
1627 |
1772 |
1628 /** |
1773 /** |
1629 * Display JSON errors |
1774 * Display JSON errors |
1630 * JSON errors should be defined in an object as is: |
1775 * JSON errors should be defined in an object as is: |
1637 * {label: "Second widget name", |
1782 * {label: "Second widget name", |
1638 * name: "field-name-2", |
1783 * name: "field-name-2", |
1639 * message: "Second error message"},...]} |
1784 * message: "Second error message"},...]} |
1640 */ |
1785 */ |
1641 showErrors: function(form, errors) { |
1786 showErrors: function(form, errors) { |
1642 if (typeof(errors) == 'string') { |
1787 var header; |
1643 ams.skin.alert(form, 'error', ams.i18n.ERROR_OCCURED, errors) |
1788 if (typeof(errors) === 'string') { |
|
1789 ams.skin.alert(form, 'error', ams.i18n.ERROR_OCCURED, errors); |
1644 } else if (errors instanceof Array) { |
1790 } else if (errors instanceof Array) { |
1645 var header = errors.length == 1 ? ams.i18n.ERROR_OCCURED : ams.i18n.ERRORS_OCCURED; |
1791 header = errors.length === 1 ? ams.i18n.ERROR_OCCURED : ams.i18n.ERRORS_OCCURED; |
1646 ams.skin.alert(form, 'error', header, errors); |
1792 ams.skin.alert(form, 'error', header, errors); |
1647 } else { |
1793 } else { |
1648 $('.state-error', form).removeClass('state-error'); |
1794 $('.state-error', form).removeClass('state-error'); |
1649 header = errors.error_header || |
1795 header = errors.error_header || |
1650 (errors.widgets && (errors.widgets.length > 1) ? ams.i18n.ERRORS_OCCURED : ams.i18n.ERROR_OCCURED); |
1796 (errors.widgets && (errors.widgets.length > 1) ? ams.i18n.ERRORS_OCCURED : ams.i18n.ERROR_OCCURED); |
1651 var message = new Array(); |
1797 var message = []; |
1652 var index; |
1798 var index; |
1653 for (index in errors.messages) { |
1799 if (errors.messages) { |
1654 if (!$.isNumeric(index)) |
1800 for (index = 0; index < errors.messages.length; index++) { |
1655 continue; |
1801 var msg = errors.messages[index]; |
1656 if (errors.messages[index].header) { |
1802 if (msg.header) { |
1657 message.push('<strong>' + errors.messages[index].header + '</strong><br />' + errors.messages[index].message); |
1803 message.push('<strong>' + msg.header + '</strong><br />' + msg.message); |
1658 } else { |
1804 } else { |
1659 message.push(errors.messages[index].message || errors.messages[index]); |
1805 message.push(msg.message || msg); |
|
1806 } |
1660 } |
1807 } |
1661 } |
1808 } |
1662 for (index in errors.widgets) { |
1809 if (errors.widgets) { |
1663 if (!$.isNumeric(index)) |
1810 for (index = 0; index < errors.widgets.length; index++) { |
1664 continue; |
1811 // set widget status message |
1665 // set widget status message |
1812 var widget_data = errors.widgets[index]; |
1666 var widget_data = errors.widgets[index]; |
1813 var widget = $('[name="' + widget_data.name + '"]', form); |
1667 var widget = $('[name="' + widget_data.name + '"]', form); |
1814 widget.parents('label:first') |
1668 widget.parents('label:first') |
1815 .removeClassPrefix('state-') |
1669 .removeClassPrefix('state-') |
1816 .addClass('state-error') |
1670 .addClass('state-error') |
1817 .after('<span for="name" class="state-error">' + widget_data.message + '</span>'); |
1671 .after('<span for="name" class="state-error">' + widget_data.message + '</span>'); |
1818 // complete form alert message |
1672 // complete form alert message |
1819 if (widget_data.label) { |
1673 if (widget_data.label) { |
1820 message.push(widget_data.label + ' : ' + widget_data.message); |
1674 message.push(widget_data.label + ' : ' + widget_data.message); |
1821 } |
|
1822 // mark parent tab (if any) with error status |
|
1823 var tab_index = widget.parents('.tab-pane').index() + 1; |
|
1824 if (tab_index > 0) { |
|
1825 var nav_tabs = $('.nav-tabs', $(widget).parents('.tabforms')); |
|
1826 $('li:nth-child(' + tab_index + ')', nav_tabs).removeClassPrefix('state-') |
|
1827 .addClass('state-error'); |
|
1828 $('li.state-error:first a', form).click(); |
|
1829 } |
1675 } |
1830 } |
1676 // mark parent tab (if any) with error status |
1831 } |
1677 var tab_index = widget.parents('.tab-pane').index() + 1; |
1832 ams.skin.alert($('fieldset:first', form), errors.error_level || 'error', header, message, errors.error_message); |
1678 if (tab_index > 0) { |
|
1679 var nav_tabs = $('.nav-tabs', $(widget).parents('.tabforms')); |
|
1680 $('li:nth-child(' + tab_index + ')', nav_tabs).removeClassPrefix('state-') |
|
1681 .addClass('state-error'); |
|
1682 $('li.state-error:first a', form).click(); |
|
1683 } |
|
1684 } |
|
1685 ams.skin.alert(form, errors.error_level || 'error', header, message, errors.error_message); |
|
1686 } |
1833 } |
1687 } |
1834 } |
1688 }; |
1835 }; |
1689 |
1836 |
1690 |
1837 |
2017 }, |
2190 }, |
2018 |
2191 |
2019 /** Context menu handler */ |
2192 /** Context menu handler */ |
2020 contextMenuHandler: function(target, menu) { |
2193 contextMenuHandler: function(target, menu) { |
2021 var menu_data = menu.data(); |
2194 var menu_data = menu.data(); |
2022 if (menu_data.toggle == 'modal') { |
2195 if (menu_data.toggle === 'modal') { |
2023 ams.dialog.open(menu); |
2196 ams.dialog.open(menu); |
2024 } else { |
2197 } else { |
2025 var href = menu.attr('href') || menu_data.amsUrl; |
2198 var href = menu.attr('href') || menu_data.amsUrl; |
2026 if (!href || href.startsWith('javascript:') || menu.attr('target')) |
2199 if (!href || href.startsWith('javascript') || menu.attr('target')) { |
2027 return; |
2200 return; |
|
2201 } |
2028 ams.event.stop(); |
2202 ams.event.stop(); |
2029 var href_getter = ams.getFunctionByName(href); |
2203 var href_getter = ams.getFunctionByName(href); |
2030 if (typeof(href_getter) == 'function') { |
2204 if (typeof(href_getter) === 'function') { |
2031 href = href_getter.call(menu, target); |
2205 href = href_getter.call(menu, target); |
2032 } |
2206 } |
2033 if (typeof(href) == 'function') { |
2207 if (typeof(href) === 'function') { |
2034 // Javascript function call |
2208 // Javascript function call |
2035 href.call(menu, target); |
2209 href.call(menu, target); |
2036 } else { |
2210 } else { |
2037 // Standard AJAX or browser URL call |
2211 // Standard AJAX or browser URL call |
2038 // Convert %23 chars to # |
2212 // Convert %23 chars to # |
2039 href = href.replace(/\%23/, '#'); |
2213 href = href.replace(/\%23/, '#'); |
2040 var target = menu.data('ams-target'); |
2214 target = menu.data('ams-target'); |
2041 if (target) { |
2215 if (target) { |
2042 ams.form.confirmChangedForm(target, function () { |
2216 ams.form.confirmChangedForm(target, function () { |
2043 ams.skin.loadURL(href, target, menu.data('ams-link-options'), menu.data('ams-link-callback')); |
2217 ams.skin.loadURL(href, target, menu.data('ams-link-options'), menu.data('ams-link-callback')); |
2044 }); |
2218 }); |
2045 } else { |
2219 } else { |
2046 ams.form.confirmChangedForm(function () { |
2220 ams.form.confirmChangedForm(function () { |
2047 if (href.startsWith('#')) { |
2221 if (href.startsWith('#')) { |
2048 if (href != location.hash) { |
2222 if (href !== location.hash) { |
2049 if (ams.root.hasClass('mobile-view-activated')) { |
2223 if (ams.root.hasClass('mobile-view-activated')) { |
2050 ams.root.removeClass('hidden-menu'); |
2224 ams.root.removeClass('hidden-menu'); |
2051 window.setTimeout(function () { |
2225 window.setTimeout(function () { |
2052 window.location.hash = href; |
2226 window.location.hash = href; |
2053 }, 150); |
2227 }, 150); |
2054 } else |
2228 } else { |
2055 window.location.hash = href; |
2229 window.location.hash = href; |
|
2230 } |
2056 } |
2231 } |
2057 } else |
2232 } else { |
2058 window.location = href; |
2233 window.location = href; |
|
2234 } |
2059 }); |
2235 }); |
2060 } |
2236 } |
2061 } |
2237 } |
2062 } |
2238 } |
2063 }, |
2239 }, |
2091 |
2267 |
2092 // Initialize custom data attributes |
2268 // Initialize custom data attributes |
2093 ams.plugins.initData(element); |
2269 ams.plugins.initData(element); |
2094 |
2270 |
2095 // Check for disabled plug-ins |
2271 // Check for disabled plug-ins |
2096 var disabled = new Array(); |
2272 var disabled = []; |
2097 $('[data-ams-plugins-disabled]', element).each(function() { |
2273 $('[data-ams-plugins-disabled]', element).each(function() { |
2098 var plugins = $(this).data('ams-plugins-disabled').split(/\s+/); |
2274 var plugins = $(this).data('ams-plugins-disabled').split(/\s+/); |
2099 for (var name in plugins) { |
2275 for (var index=0; index < plugins.length; index++) { |
2100 disabled.push(plugins[name]); |
2276 disabled.push(plugins[index]); |
2101 } |
2277 } |
2102 }); |
2278 }); |
2103 |
2279 |
2104 // Load and register new plug-ins |
2280 // Scan new element for plug-ins |
|
2281 var plugins = {}; |
|
2282 var plugin; |
2105 var name; |
2283 var name; |
|
2284 |
2106 $('[data-ams-plugins]', element).each(function() { |
2285 $('[data-ams-plugins]', element).each(function() { |
|
2286 |
|
2287 function registerPlugin(name, new_plugin) { |
|
2288 if (plugins.hasOwnProperty(name)) { |
|
2289 var plugin = plugins[name]; |
|
2290 plugin.css = plugin.css || new_plugin.css; |
|
2291 if (new_plugin.callback) { |
|
2292 plugin.callbacks.push(new_plugin.callback); |
|
2293 } |
|
2294 if (new_plugin.register) { |
|
2295 plugin.register = true; |
|
2296 } |
|
2297 if (new_plugin.async === false) { |
|
2298 plugin.async = false; |
|
2299 } |
|
2300 } else { |
|
2301 plugins[name] = { |
|
2302 src: new_plugin.src, |
|
2303 css: new_plugin.css, |
|
2304 callbacks: new_plugin.callback ? [new_plugin.callback] : [], |
|
2305 register: new_plugin.register, |
|
2306 async: new_plugin.async |
|
2307 } |
|
2308 } |
|
2309 } |
|
2310 |
2107 var source = $(this); |
2311 var source = $(this); |
2108 var plugins = {} |
2312 var ams_plugins = source.data('ams-plugins'); |
2109 if (typeof(source.data('ams-plugins')) === 'string') { |
2313 if (typeof(ams_plugins) === 'string') { |
2110 var names = source.data('ams-plugins').split(/\s+/); |
2314 var names = source.data('ams-plugins').split(/\s+/); |
2111 for (var index in names) { |
2315 for (var index = 0; index < names.length; index++) { |
2112 name = names[index]; |
2316 name = names[index]; |
2113 var plugin_options = { |
2317 var new_plugin = { |
2114 src: source.data('ams-plugin-' + name + '-src'), |
2318 src: source.data('ams-plugin-' + name + '-src'), |
2115 css: source.data('ams-plugin-' + name + '-css'), |
2319 css: source.data('ams-plugin-' + name + '-css'), |
2116 callback: source.data('ams-plugin-' + name + '-callback'), |
2320 callback: source.data('ams-plugin-' + name + '-callback'), |
2117 register: source.data('ams-plugin-' + name + '-register'), |
2321 register: source.data('ams-plugin-' + name + '-register'), |
2118 async: source.data('ams-plugin-' + name + '-async') |
2322 async: source.data('ams-plugin-' + name + '-async') |
2119 } |
2323 }; |
2120 plugins[name] = plugin_options; |
2324 registerPlugin(name, new_plugin); |
2121 } |
2325 } |
2122 } else { |
2326 } else { |
2123 plugins = source.data('ams-plugins'); |
2327 for (name in ams_plugins) { |
2124 } |
2328 if (!ams_plugins.hasOwnProperty(name)) { |
2125 for (name in plugins) { |
2329 continue; |
2126 if (ams.plugins.enabled[name] === undefined) { |
2330 } |
2127 var plugin = plugins[name]; |
2331 registerPlugin(name, ams_plugins[name]); |
2128 ams.getScript(plugin.src, function() { |
2332 } |
2129 var callback = plugin.callback; |
2333 } |
2130 if (callback) { |
2334 }); |
2131 var called = ams.getFunctionByName(callback); |
2335 |
2132 if (plugin.register !== false) |
2336 // Load new plug-ins and execute async ones |
2133 ams.plugins.enabled[name] = called; |
2337 for (name in plugins) { |
2134 } else { |
2338 if (ams.plugins.enabled[name] === undefined) { |
2135 if (plugin.register !== false) |
2339 plugin = plugins[name]; |
2136 ams.plugins.enabled[name] = null; |
2340 ams.getScript(plugin.src, function() { |
|
2341 var index; |
|
2342 var callbacks = plugin.callbacks; |
|
2343 if (callbacks) { |
|
2344 for (index=0; index < callbacks.length; index++) { |
|
2345 var called = ams.getFunctionByName(callbacks[index]); |
|
2346 if (plugin.register !== false) { |
|
2347 var enabled = ams.plugins.enabled; |
|
2348 if (enabled.hasOwnProperty(name)) { |
|
2349 enabled[name].push(called); |
|
2350 } else { |
|
2351 enabled[name] = [called]; |
|
2352 } |
|
2353 } |
2137 } |
2354 } |
2138 var css = plugin['css']; |
2355 } else { |
2139 if (css) { |
2356 if (plugin.register !== false) { |
2140 ams.getCSS(css, name + '_css'); |
2357 ams.plugins.enabled[name] = null; |
2141 } |
2358 } |
2142 }, { |
2359 } |
2143 async: plugin.async === undefined ? true : plugin.async |
2360 var css = plugin.css; |
2144 }); |
2361 if (css) { |
2145 } |
2362 ams.getCSS(css, name + '_css'); |
2146 } |
2363 } |
2147 }); |
2364 // If running in async mode, registered plug-ins are run |
|
2365 // before callback is called so we call plug-in manually |
|
2366 if (callbacks && (plugin.async !== false)) { |
|
2367 for (index=0; index < callbacks.length; index++) { |
|
2368 callbacks[index](element); |
|
2369 } |
|
2370 } |
|
2371 }, { |
|
2372 async: plugin.async === undefined ? true : plugin.async |
|
2373 }); |
|
2374 } |
|
2375 } |
2148 |
2376 |
2149 // Run all enabled plug-ins |
2377 // Run all enabled plug-ins |
2150 for (var index in ams.plugins.enabled) { |
2378 for (var index in ams.plugins.enabled) { |
2151 if (disabled.indexOf(index) >= 0) |
2379 if (!ams.plugins.enabled.hasOwnProperty(index)) { |
2152 continue; |
2380 continue; |
2153 var plugin = ams.plugins.enabled[index]; |
2381 } |
2154 if (typeof(plugin) == 'function') |
2382 if (disabled.indexOf(index) >= 0) { |
2155 plugin(element); |
2383 continue; |
|
2384 } |
|
2385 var callbacks = ams.plugins.enabled[index]; |
|
2386 switch (typeof(callbacks)) { |
|
2387 case 'function': |
|
2388 callbacks(element); |
|
2389 break; |
|
2390 default: |
|
2391 for (var cb_index = 0; cb_index < callbacks.length; cb_index++) { |
|
2392 var callback = callbacks[cb_index]; |
|
2393 if (typeof(callback) === 'function') { |
|
2394 callback(element); |
|
2395 } |
|
2396 } |
|
2397 } |
2156 } |
2398 } |
2157 }, |
2399 }, |
2158 |
2400 |
2159 /** |
2401 /** |
2160 * Data initializer |
2402 * Data initializer |
2239 /** |
2486 /** |
2240 * Label hints |
2487 * Label hints |
2241 */ |
2488 */ |
2242 hint: function(element) { |
2489 hint: function(element) { |
2243 var hints = $('.hint:not(:parents(.nohints))', element); |
2490 var hints = $('.hint:not(:parents(.nohints))', element); |
2244 if (hints.length > 0) |
2491 if (hints.length > 0) { |
2245 ams.ajax.check($.fn.tipsy, |
2492 ams.ajax.check($.fn.tipsy, |
2246 ams.baseURL + 'ext/jquery-tipsy' + ams.devext + '.js', |
2493 ams.baseURL + 'ext/jquery-tipsy' + ams.devext + '.js', |
2247 function() { |
2494 function () { |
2248 ams.getCSS(ams.baseURL + '../css/ext/jquery-tipsy' + ams.devext + '.css', |
2495 ams.getCSS(ams.baseURL + '../css/ext/jquery-tipsy' + ams.devext + '.css', |
2249 'jquery-tipsy'); |
2496 'jquery-tipsy'); |
2250 hints.each(function() { |
2497 hints.each(function () { |
2251 var hint = $(this); |
2498 var hint = $(this); |
2252 var data = hint.data(); |
2499 var data = hint.data(); |
2253 var data_options = { |
2500 var data_options = { |
2254 html: data.amsHintHtml, |
2501 html: data.amsHintHtml, |
2255 title: ams.getFunctionByName(data.amsHintTitleGetter) || function() { |
2502 title: ams.getFunctionByName(data.amsHintTitleGetter) || function () { |
2256 var hint = $(this); |
2503 var hint = $(this); |
2257 return hint.attr('original-title') || |
2504 return hint.attr('original-title') || |
2258 hint.attr(data.amsHintTitleAttr || 'title') || |
2505 hint.attr(data.amsHintTitleAttr || 'title') || |
2259 (data.amsHintHtml ? hint.html() : hint.text()); |
2506 (data.amsHintHtml ? hint.html() : hint.text()); |
2260 }, |
2507 }, |
2261 opacity: data.amsHintOpacity || 0.95, |
2508 opacity: data.amsHintOpacity || 0.95, |
2262 gravity: data.amsHintGravity || 'sw', |
2509 gravity: data.amsHintGravity || 'sw', |
2263 offset: data.amsHintOffset || 0 |
2510 offset: data.amsHintOffset || 0 |
2264 }; |
2511 }; |
2265 var settings = $.extend({}, data_options, data.amsHintOptions); |
2512 var settings = $.extend({}, data_options, data.amsHintOptions); |
2266 settings = ams.executeFunctionByName(data.amsHintInitCallback, hint, settings) || settings; |
2513 settings = ams.executeFunctionByName(data.amsHintInitCallback, hint, settings) || settings; |
2267 var plugin = hint.tipsy(settings); |
2514 var plugin = hint.tipsy(settings); |
2268 ams.executeFunctionByName(data.amsHintAfterInitCallback, hint, plugin, settings); |
2515 ams.executeFunctionByName(data.amsHintAfterInitCallback, hint, plugin, settings); |
2269 }); |
2516 }); |
2270 }); |
2517 }); |
|
2518 } |
2271 }, |
2519 }, |
2272 |
2520 |
2273 /** |
2521 /** |
2274 * Context menu plug-in |
2522 * Context menu plug-in |
2275 */ |
2523 */ |
2300 var fieldset = legend.parent('fieldset'); |
2548 var fieldset = legend.parent('fieldset'); |
2301 var data = legend.data(); |
2549 var data = legend.data(); |
2302 if (!data.amsSwitcher) { |
2550 if (!data.amsSwitcher) { |
2303 $('<i class="fa fa-fw"></i>') |
2551 $('<i class="fa fa-fw"></i>') |
2304 .prependTo($(this)) |
2552 .prependTo($(this)) |
2305 .addClass(data.amsSwitcherState == 'open' ? |
2553 .addClass(data.amsSwitcherState === 'open' ? |
2306 (data.amsSwitcherMinusClass || 'fa-minus') : |
2554 (data.amsSwitcherMinusClass || 'fa-minus') : |
2307 (data.amsSwitcherPlusClass || 'fa-plus')); |
2555 (data.amsSwitcherPlusClass || 'fa-plus')); |
2308 legend.on('click', function(e) { |
2556 legend.on('click', function(e) { |
2309 e.preventDefault(); |
2557 e.preventDefault(); |
2310 var veto = {}; |
2558 var veto = {}; |
2311 legend.trigger('ams.switcher.before-switch', [legend, veto]); |
2559 legend.trigger('ams.switcher.before-switch', [legend, veto]); |
2312 if (veto.veto) |
2560 if (veto.veto) { |
2313 return; |
2561 return; |
|
2562 } |
2314 if (fieldset.hasClass('switched')) { |
2563 if (fieldset.hasClass('switched')) { |
2315 fieldset.removeClass('switched'); |
2564 fieldset.removeClass('switched'); |
2316 $('.fa', legend).removeClass(data.amsSwitcherPlusClass || 'fa-plus') |
2565 $('.fa', legend).removeClass(data.amsSwitcherPlusClass || 'fa-plus') |
2317 .addClass(data.amsSwitcherMinusClass || 'fa-minus'); |
2566 .addClass(data.amsSwitcherMinusClass || 'fa-minus'); |
2318 legend.trigger('ams.switcher.opened', [legend]); |
2567 legend.trigger('ams.switcher.opened', [legend]); |
2319 var id = legend.attr('id'); |
2568 var id = legend.attr('id'); |
2320 if (id) { |
2569 if (id) { |
2321 $('legend.switcher[data-ams-switcher-sync="'+id+'"]', fieldset).each(function() { |
2570 $('legend.switcher[data-ams-switcher-sync="'+id+'"]', fieldset).each(function() { |
2322 var switcher = $(this); |
2571 var switcher = $(this); |
2323 if (switcher.parents('fieldset').hasClass('switched')) |
2572 if (switcher.parents('fieldset').hasClass('switched')) { |
2324 switcher.click(); |
2573 switcher.click(); |
|
2574 } |
2325 }); |
2575 }); |
2326 } |
2576 } |
2327 } else { |
2577 } else { |
2328 fieldset.addClass('switched'); |
2578 fieldset.addClass('switched'); |
2329 $('.fa', legend).removeClass(data.amsSwitcherMinusClass || 'fa-minus') |
2579 $('.fa', legend).removeClass(data.amsSwitcherMinusClass || 'fa-minus') |
2330 .addClass(data.amsSwitcherPlusClass || 'fa-plus'); |
2580 .addClass(data.amsSwitcherPlusClass || 'fa-plus'); |
2331 legend.trigger('ams.switcher.closed', [legend]); |
2581 legend.trigger('ams.switcher.closed', [legend]); |
2332 } |
2582 } |
2333 }); |
2583 }); |
2334 if (data.amsSwitcherState != 'open') |
2584 if (data.amsSwitcherState !== 'open') { |
2335 fieldset.addClass('switched'); |
2585 fieldset.addClass('switched'); |
|
2586 } |
2336 legend.data('ams-switcher', 'on'); |
2587 legend.data('ams-switcher', 'on'); |
2337 } |
2588 } |
2338 }); |
2589 }); |
2339 }, |
2590 }, |
2340 |
2591 |
2569 maximumSelectionSize: data.amsSelect2MaximumSelectionSize, |
2825 maximumSelectionSize: data.amsSelect2MaximumSelectionSize, |
2570 openOnEnter: data.amsSelect2EnterOpen === undefined ? true : data.amsSelect2EnterOpen, |
2826 openOnEnter: data.amsSelect2EnterOpen === undefined ? true : data.amsSelect2EnterOpen, |
2571 allowClear: data.amsSelect2AllowClear === undefined ? true : data.amsSelect2AllowClear, |
2827 allowClear: data.amsSelect2AllowClear === undefined ? true : data.amsSelect2AllowClear, |
2572 width: data.amsSelect2Width || '100%', |
2828 width: data.amsSelect2Width || '100%', |
2573 initSelection: ams.getFunctionByName(data.amsSelect2InitSelection), |
2829 initSelection: ams.getFunctionByName(data.amsSelect2InitSelection), |
2574 formatSelection: data.amsSelect2FormatSelection === undefined |
2830 formatSelection: data.amsSelect2FormatSelection === undefined ? |
2575 ? ams.helpers.select2FormatSelection |
2831 ams.helpers.select2FormatSelection |
2576 : ams.getFunctionByName(data.amsSelect2FormatSelection), |
2832 : ams.getFunctionByName(data.amsSelect2FormatSelection), |
2577 formatResult: ams.getFunctionByName(data.amsSelect2FormatResult), |
2833 formatResult: ams.getFunctionByName(data.amsSelect2FormatResult), |
2578 formatMatches: data.amsSelect2FormatMatches === undefined |
2834 formatMatches: data.amsSelect2FormatMatches === undefined ? |
2579 ? function(matches) { |
2835 function(matches) { |
2580 if (matches == 1) |
2836 if (matches === 1) { |
2581 return ams.i18n.SELECT2_MATCH; |
2837 return ams.i18n.SELECT2_MATCH; |
2582 else |
2838 } else { |
2583 return matches + ams.i18n.SELECT2_MATCHES; |
2839 return matches + ams.i18n.SELECT2_MATCHES; |
|
2840 } |
2584 } |
2841 } |
2585 : ams.getFunctionByName(data.amsSelect2FormatMatches), |
2842 : ams.getFunctionByName(data.amsSelect2FormatMatches), |
2586 formatNoMatches: data.amsSelect2FormatResult === undefined |
2843 formatNoMatches: data.amsSelect2FormatResult === undefined ? |
2587 ? function(term) { |
2844 function(term) { |
2588 return ams.i18n.SELECT2_NOMATCHES; |
2845 return ams.i18n.SELECT2_NOMATCHES; |
2589 } |
2846 } |
2590 : ams.getFunctionByName(data.amsSelect2FormatResult), |
2847 : ams.getFunctionByName(data.amsSelect2FormatResult), |
2591 formatInputTooShort: data.amsSelect2FormatInputTooShort === undefined |
2848 formatInputTooShort: data.amsSelect2FormatInputTooShort === undefined ? |
2592 ? function(input, min) { |
2849 function(input, min) { |
2593 var n = min - input.length; |
2850 var n = min - input.length; |
2594 return ams.i18n.SELECT2_INPUT_TOOSHORT |
2851 return ams.i18n.SELECT2_INPUT_TOOSHORT |
2595 .replace(/\{0\}/, n) |
2852 .replace(/\{0\}/, n) |
2596 .replace(/\{1\}/, n == 1 ? "" : ams.i18n.SELECT2_PLURAL); |
2853 .replace(/\{1\}/, n === 1 ? "" : ams.i18n.SELECT2_PLURAL); |
2597 } |
2854 } |
2598 : ams.getFunctionByName(data.amsSelect2FormatInputTooShort), |
2855 : ams.getFunctionByName(data.amsSelect2FormatInputTooShort), |
2599 formatInputTooLong: data.amsSelect2FormatInputTooLong === undefined |
2856 formatInputTooLong: data.amsSelect2FormatInputTooLong === undefined ? |
2600 ? function(input, max) { |
2857 function(input, max) { |
2601 var n = input.length - max; |
2858 var n = input.length - max; |
2602 return ams.i18n.SELECT2_INPUT_TOOLONG |
2859 return ams.i18n.SELECT2_INPUT_TOOLONG |
2603 .replace(/\{0\}/, n) |
2860 .replace(/\{0\}/, n) |
2604 .replace(/\{1\}/, n == 1 ? "" : ams.i18n.SELECT2_PLURAL); |
2861 .replace(/\{1\}/, n === 1 ? "" : ams.i18n.SELECT2_PLURAL); |
2605 } |
2862 } |
2606 : ams.getFunctionByName(data.amsSelect2FormatInputTooLong), |
2863 : ams.getFunctionByName(data.amsSelect2FormatInputTooLong), |
2607 formatSelectionTooBig: data.amsSelect2FormatSelectionTooBig === undefined |
2864 formatSelectionTooBig: data.amsSelect2FormatSelectionTooBig === undefined ? |
2608 ? function(limit) { |
2865 function(limit) { |
2609 return ams.i18n.SELECT2_SELECTION_TOOBIG |
2866 return ams.i18n.SELECT2_SELECTION_TOOBIG |
2610 .replace(/\{0\}/, limit) |
2867 .replace(/\{0\}/, limit) |
2611 .replace(/\{1\}/, limit == 1 ? "" : ams.i18n.SELECT2_PLURAL); |
2868 .replace(/\{1\}/, limit === 1 ? "" : ams.i18n.SELECT2_PLURAL); |
2612 } |
2869 } |
2613 : ams.getFunctionByName(data.amsSelect2FormatSelectionTooBig), |
2870 : ams.getFunctionByName(data.amsSelect2FormatSelectionTooBig), |
2614 formatLoadMore: data.amsSelect2FormatLoadMore === undefined |
2871 formatLoadMore: data.amsSelect2FormatLoadMore === undefined ? |
2615 ? function (pageNumber) { |
2872 function (pageNumber) { |
2616 return ams.i18n.SELECT2_LOADMORE; |
2873 return ams.i18n.SELECT2_LOADMORE; |
2617 } |
2874 } |
2618 : ams.getFunctionByName(data.amsSelect2FormatLoadMore), |
2875 : ams.getFunctionByName(data.amsSelect2FormatLoadMore), |
2619 formatSearching: data.amsSelect2FormatSearching === undefined |
2876 formatSearching: data.amsSelect2FormatSearching === undefined ? |
2620 ? function() { |
2877 function() { |
2621 return ams.i18n.SELECT2_SEARCHING; |
2878 return ams.i18n.SELECT2_SEARCHING; |
2622 } |
2879 } |
2623 : ams.getFunctionByName(data.amsSelect2FormatSearching), |
2880 : ams.getFunctionByName(data.amsSelect2FormatSearching), |
2624 separator: data.amsSelect2Separator || ',', |
2881 separator: data.amsSelect2Separator || ',', |
2625 tokenSeparators: data.amsSelect2TokensSeparators || [','], |
2882 tokenSeparators: data.amsSelect2TokensSeparators || [','], |
2907 }, |
3166 }, |
2908 errorElement: 'span', |
3167 errorElement: 'span', |
2909 errorClass: 'state-error', |
3168 errorClass: 'state-error', |
2910 errorPlacement: function(error, element) { |
3169 errorPlacement: function(error, element) { |
2911 var label = element.parents('label:first'); |
3170 var label = element.parents('label:first'); |
2912 if (label.length) |
3171 if (label.length) { |
2913 error.insertAfter(label); |
3172 error.insertAfter(label); |
2914 else |
3173 } else { |
2915 error.insertAfter(element); |
3174 error.insertAfter(element); |
|
3175 } |
2916 } |
3176 } |
2917 }); |
3177 }); |
2918 if (ams.plugins.i18n) { |
3178 if (ams.plugins.i18n) { |
2919 for (var key in ams.plugins.i18n.validate) { |
3179 for (var key in ams.plugins.i18n.validate) { |
|
3180 if (!ams.plugins.i18n.validate.hasOwnProperty(key)) { |
|
3181 continue; |
|
3182 } |
2920 var message = ams.plugins.i18n.validate[key]; |
3183 var message = ams.plugins.i18n.validate[key]; |
2921 if ((typeof(message) == 'string') && |
3184 if ((typeof(message) === 'string') && |
2922 (message.indexOf('{0}') > -1)) |
3185 (message.indexOf('{0}') > -1)) { |
2923 ams.plugins.i18n.validate[key] = $.validator.format(message); |
3186 ams.plugins.i18n.validate[key] = $.validator.format(message); |
|
3187 } |
2924 } |
3188 } |
2925 $.extend($.validator.messages, ams.plugins.i18n.validate); |
3189 $.extend($.validator.messages, ams.plugins.i18n.validate); |
2926 } |
3190 } |
2927 } |
3191 } |
2928 forms.each(function() { |
3192 forms.each(function() { |
2929 var form = $(this); |
3193 var form = $(this); |
2930 var data = form.data(); |
3194 var data = form.data(); |
2931 var data_options = { |
3195 var data_options = { |
2932 ignore: null, |
3196 ignore: null, |
2933 submitHandler: form.attr('data-async') !== undefined |
3197 submitHandler: form.attr('data-async') !== undefined ? |
2934 ? data.amsFormSubmitHandler === undefined |
3198 data.amsFormSubmitHandler === undefined ? |
2935 ? function() { |
3199 function() { |
2936 // JQuery-form plug-in must be loaded synchronously!! |
3200 // JQuery-form plug-in must be loaded synchronously!! |
2937 // Otherwise, hidden input fields created by jquery-validate plug-in |
3201 // Otherwise, hidden input fields created by jquery-validate plug-in |
2938 // and matching named buttons will be deleted (on first form submit) |
3202 // and matching named buttons will be deleted (on first form submit) |
2939 // before JQuery-form plug-in can get them when submitting the form... |
3203 // before JQuery-form plug-in can get them when submitting the form... |
2940 $('.state-error', form).removeClass('state-error'); |
3204 $('.state-error', form).removeClass('state-error'); |
3000 ">r<'dt-wrapper't" + |
3264 ">r<'dt-wrapper't" + |
3001 (extensions.indexOf('scroller') >= 0 ? 'S' : '') + |
3265 (extensions.indexOf('scroller') >= 0 ? 'S' : '') + |
3002 "><'dt-row dt-bottom-row'<'row'<'col-sm-6'" + |
3266 "><'dt-row dt-bottom-row'<'row'<'col-sm-6'" + |
3003 (data.amsDatatableInformation === false ? '': 'i') + |
3267 (data.amsDatatableInformation === false ? '': 'i') + |
3004 "><'col-sm-6 text-right'p>>"; |
3268 "><'col-sm-6 text-right'p>>"; |
|
3269 |
3005 var index; |
3270 var index; |
3006 // Check initial sorting |
3271 // Check initial sorting |
3007 var sorting = data.amsDatatableSorting; |
3272 var sorting = data.amsDatatableSorting; |
3008 if (typeof(sorting) === 'string') { |
3273 if (typeof(sorting) === 'string') { |
3009 var sortings = sorting.split(';'); |
3274 var sortings = sorting.split(';'); |
3010 sorting = []; |
3275 sorting = []; |
3011 for (index in sortings) { |
3276 for (index=0; index < sortings.length; index++) { |
3012 var col_sorting = sortings[index].split(','); |
3277 var col_sorting = sortings[index].split(','); |
3013 col_sorting[0] = parseInt(col_sorting[0]); |
3278 col_sorting[0] = parseInt(col_sorting[0]); |
3014 sorting.push(col_sorting); |
3279 sorting.push(col_sorting); |
3015 } |
3280 } |
3016 } |
3281 } |
3017 // Check columns types |
3282 // Check columns types |
3018 var columns = []; |
3283 var columns = []; |
3019 var sort_types = $('th', table).listattr('data-ams-datatable-stype'); |
3284 var sort_types = $('th', table).listattr('data-ams-datatable-stype'); |
3020 for (index in sort_types) { |
3285 for (index=0; index < sort_types.length; index++) { |
3021 var sort_type = sort_types[index]; |
3286 var sort_type = sort_types[index]; |
3022 if (sort_type) { |
3287 if (sort_type) { |
3023 var column = columns[index] || {}; |
3288 var column = columns[index] || {}; |
3024 column.sType = sort_type; |
3289 column.sType = sort_type; |
3025 columns[index] = column; |
3290 columns[index] = column; |
3112 settings = ams.executeFunctionByName(data.amsDatatableInitCallback, table, settings) || settings; |
3377 settings = ams.executeFunctionByName(data.amsDatatableInitCallback, table, settings) || settings; |
3113 try { // Some settings can easilly generate DataTables exceptions... |
3378 try { // Some settings can easilly generate DataTables exceptions... |
3114 var plugin = table.dataTable(settings); |
3379 var plugin = table.dataTable(settings); |
3115 ams.executeFunctionByName(data.amsDatatableAfterInitCallback, table, plugin, settings); |
3380 ams.executeFunctionByName(data.amsDatatableAfterInitCallback, table, plugin, settings); |
3116 if (extensions.length > 0) { |
3381 if (extensions.length > 0) { |
3117 for (index in extensions) { |
3382 for (index=0; index < extensions.length; index++) { |
3118 switch (extensions[index]) { |
3383 switch (extensions[index]) { |
3119 case 'autofill': |
3384 case 'autofill': |
3120 var af_settings = $.extend({}, data.amsDatatableAutofillOptions, settings.autofill); |
3385 var af_settings = $.extend({}, data.amsDatatableAutofillOptions, settings.autofill); |
3121 af_settings = ams.executeFunctionByName(data.amsDatatableAutofillInitCallback, table, af_settings) || af_settings; |
3386 af_settings = ams.executeFunctionByName(data.amsDatatableAutofillInitCallback, table, af_settings) || af_settings; |
3122 table.data('ams-autofill', data.amsDatatableAutofillConstructor === undefined |
3387 table.data('ams-autofill', data.amsDatatableAutofillConstructor === undefined ? |
3123 ? new $.fn.dataTable.AutoFill(table, af_settings) |
3388 new $.fn.dataTable.AutoFill(table, af_settings) |
3124 : ams.executeFunctionByName(data.amsDatatableAutofillConstructor, table, plugin, af_settings)); |
3389 : ams.executeFunctionByName(data.amsDatatableAutofillConstructor, table, plugin, af_settings)); |
3125 break; |
3390 break; |
3126 case 'columnfilter': |
3391 case 'columnfilter': |
3127 var cf_default = { |
3392 var cf_default = { |
3128 sPlaceHolder: 'head:after' |
3393 sPlaceHolder: 'head:after' |
3129 }; |
3394 }; |
3130 var cf_settings = $.extend({}, cf_default, data.amsDatatableColumnfilterOptions, settings.columnfilter); |
3395 var cf_settings = $.extend({}, cf_default, data.amsDatatableColumnfilterOptions, settings.columnfilter); |
3131 cf_settings = ams.executeFunctionByName(data.amsDatatableColumnfilterInitCallback, table, cf_settings) || cf_settings; |
3396 cf_settings = ams.executeFunctionByName(data.amsDatatableColumnfilterInitCallback, table, cf_settings) || cf_settings; |
3132 table.data('ams-columnfilter', data.amsDatatableColumnfilterConstructor === undefined |
3397 table.data('ams-columnfilter', data.amsDatatableColumnfilterConstructor === undefined ? |
3133 ? plugin.columnFilter(cf_settings) |
3398 plugin.columnFilter(cf_settings) |
3134 : ams.executeFunctionByName(data.amsDatatableColumnfilterConstructor, table, plugin, cf_settings)); |
3399 : ams.executeFunctionByName(data.amsDatatableColumnfilterConstructor, table, plugin, cf_settings)); |
3135 break; |
3400 break; |
3136 case 'editable': |
3401 case 'editable': |
3137 var ed_settings = $.extend({}, data.amsDatatableEditableOptions, settings.editable); |
3402 var ed_settings = $.extend({}, data.amsDatatableEditableOptions, settings.editable); |
3138 ed_settings = ams.executeFunctionByName(data.amsDatatableEditableInitCallback, table, ed_settings) || ed_settings; |
3403 ed_settings = ams.executeFunctionByName(data.amsDatatableEditableInitCallback, table, ed_settings) || ed_settings; |
3139 table.data('ams-editable', data.amsDatatableEditableConstructor === undefined |
3404 table.data('ams-editable', data.amsDatatableEditableConstructor === undefined ? |
3140 ? table.makeEditable(ed_settings) |
3405 table.makeEditable(ed_settings) |
3141 : ams.executeFunctionByName(data.amsDatatableEditableConstructor, table, plugin, ed_settings)); |
3406 : ams.executeFunctionByName(data.amsDatatableEditableConstructor, table, plugin, ed_settings)); |
3142 break; |
3407 break; |
3143 case 'fixedcolumns': |
3408 case 'fixedcolumns': |
3144 var fc_settings = $.extend({}, data.amsDatatableFixedcolumnsOptions, settings.fixedcolumns); |
3409 var fc_settings = $.extend({}, data.amsDatatableFixedcolumnsOptions, settings.fixedcolumns); |
3145 fc_settings = ams.executeFunctionByName(data.amsDatatableFixedcolumnsInitCallback, table, fc_settings) || fc_settings; |
3410 fc_settings = ams.executeFunctionByName(data.amsDatatableFixedcolumnsInitCallback, table, fc_settings) || fc_settings; |
3146 table.data('ams-fixedcolumns', data.amsDatatableFixedcolumnsConstructor === undefined |
3411 table.data('ams-fixedcolumns', data.amsDatatableFixedcolumnsConstructor === undefined ? |
3147 ? new $.fn.dataTable.FixedColumns(table, fc_settings) |
3412 new $.fn.dataTable.FixedColumns(table, fc_settings) |
3148 : ams.executeFunctionByName(data.amsDatatableFixedcolumnsConstructor, table, plugin, fc_settings)); |
3413 : ams.executeFunctionByName(data.amsDatatableFixedcolumnsConstructor, table, plugin, fc_settings)); |
3149 break; |
3414 break; |
3150 case 'fixedheader': |
3415 case 'fixedheader': |
3151 var fh_settings = $.extend({}, data.amsDatatableFixedheaderOptions, settings.fixedheader); |
3416 var fh_settings = $.extend({}, data.amsDatatableFixedheaderOptions, settings.fixedheader); |
3152 fh_settings = ams.executeFunctionByName(data.amsDatatableFixedheadeInitCallback, table, fh_settings) || fh_settings; |
3417 fh_settings = ams.executeFunctionByName(data.amsDatatableFixedheadeInitCallback, table, fh_settings) || fh_settings; |
3153 table.data('ams-fixedheader', data.amsDatatableFixedheaderConstructor === undefined |
3418 table.data('ams-fixedheader', data.amsDatatableFixedheaderConstructor === undefined ? |
3154 ? new $.fn.dataTable.FixedHeader(table, fh_settings) |
3419 new $.fn.dataTable.FixedHeader(table, fh_settings) |
3155 : ams.executeFunctionByName(data.amsDatatableFixedheaderConstructor, table, plugin, fh_settings)); |
3420 : ams.executeFunctionByName(data.amsDatatableFixedheaderConstructor, table, plugin, fh_settings)); |
3156 break; |
3421 break; |
3157 case 'keytable': |
3422 case 'keytable': |
3158 var kt_default = { |
3423 var kt_default = { |
3159 table: table.get(0), |
3424 table: table.get(0), |
3160 datatable: plugin |
3425 datatable: plugin |
3161 }; |
3426 }; |
3162 var kt_settings = $.extend({}, kt_default, data.amsDatatableKeytableOptions, settings.keytable); |
3427 var kt_settings = $.extend({}, kt_default, data.amsDatatableKeytableOptions, settings.keytable); |
3163 kt_settings = ams.executeFunctionByName(data.amsDatatableKeytableInitCallback, table, kt_settings) || kt_settings; |
3428 kt_settings = ams.executeFunctionByName(data.amsDatatableKeytableInitCallback, table, kt_settings) || kt_settings; |
3164 table.data('ams-keytable', data.amsDatatableKeytableConstructor === undefined |
3429 table.data('ams-keytable', data.amsDatatableKeytableConstructor === undefined ? |
3165 ? new KeyTable(kt_settings) |
3430 new KeyTable(kt_settings) |
3166 : ams.executeFunctionByName(data.amsDatatableKeytableConstructor, table, plugin, kt_settings)); |
3431 : ams.executeFunctionByName(data.amsDatatableKeytableConstructor, table, plugin, kt_settings)); |
3167 break; |
3432 break; |
3168 case 'rowgrouping': |
3433 case 'rowgrouping': |
3169 var rg_settings = $.extend({}, data.amsDatatableRowgroupingOptions, settings.rowgrouping); |
3434 var rg_settings = $.extend({}, data.amsDatatableRowgroupingOptions, settings.rowgrouping); |
3170 rg_settings = ams.executeFunctionByName(data.amsDatatableRowgroupingInitCallback, table, rg_settings) || rg_settings; |
3435 rg_settings = ams.executeFunctionByName(data.amsDatatableRowgroupingInitCallback, table, rg_settings) || rg_settings; |
3171 table.data('ams-rowgrouping', data.amsDatatableRowgroupingConstructor === undefined |
3436 table.data('ams-rowgrouping', data.amsDatatableRowgroupingConstructor === undefined ? |
3172 ? table.rowGrouping(rg_settings) |
3437 table.rowGrouping(rg_settings) |
3173 : ams.executeFunctionByName(data.amsDatatableRowgroupingConstructor, table, plugin, rg_settings)); |
3438 : ams.executeFunctionByName(data.amsDatatableRowgroupingConstructor, table, plugin, rg_settings)); |
3174 break; |
3439 break; |
3175 case 'rowreordering': |
3440 case 'rowreordering': |
3176 var rr_settings = $.extend({}, data.amsDatatableRowreorderingOptions, settings.rowreordering); |
3441 var rr_settings = $.extend({}, data.amsDatatableRowreorderingOptions, settings.rowreordering); |
3177 rr_settings = ams.executeFunctionByName(data.amsDatatableRowreorderingInitCallback, table, rr_settings) || rr_settings; |
3442 rr_settings = ams.executeFunctionByName(data.amsDatatableRowreorderingInitCallback, table, rr_settings) || rr_settings; |
3178 table.data('ams-rowreordering', data.amsDatatableRowreorderingConstructor === undefined |
3443 table.data('ams-rowreordering', data.amsDatatableRowreorderingConstructor === undefined ? |
3179 ? table.rowReordering(rr_settings) |
3444 table.rowReordering(rr_settings) |
3180 : ams.executeFunctionByName(data.amsDatatableRowreorderingConstructor, table, plugin, rr_settings)); |
3445 : ams.executeFunctionByName(data.amsDatatableRowreorderingConstructor, table, plugin, rr_settings)); |
3181 break; |
3446 break; |
3182 default: |
3447 default: |
3183 break; |
3448 break; |
3184 } |
3449 } |
3185 } |
3450 } |
3186 } |
3451 } |
3187 var finalizers = (data.amsDatatableFinalizeCallback || '').split(/\s+/); |
3452 var finalizers = (data.amsDatatableFinalizeCallback || '').split(/\s+/); |
3188 if (finalizers.length > 0) { |
3453 if (finalizers.length > 0) { |
3189 for (index in finalizers) { |
3454 for (index=0; index < finalizers.length; index++) { |
3190 ams.executeFunctionByName(finalizers[index], table, plugin, settings); |
3455 ams.executeFunctionByName(finalizers[index], table, plugin, settings); |
3191 } |
3456 } |
3192 } |
3457 } |
3193 } |
3458 } |
3194 catch (e) {} |
3459 catch (e) {} |
3206 ams.ajax.check($.fn.tableDnD, |
3471 ams.ajax.check($.fn.tableDnD, |
3207 ams.baseURL + 'ext/jquery-tablednd' + ams.devext + '.js', |
3472 ams.baseURL + 'ext/jquery-tablednd' + ams.devext + '.js', |
3208 function(first_load) { |
3473 function(first_load) { |
3209 tables.each(function() { |
3474 tables.each(function() { |
3210 var table = $(this); |
3475 var table = $(this); |
3211 $(table).on('mouseover', 'tr', function() { |
|
3212 $(this.cells[0]).addClass('drag-handle'); |
|
3213 }).on('mouseout', 'tr', function() { |
|
3214 $(this.cells[0]).removeClass('drag-handle'); |
|
3215 }); |
|
3216 var data = table.data(); |
3476 var data = table.data(); |
|
3477 if (data.amsTabledndDragHandle) { |
|
3478 $('tr', table).addClass('no-drag-handle'); |
|
3479 } else { |
|
3480 $(table).on('mouseover', 'tr', function () { |
|
3481 $(this.cells[0]).addClass('drag-handle'); |
|
3482 }).on('mouseout', 'tr', function () { |
|
3483 $(this.cells[0]).removeClass('drag-handle'); |
|
3484 }); |
|
3485 } |
3217 var data_options = { |
3486 var data_options = { |
3218 onDragClass: data.amsTabledndDragClass || 'dragging-row', |
3487 onDragClass: data.amsTabledndDragClass || 'dragging-row', |
3219 onDragStart: data.amsTabledndDragStart, |
3488 onDragStart: ams.getFunctionByName(data.amsTabledndDragStart), |
3220 dragHandle: data.amsTabledndDragHandle, |
3489 dragHandle: data.amsTabledndDragHandle, |
3221 scrollAmount: data.amsTabledndScrollAmount, |
3490 scrollAmount: data.amsTabledndScrollAmount, |
3222 onAllowDrop: data.amsTabledndAllowDrop, |
3491 onAllowDrop: data.amsTabledndAllowDrop, |
3223 onDrop: data.amsTabledndDrop || function(dnd_table, row) { |
3492 onDrop: ams.getFunctionByName(data.amsTabledndDrop) || function(dnd_table, row) { |
3224 var target = data.amsTabledndDropTarget; |
3493 var target = data.amsTabledndDropTarget; |
3225 if (target) { |
3494 if (target) { |
|
3495 // Disable row click handler |
|
3496 $(row).data('ams-disabled-handlers', 'click'); |
3226 var rows = []; |
3497 var rows = []; |
3227 $(dnd_table.rows).each(function() { |
3498 $(dnd_table.rows).each(function() { |
3228 var row_id = $(this).data('ams-element-name'); |
3499 var row_id = $(this).data('ams-element-name'); |
3229 if (row_id) |
3500 if (row_id) { |
3230 rows.push(row_id); |
3501 rows.push(row_id); |
|
3502 } |
3231 }); |
3503 }); |
3232 var local_target = ams.getFunctionByName(target); |
3504 var local_target = ams.getFunctionByName(target); |
3233 if (typeof(local_target) == 'function') { |
3505 if (typeof(local_target) === 'function') { |
3234 local_target.call(table, dnd_table, rows); |
3506 local_target.call(table, dnd_table, rows); |
3235 } else { |
3507 } else { |
3236 ams.ajax.post(target, {names: JSON.stringify(rows)}); |
3508 ams.ajax.post(target, {names: JSON.stringify(rows)}); |
3237 } |
3509 } |
|
3510 // Restore row click handler |
|
3511 setTimeout(function() { |
|
3512 $(row).removeData('ams-disabled-handlers'); |
|
3513 }, 50); |
3238 } |
3514 } |
3239 return false; |
3515 return false; |
3240 } |
3516 } |
3241 }; |
3517 }; |
3242 var settings = $.extend({}, data_options, data.amsTabledndOptions); |
3518 var settings = $.extend({}, data_options, data.amsTabledndOptions); |
3765 |
4049 |
3766 /** |
4050 /** |
3767 * Check notification badge |
4051 * Check notification badge |
3768 */ |
4052 */ |
3769 checkNotification: function() { |
4053 checkNotification: function() { |
3770 $this = $('#activity > .badge'); |
4054 var badge = $('#activity > .badge'); |
3771 if (parseInt($this.text()) > 0) |
4055 if (parseInt(badge.text()) > 0) { |
3772 $this.removeClass("hidden") |
4056 badge.removeClass("hidden") |
3773 .addClass("bg-color-red bounceIn animated"); |
4057 .addClass("bg-color-red bounceIn animated"); |
3774 else |
4058 } else { |
3775 $this.addClass("hidden") |
4059 badge.addClass("hidden") |
3776 .removeClass("bg-color-red bounceIn animated"); |
4060 .removeClass("bg-color-red bounceIn animated"); |
|
4061 } |
3777 }, |
4062 }, |
3778 |
4063 |
3779 /** |
4064 /** |
3780 * Initialize desktop and mobile widgets |
4065 * Initialize desktop and mobile widgets |
3781 */ |
4066 */ |
3782 _initDesktopWidgets: function(element) { |
4067 _initDesktopWidgets: function(element) { |
3783 if (ams.enable_widgets) { |
4068 if (ams.enable_widgets) { |
3784 var widgets = $('.ams-widget', element); |
4069 var widgets = $('.ams-widget', element); |
3785 if (widgets.length > 0) |
4070 if (widgets.length > 0) { |
3786 ams.ajax.check($.fn.MyAMSWidget, |
4071 ams.ajax.check($.fn.MyAMSWidget, |
3787 ams.baseURL + 'myams-widgets' + ams.devext + '.js', |
4072 ams.baseURL + 'myams-widgets' + ams.devext + '.js', |
3788 function() { |
4073 function () { |
3789 widgets.each(function() { |
4074 widgets.each(function () { |
3790 var widget = $(this); |
4075 var widget = $(this); |
3791 var data = widget.data(); |
4076 var data = widget.data(); |
3792 var data_options = { |
4077 var data_options = { |
3793 deleteSettingsKey: '#deletesettingskey-options', |
4078 deleteSettingsKey: '#deletesettingskey-options', |
3794 deletePositionKey: '#deletepositionkey-options' |
4079 deletePositionKey: '#deletepositionkey-options' |
3795 }; |
4080 }; |
3796 var settings = $.extend({}, data_options, data.amsWidgetOptions); |
4081 var settings = $.extend({}, data_options, data.amsWidgetOptions); |
3797 settings = ams.executeFunctionByName(data.amsWidgetInitcallback, widget, settings) || settings; |
4082 settings = ams.executeFunctionByName(data.amsWidgetInitcallback, widget, settings) || settings; |
3798 widget.MyAMSWidget(settings); |
4083 widget.MyAMSWidget(settings); |
3799 }); |
4084 }); |
3800 MyAMSWidget.initWidgetsGrid($('.ams-widget-grid', element)); |
4085 globals.MyAMSWidget.initWidgetsGrid($('.ams-widget-grid', element)); |
3801 }); |
4086 }); |
|
4087 } |
3802 } |
4088 } |
3803 }, |
4089 }, |
3804 |
4090 |
3805 _initMobileWidgets: function(element) { |
4091 _initMobileWidgets: function(element) { |
3806 if (ams.enable_mobile && ams.enable_widgets) |
4092 if (ams.enable_mobile && ams.enable_widgets) { |
3807 ams.skin._initDesktopWidgets(element); |
4093 ams.skin._initDesktopWidgets(element); |
|
4094 } |
3808 }, |
4095 }, |
3809 |
4096 |
3810 /** |
4097 /** |
3811 * Add an alert on top of a container |
4098 * Add an alert on top of a container |
3812 * |
4099 * |
3816 * @message: main alert message |
4103 * @message: main alert message |
3817 * @subtitle: optional subtitle |
4104 * @subtitle: optional subtitle |
3818 * @margin: if true, a margin will be displayed around alert |
4105 * @margin: if true, a margin will be displayed around alert |
3819 */ |
4106 */ |
3820 alert: function(parent, status, header, message, subtitle, margin) { |
4107 alert: function(parent, status, header, message, subtitle, margin) { |
3821 $('.alert', parent).remove(); |
4108 if (status === 'error') { |
3822 if (status == 'error') |
|
3823 status = 'danger'; |
4109 status = 'danger'; |
3824 var content = '<div class="' + (margin ? 'margin-10' : '') + ' alert alert-block alert-' + status + ' fade in">' + |
4110 } |
3825 '<a class="close" data-dismiss="alert"><i class="fa fa-check"></i></a>' + |
4111 $('.alert-' + status, parent).remove(); |
3826 '<h4 class="alert-heading">' + |
4112 var content = '<div class="' + (margin ? 'margin-10' : '') + ' alert alert-block alert-' + status + ' padding-5 fade in">' + |
3827 '<i class="fa fa-fw fa-warning"></i> ' + header + |
4113 '<a class="close" data-dismiss="alert"><i class="fa fa-check"></i></a>' + |
3828 '</h4>' + |
4114 '<h4 class="alert-heading">' + |
3829 (subtitle ? ('<p>' + subtitle + '</p>') : ''); |
4115 '<i class="fa fa-fw fa-warning"></i> ' + header + |
3830 if (typeof(message) == 'string') |
4116 '</h4>' + |
|
4117 (subtitle ? ('<p>' + subtitle + '</p>') : ''); |
|
4118 if (typeof(message) === 'string') { |
3831 content += '<ul><li>' + message + '</li></ul>'; |
4119 content += '<ul><li>' + message + '</li></ul>'; |
3832 else if (message) { |
4120 } else if (message) { |
3833 content += '<ul>'; |
4121 content += '<ul>'; |
3834 for (var index in message) { |
4122 for (var index in message) { |
3835 if (!$.isNumeric(index)) // IE check |
4123 if (!$.isNumeric(index)) { // IE check |
3836 continue; |
4124 continue; |
|
4125 } |
3837 content += '<li>' + message[index] + '</li>'; |
4126 content += '<li>' + message[index] + '</li>'; |
3838 }; |
4127 } |
3839 content += '</ul>'; |
4128 content += '</ul>'; |
3840 } |
4129 } |
3841 content += '</div>'; |
4130 content += '</div>'; |
3842 var alert = $(content).prependTo(parent); |
4131 var alert = $(content).prependTo(parent); |
3843 if (parent.exists) { |
4132 if (parent.exists) { |
3844 ams.ajax.check($.scrollTo, |
4133 ams.ajax.check($.scrollTo, |
3845 ams.baseURL + 'ext/jquery-scrollTo.min.js', |
4134 ams.baseURL + 'ext/jquery-scrollTo.min.js', |
3846 function() { |
4135 function() { |
3847 $.scrollTo(parent, {offset: {top: -50}}); |
4136 $.scrollTo(parent, {offset: {top: -50}}); |
3848 }); |
4137 }); |
3849 } |
4138 } |
3850 }, |
4139 }, |
3851 |
4140 |
3852 /** |
4141 /** |
3862 |
4151 |
3863 /** |
4152 /** |
3864 * Medium notification message box, displayed on page's bottom right |
4153 * Medium notification message box, displayed on page's bottom right |
3865 */ |
4154 */ |
3866 messageBox: function(status, options, callback) { |
4155 messageBox: function(status, options, callback) { |
3867 if (typeof(status) == 'object') { |
4156 if (typeof(status) === 'object') { |
3868 callback = options; |
4157 callback = options; |
3869 options = status || {}; |
4158 options = status || {}; |
3870 status = 'info'; |
4159 status = 'info'; |
3871 } |
4160 } |
3872 ams.ajax.check(ams.notify, |
4161 ams.ajax.check(ams.notify, |
3873 ams.baseURL + 'myams-notify' + ams.devext + '.js', |
4162 ams.baseURL + 'myams-notify' + ams.devext + '.js', |
3874 function() { |
4163 function() { |
3875 switch (status) { |
4164 switch (status) { |
3876 case 'error': |
4165 case 'error': |
3877 case 'danger': |
4166 case 'danger': |
3878 options.color = '#C46A69'; |
4167 options.color = '#C46A69'; |
3879 break; |
4168 break; |
3880 case 'warning': |
4169 case 'warning': |
3881 options.color = '#C79121'; |
4170 options.color = '#C79121'; |
3882 break; |
4171 break; |
3883 case 'success': |
4172 case 'success': |
3884 options.color = '#739E73'; |
4173 options.color = '#739E73'; |
3885 break; |
4174 break; |
3886 default: |
4175 default: |
3887 options.color = options.color || '#3276B1'; |
4176 options.color = options.color || '#3276B1'; |
3888 } |
4177 } |
3889 options.sound = false; |
4178 options.sound = false; |
3890 ams.notify.bigBox(options, callback); |
4179 ams.notify.bigBox(options, callback); |
3891 }); |
4180 }); |
3892 }, |
4181 }, |
3893 |
4182 |
3894 /** |
4183 /** |
3895 * Small notification message box, displayed on page's top right |
4184 * Small notification message box, displayed on page's top right |
3896 */ |
4185 */ |
3897 smallBox: function(status, options, callback) { |
4186 smallBox: function(status, options, callback) { |
3898 if (typeof(status) == 'object') { |
4187 if (typeof(status) === 'object') { |
3899 callback = options; |
4188 callback = options; |
3900 options = status || {}; |
4189 options = status || {}; |
3901 status = 'info'; |
4190 status = 'info'; |
3902 } |
4191 } |
3903 ams.ajax.check(ams.notify, |
4192 ams.ajax.check(ams.notify, |
3904 ams.baseURL + 'myams-notify' + ams.devext + '.js', |
4193 ams.baseURL + 'myams-notify' + ams.devext + '.js', |
3905 function() { |
4194 function () { |
3906 switch (status) { |
4195 switch (status) { |
3907 case 'error': |
4196 case 'error': |
3908 case 'danger': |
4197 case 'danger': |
3909 options.color = '#C46A69'; |
4198 options.color = '#C46A69'; |
3910 break; |
4199 break; |
3911 case 'warning': |
4200 case 'warning': |
3912 options.color = '#C79121'; |
4201 options.color = '#C79121'; |
3913 break; |
4202 break; |
3914 case 'success': |
4203 case 'success': |
3915 options.color = '#739E73'; |
4204 options.color = '#739E73'; |
3916 break; |
4205 break; |
3917 default: |
4206 default: |
3918 options.color = options.color || '#3276B1'; |
4207 options.color = options.color || '#3276B1'; |
3919 } |
4208 } |
3920 options.sound = false; |
4209 options.sound = false; |
3921 ams.notify.smallBox(options, callback); |
4210 ams.notify.smallBox(options, callback); |
3922 }); |
4211 }); |
3923 }, |
4212 }, |
3924 |
4213 |
3925 /** |
4214 /** |
3926 * Initialize breadcrumbs based on active menu position |
4215 * Initialize breadcrumbs based on active menu position |
3927 */ |
4216 */ |
3928 _drawBreadCrumb: function() { |
4217 _drawBreadCrumb: function() { |
3929 var crumb = $('#ribbon OL.breadcrumb'); |
4218 var crumb = $('#ribbon OL.breadcrumb'); |
3930 crumb.empty() |
4219 $('li', crumb).not('.parent').remove(); |
3931 .append($('<li></li>').append($('<a></a>').text(ams.i18n.HOME) |
4220 if (!$('li', crumb).exists()) { |
3932 .attr('href', $('nav a[href!="#"]:first').attr('href')))); |
4221 crumb.append($('<li></li>').append($('<a></a>').text(ams.i18n.HOME) |
|
4222 .addClass('padding-right-5') |
|
4223 .attr('href', $('nav a[href!="#"]:first').attr('href')))); |
|
4224 } |
3933 $('nav LI.active >A').each(function() { |
4225 $('nav LI.active >A').each(function() { |
3934 var menu = $(this); |
4226 var menu = $(this); |
3935 var body = $.trim(menu.clone() |
4227 var body = $.trim(menu.clone() |
3936 .children(".badge") |
4228 .children(".badge") |
3937 .remove() |
4229 .remove() |
3938 .end() |
4230 .end() |
3939 .text()); |
4231 .text()); |
3940 var item = $("<li></li>").append(menu.attr('href').replace(/^#/, '') |
4232 var item = $("<li></li>").append(menu.attr('href').replace(/^#/, '') ? |
3941 ? $("<a></a>").html(body) |
4233 $("<a></a>").html(body).attr('href', menu.attr('href')) |
3942 .attr('href', menu.attr('href')) |
4234 : body); |
3943 : body); |
|
3944 crumb.append(item); |
4235 crumb.append(item); |
3945 }); |
4236 }); |
3946 }, |
4237 }, |
3947 |
4238 |
3948 /** |
4239 /** |
3949 * Check URL matching current location hash |
4240 * Check URL matching current location hash |
3950 */ |
4241 */ |
3951 checkURL: function() { |
4242 checkURL: function() { |
3952 |
4243 |
3953 function updateActiveMenus(menu) { |
4244 function updateActiveMenus(menu) { |
3954 $('nav .active').removeClass('active'); |
4245 $('.active', nav).removeClass('active'); |
3955 menu.addClass('open') |
4246 menu.addClass('open') |
3956 .addClass('active'); |
4247 .addClass('active'); |
3957 menu.parents('li').addClass('open active') |
4248 menu.parents('li').addClass('open active') |
3958 .children('ul').addClass('active') |
4249 .children('ul').addClass('active') |
3959 .show(); |
4250 .show(); |
3960 menu.parents('li:first').removeClass('open'); |
4251 menu.parents('li:first').removeClass('open'); |
3961 menu.parents('ul').addClass(menu.attr('href').replace(/^#/, '') ? 'active' : '') |
4252 menu.parents('ul').addClass(menu.attr('href').replace(/^#/, '') ? 'active' : '') |
3962 .show(); |
4253 .show(); |
3963 } |
4254 } |
3964 |
4255 |
|
4256 var menu; |
|
4257 var nav = $('nav'); |
3965 var hash = location.hash; |
4258 var hash = location.hash; |
3966 var url = hash.replace(/^#/, ''); |
4259 var url = hash.replace(/^#/, ''); |
3967 if (url) { |
4260 if (url) { |
3968 var container = $('#content'); |
4261 var container = $('#content'); |
3969 if (!container.exists()) |
4262 if (!container.exists()) { |
3970 container = $('body'); |
4263 container = $('body'); |
3971 var menu = $('nav A[href="' + hash + '"]'); |
4264 } |
3972 if (menu.exists()) |
4265 menu = $('A[href="' + hash + '"]', nav); |
|
4266 if (menu.exists()) { |
3973 updateActiveMenus(menu); |
4267 updateActiveMenus(menu); |
|
4268 } |
3974 ams.skin.loadURL(url, container); |
4269 ams.skin.loadURL(url, container); |
3975 document.title = $('[data-ams-page-title]:first', container).data('ams-page-title') || |
4270 document.title = $('[data-ams-page-title]:first', container).data('ams-page-title') || |
3976 menu.attr('title') || |
4271 menu.attr('title') || |
3977 document.title; |
4272 document.title; |
3978 } else { |
4273 } else { |
3979 var active_url = $('[data-ams-active-menu]').data('ams-active-menu'); |
4274 var active_url = $('[data-ams-active-menu]').data('ams-active-menu'); |
3980 if (active_url) { |
4275 if (active_url) { |
3981 menu = $('nav A[href="' + active_url + '"]'); |
4276 menu = $('A[href="' + active_url + '"]', nav); |
3982 } else { |
4277 } else { |
3983 menu = $('nav >UL >LI >A[href!="#"]').first(); |
4278 menu = $('>UL >LI >A[href!="#"]', nav).first(); |
3984 } |
4279 } |
3985 if (menu.exists()) { |
4280 if (menu.exists()) { |
3986 updateActiveMenus(menu); |
4281 updateActiveMenus(menu); |
3987 if (active_url) |
4282 if (active_url) { |
3988 ams.skin._drawBreadCrumb(); |
4283 ams.skin._drawBreadCrumb(); |
3989 else |
4284 } else { |
3990 window.location.hash = menu.attr('href'); |
4285 window.location.hash = menu.attr('href'); |
|
4286 } |
3991 } |
4287 } |
3992 } |
4288 } |
3993 }, |
4289 }, |
3994 |
4290 |
3995 /** |
4291 /** |
4120 } |
4421 } |
4121 }; |
4422 }; |
4122 |
4423 |
4123 |
4424 |
4124 /** |
4425 /** |
|
4426 * Statistics management |
|
4427 */ |
|
4428 MyAMS.stats = { |
|
4429 |
|
4430 /** |
|
4431 * Send event to Google Analytics platform |
|
4432 * |
|
4433 * @param category |
|
4434 * @param action |
|
4435 * @param label |
|
4436 */ |
|
4437 logEvent: function(category, action, label) { |
|
4438 if (typeof(globals._gaq) === 'undefined') { |
|
4439 return; |
|
4440 } |
|
4441 if (typeof(category) === 'object') { |
|
4442 action = category.action; |
|
4443 label = category.label; |
|
4444 category = category.category; |
|
4445 } |
|
4446 globals._gaq.push(['_trackEvent', category, action, label]); |
|
4447 } |
|
4448 }; |
|
4449 |
|
4450 |
|
4451 /** |
4125 * Main page initialization |
4452 * Main page initialization |
4126 * This code is called only once to register global events and callbacks |
4453 * This code is called only once to register global events and callbacks |
4127 */ |
4454 */ |
4128 MyAMS.initPage = function() { |
4455 MyAMS.initPage = function() { |
4129 |
4456 |
4130 var body = $('body'); |
4457 var body = $('body'); |
4131 |
4458 |
4132 /* Init main components */ |
4459 /* Init main components */ |
4133 ams.root = body; |
4460 ams.root = body; |
4134 ams.left_panel = $('#left-panel'); |
4461 ams.left_panel = $('#left-panel'); |
4135 ams.shortcuts = $('#shortcut'); |
4462 ams.shortcuts = $('#shortcuts'); |
4136 ams.plugins.initData(body); |
4463 ams.plugins.initData(body); |
4137 |
4464 |
4138 // Init main AJAX events |
4465 // Init main AJAX events |
4139 var jquery_xhr = $.ajaxSettings.xhr; |
4466 var jquery_xhr = $.ajaxSettings.xhr; |
4140 $.ajaxSetup({ |
4467 $.ajaxSetup({ |
4141 progress: ams.ajax.progress, |
4468 progress: ams.ajax.progress, |
4142 progressUpload: ams.ajax.progress, |
4469 progressUpload: ams.ajax.progress, |
4143 xhr: function() { |
4470 xhr: function() { |
4144 var request = jquery_xhr(); |
4471 var request = jquery_xhr(); |
4145 if (request && (typeof(request.addEventListener) == "function")) { |
4472 if (request && (typeof(request.addEventListener) === "function")) { |
4146 var that = this; |
4473 var that = this; |
4147 request.addEventListener("progress", function(evt) { |
4474 request.addEventListener("progress", function(evt) { |
4148 that.progress(evt); |
4475 that.progress(evt); |
4149 }, false); |
4476 }, false); |
4150 } |
4477 } |
4390 }); |
4733 }); |
4391 |
4734 |
4392 // Initialize custom click handlers |
4735 // Initialize custom click handlers |
4393 $(document).on('click', '[data-ams-click-handler]', function(e) { |
4736 $(document).on('click', '[data-ams-click-handler]', function(e) { |
4394 var source = $(this); |
4737 var source = $(this); |
|
4738 var handlers = source.data('ams-disabled-handlers'); |
|
4739 if ((handlers == true) || (handlers == 'click')) { |
|
4740 return; |
|
4741 } |
4395 var data = source.data(); |
4742 var data = source.data(); |
4396 if (data.amsClickHandler) { |
4743 if (data.amsClickHandler) { |
4397 if ((data.amsStopPropagation === true) || (data.amsClickStopPropagation === true)) |
4744 if ((data.amsStopPropagation === true) || (data.amsClickStopPropagation === true)) { |
4398 e.stopPropagation(); |
4745 e.stopPropagation(); |
4399 if (data.amsClickKeepDefault !== true) |
4746 } |
|
4747 if (data.amsClickKeepDefault !== true) { |
4400 e.preventDefault(); |
4748 e.preventDefault(); |
|
4749 } |
4401 var callback = ams.getFunctionByName(data.amsClickHandler); |
4750 var callback = ams.getFunctionByName(data.amsClickHandler); |
4402 if (callback !== undefined) |
4751 if (callback !== undefined) { |
4403 callback.call(source, data.amsClickHandlerOptions); |
4752 callback.call(source, data.amsClickHandlerOptions); |
|
4753 } |
4404 } |
4754 } |
4405 }); |
4755 }); |
4406 |
4756 |
4407 // Initialize custom change handlers |
4757 // Initialize custom change handlers |
4408 $(document).on('change', '[data-ams-change-handler]', function(e) { |
4758 $(document).on('change', '[data-ams-change-handler]', function(e) { |
4409 var source = $(this); |
4759 var source = $(this); |
|
4760 var handlers = source.data('ams-disabled-handlers'); |
|
4761 if ((handlers == true) || (handlers == 'change')) { |
|
4762 return; |
|
4763 } |
4410 var data = source.data(); |
4764 var data = source.data(); |
4411 if (data.amsChangeHandler) { |
4765 if (data.amsChangeHandler) { |
4412 if (data.amsChangeKeepDefault !== true) |
4766 if (data.amsChangeKeepDefault !== true) { |
4413 e.preventDefault(); |
4767 e.preventDefault(); |
|
4768 } |
4414 var callback = ams.getFunctionByName(data.amsChangeHandler); |
4769 var callback = ams.getFunctionByName(data.amsChangeHandler); |
4415 if (callback !== undefined) |
4770 if (callback !== undefined) { |
4416 callback.call(source, data.amsChangeHandlerOptions); |
4771 callback.call(source, data.amsChangeHandlerOptions); |
|
4772 } |
4417 } |
4773 } |
4418 }); |
4774 }); |
4419 |
4775 |
4420 // Notify reset to update Select2 widgets |
4776 // Notify reset to update Select2 widgets |
4421 $(document).on('reset', 'form', function(e) { |
4777 $(document).on('reset', 'form', function(e) { |
4422 var form = $(this); |
4778 var form = $(this); |
4423 setTimeout(function() { |
4779 setTimeout(function() { |
4424 form.find('.select2').trigger('change'); |
4780 form.find('.select2').trigger('change'); |
4425 }, 10); |
4781 }, 10); |
|
4782 ams.form.setFocus(form); |
4426 }); |
4783 }); |
4427 |
4784 |
4428 // Initialize custom reset handlers |
4785 // Initialize custom reset handlers |
4429 $(document).on('reset', '[data-ams-reset-handler]', function(e) { |
4786 $(document).on('reset', '[data-ams-reset-handler]', function(e) { |
4430 var form = $(this); |
4787 var form = $(this); |
4431 var data = form.data(); |
4788 var data = form.data(); |
4432 if (data.amsResetHandler) { |
4789 if (data.amsResetHandler) { |
4433 if (data.amsResetKeepDefault !== true) |
4790 if (data.amsResetKeepDefault !== true) { |
4434 e.preventDefault(); |
4791 e.preventDefault(); |
|
4792 } |
4435 var callback = ams.getFunctionByName(data.amsResetHandler); |
4793 var callback = ams.getFunctionByName(data.amsResetHandler); |
4436 if (callback !== undefined) |
4794 if (callback !== undefined) { |
4437 callback.call(form, data.amsResetHandlerOptions); |
4795 callback.call(form, data.amsResetHandlerOptions); |
|
4796 } |
4438 } |
4797 } |
4439 }); |
4798 }); |
4440 |
4799 |
4441 // Handle update on file upload placeholder |
4800 // Handle update on file upload placeholder |
4442 $(document).on('change', 'input[type="file"]', function(e) { |
4801 $(document).on('change', 'input[type="file"]', function(e) { |