diff --git a/modules/system/assets/css/framework.extras.css b/modules/system/assets/css/framework.extras.css index 05a005098..5055da464 100644 --- a/modules/system/assets/css/framework.extras.css +++ b/modules/system/assets/css/framework.extras.css @@ -23,8 +23,8 @@ body.oc-loading * { } .stripe-loading-indicator .stripe { width: 100%; - -webkit-animation: infinite-loader 60s linear; - animation: infinite-loader 60s linear; + -webkit-animation: oc-infinite-loader 60s linear; + animation: oc-infinite-loader 60s linear; } .stripe-loading-indicator .stripe-loaded { width: 0; @@ -49,9 +49,150 @@ body.oc-loading * { .stripe-loading-indicator.hide { display: none; } -@-moz-keyframes infinite-loader { +body > p.flash-message { + position: fixed; + width: 500px; + left: 50%; + top: 13px; + margin-left: -250px; + color: #ffffff; + font-size: 14px; + padding: 10px 30px 10px 15px; + z-index: 10300; + word-wrap: break-word; + text-shadow: 0 -1px 0px rgba(0, 0, 0, 0.15); + text-align: center; + -webkit-box-shadow: 0 1px 6px rgba(0, 0, 0, 0.12), 0 1px 4px rgba(0, 0, 0, 0.24); + box-shadow: 0 1px 6px rgba(0, 0, 0, 0.12), 0 1px 4px rgba(0, 0, 0, 0.24); + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +body > p.flash-message.fade { + opacity: 0; + filter: alpha(opacity=0); + -webkit-transition: all 0.5s, width 0s; + transition: all 0.5s, width 0s; + -webkit-transform: scale(0.9); + -ms-transform: scale(0.9); + transform: scale(0.9); +} +body > p.flash-message.fade.in { + opacity: 1; + filter: alpha(opacity=100); + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); +} +body > p.flash-message.success { + background: #8da85e; +} +body > p.flash-message.error { + background: #cc3300; +} +body > p.flash-message.warning { + background: #f0ad4e; +} +body > p.flash-message.info { + background: #5fb6f5; +} +body > p.flash-message button.close { + float: none; + position: absolute; + right: 10px; + top: 8px; + color: white; + font-size: 21px; + line-height: 1; + font-weight: bold; + opacity: 0.2; + filter: alpha(opacity=20); + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; + outline: none; +} +body > p.flash-message button.close:hover, +body > p.flash-message button.close:focus { + color: white; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} +@media (max-width: 768px) { + body > p.flash-message { + left: 10px; + right: 10px; + top: 10px; + margin-left: 0; + width: auto; + } +} +[data-request][data-request-validate] [data-validate-for]:not(.visible), +[data-request][data-request-validate] [data-validate-error]:not(.visible) { + display: none; +} +a.oc-loading:after, +button.oc-loading:after { + content: ''; + display: inline-block; + vertical-align: middle; + margin-left: .4em; + height: 1em; + width: 1em; + animation: oc-rotate-loader 0.8s infinite linear; + border: .2em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + opacity: 0.5; + filter: alpha(opacity=50); +} +@-moz-keyframes oc-rotate-loader { 0% { - width: 0%; + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(360deg); + } +} +@-webkit-keyframes oc-rotate-loader { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + } +} +@-o-keyframes oc-rotate-loader { + 0% { + -o-transform: rotate(0deg); + } + 100% { + -o-transform: rotate(360deg); + } +} +@-ms-keyframes oc-rotate-loader { + 0% { + -ms-transform: rotate(0deg); + } + 100% { + -ms-transform: rotate(360deg); + } +} +@keyframes oc-rotate-loader { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} +@-moz-keyframes oc-infinite-loader { + 0% { + width: 0; } 10% { width: 42%; @@ -84,9 +225,9 @@ body.oc-loading * { width: 99.9423761471391%; } } -@-webkit-keyframes infinite-loader { +@-webkit-keyframes oc-infinite-loader { 0% { - width: 0%; + width: 0; } 10% { width: 42%; @@ -119,9 +260,9 @@ body.oc-loading * { width: 99.9423761471391%; } } -@-o-keyframes infinite-loader { +@-o-keyframes oc-infinite-loader { 0% { - width: 0%; + width: 0; } 10% { width: 42%; @@ -154,9 +295,9 @@ body.oc-loading * { width: 99.9423761471391%; } } -@-ms-keyframes infinite-loader { +@-ms-keyframes oc-infinite-loader { 0% { - width: 0%; + width: 0; } 10% { width: 42%; @@ -189,9 +330,9 @@ body.oc-loading * { width: 99.9423761471391%; } } -@keyframes infinite-loader { +@keyframes oc-infinite-loader { 0% { - width: 0%; + width: 0; } 10% { width: 42%; diff --git a/modules/system/assets/js/framework.extras.js b/modules/system/assets/js/framework.extras.js index c7d9d5bb6..810fd3877 100644 --- a/modules/system/assets/js/framework.extras.js +++ b/modules/system/assets/js/framework.extras.js @@ -5,23 +5,123 @@ * Copyright 2016 Alexey Bobkov, Samuel Georges * ======================================================================== */ -/* - * The stripe loading indicator. - * - * Displays the animated loading indicator stripe at the top of the page. - * - * JavaScript API: - * $.oc.stripeLoadIndicator.show(event) - * $.oc.stripeLoadIndicator.hide() - * - * By default if the show() method has been called several times, the hide() method should be - * called the same number of times in order to hide the stripe. Use hide(true) to hide the - * indicator forcibly. - */ +function ($) { "use strict"; if ($.oc === undefined) $.oc = {} + // @todo Provide an interface for configuration + // - Custom loader CSS class + // - Custom stripe loader color + + var LOADER_CLASS = 'oc-loading'; + + // FLASH HANDLING + // ============================ + + $(document).on('ajaxError', '[data-request][data-request-flash]', function(event, context, message) { + if (!event.isDefaultPrevented() && message) { + $.oc.flashMsg({ text: message, class: 'error' }) + event.preventDefault() + } + }) + + $(document).on('ajaxBeforeUpdate', '[data-request][data-request-flash]', function(event, context, data) { + if (data['X_OCTOBER_FLASH_MESSAGES']) { + $.each(data['X_OCTOBER_FLASH_MESSAGES'], function(type, message) { + $.oc.flashMsg({ text: message, class: type }) + }) + } + }) + + // FORM VALIDATION + // ============================ + + $(document).on('ajaxValidation', '[data-request][data-request-validate]', function(event, context, errorMsg, fields) { + var $this = $(this).closest('form'), + $container = $('[data-validate-error]', $this), + messages = [], + $field + + $.each(fields, function(fieldName, fieldMessages) { + $field = $('[data-validate-for='+fieldName+']', $this) + messages = $.merge(messages, fieldMessages) + if (!!$field.length) { + if (!$field.text().length || $field.data('emptyMode') == true) { + $field + .data('emptyMode', true) + .text(fieldMessages.join(', ')) + } + $field.addClass('visible') + } + }) + + if (!!$container.length) { + var $oldMessages = $('[data-message]', $container) + $container.addClass('visible') + + if (!!$oldMessages.length) { + var $clone = $oldMessages.first() + + $.each(messages, function(key, message) { + $clone.clone().text(message).insertAfter($clone) + }) + + $oldMessages.remove() + } + else { + $container.text(errorMsg) + } + } + + $this.one('ajaxError', function(event){ + event.preventDefault() + }) + }) + + $(document).on('ajaxPromise', '[data-request][data-request-validate]', function() { + var $this = $(this).closest('form') + $('[data-validate-for]', $this).removeClass('visible') + $('[data-validate-error]', $this).removeClass('visible') + }) + + // LOADING BUTTONS + // ============================ + + $(document) + .on('ajaxPromise', '[data-request]', function() { + var $target = $(this) + + if ($target.data('attach-loading') !== undefined) { + $target + .addClass(LOADER_CLASS) + .prop('disabled', true) + } + + if ($target.is('form')) { + $('[data-attach-loading]', $target) + .addClass(LOADER_CLASS) + .prop('disabled', true) + } + }) + .on('ajaxFail ajaxDone', '[data-request]', function() { + var $target = $(this) + + if ($target.data('attach-loading') !== undefined) { + $target + .removeClass(LOADER_CLASS) + .prop('disabled', false) + } + + if ($target.is('form')) { + $('[data-attach-loading]', $target) + .removeClass(LOADER_CLASS) + .prop('disabled', false) + } + }) + + // STRIPE LOAD INDICATOR + // ============================ + var StripeLoadIndicator = function() { var self = this this.counter = 0 @@ -41,8 +141,9 @@ // Restart the animation this.stripe.after(this.stripe = this.stripe.clone()).remove() - if (this.counter > 1) + if (this.counter > 1) { return + } this.indicator.removeClass('loaded') $(document.body).addClass('oc-loading') @@ -50,8 +151,10 @@ StripeLoadIndicator.prototype.hide = function(force) { this.counter-- - if (force !== undefined && force) + + if (force !== undefined && force) { this.counter = 0 + } if (this.counter <= 0) { this.indicator.addClass('loaded') @@ -62,7 +165,7 @@ $.oc.stripeLoadIndicator = new StripeLoadIndicator() // STRIPE LOAD INDICATOR DATA-API - // ============== + // ============================ $(document) .on('ajaxPromise', '[data-request]', function(event) { @@ -79,9 +182,75 @@ if ($el.closest('html').length === 0) $.oc.stripeLoadIndicator.hide() }) - }).on('ajaxFail ajaxDone', '[data-request]', function(event) { + }) + .on('ajaxFail ajaxDone', '[data-request]', function(event) { event.stopPropagation() $.oc.stripeLoadIndicator.hide() }) + // FLASH MESSAGE + // ============================ + + var FlashMessage = function (options, el) { + var + options = $.extend({}, FlashMessage.DEFAULTS, options), + $element = $(el) + + $('body > p.flash-message').remove() + + if ($element.length == 0) { + $element = $('
').addClass(options.class).html(options.text) + } + + $element + .addClass('flash-message fade') + .attr('data-control', null) + .on('click', 'button', remove) + .on('click', remove) + .append('') + + $(document.body).append($element) + + setTimeout(function() { + $element.addClass('in') + }, 100) + + var timer = window.setTimeout(remove, options.interval * 1000) + + function removeElement() { + $element.remove() + } + + function remove() { + window.clearInterval(timer) + + $element.removeClass('in') + $.support.transition && $element.hasClass('fade') + ? $element + .one($.support.transition.end, removeElement) + .emulateTransitionEnd(500) + : removeElement() + } + } + + FlashMessage.DEFAULTS = { + class: 'success', + text: 'Default text', + interval: 2 + } + + if ($.oc === undefined) + $.oc = {} + + $.oc.flashMsg = FlashMessage + + // FLASH MESSAGE DATA-API + // =============== + + $(document).render(function(){ + $('[data-control=flash-message]').each(function(){ + $.oc.flashMsg($(this).data(), this) + }) + }) + }(window.jQuery); diff --git a/modules/system/assets/less/framework.extras.less b/modules/system/assets/less/framework.extras.less index 3247695e4..67b163d48 100644 --- a/modules/system/assets/less/framework.extras.less +++ b/modules/system/assets/less/framework.extras.less @@ -10,6 +10,7 @@ body.oc-loading, body.oc-loading * { @stripe-loader-color: #0090c0; @stripe-loader-height: 5px; + .stripe-loading-indicator { height: @stripe-loader-height; @@ -31,7 +32,7 @@ body.oc-loading, body.oc-loading * { .stripe { width: 100%; - .animation(infinite-loader 60s linear); + .animation(oc-infinite-loader 60s linear); } .stripe-loaded { @@ -55,6 +56,138 @@ body.oc-loading, body.oc-loading * { } } +// +// Flash Messages +// -------------------------------------------------- + +@color-flash-success-bg: #8da85e; +@color-flash-error-bg: #cc3300; +@color-flash-warning-bg: #f0ad4e; +@color-flash-info-bg: #5fb6f5; +@color-flash-text: #ffffff; + +body > p.flash-message { + position: fixed; + width: 500px; + left: 50%; + top: 13px; + margin-left: -250px; + color: @color-flash-text; + font-size: 14px; + padding: 10px 30px 10px 15px; + z-index: @zindex-flashmessage; + word-wrap: break-word; + text-shadow: 0 -1px 0px rgba(0,0,0,.15); + text-align: center; + .box-shadow(@overlay-box-shadow); + .border-radius(@border-radius-base); + + &.fade { + .opacity(0); + .transition(~'all 0.5s, width 0s'); + .transform(~'scale(0.9)'); + } + + &.fade.in { + .opacity(1); + .transform( ~'scale(1)'); + } + + &.success { background: @color-flash-success-bg; } + &.error { background: @color-flash-error-bg; } + &.warning { background: @color-flash-warning-bg; } + &.info { background: @color-flash-info-bg; } + + button.close { + float: none; + position: absolute; + right: 10px; + top: 8px; + color: white; + font-size: 21px; + line-height: 1; + font-weight: bold; + .opacity(.2); + + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; + outline: none; + + &:hover, + &:focus { + color: white; + text-decoration: none; + cursor: pointer; + .opacity(.5); + } + } +} + +@media (max-width: @screen-sm) { + body > p.flash-message { + left: 10px; + right: 10px; + top: 10px; + margin-left: 0; + width: auto; + } +} + +// +// Form Validation +// -------------------------------------------------- + +[data-request][data-request-validate] [data-validate-for], +[data-request][data-request-validate] [data-validate-error] { + &:not(.visible) { + display: none; + } +} + +// +// Element Loader +// -------------------------------------------------- + +a.oc-loading, button.oc-loading { + &:after { + content: ''; + display: inline-block; + vertical-align: middle; + margin-left: .4em; + height: 1em; + width: 1em; + animation: oc-rotate-loader 0.8s infinite linear; + border: .2em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + .opacity(.5); + } +} + +@-moz-keyframes oc-rotate-loader { + 0% { -moz-transform: rotate(0deg); } + 100% { -moz-transform: rotate(360deg); } +} +@-webkit-keyframes oc-rotate-loader { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); } +} +@-o-keyframes oc-rotate-loader { + 0% { -o-transform: rotate(0deg); } + 100% { -o-transform: rotate(360deg); } +} +@-ms-keyframes oc-rotate-loader { + 0% { -ms-transform: rotate(0deg); } + 100% { -ms-transform: rotate(360deg); } +} +@keyframes oc-rotate-loader { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + // // Infinite loading animation // -------------------------------------------------- @@ -62,6 +195,7 @@ body.oc-loading, body.oc-loading * { @startCount: 1; @startVal: 28%; @start: 0; + .infinite-class (@index, @val, @count) when (@index = 0) { @tmpSelector: ~"@{index}%"; @{tmpSelector} { width: 0; } @@ -73,18 +207,18 @@ body.oc-loading, body.oc-loading * { .infinite-class(@index + 10, @val + (@val / @count), @count * 2); } -@-moz-keyframes infinite-loader { +@-moz-keyframes oc-infinite-loader { .infinite-class(@start, @startVal, @startCount); } -@-webkit-keyframes infinite-loader { +@-webkit-keyframes oc-infinite-loader { .infinite-class(@start, @startVal, @startCount); } -@-o-keyframes infinite-loader { +@-o-keyframes oc-infinite-loader { .infinite-class(@start, @startVal, @startCount); } -@-ms-keyframes infinite-loader { +@-ms-keyframes oc-infinite-loader { .infinite-class(@start, @startVal, @startCount); } -@keyframes infinite-loader { +@keyframes oc-infinite-loader { .infinite-class(@start, @startVal, @startCount); } diff --git a/modules/system/assets/ui/js/flashmessage.js b/modules/system/assets/ui/js/flashmessage.js index dabf1b4b5..72eebc0f5 100644 --- a/modules/system/assets/ui/js/flashmessage.js +++ b/modules/system/assets/ui/js/flashmessage.js @@ -16,7 +16,7 @@ $('body > p.flash-message').remove() if ($element.length == 0) { - $element = $('').addClass(options.class).html(options.text) + $element = $('').addClass(options.class).html(options.text) } $element.addClass('flash-message fade') @@ -29,9 +29,9 @@ setTimeout(function() { $element.addClass('in') - }, 1) + }, 100) - var timer = window.setTimeout(remove, options.interval*1000) + var timer = window.setTimeout(remove, options.interval * 1000) function removeElement() { $element.remove() @@ -41,11 +41,11 @@ window.clearInterval(timer) $element.removeClass('in') - $.support.transition && $element.hasClass('fade') ? - $element + $.support.transition && $element.hasClass('fade') + ? $element .one($.support.transition.end, removeElement) - .emulateTransitionEnd(500) : - removeElement() + .emulateTransitionEnd(500) + : removeElement() } } @@ -72,4 +72,4 @@ }) }) -}(window.jQuery); \ No newline at end of file +}(window.jQuery); diff --git a/modules/system/assets/ui/storm-min.js b/modules/system/assets/ui/storm-min.js index b298b746a..526cce448 100644 --- a/modules/system/assets/ui/storm-min.js +++ b/modules/system/assets/ui/storm-min.js @@ -2615,14 +2615,14 @@ $(container).triggerHandler('dispose-control')}} $.oc.foundation.controlUtils=ControlUtils;$(document).on('ajaxBeforeReplace',function(ev){$.oc.foundation.controlUtils.disposeControls(ev.target)})}(window.jQuery);+function($){"use strict";var FlashMessage=function(options,el){var options=$.extend({},FlashMessage.DEFAULTS,options),$element=$(el) $('body > p.flash-message').remove() -if($element.length==0){$element=$('').addClass(options.class).html(options.text)} +if($element.length==0){$element=$('').addClass(options.class).html(options.text)} $element.addClass('flash-message fade') $element.attr('data-control',null) $element.append('') $element.on('click','button',remove) $element.on('click',remove) $(document.body).append($element) -setTimeout(function(){$element.addClass('in')},1) +setTimeout(function(){$element.addClass('in')},100) var timer=window.setTimeout(remove,options.interval*1000) function removeElement(){$element.remove()} function remove(){window.clearInterval(timer) @@ -3862,7 +3862,7 @@ if(typeof option=='string')data[option].apply(data,args)})} $.fn.hotKey.Constructor=HotKey $.fn.hotKey.noConflict=function(){$.fn.hotKey=old return this} -$(document).render(function(){$('[data-hotkey]').hotKey()})}(window.jQuery);+function($){"use strict";var LATIN_MAP={'À':'A','Á':'A','Â':'A','Ã':'A','Ä':'A','Å':'A','Æ':'AE','Ç':'C','È':'E','É':'E','Ê':'E','Ë':'E','Ì':'I','Í':'I','Î':'I','Ï':'I','Ð':'D','Ñ':'N','Ò':'O','Ó':'O','Ô':'O','Õ':'O','Ö':'O','Ő':'O','Ø':'O','Ù':'U','Ú':'U','Û':'U','Ü':'U','Ű':'U','Ý':'Y','Þ':'TH','Ÿ':'Y','ß':'ss','à':'a','á':'a','â':'a','ã':'a','ä':'a','å':'a','æ':'ae','ç':'c','è':'e','é':'e','ê':'e','ë':'e','ì':'i','í':'i','î':'i','ï':'i','ð':'d','ñ':'n','ò':'o','ó':'o','ô':'o','õ':'o','ö':'o','ő':'o','ø':'o','ō':'o','œ':'oe','ù':'u','ú':'u','û':'u','ü':'u','ű':'u','ý':'y','þ':'th','ÿ':'y'},LATIN_SYMBOLS_MAP={'©':'(c)'},GREEK_MAP={'α':'a','β':'b','γ':'g','δ':'d','ε':'e','ζ':'z','η':'h','θ':'8','ι':'i','κ':'k','λ':'l','μ':'m','ν':'n','ξ':'3','ο':'o','π':'p','ρ':'r','σ':'s','τ':'t','υ':'y','φ':'f','χ':'x','ψ':'ps','ω':'w','ά':'a','έ':'e','ί':'i','ό':'o','ύ':'y','ή':'h','ώ':'w','ς':'s','ϊ':'i','ΰ':'y','ϋ':'y','ΐ':'i','Α':'A','Β':'B','Γ':'G','Δ':'D','Ε':'E','Ζ':'Z','Η':'H','Θ':'8','Ι':'I','Κ':'K','Λ':'L','Μ':'M','Ν':'N','Ξ':'3','Ο':'O','Π':'P','Ρ':'R','Σ':'S','Τ':'T','Υ':'Y','Φ':'F','Χ':'X','Ψ':'PS','Ω':'W','Ά':'A','Έ':'E','Ί':'I','Ό':'O','Ύ':'Y','Ή':'H','Ώ':'W','Ϊ':'I','Ϋ':'Y'},TURKISH_MAP={'ş':'s','Ş':'S','ı':'i','İ':'I','ç':'c','Ç':'C','ü':'u','Ü':'U','ö':'o','Ö':'O','ğ':'g','Ğ':'G'},RUSSIAN_MAP={'а':'a','б':'b','в':'v','г':'g','д':'d','е':'e','ё':'yo','ж':'zh','з':'z','и':'i','й':'j','к':'k','л':'l','м':'m','н':'n','о':'o','п':'p','р':'r','с':'s','т':'t','у':'u','ф':'f','х':'h','ц':'c','ч':'ch','ш':'sh','щ':'sh','ъ':'','ы':'y','ь':'','э':'e','ю':'yu','я':'ya','А':'A','Б':'B','В':'V','Г':'G','Д':'D','Е':'E','Ё':'Yo','Ж':'Zh','З':'Z','И':'I','Й':'J','К':'K','Л':'L','М':'M','Н':'N','О':'O','П':'P','Р':'R','С':'S','Т':'T','У':'U','Ф':'F','Х':'H','Ц':'C','Ч':'Ch','Ш':'Sh','Щ':'Sh','Ъ':'','Ы':'Y','Ь':'','Э':'E','Ю':'Yu','Я':'Ya'},UKRAINIAN_MAP={'Є':'Ye','І':'I','Ї':'Yi','Ґ':'G','є':'ye','і':'i','ї':'yi','ґ':'g'},CZECH_MAP={'č':'c','ď':'d','ě':'e','ň':'n','ř':'r','š':'s','ť':'t','ů':'u','ž':'z','Č':'C','Ď':'D','Ě':'E','Ň':'N','Ř':'R','Š':'S','Ť':'T','Ů':'U','Ž':'Z'},POLISH_MAP={'ą':'a','ć':'c','ę':'e','ł':'l','ń':'n','ó':'o','ś':'s','ź':'z','ż':'z','Ą':'A','Ć':'C','Ę':'E','Ł':'L','Ń':'N','Ó':'O','Ś':'S','Ź':'Z','Ż':'Z'},LATVIAN_MAP={'ā':'a','č':'c','ē':'e','ģ':'g','ī':'i','ķ':'k','ļ':'l','ņ':'n','š':'s','ū':'u','ž':'z','Ā':'A','Č':'C','Ē':'E','Ģ':'G','Ī':'I','Ķ':'K','Ļ':'L','Ņ':'N','Š':'S','Ū':'U','Ž':'Z'},ARABIC_MAP={'أ':'a','ب':'b','ت':'t','ث':'th','ج':'g','ح':'h','خ':'kh','د':'d','ذ':'th','ر':'r','ز':'z','س':'s','ش':'sh','ص':'s','ض':'d','ط':'t','ظ':'th','ع':'aa','غ':'gh','ف':'f','ق':'k','ك':'k','ل':'l','م':'m','ن':'n','ه':'h','و':'o','ي':'y'},PERSIAN_MAP={'آ':'a','ا':'a','پ':'p','چ':'ch','ژ':'zh','ک':'k','گ':'gh','ی':'y'},LITHUANIAN_MAP={'ą':'a','č':'c','ę':'e','ė':'e','į':'i','š':'s','ų':'u','ū':'u','ž':'z','Ą':'A','Č':'C','Ę':'E','Ė':'E','Į':'I','Š':'S','Ų':'U','Ū':'U','Ž':'Z'},SERBIAN_MAP={'ђ':'dj','ј':'j','љ':'lj','њ':'nj','ћ':'c','џ':'dz','đ':'dj','Ђ':'Dj','Ј':'j','Љ':'Lj','Њ':'Nj','Ћ':'C','Џ':'Dz','Đ':'Dj'},AZERBAIJANI_MAP={'ç':'c','ə':'e','ğ':'g','ı':'i','ö':'o','ş':'s','ü':'u','Ç':'C','Ə':'E','Ğ':'G','İ':'I','Ö':'O','Ş':'S','Ü':'U'},ROMANIAN_MAP={'ă':'a','â':'a','î':'i','ș':'s','ț':'t','Ă':'A','Â':'A','Î':'I','Ș':'S','Ț':'T'},SPECIFIC_MAPS={'de':{'Ä':'AE','Ö':'OE','Ü':'UE','ä':'ae','ö':'oe','ü':'ue'}},ALL_MAPS=[LATIN_MAP,LATIN_SYMBOLS_MAP,GREEK_MAP,TURKISH_MAP,RUSSIAN_MAP,UKRAINIAN_MAP,CZECH_MAP,POLISH_MAP,LATVIAN_MAP,ARABIC_MAP,PERSIAN_MAP,LITHUANIAN_MAP,SERBIAN_MAP,AZERBAIJANI_MAP,ROMANIAN_MAP] +$(document).render(function(){$('[data-hotkey]').hotKey()})}(window.jQuery);+function($){"use strict";var VIETNAMESE_MAP={'Á':'A','À':'A','Ã':'A','Ả':'A','Ạ':'A','Ắ':'A','Ằ':'A','Ẵ':'A','Ẳ':'A','Ặ':'A','Ấ':'A','Ầ':'A','Ẫ':'A','Ẩ':'A','Ậ':'A','Đ':'D','É':'E','È':'E','Ẽ':'E','Ẻ':'E','Ẹ':'E','Ế':'E','Ề':'E','Ễ':'E','Ể':'E','Ệ':'E','Ó':'O','Ò':'O','Ỏ':'O','Õ':'O','Ọ':'O','Ố':'O','Ồ':'O','Ổ':'O','Ỗ':'O','Ộ':'O','Ớ':'O','Ờ':'O','Ở':'O','Ỡ':'O','Ợ':'O','Í':'I','Ì':'I','Ỉ':'I','Ĩ':'I','Ị':'I','Ú':'U','Ù':'U','Ủ':'U','Ũ':'U','Ụ':'U','Ứ':'U','Ừ':'U','Ử':'U','Ữ':'U','Ự':'U','Ý':'Y','Ỳ':'Y','Ỷ':'Y','Ỹ':'Y','Ỵ':'Y','á':'a','à':'a','ã':'a','ả':'a','ạ':'a','ắ':'a','ằ':'a','ẵ':'a','ẳ':'a','ặ':'a','ấ':'a','ầ':'a','ẫ':'a','ẩ':'a','ậ':'a','đ':'d','é':'e','è':'e','ẽ':'e','ẻ':'e','ẹ':'e','ế':'e','ề':'e','ễ':'e','ể':'e','ệ':'e','ó':'o','ò':'o','ỏ':'o','õ':'o','ọ':'o','ố':'o','ồ':'o','ổ':'o','ỗ':'o','ộ':'o','ớ':'o','ờ':'o','ở':'o','ỡ':'o','ợ':'o','í':'i','ì':'i','ỉ':'i','ĩ':'i','ị':'i','ú':'u','ù':'u','ủ':'u','ũ':'u','ụ':'u','ứ':'u','ừ':'u','ử':'u','ữ':'u','ự':'u','ý':'y','ỳ':'y','ỷ':'y','ỹ':'y','ỵ':'y'},LATIN_MAP={'À':'A','Á':'A','Â':'A','Ã':'A','Ä':'A','Å':'A','Æ':'AE','Ç':'C','È':'E','É':'E','Ê':'E','Ë':'E','Ì':'I','Í':'I','Î':'I','Ï':'I','Ð':'D','Ñ':'N','Ò':'O','Ó':'O','Ô':'O','Õ':'O','Ö':'O','Ő':'O','Ø':'O','Ù':'U','Ú':'U','Û':'U','Ü':'U','Ű':'U','Ý':'Y','Þ':'TH','Ÿ':'Y','ß':'ss','à':'a','á':'a','â':'a','ã':'a','ä':'a','å':'a','æ':'ae','ç':'c','è':'e','é':'e','ê':'e','ë':'e','ì':'i','í':'i','î':'i','ï':'i','ð':'d','ñ':'n','ò':'o','ó':'o','ô':'o','õ':'o','ö':'o','ő':'o','ø':'o','ō':'o','œ':'oe','ù':'u','ú':'u','û':'u','ü':'u','ű':'u','ý':'y','þ':'th','ÿ':'y'},LATIN_SYMBOLS_MAP={'©':'(c)'},GREEK_MAP={'α':'a','β':'b','γ':'g','δ':'d','ε':'e','ζ':'z','η':'h','θ':'8','ι':'i','κ':'k','λ':'l','μ':'m','ν':'n','ξ':'3','ο':'o','π':'p','ρ':'r','σ':'s','τ':'t','υ':'y','φ':'f','χ':'x','ψ':'ps','ω':'w','ά':'a','έ':'e','ί':'i','ό':'o','ύ':'y','ή':'h','ώ':'w','ς':'s','ϊ':'i','ΰ':'y','ϋ':'y','ΐ':'i','Α':'A','Β':'B','Γ':'G','Δ':'D','Ε':'E','Ζ':'Z','Η':'H','Θ':'8','Ι':'I','Κ':'K','Λ':'L','Μ':'M','Ν':'N','Ξ':'3','Ο':'O','Π':'P','Ρ':'R','Σ':'S','Τ':'T','Υ':'Y','Φ':'F','Χ':'X','Ψ':'PS','Ω':'W','Ά':'A','Έ':'E','Ί':'I','Ό':'O','Ύ':'Y','Ή':'H','Ώ':'W','Ϊ':'I','Ϋ':'Y'},TURKISH_MAP={'ş':'s','Ş':'S','ı':'i','İ':'I','ç':'c','Ç':'C','ü':'u','Ü':'U','ö':'o','Ö':'O','ğ':'g','Ğ':'G'},RUSSIAN_MAP={'а':'a','б':'b','в':'v','г':'g','д':'d','е':'e','ё':'yo','ж':'zh','з':'z','и':'i','й':'j','к':'k','л':'l','м':'m','н':'n','о':'o','п':'p','р':'r','с':'s','т':'t','у':'u','ф':'f','х':'h','ц':'c','ч':'ch','ш':'sh','щ':'sh','ъ':'','ы':'y','ь':'','э':'e','ю':'yu','я':'ya','А':'A','Б':'B','В':'V','Г':'G','Д':'D','Е':'E','Ё':'Yo','Ж':'Zh','З':'Z','И':'I','Й':'J','К':'K','Л':'L','М':'M','Н':'N','О':'O','П':'P','Р':'R','С':'S','Т':'T','У':'U','Ф':'F','Х':'H','Ц':'C','Ч':'Ch','Ш':'Sh','Щ':'Sh','Ъ':'','Ы':'Y','Ь':'','Э':'E','Ю':'Yu','Я':'Ya'},UKRAINIAN_MAP={'Є':'Ye','І':'I','Ї':'Yi','Ґ':'G','є':'ye','і':'i','ї':'yi','ґ':'g'},CZECH_MAP={'č':'c','ď':'d','ě':'e','ň':'n','ř':'r','š':'s','ť':'t','ů':'u','ž':'z','Č':'C','Ď':'D','Ě':'E','Ň':'N','Ř':'R','Š':'S','Ť':'T','Ů':'U','Ž':'Z'},POLISH_MAP={'ą':'a','ć':'c','ę':'e','ł':'l','ń':'n','ó':'o','ś':'s','ź':'z','ż':'z','Ą':'A','Ć':'C','Ę':'E','Ł':'L','Ń':'N','Ó':'O','Ś':'S','Ź':'Z','Ż':'Z'},LATVIAN_MAP={'ā':'a','č':'c','ē':'e','ģ':'g','ī':'i','ķ':'k','ļ':'l','ņ':'n','š':'s','ū':'u','ž':'z','Ā':'A','Č':'C','Ē':'E','Ģ':'G','Ī':'I','Ķ':'K','Ļ':'L','Ņ':'N','Š':'S','Ū':'U','Ž':'Z'},ARABIC_MAP={'أ':'a','ب':'b','ت':'t','ث':'th','ج':'g','ح':'h','خ':'kh','د':'d','ذ':'th','ر':'r','ز':'z','س':'s','ش':'sh','ص':'s','ض':'d','ط':'t','ظ':'th','ع':'aa','غ':'gh','ف':'f','ق':'k','ك':'k','ل':'l','م':'m','ن':'n','ه':'h','و':'o','ي':'y'},PERSIAN_MAP={'آ':'a','ا':'a','پ':'p','چ':'ch','ژ':'zh','ک':'k','گ':'gh','ی':'y'},LITHUANIAN_MAP={'ą':'a','č':'c','ę':'e','ė':'e','į':'i','š':'s','ų':'u','ū':'u','ž':'z','Ą':'A','Č':'C','Ę':'E','Ė':'E','Į':'I','Š':'S','Ų':'U','Ū':'U','Ž':'Z'},SERBIAN_MAP={'ђ':'dj','ј':'j','љ':'lj','њ':'nj','ћ':'c','џ':'dz','đ':'dj','Ђ':'Dj','Ј':'j','Љ':'Lj','Њ':'Nj','Ћ':'C','Џ':'Dz','Đ':'Dj'},AZERBAIJANI_MAP={'ç':'c','ə':'e','ğ':'g','ı':'i','ö':'o','ş':'s','ü':'u','Ç':'C','Ə':'E','Ğ':'G','İ':'I','Ö':'O','Ş':'S','Ü':'U'},ROMANIAN_MAP={'ă':'a','â':'a','î':'i','ș':'s','ț':'t','Ă':'A','Â':'A','Î':'I','Ș':'S','Ț':'T'},SPECIFIC_MAPS={'de':{'Ä':'AE','Ö':'OE','Ü':'UE','ä':'ae','ö':'oe','ü':'ue'}},ALL_MAPS=[VIETNAMESE_MAP,LATIN_MAP,LATIN_SYMBOLS_MAP,GREEK_MAP,TURKISH_MAP,RUSSIAN_MAP,UKRAINIAN_MAP,CZECH_MAP,POLISH_MAP,LATVIAN_MAP,ARABIC_MAP,PERSIAN_MAP,LITHUANIAN_MAP,SERBIAN_MAP,AZERBAIJANI_MAP,ROMANIAN_MAP] var removeList=["a","an","as","at","before","but","by","for","from","is","in","into","like","of","off","on","onto","per","since","than","the","this","that","to","up","via","with"] var locale=$('meta[name="backend-locale"]').attr('content') var Downcoder={Initialize:function(){if(Downcoder.map){return;}