/* * jQuery.my 1.2.16 * Requires jQuery 2.0+, SugarJS 1.3.9-1.4.x * * — minor fixes in formgen and modal * * More details at jquerymy.com * * (c) @ermouth, thanks @carpogoryanin, @ftescht * 2019-08-23 */ ;(function ($) { var _version = '1.2.16'; // Some shortcuts and constants var TMP, lang = "en", wURL = window.URL || window.webkitURL, ie8 = !document.addEventListener, Lang = ((window.navigator.language || window.navigator.userLanguage || 'en')+'').split('-')[0].toLowerCase(), d8 = "{yyyy}-{MM}-{dd}", h24="{HH}:{mm}", Ob = "object", Da = "data", Ar = "array", St = "string", Fu = "function", Ch = "change", rthis = /^this\./, isA = Object.isArray, isB = Object.isBoolean, isS = Object.isString, isO = Object.isObject, isN = Object.isNumber, isR = Object.isRegExp, isF = Object.isFunction, isP = function (a) { // detects promise return null != a && typeof a == Ob && isF(a.then); }, forms = _getref($,"my.f.repo")? $.my.f.repo():{_src:{}, _name:"Default manifest cache"}, restyles = _getref($,"my.f.restyles")? $.my.f.restyles():{}, Merge = Object.merge, Clone = Object.clone, Keys = Object.keys, $E = $.extend, $D = $.Deferred, T = $.type, N = null, n = function (o) {return o!==null && o!==undefined;}, // Configurables using $.my[fname](newHandler) // like $.my.ajax(newGlobalAjaxHandlerFunction) _ajax = $.ajax, _cache = _localCache, _now = Date.now, _require = _localRequire; //######################################################## // Storage of rules defined by cascading selectors // very similar to css. Leafs are processors // or processing rules for this type of node var MY = { //getter and setter functions for different types of nodes vals: { ".my-form": function ($o, v) { //object is jQuery.my instance if ($o && $o.my ) {var d = $o.my(Da); return Object.equal(d,v)?d:$o.my(Da, v, true);} else return v||N; }, ".hasDatepicker":function ($o,v) { //object has jQ UI datepicker if(n(v)) $o.datepicker("setDate", ((v=="")?v:Date.create(v))); var date = $o.datepicker("getDate"); return (date?date.format(d8):""); }, ".my-tags": function ($o,v) { //object is jQ tags control if (n(v)) { if (isS(v) || isN(v)) $o.tags(Da,[v+""]); else if (isA(v)) $o.tags(Da,v); } return $o.tags(Da); }, ".ui-draggable": (function ($o,v) { //object is jQ UI draggable if (n(v) && isO(v)) { var c = {}; if (!isNaN(v.left)) c.left = Number(v.left).ceil(2)+"px"; if (!isNaN(v.top)) c.top = Number(v.top).ceil(2)+"px"; if (c.left || c.top) $o.css(c); } var p = $o.position(); return { left:((v&&!isNaN(v.left))?(v.left*1).ceil(2):p.left.ceil(2)), top:((v&&!isNaN(v.top))?(v.top*1).ceil(2):p.top.ceil(2)) }; }), ".my-form-list": (function ($o,list) { //object is list of forms var i,old,xold,mod,eq,ctr = 0, $n, $drag, od = $o.data('formlist')||{}, gen = od.generator||{}, itemSel = gen.selector || '>.my-form', merge = !!gen.merge, tmpl = gen.template || '
', tmplIsVar = /\{/.test(tmpl), hasher = gen.hash || _sdbm, ider = gen.id || _sdbm, extHasher = gen.ext, delay = gen.delay || 50, sP = 'ui-sortable', sPlc= '.'+sP+'-placeholder', sortable = $o.is('.'+sP), sorting = !!$o.children(sPlc).length, result=[], redraw = [], now = _now(); var $c = sortable ? $o.find($o.sortable('option', 'items')) : $o.find(itemSel); if (n(list) && isA(list)) { //return list passed if dragging taking place if (sorting) return list; // first we must estimate // if putting new data over old // changes anything old = []; xold = {}; $c.each(function (i) { var $x = $(this), xd = $x.data('my'), dd; if (xd) { old.push(xd.data); if (!merge && (dd = $x.data('formlist'))) xold[dd.oid] = xd.data; } }); //fast compare eq = _aeq(old, list, '=='); if (!eq){ // We possibly have new data, hash it var hash=[], oid = [], xoid = {}, present={}; redraw = []; // Build id <-> idx and hashes for (i=0; iForm init failed
', ru:'Ошибка инициализации формы
' }, badInput:{en:"Invalid input", ru:"Неверное значение"}, patternMismatch:{en:"Pattern mismatch", ru:"Не соответствует шаблону"}, rangeOverflow:{en:"Over maximum", ru:"Больше максимума"}, rangeUnderflow:{en:"Under minimum", ru:"Меньше минимума"}, stepMismatch:{en:"Step mismatch", ru:"Не кратно шагу"}, tooLong:{en:"Too long", ru:"Слишком длинно"}, typeMismatch:{en:"Invalid type", ru:"Неверный тип"}, valueMissing:{en:"Required", ru:"Обязательное поле"} }, // Different controls’ events to watch for // ######################################################## events: { ".hasDatepicker":"change.my check.my", ".my-form,.my-tags":"change.my check.my", ".ui-slider":"slide.my check.my", "div.redactor_box textarea":"redactor.my check.my", ".my-codemirror":"codemirror.my check.my", ".ace_editor":"ace.my check.my", ".my-form-list":"sortupdate.my check.my", ".ui-sortable":"sortchange.my sortupdate.my check.my", ".ui-draggable":"drag.my dragstop.my check.my", "a, .pseudolink, input[type=button], button": "click.my", "img, :radio, :checkbox": "click.my check.my", "div.select2-container+input,div.select2-container+select":"change.my check.my input.my", ".ui-buttonset,input, select, textarea": "blur.my change.my check.my"+(navigator.appName.to(5)==="Micro"?" keyup.my":" input.my"), "":"check.my" }, // Functions retrieving container for different controls // ######################################################## containers: { "*[data-role='fieldcontain'] *":{ //jQuery Mobile "input,textarea,select,button,:radio": function ($o) { return $o.parents('[data-role="fieldcontain"]').eq(0); } }, "div.redactor_box textarea":function ($o){ return $o.parents('div.redactor_box').eq(0).parent(); }, ".my-tags,.hasDatepicker,.ui-widget,input,textarea,select,button" :{ ".my-cleditor": function ($o) { return $o.parents('div.cleditorMain').eq(0).parent(); }, "": function ($o) { var p = $o[0].parentNode, t = p.nodeName; if (/^(div|span|a|p|form|fieldset|li|ul|td|th|h\d)$/i.test(t)) return $(p); else return $o.parents('div,span,a,p,form,fieldset,li,ul,td,th,h1,h2,h3,h4,h5,h6').eq(0); } }, "": function ($o) {return $o;} }, // Disablers and enablers // ######################################################## offon: { //if x==true disables control else enables ".ace_editor": function (x,$o) {ace.edit($o[0]).setReadOnly(x);}, ".ui-selectable": function (x,$o) {_jquix($o,"selectable",x);}, ".ui-slider": function (x,$o) {_jquix($o,"slider",x);}, ".ui-draggable": function (x,$o) {_jquix($o,"draggable",x);}, ".ui-buttonset": function (x,$o) {_jquix($o,"buttonset",x);}, ".hasDatepicker": function (x,$o) {_jquix($o,"datepicker",x);}, ".my-form":function (x,$o){$o.my("disabled", !!x);}, "div.select2-container+input,div.select2-container+select": function (x,$o) {_jquix($o,"select2",x);}, ".my-cleditor": function (x,$o) { $o.cleditor()[0].disable(!!x);}, "": function (x, $o) {$o.attr("disabled", !!x);} }, // Destructors // ######################################################## destroy:{ ".hasDatepicker":function ($o){$o.datepicker("destroy");}, ".ui-slider":function ($o){$o.slider("destroy");}, ".ui-sortable":{ ".my-form-list":function ($o){ $o.find(">.my-form").each(function () { $(this).my("remove"); }); $o.removeClass("my-form-list"); $o.sortable("destroy"); }, "":function ($o){$o.sortable("destroy");} }, ".my-form-list":function ($o){ $o.find(">.my-form").each(function () { $(this).my("remove"); }); }, ".ui-draggable":function ($o){$o.draggable("destroy");}, ".my-redactor-8":function ($o){ $o.destroyEditor(); $o.removeClass("my-redactor-8"); }, "div.select2-container+input,div.select2-container+select": function ($o){$o.select2('destroy');}, ".my-form": function ($o) {$o.my("remove");}, "textarea": { ".my-codemirror": function ($o) { $o[0].nextSibling.CodeMirror.toTextArea(); $o.removeClass("my-codemirror"); } } } }; // Default values for .params section of manifest // ######################################################## MY.params = { container:function ($o) { return _traverse($o, MY.containers)($o); }, change:N, // depth of dependencies resolver tree recalcDepth: 2, // default delay of bind invocation delay: 0, // if true form assumed unjsonned strict: false, // delay of '); } var h = "", $s = $("style#my-modal-style-"+m.cid); if (m.nose=="top" || m.nose=="bottom") { h+='div.my-modal-'+m.cid+'.nose-'+m.nose+':before {left:' + (m.pos.ox - m.pos.px + m.pos.ow/2 - m.pos.vx) +'px!important;}'; $s.text(h); } else if (m.nose=="left" || m.nose=="right") { h+='div.my-modal-'+m.cid+'.nose-'+m.nose+':before {top:' + (m.pos.oy - m.pos.py + m.pos.oh/2 - m.pos.vy) +'px!important;}'; $s.text(h); } } } else $m.css({ left:"50%", "margin-left":"-"+((m.width+padx)/2).round(0)+"px" }); if (m.screen) { if (!m.global) $bg.css({ top:0, left:0, position:"absolute", width: $bg.parent().outerWidth()+'px', height: $bg.parent().outerHeight()+'px', display:"block", background:isS(m.screen)? m.screen:'rgba(255,255,255,0.6)', "z-index":m.z-1 }); else { $bg.css({ top:0, left:0, width:"100%", height:"100%", display:"block", position:"fixed", "z-index":m.z-1 }); if (isS(m.screen)) $bg.css({ background:m.screen? m.screen:'rgba(18,41,72,0.88)' }); else $bg.css({ background:m.screen?'rgba(18,41,72,0.88)':'' }); } } else if ($bg.length) $bg.hide(); if (m.height> m.pos.wh) { $m.height(m.pos.wh-30); $f.css({'overflow-y':'scroll'}); } else { $f.css({'overflow-y':''}); } $m.animate({top: m.pos.vy+'px', opacity:'1'}, m.animate); } // - - - - - - - - - - - - - - - - - - function _remove(){ try { $f.my('remove'); } catch(e){} try { // root may not exist $r.data('modals')[m.cid] = null; } catch(e){} $f.parent().off('.my').remove(); if (_indom($bg)) $bg.off('.my'+ m.cid); if (m.screen && _indom($bg)) { (function(g){ if (!g || !isOpen) $bg.hide(); if (!!g && !isOpen) { // repair screen color $bg.css({background:'rgba(18,41,72,0.88)'}); } }).delay(50, m.global); // curry m.global } if (m.global) { isOpen = false; $(document.body).css({overflow:''}); } } // - - - - - - - - - - - - - - - - - - function _f(msg) { try { done(null, null); } catch(e) {} (function () { pi.reject(msg); }).delay(0); } }; // -- end $.fn.modal })(jQuery);