var FFZ = window.FrankerFaceZ, constants = require('../constants'); // -------------------- // Initializer // -------------------- FFZ.prototype.setup_menu = function() { this.log("Installing mouse-up event to auto-close menus."); var f = this; jQuery(document).mouseup(function(e) { var popup = f._popup, parent; if ( ! popup ) return; popup = jQuery(popup); parent = popup.parent(); if ( ! parent.is(e.target) && parent.has(e.target).length === 0 ) { popup.remove(); delete f._popup; f._popup_kill && f._popup_kill(); delete f._popup_kill; } }); } FFZ.menu_pages = {}; // -------------------- // Create Menu // -------------------- FFZ.prototype.build_ui_popup = function(view) { var popup = this._popup; if ( popup ) { popup.parentElement.removeChild(popup); delete this._popup; this._popup_kill && this._popup_kill(); delete this._popup_kill; return; } // Start building the DOM. var container = document.createElement('div'), inner = document.createElement('div'), menu = document.createElement('ul'), dark = (this.has_bttv ? BetterTTV.settings.get('darkenedMode') : false); container.className = 'emoticon-selector chat-menu ffz-ui-popup'; inner.className = 'emoticon-selector-box dropmenu'; container.appendChild(inner); container.classList.toggle('dark', dark); // Menu Container var sub_container = document.createElement('div'); sub_container.className = 'ffz-ui-menu-page'; inner.appendChild(sub_container); // Render Menu Tabs menu.className = 'menu clearfix'; inner.appendChild(menu); var heading = document.createElement('li'); heading.className = 'title'; heading.innerHTML = "" + (constants.DEBUG ? "[DEV] " : "") + "FrankerFaceZ"; menu.appendChild(heading); var menu_pages = []; for(var key in FFZ.menu_pages) { if ( ! FFZ.menu_pages.hasOwnProperty(key) ) continue; var page = FFZ.menu_pages[key]; if ( !page || (page.hasOwnProperty("visible") && (!page.visible || (typeof page.visible == "function" && !page.visible.bind(this)()))) ) continue; menu_pages.push([page.sort_order || 0, key, page]); } menu_pages.sort(function(a,b) { if ( a[0] < b[0] ) return 1; else if ( a[0] > b[0] ) return -1; var al = a[1].toLowerCase(), bl = b[1].toLowerCase(); if ( al < bl ) return 1; if ( al > bl ) return -1; return 0; }); for(var i=0; i < menu_pages.length; i++) { var key = menu_pages[i][1], page = menu_pages[i][2], el = document.createElement('li'), link = document.createElement('a'); el.className = 'item'; el.id = "ffz-menu-page-" + key; link.title = page.name; link.innerHTML = page.icon; jQuery(link).tipsy(); link.addEventListener("click", this._ui_change_page.bind(this, view, menu, sub_container, key)); el.appendChild(link); menu.appendChild(el); } // Render Current Page this._ui_change_page(view, menu, sub_container, this._last_page || "channel"); // Add the menu to the DOM. this._popup = container; sub_container.style.maxHeight = Math.max(100, view.$().height() - 162) + "px"; view.$('.chat-interface').append(container); } FFZ.prototype._ui_change_page = function(view, menu, container, page) { this._last_page = page; container.innerHTML = ""; container.setAttribute('data-page', page); var els = menu.querySelectorAll('li.active'); for(var i=0; i < els.length; i++) els[i].classList.remove('active'); var el = menu.querySelector('#ffz-menu-page-' + page); if ( el ) el.classList.add('active'); else this.log("No matching page: " + page); FFZ.menu_pages[page].render.bind(this)(view, container); } // -------------------- // Favorites Page // -------------------- FFZ.prototype._tokenize_message = function(message, room_id) { var lc = App.__container__.lookup('controller:line'), rc = App.__container__.lookup('controller:room'), room = this.rooms[room_id], user = this.get_user(); if ( ! lc || ! rc || ! room ) return [message]; rc.set('model', room.room); lc.set('parentController', rc); var model = { from: user && user.login || "FrankerFaceZ", message: message, tags: { emotes: room.room.tmiSession._emotesParser.parseEmotesTag(message) } }; lc.set('model', model); var tokens = lc.get('tokenizedMessage'); lc.set('model', null); rc.set('model', null); lc.set('parentController', null); return tokens; } /*FFZ.menu_pages.favorites = { render: function(view, container) { // Get the current room. var room_id = view.get('controller.currentRoom.id'); }, name: "Favorites", icon: constants.HEART };*/ // -------------------- // Channel Page // -------------------- FFZ.menu_pages.channel = { render: function(view, inner) { // Get the current room. var room_id = view.get('controller.currentRoom.id'), room = this.rooms[room_id]; // Basic Emote Sets this._emotes_for_sets(inner, view, room && room.menu_sets || []); // Feature Friday! this._feature_friday_ui(room_id, inner, view); }, name: "Channel", icon: constants.ZREKNARF }; // -------------------- // Emotes for Sets // -------------------- FFZ.prototype._emotes_for_sets = function(parent, view, sets, header, btn) { if ( header != null ) { var el_header = document.createElement('div'); el_header.className = 'list-header'; el_header.appendChild(document.createTextNode(header)); if ( btn ) el_header.appendChild(btn); parent.appendChild(el_header); } var grid = document.createElement('div'), c = 0; grid.className = 'emoticon-grid'; for(var i=0; i < sets.length; i++) { var set = this.emote_sets[sets[i]]; if ( ! set || ! set.emotes ) continue; for(var eid in set.emotes) { if ( ! set.emotes.hasOwnProperty(eid) ) continue; var emote = set.emotes[eid]; if ( !set.emotes.hasOwnProperty(eid) || emote.hidden ) continue; c++; var s = document.createElement('span'); s.className = 'emoticon tooltip'; s.style.backgroundImage = 'url("' + emote.url + '")'; s.style.width = emote.width + "px"; s.style.height = emote.height + "px"; s.title = emote.name; s.addEventListener('click', this._add_emote.bind(this, view, emote.name)); grid.appendChild(s); } } if ( !c ) { grid.innerHTML = "This channel has no emoticons."; grid.className = "chat-menu-content ffz-no-emotes center"; } parent.appendChild(grid); } FFZ.prototype._add_emote = function(view, emote) { var input_el, text, room; if ( this.has_bttv ) { input_el = view.get('element').querySelector('textarea'); text = input_el.value; } else { room = view.get('controller.currentRoom'); text = room.get('messageToSend') || ''; } text += (text && text.substr(-1) !== " " ? " " : "") + (emote.name || emote); if ( input_el ) input_el.value = text; else room.set('messageToSend', text); }