diff --git a/apps/conference/models.py b/apps/conference/models.py index 65088d3a..f0a8e806 100644 --- a/apps/conference/models.py +++ b/apps/conference/models.py @@ -146,30 +146,6 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin): def __unicode__(self): return self.lazy_translation_getter('name', unicode(self.pk)) - def get_services(self): - return self.get_services_detail() - # country_ids = [item for item, bool in self.country.services if bool==True] - # ids = [item for item, bool in self.services if bool==True] - - # qs = Service.objects.filter(Q(Q(url__in=country_ids) & Q(type=Service.type.conference)) | Q(url__in=ids)) - - # return list(qs) - #return list(Service.objects.language().filter(url__in=ids, type=Service.type.conference).order_by('sort')) - - def get_services_detail(self): - # excluded = ['tickets'] - return super(Conference, self).get_services_detail(None, Service.type.conference) - - # def get_nearest_events(self): - # if self.theme.all(): - # theme = self.theme.all()[0] - # now = datetime.datetime.now() - # now = now - datetime.timedelta(days=1) - # conferences = Conference.objects.filter(theme__in=[theme], data_begin__gt=now).exclude(id=self.id).order_by('data_begin') - # return conferences[:3] - # else: - # return [] - def get_audience(self): return self.audience.all() diff --git a/apps/conference/tests/test_models.py b/apps/conference/tests/test_models.py index b1cd5448..680afc5a 100644 --- a/apps/conference/tests/test_models.py +++ b/apps/conference/tests/test_models.py @@ -1,11 +1,8 @@ import datetime -from accounts.models import User -from django.contrib.contenttypes.models import ContentType from django.core.urlresolvers import reverse, NoReverseMatch from django.test import TestCase from expobanner.models import Paid, Banner -from service.models import Service from stats_collector.models import ObjectStats from theme.models import Tag, Theme @@ -71,16 +68,6 @@ class ConferenceTest(TestCase): 'name', unicode(self.conference.pk)) ) - def test_method_get_services(self): - services = [item for item, bool in self.conference.services if bool] - qs = Service.objects.language() - qs = qs.filter(url__in=services) - - self.assertEqual( - sorted(self.conference.get_services(), key=lambda x: x.pk), - sorted(list(qs), key=lambda x: x.pk) - ) - def test_method_get_news_url(self): self.assertEqual( self.conference.get_news_url(), diff --git a/apps/country/admin.py b/apps/country/admin.py index df71991a..877fa7b1 100644 --- a/apps/country/admin.py +++ b/apps/country/admin.py @@ -81,7 +81,7 @@ def country_change(request, url): 'logo': c.logo} if c.capital: - data['capital'] = c.capital.id + data['capital'] = c.capital_id #data from translated fields for code, name in settings.LANGUAGES: diff --git a/apps/expobanner/views.py b/apps/expobanner/views.py index 6ec37c7b..624e9a74 100644 --- a/apps/expobanner/views.py +++ b/apps/expobanner/views.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- import json import re + from django.http import HttpResponse -from django.shortcuts import redirect, get_object_or_404 -from django.shortcuts import render_to_response -from django.template import RequestContext +from django.shortcuts import redirect, get_object_or_404, render + from .models import Banner, BannerGroup, URL, Top from expobanner.utils import get_banner_by_params, get_client_ip, get_top_events, get_referer_view, set_cookie @@ -102,7 +102,13 @@ def get_top(request): tops = Top.cached.all() events = get_top_events(tops, params, request) - context = {'objects': events} + ctx = {'objects': events} + + if not events: + return HttpResponse('') + if catalog == 'places': - return render_to_response('client/includes/exposition/expo_top_place.html', context, context_instance=RequestContext(request)) - return render_to_response('client/includes/exposition/expo_top.html', context, context_instance=RequestContext(request)) + return render( + request, 'client/includes/exposition/expo_top_place.html', ctx + ) + return render(request, 'client/includes/exposition/expo_top.html', ctx) diff --git a/apps/exposition/models.py b/apps/exposition/models.py index 85f07fa1..15acefab 100644 --- a/apps/exposition/models.py +++ b/apps/exposition/models.py @@ -5,7 +5,6 @@ from django.contrib.contenttypes import generic from django.core.urlresolvers import reverse_lazy from django.db import models from django.db.models.signals import post_save, pre_save -from django.dispatch import receiver from django.utils import translation from django.utils.translation import ugettext as _ from events.models import TargetAudience @@ -171,19 +170,6 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin): def get_price(self): return self.price_day or self.price_all - def get_services(self): - return self.get_services_detail() - # country_ids = [item for item, bool in self.country.services if bool==True] - # ids = [item for item, bool in self.services if bool==True] - - # qs = Service.objects.language().filter(Q(Q(url__in=country_ids) & Q(type=Service.type.expo)) | Q(url__in=ids)) - - # return list(qs) - - def get_services_detail(self): - excluded = ['visit'] - return super(Exposition, self).get_services_detail(excluded, Service.type.expo) - def get_parent(self): return {} diff --git a/apps/functions/model_mixin.py b/apps/functions/model_mixin.py index 680a4d4b..9610dd78 100644 --- a/apps/functions/model_mixin.py +++ b/apps/functions/model_mixin.py @@ -245,38 +245,6 @@ class EventMixin(object): def cancel(self): self.canceled_by_administrator = True - def get_services(self): - - country_ids = [item for item, bool in self.country.services if bool==True] - ids = [item for item, bool in self.services if bool==True and item in country_ids] - - return list(Service.objects.language().filter(url__in=ids).order_by('sort')) - - def get_services_detail(self, excluded, _type): - if not isinstance(getattr(self, '_get_services_detail', None), list): - # excluded = ['visit', 'tickets'] - # country_ids = [item for item, bool in self.country.services if bool==True] - services = [item for item, bool in self.services if bool] - qs = Service.objects.language() - if excluded is not None: - qs = qs.exclude(url__in=excluded) - # qs = qs.filter(Q(Q(url__in=country_ids) & Q(type=_type)) | Q(url__in=ids)) - qs = qs.filter(url__in=services) - self._get_services_detail = list(qs) - # import pdb; pdb.set_trace() - #двигаем билеты сразу за переводом - if excluded is None or 'tickets' not in excluded: - translator_idx = tickets = None - for idx, service in enumerate(self._get_services_detail): - if service.url == 'translator': - translator_idx = idx + 1 - elif service.url == 'tickets': - tickets = service - if tickets and translator_idx: - self._get_services_detail.remove(tickets) - self._get_services_detail.insert(translator_idx, tickets) - return self._get_services_detail - def duration_days(self, month=None): if not month: d = self.data_end - self.data_begin diff --git a/apps/place_exposition/views.py b/apps/place_exposition/views.py index d438c3c3..0b6073fa 100644 --- a/apps/place_exposition/views.py +++ b/apps/place_exposition/views.py @@ -237,7 +237,6 @@ class PlaceExpositionListView(MetadataMixin, ListView): места, по ссылке "Все события" """ template_name = 'client/place/place_exposition_list.html' - # cache_range = settings.CACHE_RANGE def get_object(self): slug = self.kwargs.get('slug') diff --git a/apps/service/models.py b/apps/service/models.py index b2dbed81..43df840f 100644 --- a/apps/service/models.py +++ b/apps/service/models.py @@ -6,7 +6,7 @@ from django.db.models.signals import post_save from django.utils.translation import ugettext as _ from functions.custom_fields import EnumField from functions.signal_handlers import post_save_handler -from hvad.models import TranslatableModel, TranslatedFields, TranslationManager +from hvad.models import TranslatableModel, TranslatedFields CURENCIES = ('', 'USD', 'RUB', 'EUR') diff --git a/apps/service/urls.py b/apps/service/urls.py index 9eee7cc6..59786a70 100644 --- a/apps/service/urls.py +++ b/apps/service/urls.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -from django.conf.urls import patterns, include, url +from django.conf.urls import patterns, url from views import ServiceView, CallBackListView, VisitListView, TranslationListView, AdvertisingListView, \ ParticipationListView, RemoteListView,TicketsListView, Thanks diff --git a/apps/service/views.py b/apps/service/views.py index 979245e1..26fce496 100644 --- a/apps/service/views.py +++ b/apps/service/views.py @@ -2,23 +2,17 @@ import json from itertools import chain -from django.http import HttpResponse from django.views.generic import ListView, FormView, TemplateView from django.shortcuts import get_object_or_404 -from django.http import Http404 from django.http import HttpResponseRedirect, HttpResponse -from haystack.query import EmptySearchQuerySet - from meta.views import MetadataMixin -from accounts.models import UserLog from exposition.models import Exposition from conference.models import Conference -from functions.custom_views import ExpoListView from models import Service from order_forms import TranslationForm, CatalogForm, VisitForm, RemoteForm, ParticipationForm, TicketsForm,\ AdvertiseForm, BuildStandForm -#from functions.search_forms import CompanySearchForm +from service.models import CallBack, Visit, Translation, Advertising, Participation, Remote, Tickets order_forms = {'translator': TranslationForm, 'catalog': CatalogForm, 'participation': ParticipationForm, @@ -121,12 +115,12 @@ def advertise(request, catalog=None, event_url=None): raise HttpResponse('not ajax') -from service.models import CallBack, Visit, Translation, Advertising, Participation, Remote, Tickets class AbstractOrderListView(ListView): template_name = 'c_admin/service/order_list.html' paginate_by = 20 + class CallBackListView(AbstractOrderListView): model = CallBack @@ -138,15 +132,19 @@ class VisitListView(AbstractOrderListView): class TranslationListView(AbstractOrderListView): model = Translation + class AdvertisingListView(AbstractOrderListView): model = Advertising + class ParticipationListView(AbstractOrderListView): model = Participation + class RemoteListView(AbstractOrderListView): model = Remote + class TicketsListView(AbstractOrderListView): model = Tickets diff --git a/static/client/js/_modules/block.exposition.list.js b/static/client/js/_modules/block.exposition.list.js index b659578a..27b14172 100644 --- a/static/client/js/_modules/block.exposition.list.js +++ b/static/client/js/_modules/block.exposition.list.js @@ -1,78 +1,27 @@ var EXPO = EXPO || {}; //isolated namespace EXPO.exposition = EXPO.exposition || {}; if (EXPO.exposition.list){ - console.warn('WARNING: EXPO.place.object is already defined!'); + console.warn('WARNING: EXPO.place.object is already defined!'); }else { - EXPO.exposition.list = (function () { + EXPO.exposition.list = (function () { // dependencies - var com = EXPO.common; + var com = EXPO.common; // variables - var that = {}, - Note = function (it, opt) { - this.opt = opt; - this.DOMthis = it; - this.DOMbutton = it.querySelector('.'+opt.buttonClass); - this.DOMinput = it.querySelector('.'+opt.inputClass); - this.inputName = this.DOMinput.getAttribute('name'); - this.url = this.DOMbutton.getAttribute('href'); - this._controller(); - }; - Note.prototype = { - _init: function () { - - }, - _controller: function () { - var self = this; - $(this.DOMinput).on('blur', function () { - self.send(); - }); - $(this.DOMbutton).on('click', function () { - return false; - }); - }, - send: function () { - var data = {}, - response, - self = this, - handler = function (data) { - if (data.success) { - console.log('ok'); - $(self.DOMbutton).addClass('active'); - } else { - console.log('data not send'); - } - - }; - data[this.inputName] = this.DOMinput.value; - response = com.getRequest(data,this.url,handler); - } - }; - - that.opt = {}; //свойства по умолчанию + var that = {}; + that.opt = {}; //свойства по умолчанию //private - $(function () { - }); + $(function () { + }); // methods - //инициализация общих свойств - that.init = function (options) { - $.extend(this.opt, options); - this.notes = []; - var self = this; - - $('.'+this.opt.note.wrapClass).each(function () { - var note = new Note(this,self.opt.note); - self.notes.push(note); - }); - $('.'+this.opt.note.wrapDisabledClass).on('click', function () { - $.fancybox.open('#pw-login'); - return false; - }); - com.opt.addCalendarText = this.opt.addCalendarText; - com.opt.removeCalendarText = this.opt.removeCalendarText; - }; - return that; - }()); + //инициализация общих свойств + that.init = function (options) { + $.extend(this.opt, options); + com.opt.addCalendarText = this.opt.addCalendarText; + com.opt.removeCalendarText = this.opt.removeCalendarText; + }; + return that; + }()); } diff --git a/static/client/js/_modules/page.events.feed.js b/static/client/js/_modules/page.events.feed.js index 241a7dfc..5555a552 100644 --- a/static/client/js/_modules/page.events.feed.js +++ b/static/client/js/_modules/page.events.feed.js @@ -1,1859 +1,1859 @@ var EXPO = EXPO || {}; //isolated namespace EXPO.events = EXPO.events || {}; if (EXPO.events.feed) { - console.warn('WARNING: EXPO.eventsFeed is already defined!'); + console.warn('WARNING: EXPO.eventsFeed is already defined!'); } else { - EXPO.events.feed = (function () { - // variables - var that = {}; - - //default module setting - that.opt = {}; - //dependence's - var com = EXPO.common; - //private - var Filter = function (opt) { - this.opt = opt; - this.DOMbody = document.getElementById(opt.bodyId); - - }, - /** - * make ajax GET request and launch handler if exist or return data - * @param {Object|string} dataToSend - * @param {string} url - * @param {function} handler - function to execute when task is ready - */ - getRequest = function (dataToSend,url,handler) { - if(!dataToSend){ - dataToSend = ''; - } - $.ajax({ - type: 'GET', - url: url, - data:dataToSend, - success: function(data) { - if(typeof handler == 'function'){ - handler(data); - } else{ - return data; - } - } - }); - }, - /** - * rename name of property of an object/ Check for the old property name to avoid a ReferenceError in strict mode. - * @param {Object} obj object to rename its properties - * @param {string} oldName - * @param {string} newName - * @returns {renameProperty} - */ - renameProperty = function (obj,oldName, newName) { - if (obj.hasOwnProperty(oldName)) { - obj[newName] = obj[oldName]; - - } - return this; - }, - /** - * analogue of Array.length but for object instance - * @param {Object} obj - Object to count its method - * @returns {number} - */ - getObjectLength = function (obj) { - var size = 0, key; - for (key in obj) { - if (obj.hasOwnProperty(key)) size++; - } - return size; - }, - $waiter = $('.wait-ajax.absolute'), - Json2URI = function (jsonObj) { - var str = Object.keys(jsonObj).map(function(key){ - return encodeURIComponent(key) + '=' + encodeURIComponent(jsonObj[key]); - }).join('&'); - return ('?'+str); - }; - - // methods - Filter.prototype = { - show: function () { - //$(this.DOMbody).show(); - $(this.DOMbody).slideDown(); - }, - hide: function () { - $(this.DOMbody).hide(); - //$(this.DOMbody).slideUp(); - - } - }; - - // places and subject modals - /** - * Constructor for modal window 'select subject' - * @param {Object} options - * @constructor - */ - var SubjectModal = function (options) { - /** - * options init - * @type {Object} - */ - this.opt = options; - var self = this, index = 0, - $subjWrap = $('#' + self.opt.subjectTriggerWrapId), - $topicBox, - modalId = self.opt.id, - $modal = $('#' + modalId), - $checkBox = $('.csb-menu-input', $modal), - $selectedItemsWrap = $('#'+this.opt.selectedItemsContainer, $modal), - setDefault = self.opt.defaultOn, - applyBtnClass = self.opt.applyBtnClass, - $modalTrigger = $('#' + self.opt.modalTrigger), - DOMfilterBox = document.getElementById(self.opt.bodyId), - /** - * executed after render of modal Window - * @function - */ - afterRenderHandler = function () { - $waiter.hide(); - - }, - $waiter = $('.wait-ajax.absolute'); - - /** - * this modal window DOM Instance - * @type {*|jQuery|HTMLElement} - */ - this.$modalInst = $('#' + modalId); - - /** - * clones of tags for selected(checked) subject (powered by dna.js objects: see http://dnajs.org/) - * in modal window - * @type {Object} - */ - this.itemsSelected = {}; - /** - * clones of tags for selected(checked) subject (powered by dna.js objects: see http://dnajs.org/) - * on the page itself - * @type {Object} - */ - this.tagsBoxItems = {}; - /** - * clones of sublist of selected(checked) subject (powered by dna.js objects: see http://dnajs.org/) - * @type {Object} - */ - this.sublist = {}; - /** - * Jquery object of filtering input (autocomplete input) - * @type {*|jQuery|HTMLElement} - */ - this.$inputFilter = $('#' + self.opt.filterInputId); - /** - * label span element that contain short description for active filter - * @type {*|jQuery|HTMLElement} - */ - this.$label = $(document.getElementById(this.opt.labelId)); - - this.$selectedItemsWrap = $selectedItemsWrap; - /** - * flag for management of turn of asynchronous requests - * @type {boolean} - */ - this.isReceived = true; - - $(function () { - // topic checkbox selected event - $('.topicChecks', $subjWrap).on('change', function () { - - if ($(this).prop('checked')) { - self._setVisible($(this).val()); - - } else { - self._setUnvisible($(this).val()); - } - }); - // selected topic by default self.opt.defaultOn[] - for (index = 0; index < setDefault.length; index++) { - $topicBox = $('#' + setDefault[index]) - $topicBox.prop('checked', true); - $topicBox.trigger('change'); - - - } - //modal list and sublist behavior - $modal.on('click', 'a.trigger', function () { - var name = $(this).attr('data-name'), - id = $(this).attr('data-id'), - tmplId = $(this).attr('data-template-id'), - $sublist = $(this).siblings('.dna-container'); - // no more than once execution - if ($(this).attr('data-sub') == 'true') { - if ($(this).parent().hasClass('level1')) { - - if (!$sublist.children().length) { - $waiter.show(); - self._renderSublist({name: name, id: id}, tmplId, afterRenderHandler); - $(this).parent().addClass('active'); - } else { - //slideUp & Down stuff - self._slideToggle($sublist, $(this).parent()); - } - } - } - return false; - }); - // modal theme checkbox change behavior - $checkBox.on('change', function (event, param) { - var checkboxId = $(this).attr('id'), - $label = $(this).closest('.custom-radio-check'), - $parent = $(this).closest('.level'), - $parentCheckBox = $parent.parent().closest('.level').children('.custom-radio-check').find('.csb-menu-input'), - $sublist = $parent.children('.sublist'); - if (!param) { - - if ($label.hasClass('active')) { - $label.removeClass('active'); - } else { - $label.addClass('active'); - } - if (this.checked) { - var text = $(this).closest('.level').find('.trigger').first().text(), - tplObj = {'text': text, 'id': checkboxId}; - - //tags field logic - if (!$selectedItemsWrap.hasClass('visible')) { - $selectedItemsWrap.addClass('visible'); - } - self._addTag(checkboxId, tplObj); - - // proper selection and selection group logic - if ($sublist.length) { - $('.csb-menu-input', $sublist).each(function () { - var thisId = this.getAttribute('id'), - tagText = $(this).closest('.level').find('.trigger').first().text(), - DOMlabel = com.closest(this, 'custom-radio-check'); - - this.checked = true; - self._destroyTag(thisId); - com.addClass(DOMlabel, 'active'); - }); - - } else { - $parent = $parent.parent().closest('.level') - // if checked items count equals all items count then parent item is checked and tags for children - deleted - if ($('.csb-menu-input', $parent.find('.sublist')).length == $('.csb-menu-input:checked', $parent.find('.sublist')).length) { - var parentId = $parentCheckBox[0].getAttribute('id'), - parentText = $parentCheckBox.closest('.level').find('.trigger').first().text(), - DOMlabel = com.closest(this, 'custom-radio-check'), - DOMParentLabel = com.closest(DOMlabel.parentNode.parentNode, 'level'), - parentObj = {'text': parentText, 'id': parentId}; - $('.csb-menu-input:checked', $parent.find('.sublist')).each(function () { - - self._destroyTag(this.getAttribute('id')); - }); - $parentCheckBox.prop('checked', true); - com.addClass($(DOMParentLabel).find('.custom-radio-check')[0], 'active'); - - //$parentCheckBox.trigger('change',['true']); - self._addTag(parentId, parentObj); - } - } - - //!uncheck event - } else { - self._destroyTag(checkboxId); - if (!$selectedItemsWrap.children('.dna-clone').length) { - $selectedItemsWrap.removeClass('visible'); - - } - //uncheck all sublist items while parent item is unchecked - if ($sublist.length) { - //destroy all tags for sublist items - $('.csb-menu-input', $sublist).each(function () { - var thisId = $(this).attr('id'), - DOMlabel = com.closest(this, 'custom-radio-check'); - this.checked = false; - - com.removeClass(DOMlabel, 'active'); - self._destroyTag(thisId); - }); - $sublist.addClass('hidden'); - $parent.removeClass('active'); - } else { - // parent item is unchecked and tags for every children item are made - if ($parentCheckBox.length && $parentCheckBox[0].checked) { - var DOMlabel = com.closest($parentCheckBox[0], 'custom-radio-check'), - DOMParentItem = com.closest(DOMlabel, 'level'), - DOMSublist = DOMParentItem.querySelector('.sublist'); - $parentCheckBox.prop('checked', false); - com.removeClass(DOMlabel, 'active'); - self._destroyTag($parentCheckBox.attr('id')); - // checks children items - - $('.csb-menu-input:checked', DOMSublist).each(function () { - var id = this.getAttribute('id'), - tagText = com.closest(this, 'level').querySelector('.trigger').textContent, - tagObj = {'text': tagText, 'id': id}; - self._addTag(id, tagObj); - }); - } - } - - } - } - }); - //delete tag behavior - $('.' + self.opt.deleteTagClass, $modal).on('click', function (e) { - e.stopPropagation(); - var checkboxId = $(this).attr('data-checkbox-id'), - $uncheckBoxes = $('#' + checkboxId); - $uncheckBoxes.prop('checked', false); - $uncheckBoxes.trigger('change'); - self._refreshLabel(); - if (!$selectedItemsWrap.children('.dna-clone').length) { - $selectedItemsWrap.removeClass('visible'); - } - return false; - }); - $('.del-on-page').on('click',function () { - var dataCheckboxId = $(this).attr('data-checkbox-id'); - $('.' + self.opt.deleteTagClass+'[data-checkbox-id="'+dataCheckboxId+'"]', $modal).trigger('click'); - }); - self._autocompleteInit(); - $('.' + applyBtnClass, $modal).on('click', function () { - self.applyHandler(this); - return false; - }); - // кнопка "очистить параметры" - - $('.'+self.opt.clearAllButtonClass,$modal).on('click', function (e) { - e.preventDefault(); - self.resetList(); - return false; - }); - }); - }; - /** - * methods - * @type {{_getAjax: Function, _setVisible: Function, _setUnvisible: Function, _checkCheckBox: Function, check: Function, _autocompleteInit: Function, _renderSublist: Function, _loadParentTree: Function, _destroyTag: Function, _addTag: Function, _slideToggle: Function, resetList: Function, applyHandler: Function}} - */ - SubjectModal.prototype = { - /** - * get ajax response when want sublists - * @param {Object|sting} dataToSend - * @param {function} handler - fires after request is complete - * @private - */ - _getAjax: function (dataToSend, handler) { - var self = this; - if (!dataToSend) { - dataToSend = ''; - } - $waiter.css({display: 'block'}); - $.ajax({ - type: 'GET', - url: self.opt.ajaxUrl, - data: dataToSend, - success: function (data) { - if (typeof handler == 'function') { - $waiter.hide(); - handler(data); - } else { - return data; - - } - } - }); - }, - /** - * filter list accordingly to checked checkbox in 'select type' part of modal - * @param {string} type - * @private - */ - _setVisible: function (type) { - var self = this; - $('.' + type, self.$modalInst).addClass('visible'); - }, - /** - * filter list accordingly to checked checkbox in 'select type' part of modal - * @param {string} type - * @private - */ - _setUnvisible: function (type) { - var self = this, - $li = $('.' + type, self.$modalInst); - $li.find('input[type="checkbox"]').each(function () { - var $this = $(this); - if ($this.prop('checked')) { - $this.prop('checked', false); - $this.trigger('change'); - } - }); - $li.find('.dna-container').each(function () { - if ($(this).children().length) { - $(this).addClass('hidden'); - } - }); - $li.removeClass('visible'); - - }, - /** - * check particular checkbox input - * @param {string} id - * @param {string} name - * @private - */ - _checkCheckBox: function (id, name) { - var self = this, - $chckBox; - if (name == 'th') { - $chckBox = $('#tid_' + self.opt.prefix + id, self.$modalInst); - } else if (name == 'tg') { - $chckBox = $('#tgid_' + self.opt.prefix + id, self.$modalInst); - } - if ($chckBox.length && !$chckBox.prop('checked')) { - $chckBox.prop('checked', true); - $chckBox.trigger('change'); - } - - }, - /** - * check particular checkbox input - * @param {string} id - * @param {string} name - * @public - */ - check: function (id, name) { - var self = this, - $chckBox; - if (name == 'th') { - - $chckBox = $('#tid_' + self.opt.prefix + id, self.$modalInst); - } else if (name == 'tg') { - $chckBox = $('#tgid_' + self.opt.prefix + id, self.$modalInst); - } - if ($chckBox.length) { - $chckBox.prop('checked', true); - $chckBox.trigger('change'); - $chckBox.parent().addClass('active'); - } - - }, - /** - * initiliazing and setup autocomplete field for subject list - * @private - */ - _autocompleteInit: function () { - var self = this, dataObj, text, form = self.$inputFilter.attr('data-form'), index, - $completeWrap = $('#' + self.opt.autoCompleteId), - firstComplete = true, - selectTag = function (event, ui) { - //check of repeating execution - $waiter.show(); - var firstTime = true; - for (var prop in self.sublist) { - for (var prop2 in self.sublist[prop]) { - if (prop2 == ui.item.value) { - firstTime = false; - } - - - } - } - if ($('#tid_' + self.opt.prefix + ui.item.value + '[name="' + ui.item.name + '"]:checked').length) { - firstTime = false; - } - // ban of repeating execution - if (firstTime) { // konec - var $checkbox = $('#tid_' + self.opt.prefix + ui.item.value + '[name="' + ui.item.name + '"]'), - requestObj, requestName, - treeLoadHandler = function (data) { - // make checkboxes selected after loading - if (getObjectLength(data)) { - self._loadParentTree(data, function () { - self._checkCheckBox(ui.item.value, 'tg'); - $waiter.hide(); - }); - } else { - $waiter.hide(); - console.warn() - } - - }; - // load tree related to selected item - if (!$checkbox.length) { - - requestObj = { - id: ui.item.value, - name: ui.item.name - }; - getRequest(requestObj, self.opt.getParentUrl, treeLoadHandler); - } else { - $waiter.hide(); - $checkbox.prop('checked', true); - $checkbox.trigger('change'); - } - - } - }, - requestHandler = function (data) { - dataObj = data; - for (index = 0; index < dataObj.length; ++index) { - renameProperty(dataObj[index], 'text', 'label'); - } - for (index = 0; index < dataObj.length; ++index) { - renameProperty(dataObj[index], 'id', 'value'); - } - if (!self.$inputFilter.hasClass('ui-autocomplete-input')) { - - self.$inputFilter.placeComplete({ - source: dataObj, - minLength: 0, - appendTo: $completeWrap, - select: function (event, ui) { - self.$inputFilter.val(''); - self.$inputFilter.trigger('keyup'); - selectTag(event, ui); - event.preventDefault(); - // return ui.label; - } - }); - self.$inputFilter.placeComplete('search', ""); - firstComplete = false; - } else { - - self.$inputFilter.placeComplete('search', ""); - } - - }; - // var newData = ['banan','banan2','banan3','banan4','banan5']; - self.$inputFilter.attr('autocomplete', 'on'); - - self.$inputFilter.on('keyup', function (event) { - text = $(this).val(); - event.stopImmediatePropagation(); - - - if (text.length > 2 && firstComplete) { - getRequest({'term': text, 'form': form}, self.opt.autoCompleteUrl, requestHandler); - firstComplete = false; - } else if (text.length == 0 && !firstComplete) { - if (self.$inputFilter.hasClass('ui-autocomplete-input')) { - - self.$inputFilter.placeComplete("destroy"); - firstComplete = true; - } - } - return false; - }).click(function () { - return false; - }); - - }, - /** - * render first level sublist - * @param {Object} dataObj - * @param {number|string} tmplId - * @param {function} handler - * @private - */ - _renderSublist: function (dataObj, tmplId, handler) { - var self = this, - index = 0, - template = tmplId + '-sub', - ajaxHandler = function (data) { - if (data.length) { - - self.sublist[template] = {}; - - // for dna.clone definition see dnajs.org - for (index; index < data.length; index++) { - self.sublist[template][data[index].id] = dna.clone(tmplId, data[index]); - - } - handler(data.length); - } else { - $waiter.hide(); - } - }; - self._getAjax(dataObj, ajaxHandler); - }, - /** - * if there is no children element in list, loads list that is parent to children element - * @param {Object} data - * @param {number|string} handler - * @param {function} counter - * @private - */ - _loadParentTree: function (data, handler, counter) { - var self = this, - dataObj = data, - optObj, sublistTemplateId, nestedObj, nestedSublistTemplateId, - /** - * makes request in order to recieve children list information fires after request for parent list - * @param {number} length - * @function - */ - handlerParent = function () { - $waiter.hide(); - counter || counter === 0 ? handler(counter) : handler(); - }; - $waiter.show(); - - - optObj = { - name: dataObj.name, - id: dataObj.id - }; - sublistTemplateId = $('#tid_' + self.opt.prefix + dataObj.id).closest('.level').children('.trigger').attr('data-template-id'); - self._renderSublist(optObj, sublistTemplateId, handlerParent); - - - }, - /** - * destroy tag and clear tags block.for dna.clone definition see dnajs.org - * @param {string} checkboxId - * @private - */ - _destroyTag: function (checkboxId, outer) { - var self = this; - if (self.itemsSelected[checkboxId]) { - dna.destroy(self.itemsSelected[checkboxId]); - - } - if (self.tagsBoxItems[checkboxId]) { - dna.destroy(self.tagsBoxItems[checkboxId]); - - } - }, - /** - * for dna.clone definition see dnajs.org - * @param {number} checkboxId - * @param {Object} tplObj - * @private - */ - _addTag: function (checkboxId, tplObj) { - var self = this; - self.itemsSelected[checkboxId] = dna.clone(self.opt.selectedItemTemplate, tplObj); - self.tagsBoxItems[checkboxId] = dna.clone(self.opt.tagsBoxId, tplObj); - self._refreshLabel(); - if(getObjectLength(self.itemsSelected)){ - $(EXPO.events.feed.DOMapplyButton).show(); - $(EXPO.events.feed.DOMhint).hide(); - } - }, - /** - * hide or show sublists according active selected link - * @param {*|jQuery|HTMLElement} $sublist - * @param {*|jQuery|HTMLElement} $this - * @private - */ - _slideToggle: function ($sublist, $this) { - if ($sublist.hasClass('hidden')) { - $sublist.removeClass('hidden'); - $this.addClass('active'); - } else { - $sublist.addClass('hidden').find('ul').addClass('hidden'); - $this.removeClass('active'); - } - - }, - /** - * reset all selected items, uncheck all selected checkboxes - * @public - */ - resetList: function () { - var self = this; - for (var key in self.itemsSelected) { - if (self.itemsSelected.hasOwnProperty(key)) { - $('#'+key, self.$selfContainer).prop('checked', false).closest('.custom-radio-check').removeClass('active'); - - dna.destroy(self.itemsSelected[key]); - dna.destroy(self.tagsBoxItems[key]); - - } - } - $('.level.active',this.$modal).removeClass('active'); - this._refreshLabel(); - - this.$selectedItemsWrap.removeClass('visible'); - }, - /** - * render label text, if there is no selected element then text will be default - * @private - */ - _refreshLabel: function () { - var oLength = this.$selectedItemsWrap.children().length; - if (oLength){ - this.$label.text(this.$label.attr('data-selected')); - }else{ - this.$label.text(this.$label.attr('data-default')); - - } - }, - // кнопка применить - applyHandler: function (it) { - EXPO.events.feed.modalWindow.close(); - - }, - /** - * select particular item and render its tag and check checkbox - * @param {Object} item - * @public - */ - selectTag:function (item) { - //check of repeating execution - var firstTime = true, - self = this, - waitHandler = function () { - self.isReceived = false; - if(!item.children){ - - for (var prop in self.itemsSelected) { - if (prop == 'tid_'+ self.opt.prefix+item.id){ - firstTime = false; - } - - } - if($('#tid_'+ self.opt.prefix+item.id+':checked').length){ - firstTime = false; - } - if(firstTime){ - self.check(item.id, item.name); - self.isReceived = true; - }else{ - $('#tid_'+ self.opt.prefix + item.id).prop('checked', true); - $('#tid_'+ self.opt.prefix + item.id).trigger('change'); - self.isReceived = true; - - } - }else{ - if($('#tgid_'+ self.opt.prefix+item.children.id).length){ - firstTime = false; - } - //Если выбран родитель - if($('#tid_'+ self.opt.prefix+item.id+':checked').length){ - firstTime = false; - } - if(firstTime) { - - self._loadParentTree({name: item.name, id: item.id}, function () { - self.check(item.children.id, item.children.name); - self.isReceived = true; - - }); - }else if(!$('#tgid_'+ self.opt.prefix+item.id+':checked').length){ - - $('#tgid_'+ self.opt.prefix + item.children.id).prop('checked', true); - $('#tgid_'+ self.opt.prefix + item.children.id).trigger('change'); - self.isReceived = true; - - } - } - - }; - this.wait(waitHandler); - }, - /** - * waits so far the previous request will be executed and execute a method - * @param {function} method - * @param {Object|Array} args - * @public - */ - wait:function(method, args) { - var self = this, - waitImages, - waitHandler = function(self, method, args) { - if (self.isReceived) { - if (args) { - method(args); - } - else{ - method(); - } - clearInterval(waitImages); - } - }; - waitImages = setInterval(function() {waitHandler(self, method, args)}, 100); - } - - - }; - - /** - * Constructor for modal window 'select place' - * @param {Object} options - * @constructor - */ - var PlacesModal = function (options) { - /** - * object properties - * @type {Object} - */ - this.opt = options; - var self = this, - $modal = $('#' + self.opt.id), - $checkBox = $('input[type="checkbox"]', $modal), - $selectedItemsWrap = $('#'+this.opt.selectedItemsContainer, $modal), - DOMTagsWrapper = $('#'+this.opt.selectedItemsContainer, $modal)[0], - $modalTrigger = $('#' + self.opt.modalTrigger), - applyBtnClass = self.opt.applyBtnClass, - idPrefix = 'id_', - DOMfilterBox = document.getElementById(self.opt.bodyId), - - /** - * set trigger link text under the search field - * @function - */ - triggerSetText = function () { - var selectedString, - cutLength = 16; - }; - /** - * current template instances - * @type {Object} - */ - this.curDNA = {}; - /** - * place modal list items that had selected - * in modal window - * @type {Object} - */ - this.itemsSelected = {}; - /** - * place modal list items that had selected - * on page itself - * @type {Object} - */ - this.tagsBoxItems = {}; - this.selectedWrap = $selectedItemsWrap; - this.$selfContainer = $modal; - this.$modal = $modal; - this.idPrefix = idPrefix; - /** - * flag for management of turn of asynchronous requests - * @type {boolean} - */ - this.isReceived = true; - /** - * label span element that contain short description for active filter - * @type {*|jQuery|HTMLElement} - */ - this.$label = $(document.getElementById(this.opt.labelId)); - - /** - * Jquery object of filtering input (autocomplete input) - * @type {*|jQuery|HTMLElement} - */ - this.$inputFilter = $('#' + self.opt.filterInputId); - $(function () { - self._autocompleteInit(); - $modal.on('click', 'a.trigger', function () { - var name = $(this).attr('data-name'), - id = $(this).attr('data-id'), - that = this, - tmplId = $(this).attr('data-template-id'), - $sublist = $(this).siblings('.dna-container'), - afterRenderHandler = function (elem, data) { - var DOMParent = com.closest(that, 'level'), - DOMParentCheckbox = DOMParent.querySelector('.csb-menu-input'); - $('.csb-menu-input', $sublist).each(function () { - var DOMCheckboxWrap = com.closest(this, 'custom-radio-check'); - if (!this.selected) { - - if (DOMParentCheckbox.checked) { - this.checked = true; - com.addClass(DOMCheckboxWrap, 'active'); - } - } - }); - $waiter.hide(); - - }; - // no more than once execution - if ($(this).attr('data-sub') == 'true') { - if ($(this).parent().hasClass('level1')) { - - if (!$sublist.children().length) { - $waiter.show(); - self._renderSublist({name: name, id: id}, tmplId, afterRenderHandler); - } else { - //slideUp & Down stuff - self._slideToggle($sublist, $(this).parent()); - } - } else if ($(this).parent().hasClass('level2')) { - if (!$sublist.children().length) { - self._renderNested({name: name, id: id}, afterRenderHandler, tmplId, id); - $(this).parent().addClass('active'); - } - else { - //slideUp & Down stuff - self._slideToggle($sublist, $(this).parent()); - } - } - } - return false; - }); - - $checkBox.on('change', function (event, param) { - - var id = this.getAttribute('id'), - fakeCheckboxClass = 'custom-radio-check', - fakeCheckbox = com.closest(this, fakeCheckboxClass), - itemClass = 'level', - activeClass = 'active', - sublistClass = 'sublist', - checkboxClass = 'csb-menu-input', - highestItemClass = 'level1', - tagClass = 'csb-selected', - tagButtonClass = 'csbs-del', - triggerClass = 'trigger', - tagIdAttribute = 'data-checkbox-id', - - DOMParentRow = com.closest(this, itemClass), - - DOMParentItem = com.hasClass(DOMParentRow, highestItemClass) == false?com.closest(DOMParentRow.parentNode, itemClass):DOMParentRow, - DOMParentCheckbox = DOMParentItem.querySelector('.'+checkboxClass), - DOMSublist = DOMParentItem.querySelector('.'+sublistClass), - DOMSublistInner = DOMParentRow.querySelector('.'+sublistClass), - DOMHighestItem = com.closest(this, highestItemClass), - DOMHighestCheckbox = DOMHighestItem.querySelector('.'+checkboxClass), - DOMHighestSublist = DOMHighestItem.querySelector('.'+sublistClass), - - selectSublist = function (it) { - var DOMParentItem = com.closest(it, itemClass) || this, - DOMSublist = DOMParentItem.querySelector('.'+sublistClass); - $('.'+checkboxClass, DOMSublist).each(function () { - selectItem(this); - }); - - }, - unSelectSublist = function (it) { - var DOMParentItem = com.closest(it, itemClass) || this, - DOMSublist = DOMParentItem.querySelector('.'+sublistClass); - $('.'+checkboxClass, DOMSublist).each(function () { - unSelectItem(this); - - }); - - }, - selectParent = function (it) { - var DOMParentRow = com.closest(it, itemClass), - DOMParentItem; - if(com.hasClass(DOMParentRow,'level1')){ - DOMParentItem = DOMParentRow; - }else{ - DOMParentItem = com.closest(DOMParentRow.parentNode, itemClass); - } - - com.addClass(DOMParentItem.querySelector('.'+fakeCheckboxClass), activeClass); - DOMParentItem.querySelector('.'+checkboxClass).checked = true; - - //it.selected = true; - - }, - unSelectParent = function (it) { - var DOMParentRow = com.closest(it, itemClass), - DOMParentItem = com.closest(DOMParentRow.parentNode, itemClass) || DOMParentRow; - - com.removeClass(DOMParentItem.querySelector('.'+fakeCheckboxClass), activeClass); - DOMParentItem.querySelector('.'+checkboxClass).checked = false; - //it.checked = false; - - }, - selectItem = function (it) { - var itFakeCheckbox = com.closest(it, fakeCheckboxClass); - com.addClass(itFakeCheckbox, activeClass); - it.checked = true; - com.addClass(DOMParentItem,activeClass); - com.removeClass(DOMSublist,'hidden'); - - }, - unSelectItem = function (it) { - var itFakeCheckbox = com.closest(it, fakeCheckboxClass), - DOMitem = com.closest(it, itemClass); - com.removeClass(itFakeCheckbox, activeClass); - it.checked = false; - // if there is children items - if(DOMitem.querySelector('.'+sublistClass) && !com.hasClass(DOMitem,highestItemClass)){ - unSelectSublist(it); - } - }, - allChildrenSelected = function () { - //var DOMselected = DOMSublist.querySelectorAll('.'+checkboxClass+':checked'), - var DOMSublistParent = com.closest(DOMSublist,sublistClass), - $selected = $(DOMSublist).children('li').children('.'+fakeCheckboxClass).find('.'+checkboxClass+':checked'), - selectedCount = $selected.length, - //allCount = DOMSublist.querySelectorAll('.'+checkboxClass).length; - allCount = $(DOMSublist).children('li').children('.'+fakeCheckboxClass).find('.'+checkboxClass).length; - - if(allCount == selectedCount && selectedCount != 0){ - return true; - } else{ - return false; - } - }, - allHighestSelected = function () { - //var DOMselected = DOMSublist.querySelectorAll('.'+checkboxClass+':checked'), - var $selected = $(DOMHighestSublist).children('li').children('.'+fakeCheckboxClass).find('.'+checkboxClass+':checked'), - selectedCount = $selected.length, - allCount = $(DOMHighestSublist).children('li').children('.'+fakeCheckboxClass).find('.'+checkboxClass).length; - - if(allCount == selectedCount && selectedCount != 0){ - return true; - } else{ - return false; - } - }, - parentSelected = function () { - var parentCheckbox = DOMParentItem.querySelector('.'+checkboxClass); - if(parentCheckbox.checked){ - return true; - }else{ - return false; - } - - }, - // Функционал добавления тегов: если есть в панели выбранный элемент либо его дочерние то удалить эти эдементы; - refreshTags = function (it) { - var DOMSublist = com.closest(it,sublistClass); - var DOMItem = com.closest(it,itemClass); - var DOMSublistInner = DOMItem.querySelector('.'+sublistClass); - var DOMAllTags = DOMTagsWrapper.querySelectorAll('.'+tagClass); - var ARRsublist; - var ARRsublistChildren = DOMSublist.querySelector('.'+sublistClass)?$('.'+checkboxClass+':checked',DOMSublist.querySelector('.'+sublistClass)):null; - var ARRsublistChildrenLength = ARRsublistChildren?ARRsublistChildren.length:null; - var ARRSublistIds = []; - var ARRAllTagsIds = []; - var allTagsLength = 0; - var sublistIdsLength = 0; - var itId = it.getAttribute('id'); - var i = 0, j= 0, t= 0, tmp, k = 0; - var tagId; - var tagText = DOMParentRow.querySelector('.'+triggerClass).innerHTML; - - // если есть дочерние элементы - if(DOMSublistInner){ - ARRsublist = $(DOMSublistInner).children('li').children('.'+fakeCheckboxClass).find('.'+checkboxClass+':checked') - //получаем массив id жлементовЮ для которых есть тег - for(k; k < ARRsublist.length; k++){ - tmp = ARRsublist[k].getAttribute('id'); - ARRSublistIds.push(tmp); - } - //очистк - for(t; t 2 && firstComplete) { - $waiter.show(); - getRequest({'term': text, 'form': form}, self.opt.autoCompleteUrl, requestHandler); - firstComplete = false; - } else if (text.length == 0 && !firstComplete) { - if (self.$inputFilter.hasClass('ui-autocomplete-input')) { - - self.$inputFilter.autocomplete("destroy"); - firstComplete = true; - } - } - return false; - }).click(function () { - return false; - }); - - }, - /** - * loads and shows list tree related to selected id - * @param {Object} data - is JSON object with information about parent elements. - * @param {function} handler - callback function - * @param {number} counter - * @private - */ - _loadParentTree: function (data, handler, counter) { - var self = this, - dataObj = data, - optObj, sublistTemplateId, nestedObj, nestedSublistTemplateId, - $midleLevelCheckbox = $('#id_' + self.opt.prefix + dataObj.id), - /** - * makes request in order to recieve children list information fires after request for parent list - * @param {number} length - * @function - */ - handlerNested = function (length) { - var $checkbox = $('#id_' + self.opt.prefix + dataObj.id), - index = 0, - afterAll = function (number) { - $waiter.hide(); - index++ - if(index == number){ - - counter||counter===0?handler(counter):handler(); - } - }; - $waiter.hide(); - if ($checkbox.length && getObjectLength(self.curDNA[sublistTemplateId + '-sub']) == length) { - - nestedObj = { - name: dataObj.name, - id: dataObj.id - }; - $waiter.show(); - nestedSublistTemplateId = $('#id_' + self.opt.prefix + dataObj.id).closest('.level').children('.trigger').attr('data-template-id'); - self._renderNested(nestedObj, afterAll, nestedSublistTemplateId, dataObj.id); - } - - }, - /** - * @function - */ - handlerParent = function () { - $waiter.hide(); - counter || counter === 0 ? handler(counter) : handler(); - }; - $waiter.show(); - //if element has parent element - if (dataObj.hasOwnProperty('parent')) { - //if checbox is existed - if ($midleLevelCheckbox.length) { - nestedObj = { - name: dataObj.name, - id: dataObj.id - }; - nestedSublistTemplateId = $midleLevelCheckbox.closest('.level').children('.trigger').attr('data-template-id'); - self._renderNested(nestedObj, function () { - $waiter.hide(); - handler(); - }, nestedSublistTemplateId, dataObj.id); - } else { - - optObj = { - name: dataObj.parent.name, - id: dataObj.parent.id - }; - sublistTemplateId = $('#id_' + self.opt.prefix + dataObj.parent.id).closest('.level').children('.trigger').attr('data-template-id'); - self._renderSublist(optObj, sublistTemplateId, handlerNested); - } - - - } else { - optObj = { - name: dataObj.name, - id: dataObj.id - }; - sublistTemplateId = $('#id_' + self.opt.prefix + dataObj.id).closest('.level').children('.trigger').attr('data-template-id'); - self._renderSublist(optObj, sublistTemplateId, handlerParent); - } - - }, - applyHandler: function (it) { - EXPO.events.feed.modalWindow.close(); - }, - /** - * render label text, if there is no selected element then text will be default - * @private - */ - _refreshLabel: function () { - var oLength = this.selectedWrap.children().length; - - if (oLength){ - this.$label.text(this.$label.attr('data-selected')); - }else{ - this.$label.text(this.$label.attr('data-default')); - - } - } - }; - - /////////////////////////// - //инициализация общих свойств - that.init = function (options) { - // settings extending - $.extend(this.opt, options); - // begin of initialization - var self = this, - submitHandler = function () { - $(self.DOMform).find('input[name="~~name~~"]').remove(); - }; - if(this.opt.searchData != 'None' && this.opt.searchData){ - this.previousSearch = JSON.parse(this.opt.searchData) - - } - this.DOMform = document.getElementById(this.opt.formId); - this.DOMhint = document.getElementById(this.opt.filter.hintId); - $(this.DOMform).on('submit', function () { - submitHandler(); - }); - $.widget( "custom.placeComplete", $.ui.autocomplete,{ - _renderItem: function( ul, item ) { - return $( "
  • " ) - .append( $( "" ).text( item.label) ) - .append(' ('+item.cat+')') - .appendTo( ul ); - } - }); - this.DOMapplyButton = document.getElementById(this.opt.applyButtonId); - this.filterPane = new Filter(this.opt.filter); - $('#' + this.opt.filter.buttonId).on('click', function () { - if (com.hasClass(this, self.opt.activeClass)) { - com.removeClass(this, self.opt.activeClass); - self.filterPane.hide(); - } else { - com.addClass(this, self.opt.activeClass); - self.filterPane.show(); - } - return false; - }); - $('#'+self.opt.bodyId+' .' + self.opt.modalTriggerClass).on('click', function (event) { - event.preventDefault(); - self.modalWindow.pullData(this.getAttribute('href')); - self.modalWindow.open(); - return false; - }); - //кнопка применить - $('#'+self.opt.applyButtonId).on('click', function () { - $(self.DOMform).submit(); - return false; - }); - //modal - //модальное окно - this.modalWindow = new com.Modal(self.opt.modal); - //modal windows - this.placesModal = new PlacesModal(self.opt.place); - this.subjModal = new SubjectModal(self.opt.subject); - - // заполнение полей предыдущими значениями - $(function () { - if(self.previousSearch.inputs.length){ - $(self.DOMhint).hide(); - for (var i = 0; i < self.previousSearch.inputs.length; i++) { - // окно выбора тематики - if (self.previousSearch.inputs[i].name == 'th'){ - self.subjModal.selectTag(self.previousSearch.inputs[i]); - - // окно выбора мест - } else if (self.previousSearch.inputs[i].name == 'area'){ - - if(self.previousSearch.inputs[i].children && self.previousSearch.inputs[i].children.children){ - self.placesModal.selectTag(self.previousSearch.inputs[i].children.children); - - }else if (self.previousSearch.inputs[i].children){ - self.placesModal.selectTag(self.previousSearch.inputs[i].children); - - } else if(self.previousSearch.inputs[i]){ - self.placesModal.selectTag(self.previousSearch.inputs[i]); - - - } - } - } - - }else{ - $(self.DOMhint).fadeIn(); - } - //Если выбраны фильтры то появляется кнопка "применить" - if(getObjectLength(self.placesModal.itemsSelected) || getObjectLength(self.subjModal.itemsSelected) ){ - $(self.DOMapplyButton).show(); - - } - }); - - }; - return that; - }()); + EXPO.events.feed = (function () { + // variables + var that = {}; + + //default module setting + that.opt = {}; + //dependence's + var com = EXPO.common; + //private + var Filter = function (opt) { + this.opt = opt; + this.DOMbody = document.getElementById(opt.bodyId); + + }, + /** + * make ajax GET request and launch handler if exist or return data + * @param {Object|string} dataToSend + * @param {string} url + * @param {function} handler - function to execute when task is ready + */ + getRequest = function (dataToSend,url,handler) { + if(!dataToSend){ + dataToSend = ''; + } + $.ajax({ + type: 'GET', + url: url, + data:dataToSend, + success: function(data) { + if(typeof handler == 'function'){ + handler(data); + } else{ + return data; + } + } + }); + }, + /** + * rename name of property of an object/ Check for the old property name to avoid a ReferenceError in strict mode. + * @param {Object} obj object to rename its properties + * @param {string} oldName + * @param {string} newName + * @returns {renameProperty} + */ + renameProperty = function (obj,oldName, newName) { + if (obj.hasOwnProperty(oldName)) { + obj[newName] = obj[oldName]; + + } + return this; + }, + /** + * analogue of Array.length but for object instance + * @param {Object} obj - Object to count its method + * @returns {number} + */ + getObjectLength = function (obj) { + var size = 0, key; + for (key in obj) { + if (obj.hasOwnProperty(key)) size++; + } + return size; + }, + $waiter = $('.wait-ajax.absolute'), + Json2URI = function (jsonObj) { + var str = Object.keys(jsonObj).map(function(key){ + return encodeURIComponent(key) + '=' + encodeURIComponent(jsonObj[key]); + }).join('&'); + return ('?'+str); + }; + + // methods + Filter.prototype = { + show: function () { + //$(this.DOMbody).show(); + $(this.DOMbody).slideDown(); + }, + hide: function () { + $(this.DOMbody).hide(); + //$(this.DOMbody).slideUp(); + + } + }; + + // places and subject modals + /** + * Constructor for modal window 'select subject' + * @param {Object} options + * @constructor + */ + var SubjectModal = function (options) { + /** + * options init + * @type {Object} + */ + this.opt = options; + var self = this, index = 0, + $subjWrap = $('#' + self.opt.subjectTriggerWrapId), + $topicBox, + modalId = self.opt.id, + $modal = $('#' + modalId), + $checkBox = $('.csb-menu-input', $modal), + $selectedItemsWrap = $('#'+this.opt.selectedItemsContainer, $modal), + setDefault = self.opt.defaultOn, + applyBtnClass = self.opt.applyBtnClass, + $modalTrigger = $('#' + self.opt.modalTrigger), + DOMfilterBox = document.getElementById(self.opt.bodyId), + /** + * executed after render of modal Window + * @function + */ + afterRenderHandler = function () { + $waiter.hide(); + + }, + $waiter = $('.wait-ajax.absolute'); + + /** + * this modal window DOM Instance + * @type {*|jQuery|HTMLElement} + */ + this.$modalInst = $('#' + modalId); + + /** + * clones of tags for selected(checked) subject (powered by dna.js objects: see http://dnajs.org/) + * in modal window + * @type {Object} + */ + this.itemsSelected = {}; + /** + * clones of tags for selected(checked) subject (powered by dna.js objects: see http://dnajs.org/) + * on the page itself + * @type {Object} + */ + this.tagsBoxItems = {}; + /** + * clones of sublist of selected(checked) subject (powered by dna.js objects: see http://dnajs.org/) + * @type {Object} + */ + this.sublist = {}; + /** + * Jquery object of filtering input (autocomplete input) + * @type {*|jQuery|HTMLElement} + */ + this.$inputFilter = $('#' + self.opt.filterInputId); + /** + * label span element that contain short description for active filter + * @type {*|jQuery|HTMLElement} + */ + this.$label = $(document.getElementById(this.opt.labelId)); + + this.$selectedItemsWrap = $selectedItemsWrap; + /** + * flag for management of turn of asynchronous requests + * @type {boolean} + */ + this.isReceived = true; + + $(function () { + // topic checkbox selected event + $('.topicChecks', $subjWrap).on('change', function () { + + if ($(this).prop('checked')) { + self._setVisible($(this).val()); + + } else { + self._setUnvisible($(this).val()); + } + }); + // selected topic by default self.opt.defaultOn[] + for (index = 0; index < setDefault.length; index++) { + $topicBox = $('#' + setDefault[index]) + $topicBox.prop('checked', true); + $topicBox.trigger('change'); + + + } + //modal list and sublist behavior + $modal.on('click', 'a.trigger', function () { + var name = $(this).attr('data-name'), + id = $(this).attr('data-id'), + tmplId = $(this).attr('data-template-id'), + $sublist = $(this).siblings('.dna-container'); + // no more than once execution + if ($(this).attr('data-sub') == 'true') { + if ($(this).parent().hasClass('level1')) { + + if (!$sublist.children().length) { + $waiter.show(); + self._renderSublist({name: name, id: id}, tmplId, afterRenderHandler); + $(this).parent().addClass('active'); + } else { + //slideUp & Down stuff + self._slideToggle($sublist, $(this).parent()); + } + } + } + return false; + }); + // modal theme checkbox change behavior + $checkBox.on('change', function (event, param) { + var checkboxId = $(this).attr('id'), + $label = $(this).closest('.custom-radio-check'), + $parent = $(this).closest('.level'), + $parentCheckBox = $parent.parent().closest('.level').children('.custom-radio-check').find('.csb-menu-input'), + $sublist = $parent.children('.sublist'); + if (!param) { + + if ($label.hasClass('active')) { + $label.removeClass('active'); + } else { + $label.addClass('active'); + } + if (this.checked) { + var text = $(this).closest('.level').find('.trigger').first().text(), + tplObj = {'text': text, 'id': checkboxId}; + + //tags field logic + if (!$selectedItemsWrap.hasClass('visible')) { + $selectedItemsWrap.addClass('visible'); + } + self._addTag(checkboxId, tplObj); + + // proper selection and selection group logic + if ($sublist.length) { + $('.csb-menu-input', $sublist).each(function () { + var thisId = this.getAttribute('id'), + tagText = $(this).closest('.level').find('.trigger').first().text(), + DOMlabel = com.closest(this, 'custom-radio-check'); + + this.checked = true; + self._destroyTag(thisId); + com.addClass(DOMlabel, 'active'); + }); + + } else { + $parent = $parent.parent().closest('.level') + // if checked items count equals all items count then parent item is checked and tags for children - deleted + if ($('.csb-menu-input', $parent.find('.sublist')).length == $('.csb-menu-input:checked', $parent.find('.sublist')).length) { + var parentId = $parentCheckBox[0].getAttribute('id'), + parentText = $parentCheckBox.closest('.level').find('.trigger').first().text(), + DOMlabel = com.closest(this, 'custom-radio-check'), + DOMParentLabel = com.closest(DOMlabel.parentNode.parentNode, 'level'), + parentObj = {'text': parentText, 'id': parentId}; + $('.csb-menu-input:checked', $parent.find('.sublist')).each(function () { + + self._destroyTag(this.getAttribute('id')); + }); + $parentCheckBox.prop('checked', true); + com.addClass($(DOMParentLabel).find('.custom-radio-check')[0], 'active'); + + //$parentCheckBox.trigger('change',['true']); + self._addTag(parentId, parentObj); + } + } + + //!uncheck event + } else { + self._destroyTag(checkboxId); + if (!$selectedItemsWrap.children('.dna-clone').length) { + $selectedItemsWrap.removeClass('visible'); + + } + //uncheck all sublist items while parent item is unchecked + if ($sublist.length) { + //destroy all tags for sublist items + $('.csb-menu-input', $sublist).each(function () { + var thisId = $(this).attr('id'), + DOMlabel = com.closest(this, 'custom-radio-check'); + this.checked = false; + + com.removeClass(DOMlabel, 'active'); + self._destroyTag(thisId); + }); + $sublist.addClass('hidden'); + $parent.removeClass('active'); + } else { + // parent item is unchecked and tags for every children item are made + if ($parentCheckBox.length && $parentCheckBox[0].checked) { + var DOMlabel = com.closest($parentCheckBox[0], 'custom-radio-check'), + DOMParentItem = com.closest(DOMlabel, 'level'), + DOMSublist = DOMParentItem.querySelector('.sublist'); + $parentCheckBox.prop('checked', false); + com.removeClass(DOMlabel, 'active'); + self._destroyTag($parentCheckBox.attr('id')); + // checks children items + + $('.csb-menu-input:checked', DOMSublist).each(function () { + var id = this.getAttribute('id'), + tagText = com.closest(this, 'level').querySelector('.trigger').textContent, + tagObj = {'text': tagText, 'id': id}; + self._addTag(id, tagObj); + }); + } + } + + } + } + }); + //delete tag behavior + $('.' + self.opt.deleteTagClass, $modal).on('click', function (e) { + e.stopPropagation(); + var checkboxId = $(this).attr('data-checkbox-id'), + $uncheckBoxes = $('#' + checkboxId); + $uncheckBoxes.prop('checked', false); + $uncheckBoxes.trigger('change'); + self._refreshLabel(); + if (!$selectedItemsWrap.children('.dna-clone').length) { + $selectedItemsWrap.removeClass('visible'); + } + return false; + }); + $('.del-on-page').on('click',function () { + var dataCheckboxId = $(this).attr('data-checkbox-id'); + $('.' + self.opt.deleteTagClass+'[data-checkbox-id="'+dataCheckboxId+'"]', $modal).trigger('click'); + }); + self._autocompleteInit(); + $('.' + applyBtnClass, $modal).on('click', function () { + self.applyHandler(this); + return false; + }); + // кнопка "очистить параметры" + + $('.'+self.opt.clearAllButtonClass,$modal).on('click', function (e) { + e.preventDefault(); + self.resetList(); + return false; + }); + }); + }; + /** + * methods + * @type {{_getAjax: Function, _setVisible: Function, _setUnvisible: Function, _checkCheckBox: Function, check: Function, _autocompleteInit: Function, _renderSublist: Function, _loadParentTree: Function, _destroyTag: Function, _addTag: Function, _slideToggle: Function, resetList: Function, applyHandler: Function}} + */ + SubjectModal.prototype = { + /** + * get ajax response when want sublists + * @param {Object|sting} dataToSend + * @param {function} handler - fires after request is complete + * @private + */ + _getAjax: function (dataToSend, handler) { + var self = this; + if (!dataToSend) { + dataToSend = ''; + } + $waiter.css({display: 'block'}); + $.ajax({ + type: 'GET', + url: self.opt.ajaxUrl, + data: dataToSend, + success: function (data) { + if (typeof handler == 'function') { + $waiter.hide(); + handler(data); + } else { + return data; + + } + } + }); + }, + /** + * filter list accordingly to checked checkbox in 'select type' part of modal + * @param {string} type + * @private + */ + _setVisible: function (type) { + var self = this; + $('.' + type, self.$modalInst).addClass('visible'); + }, + /** + * filter list accordingly to checked checkbox in 'select type' part of modal + * @param {string} type + * @private + */ + _setUnvisible: function (type) { + var self = this, + $li = $('.' + type, self.$modalInst); + $li.find('input[type="checkbox"]').each(function () { + var $this = $(this); + if ($this.prop('checked')) { + $this.prop('checked', false); + $this.trigger('change'); + } + }); + $li.find('.dna-container').each(function () { + if ($(this).children().length) { + $(this).addClass('hidden'); + } + }); + $li.removeClass('visible'); + + }, + /** + * check particular checkbox input + * @param {string} id + * @param {string} name + * @private + */ + _checkCheckBox: function (id, name) { + var self = this, + $chckBox; + if (name == 'th') { + $chckBox = $('#tid_' + self.opt.prefix + id, self.$modalInst); + } else if (name == 'tg') { + $chckBox = $('#tgid_' + self.opt.prefix + id, self.$modalInst); + } + if ($chckBox.length && !$chckBox.prop('checked')) { + $chckBox.prop('checked', true); + $chckBox.trigger('change'); + } + + }, + /** + * check particular checkbox input + * @param {string} id + * @param {string} name + * @public + */ + check: function (id, name) { + var self = this, + $chckBox; + if (name == 'th') { + + $chckBox = $('#tid_' + self.opt.prefix + id, self.$modalInst); + } else if (name == 'tg') { + $chckBox = $('#tgid_' + self.opt.prefix + id, self.$modalInst); + } + if ($chckBox.length) { + $chckBox.prop('checked', true); + $chckBox.trigger('change'); + $chckBox.parent().addClass('active'); + } + + }, + /** + * initiliazing and setup autocomplete field for subject list + * @private + */ + _autocompleteInit: function () { + var self = this, dataObj, text, form = self.$inputFilter.attr('data-form'), index, + $completeWrap = $('#' + self.opt.autoCompleteId), + firstComplete = true, + selectTag = function (event, ui) { + //check of repeating execution + $waiter.show(); + var firstTime = true; + for (var prop in self.sublist) { + for (var prop2 in self.sublist[prop]) { + if (prop2 == ui.item.value) { + firstTime = false; + } + + + } + } + if ($('#tid_' + self.opt.prefix + ui.item.value + '[name="' + ui.item.name + '"]:checked').length) { + firstTime = false; + } + // ban of repeating execution + if (firstTime) { // konec + var $checkbox = $('#tid_' + self.opt.prefix + ui.item.value + '[name="' + ui.item.name + '"]'), + requestObj, requestName, + treeLoadHandler = function (data) { + // make checkboxes selected after loading + if (getObjectLength(data)) { + self._loadParentTree(data, function () { + self._checkCheckBox(ui.item.value, 'tg'); + $waiter.hide(); + }); + } else { + $waiter.hide(); + console.warn() + } + + }; + // load tree related to selected item + if (!$checkbox.length) { + + requestObj = { + id: ui.item.value, + name: ui.item.name + }; + getRequest(requestObj, self.opt.getParentUrl, treeLoadHandler); + } else { + $waiter.hide(); + $checkbox.prop('checked', true); + $checkbox.trigger('change'); + } + + } + }, + requestHandler = function (data) { + dataObj = data; + for (index = 0; index < dataObj.length; ++index) { + renameProperty(dataObj[index], 'text', 'label'); + } + for (index = 0; index < dataObj.length; ++index) { + renameProperty(dataObj[index], 'id', 'value'); + } + if (!self.$inputFilter.hasClass('ui-autocomplete-input')) { + + self.$inputFilter.placeComplete({ + source: dataObj, + minLength: 0, + appendTo: $completeWrap, + select: function (event, ui) { + self.$inputFilter.val(''); + self.$inputFilter.trigger('keyup'); + selectTag(event, ui); + event.preventDefault(); + // return ui.label; + } + }); + self.$inputFilter.placeComplete('search', ""); + firstComplete = false; + } else { + + self.$inputFilter.placeComplete('search', ""); + } + + }; + // var newData = ['banan','banan2','banan3','banan4','banan5']; + self.$inputFilter.attr('autocomplete', 'on'); + + self.$inputFilter.on('keyup', function (event) { + text = $(this).val(); + event.stopImmediatePropagation(); + + + if (text.length > 2 && firstComplete) { + getRequest({'term': text, 'form': form}, self.opt.autoCompleteUrl, requestHandler); + firstComplete = false; + } else if (text.length == 0 && !firstComplete) { + if (self.$inputFilter.hasClass('ui-autocomplete-input')) { + + self.$inputFilter.placeComplete("destroy"); + firstComplete = true; + } + } + return false; + }).click(function () { + return false; + }); + + }, + /** + * render first level sublist + * @param {Object} dataObj + * @param {number|string} tmplId + * @param {function} handler + * @private + */ + _renderSublist: function (dataObj, tmplId, handler) { + var self = this, + index = 0, + template = tmplId + '-sub', + ajaxHandler = function (data) { + if (data.length) { + + self.sublist[template] = {}; + + // for dna.clone definition see dnajs.org + for (index; index < data.length; index++) { + self.sublist[template][data[index].id] = dna.clone(tmplId, data[index]); + + } + handler(data.length); + } else { + $waiter.hide(); + } + }; + self._getAjax(dataObj, ajaxHandler); + }, + /** + * if there is no children element in list, loads list that is parent to children element + * @param {Object} data + * @param {number|string} handler + * @param {function} counter + * @private + */ + _loadParentTree: function (data, handler, counter) { + var self = this, + dataObj = data, + optObj, sublistTemplateId, nestedObj, nestedSublistTemplateId, + /** + * makes request in order to recieve children list information fires after request for parent list + * @param {number} length + * @function + */ + handlerParent = function () { + $waiter.hide(); + counter || counter === 0 ? handler(counter) : handler(); + }; + $waiter.show(); + + + optObj = { + name: dataObj.name, + id: dataObj.id + }; + sublistTemplateId = $('#tid_' + self.opt.prefix + dataObj.id).closest('.level').children('.trigger').attr('data-template-id'); + self._renderSublist(optObj, sublistTemplateId, handlerParent); + + + }, + /** + * destroy tag and clear tags block.for dna.clone definition see dnajs.org + * @param {string} checkboxId + * @private + */ + _destroyTag: function (checkboxId, outer) { + var self = this; + if (self.itemsSelected[checkboxId]) { + dna.destroy(self.itemsSelected[checkboxId]); + + } + if (self.tagsBoxItems[checkboxId]) { + dna.destroy(self.tagsBoxItems[checkboxId]); + + } + }, + /** + * for dna.clone definition see dnajs.org + * @param {number} checkboxId + * @param {Object} tplObj + * @private + */ + _addTag: function (checkboxId, tplObj) { + var self = this; + self.itemsSelected[checkboxId] = dna.clone(self.opt.selectedItemTemplate, tplObj); + self.tagsBoxItems[checkboxId] = dna.clone(self.opt.tagsBoxId, tplObj); + self._refreshLabel(); + if(getObjectLength(self.itemsSelected)){ + $(EXPO.events.feed.DOMapplyButton).show(); + $(EXPO.events.feed.DOMhint).hide(); + } + }, + /** + * hide or show sublists according active selected link + * @param {*|jQuery|HTMLElement} $sublist + * @param {*|jQuery|HTMLElement} $this + * @private + */ + _slideToggle: function ($sublist, $this) { + if ($sublist.hasClass('hidden')) { + $sublist.removeClass('hidden'); + $this.addClass('active'); + } else { + $sublist.addClass('hidden').find('ul').addClass('hidden'); + $this.removeClass('active'); + } + + }, + /** + * reset all selected items, uncheck all selected checkboxes + * @public + */ + resetList: function () { + var self = this; + for (var key in self.itemsSelected) { + if (self.itemsSelected.hasOwnProperty(key)) { + $('#'+key, self.$selfContainer).prop('checked', false).closest('.custom-radio-check').removeClass('active'); + + dna.destroy(self.itemsSelected[key]); + dna.destroy(self.tagsBoxItems[key]); + + } + } + $('.level.active',this.$modal).removeClass('active'); + this._refreshLabel(); + + this.$selectedItemsWrap.removeClass('visible'); + }, + /** + * render label text, if there is no selected element then text will be default + * @private + */ + _refreshLabel: function () { + var oLength = this.$selectedItemsWrap.children().length; + if (oLength){ + this.$label.text(this.$label.attr('data-selected')); + }else{ + this.$label.text(this.$label.attr('data-default')); + + } + }, + // кнопка применить + applyHandler: function (it) { + EXPO.events.feed.modalWindow.close(); + + }, + /** + * select particular item and render its tag and check checkbox + * @param {Object} item + * @public + */ + selectTag:function (item) { + //check of repeating execution + var firstTime = true, + self = this, + waitHandler = function () { + self.isReceived = false; + if(!item.children){ + + for (var prop in self.itemsSelected) { + if (prop == 'tid_'+ self.opt.prefix+item.id){ + firstTime = false; + } + + } + if($('#tid_'+ self.opt.prefix+item.id+':checked').length){ + firstTime = false; + } + if(firstTime){ + self.check(item.id, item.name); + self.isReceived = true; + }else{ + $('#tid_'+ self.opt.prefix + item.id).prop('checked', true); + $('#tid_'+ self.opt.prefix + item.id).trigger('change'); + self.isReceived = true; + + } + }else{ + if($('#tgid_'+ self.opt.prefix+item.children.id).length){ + firstTime = false; + } + //Если выбран родитель + if($('#tid_'+ self.opt.prefix+item.id+':checked').length){ + firstTime = false; + } + if(firstTime) { + + self._loadParentTree({name: item.name, id: item.id}, function () { + self.check(item.children.id, item.children.name); + self.isReceived = true; + + }); + }else if(!$('#tgid_'+ self.opt.prefix+item.id+':checked').length){ + + $('#tgid_'+ self.opt.prefix + item.children.id).prop('checked', true); + $('#tgid_'+ self.opt.prefix + item.children.id).trigger('change'); + self.isReceived = true; + + } + } + + }; + this.wait(waitHandler); + }, + /** + * waits so far the previous request will be executed and execute a method + * @param {function} method + * @param {Object|Array} args + * @public + */ + wait:function(method, args) { + var self = this, + waitImages, + waitHandler = function(self, method, args) { + if (self.isReceived) { + if (args) { + method(args); + } + else{ + method(); + } + clearInterval(waitImages); + } + }; + waitImages = setInterval(function() {waitHandler(self, method, args)}, 100); + } + + + }; + + /** + * Constructor for modal window 'select place' + * @param {Object} options + * @constructor + */ + var PlacesModal = function (options) { + /** + * object properties + * @type {Object} + */ + this.opt = options; + var self = this, + $modal = $('#' + self.opt.id), + $checkBox = $('input[type="checkbox"]', $modal), + $selectedItemsWrap = $('#'+this.opt.selectedItemsContainer, $modal), + DOMTagsWrapper = $('#'+this.opt.selectedItemsContainer, $modal)[0], + $modalTrigger = $('#' + self.opt.modalTrigger), + applyBtnClass = self.opt.applyBtnClass, + idPrefix = 'id_', + DOMfilterBox = document.getElementById(self.opt.bodyId), + + /** + * set trigger link text under the search field + * @function + */ + triggerSetText = function () { + var selectedString, + cutLength = 16; + }; + /** + * current template instances + * @type {Object} + */ + this.curDNA = {}; + /** + * place modal list items that had selected + * in modal window + * @type {Object} + */ + this.itemsSelected = {}; + /** + * place modal list items that had selected + * on page itself + * @type {Object} + */ + this.tagsBoxItems = {}; + this.selectedWrap = $selectedItemsWrap; + this.$selfContainer = $modal; + this.$modal = $modal; + this.idPrefix = idPrefix; + /** + * flag for management of turn of asynchronous requests + * @type {boolean} + */ + this.isReceived = true; + /** + * label span element that contain short description for active filter + * @type {*|jQuery|HTMLElement} + */ + this.$label = $(document.getElementById(this.opt.labelId)); + + /** + * Jquery object of filtering input (autocomplete input) + * @type {*|jQuery|HTMLElement} + */ + this.$inputFilter = $('#' + self.opt.filterInputId); + $(function () { + self._autocompleteInit(); + $modal.on('click', 'a.trigger', function () { + var name = $(this).attr('data-name'), + id = $(this).attr('data-id'), + that = this, + tmplId = $(this).attr('data-template-id'), + $sublist = $(this).siblings('.dna-container'), + afterRenderHandler = function (elem, data) { + var DOMParent = com.closest(that, 'level'), + DOMParentCheckbox = DOMParent.querySelector('.csb-menu-input'); + $('.csb-menu-input', $sublist).each(function () { + var DOMCheckboxWrap = com.closest(this, 'custom-radio-check'); + if (!this.selected) { + + if (DOMParentCheckbox.checked) { + this.checked = true; + com.addClass(DOMCheckboxWrap, 'active'); + } + } + }); + $waiter.hide(); + + }; + // no more than once execution + if ($(this).attr('data-sub') == 'true') { + if ($(this).parent().hasClass('level1')) { + + if (!$sublist.children().length) { + $waiter.show(); + self._renderSublist({name: name, id: id}, tmplId, afterRenderHandler); + } else { + //slideUp & Down stuff + self._slideToggle($sublist, $(this).parent()); + } + } else if ($(this).parent().hasClass('level2')) { + if (!$sublist.children().length) { + self._renderNested({name: name, id: id}, afterRenderHandler, tmplId, id); + $(this).parent().addClass('active'); + } + else { + //slideUp & Down stuff + self._slideToggle($sublist, $(this).parent()); + } + } + } + return false; + }); + + $checkBox.on('change', function (event, param) { + + var id = this.getAttribute('id'), + fakeCheckboxClass = 'custom-radio-check', + fakeCheckbox = com.closest(this, fakeCheckboxClass), + itemClass = 'level', + activeClass = 'active', + sublistClass = 'sublist', + checkboxClass = 'csb-menu-input', + highestItemClass = 'level1', + tagClass = 'csb-selected', + tagButtonClass = 'csbs-del', + triggerClass = 'trigger', + tagIdAttribute = 'data-checkbox-id', + + DOMParentRow = com.closest(this, itemClass), + + DOMParentItem = com.hasClass(DOMParentRow, highestItemClass) == false?com.closest(DOMParentRow.parentNode, itemClass):DOMParentRow, + DOMParentCheckbox = DOMParentItem.querySelector('.'+checkboxClass), + DOMSublist = DOMParentItem.querySelector('.'+sublistClass), + DOMSublistInner = DOMParentRow.querySelector('.'+sublistClass), + DOMHighestItem = com.closest(this, highestItemClass), + DOMHighestCheckbox = DOMHighestItem.querySelector('.'+checkboxClass), + DOMHighestSublist = DOMHighestItem.querySelector('.'+sublistClass), + + selectSublist = function (it) { + var DOMParentItem = com.closest(it, itemClass) || this, + DOMSublist = DOMParentItem.querySelector('.'+sublistClass); + $('.'+checkboxClass, DOMSublist).each(function () { + selectItem(this); + }); + + }, + unSelectSublist = function (it) { + var DOMParentItem = com.closest(it, itemClass) || this, + DOMSublist = DOMParentItem.querySelector('.'+sublistClass); + $('.'+checkboxClass, DOMSublist).each(function () { + unSelectItem(this); + + }); + + }, + selectParent = function (it) { + var DOMParentRow = com.closest(it, itemClass), + DOMParentItem; + if(com.hasClass(DOMParentRow,'level1')){ + DOMParentItem = DOMParentRow; + }else{ + DOMParentItem = com.closest(DOMParentRow.parentNode, itemClass); + } + + com.addClass(DOMParentItem.querySelector('.'+fakeCheckboxClass), activeClass); + DOMParentItem.querySelector('.'+checkboxClass).checked = true; + + //it.selected = true; + + }, + unSelectParent = function (it) { + var DOMParentRow = com.closest(it, itemClass), + DOMParentItem = com.closest(DOMParentRow.parentNode, itemClass) || DOMParentRow; + + com.removeClass(DOMParentItem.querySelector('.'+fakeCheckboxClass), activeClass); + DOMParentItem.querySelector('.'+checkboxClass).checked = false; + //it.checked = false; + + }, + selectItem = function (it) { + var itFakeCheckbox = com.closest(it, fakeCheckboxClass); + com.addClass(itFakeCheckbox, activeClass); + it.checked = true; + com.addClass(DOMParentItem,activeClass); + com.removeClass(DOMSublist,'hidden'); + + }, + unSelectItem = function (it) { + var itFakeCheckbox = com.closest(it, fakeCheckboxClass), + DOMitem = com.closest(it, itemClass); + com.removeClass(itFakeCheckbox, activeClass); + it.checked = false; + // if there is children items + if(DOMitem.querySelector('.'+sublistClass) && !com.hasClass(DOMitem,highestItemClass)){ + unSelectSublist(it); + } + }, + allChildrenSelected = function () { + //var DOMselected = DOMSublist.querySelectorAll('.'+checkboxClass+':checked'), + var DOMSublistParent = com.closest(DOMSublist,sublistClass), + $selected = $(DOMSublist).children('li').children('.'+fakeCheckboxClass).find('.'+checkboxClass+':checked'), + selectedCount = $selected.length, + //allCount = DOMSublist.querySelectorAll('.'+checkboxClass).length; + allCount = $(DOMSublist).children('li').children('.'+fakeCheckboxClass).find('.'+checkboxClass).length; + + if(allCount == selectedCount && selectedCount != 0){ + return true; + } else{ + return false; + } + }, + allHighestSelected = function () { + //var DOMselected = DOMSublist.querySelectorAll('.'+checkboxClass+':checked'), + var $selected = $(DOMHighestSublist).children('li').children('.'+fakeCheckboxClass).find('.'+checkboxClass+':checked'), + selectedCount = $selected.length, + allCount = $(DOMHighestSublist).children('li').children('.'+fakeCheckboxClass).find('.'+checkboxClass).length; + + if(allCount == selectedCount && selectedCount != 0){ + return true; + } else{ + return false; + } + }, + parentSelected = function () { + var parentCheckbox = DOMParentItem.querySelector('.'+checkboxClass); + if(parentCheckbox.checked){ + return true; + }else{ + return false; + } + + }, + // Функционал добавления тегов: если есть в панели выбранный элемент либо его дочерние то удалить эти эдементы; + refreshTags = function (it) { + var DOMSublist = com.closest(it,sublistClass); + var DOMItem = com.closest(it,itemClass); + var DOMSublistInner = DOMItem.querySelector('.'+sublistClass); + var DOMAllTags = DOMTagsWrapper.querySelectorAll('.'+tagClass); + var ARRsublist; + var ARRsublistChildren = DOMSublist.querySelector('.'+sublistClass)?$('.'+checkboxClass+':checked',DOMSublist.querySelector('.'+sublistClass)):null; + var ARRsublistChildrenLength = ARRsublistChildren?ARRsublistChildren.length:null; + var ARRSublistIds = []; + var ARRAllTagsIds = []; + var allTagsLength = 0; + var sublistIdsLength = 0; + var itId = it.getAttribute('id'); + var i = 0, j= 0, t= 0, tmp, k = 0; + var tagId; + var tagText = DOMParentRow.querySelector('.'+triggerClass).innerHTML; + + // если есть дочерние элементы + if(DOMSublistInner){ + ARRsublist = $(DOMSublistInner).children('li').children('.'+fakeCheckboxClass).find('.'+checkboxClass+':checked') + //получаем массив id жлементовЮ для которых есть тег + for(k; k < ARRsublist.length; k++){ + tmp = ARRsublist[k].getAttribute('id'); + ARRSublistIds.push(tmp); + } + //очистк + for(t; t 2 && firstComplete) { + $waiter.show(); + getRequest({'term': text, 'form': form}, self.opt.autoCompleteUrl, requestHandler); + firstComplete = false; + } else if (text.length == 0 && !firstComplete) { + if (self.$inputFilter.hasClass('ui-autocomplete-input')) { + + self.$inputFilter.autocomplete("destroy"); + firstComplete = true; + } + } + return false; + }).click(function () { + return false; + }); + + }, + /** + * loads and shows list tree related to selected id + * @param {Object} data - is JSON object with information about parent elements. + * @param {function} handler - callback function + * @param {number} counter + * @private + */ + _loadParentTree: function (data, handler, counter) { + var self = this, + dataObj = data, + optObj, sublistTemplateId, nestedObj, nestedSublistTemplateId, + $midleLevelCheckbox = $('#id_' + self.opt.prefix + dataObj.id), + /** + * makes request in order to recieve children list information fires after request for parent list + * @param {number} length + * @function + */ + handlerNested = function (length) { + var $checkbox = $('#id_' + self.opt.prefix + dataObj.id), + index = 0, + afterAll = function (number) { + $waiter.hide(); + index++ + if(index == number){ + + counter||counter===0?handler(counter):handler(); + } + }; + $waiter.hide(); + if ($checkbox.length && getObjectLength(self.curDNA[sublistTemplateId + '-sub']) == length) { + + nestedObj = { + name: dataObj.name, + id: dataObj.id + }; + $waiter.show(); + nestedSublistTemplateId = $('#id_' + self.opt.prefix + dataObj.id).closest('.level').children('.trigger').attr('data-template-id'); + self._renderNested(nestedObj, afterAll, nestedSublistTemplateId, dataObj.id); + } + + }, + /** + * @function + */ + handlerParent = function () { + $waiter.hide(); + counter || counter === 0 ? handler(counter) : handler(); + }; + $waiter.show(); + //if element has parent element + if (dataObj.hasOwnProperty('parent')) { + //if checbox is existed + if ($midleLevelCheckbox.length) { + nestedObj = { + name: dataObj.name, + id: dataObj.id + }; + nestedSublistTemplateId = $midleLevelCheckbox.closest('.level').children('.trigger').attr('data-template-id'); + self._renderNested(nestedObj, function () { + $waiter.hide(); + handler(); + }, nestedSublistTemplateId, dataObj.id); + } else { + + optObj = { + name: dataObj.parent.name, + id: dataObj.parent.id + }; + sublistTemplateId = $('#id_' + self.opt.prefix + dataObj.parent.id).closest('.level').children('.trigger').attr('data-template-id'); + self._renderSublist(optObj, sublistTemplateId, handlerNested); + } + + + } else { + optObj = { + name: dataObj.name, + id: dataObj.id + }; + sublistTemplateId = $('#id_' + self.opt.prefix + dataObj.id).closest('.level').children('.trigger').attr('data-template-id'); + self._renderSublist(optObj, sublistTemplateId, handlerParent); + } + + }, + applyHandler: function (it) { + EXPO.events.feed.modalWindow.close(); + }, + /** + * render label text, if there is no selected element then text will be default + * @private + */ + _refreshLabel: function () { + var oLength = this.selectedWrap.children().length; + + if (oLength){ + this.$label.text(this.$label.attr('data-selected')); + }else{ + this.$label.text(this.$label.attr('data-default')); + + } + } + }; + + /////////////////////////// + //инициализация общих свойств + that.init = function (options) { + // settings extending + $.extend(this.opt, options); + // begin of initialization + var self = this, + submitHandler = function () { + $(self.DOMform).find('input[name="~~name~~"]').remove(); + }; + if(this.opt.searchData != 'None' && this.opt.searchData){ + this.previousSearch = JSON.parse(this.opt.searchData) + + } + this.DOMform = document.getElementById(this.opt.formId); + this.DOMhint = document.getElementById(this.opt.filter.hintId); + $(this.DOMform).on('submit', function () { + submitHandler(); + }); + $.widget( "custom.placeComplete", $.ui.autocomplete,{ + _renderItem: function( ul, item ) { + return $( "
  • " ) + .append( $( "" ).text( item.label) ) + .append(' ('+item.cat+')') + .appendTo( ul ); + } + }); + this.DOMapplyButton = document.getElementById(this.opt.applyButtonId); + this.filterPane = new Filter(this.opt.filter); + $('#' + this.opt.filter.buttonId).on('click', function () { + if (com.hasClass(this, self.opt.activeClass)) { + com.removeClass(this, self.opt.activeClass); + self.filterPane.hide(); + } else { + com.addClass(this, self.opt.activeClass); + self.filterPane.show(); + } + return false; + }); + $('#'+self.opt.bodyId+' .' + self.opt.modalTriggerClass).on('click', function (event) { + event.preventDefault(); + self.modalWindow.pullData(this.getAttribute('href')); + self.modalWindow.open(); + return false; + }); + //кнопка применить + $('#'+self.opt.applyButtonId).on('click', function () { + $(self.DOMform).submit(); + return false; + }); + //modal + //модальное окно + this.modalWindow = new com.Modal(self.opt.modal); + //modal windows + this.placesModal = new PlacesModal(self.opt.place); + this.subjModal = new SubjectModal(self.opt.subject); + + // заполнение полей предыдущими значениями + $(function () { + if(self.previousSearch.inputs.length){ + $(self.DOMhint).hide(); + for (var i = 0; i < self.previousSearch.inputs.length; i++) { + // окно выбора тематики + if (self.previousSearch.inputs[i].name == 'th'){ + self.subjModal.selectTag(self.previousSearch.inputs[i]); + + // окно выбора мест + } else if (self.previousSearch.inputs[i].name == 'area'){ + + if(self.previousSearch.inputs[i].children && self.previousSearch.inputs[i].children.children){ + self.placesModal.selectTag(self.previousSearch.inputs[i].children.children); + + }else if (self.previousSearch.inputs[i].children){ + self.placesModal.selectTag(self.previousSearch.inputs[i].children); + + } else if(self.previousSearch.inputs[i]){ + self.placesModal.selectTag(self.previousSearch.inputs[i]); + + + } + } + } + + }else{ + $(self.DOMhint).fadeIn(); + } + //Если выбраны фильтры то появляется кнопка "применить" + if(getObjectLength(self.placesModal.itemsSelected) || getObjectLength(self.subjModal.itemsSelected) ){ + $(self.DOMapplyButton).show(); + + } + }); + + }; + return that; + }()); } diff --git a/static/client/js/_modules/page.exposition.object.js b/static/client/js/_modules/page.exposition.object.js index 1e81b9de..4f6b8437 100644 --- a/static/client/js/_modules/page.exposition.object.js +++ b/static/client/js/_modules/page.exposition.object.js @@ -1,202 +1,154 @@ var EXPO = EXPO || {}; //isolated namespace EXPO.exposition = EXPO.exposition || {}; if (EXPO.exposition.object){ - console.warn('WARNING: EXPO.exposition.object is already defined!'); + console.warn('WARNING: EXPO.exposition.object is already defined!'); }else { - EXPO.exposition.object = (function () { + EXPO.exposition.object = (function () { // dependencies - var com = EXPO.common, - $waiter; + var com = EXPO.common, + $waiter; // variables - var that = {}, - Note = function (it, opt) { - this.opt = opt; - this.DOMthis = it; - this.DOMbutton = it.querySelector('.'+opt.buttonClass); - this.DOMinput = it.querySelector('.'+opt.inputClass); - this.inputName = this.DOMinput.getAttribute('name'); - this.url = this.DOMbutton.getAttribute('href'); - this._controller(); - }; - Note.prototype = { - _init: function () { - - }, - _controller: function () { - var self = this; - $(this.DOMinput).on('blur', function () { - self.send(); - }); - $(this.DOMbutton).on('click', function () { - return false; - }); - }, - send: function () { - var data = {}, - response, - self = this, - handler = function (data) { - if (data.success){ - console.log('ok'); - $(self.DOMbutton).addClass('active'); - }else{ - console.log('data not send'); - } - - }; - data[this.inputName] = this.DOMinput.value; - response = com.getRequest(data,this.url,handler); - } - }; - that.opt = {}; //свойства по умолчанию + var that = {}; + that.opt = {}; //свойства по умолчанию //private - $(function () { - $waiter = $('#wait-ajax:not(.absolute)').css({'z-index': '8031'}); - }); + $(function () { + $waiter = $('#wait-ajax:not(.absolute)').css({'z-index': '8031'}); + }); // methods - //инициализация общих свойств - that.init = function (options) { - $.extend(this.opt, options); - var self = this, - $visitButtons = $('.'+this.opt.visit.activeClass+', .'+this.opt.visit.passiveClass); - this.notes = []; - - $('.'+this.opt.note.wrapClass).each(function () { - var note = new Note(this,self.opt.note); - self.notes.push(note); - }); - $('.'+this.opt.note.wrapDisabledClass).on('click', function () { - $.fancybox.open('#pw-login'); - return false; - }); - com.opt.addCalendarText = this.opt.addCalendarText; - com.opt.removeCalendarText = this.opt.removeCalendarText; - /** - * visit buttons - */ - $visitButtons.off('click'); - $visitButtons.on('click', function () { - if ($(this).hasClass(self.opt.visit.activeClass)){ - - /** - * I plan to visit - */ - $('.'+self.opt.visit.activeClass).hide().siblings('.'+self.opt.visit.passiveClass).show(); - - $('#'+self.opt.visit.visitorsListId).append(self.opt.visit.currentHtml); - $('#'+self.opt.visit.somebodyId).removeClass("hidden"); - $('#'+self.opt.visit.nobodyId).addClass("hidden"); - - - }else{ - /** - * refuse to visit - */ - $('.'+self.opt.visit.passiveClass).hide().siblings('.'+self.opt.visit.activeClass).show(); - $('#'+self.opt.visit.visitorsListId).children(".current").remove(); - - if($('#'+self.opt.visit.visitorsListId).children().length == 0){ - - $('#'+self.opt.visit.somebodyId).addClass("hidden"); - $('#'+self.opt.visit.nobodyId).removeClass("hidden"); - } - - } - return false; - }); - /** - * advertise form validation - */ - $('#'+this.opt.advertise.id).on("submit", function () { - var formData = $(this).serialize(), - formUrl = $(this).attr("action"), - $form = $(this), - /** - * executes after AJAX get request is complete - * @param data - data recieved from server ex - */ - handler = function (data) { - var clearValue = function () { - $('.err',$form).removeClass("err"); - $('.pwf-msg',$form).text(''); - }; - if (data.success != true){ - clearValue(); - for (var k in data.errors){ - if (data.errors.hasOwnProperty(k)) { - $('input[name="'+k+'"]',$form) - .closest(".required").addClass("err") - .siblings(".pwf-msg").text(data.errors[k]); - } - } - - }else{ - clearValue(); + //инициализация общих свойств + that.init = function (options) { + $.extend(this.opt, options); + var self = this, + $visitButtons = $('.'+this.opt.visit.activeClass+', .'+this.opt.visit.passiveClass); + + com.opt.addCalendarText = this.opt.addCalendarText; + com.opt.removeCalendarText = this.opt.removeCalendarText; + /** + * visit buttons + */ + $visitButtons.off('click'); + $visitButtons.on('click', function () { + if ($(this).hasClass(self.opt.visit.activeClass)){ + + /** + * I plan to visit + */ + $('.'+self.opt.visit.activeClass).hide().siblings('.'+self.opt.visit.passiveClass).show(); + + $('#'+self.opt.visit.visitorsListId).append(self.opt.visit.currentHtml); + $('#'+self.opt.visit.somebodyId).removeClass("hidden"); + $('#'+self.opt.visit.nobodyId).addClass("hidden"); + + + }else{ + /** + * refuse to visit + */ + $('.'+self.opt.visit.passiveClass).hide().siblings('.'+self.opt.visit.activeClass).show(); + $('#'+self.opt.visit.visitorsListId).children(".current").remove(); + + if($('#'+self.opt.visit.visitorsListId).children().length == 0){ + + $('#'+self.opt.visit.somebodyId).addClass("hidden"); + $('#'+self.opt.visit.nobodyId).removeClass("hidden"); + } + + } + return false; + }); + /** + * advertise form validation + */ + $('#'+this.opt.advertise.id).on("submit", function () { + var formData = $(this).serialize(), + formUrl = $(this).attr("action"), + $form = $(this), + /** + * executes after AJAX get request is complete + * @param data - data recieved from server ex + */ + handler = function (data) { + var clearValue = function () { + $('.err',$form).removeClass("err"); + $('.pwf-msg',$form).text(''); + }; + if (data.success !== true){ + clearValue(); + for (var k in data.errors){ + if (data.errors.hasOwnProperty(k)) { + $('input[name="'+k+'"]',$form) + .closest(".required").addClass("err") + .siblings(".pwf-msg").text(data.errors[k]); + } + } + + }else{ + clearValue(); dataLayer.push({'event': 'advmemberform'}); - $('input:text',$form).val(''); - $.fancybox.close(); - - } - $waiter.hide(); - }; - $waiter.show(); - com.postRequest(formData,formUrl,handler); - return false; - }); - - /** - * event news subscribe form validation - */ - $('#'+this.opt.event_news_subscribe.id).on("submit", function () { - var formData = $(this).serialize(), - formUrl = $(this).attr("action"), - $form = $(this), - /** - * executes after AJAX get request is complete - * @param data - data recieved from server ex - */ - handler = function (data) { - var clearValue = function () { - $('.err',$form).removeClass("err"); - $('.pwf-msg',$form).text(''); - }; - if (data.success != true){ - clearValue(); - for (var k in data.errors){ - console.log(data.errors.hasOwnProperty(k)); - console.log(k); - if (data.errors.hasOwnProperty(k)) { - $('input[name="'+k+'"]',$form) - .closest(".required").addClass("err") - .siblings(".pwf-msg").text(data.errors[k]); - } - } - - }else{ - clearValue(); + $('input:text',$form).val(''); + $.fancybox.close(); + + } + $waiter.hide(); + }; + $waiter.show(); + com.postRequest(formData,formUrl,handler); + return false; + }); + + /** + * event news subscribe form validation + */ + $('#'+this.opt.event_news_subscribe.id).on("submit", function () { + var formData = $(this).serialize(), + formUrl = $(this).attr("action"), + $form = $(this), + /** + * executes after AJAX get request is complete + * @param data - data recieved from server ex + */ + handler = function (data) { + var clearValue = function () { + $('.err',$form).removeClass("err"); + $('.pwf-msg',$form).text(''); + }; + if (data.success != true){ + clearValue(); + for (var k in data.errors){ + console.log(data.errors.hasOwnProperty(k)); + console.log(k); + if (data.errors.hasOwnProperty(k)) { + $('input[name="'+k+'"]',$form) + .closest(".required").addClass("err") + .siblings(".pwf-msg").text(data.errors[k]); + } + } + + }else{ + clearValue(); dataLayer.push({'event': 'event-news-subscribe-form'}); - $('input:text',$form).val(''); - $('p#success').show(); - if (data.sent == true) { - window.location = data.redirect_url; - } else { - window.setTimeout(function () { - $.fancybox.close(); - }, 1000); - } - - - } - $waiter.hide(); - }; - $waiter.show(); - com.postRequest(formData,formUrl,handler); - return false; - }); - - }; - return that; - }()); + $('input:text',$form).val(''); + $('p#success').show(); + if (data.sent == true) { + window.location = data.redirect_url; + } else { + window.setTimeout(function () { + $.fancybox.close(); + }, 1000); + } + + + } + $waiter.hide(); + }; + $waiter.show(); + com.postRequest(formData,formUrl,handler); + return false; + }); + + }; + return that; + }()); } diff --git a/static/client/js/_modules/page.index.js b/static/client/js/_modules/page.index.js deleted file mode 100644 index bc5725a2..00000000 --- a/static/client/js/_modules/page.index.js +++ /dev/null @@ -1,74 +0,0 @@ -var EXPO = EXPO || {}; //isolated namespace -if (EXPO.index) { - console.warn('WARNING: EXPO.eventsFeed is already defined!'); -} else { - EXPO.index = (function () { - // variables - var that = {}; - - //default module setting - that.opt = {}; - //dependence's - var com = EXPO.common; - //private - var Note = function (it, opt) { - this.opt = opt; - this.DOMthis = it; - this.DOMbutton = it.querySelector('.'+opt.buttonClass); - this.DOMinput = it.querySelector('.'+opt.inputClass); - this.inputName = this.DOMinput.getAttribute('name'); - this.url = this.DOMbutton.getAttribute('href'); - this._controller(); - }; - Note.prototype = { - _init: function () { - - }, - _controller: function () { - var self = this; - $(this.DOMinput).on('blur', function () { - self.send(); - }); - $(this.DOMbutton).on('click', function () { - return false; - }); - }, - send: function () { - var data = {}, - response, - self = this, - handler = function (data) { - if (data.success){ - console.log('ok'); - $(self.DOMbutton).addClass('active'); - }else{ - console.log('data not send'); - } - - }; - data[this.inputName] = this.DOMinput.value; - response = com.getRequest(data,this.url,handler); - } - }; - - /////////////////////////// - //инициализация общих свойств - that.init = function (options) { - // settings extending - $.extend(this.opt, options); - // begin of initialization - var self = this; - this.notes = []; - $('.'+this.opt.note.wrapClass).each(function () { - var note = new Note(this,self.opt.note); - self.notes.push(note); - }); - $('.'+this.opt.note.wrapDisabledClass).on('click', function () { - $.fancybox.open('#pw-login'); - return false; - }); - - }; - return that; - }()); -} diff --git a/static/client/js/rejs/tops.js b/static/client/js/rejs/tops.js index 2d3d43d2..565cc5cd 100644 --- a/static/client/js/rejs/tops.js +++ b/static/client/js/rejs/tops.js @@ -72,7 +72,7 @@ $('div#' + PARENT_ID + ' ul li.cl-item').each(function(index, el) { $('div.page-body ul.cat-list li.cl-item[data-slug=\'' + $(el).data('slug') + '\']').not(el).remove(); }); - } + }; var insertTops = function (text) { var parent = document.getElementById(PARENT_ID); diff --git a/static/client/js_min/_modules/block.exposition.list.min.js b/static/client/js_min/_modules/block.exposition.list.min.js index b9b78f66..cf8d4314 100644 --- a/static/client/js_min/_modules/block.exposition.list.min.js +++ b/static/client/js_min/_modules/block.exposition.list.min.js @@ -1 +1 @@ -var EXPO=EXPO||{};EXPO.exposition=EXPO.exposition||{},EXPO.exposition.list?console.warn("WARNING: EXPO.place.object is already defined!"):EXPO.exposition.list=function(){var t=EXPO.common,n={},o=function(t,n){this.opt=n,this.DOMthis=t,this.DOMbutton=t.querySelector("."+n.buttonClass),this.DOMinput=t.querySelector("."+n.inputClass),this.inputName=this.DOMinput.getAttribute("name"),this.url=this.DOMbutton.getAttribute("href"),this._controller()};return o.prototype={_init:function(){},_controller:function(){var t=this;$(this.DOMinput).on("blur",function(){t.send()}),$(this.DOMbutton).on("click",function(){return!1})},send:function(){var n,o={},i=this,e=function(t){t.success?(console.log("ok"),$(i.DOMbutton).addClass("active")):console.log("data not send")};o[this.inputName]=this.DOMinput.value,n=t.getRequest(o,this.url,e)}},n.opt={},$(function(){}),n.init=function(n){$.extend(this.opt,n),this.notes=[];var i=this;$("."+this.opt.note.wrapClass).each(function(){var t=new o(this,i.opt.note);i.notes.push(t)}),$("."+this.opt.note.wrapDisabledClass).on("click",function(){return $.fancybox.open("#pw-login"),!1}),t.opt.addCalendarText=this.opt.addCalendarText,t.opt.removeCalendarText=this.opt.removeCalendarText},n}(); \ No newline at end of file +var EXPO=EXPO||{};EXPO.exposition=EXPO.exposition||{},EXPO.exposition.list?console.warn("WARNING: EXPO.place.object is already defined!"):EXPO.exposition.list=function(){var t=EXPO.common,e={};return e.opt={},$(function(){}),e.init=function(e){$.extend(this.opt,e),t.opt.addCalendarText=this.opt.addCalendarText,t.opt.removeCalendarText=this.opt.removeCalendarText},e}(); \ No newline at end of file diff --git a/static/client/js_min/_modules/page.events.feed.min.js b/static/client/js_min/_modules/page.events.feed.min.js index b7575340..4d00f577 100644 --- a/static/client/js_min/_modules/page.events.feed.min.js +++ b/static/client/js_min/_modules/page.events.feed.min.js @@ -1 +1 @@ -var EXPO=EXPO||{};EXPO.events=EXPO.events||{},EXPO.events.feed?console.warn("WARNING: EXPO.eventsFeed is already defined!"):EXPO.events.feed=function(){var e={};e.opt={};var t=EXPO.common,i=function(e){this.opt=e,this.DOMbody=document.getElementById(e.bodyId)},n=function(e,t,i){e||(e=""),$.ajax({type:"GET",url:t,data:e,success:function(e){return"function"!=typeof i?e:void i(e)}})},s=function(e,t,i){return e.hasOwnProperty(t)&&(e[i]=e[t]),this},a=function(e){var t,i=0;for(t in e)e.hasOwnProperty(t)&&i++;return i},r=$(".wait-ajax.absolute"),c=function(e){var t=Object.keys(e).map(function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])}).join("&");return"?"+t};i.prototype={show:function(){$(this.DOMbody).slideDown()},hide:function(){$(this.DOMbody).hide()}};var l=function(e){this.opt=e;var i,n=this,s=0,a=$("#"+n.opt.subjectTriggerWrapId),r=n.opt.id,c=$("#"+r),l=$(".csb-menu-input",c),o=$("#"+this.opt.selectedItemsContainer,c),d=n.opt.defaultOn,h=n.opt.applyBtnClass,u=($("#"+n.opt.modalTrigger),document.getElementById(n.opt.bodyId),function(){p.hide()}),p=$(".wait-ajax.absolute");this.$modalInst=$("#"+r),this.itemsSelected={},this.tagsBoxItems={},this.sublist={},this.$inputFilter=$("#"+n.opt.filterInputId),this.$label=$(document.getElementById(this.opt.labelId)),this.$selectedItemsWrap=o,this.isReceived=!0,$(function(){for($(".topicChecks",a).on("change",function(){$(this).prop("checked")?n._setVisible($(this).val()):n._setUnvisible($(this).val())}),s=0;s2&&d?(n({term:t,form:l},c.opt.autoCompleteUrl,u),d=!1):0!=t.length||d||c.$inputFilter.hasClass("ui-autocomplete-input")&&(c.$inputFilter.placeComplete("destroy"),d=!0),!1}).click(function(){return!1})},_renderSublist:function(e,t,i){var n=this,s=0,a=t+"-sub",c=function(e){if(e.length){for(n.sublist[a]={},s;sT;T++)for(c=y[T],w=0;I>w;w++)c==_[w]&&F(i[w]);for(T=0;x>T;T++)c=y[T],c==S&&F(e);b.querySelectorAll(".final-tire")&&$("."+s+"."+r,b.querySelectorAll(".final-tire")).each(function(){F($("."+d,this)[0])})}else for(T=0;x>T;T++)c=y[T],c==S&&F(S)},F=function(e){var t=e.getAttribute("id");i._destroyTag(t),N()},E=function(e){var n=t.closest(e,a),s=n.querySelector("."+g),r=s.innerHTML,c=e.getAttribute("id"),l={id:c,text:r};i._addTag(c,l),N()},N=function(){c.find("."+f).length&&"~~id~~"!=c.find("."+f)[0].getAttribute(v)?c.addClass("visible"):c.removeClass("visible")},j=function(e){var t=$(e).children("li").children("."+s).find("."+d+":checked");t.each(function(){E(this)})},L=function(){var e=$(C).children("li").children("."+s).find("."+d+":checked");e.each(function(){F(this)})};i.strictMode?this.checked?(D(this),q(this),E(this)):(P(this),q(this),F(this)):this.checked?($(_).find("."+d)[0]&&_&&"~~id~~"!=$(_).find("."+d)[0].value&&q(this),B()?(w(this),D(this),q(k),E(k),L(C),k.getAttribute("id")!=x.getAttribute("id")||x.checked?A()&&(D(x),q(x),E(x)):(D(x),q(x),E(x))):(D(this),q(this),E(this)),_&&S(this)):(M()?(O(this),P(this),q(k),F(k),j(C),x.checked&&(P(x),F(x),j(I))):(P(this),q(this),F(this)),_&&(T(this),q(this))),h()}),$("."+i.opt.deleteTagClass,s).on("click",function(){var e=$(this).attr("data-checkbox-id"),t=$("#"+e);return t.prop("checked",!1),t.trigger("change"),i._refreshLabel(),c.children(".dna-clone").length||c.removeClass("visible"),!1}),$(".del-on-page").on("click",function(){var e=$(this).attr("data-checkbox-id");$("."+i.opt.deleteTagClass+'[data-checkbox-id="'+e+'"]',s).trigger("click")}),$(".clear",s).on("click",function(){return i.resetList(),!1}),$(".q-sel a",s).on("click",function(){var e=$(this),t=e.attr("data-name"),s=e.attr("data-id"),a={name:t,id:s},r=function(e){i._loadParentTree(e,function(){i._checkCheckBox(s)})};return n(a,i.opt.getParentUrl,r),!1}),$("."+o,s).on("click",function(){return i.applyHandler(this),!1}),$("."+i.opt.clearAllButtonClass,s).on("click",function(e){return e.preventDefault(),i.resetList(),!1})})};return o.prototype={_getAjax:function(e,t){var i=this;e||(e=""),$.ajax({type:"GET",url:i.opt.ajaxUrl,data:e,success:function(e){return"function"!=typeof t?(i.rawData=e,e):(i.rawData=e,void t(e))}})},_renderSublist:function(e,t,i){var n=this,s=0,a=t+"-sub",c=function(e){if(e.length){for(n.curDNA[a]={},s;s2&&o?(r.show(),n({term:t,form:c},a.opt.autoCompleteUrl,h),o=!1):0!=t.length||o||a.$inputFilter.hasClass("ui-autocomplete-input")&&(a.$inputFilter.autocomplete("destroy"),o=!0),!1}).click(function(){return!1})},_loadParentTree:function(e,t,i){var n,s,c,l,o=this,d=e,h=$("#id_"+o.opt.prefix+d.id),u=function(e){var n=$("#id_"+o.opt.prefix+d.id),h=0,u=function(e){r.hide(),h++,h==e&&(i||0===i?t(i):t())};r.hide(),n.length&&a(o.curDNA[s+"-sub"])==e&&(c={name:d.name,id:d.id},r.show(),l=$("#id_"+o.opt.prefix+d.id).closest(".level").children(".trigger").attr("data-template-id"),o._renderNested(c,u,l,d.id))},p=function(){r.hide(),i||0===i?t(i):t()};r.show(),d.hasOwnProperty("parent")?h.length?(c={name:d.name,id:d.id},l=h.closest(".level").children(".trigger").attr("data-template-id"),o._renderNested(c,function(){r.hide(),t()},l,d.id)):(n={name:d.parent.name,id:d.parent.id},s=$("#id_"+o.opt.prefix+d.parent.id).closest(".level").children(".trigger").attr("data-template-id"),o._renderSublist(n,s,u)):(n={name:d.name,id:d.id},s=$("#id_"+o.opt.prefix+d.id).closest(".level").children(".trigger").attr("data-template-id"),o._renderSublist(n,s,p))},applyHandler:function(e){EXPO.events.feed.modalWindow.close()},_refreshLabel:function(){var e=this.selectedWrap.children().length;e?this.$label.text(this.$label.attr("data-selected")):this.$label.text(this.$label.attr("data-default"))}},e.init=function(e){$.extend(this.opt,e);var n=this,s=function(){$(n.DOMform).find('input[name="~~name~~"]').remove()};"None"!=this.opt.searchData&&this.opt.searchData&&(this.previousSearch=JSON.parse(this.opt.searchData)),this.DOMform=document.getElementById(this.opt.formId),this.DOMhint=document.getElementById(this.opt.filter.hintId),$(this.DOMform).on("submit",function(){s()}),$.widget("custom.placeComplete",$.ui.autocomplete,{_renderItem:function(e,t){return $("
  • ").append($("").text(t.label)).append(' ('+t.cat+")").appendTo(e)}}),this.DOMapplyButton=document.getElementById(this.opt.applyButtonId),this.filterPane=new i(this.opt.filter),$("#"+this.opt.filter.buttonId).on("click",function(){return t.hasClass(this,n.opt.activeClass)?(t.removeClass(this,n.opt.activeClass),n.filterPane.hide()):(t.addClass(this,n.opt.activeClass),n.filterPane.show()),!1}),$("#"+n.opt.bodyId+" ."+n.opt.modalTriggerClass).on("click",function(e){return e.preventDefault(),n.modalWindow.pullData(this.getAttribute("href")),n.modalWindow.open(),!1}),$("#"+n.opt.applyButtonId).on("click",function(){return $(n.DOMform).submit(),!1}),this.modalWindow=new t.Modal(n.opt.modal),this.placesModal=new o(n.opt.place),this.subjModal=new l(n.opt.subject),$(function(){if(n.previousSearch.inputs.length){$(n.DOMhint).hide();for(var e=0;e2&&d?(n({term:t,form:l},c.opt.autoCompleteUrl,u),d=!1):0!=t.length||d||c.$inputFilter.hasClass("ui-autocomplete-input")&&(c.$inputFilter.placeComplete("destroy"),d=!0),!1}).click(function(){return!1})},_renderSublist:function(e,t,i){var n=this,s=0,a=t+"-sub",c=function(e){if(e.length){for(n.sublist[a]={},s;sT;T++)for(c=y[T],w=0;I>w;w++)c==_[w]&&F(i[w]);for(T=0;x>T;T++)c=y[T],c==S&&F(e);b.querySelectorAll(".final-tire")&&$("."+s+"."+r,b.querySelectorAll(".final-tire")).each(function(){F($("."+d,this)[0])})}else for(T=0;x>T;T++)c=y[T],c==S&&F(S)},F=function(e){var t=e.getAttribute("id");i._destroyTag(t),N()},E=function(e){var n=t.closest(e,a),s=n.querySelector("."+g),r=s.innerHTML,c=e.getAttribute("id"),l={id:c,text:r};i._addTag(c,l),N()},N=function(){c.find("."+f).length&&"~~id~~"!=c.find("."+f)[0].getAttribute(v)?c.addClass("visible"):c.removeClass("visible")},j=function(e){var t=$(e).children("li").children("."+s).find("."+d+":checked");t.each(function(){E(this)})},L=function(){var e=$(C).children("li").children("."+s).find("."+d+":checked");e.each(function(){F(this)})};i.strictMode?this.checked?(D(this),q(this),E(this)):(P(this),q(this),F(this)):this.checked?($(_).find("."+d)[0]&&_&&"~~id~~"!=$(_).find("."+d)[0].value&&q(this),B()?(w(this),D(this),q(k),E(k),L(C),k.getAttribute("id")!=x.getAttribute("id")||x.checked?A()&&(D(x),q(x),E(x)):(D(x),q(x),E(x))):(D(this),q(this),E(this)),_&&S(this)):(M()?(O(this),P(this),q(k),F(k),j(C),x.checked&&(P(x),F(x),j(I))):(P(this),q(this),F(this)),_&&(T(this),q(this))),h()}),$("."+i.opt.deleteTagClass,s).on("click",function(){var e=$(this).attr("data-checkbox-id"),t=$("#"+e);return t.prop("checked",!1),t.trigger("change"),i._refreshLabel(),c.children(".dna-clone").length||c.removeClass("visible"),!1}),$(".del-on-page").on("click",function(){var e=$(this).attr("data-checkbox-id");$("."+i.opt.deleteTagClass+'[data-checkbox-id="'+e+'"]',s).trigger("click")}),$(".clear",s).on("click",function(){return i.resetList(),!1}),$(".q-sel a",s).on("click",function(){var e=$(this),t=e.attr("data-name"),s=e.attr("data-id"),a={name:t,id:s},r=function(e){i._loadParentTree(e,function(){i._checkCheckBox(s)})};return n(a,i.opt.getParentUrl,r),!1}),$("."+o,s).on("click",function(){return i.applyHandler(this),!1}),$("."+i.opt.clearAllButtonClass,s).on("click",function(e){return e.preventDefault(),i.resetList(),!1})})};return o.prototype={_getAjax:function(e,t){var i=this;e||(e=""),$.ajax({type:"GET",url:i.opt.ajaxUrl,data:e,success:function(e){return"function"!=typeof t?(i.rawData=e,e):(i.rawData=e,void t(e))}})},_renderSublist:function(e,t,i){var n=this,s=0,a=t+"-sub",c=function(e){if(e.length){for(n.curDNA[a]={},s;s2&&o?(r.show(),n({term:t,form:c},a.opt.autoCompleteUrl,h),o=!1):0!=t.length||o||a.$inputFilter.hasClass("ui-autocomplete-input")&&(a.$inputFilter.autocomplete("destroy"),o=!0),!1}).click(function(){return!1})},_loadParentTree:function(e,t,i){var n,s,c,l,o=this,d=e,h=$("#id_"+o.opt.prefix+d.id),u=function(e){var n=$("#id_"+o.opt.prefix+d.id),h=0,u=function(e){r.hide(),h++,h==e&&(i||0===i?t(i):t())};r.hide(),n.length&&a(o.curDNA[s+"-sub"])==e&&(c={name:d.name,id:d.id},r.show(),l=$("#id_"+o.opt.prefix+d.id).closest(".level").children(".trigger").attr("data-template-id"),o._renderNested(c,u,l,d.id))},p=function(){r.hide(),i||0===i?t(i):t()};r.show(),d.hasOwnProperty("parent")?h.length?(c={name:d.name,id:d.id},l=h.closest(".level").children(".trigger").attr("data-template-id"),o._renderNested(c,function(){r.hide(),t()},l,d.id)):(n={name:d.parent.name,id:d.parent.id},s=$("#id_"+o.opt.prefix+d.parent.id).closest(".level").children(".trigger").attr("data-template-id"),o._renderSublist(n,s,u)):(n={name:d.name,id:d.id},s=$("#id_"+o.opt.prefix+d.id).closest(".level").children(".trigger").attr("data-template-id"),o._renderSublist(n,s,p))},applyHandler:function(e){EXPO.events.feed.modalWindow.close()},_refreshLabel:function(){var e=this.selectedWrap.children().length;e?this.$label.text(this.$label.attr("data-selected")):this.$label.text(this.$label.attr("data-default"))}},e.init=function(e){$.extend(this.opt,e);var n=this,s=function(){$(n.DOMform).find('input[name="~~name~~"]').remove()};"None"!=this.opt.searchData&&this.opt.searchData&&(this.previousSearch=JSON.parse(this.opt.searchData)),this.DOMform=document.getElementById(this.opt.formId),this.DOMhint=document.getElementById(this.opt.filter.hintId),$(this.DOMform).on("submit",function(){s()}),$.widget("custom.placeComplete",$.ui.autocomplete,{_renderItem:function(e,t){return $("
  • ").append($("").text(t.label)).append(' ('+t.cat+")").appendTo(e)}}),this.DOMapplyButton=document.getElementById(this.opt.applyButtonId),this.filterPane=new i(this.opt.filter),$("#"+this.opt.filter.buttonId).on("click",function(){return t.hasClass(this,n.opt.activeClass)?(t.removeClass(this,n.opt.activeClass),n.filterPane.hide()):(t.addClass(this,n.opt.activeClass),n.filterPane.show()),!1}),$("#"+n.opt.bodyId+" ."+n.opt.modalTriggerClass).on("click",function(e){return e.preventDefault(),n.modalWindow.pullData(this.getAttribute("href")),n.modalWindow.open(),!1}),$("#"+n.opt.applyButtonId).on("click",function(){return $(n.DOMform).submit(),!1}),this.modalWindow=new t.Modal(n.opt.modal),this.placesModal=new o(n.opt.place),this.subjModal=new l(n.opt.subject),$(function(){if(n.previousSearch.inputs.length){$(n.DOMhint).hide();for(var e=0;e -
    {{ form.capital}} +
    {{ form.capital }} {{ form.capital.errors }}
    diff --git a/templates/c_admin/country/country_list.html b/templates/c_admin/country/country_list.html index 9a380d34..857301d1 100644 --- a/templates/c_admin/country/country_list.html +++ b/templates/c_admin/country/country_list.html @@ -21,21 +21,21 @@
    diff --git a/templates/client/accounts/feed.html b/templates/client/accounts/feed.html index 4dd11d8e..0f8f6b08 100644 --- a/templates/client/accounts/feed.html +++ b/templates/client/accounts/feed.html @@ -3,10 +3,10 @@ {% load static %} {% block bread_scrumbs %} - + {% endblock %} {% block page_title %}
    @@ -15,42 +15,42 @@ {% endblock %} {% if object_list %} {% block head_scripts %} - {% include "client/includes/banners/tops_head_js.html" %} + {% include "client/includes/banners/tops_head_js.html" %} {% endblock head_scripts %} {% endif %} {% block page_body %} -
    -
    - {% trans 'Фильтрация ленты' %} -
    -
    -

    {% trans 'Тематические фильтры не выбраны' %}: ({% trans 'Изменить' %}):

    -
    -
    -
    -
    ~~text~~
    - x -
    +
    +
    + {% trans 'Фильтрация ленты' %} +
    +
    +

    {% trans 'Тематические фильтры не выбраны' %}: ({% trans 'Изменить' %}):

    +
    +
    +
    +
    ~~text~~
    + x +
    -
    -
    -
    -
    -

    {% trans 'Географические фильтры не выбраны' %}: ({% trans 'Изменить' %}):

    +
    +
    +
    +
    +

    {% trans 'Географические фильтры не выбраны' %}: ({% trans 'Изменить' %}):

    -
    -
    -
    -
    ~~text~~
    - x -
    +
    +
    +
    +
    ~~text~~
    + x +
    -
    -
    -
    - -
    -
    {% csrf_token %} +
    +
    + + +
    + {% csrf_token %}
    @@ -69,104 +69,104 @@
    - - -
    -

    *{% trans ' Вы можете настроить ленту событий, один раз выбрав интересные темы и географию с помощью кнопки «Фильтрация ленты».' %}

    -
    - {% if object_list %} - {% include 'includes/exposition/exposition_list.html' with object_list=object_list %} - {% else %} -

    - - - - - {% trans "Увы, событий, соответствующих выбранным фильтрам, нет в каталоге.
    Попробуйте укрупнить параметры поиска" %} -
    -

    - {% endif %} - {% include 'includes/catalog_paginator.html' with page_obj=page_obj %} - {% if request.GET.debug == '1' %} - - {% else %} - - {% endif %} - + {% else %} + + {% endif %} + - + } + }); + + {% endblock %} diff --git a/templates/client/includes/conference/conference_list.html b/templates/client/includes/conference/conference_list.html index 3e9f841f..a08e6107 100644 --- a/templates/client/includes/conference/conference_list.html +++ b/templates/client/includes/conference/conference_list.html @@ -108,11 +108,11 @@
  • - {% if forloop.counter == 5 or objects|length < 5 %} + {% if forloop.counter == 8 or objects|length < 8 %} {% include 'client/includes/banners/catalog_inner_2.html' %} {% endif %} - {% if forloop.counter == 10 %} + {% if forloop.counter == 15 %} {% include 'client/includes/banners/catalog_inner.html' %} {%endif %} {% endfor %} @@ -136,12 +136,6 @@ - {% else %} - - {% endif %} - + {% if request.GET.debug == '1' %} + + {% else %} + + {% endif %} + {% endblock %} diff --git a/templates/client/includes/conference/conference_paid.html b/templates/client/includes/conference/conference_paid.html index 323e8a9b..183c8a10 100644 --- a/templates/client/includes/conference/conference_paid.html +++ b/templates/client/includes/conference/conference_paid.html @@ -422,12 +422,6 @@ somebodyId:"somebody", nobodyId:"nobody" }, - note:{ - wrapClass:'note-wrap', - wrapDisabledClass:'note-wrap-disabled', - buttonClass:'note-button', - inputClass:'note-text' - }, advertise:{ id:"advert-member-form" }, diff --git a/templates/client/includes/conference/conference_partner.html b/templates/client/includes/conference/conference_partner.html index f9ffadab..25031d4b 100644 --- a/templates/client/includes/conference/conference_partner.html +++ b/templates/client/includes/conference/conference_partner.html @@ -87,7 +87,6 @@ {% if event.org %} {% trans 'Организатор' %}: {{ event.org }} {% endif %} -  {% trans 'Подписаться на новости' %} @@ -110,6 +109,7 @@ {% trans 'фото' %} {% endif %} +
    {% trans 'Напомнить о выставке' %}

    @@ -165,10 +165,6 @@ {% endif %} {% endwith %} -{#

     {% trans 'Подписаться на новости' %}   {% blocktrans with name=event.name|safe %}Получайте актуальную информацию о концеренции {{ name }} на свой email{% endblocktrans %}

    #} - - -{# {% include 'client/includes/conference/conference_services.html' with event=event %}#} {% include 'client/includes/event_steps.html' with event=event %}
    @@ -583,12 +579,6 @@ somebodyId:"somebody", nobodyId:"nobody" }, - note:{ - wrapClass:'note-wrap', - wrapDisabledClass:'note-wrap-disabled', - buttonClass:'note-button', - inputClass:'note-text' - }, advertise:{ id:"advert-member-form" }, diff --git a/templates/client/includes/conference/conference_services.html b/templates/client/includes/conference/conference_services.html deleted file mode 100644 index b98f4d71..00000000 --- a/templates/client/includes/conference/conference_services.html +++ /dev/null @@ -1,13 +0,0 @@ -{% load i18n %} - -
    - -
    \ No newline at end of file diff --git a/templates/client/includes/event_list.html b/templates/client/includes/event_list.html index f478270b..705b835e 100644 --- a/templates/client/includes/event_list.html +++ b/templates/client/includes/event_list.html @@ -15,12 +15,12 @@
    {% endif %} {% endif %} -
    +
    {% with obj=obj %} {% include 'client/includes/show_logo.html' %} {% endwith %}
    - +
    {% if user.is_staff %} @@ -68,21 +68,11 @@
    -
    - {% trans 'услуги' %} -
    - -
    -
    {% with event=obj user=user %} {% include 'client/includes/calendar_button.html' %} {% endwith %} - {% trans 'заметка' %} + {% trans 'заметка' %}
    diff --git a/templates/client/includes/event_steps.html b/templates/client/includes/event_steps.html index c351903d..3d50cf8f 100644 --- a/templates/client/includes/event_steps.html +++ b/templates/client/includes/event_steps.html @@ -38,20 +38,20 @@
    {% endif %} diff --git a/templates/client/includes/events/filter_result.html b/templates/client/includes/events/filter_result.html index 25e0da76..f293dca8 100644 --- a/templates/client/includes/events/filter_result.html +++ b/templates/client/includes/events/filter_result.html @@ -8,106 +8,106 @@ {% endif %}
      - - {# START FOR #} - {% for result in query %} -
    • -
      - - - {% if result.object.canceled %} -
      - {% elif result.object.expohit %} -
      - {% endif %} - -
      - {% with obj=result.object %} - {% include 'client/includes/show_logo.html' %} - {% endwith %} -
      -
      - -
      -
      - - {% if result.object.quality_label.rsva.is_set %} -
      - -
      - {% endif %} - {% if result.object.quality_label.exporating.is_set %} -
      - -
      - {% endif %} - {% if result.object.quality_label.ufi.is_set %} -
      - -
      - {% endif %} - -
      - -
      -
      - {{ result.object.main_title|safe }} -
      -
      - -
      -
      - - {% with obj=result.object %} - {% include 'client/includes/show_date_block.html' %} - {% endwith %} - -
      - - {% if result.object.country %} -
      - {{ result.object.country }}, {{ result.object.city }} - - {% if result.object.place %} - , {{ result.object.place }} - {% endif %} - -
      - {% endif %} - -
      -
      - -
      -
      - {% include 'client/includes/exposition/services.html' with obj=result.object %} - {% include 'client/includes/calendar_button.html' with obj=result.object %} -
      -
      - {% include 'client/buttons/booking_button.html' with object=result.object %} -
      -
      -
      - -
      -
      - - {% if result.object.visitors %} - {{ result.object.visitors }} - {% endif %} - - {% if result.object.members %} - {{ result.object.members }} - {% endif %} - -
      -
      - {% include 'client/includes/exposition/tags.html' with obj=result.object %} -
      -
      -
    • - - {% if not request.is_ajax %} + + {# START FOR #} + {% for result in query %} +
    • +
      + + + {% if result.object.canceled %} +
      + {% elif result.object.expohit %} +
      + {% endif %} + +
      + {% with obj=result.object %} + {% include 'client/includes/show_logo.html' %} + {% endwith %} +
      +
      + +
      +
      + + {% if result.object.quality_label.rsva.is_set %} +
      + +
      + {% endif %} + {% if result.object.quality_label.exporating.is_set %} +
      + +
      + {% endif %} + {% if result.object.quality_label.ufi.is_set %} +
      + +
      + {% endif %} + +
      + +
      +
      + {{ result.object.main_title|safe }} +
      +
      + +
      +
      + + {% with obj=result.object %} + {% include 'client/includes/show_date_block.html' %} + {% endwith %} + +
      + + {% if result.object.country %} +
      + {{ result.object.country }}, {{ result.object.city }} + + {% if result.object.place %} + , {{ result.object.place }} + {% endif %} + +
      + {% endif %} + +
      +
      + +
      +
      + {% include 'client/includes/exposition/services.html' with obj=result.object %} + {% include 'client/includes/calendar_button.html' with obj=result.object %} +
      +
      + {% include 'client/buttons/booking_button.html' with object=result.object %} +
      +
      +
      + +
      +
      + + {% if result.object.visitors %} + {{ result.object.visitors }} + {% endif %} + + {% if result.object.members %} + {{ result.object.members }} + {% endif %} + +
      +
      + {% include 'client/includes/exposition/tags.html' with obj=result.object %} +
      +
      +
    • + + {% if not request.is_ajax %} {% if forloop.counter == 5 or objects|length < 5 %} {% include 'client/includes/banners/catalog_inner_2.html' %} {% endif %} @@ -115,32 +115,26 @@ {% if forloop.counter == 10 %} {% include 'client/includes/banners/catalog_inner.html' %} {%endif %} - {% endif %} + {% endif %} - {% endfor %} - {# END FOR #} + {% endfor %} + {# END FOR #}
    {% block scripts %} - - {% if request.GET.debug == '1' %} - - {% else %} - - {% endif %} - - + + {% if request.GET.debug == '1' %} + + {% else %} + + {% endif %} + + {% endblock %} diff --git a/templates/client/includes/exposition/expo_list_paid.html b/templates/client/includes/exposition/expo_list_paid.html index 28bc1e82..25f9cb08 100644 --- a/templates/client/includes/exposition/expo_list_paid.html +++ b/templates/client/includes/exposition/expo_list_paid.html @@ -5,114 +5,114 @@ {% if objects %}
      - {% for obj in objects %} -
    • -
      - - {% if obj.canceled %} -
      - {% else %} - {% if obj.expohit %} -
      - {% endif %} - {% endif %} -
      - {% with obj=obj %} - {% include 'client/includes/show_logo.html' %} - {% endwith %} -
      -
      -
      -
      - {% if obj.quality_label.ufi.is_set %} -
      - -
      - {% endif %} -
      - -
      -
      - {{ obj.main_title|safe }} -
      -
      -
      -
      - {% with obj=obj %} - {% include 'client/includes/show_date_block.html' %} - {% endwith %} -
      - {% if obj.country %} -
      - {{ obj.country }}, {{ obj.city }} - {% if obj.place %} - , {{ obj.place }} - {% endif %} -
      - {% endif %} -
      -
      -
      -
      - {% include 'client/includes/exposition/services.html' with obj=obj %} - {% include 'client/includes/calendar_button.html' with obj=obj%} - {% if request.user.is_admin %} - - {% endif %} -
      -
      -
      - {% include 'client/buttons/booking_button.html' with object=obj %} -
      -
      -
      -
      -
      - {% if obj.visitors %} - {{ obj.visitors }} - {% endif %} - {% if obj.members %} - {{ obj.members }} - {% endif %} -
      -
      - {% include 'client/includes/exposition/tags.html' with obj=obj %} -
      -
      -
    • + {% for obj in objects %} +
    • +
      + + {% if obj.canceled %} +
      + {% else %} + {% if obj.expohit %} +
      + {% endif %} + {% endif %} +
      + {% with obj=obj %} + {% include 'client/includes/show_logo.html' %} + {% endwith %} +
      +
      +
      +
      + {% if obj.quality_label.ufi.is_set %} +
      + +
      + {% endif %} +
      + +
      +
      + {{ obj.main_title|safe }} +
      +
      +
      +
      + {% with obj=obj %} + {% include 'client/includes/show_date_block.html' %} + {% endwith %} +
      + {% if obj.country %} +
      + {{ obj.country }}, {{ obj.city }} + {% if obj.place %} + , {{ obj.place }} + {% endif %} +
      + {% endif %} +
      +
      +
      +
      + {% include 'client/includes/exposition/services.html' with obj=obj %} + {% include 'client/includes/calendar_button.html' with obj=obj%} + {% if request.user.is_admin %} + + {% endif %} +
      +
      +
      + {% include 'client/buttons/booking_button.html' with object=obj %} +
      +
      +
      +
      +
      + {% if obj.visitors %} + {{ obj.visitors }} + {% endif %} + {% if obj.members %} + {{ obj.members }} + {% endif %} +
      +
      + {% include 'client/includes/exposition/tags.html' with obj=obj %} +
      +
      +
    • - {% if forloop.counter == 8 %} + {% if forloop.counter == 8 %} {% if not NO_EXTERNAL_JS %} - - + + {% endif %} - - {%endif %} - {% endfor %} + + {%endif %} + {% endfor %}
    {% else %} @@ -133,15 +133,9 @@ {% else %} {% endif %} {% endblock %} diff --git a/templates/client/includes/exposition/expo_paid.html b/templates/client/includes/exposition/expo_paid.html index 143a4961..ee2446c8 100644 --- a/templates/client/includes/exposition/expo_paid.html +++ b/templates/client/includes/exposition/expo_paid.html @@ -429,12 +429,6 @@ somebodyId:"somebody", nobodyId:"nobody" }, - note:{ - wrapClass:'note-wrap', - wrapDisabledClass:'note-wrap-disabled', - buttonClass:'note-button', - inputClass:'note-text' - }, advertise:{ id:"advert-member-form" }, diff --git a/templates/client/includes/exposition/exposition_list.html b/templates/client/includes/exposition/exposition_list.html index ef68e4e6..2c1db0ae 100644 --- a/templates/client/includes/exposition/exposition_list.html +++ b/templates/client/includes/exposition/exposition_list.html @@ -109,13 +109,13 @@ - {% if forloop.counter == 5 %} + {% if forloop.counter == 8 %} {% include 'client/includes/banners/catalog_inner_2.html' %} - {% elif forloop.last and objects|length < 5 %} + {% elif forloop.last and objects|length < 8 %} {% include 'client/includes/banners/catalog_inner_2.html' %} {% endif %} - {% if forloop.counter == 10 %} + {% if forloop.counter == 15 %} {% include 'client/includes/banners/catalog_inner.html' %} {%endif %} {% endfor %} @@ -139,12 +139,6 @@ - {% else %} - - {% endif %} - - + + {% if request.GET.debug == '1' %} + + {% else %} + + {% endif %} + + {% endblock %} diff --git a/templates/client/includes/exposition/services.html b/templates/client/includes/exposition/services.html index ec8a50a9..d841af4f 100644 --- a/templates/client/includes/exposition/services.html +++ b/templates/client/includes/exposition/services.html @@ -15,12 +15,6 @@ {% elif obj.partner %}
  • {% trans 'Официальный сайт' %}
  • {% trans 'Билеты' %}
  • - {% else %} - {% with services=obj.get_services %} - {% for service in services %} -
  • {{ service.name }}
  • - {% endfor %} - {% endwith %} {% endif %}
    diff --git a/templates/client/includes/exposition/statistic.html b/templates/client/includes/exposition/statistic.html index eafc4341..e53d277c 100644 --- a/templates/client/includes/exposition/statistic.html +++ b/templates/client/includes/exposition/statistic.html @@ -154,14 +154,3 @@ - -
    -
      - {% with services=exposition.get_services %} - {% for service in services %} -
    • {{ service.name }}
    • - {% endfor %} - {% endwith %} -
    -
    - diff --git a/templates/client/includes/services.html b/templates/client/includes/services.html index ca56f4dd..e8c87c25 100644 --- a/templates/client/includes/services.html +++ b/templates/client/includes/services.html @@ -4,7 +4,7 @@
    diff --git a/templates/client/index.html b/templates/client/index.html index 04a172fc..a2e4d474 100644 --- a/templates/client/index.html +++ b/templates/client/index.html @@ -211,21 +211,5 @@
    - {% if request.GET.debug == '1' %} - - {% else %} - - - {% endif %} - - + {% endblock %} diff --git a/templates/client/place/place_detail.html b/templates/client/place/place_detail.html index c82a8a2d..026d9da0 100644 --- a/templates/client/place/place_detail.html +++ b/templates/client/place/place_detail.html @@ -260,20 +260,7 @@
    -
    - {% trans 'услуги' %} - -
    - -
    -
    - {% trans 'в расписание' %} - {% trans 'заметка' %}
    diff --git a/templates/client/place/place_exposition_list.html b/templates/client/place/place_exposition_list.html index d5ec003c..a60ecd5b 100644 --- a/templates/client/place/place_exposition_list.html +++ b/templates/client/place/place_exposition_list.html @@ -60,20 +60,7 @@
    -
    - {% trans 'услуги' %} - -
    - -
    -
    - {% trans 'в расписание' %} - {% trans 'заметка' %}
    diff --git a/templates/client/specialist_catalog/catalog_detailed.html b/templates/client/specialist_catalog/catalog_detailed.html index d9f4776a..43df105a 100644 --- a/templates/client/specialist_catalog/catalog_detailed.html +++ b/templates/client/specialist_catalog/catalog_detailed.html @@ -230,9 +230,9 @@
    {# вместо формы выше временно ставим ссылку на партнёров #} {% if object.type == 1 %} - {% trans 'заказать услугу' %} + {% trans 'найти переводчика' %} {% else %} - {% trans 'заказать услугу' %} + {% trans 'найти переводчика' %} {% endif %}