/** * Translate * * JC.__({id}) - метод для перевода * JC.locale - текущая локаль */ $(document).ready(function() { $('.filter .close').on('click', function(e){ $('#opaco').hide(); $(this).parents('.filter').hide(); return false; }); if ($('.go-date').length > 0) { $('.go-date').on('click', function (e) { e.preventDefault(); var curdatetype = $('[name="filter[datetype]"]').val(); var datetype = $(this).attr('rel'); if (curdatetype == datetype) { return false; } else { $('.go-date').addClass('blue').removeClass('black').removeClass('no-decor'); $(this).removeClass('blue').addClass('black').addClass('no-decor'); $('[name="filter[datetype]"]').val(datetype); } $.ajax({ url: '/common/getdatesbydatetype/', cache: false, async: false, type: 'POST', data: {datetype: datetype}, dataType: 'json', success: function (xhr) { if (xhr.status === true) { //fix для дат. Т.к. только в воронках date_b - это начало периода (так должно быть везде!!!) if ($('[name="quickfilter_page"]').length && $('[name="quickfilter_page"]').val() == 'funnel') { $('[name="filter[date_b]"]').val(xhr.data.dateStart); $('[name="filter[date_e]"]').val(xhr.data.dateEnd); } else { $('[name="filter[date_e]"]').val(xhr.data.dateStart); $('[name="filter[date_b]"]').val(xhr.data.dateEnd); } if ($('[name="filter[date_interval]"]').length > 0) { $('[name="filter[date_interval]"]').attr('checked', false); $('[name="filter[date_interval]"]').each(function () { if ($(this).val() == xhr.data.dateInterval) $(this).attr('checked', true); }); } $('a[name="find"]').click(); } } }); }); } if ($('.jc-shops').length==0 && $('.form-group').length==0 && $('nav.nav-control').length==0 && ($('.top-control').length > 0 || $('.acordeon').length > 0) ) { $('.acordeon-tit a').removeClass('button'); $('select.select').removeClass('select').addClass('select2'); $('.newListSelected.select').remove(); $('.form-buttons span').each(function(e) { if ($(this).text() == JC.__('javascript.or')) { $(this).text(''); } }); $('.form-buttons .in input').closest('span').html($('.form-buttons .in input:first')); $('span.rub').html(''); $('.acordeon-tit').each(function(e,el) { var self = el; if ($(el).hasClass('showed')){ $(el).find('.fa.icon-showed').removeClass('fa-arrow-circle-right').addClass('fa-arrow-circle-down'); } }); $('.top-control nav').remove(); $('.icon-showed').each(function(i,el){ if (!$(el).hasClass('fa-arrow-circle-right') && !$(el).hasClass('fa-arrow-circle-down')) { if ($(el).closest('.acordeon-tit').hasClass('showed')) { $(el).addClass('fa').addClass('fa-arrow-circle-down'); } else { $(el).addClass('fa').addClass('fa-arrow-circle-right'); } } }); $('div#alert_loading').css('opacity','0.9').css('background','rgba(0, 0, 0, 0.69)'); $('head').prepend(''); } }); /*********************TEMPORARY****************/ function array_diff (array) { // Computes the difference of arrays, like in PHP var arr_dif = [], i = 1, argc = arguments.length, argv = arguments, key, key_c, found=false, j = 0; for (key in array){ for (i = 1; i< argc; i++){ found = false; for (key_c in argv[i]) { if (argv[i][key_c] == array[key]) { found = true; break; } } if(!found){ arr_dif[j] = array[key]; j++; } } } return arr_dif; } function implode(glue, pieces) { // Join array elements with a string, like in PHP return ((pieces instanceof Array) ? pieces.join (glue) : pieces); } // align element at window center jQuery.fn.alignCenter = function() { var marginLeft = Math.max(0, parseInt(jQuery(window).width()/2 - jQuery(this).innerWidth()/2)); var marginTop = Math.max(0, parseInt(jQuery(window).height()/2 - jQuery(this).innerHeight()/2)); return jQuery(this).css({"top":marginTop + "px", "left":marginLeft + "px"}); }; // jQuery plugins jQuery.fn.extend({ // ajax box ajaxBox: function(options) { AppAjaxBox.init(this, options || null); return this; } }); var ajaxWait = { start : function() { jQuery("#jc-loader").show(); }, stop : function() { jQuery("#jc-loader").hide(); } }; $(".ajax-cancel").on('click', function(){ ajaxWait.stop(); }); $(".new_form a").on('click', function(){ ajaxWait.start(".new_form"); }); $(".ui-autocomplete a,.rich-editor,#rich-editor,[id*='cke_'],#clear-pay-text,#cke_good_pay_text,#script-check,.internal,.internal2,.external,a[target='_blank'],#clear-text, a[href='#ticket']").on('click', function(){ ajaxWait.stop(); }); $(".ajax-submit, .CmsFormSubmit").on('click', function() { $val = $(this).val(); // todo протестировать условие, в идеале переписать if ($val !== JC.__('javascript.export')) { ajaxWait.start(); } }); /** * Set cookie after close the notice */ $(document).on('click', '.notice .notice-close', function(e) { e.preventDefault(); var cookieName = $(this).attr('rel'), expDate = $(this).data('hide-period'); if (typeof expDate === 'undefined') { expDate = 15; } if (cookieName){ if ((cookieName.indexOf('publicity_info_') + 1) || (cookieName.indexOf('mini_status_off_') + 1)) { expDate = 365; } $.cookie(cookieName, 1, { expires: expDate, path: '/'}); $(this).attr('rel', ''); } }); /** * Simple notify * @param text * @param time * @param bannerName */ function notify(text, time, bannerName) { var $alert = JC.jquery('.collapseAlert'); if (typeof time === "undefined") { time = 3000; } $alert.find('.notice__head__name').html(text); $alert.find('a[href="#collapseAlertContent"]').addClass('hidden collapsed'); $alert.find('#collapseAlertContent').removeClass('in'); $alert.clearQueue().collapse('show'); if (time > 0) { setTimeout(function () { $alert.collapse('hide'); }, time); } } /** * Full notify * @param shortText * @param fullText * @param btnText * @param cookieName * @param disposable * @param hidePeriod */ function sysnotify(shortText, fullText, btnText, cookieName, disposable, hidePeriod) { var $alert = JC.jquery('.collapseAlert'); var btn = btnText || JC.__('javascript.now_i_know') + '!'; disposable = disposable || false; hidePeriod = hidePeriod || false; $alert.find('.notice__content .notice-close').html(btn); if (fullText) { fullText = fullText.replace('', shortText); $alert.find('.notice__content p').html(fullText); $alert.find('a[href="#collapseAlertContent"]').removeClass('hidden'); } if (cookieName) { $alert.find('.notice__content .notice-close').attr('rel', cookieName); if (disposable) { $alert.find('[data-target=".collapseAlert"]').addClass('notice-close').attr('rel', cookieName); } } if (hidePeriod) { $alert.find('.notice-close').attr('data-hide-period', hidePeriod); } $alert.find('.notice__head__name').html(shortText); $alert.clearQueue().collapse('show'); } function registerModule(module, id) { return { type: 'REGISTER_MODULE', module: module, id: id } } function reposition(label) { return { type: 'REPOSITION', label: label } } var AppAjaxBox = { // load content into box init: function(target, options) { if (options !== null) { target.data('ajaxbox-options', options); } else { options = target.data('ajaxbox-options'); } // prevent multiple requests if (target.data('ajaxbox-process')) return; if (typeof options.type == 'undefined') { options.type = 'GET'; } // request data jQuery.ajax({ beforeSend: function() { target.data('ajaxbox-process', true); AppAjaxBox.enable(target); }, complete: function(xhr) { target.data('ajaxbox-process', false); if (options.request.loadingNotOff !== true) { AppAjaxBox.disable(target); } }, error: function(xhr) { if (xhr.status === 0) { console.log(xhr); return; } target.data('ajaxbox-error', true); AppAjaxBox.disable(target); // jQuery.blink('Application error', 5); }, url: options.url, cache: false, type: options.type, data: options.request, success: function(response, status, xhr) { var contentType = xhr.getResponseHeader("content-type") || ""; if (contentType.indexOf('html') > -1) { target.html(response); JC.ModuleLoader.importModules(target.find('.jc-module')); JC.Store.dispatch(registerModule('legacy-ajax', 'on-load-page')); JC.Store.dispatch(reposition('legacy-ajax-'+ options.url)); } else if (contentType.indexOf('json') > -1) { if (response.status == true && response.html) { target.html(response.html); JC.ModuleLoader.importModules(target.find('.jc-module')); JC.Store.dispatch(registerModule('legacy-ajax', 'on-load-page')); JC.Store.dispatch(reposition('legacy-ajax-'+ options.url)); } else if (response.messages) { alert(respnose.messages); } } else { target.html(JC.__('javascript.invalid_response_format')); } } }); return this; }, // loading enable: function() { $("#jc-loader").show(); }, disable: function() { $("#jc-loader ").hide(); } }; //form ajax submit jQuery.fn.ajaxPaginator = function(paginator) { var pName = "p_p_"+$.cookie('auth_user_name'); var expDate = new Date(); var minutes = 5; expDate.setTime(expDate.getTime() + (minutes * 60 * 1000)) // get $target options var $target = this; var options = $target.data('ajaxbox-options'); if (!options || !options.pagination) return false; var pagination = $(options.pagination.controller); if (paginator == 'refreshPage'){ $target.ajaxBox(options); return; } if (paginator == 'isActive'){ return ($(".currentpage:visible").length > 0); } if (paginator.pageCount > 1) { pagination.show(); } else { pagination.hide(); } // unbind handlers pagination.children().unbind(); $target.find(".perpage").find('A').removeClass('active'); $target.find(".perpage").find('A.per10').addClass('active'); if (paginator.numItemsPerPage) { if ($target.find(".perpage").find('A.per' + paginator.numItemsPerPage).length > 0) { $target.find(".perpage").find('A').removeClass('active'); $target.find(".perpage").find('A.per' + paginator.numItemsPerPage).addClass('active'); } } // bind switch to previous if (!paginator.previous) { $(".arrow-prevpage", pagination).addClass("disabled"); } else { $(".arrow-prevpage", pagination).bind('click', function(e) { e.preventDefault(); location.href = "#filters"; options.request.p = paginator.previous; $target.ajaxBox(options); //alert(paginator.previous); $.cookie(pName, paginator.previous, { expires: expDate, path: document.location.pathname}); }).removeClass("disabled"); } // bind switch to next if (!paginator.next) { $(".arrow-nextpage", pagination).addClass("disabled"); } else { $(".arrow-nextpage", pagination).bind('click', function(e) { e.preventDefault(); location.href = "#filters"; options.request.p = paginator.next; $target.ajaxBox(options); //alert(paginator.next); $.cookie(pName, paginator.next, { expires: expDate, path: document.location.pathname}); }).removeClass("disabled"); } // bind page text $(".currentpage", pagination) .change(function(){ var gotopage = parseInt($(".currentpage", pagination).val()); if (gotopage != paginator.current && (gotopage >= paginator.first && gotopage <= paginator.last)) { location.href = "#filters"; paginator.current = options.request.p = gotopage; $target.ajaxBox(options); } else {return false;} }) .click(function(){ $(this).select(); }) .keypress(function(event){ if (event.which === 13) { event.preventDefault(); $(this).blur().trigger('change'); //alert(paginator.current); $.cookie(pName, paginator.current, { expires: expDate, path: document.location.pathname}); } }); var pp = parseInt($.cookie(pName)); if(pp > paginator.pageCount) $(".currentpage", pagination).val(paginator.current); else $(".currentpage", pagination).val(pp); $(".currentpage", pagination).val(paginator.current); $(".totalpages", pagination).text(paginator.pageCount); // listing if (options.pagination.listing) { if (paginator.totalItemCount > 0) { $(options.pagination.listing).html( "" + paginator.firstItemNumber + "-" + paginator.lastItemNumber + " " + JC.__('javascript.of') + " " + "" + paginator.totalItemCount + "").show(); } else { $(options.pagination.listing).hide(); } } // callback if (options.pagination.callback) { options.pagination.callback(paginator); } return this; } function formatPrice(str) { return str != undefined ? (str + '').replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 ') : str; } //Work with URL & Links function urlencode(str) { str = (str+'').toString(); return encodeURIComponent(str) .replace(/!/g, '%21') .replace(/'/g, '%27') .replace(/\(/g, '%28') .replace(/\)/g, '%29') .replace(/\*/g, '%2A') .replace(/%20/g, '+'); } function urldecode(str) { return decodeURIComponent((str+'').replace(/\+/g, '%20')); } function parse_str(str, array) { var glue1 = '=', glue2 = '&', array2 = String(str).replace(/^&?([\s\S]*?)&?$/, '$1').split(glue2), i, j, chr, tmp, key, value, bracket, keys, evalStr, that = this, fixStr = function (str) { return that.urldecode(str).replace(/([\\"'])/g, '\\$1').replace(/\n/g, '\\n').replace(/\r/g, '\\r'); }; if (!array) { array = this.window; } for (i = 0; i < array2.length; i++) { tmp = array2[i].split(glue1); if (tmp.length < 2) { tmp = [tmp, '']; } key = fixStr(tmp[0]); value = fixStr(tmp[1]); while (key.charAt(0) === ' ') { key = key.substr(1); } if (key.indexOf('\0') !== -1) { key = key.substr(0, key.indexOf('\0')); } if (key && key.charAt(0) !== '[') { keys = []; bracket = 0; for (j = 0; j < key.length; j++) { if (key.charAt(j) === '[' && !bracket) { bracket = j + 1; } else if (key.charAt(j) === ']') { if (bracket) { if (!keys.length) { keys.push(key.substr(0, bracket - 1)); } keys.push(key.substr(bracket, j - bracket)); bracket = 0; if (key.charAt(j + 1) !== '[') { break; } } } } if (!keys.length) { keys = [key]; } for (j = 0; j < keys[0].length; j++) { chr = keys[0].charAt(j); if (chr === ' ' || chr === '.' || chr === '[') { keys[0] = keys[0].substr(0, j) + '_' + keys[0].substr(j + 1); } if (chr === '[') { break; } } evalStr = 'array'; for (j = 0; j < keys.length; j++) { key = keys[j]; if ((key !== '' && key !== ' ') || j === 0) { key = "'" + key + "'"; } else { key = eval(evalStr + '.push([]);') - 1; } evalStr += '[' + key + ']'; if (j !== keys.length - 1 && eval('typeof ' + evalStr) === 'undefined') { eval(evalStr + ' = [];'); } } evalStr += " = '" + value + "';\n"; eval(evalStr); } } } function parse_url(str, component) { var o = { strictMode: false, key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], q: { name: "queryKey", parser: /(?:^|&)([^&=]*)=?([^&]*)/g }, parser: { strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ // Added one optional slash to post-protocol to catch file:/// (should restrict this) } }; var m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), uri = {}, i = 14; while (i--) {uri[o.key[i]] = m[i] || "";} // Uncomment the following to use the original more detailed (non-PHP) script /* uri[o.q.name] = {}; uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { if ($1) uri[o.q.name][$1] = $2; }); return uri; */ switch (component) { case 'PHP_URL_SCHEME': return uri.protocol; case 'PHP_URL_HOST': return uri.host; case 'PHP_URL_PORT': return uri.port; case 'PHP_URL_USER': return uri.user; case 'PHP_URL_PASS': return uri.password; case 'PHP_URL_PATH': return uri.path; case 'PHP_URL_QUERY': return uri.query; case 'PHP_URL_FRAGMENT': return uri.anchor; default: var retArr = {}; if (uri.protocol !== '') {retArr.scheme=uri.protocol;} if (uri.host !== '') {retArr.host=uri.host;} if (uri.port !== '') {retArr.port=uri.port;} if (uri.user !== '') {retArr.user=uri.user;} if (uri.password !== '') {retArr.pass=uri.password;} if (uri.path !== '') {retArr.path=uri.path;} if (uri.query !== '') {retArr.query=uri.query;} if (uri.anchor !== '') {retArr.fragment=uri.anchor;} return retArr; } } //END Work with URL & Links function GetComission(value, base, min, max) { if (value > 0) { if (base > 0) { var total = value * base / 100; if (min > 0 && total < min) { return min; } if (max > 0 && total > max) { return max; } return total; } else { return 0; } } else { return false; } } /* * Предварительно нужно: * - подключить библиотеку в шаблоне * - google.load("visualization", "1", {packages:["corechart"]}); вызвать js-код * * idArea - ид div-блока, в котором появится график * obj - массив данных, вида key-value * opt - дополнительные параметры, вида key-value */ function drawPieChart(idArea, obj, opt) { var data = new google.visualization.DataTable(); data.addColumn('string', 'Name'); data.addColumn('number', 'Count'); for(var i in obj) data.addRow([i, obj[i]]); options = { //legend: 'none', title: opt['title'], //backgroundColor: '#333', tooltip: {isHtml: true}, }; var chart = new google.visualization.PieChart(document.getElementById(idArea)); chart.draw(data, options); } /** * Создаем уникальный ID */ var uniqueId = function () { // Math.random should be unique because of its seeding algorithm. // Convert it to base 36 (numbers + letters), and grab the first 9 characters // after the decimal. return '_' + Math.random().toString(36).substr(2, 9); }; /** * Замена темы мгновенного/автоматического письма на содержимое тега title */ function MoveTitleToSubject(textarea) { var title = textarea.val().match(/]*>([\s\S]*?)<\/title>/g); if (title != null && typeof(title) != 'undefined') { title = title.toString().replace('', '').replace('', ''); if (title != '') { var form = textarea.closest('.anons-form'); if (form.length == 0) { form = textarea.closest('.serial-form'); } if (form.length == 0) { return false; } var subject = form.find('.subject'); subject.val(title); var text = textarea.val().replace(title, ''); textarea.val(text); var editor_name = subject.attr('name').replace('subject', 'html'); var editor = CKEDITOR.instances[editor_name]; var data = editor.getData().replace(title, ''); editor.setData(data); } } } // tracking ajax errors for old scripts $(document).ajaxError(function(event, jqxhr, settings, exception) { var response = 'incorrect response'; var type = (!!event.type) ? event.type : ''; var mark = (typeof window.addBlockDisable === 'undefined') ? ' [old, addBlock enable] : ' : ' [old] : '; var status = exception || jqxhr.statusText || ''; if (!!jqxhr.responseText) { response = (jqxhr.responseText.length > 500) ? jqxhr.responseText.substring(0, 500) + '...' : jqxhr.responseText } JC.sentry.send(String(type + mark + status), { url: settings.url, type: settings.type, data: settings.data, status: jqxhr.status, error: exception || jqxhr.statusText, response: response } ); });