Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var messageEditor = Class.create();
- messageEditor.prototype = {
- openTags: new Array(),
- toolbarHeight: 0,
- currentTheme: '',
- themePath: '',
- openDropDownMenu: null,
- setTheme: function(theme)
- {
- if(this.currentTheme != '' || $('editorTheme')) {
- $('editorTheme').remove();
- }
- var stylesheet = document.createElement('link');
- stylesheet.setAttribute('rel', 'stylesheet');
- stylesheet.setAttribute('type', 'text/css');
- stylesheet.setAttribute('href', this.baseURL + 'editor_themes/'+theme+'/stylesheet.css');
- document.getElementsByTagName('head')[0].appendChild(stylesheet);
- this.currentTheme = theme;
- this.themePath = this.baseURL + 'editor_themes/'+theme;
- },
- initialize: function(textarea, options)
- {
- // Sorry Konqueror, but due to a browser bug out of control with textarea values
- // you do not get to use the fancy editor.
- if(MyBB.browser == "konqueror" || (typeof(mybb_editor_disabled) != "undefined" && mybb_editor_disabled == true))
- {
- return false;
- }
- // Establish the base path to this javascript file
- $$('script').each(function(script) {
- if(script.src && script.src.indexOf('editor.js') != -1) {
- this.baseURL = script.src.replace(/editor\.js(.*?)$/, '');
- }
- }, this);
- this.options = options;
- if(this.options)
- {
- if(!this.options.lang)
- {
- return false;
- }
- if(!this.options.rtl)
- {
- this.options.rtl = 0;
- }
- }
- if(this.options && this.options.theme)
- {
- this.setTheme(this.options.theme);
- }
- else
- {
- this.setTheme('default');
- }
- // Defines an array of fonts to be shown in the font drop down.
- this.fonts = new Object();
- this.fonts["Arial"] = "Arial";
- this.fonts["Courier"] = "Courier";
- this.fonts["Impact"] = "Impact";
- this.fonts["Tahoma"] = "Tahoma";
- this.fonts["Times New Roman"] = "Times New Roman";
- this.fonts["Trebuchet MS"] = "Trebuchet MS";
- this.fonts["Verdana"] = "Verdana";
- // An array of font sizes to be shown.
- this.sizes = new Object();
- this.sizes["xx-small"] = this.options.lang.size_xx_small;
- this.sizes["x-small"] = this.options.lang.size_x_small;
- this.sizes["small"] = this.options.lang.size_small;
- this.sizes["medium"] = this.options.lang.size_medium;
- this.sizes["large"] = this.options.lang.size_large;
- this.sizes["x-large"] = this.options.lang.size_x_large;
- this.sizes["xx-large"] = this.options.lang.size_xx_large;
- // An array of colours to be shown.
- this.colors = new Object();
- this.colors[1] = "#800000";
- this.colors[2] = "#8B4513";
- this.colors[3] = "#006400";
- this.colors[4] = "#2F4F4F";
- this.colors[5] = "#000080";
- this.colors[6] = "#4B0082";
- this.colors[7] = "#800080";
- this.colors[8] = "#000000";
- this.colors[9] = "#FF0000";
- this.colors[10] = "#DAA520";
- this.colors[11] = "#6B8E23";
- this.colors[12] = "#708090";
- this.colors[13] = "#0000CD";
- this.colors[14] = "#483D8B";
- this.colors[15] = "#C71585";
- this.colors[16] = "#696969";
- this.colors[17] = "#FF4500";
- this.colors[18] = "#FFA500";
- this.colors[19] = "#808000";
- this.colors[20] = "#4682B4";
- this.colors[21] = "#1E90FF";
- this.colors[22] = "#9400D3";
- this.colors[23] = "#FF1493";
- this.colors[24] = "#A9A9A9";
- this.colors[25] = "#FF6347";
- this.colors[26] = "#FFD700";
- this.colors[27] = "#32CD32";
- this.colors[28] = "#87CEEB";
- this.colors[29] = "#00BFFF";
- this.colors[30] = "#9370DB";
- this.colors[31] = "#FF69B4";
- this.colors[32] = "#DCDCDC";
- this.colors[33] = "#FFDAB9";
- this.colors[34] = "#FFFFE0";
- this.colors[35] = "#98FB98";
- this.colors[36] = "#E0FFFF";
- this.colors[37] = "#87CEFA";
- this.colors[38] = "#E6E6FA";
- this.colors[39] = "#DDA0DD";
- this.colors[40] = "#FFFFFF";
- // An array of video services to be shown (youtube, vimeo, etc)
- this.videos = new Object();
- this.videos["dailymotion"] = this.options.lang.video_dailymotion;
- this.videos["metacafe"] = this.options.lang.video_metacafe;
- this.videos["myspacetv"] = this.options.lang.video_myspacetv;
- this.videos["vimeo"] = this.options.lang.video_vimeo;
- this.videos["yahoo"] = this.options.lang.video_yahoo;
- this.videos["youtube"] = this.options.lang.video_youtube;
- // Here we get the ID of the textarea we're replacing and store it.
- this.textarea = textarea;
- // Only swap it over once the page has loaded (add event)
- if(MyBB.page_loaded == 1)
- {
- this.showEditor();
- }
- else
- {
- Event.observe(document, "dom:loaded", this.showEditor.bindAsEventListener(this));
- }
- },
- showEditor: function()
- {
- // Assign the old textarea to a variable for later use.
- oldTextarea = $(this.textarea);
- // Now this.textarea becomes the new textarea ID
- this.textarea += "_new";
- // Begin the creation of our new editor.
- this.editor = document.createElement("div");
- this.editor.style.position = "relative";
- this.editor.style.display = "none";
- this.editor.className = "messageEditor";
- // Append the new editor
- oldTextarea.parentNode.insertBefore(this.editor, oldTextarea);
- // Determine the overall height and width - messy, but works
- w = oldTextarea.getDimensions().width+"px";
- if(!w || parseInt(w) < 400)
- {
- w = "400px";
- }
- if(this.options && this.options.height)
- {
- h = this.options.height;
- }
- else if(oldTextarea.offsetHeight)
- {
- h = oldTextarea.offsetHeight+"px";
- }
- else if(oldTextarea.clientHeight)
- {
- h = oldTextarea.clientHeight+"px";
- }
- else if(oldTextarea.style.height)
- {
- h = oldTextarea.style.height;
- }
- else
- {
- h = "400px";
- }
- this.editor.style.width = w;
- this.editor.style.height = h;
- this.createToolbarContainer('top');
- this.createToolbar('closetags', {
- container: 'top',
- alignment: 'right',
- items: [
- {type: 'button', name: 'close_tags', insert: 'zzzz', sprite: 'close_tags', width: 80, style: {visibility: 'hidden'}}
- ]
- });
- this.createToolbar('topformatting', {
- container: 'top',
- items: [
- {type: 'dropdown', name: 'font', insert: 'font', title: this.options.lang.font, options: this.fonts},
- {type: 'dropdown', name: 'size', insert: 'size', title: this.options.lang.size, options: this.sizes},
- {type: 'button', name: 'color', insert: 'color', dropdown: true, color_select: true, image: 'color.gif', draw_option: this.drawColorOption, options: this.colors}
- ]
- });
- this.createToolbarContainer('bottom');
- this.createToolbar('insertables', {
- container: 'bottom',
- alignment: 'right',
- items: [
- {type: 'button', name: 'list_num', sprite: 'list_num', insert: 'list', extra: 1, title: this.options.lang.title_numlist},
- {type: 'button', name: 'list_bullet', sprite: 'list_bullet', insert: 'list', title: this.options.lang.title_bulletlist},
- {type: 'separator'},
- {type: 'button', name: 'img', sprite: 'image', insert: 'image', extra: 1, title: this.options.lang.title_image},
- {type: 'button', name: 'url', sprite: 'link', insert: 'url', title: this.options.lang.title_hyperlink},
- {type: 'button', name: 'email', sprite: 'email', insert: 'email', extra: 1, title: this.options.lang.title_email},
- {type: 'separator'},
- {type: 'button', name: 'quote', sprite: 'quote', insert: 'quote', title: this.options.lang.title_quote},
- {type: 'button', name: 'code', sprite: 'code', insert: 'code', title: this.options.lang.title_code},
- {type: 'button', name: 'php', sprite: 'php', insert: 'php', title: this.options.lang.title_php},
- {type: 'button', name: 'video', insert: 'video', image: 'television.gif', dropdown: true, title: this.options.lang.title_video, options: this.videos}
- ]
- });
- this.createToolbar('formatting', {
- container: 'bottom',
- items: [
- {type: 'button', name: 'b', sprite: 'bold', insert: 'b', title: this.options.lang.title_bold},
- {type: 'button', name: 'i', sprite: 'italic', insert: 'i', title: this.options.lang.title_italic},
- {type: 'button', name: 'u', sprite: 'underline', insert: 'u', title: this.options.lang.title_underline},
- {type: 'separator'},
- {type: 'button', name: 'align_left', sprite: 'align_left', insert: 'align', extra: 'left', title: this.options.lang.title_left},
- {type: 'button', name: 'align_center', sprite: 'align_center', insert: 'align', extra: 'center', title: this.options.lang.title_center},
- {type: 'button', name: 'align_right', sprite: 'align_right', insert: 'align', extra: 'right', title: this.options.lang.title_right},
- {type: 'button', name: 'align_justify', sprite: 'align_justify', insert: 'align', extra: 'justify', title: this.options.lang.title_justify}
- ]
- });
- // Create our new text area
- areaContainer = document.createElement("div");
- areaContainer.style.clear = "both";
- // Set the width/height of the area
- subtract = 20;
- subtract2 = 12;
- areaContainer.style.height = parseInt(Element.getDimensions(this.editor).height)-this.toolbarHeight-subtract+"px";
- areaContainer.style.width = parseInt(Element.getDimensions(this.editor).width)-subtract2+"px";
- // Create text area
- textInput = document.createElement("textarea");
- textInput.setAttribute("cols", oldTextarea.getAttribute("cols"));
- textInput.setAttribute("rows", oldTextarea.getAttribute("rows"));
- textInput.id = this.textarea;
- textInput.name = oldTextarea.name+"_new";
- textInput.style.height = parseInt(areaContainer.style.height)+"px";
- textInput.style.width = parseInt(areaContainer.style.width)+"px";
- if(oldTextarea.value != '')
- {
- textInput.value = oldTextarea.value;
- }
- if(oldTextarea.tabIndex)
- {
- textInput.tabIndex = oldTextarea.tabIndex;
- }
- areaContainer.appendChild(textInput);
- this.editor.appendChild(areaContainer);
- if(oldTextarea.form)
- {
- Event.observe(oldTextarea.form, "submit", this.closeTags.bindAsEventListener(this));
- Event.observe(oldTextarea.form, "submit", this.updateOldArea.bindAsEventListener(this));
- }
- // Hide the old editor
- oldTextarea.style.visibility = "hidden";
- oldTextarea.style.position = "absolute";
- oldTextarea.style.top = "-1000px";
- oldTextarea.id += "_old";
- this.oldTextarea = oldTextarea;
- this.editor.style.display = "";
- Event.observe(textInput, "keyup", this.updateOldArea.bindAsEventListener(this));
- if(MyBB.browser == 'ie') {
- Event.observe($(this.textarea), 'focus', function() {
- this.trackingCaret = true;
- }.bindAsEventListener(this));
- Event.observe($(this.textarea), 'blur', function() {
- this.trackingCaret = false;
- }.bindAsEventListener(this));
- Event.observe($(this.textarea), 'mousedown', function() {
- this.trackingCaret = true;
- this.storeCaret();
- }.bindAsEventListener(this));
- }
- Event.observe(textInput, "blur", this.updateOldArea.bindAsEventListener(this));
- },
- drawColorOption: function(option)
- {
- var item = document.createElement('li');
- item.extra = option.value;
- item.className = 'editor_dropdown_color_item';
- item.innerHTML = '<a style="background-color: '+option.value+'"></a>';
- return item;
- },
- createToolbarContainer: function(name)
- {
- if($('editor_toolbar_container_'+name)) return;
- var container = document.createElement("div");
- container.id = 'editor_toolbar_container_'+name;
- container.className = 'toolbar_container';
- this.editor.appendChild(container);
- this.toolbarHeight += 28;
- return container;
- },
- createToolbar: function(name, options)
- {
- if(typeof(options.container) == 'undefined')
- {
- options.container = this.createToolbarContainer('auto_'+name);
- }
- else {
- options.container = $('editor_toolbar_container_'+options.container);
- if(!options.container) return;
- }
- if($('editor_toolbar_'+name)) return;
- var toolbar = document.createElement('div');
- toolbar.id = 'editor_toolbar_'+name;
- toolbar.className = 'toolbar';
- var clear = document.createElement('br');
- clear.style.clear = 'both';
- toolbar.appendChild(clear);
- if(options.alignment && options.alignment == 'right') {
- toolbar.className += ' float_right';
- }
- options.container.appendChild(toolbar);
- if(typeof(options.items) == 'object') {
- for(var i = 0; i < options.items.length; ++i) {
- this.addToolbarItem(toolbar, options.items[i]);
- }
- }
- // add closing item
- if(toolbar.lastChild.previousSibling)
- toolbar.lastChild.previousSibling.className += ' toolbar_button_group_last';
- },
- setElementState: function(element, state) {
- element.addClassName('toolbar_'+state);
- if(element.hasClassName('toolbar_button_group_first')) {
- if(state == 'clicked') {
- append = 'toolbar_clicked';
- }
- else if(state == 'hover') {
- append = 'toolbar_hover';
- }
- append += '_button_group_first';
- element.addClassName(append);
- }
- if(element.hasClassName('toolbar_button_group_last')) {
- if(state == 'clicked') {
- append = 'toolbar_clicked';
- }
- else if(state == 'hover') {
- append = 'toolbar_hover';
- }
- append += '_button_group_last';
- element.addClassName(append);
- }
- },
- removeElementState: function(element, state)
- {
- element.removeClassName('toolbar_'+state);
- if(element.hasClassName('toolbar_button_group_first')) {
- if(state == 'clicked') {
- append = 'toolbar_clicked';
- }
- else if(state == 'hover') {
- append = 'toolbar_hover';
- }
- append += '_button_group_first';
- element.removeClassName(append);
- }
- if(element.hasClassName('toolbar_button_group_last')) {
- if(state == 'clicked') {
- append = 'toolbar_clicked';
- }
- else if(state == 'hover') {
- append = 'toolbar_hover';
- }
- append += '_button_group_last';
- element.removeClassName(append);
- }
- },
- dropDownMenuItemClick: function(e)
- {
- this.restartEditorSelection();
- element = Event.element(e);
- if(!element)
- return;
- if(!element.extra)
- element = element.up('li');
- var mnu = element.up('ul');
- var dropdown = this.getElementToolbarItem(mnu);
- var label = dropdown.down('.editor_dropdown_label');
- if(!dropdown.insertText || (dropdown.insertText != "video" && mnu.activeItem && mnu.activeItem == element))
- return;
- mnu.lastItemValue = element.extra;
- if(this.getSelectedText($(this.textarea)))
- {
- this.setDropDownMenuActiveItem(dropdown, 0);
- }
- else
- {
- if(label)
- {
- label.innerHTML = element.innerHTML;
- label.style.overflow = 'hidden';
- }
- var sel_color = dropdown.down('.editor_button_color_selected')
- if(sel_color)
- {
- sel_color.style.backgroundColor = element.extra;
- var use_default = dropdown.down('.editor_dropdown_color_item_default');
- if(use_default) use_default.style.display = '';
- }
- mnu.activeItem = element;
- element.addClassName('editor_dropdown_menu_item_active');
- }
- this.insertMyCode(dropdown.insertText, element.extra);
- this.hideOpenDropDownMenu();
- Event.stop(e);
- },
- setDropDownMenuActiveItem: function(element, index)
- {
- if(element == null)
- {
- return;
- }
- var mnu = element.down('ul');
- var label = element.down('.editor_dropdown_label');
- if(mnu.activeItem)
- {
- mnu.activeItem.removeClassName('editor_dropdown_menu_item_active');
- mnu.activeItem = null;
- }
- if(index > 0)
- {
- var item = mnu.childNodes[index];
- if(!item) return;
- mnu.activeItem = item;
- if(label)
- {
- label.innerHTML = item.innerHTML;
- }
- var sel_color = element.down('.editor_dropdown_color_selected')
- if(sel_color)
- {
- sel_color.style.backgroundColor = item.style.backgroundColor;
- mnu.lastItemValue = item.insertExtra;
- var use_default = element.down('.editor_dropdown_color_item_default');
- if(use_default) use_default.style.display = '';
- }
- item.addClassName('editor_dropdown_menu_item_active');
- }
- else
- {
- if(label)
- {
- label.innerHTML = mnu.childNodes[0].innerHTML;
- }
- var sel_color = element.down('.editor_button_color_selected')
- if(sel_color)
- {
- //sel_color.style.backgroundColor = '';
- var use_default = element.down('.editor_dropdown_color_item_default');
- if(use_default) use_default.style.display = 'none';
- }
- this.removeElementState(element, 'clicked');
- }
- },
- createDropDownMenu: function(options)
- {
- var dropdown = document.createElement('div');
- dropdown.elementType = options.type;
- if(options.image || options.sprite)
- dropdown.className = 'toolbar_dropdown_image';
- else
- dropdown.className = 'toolbar_dropdown';
- dropdown.className += ' editor_dropdown toolbar_dropdown_'+options.name;
- dropdown.id = 'editor_item_'+options.name;
- Event.observe(dropdown, 'mouseover', function()
- {
- this.storeCaret();
- dropdown.addClassName('toolbar_dropdown_over');
- }.bindAsEventListener(this));
- Event.observe(dropdown, 'mouseout', function()
- {
- this.storeCaret();
- dropdown.removeClassName('toolbar_dropdown_over');
- }.bindAsEventListener(this));
- dropdown.insertText = options.insert;
- // create the dropdown label container
- var label = document.createElement('div');
- label.className = 'editor_dropdown_label';
- if(options.title)
- {
- label.innerHTML = options.title;
- }
- else
- {
- label.innerHTML = ' ';
- }
- dropdown.appendChild(label)
- // create the arrow
- var arrow = document.createElement('div');
- arrow.className = 'editor_dropdown_arrow';
- dropdown.appendChild(arrow);
- // create the menu item container
- var mnu = this.buildDropDownMenu(options);
- Event.observe(dropdown, 'click', this.toggleDropDownMenu.bindAsEventListener(this));
- dropdown.appendChild(mnu);
- return dropdown;
- },
- buildDropDownMenu: function(options)
- {
- var mnu = document.createElement('ul');
- mnu.className = 'editor_dropdown_menu';
- mnu.style.display = 'none';
- // create the first item
- if(options.title)
- {
- var item = document.createElement('li');
- item.className = 'editor_dropdown_menu_title';
- item.innerHTML = options.title;
- mnu.appendChild(item);
- Event.observe(item, 'click', function()
- {
- if(mnu.activeItem)
- {
- this.restartEditorSelection();
- this.insertMyCode(dropdown.insertText, '-');
- }
- this.setDropDownMenuActiveItem(dropdown, 0);
- }.bindAsEventListener(this));
- }
- $H(options.options).each(function(option)
- {
- if(options.draw_option)
- {
- item = options.draw_option(option)
- }
- else
- {
- var item = document.createElement('li');
- item.innerHTML = option.value;
- var content = document.createElement('span');
- item.appendChild(content);
- item.extra = option.key;
- }
- Event.observe(item, 'click', this.dropDownMenuItemClick.bindAsEventListener(this));
- Event.observe(item, 'mouseover', function()
- {
- item.addClassName('editor_dropdown_menu_item_over');
- });
- Event.observe(item, 'mouseout', function()
- {
- item.removeClassName('editor_dropdown_menu_item_over');
- });
- mnu.appendChild(item);
- }, this);
- return mnu;
- },
- toggleDropDownMenu: function(e)
- {
- element = Event.element(e);
- if(!element)
- return;
- if(!element.elementType)
- element = this.getElementToolbarItem(element);
- var mnu = $(element).down('ul');
- // This menu is already open, close it
- if(mnu.style.display != 'none')
- {
- mnu.style.display = 'none';
- element.removeClassName('editor_dropdown_menu_open');
- this.removeElementState(element, 'clicked');
- this.openDropDownMenu = null;
- Event.stopObserving(document, 'click', this.hideOpenDropDownMenu.bindAsEventListener(this));
- }
- // Opening this menu
- else
- {
- // If a menu is already open, close it first
- this.showDropDownMenu(mnu);
- }
- this.removeElementState(element, 'clicked');
- Event.stop(e);
- },
- showDropDownMenu: function(mnu)
- {
- this.hideOpenDropDownMenu();
- mnu.style.display = '';
- element = this.getElementToolbarItem(mnu);
- element.addClassName('editor_dropdown_menu_open');
- this.setElementState(element, 'clicked');
- this.openDropDownMenu = mnu;
- Event.observe(document, 'click', this.hideOpenDropDownMenu.bindAsEventListener(this));
- },
- hideOpenDropDownMenu: function()
- {
- if(!this.openDropDownMenu) return;
- this.openDropDownMenu.style.display = 'none';
- this.getElementToolbarItem(this.openDropDownMenu).removeClassName('editor_dropdown_menu_open');
- var dropDown = this.getElementToolbarItem(this.openDropDownMenu);
- this.removeElementState(this.openDropDownMenu.parentNode, 'clicked');
- this.removeElementState(element, 'clicked');
- this.openDropDownMenu = null;
- Event.stopObserving(document, 'click', this.hideOpenDropDownMenu.bindAsEventListener(this));
- },
- getElementToolbarItem: function(elem)
- {
- var parent = elem;
- do {
- if(parent.insertText) return parent;
- parent = parent.parentNode;
- } while($(parent));
- return false;
- },
- storeCaret: function()
- {
- if(MyBB.browser != 'ie' || !this.trackingCaret)
- {
- return;
- }
- // Internet explorer errors if you try and select an element... so just handle that by try catch
- try {
- var range = document.selection.createRange();
- var range_all = document.body.createTextRange();
- range_all.moveToElementText($(this.textarea));
- for(var sel_start = 0; range_all.compareEndPoints('StartToStart', range) < 0; sel_start++)
- range_all.moveStart('character', 1);
- var range_all = document.body.createTextRange();
- range_all.moveToElementText($(this.textarea));
- for(var sel_end = 0; range_all.compareEndPoints('StartToEnd', range) < 0; sel_end++)
- range_all.moveStart('character', 1);
- this.lastCaretS = sel_start;
- this.lastCaretE = sel_end;
- } catch(e) { }
- },
- restartEditorSelection: function()
- {
- if(MyBB.browser != 'ie')
- {
- return;
- }
- var range = $(this.textarea).createTextRange();
- range.collapse(true);
- range.moveStart('character', this.lastCaretS);
- range.moveEnd('character', this.lastCaretE - this.lastCaretS);
- range.select();
- },
- addToolbarItem: function(toolbar, options)
- {
- if(typeof(toolbar) == 'string')
- {
- toolbar = $('editor_toolbar_'+toolbar);
- }
- if(!$(toolbar)) return;
- // Does this item already exist?
- if($('editor_item_'+options.name)) return;
- insert_first_class = false;
- // Is this the first item? childnodes = 1 (closing br) or lastchild.previousSibling = sep
- if(toolbar.childNodes.length == 1 || (toolbar.lastChild.previousSibling && toolbar.lastChild.previousSibling.className.indexOf('toolbar_sep') > -1 || (toolbar.lastChild.previousSibling.className.indexOf('editor_dropdown') > -1 && options.type != 'dropdown')))
- {
- insert_first_class = true;
- }
- if(options.type == "dropdown")
- {
- var dropdown = this.createDropDownMenu(options);
- if(dropdown)
- toolbar.insertBefore(dropdown, toolbar.lastChild);
- if(insert_first_class == true)
- dropdown.className += ' toolbar_dropdown_group_first';
- }
- else if(options.type == 'button')
- {
- var button = this.createToolbarButton(options)
- toolbar.insertBefore(button, toolbar.lastChild);
- if(insert_first_class == true)
- button.className += ' toolbar_button_group_first';
- }
- else if(options.type == 'separator')
- {
- if(toolbar.lastChild.previousSibling && !$(toolbar.lastChild.previousSibling).hasClassName('toolbar_dropdown'))
- {
- toolbar.lastChild.previousSibling.className += ' toolbar_button_group_last';
- }
- var separator = document.createElement("span");
- separator.elementType = options.type;
- separator.className = "toolbar_sep";
- toolbar.insertBefore(separator, toolbar.lastChild);
- }
- },
- createToolbarButton: function(options)
- {
- var button = document.createElement('span');
- button.elementType = options.type;
- button.id = 'editor_item_'+options.name;
- if(typeof(options.title) != 'undefined')
- {
- button.title = options.title;
- }
- button.className = 'toolbar_button toolbar_normal toolbar_button_'+options.name;
- if(typeof(options.style) == 'object')
- {
- $H(options.style).each(function(item) {
- eval('button.style.'+item.key+' = "'+item.value+'";');
- });
- }
- button.insertText = options.insert;
- button.insertExtra = '';
- if(typeof(options.extra) != 'undefined')
- button.insertExtra = options.extra;
- if(typeof(options.sprite) != 'undefined')
- {
- var img = document.createElement('span');
- img.className = 'toolbar_sprite toolbar_sprite_'+options.sprite;
- }
- else
- {
- var img = document.createElement('img');
- img.src = this.themePath + "/images/" + options.image;
- }
- button.appendChild(img);
- if(options.dropdown)
- {
- if(options.color_select == true)
- {
- var sel = document.createElement('em');
- sel.className = 'editor_button_color_selected';
- button.appendChild(sel);
- }
- // create the arrow
- var arrow = document.createElement('u');
- arrow.className = 'toolbar_button_arrow';
- button.appendChild(arrow);
- button.className += ' toolbar_button_with_arrow';
- }
- var end = document.createElement('strong');
- button.appendChild(end);
- // Create the actual drop down menu
- if(options.dropdown)
- {
- // create the menu item container
- var mnu = this.buildDropDownMenu(options);
- Event.observe(arrow, 'click', this.toggleDropDownMenu.bindAsEventListener(this));
- Event.observe(button, 'click', this.toggleDropDownMenu.bindAsEventListener(this));
- Event.observe(arrow, 'mouseover', function(e)
- {
- elem = Event.element(e);
- if(!elem) return;
- elem.parentNode.addClassName('toolbar_button_over_arrow');
- });
- Event.observe(arrow, 'mouseout', function(e)
- {
- elem = Event.element(e);
- if(!elem) return;
- elem.parentNode.removeClassName('toolbar_button_over_arrow');
- });
- button.appendChild(mnu);
- button.dropdown = true;
- button.menu = mnu;
- }
- // Does this button have enabled/disabled states?
- if(options.disabled_img || options.disabled_sprite)
- {
- button.disable = function()
- {
- if(button.disabled == true) return;
- if(options.disabled_sprite)
- {
- img.removeClassName('toolbar_sprite_'+options.sprite);
- img.addClassName('toolbar_sprite_disabled_'+options.disabled_sprite);
- }
- else
- img.src = this.themePath + '/images/' + options.disabled_img;
- button.disabled = true;
- };
- button.enable = function()
- {
- if(!button.disabled) return;
- if(options.disabled_sprite)
- {
- img.removeClassName('toolbar_sprite_disabled_'+options.disabled_sprite);
- img.addClassName('toolbar_sprite_'+options.sprite);
- }
- else
- img.src = this.themePath + '/images/' + options.image;
- button.enabled = true;
- };
- if(options.disabled && options.disabled == true)
- {
- button.disable();
- button.disabled = true;
- }
- else
- button.disabled = false;
- }
- Event.observe(button, "mouseover", this.toolbarItemHover.bindAsEventListener(this));
- Event.observe(button, "mouseout", this.toolbarItemOut.bindAsEventListener(this));
- if(!options.dropdown)
- {
- // Dropdown event listener is above...
- Event.observe(button, "click", this.toolbarItemClick.bindAsEventListener(this));
- }
- return button;
- },
- updateOldArea: function(e)
- {
- this.oldTextarea.value = $(this.textarea).value;
- },
- toolbarItemOut: function(e)
- {
- this.storeCaret();
- element = Event.element(e);
- if(!element)
- return false;
- if(!element.elementType)
- element = this.getElementToolbarItem(element);
- if(element.disabled)
- return;
- if(typeof(element.insertText) != 'undefined')
- {
- if(element.insertExtra)
- {
- insertCode = element.insertText+"_"+element.insertExtra;
- }
- else
- {
- insertCode = element.insertText;
- }
- if(this.openTags.indexOf(insertCode) != -1 || element.className.indexOf('editor_dropdown_menu_open') > -1)
- {
- this.setElementState(element, 'clicked');
- }
- }
- this.removeElementState(element, 'hover');
- },
- toolbarItemHover: function(e)
- {
- this.storeCaret();
- element = Event.element(e);
- if(!element)
- return false;
- if(!element.elementType)
- element = this.getElementToolbarItem(element);
- if(element.disabled)
- return;
- if(!element.className || element.className.indexOf('toolbar_clicked') == -1)
- this.setElementState(element, 'hover');
- },
- toolbarItemClick: function(e)
- {
- element = Event.element(e);
- if(!element)
- return false;
- if(!element.elementType)
- element = this.getElementToolbarItem(element);
- if(element.disabled)
- return;
- if(element.dropdown && element.menu)
- {
- if(typeof(element.menu.activeItem) != "undefined")
- {
- Event.stop(e);
- if(!element.menu.lastItemValue)
- {
- this.showDropDownMenu(element.menu);
- }
- else
- {
- this.insertMyCode(element.insertText, element.menu.lastItemValue);
- }
- return;
- }
- }
- if(element.id == "editor_item_close_tags")
- {
- this.closeTags();
- }
- else
- {
- if(typeof(element.insertExtra) != 'undefined')
- this.insertMyCode(element.insertText, element.insertExtra);
- else
- this.insertMyCode(element.insertText);
- }
- },
- insertList: function(type)
- {
- list = "";
- do
- {
- listItem = prompt(this.options.lang.enter_list_item, "");
- if(listItem != "" && listItem != null)
- {
- list = list+"[*]"+listItem+"\n";
- }
- }
- while(listItem != "" && listItem != null);
- if(list == "")
- {
- return false;
- }
- if(type)
- {
- list = "[list="+type+"]\n"+list;
- }
- else
- {
- list = "[list]\n"+list;
- }
- list = list+"[/list]\n";
- this.performInsert(list, "", true, false);
- },
- insertURL: function()
- {
- selectedText = this.getSelectedText($(this.textarea));
- url = prompt(this.options.lang.enter_url, "http://");
- if(url)
- {
- if(!selectedText)
- {
- title = prompt(this.options.lang.enter_url_title, "");
- }
- else
- {
- title = selectedText;
- }
- if(title)
- {
- this.performInsert("[url="+url+"]"+title+"[/url]", "", true, false);
- }
- else
- {
- this.performInsert("[url]"+url+"[/url]", "", true, false);
- }
- }
- },
- insertEmail: function()
- {
- selectedText = this.getSelectedText($(this.textarea));
- email = prompt(this.options.lang.enter_email, "");
- if(email)
- {
- if(!selectedText)
- {
- title = prompt(this.options.lang.enter_email_title, "");
- }
- else
- {
- title = selectedText;
- }
- if(title)
- {
- this.performInsert("[email="+email+"]"+title+"[/email]", "", true, false);
- }
- else
- {
- this.performInsert("[email]"+email+"[/email]", "", true, false);
- }
- }
- },
- insertIMG: function()
- {
- image = prompt(this.options.lang.enter_image, "http://");
- if(image)
- {
- this.performInsert("[img]"+image+"[/img]", "", true);
- }
- },
- insertVideo: function(type)
- {
- selectedText = this.getSelectedText($(this.textarea));
- if(!selectedText)
- {
- url = prompt(this.options.lang.enter_video_url, "http://");
- }
- else
- {
- url = selectedText;
- }
- if(url)
- {
- this.performInsert("[video="+type+"]"+url+"[/video]", "", true, false);
- }
- this.setDropDownMenuActiveItem($('editor_item_video'), 0);
- },
- insertMyCode: function(code, extra)
- {
- this.restartEditorSelection();
- switch(code)
- {
- case "list":
- this.insertList(extra);
- break;
- case "url":
- this.insertURL();
- break;
- case "image":
- this.insertIMG();
- break;
- case "email":
- this.insertEmail();
- break;
- case "video":
- this.insertVideo(extra);
- break;
- default:
- var already_open = false;
- var no_insert = false;
- if(extra)
- {
- var full_tag = code+"_"+extra;
- }
- else
- {
- var full_tag = code;
- }
- var newTags = new Array();
- this.openTags.each(function(tag)
- {
- exploded_tag = tag.split("_");
- if(exploded_tag[0] == code)
- {
- already_open = true;
- this.performInsert("[/"+exploded_tag[0]+"]", "", false);
- var elem = $('editor_item_'+exploded_tag[0]);
- if(elem)
- {
- this.removeElementState(elem, 'clicked');
- }
- if(elem && (elem.elementType == "dropdown" || elem.dropdown || elem.menu))
- {
- this.setDropDownMenuActiveItem(elem, 0);
- }
- if(tag == full_tag)
- {
- no_insert = true;
- }
- }
- else
- {
- newTags[newTags.length] = tag;
- }
- }.bind(this));
- this.openTags = newTags;
- var do_insert = false;
- if(extra != "" && extra != "-" && no_insert == false)
- {
- start_tag = "["+code+"="+extra+"]";
- end_tag = "[/"+code+"]";
- do_insert = true;
- }
- else if(!extra && already_open == false)
- {
- start_tag = "["+code+"]";
- end_tag = "[/"+code+"]";
- do_insert = true;
- }
- if(do_insert == true)
- {
- if(!this.performInsert(start_tag, end_tag, true))
- {
- this.openTags.push(full_tag);
- $('editor_item_close_tags').style.visibility = '';
- }
- else if($('editor_item_'+full_tag))
- {
- this.removeElementState($('editor_item_'+full_tag), 'clicked');
- }
- else if($('editor_item_'+code))
- {
- elem = $('editor_item_'+code);
- if(elem.type == "dropdown" || elem.dropdown || elem.menu)
- this.setDropDownMenuActiveItem($('editor_item_'+start_tag), 0);
- }
- }
- }
- if(this.openTags.length == 0)
- {
- $('editor_item_close_tags').style.visibility = 'hidden';
- }
- },
- getSelectedText: function(element)
- {
- element.focus();
- if(document.selection)
- {
- var selection = document.selection;
- var range = selection.createRange();
- if((selection.type == "Text" || selection.type == "None") && range != null)
- {
- return range.text;
- }
- }
- else if(element.selectionEnd)
- {
- var select_start = element.selectionStart;
- var select_end = element.selectionEnd;
- if(select_end <= 0)
- {
- select_end = element.textLength;
- }
- var start = element.value.substring(0, select_start);
- var middle = element.value.substring(select_start, select_end);
- return middle;
- }
- },
- performInsert: function(open_tag, close_tag, is_single, ignore_selection)
- {
- var is_closed = true;
- if(!ignore_selection)
- {
- var ignore_selection = false;
- }
- if(!close_tag)
- {
- var close_tag = "";
- }
- var textarea = $(this.textarea);
- textarea.focus();
- if(document.selection)
- {
- var selection = document.selection;
- var range = selection.createRange();
- if(ignore_selection != false)
- {
- selection.collapse;
- }
- if((selection.type == "Text" || selection.type == "None") && range != null && ignore_selection != true)
- {
- if(close_tag != "" && range.text.length > 0)
- {
- var keep_selected = true;
- range.text = open_tag+range.text+close_tag;
- }
- else
- {
- var keep_selected = false;
- if(is_single)
- {
- is_closed = false;
- }
- range.text = open_tag;
- }
- range.select();
- }
- else
- {
- textarea.value += open_tag;
- }
- }
- else if(typeof(textarea.selectionEnd) != 'undefined')
- {
- var select_start = textarea.selectionStart;
- var select_end = textarea.selectionEnd;
- var scroll_top = textarea.scrollTop;
- var start = textarea.value.substring(0, select_start);
- var middle = textarea.value.substring(select_start, select_end);
- var end = textarea.value.substring(select_end, textarea.textLength);
- if(select_end - select_start > 0 && ignore_selection != true && close_tag != "")
- {
- var keep_selected = true;
- middle = open_tag+middle+close_tag;
- }
- else
- {
- var keep_selected = false;
- if(is_single)
- {
- is_closed = false;
- }
- middle = open_tag;
- }
- textarea.value = start+middle+end;
- if(keep_selected == true && ignore_selection != true)
- {
- textarea.selectionStart = select_start;
- textarea.selectionEnd = select_start + middle.length;
- }
- else if(ignore_selection != true)
- {
- textarea.selectionStart = select_start + middle.length;
- textarea.selectionEnd = textarea.selectionStart;
- }
- textarea.scrollTop = scroll_top;
- }
- else
- {
- textarea.value += open_tag;
- if(is_single)
- {
- is_closed = false;
- }
- }
- this.updateOldArea();
- textarea.focus();
- this.trackingCaret = true;
- this.storeCaret();
- this.trackingCaret = false;
- return is_closed;
- },
- closeTags: function()
- {
- if(this.openTags[0])
- {
- while(this.openTags[0])
- {
- tag = this.openTags.pop();
- exploded_tag = tag.split("_");
- this.performInsert("[/"+exploded_tag[0]+"]", "", false);
- if($('editor_item_'+exploded_tag[0]))
- {
- tag = $('editor_item_'+exploded_tag[0]);
- }
- else
- {
- tag = $('editor_item_'+tag);
- }
- if(tag)
- {
- if(tag.elementType == "dropdown" || tag.dropdown || tag.menu)
- {
- this.setDropDownMenuActiveItem(tag, 0);
- }
- else
- {
- this.removeElementState(tag, 'clicked');
- }
- }
- }
- }
- $(this.textarea).focus();
- $('editor_item_close_tags').style.visibility = 'hidden';
- this.openTags = new Array();
- },
- bindSmilieInserter: function(id)
- {
- if(!$(id))
- {
- return false;
- }
- var smilies = $(id).select('.smilie');
- if(smilies.length > 0)
- {
- smilies.each(function(smilie)
- {
- smilie.onclick = this.insertSmilie.bindAsEventListener(this);
- smilie.style.cursor = "pointer";
- }.bind(this));
- }
- },
- openGetMoreSmilies: function(editor)
- {
- MyBB.popupWindow('misc.php?action=smilies&popup=true&editor='+editor, 'sminsert', 240, 280);
- },
- insertSmilie: function(e)
- {
- element = Event.element(e);
- if(!element || !element.alt)
- {
- return false;
- }
- this.performInsert(element.alt, "", true, false);
- },
- insertAttachment: function(aid)
- {
- this.performInsert("[attachment="+aid+"]", "", true, false);
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement