// Init kinda namespace object var VE = { // Vesta Events object core: {}, // core functions navigation: { state: { active_menu: 1, menu_selector: '.l-stat__col', menu_active_selector: '.l-stat__col--active' } }, // menu and element navigation functions notifications: {}, callbacks: { // events callback functions click: {}, mouseover: {}, mouseout: {}, keypress: {} }, helpers: {}, // simple handy methods tmp: { sort_par: 'sort-name', sort_direction: -1, sort_as_int: 0, form_changed: 0, search_activated: 0, search_display_interval: 0, search_hover_interval: 0 } }; /* * Main method that invokes further event processing * @param root is root HTML DOM element that. Pass HTML DOM Element or css selector * @param event_type (eg: click, mouseover etc..) */ VE.core.register = function(root, event_type) { var root = !root ? 'body' : root; // if elm is not passed just bind events to body DOM Element var event_type = !event_type ? 'click' : event_type; // set event type to "click" by default $(root).bind(event_type, function(evt) { var elm = $(evt.target); VE.core.dispatch(evt, elm, event_type); // dispatch captured event }); } /* * Dispatch event that was previously registered * @param evt related event object * @param elm that was catched * @param event_type (eg: click, mouseover etc..) */ VE.core.dispatch = function(evt, elm, event_type) { if ('undefined' == typeof VE.callbacks[event_type]) { return VE.helpers.warn('There is no corresponding object that should contain event callbacks for "'+event_type+'" event type'); } // get class of element var classes = $(elm).attr('class'); // if no classes are attached, then just stop any further processings if (!classes) { return; // no classes assigned } // split the classes and check if it related to function $(classes.split(/\s/)).each(function(i, key) { VE.callbacks[event_type][key] && VE.callbacks[event_type][key](evt, elm); }); } // // CALLBACKS // /* * Suspend action */ VE.callbacks.click.do_suspend = function(evt, elm) { var ref = elm.hasClass('actions-panel') ? elm : elm.parents('.actions-panel'); var url = $('input[name="suspend_url"]', ref).val(); var dialog_elm = ref.find('.confirmation-text-suspention'); VE.helpers.createConfirmationDialog(dialog_elm, '', url); } /* * Unsuspend action */ VE.callbacks.click.do_unsuspend = function(evt, elm) { var ref = elm.hasClass('actions-panel') ? elm : elm.parents('.actions-panel'); var url = $('input[name="unsuspend_url"]', ref).val(); var dialog_elm = ref.find('.confirmation-text-suspention'); VE.helpers.createConfirmationDialog(dialog_elm, '', url); } /* * Delete action */ VE.callbacks.click.do_delete = function(evt, elm) { var ref = elm.hasClass('actions-panel') ? elm : elm.parents('.actions-panel'); var url = $('input[name="delete_url"]', ref).val(); var dialog_elm = ref.find('.confirmation-text-delete'); VE.helpers.createConfirmationDialog(dialog_elm, '', url); } /* * Create dialog box on the fly * @param elm Element which contains the dialog contents * @param dialog_title * @param confirmed_location_url URL that will be redirected to if user hit "OK" * @param custom_config Custom configuration parameters passed to dialog initialization (optional) */ VE.helpers.createConfirmationDialog = function(elm, dialog_title, confirmed_location_url, custom_config) { var custom_config = !custom_config ? {} : custom_config; var config = { modal: true, //autoOpen: true, resizable: false, width: 360, title: dialog_title, close: function() { $(this).dialog("destroy"); }, buttons: { "OK": function(event, ui) { location.href = confirmed_location_url; }, Cancel: function() { $(this).dialog("close"); } }, create:function () { $(this).closest(".ui-dialog") .find(".ui-button:first") .addClass("submit"); $(this).closest(".ui-dialog") .find(".ui-button") .eq(1) // the first button .addClass("cancel"); } } var reference_copied = $(elm[0]).clone(); console.log(reference_copied); config = $.extend(config, custom_config); $(reference_copied).dialog(config); } /* * Simple debug output */ VE.helpers.warn = function(msg) { alert('WARNING: ' + msg); } VE.helpers.extendPasswordFields = function() { var references = ['.password']; $(document).ready(function() { $(references).each(function(i, ref) { VE.helpers.initAdditionalPasswordFieldElements(ref); }); }); } VE.helpers.initAdditionalPasswordFieldElements = function(ref) { var enabled = $.cookie('hide_passwords') == '1' ? true : false; if (enabled) { VE.helpers.hidePasswordFieldText(ref); } $(ref).prop('autocomplete', 'off'); var enabled_html = enabled ? '' : 'show-passwords-enabled-action'; var html = '<span class="hide-password"><img class="toggle-psw-visibility-icon ' + enabled_html + '" onClick="VE.helpers.toggleHiddenPasswordText(\'' + ref + '\', this)" src="/images/toggle_password.png" /></span>'; $(ref).after(html); } VE.helpers.hidePasswordFieldText = function(ref) { $.cookie('hide_passwords', '1', { expires: 365, path: '/' }); $(ref).prop('type', 'password'); } VE.helpers.revealPasswordFieldText = function(ref) { $.cookie('hide_passwords', '0', { expires: 365, path: '/' }); $(ref).prop('type', 'text'); } VE.helpers.toggleHiddenPasswordText = function(ref, triggering_elm) { $(triggering_elm).toggleClass('show-passwords-enabled-action'); if ($(ref).prop('type') == 'text') { VE.helpers.hidePasswordFieldText(ref); } else { VE.helpers.revealPasswordFieldText(ref); } } VE.helpers.refresh_timer = { speed: 50, degr: 180, right: 0, left: 0, periodical: 0, first: 1, start: function(){ this.periodical = setInterval(function(){VE.helpers.refresh_timer.turn()}, this.speed); }, stop: function(){ clearTimeout(this.periodical); }, turn: function(){ this.degr += 1; if (this.first && this.degr >= 361){ this.first = 0; this.degr = 180; this.left.css({'-webkit-transform': 'rotate(180deg)'}); this.left.css({'transform': 'rotate(180deg)'}); this.left.children('.loader-half').addClass('dark'); } if (!this.first && this.degr >= 360){ this.first = 1; this.degr = 180; this.left.css({'-webkit-transform': 'rotate(0deg)'}); this.right.css({'-webkit-transform': 'rotate(180deg)'}); this.left.css({'transform': 'rotate(0deg)'}); this.right.css({'transform': 'rotate(180deg)'}); this.left.children('.loader-half').removeClass('dark'); this.stop(); location.reload(); } if (this.first){ this.right.css({'-webkit-transform': 'rotate('+this.degr+'deg)'}); this.right.css({'transform': 'rotate('+this.degr+'deg)'}); } else{ this.left.css({'-webkit-transform': 'rotate('+this.degr+'deg)'}); this.left.css({'transform': 'rotate('+this.degr+'deg)'}); } } } VE.navigation.enter_focused = function() { if($('.units').hasClass('active')){ location.href=($('.units.active .l-unit.focus .actions-panel__col.actions-panel__edit a').attr('href')); } else { if($(VE.navigation.state.menu_selector + '.focus a').attr('href')){ location.href=($(VE.navigation.state.menu_selector + '.focus a').attr('href')); } } } VE.navigation.move_focus_left = function(){ var index = parseInt($(VE.navigation.state.menu_selector).index($(VE.navigation.state.menu_selector+'.focus'))); if(index == -1) index = parseInt($(VE.navigation.state.menu_selector).index($(VE.navigation.state.menu_active_selector))); if($('.units').hasClass('active')){ $('.units').removeClass('active'); if(VE.navigation.state.active_menu == 0){ $('.l-menu').addClass('active'); } else { $('.l-stat').addClass('active'); } index++; } $(VE.navigation.state.menu_selector).removeClass('focus'); if(index > 0){ $($(VE.navigation.state.menu_selector)[index-1]).addClass('focus'); } else { VE.navigation.switch_menu('last'); } } VE.navigation.move_focus_right = function(){ var max_index = $(VE.navigation.state.menu_selector).length-1; var index = parseInt($(VE.navigation.state.menu_selector).index($(VE.navigation.state.menu_selector+'.focus'))); if(index == -1) index = parseInt($(VE.navigation.state.menu_selector).index($(VE.navigation.state.menu_active_selector))) || 0; $(VE.navigation.state.menu_selector).removeClass('focus'); if($('.units').hasClass('active')){ $('.units').removeClass('active'); if(VE.navigation.state.active_menu == 0){ $('.l-menu').addClass('active'); } else { $('.l-stat').addClass('active'); } index--; } if(index < max_index){ $($(VE.navigation.state.menu_selector)[index+1]).addClass('focus'); } else { VE.navigation.switch_menu('first'); } } VE.navigation.move_focus_down = function(){ var max_index = $('.units .l-unit:not(.header)').length-1; var index = parseInt($('.units .l-unit').index($('.units .l-unit.focus'))); if($('.l-menu').hasClass('active') || $('.l-stat').hasClass('active')){ $('.l-menu').removeClass('active'); $('.l-stat').removeClass('active'); $('.units').addClass('active'); index--; if(index == -2) index = -1; } if(index < max_index){ $('.units .l-unit.focus').removeClass('focus'); $($('.units .l-unit:not(.header)')[index+1]).addClass('focus'); $('html, body').animate({ scrollTop: $('.units .l-unit.focus').offset().top - 200 }, 80); } } VE.navigation.move_focus_up = function(){ var index = parseInt($('.units .l-unit:not(.header)').index($('.units .l-unit.focus'))); if(index == -1) index = 0; if($('.l-menu').hasClass('active') || $('.l-stat').hasClass('active')){ $('.l-menu').removeClass('active'); $('.l-stat').removeClass('active'); $('.units').addClass('active'); index++; } if(index > 0){ $('.units .l-unit.focus').removeClass('focus'); $($('.units .l-unit:not(.header)')[index-1]).addClass('focus'); $('html, body').animate({ scrollTop: $('.units .l-unit.focus').offset().top - 200 }, 80); } } VE.navigation.switch_menu = function(position){ position = position || 'first'; // last if(VE.navigation.state.active_menu == 0){ VE.navigation.state.active_menu = 1; VE.navigation.state.menu_selector = '.l-stat__col'; VE.navigation.state.menu_active_selector = '.l-stat__col--active'; $('.l-menu').removeClass('active'); $('.l-stat').addClass('active'); if(position == 'first'){ $($(VE.navigation.state.menu_selector)[0]).addClass('focus'); } else { var max_index = $(VE.navigation.state.menu_selector).length-1; $($(VE.navigation.state.menu_selector)[max_index]).addClass('focus'); } } else { VE.navigation.state.active_menu = 0; VE.navigation.state.menu_selector = '.l-menu__item'; VE.navigation.state.menu_active_selector = '.l-menu__item--active'; $('.l-menu').addClass('active'); $('.l-stat').removeClass('active'); if(position == 'first'){ $($(VE.navigation.state.menu_selector)[0]).addClass('focus'); } else { var max_index = $(VE.navigation.state.menu_selector).length-1; $($(VE.navigation.state.menu_selector)[max_index]).addClass('focus'); } } } VE.notifications.get_list = function(){ /// TODO get notifications only once $.ajax({ url: "/list/notifications/?ajax=1", dataType: "json" }).done(function(data) { var acc = []; $.each(data, function(i, elm){ var tpl = Tpl.get('notification', 'WEB'); if(elm.ACK == 'no') tpl.set(':UNSEEN', 'unseen'); else tpl.set(':UNSEEN', ''); tpl.set(':ID', elm.ID); tpl.set(':TYPE', elm.TYPE); tpl.set(':TOPIC', elm.TOPIC); tpl.set(':NOTICE', elm.NOTICE); acc.push(tpl.finalize()); }); if(!Object.keys(data).length){ var tpl = Tpl.get('notification_empty', 'WEB'); acc.push(tpl.finalize()); } $('.notification-container').html(acc.done()).show(); $('.notification-container .mark-seen').click(function(event){ // VE.notifications.mark_seen($(event.target).attr('id').replace("notification-", "")); VE.notifications.delete($(event.target).attr('id').replace("notification-", "")); }); }); } VE.notifications.delete = function(id){ $('#notification-'+id).parents('li').hide(); $.ajax({ url: "/delete/notification/?delete=1¬ification_id="+id+"&token="+$('#token').attr('token') }); if($('.notification-container li:visible').length == 0) $('.l-profile__notifications').removeClass('updates').removeClass('active'); } VE.notifications.mark_seen = function(id){ $('#notification-'+id).parents('li').removeClass('unseen'); $.ajax({ url: "/delete/notification/?notification_id="+id+"&token="+$('#token').attr('token') }); if($('.notification-container .unseen').length == 0) $('.l-profile__notifications').removeClass('updates'); } VE.navigation.init = function(){ if($('.l-menu__item.l-menu__item--active').length){ // VE.navigation.switch_menu(); VE.navigation.state.active_menu = 0; VE.navigation.state.menu_selector = '.l-menu__item'; VE.navigation.state.menu_active_selector = '.l-menu__item--active'; $('.l-menu').addClass('active'); $('.l-stat').removeClass('active'); } else { $('.l-stat').addClass('active'); } } VE.navigation.shortcut = function(elm){ var action = elm.attr('key-action'); if(action == 'js'){ var e = elm.find('.data-controls'); VE.core.dispatch(true, e, 'click'); } if(action == 'href') { location.href=elm.find('a').attr('href'); } } VE.helpers.extendPasswordFields();