diff --git a/app/assets/images/admin/default_image.png b/app/assets/images/admin/default_image.png index a2f6d99..a89151e 100644 Binary files a/app/assets/images/admin/default_image.png and b/app/assets/images/admin/default_image.png differ diff --git a/app/assets/javascripts/admin.coffee b/app/assets/javascripts/admin.coffee new file mode 100644 index 0000000..bbe478d --- /dev/null +++ b/app/assets/javascripts/admin.coffee @@ -0,0 +1,411 @@ + +#= require jquery +#= require jquery_ujs +# require turbolinks + +#= require event_form +#= require bootstrap + +#= require vendor/jquery-sortable +#= require vendor/jquery.event.drag.js +#= require vendor/bootstrap-slider +#= require vendor/jquery.ui.widget +#= require vendor/tmpl.min +#= require vendor/jquery.iframe-transport +#= require vendor/jquery.fileupload +#= require vendor/jquery.fileupload-ui +#= require vendor/jquery.fileupload-process +#= require vendor/select2.min + + +#= require manager +#= require image_files +#= require pane_hover + + +#= require redactor +#= require redactor_plugins/fontsize +#= require redactor_plugins/fontfamily +#= require redactor_plugins/fontcolor + +#= require nested_fields +#= require_tree ./admin + +#require ./shared/jquery.strings.js +#require ./shared/jquery.utils.js +#require ./shared/ui.timepickr.js +#require ./shared/modernizr.js + + +#= require ./shared/raphael +#= require ./shared/morris +#= require_tree ./note_files + +portlet_to_move = false +content_type_to_move =false +@open_collapse3 = -> + $("#collapse3 .panel").show() + $("#collapse3").show() + +@reset_edit_pane = -> + $("#element_form").html() + $("#collapse3").hide() + +@unselect_portlet = -> + $(".portlet.active").removeClass("active") + reset_edit_pane() + +@cancel_move_portlet = -> + $(".move_message").show() + $(".cancel_message").hide() + + $(".move").removeClass("move") + $(".portlet_placeholder").remove() + portlet_to_move = false + +$(document).ready -> + + $(document).on 'click', 'input.datepicker', -> + $(this).datetimepicker( + language: 'fr' + pickTime: false + ).focus(); + + $(document).on 'click', 'input.datetimepicker', -> + $(this).datetimepicker( + use24hours: true + format: 'DD/MM/YYYY hh:mm' + minuteStepping:15 + language: 'fr' + ).focus(); + + + $(document).on 'click', 'input.timepicker', -> + $(this).datetimepicker( + use24hours: true + format: 'DD/MM/YYYY hh:mm' + minuteStepping:15 + pickDate: false + language: 'fr' + ).focus(); + + + + + + + $(document).on "click", ".portlet", (event) -> + if !$(this).hasClass("active") and portlet_to_move == false + + $(".portlet.active").removeClass("active") + $(this).addClass("active") + + + $.ajax({url : $(this).data("edit-link"), type: "GET"}); + $("#collapse3 .trash").attr("href", $(this).data("show-link")); + + event.stopPropagation(); + + $(document).on "click", ".block_portlets", (event) -> + portlet_to_move = false + content_type_to_move = false + $("#element_form").html("") + + $(".portlet.active").removeClass("active") + + + + + + $(document).on "click", "#content_types .content_type", -> + cancel_move_portlet() + unselect_portlet() + reset_edit_pane() + + + type = $(this).data("type") + content_type_to_move = type + init_portlets_place_holder() + $(this).addClass("move") + false + + + + $(document).on "click", ".portlet_handle", -> + if portlet_to_move == false + + $(".move_message").hide() + $(".cancel_message").show() + + + id = $(this).data("portlet-id") + portlet_to_move = $("#portlet_"+id) + init_portlets_place_holder() + portlet_to_move.addClass("move") + false + else + cancel_move_portlet() + + false + + $(document).on "click", ".portlet_placeholder", -> + if portlet_to_move != false + $(this).after portlet_to_move + $(".move").removeClass("move") + $(".portlet_placeholder").remove() + update_block_portlet_order(portlet_to_move.closest(".block_portlets").data("block_id")) + cancel_move_portlet() + else + + block_id = $(this).closest(".block_portlets").data("block_id") + + + $(this).replaceWith('
'); + + $.ajax({ + url:"/portlet/portlets/new.js", + type: "GET", + data: { + block_id : block_id, + position : $(this).attr("data_position"), + content_type : content_type_to_move + } + + }) + content_type_to_move = false + $(".portlet_placeholder").remove() + + + + +@init_portlets_place_holder = -> + placeholder = '
' + $(".block_portlets").each -> + $(this).find(".portlet_placeholder").remove() + $(this).prepend(placeholder) + $(this).find(".portlet").each -> + $(this).after(placeholder) + + + + +@flash_delay = -> + $("#flashs").find(".alert").each -> + + if !$(this).hasClass("delay") + $(this).addClass("delay") + $(this).delay(3000).fadeOut(); + + + +@init_menu_items_list = -> + + if $(".prevv_folder").length > 0 + + $(".prevv_folder").sortable({ + group:"menu_items", + containerSelector :".receptable", + itemSelector:".menu_item_row", + handle: ".handle", + nested:false, + placeholder:"
", + + + }) + oldContainer = "" + $("#sortable_menu_item").sortable({ + group:"menu_items", + containerSelector :".receptable", + itemSelector:".menu_item_row", + handle: ".handle", + nested:true, + placeholder:"
", + afterMove: (placeholder, container) -> + if oldContainer != container and container.el.hasClass("prevv_folder") + if oldContainer + oldContainer.el.removeClass("active") + container.el.addClass("active") + oldContainer = container + onDrop: (item, Container, _super) -> + + + if Container + + parent_id = Container.el.data("parent-id") + menu_id = Container.el.data("menu-id") + id = item.data("menu-item-id") + $.ajax({ + url:"/admin/menu_items/"+id+".js", + type: "PUT", + data: { + reorder : true, + menu_item : { + parent_id : parent_id, + menu_id : menu_id + } + }, + success : -> + + + _super(item) + item.remove() + + }) + + + + + + else + + + + + _super(item) + + sortable_data = {parent_id :$("#sortable_menu_item").data("parent-id"), menu_id :$("#sortable_menu_item").data("menu-id") , menu_items_ids : []} + + $("#sortable_menu_item").find(".menu_item_row").each -> + sortable_data.menu_items_ids.push $(this).data("menu-item-id") + + + $.ajax({url : "/admin/menu_items/reorder", data : sortable_data, type: "POST"}); + + }) + + +@update_block_portlet_order = (block_portlet_id) -> + return_order = [] + + block_portlet = $("#block_portlet_"+block_portlet_id) + + block_data = {block_id : block_portlet.data('block_id'), block_portlet_ids : []} + + block_portlet.children('.portlet').each -> + if $(this).data('portlet_id') + block_data.block_portlet_ids.push($(this).data('portlet_id')) + + + + return_order.push(block_data); + + + + $.ajax({url : "/portlet/portlets/reorder", data : {blocks:return_order}, type: "POST"}) + + +jQuery -> + + $(".inline-contenteditable").keypress (e) -> + if e.which == 13 + false + else + $(this).html($(this).text()) + return true + + + $(document).on 'click', ".portlet_title_content .inline-contenteditable", () -> + + $.ajax + url : "/portlet/title_contents/"+$(this).data("title-id")+"/edit.js", + type: "GET", + + $(document).on 'blur keyup paste', ".portlet_title_content .inline-contenteditable", () -> + $(this).html($(this).text()) + $.ajax + url : "/portlet/title_contents/"+$(this).data("title-id"), + type: "PUT", + data : + title_content : + content : $(this).html() + + + + + $(".sortable").sortable({ + + containerSelector :".block", + itemSelector:".portlet", + handle: ".handle", + nested:true, + placeholder:"
" + + }) + + + + + + flash_delay(); + + + item_catched = "" + + + adjustment = "" + + $("#menu_item_inspector_container").sortable({ + + + itemSelector:"#menu_item_informations", + pullPlaceholder :false, + placeholder : "", + handle: ".inspector_handle", + onDragStart: ($item, container, _super) -> + $item.css({ + height: $item.height(), + width: $item.width() + }) + + $("body").addClass("dragging") + + offset = $item.offset() + pointer = container.rootGroup.pointer + adjustment = { + left: pointer.left - offset.left, + top: pointer.top - offset.top + } + + onCancel : ($item, container, _super) -> + $item.css(position) + $item.removeClass("dragged") + $("body").removeClass("dragging") + + onDrag: ($item, position, _super) -> + + $item.css({ + left: position.left - adjustment.left, + top: position.top - adjustment.top - $(window).scrollTop() + }) + + + + + + }) + + + + + + +$(document).on "scroll", () -> + + if( $(this).scrollTop() <= 52 ) + top = 52 - $(this).scrollTop() + else + top = 0 + + $("#toolbar-text, #menu_item_informations").css + top : top + +$(document).on "click", "#menu_item_informations .save", -> + $(this).closest(".panel").find("form").submit() + return false + +$(document).on "click", "#menu_item_informations h4", -> + $(this).next(".panel").toggle() + return false + + + diff --git a/app/assets/javascripts/admin.js b/app/assets/javascripts/admin.js deleted file mode 100644 index 634a807..0000000 --- a/app/assets/javascripts/admin.js +++ /dev/null @@ -1,34 +0,0 @@ -/* -=require jquery -= require twitter/bootstrap - - -require ./shared/jquery.strings.js -require ./shared/jquery.utils.js -require ./shared/ui.timepickr.js -require ./shared/modernizr.js - -*= require jquery_ujs - - -*= require_tree ./admin - - -*= require ./shared/raphael -*= require ./shared/morris - -*= require_tree ./note_files - - - - - - -*/ - - -$(document).ready(function(){ - - - -}); \ No newline at end of file diff --git a/app/assets/javascripts/admin/redactor.js b/app/assets/javascripts/admin/redactor.js deleted file mode 100755 index 08b8ccf..0000000 --- a/app/assets/javascripts/admin/redactor.js +++ /dev/null @@ -1,4210 +0,0 @@ -/* - Redactor v8.2.2 - Updated: January 17, 2013 - - http://redactorjs.com/ - - Copyright (c) 2009-2013, Imperavi Inc. - License: http://redactorjs.com/license/ - - Usage: $('#content').redactor(); -*/ - -var rwindow, rdocument; - -if (typeof RELANG === 'undefined') -{ - var RELANG = {}; -} - -var RLANG = { - html: 'HTML', - video: 'Insert Video', - image: 'Insert Image', - table: 'Table', - link: 'Link', - link_insert: 'Insert link', - unlink: 'Unlink', - formatting: 'Formatting', - paragraph: 'Paragraph', - quote: 'Quote', - code: 'Code', - header1: 'Header 1', - header2: 'Header 2', - header3: 'Header 3', - header4: 'Header 4', - bold: 'Bold', - italic: 'Italic', - fontcolor: 'Font Color', - backcolor: 'Back Color', - unorderedlist: 'Unordered List', - orderedlist: 'Ordered List', - outdent: 'Outdent', - indent: 'Indent', - cancel: 'Cancel', - insert: 'Insert', - save: 'Save', - _delete: 'Delete', - insert_table: 'Insert Table', - insert_row_above: 'Add Row Above', - insert_row_below: 'Add Row Below', - insert_column_left: 'Add Column Left', - insert_column_right: 'Add Column Right', - delete_column: 'Delete Column', - delete_row: 'Delete Row', - delete_table: 'Delete Table', - rows: 'Rows', - columns: 'Columns', - add_head: 'Add Head', - delete_head: 'Delete Head', - title: 'Title', - image_position: 'Position', - none: 'None', - left: 'Left', - right: 'Right', - image_web_link: 'Image Web Link', - text: 'Text', - mailto: 'Email', - web: 'URL', - video_html_code: 'Video Embed Code', - file: 'Insert File', - upload: 'Upload', - download: 'Download', - choose: 'Choose', - or_choose: 'Or choose', - drop_file_here: 'Drop file here', - align_left: 'Align text to the left', - align_center: 'Center text', - align_right: 'Align text to the right', - align_justify: 'Justify text', - horizontalrule: 'Insert Horizontal Rule', - deleted: 'Deleted', - anchor: 'Anchor', - link_new_tab: 'Open link in new tab', - underline: 'Underline', - alignment: 'Alignment' -}; - -(function($){ - - // Plugin - jQuery.fn.redactor = function(option) - { - return this.each(function() - { - var $obj = $(this); - - var data = $obj.data('redactor'); - if (!data) - { - $obj.data('redactor', (data = new Redactor(this, option))); - } - }); - }; - - - // Initialization - var Redactor = function(element, options) - { - // Element - this.$el = $(element); - - // Lang - if (typeof options !== 'undefined' && typeof options.lang !== 'undefined' && options.lang !== 'en' && typeof RELANG[options.lang] !== 'undefined') - { - RLANG = RELANG[options.lang]; - } - - // Options - this.opts = $.extend({ - - iframe: false, - css: false, // url - - lang: 'en', - direction: 'ltr', // ltr or rtl - - callback: false, // function - keyupCallback: false, // function - keydownCallback: false, // function - execCommandCallback: false, // function - - plugins: false, - cleanup: true, - - focus: false, - tabindex: false, - autoresize: true, - minHeight: false, - fixed: false, - fixedTop: 0, // pixels - fixedBox: false, - source: true, - shortcuts: true, - - mobile: true, - air: false, // true or toolbar - wym: false, - - convertLinks: true, - convertDivs: true, - protocol: 'http://', // for links http or https or ftp or false - - autosave: false, // false or url - autosaveCallback: false, // function - interval: 60, // seconds - - imageGetJson: false, // url (ex. /folder/images.json ) or false - - imageUpload: false, // url - imageUploadCallback: false, // function - imageUploadErrorCallback: false, // function - - fileUpload: false, // url - fileUploadCallback: false, // function - fileUploadErrorCallback: false, // function - - uploadCrossDomain: false, - uploadFields: false, - - observeImages: true, - overlay: true, // modal overlay - - allowedTags: ["form", "input", "button", "select", "option", "datalist", "output", "textarea", "fieldset", "legend", - "section", "header", "hgroup", "aside", "footer", "article", "details", "nav", "progress", "time", "canvas", - "code", "span", "div", "label", "a", "br", "p", "b", "i", "del", "strike", "u", - "img", "video", "source", "track", "audio", "iframe", "object", "embed", "param", "blockquote", - "mark", "cite", "small", "ul", "ol", "li", "hr", "dl", "dt", "dd", "sup", "sub", - "big", "pre", "code", "figure", "figcaption", "strong", "em", "table", "tr", "td", - "th", "tbody", "thead", "tfoot", "h1", "h2", "h3", "h4", "h5", "h6"], - - toolbarExternal: false, // ID selector - - buttonsCustom: {}, - buttonsAdd: [], - buttons: ['html', '|', 'formatting', '|', 'bold', 'italic', 'deleted', '|', 'unorderedlist', 'orderedlist', 'outdent', 'indent', '|', - 'image', 'video', 'file', 'table', 'link', '|', - 'fontcolor', 'backcolor', '|', 'alignment', '|', 'horizontalrule'], // 'underline', 'alignleft', 'aligncenter', 'alignright', 'justify' - - airButtons: ['formatting', '|', 'bold', 'italic', 'deleted', '|', 'unorderedlist', 'orderedlist', 'outdent', 'indent', '|', 'fontcolor', 'backcolor'], - - formattingTags: ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4'], - - activeButtons: ['deleted', 'italic', 'bold', 'underline', 'unorderedlist', 'orderedlist'], // 'alignleft', 'aligncenter', 'alignright', 'justify' - activeButtonsStates: { - b: 'bold', - strong: 'bold', - i: 'italic', - em: 'italic', - del: 'deleted', - strike: 'deleted', - ul: 'unorderedlist', - ol: 'orderedlist', - u: 'underline' - }, - - colors: [ - '#ffffff', '#000000', '#eeece1', '#1f497d', '#4f81bd', '#c0504d', '#9bbb59', '#8064a2', '#4bacc6', '#f79646', '#ffff00', - '#f2f2f2', '#7f7f7f', '#ddd9c3', '#c6d9f0', '#dbe5f1', '#f2dcdb', '#ebf1dd', '#e5e0ec', '#dbeef3', '#fdeada', '#fff2ca', - '#d8d8d8', '#595959', '#c4bd97', '#8db3e2', '#b8cce4', '#e5b9b7', '#d7e3bc', '#ccc1d9', '#b7dde8', '#fbd5b5', '#ffe694', - '#bfbfbf', '#3f3f3f', '#938953', '#548dd4', '#95b3d7', '#d99694', '#c3d69b', '#b2a2c7', '#b7dde8', '#fac08f', '#f2c314', - '#a5a5a5', '#262626', '#494429', '#17365d', '#366092', '#953734', '#76923c', '#5f497a', '#92cddc', '#e36c09', '#c09100', - '#7f7f7f', '#0c0c0c', '#1d1b10', '#0f243e', '#244061', '#632423', '#4f6128', '#3f3151', '#31859b', '#974806', '#7f6000'], - - // private - emptyHtml: '


', - buffer: false, - visual: true, - - // modal windows container - modal_file: String() + - '
' + - '
' + - '' + - '' + - '
' + - '' + - '
' + - '

' + - '
', - - modal_image_edit: String() + - '
' + - '' + - '' + - '' + - '' + - '' + - '' + - '
' + - '', - - modal_image: String() + - '
' + - '
' + - '' + RLANG.upload + '' + - '' + RLANG.choose + '' + - '' + RLANG.link + '' + - '
' + - '
' + - '
' + - '' + - '
' + - '' + - '
' + - '' + - '
' + - '', - - modal_link: String() + - '
' + - '
' + - '
' + - 'URL' + - 'Email' + - '' + RLANG.anchor + '' + - '
' + - '' + - '
' + - '' + - '' + - '' + - '
' + - '' + - '' + - '
' + - '
' + - '', - - modal_table: String() + - '
' + - '' + - '' + - '' + - '' + - '
' + - '', - - modal_video: String() + - '
' + - '
' + - '' + - '' + - '
' + - '
'+ - '', - - toolbar: { - html: - { - title: RLANG.html, - func: 'toggle' - }, - formatting: - { - title: RLANG.formatting, - func: 'show', - dropdown: - { - p: - { - title: RLANG.paragraph, - exec: 'formatblock' - }, - blockquote: - { - title: RLANG.quote, - exec: 'formatblock', - className: 'redactor_format_blockquote' - }, - pre: - { - title: RLANG.code, - exec: 'formatblock', - className: 'redactor_format_pre' - }, - h1: - { - title: RLANG.header1, - exec: 'formatblock', - className: 'redactor_format_h1' - }, - h2: - { - title: RLANG.header2, - exec: 'formatblock', - className: 'redactor_format_h2' - }, - h3: - { - title: RLANG.header3, - exec: 'formatblock', - className: 'redactor_format_h3' - }, - h4: - { - title: RLANG.header4, - exec: 'formatblock', - className: 'redactor_format_h4' - } - } - }, - bold: - { - title: RLANG.bold, - exec: 'bold' - }, - italic: - { - title: RLANG.italic, - exec: 'italic' - }, - deleted: - { - title: RLANG.deleted, - exec: 'strikethrough' - }, - underline: - { - title: RLANG.underline, - exec: 'underline' - }, - unorderedlist: - { - title: '• ' + RLANG.unorderedlist, - exec: 'insertunorderedlist' - }, - orderedlist: - { - title: '1. ' + RLANG.orderedlist, - exec: 'insertorderedlist' - }, - outdent: - { - title: '< ' + RLANG.outdent, - exec: 'outdent' - }, - indent: - { - title: '> ' + RLANG.indent, - exec: 'indent' - }, - image: - { - title: RLANG.image, - func: 'showImage' - }, - video: - { - title: RLANG.video, - func: 'showVideo' - }, - file: - { - title: RLANG.file, - func: 'showFile' - }, - table: - { - title: RLANG.table, - func: 'show', - dropdown: - { - insert_table: - { - title: RLANG.insert_table, - func: 'showTable' - }, - separator_drop1: - { - name: 'separator' - }, - insert_row_above: - { - title: RLANG.insert_row_above, - func: 'insertRowAbove' - }, - insert_row_below: - { - title: RLANG.insert_row_below, - func: 'insertRowBelow' - }, - insert_column_left: - { - title: RLANG.insert_column_left, - func: 'insertColumnLeft' - }, - insert_column_right: - { - title: RLANG.insert_column_right, - func: 'insertColumnRight' - }, - separator_drop2: - { - name: 'separator' - }, - add_head: - { - title: RLANG.add_head, - func: 'addHead' - }, - delete_head: - { - title: RLANG.delete_head, - func: 'deleteHead' - }, - separator_drop3: - { - name: 'separator' - }, - delete_column: - { - title: RLANG.delete_column, - func: 'deleteColumn' - }, - delete_row: - { - title: RLANG.delete_row, - func: 'deleteRow' - }, - delete_table: - { - title: RLANG.delete_table, - func: 'deleteTable' - } - } - }, - link: - { - title: RLANG.link, - func: 'show', - dropdown: - { - link: - { - title: RLANG.link_insert, - func: 'showLink' - }, - unlink: - { - title: RLANG.unlink, - exec: 'unlink' - } - } - }, - fontcolor: - { - title: RLANG.fontcolor, - func: 'show' - }, - backcolor: - { - title: RLANG.backcolor, - func: 'show' - }, - alignment: - { - title: RLANG.alignment, - func: 'show', - dropdown: - { - alignleft: - { - title: RLANG.align_left, - exec: 'JustifyLeft' - }, - aligncenter: - { - title: RLANG.align_center, - exec: 'JustifyCenter' - }, - alignright: - { - title: RLANG.align_right, - exec: 'JustifyRight' - }, - justify: - { - title: RLANG.align_justify, - exec: 'JustifyFull' - } - } - }, - alignleft: - { - exec: 'JustifyLeft', - title: RLANG.align_left - }, - aligncenter: - { - exec: 'JustifyCenter', - title: RLANG.align_center - }, - alignright: - { - exec: 'JustifyRight', - title: RLANG.align_right - }, - justify: - { - exec: 'JustifyFull', - title: RLANG.align_justify - }, - horizontalrule: - { - exec: 'inserthorizontalrule', - title: RLANG.horizontalrule - } - } - - - }, options, this.$el.data()); - - this.dropdowns = []; - - // Init - this.init(); - }; - - // Functionality - Redactor.prototype = { - - - // Initialization - init: function() - { - // get dimensions - this.height = this.$el.css('height'); - this.width = this.$el.css('width'); - - rdocument = this.document = document; - rwindow = this.window = window; - - // mobile - if (this.opts.mobile === false && this.isMobile()) - { - this.build(true); - return false; - } - - // iframe - if (this.opts.iframe) - { - this.opts.autoresize = false; - } - - // extend buttons - if (this.opts.air) - { - this.opts.buttons = this.opts.airButtons; - } - else if (this.opts.toolbar !== false) - { - if (this.opts.source === false) - { - var index = this.opts.buttons.indexOf('html'); - var next = this.opts.buttons[index+1]; - this.opts.buttons.splice(index, 1); - if (typeof next !== 'undefined' && next === '|') - { - this.opts.buttons.splice(index, 1); - } - } - - $.extend(this.opts.toolbar, this.opts.buttonsCustom); - $.each(this.opts.buttonsAdd, $.proxy(function(i,s) - { - this.opts.buttons.push(s); - - }, this)); - } - - // formatting tags - if (this.opts.toolbar !== false) - { - $.each(this.opts.toolbar.formatting.dropdown, $.proxy(function(i,s) - { - if ($.inArray(i, this.opts.formattingTags) == '-1') - { - delete this.opts.toolbar.formatting.dropdown[i]; - } - - }, this)); - } - - function afterBuild() - { - // air enable - this.enableAir(); - - // toolbar - this.buildToolbar(); - - // PLUGINS - if (typeof this.opts.plugins === 'object') - { - $.each(this.opts.plugins, $.proxy(function(i,s) - { - if (typeof RedactorPlugins[s] !== 'undefined') - { - $.extend(this, RedactorPlugins[s]); - - if (typeof RedactorPlugins[s].init !== 'undefined') - { - this.init(); - } - } - - }, this)); - } - - // buttons response - if (this.opts.activeButtons !== false && this.opts.toolbar !== false) - { - var observeFormatting = $.proxy(function() { this.observeFormatting(); }, this); - this.$editor.click(observeFormatting).keyup(observeFormatting); - } - - // paste - var oldsafari = false; - if (this.browser('webkit') && navigator.userAgent.indexOf('Chrome') === -1) - { - var arr = this.browser('version').split('.'); - if (arr[0] < 536) oldsafari = true; - } - - if (this.isMobile(true) === false && oldsafari === false) - { - this.$editor.bind('paste', $.proxy(function(e) - { - if (this.opts.cleanup === false) - { - return true; - } - - this.pasteRunning = true; - - this.setBuffer(); - - if (this.opts.autoresize === true) - { - this.saveScroll = this.document.body.scrollTop; - } - else - { - this.saveScroll = this.$editor.scrollTop(); - } - - var frag = this.extractContent(); - - setTimeout($.proxy(function() - { - var pastedFrag = this.extractContent(); - this.$editor.append(frag); - - this.restoreSelection(); - - var html = this.getFragmentHtml(pastedFrag); - this.pasteCleanUp(html); - this.pasteRunning = false; - - }, this), 1); - - }, this)); - } - - // key handlers - this.keyup(); - this.keydown(); - - // autosave - if (this.opts.autosave !== false) - { - this.autoSave(); - } - - // observers - setTimeout($.proxy(function() - { - this.observeImages(); - this.observeTables(); - - }, this), 1); - - // FF fix - if (this.browser('mozilla')) - { - this.$editor.click($.proxy(function() - { - this.saveSelection(); - }, this)); - - try - { - this.document.execCommand('enableObjectResizing', false, false); - this.document.execCommand('enableInlineTableEditing', false, false); - } - catch (e) {} - } - - // focus - if (this.opts.focus) - { - setTimeout($.proxy(function(){ - this.$editor.focus(); - }, this), 1); - } - - // fixed - if (this.opts.fixed) - { - this.observeScroll(); - $(document).scroll($.proxy(this.observeScroll, this)); - } - - // callback - if (typeof this.opts.callback === 'function') - { - this.opts.callback(this); - } - - if (this.opts.toolbar !== false) - { - this.$toolbar.find('a').attr('tabindex', '-1'); - } - } - - // construct editor - this.build(false, afterBuild); - - }, - shortcuts: function(e, cmd) - { - e.preventDefault(); - this.execCommand(cmd, false); - }, - keyup: function() - { - this.$editor.keyup($.proxy(function(e) - { - var key = e.keyCode || e.which; - - if (this.browser('mozilla') && !this.pasteRunning) - { - this.saveSelection(); - } - - // callback as you type - if (typeof this.opts.keyupCallback === 'function') - { - this.opts.keyupCallback(this, e); - } - - // if empty - if (key === 8 || key === 46) - { - this.observeImages(); - return this.formatEmpty(e); - } - - // new line p - if (key === 13 && !e.shiftKey && !e.ctrlKey && !e.metaKey) - { - if (this.browser('webkit')) - { - this.formatNewLine(e); - } - - // convert links - if (this.opts.convertLinks) - { - this.$editor.linkify(); - } - } - - this.syncCode(); - - }, this)); - }, - keydown: function() - { - this.$editor.keydown($.proxy(function(e) - { - var key = e.keyCode || e.which; - var parent = this.getParentNode(); - var current = this.getCurrentNode(); - var pre = false; - var ctrl = e.ctrlKey || e.metaKey; - - if ((parent || current) && ($(parent).get(0).tagName === 'PRE' || $(current).get(0).tagName === 'PRE')) - { - pre = true; - } - - // callback keydown - if (typeof this.opts.keydownCallback === 'function') - { - this.opts.keydownCallback(this, e); - } - - if (ctrl && this.opts.shortcuts) - { - if (key === 90) - { - if (this.opts.buffer !== false) - { - e.preventDefault(); - this.getBuffer(); - } - else if (e.shiftKey) - { - this.shortcuts(e, 'redo'); // Ctrl + Shift + z - } - else - { - this.shortcuts(e, 'undo'); // Ctrl + z - } - } - else if (key === 77) - { - this.shortcuts(e, 'removeFormat'); // Ctrl + m - } - else if (key === 66) - { - this.shortcuts(e, 'bold'); // Ctrl + b - } - else if (key === 73) - { - this.shortcuts(e, 'italic'); // Ctrl + i - } - else if (key === 74) - { - this.shortcuts(e, 'insertunorderedlist'); // Ctrl + j - } - else if (key === 75) - { - this.shortcuts(e, 'insertorderedlist'); // Ctrl + k - } - else if (key === 76) - { - this.shortcuts(e, 'superscript'); // Ctrl + l - } - else if (key === 72) - { - this.shortcuts(e, 'subscript'); // Ctrl + h - } - } - - // clear undo buffer - if (!ctrl && key !== 90) - { - this.opts.buffer = false; - } - - // enter - if (pre === true && key === 13) - { - e.preventDefault(); - - var html = $(current).parent().text(); - this.insertNodeAtCaret(this.document.createTextNode('\r\n')); - if (html.search(/\s$/) == -1) - { - this.insertNodeAtCaret(this.document.createTextNode('\r\n')); - } - this.syncCode(); - - return false; - } - - // tab - if (this.opts.shortcuts && !e.shiftKey && key === 9) - { - if (pre === false) - { - this.shortcuts(e, 'indent'); // Tab - } - else - { - e.preventDefault(); - this.insertNodeAtCaret(this.document.createTextNode('\t')); - this.syncCode(); - return false; - } - } - else if (this.opts.shortcuts && e.shiftKey && key === 9 ) - { - this.shortcuts(e, 'outdent'); // Shift + tab - } - - // safari shift key + enter - if (this.browser('webkit') && navigator.userAgent.indexOf('Chrome') === -1) - { - return this.safariShiftKeyEnter(e, key); - } - }, this)); - }, - build: function(mobile, whendone) - { - if (mobile !== true) - { - // container - this.$box = $('
'); - - // air box - if (this.opts.air) - { - this.air = $(''); - } - - this.$content = null; - - function initFrame() - { - this.$editor = this.$content.contents().find("body").attr('contenteditable', true).attr('dir', this.opts.direction); - - rdocument = this.document = this.$editor[0].ownerDocument; - rwindow = this.window = this.document.defaultView || window; - - if (this.opts.css !== false) - { - this.$content.contents().find('head').append(''); - } - - this.$editor.html(html); - - if (whendone) - { - whendone.call(this); - whendone = null; - } - } - - // editor - this.textareamode = true; - if (this.$el.get(0).tagName === 'TEXTAREA') - { - if(this.opts.iframe) - { - var me = this; - this.$content = $('').load(function() - { - initFrame.call(me); - }); - } - else - { - this.$content = this.$editor = $('
'); - } - - var classlist = this.$el.get(0).className.split(/\s+/); - $.each(classlist, $.proxy(function(i,s) - { - this.$content.addClass('redactor_' + s); - }, this)); - } - else - { - this.textareamode = false; - this.$content = this.$editor = this.$el; - this.$el = $('').css('height', this.height); - } - - if (this.$editor) - { - this.$editor.addClass('redactor_editor').attr('contenteditable', true).attr('dir', this.opts.direction); - } - - if (this.opts.tabindex !== false) - { - this.$content.attr('tabindex', this.opts.tabindex); - } - - if (this.opts.minHeight !== false) - { - this.$content.css('min-height', this.opts.minHeight + 'px'); - } - - if (this.opts.wym === true) - { - this.$content.addClass('redactor_editor_wym'); - } - - if (this.opts.autoresize === false) - { - this.$content.css('height', this.height); - } - - // hide textarea - this.$el.hide(); - - // append box and frame - var html = ''; - if (this.textareamode) - { - // get html - html = this.$el.val(); - html = this.savePreCode(html); - - this.$box.insertAfter(this.$el).append(this.$content).append(this.$el); - } - else - { - // get html - html = this.$editor.html(); - html = this.savePreCode(html); - - this.$box.insertAfter(this.$content).append(this.$el).append(this.$editor); - - } - - // conver newlines to p - html = this.paragraphy(html); - - // enable - if (this.$editor) - { - this.$editor.html(html); - } - - if (this.textareamode === false) - { - this.syncCode(); - } - } - else - { - if (this.$el.get(0).tagName !== 'TEXTAREA') - { - var html = this.$el.val(); - var textarea = $('').css('height', this.height).val(html); - this.$el.hide(); - this.$el.after(textarea); - } - } - - if (whendone && this.$editor) - { - whendone.call(this); - } - - }, - enableAir: function() - { - if (this.opts.air === false) - { - return false; - } - - this.air.hide(); - - this.$editor.bind('textselect', $.proxy(function(e) - { - this.showAir(e); - - }, this)); - - this.$editor.bind('textunselect', $.proxy(function() - { - this.air.hide(); - - }, this)); - - }, - showAir: function(e) - { - $('.redactor_air').hide(); - - var width = this.air.innerWidth(); - var left = e.clientX; - - if ($(this.document).width() < (left + width)) - { - left = left - width; - } - - var top = e.clientY + $(document).scrollTop() + 14; - if (this.opts.iframe === true) - { - top = top + this.$box.position().top; - left = left + this.$box.position().left; - } - - this.air.css({ left: left + 'px', top: top + 'px' }).show(); - }, - syncCode: function() - { - this.$el.val(this.$editor.html()); - }, - - // API functions - setCode: function(html) - { - html = this.stripTags(html); - this.$editor.html(html).focus(); - - this.syncCode(); - }, - getCode: function() - { - var html = ''; - if (this.opts.visual) - { - html = this.$editor.html() - } - else - { - html = this.$el.val(); - } - - return this.stripTags(html); - }, - insertHtml: function(html) - { - this.$editor.focus(); - this.pasteHtmlAtCaret(html); - this.observeImages(); - this.syncCode(); - }, - - pasteHtmlAtCaret: function (html) - { - var sel, range; - if (this.document.getSelection) - { - sel = this.window.getSelection(); - if (sel.getRangeAt && sel.rangeCount) - { - range = sel.getRangeAt(0); - range.deleteContents(); - var el = this.document.createElement("div"); - el.innerHTML = html; - var frag = this.document.createDocumentFragment(), node, lastNode; - while (node = el.firstChild) - { - lastNode = frag.appendChild(node); - } - range.insertNode(frag); - - if (lastNode) - { - range = range.cloneRange(); - range.setStartAfter(lastNode); - range.collapse(true); - sel.removeAllRanges(); - sel.addRange(range); - } - } - } - else if (this.document.selection && this.document.selection.type != "Control") - { - this.document.selection.createRange().pasteHTML(html); - } - }, - - destroy: function() - { - var html = this.getCode(); - - if (this.textareamode) - { - this.$box.after(this.$el); - this.$box.remove(); - this.$el.height(this.height).val(html).show(); - } - else - { - this.$box.after(this.$editor); - this.$box.remove(); - this.$editor.removeClass('redactor_editor').removeClass('redactor_editor_wym').attr('contenteditable', false).html(html).show(); - } - - if (this.opts.toolbarExternal) - { - $(this.opts.toolbarExternal).empty(); - } - - $('.redactor_air').remove(); - - for (var i = 0; i < this.dropdowns.length; i++) - { - this.dropdowns[i].remove(); - delete(this.dropdowns[i]); - } - - if (this.opts.autosave !== false) - { - clearInterval(this.autosaveInterval); - } - - }, - // end API functions - - // OBSERVERS - observeFormatting: function() - { - var parent = this.getCurrentNode(); - - this.inactiveAllButtons(); - - $.each(this.opts.activeButtonsStates, $.proxy(function(i,s) - { - if ($(parent).closest(i,this.$editor.get()[0]).length != 0) - { - this.setBtnActive(s); - } - - }, this)); - - var tag = $(parent).closest(['p', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'td']); - - if (typeof tag[0] !== 'undefined' && typeof tag[0].elem !== 'undefined' && $(tag[0].elem).size() != 0) - { - var align = $(tag[0].elem).css('text-align'); - - switch (align) - { - case 'right': - this.setBtnActive('alignright'); - break; - case 'center': - this.setBtnActive('aligncenter'); - break; - case 'justify': - this.setBtnActive('justify'); - break; - default: - this.setBtnActive('alignleft'); - break; - } - } - }, - observeImages: function() - { - if (this.opts.observeImages === false) - { - return false; - } - - this.$editor.find('img').each($.proxy(function(i,s) - { - if (this.browser('msie')) - { - $(s).attr('unselectable', 'on'); - } - - this.resizeImage(s); - - }, this)); - - }, - observeTables: function() - { - this.$editor.find('table').click($.proxy(this.tableObserver, this)); - }, - observeScroll: function() - { - var scrolltop = $(this.document).scrollTop(); - var boxtop = this.$box.offset().top; - var left = 0; - - if (scrolltop > boxtop) - { - var width = '100%'; - if (this.opts.fixedBox) - { - left = this.$box.offset().left; - width = this.$box.innerWidth(); - } - - this.fixed = true; - this.$toolbar.css({ position: 'fixed', width: width, zIndex: 1005, top: this.opts.fixedTop + 'px', left: left }); - } - else - { - this.fixed = false; - this.$toolbar.css({ position: 'relative', width: 'auto', zIndex: 1, top: 0, left: left }); - } - }, - - // BUFFER - setBuffer: function() - { - this.saveSelection(); - this.opts.buffer = this.$editor.html(); - }, - getBuffer: function() - { - if (this.opts.buffer === false) - { - return false; - } - - this.$editor.html(this.opts.buffer); - - if (!this.browser('msie')) - { - this.restoreSelection(); - } - - this.opts.buffer = false; - }, - - - - // EXECCOMMAND - execCommand: function(cmd, param) - { - if (this.opts.visual == false) - { - this.$el.focus(); - return false; - } - - try - { - - var parent; - - if (cmd === 'inserthtml') - { - if (this.browser('msie')) - { - this.$editor.focus(); - this.document.selection.createRange().pasteHTML(param); - } - else - { - this.pasteHtmlAtCaret(param); - //this.execRun(cmd, param); - } - - this.observeImages(); - } - else if (cmd === 'unlink') - { - parent = this.getParentNode(); - if ($(parent).get(0).tagName === 'A') - { - $(parent).replaceWith($(parent).text()); - } - else - { - this.execRun(cmd, param); - } - } - else if (cmd === 'JustifyLeft' || cmd === 'JustifyCenter' || cmd === 'JustifyRight' || cmd === 'JustifyFull') - { - parent = this.getCurrentNode(); - var tag = $(parent).get(0).tagName; - - if (this.opts.iframe === false && $(parent).parents('.redactor_editor').size() == 0) - { - return false; - } - - var tagsArray = ['P', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'BLOCKQUOTE', 'TD']; - if ($.inArray(tag, tagsArray) != -1) - { - var align = false; - - if (cmd === 'JustifyCenter') - { - align = 'center'; - } - else if (cmd === 'JustifyRight') - { - align = 'right'; - } - else if (cmd === 'JustifyFull') - { - align = 'justify'; - } - - if (align === false) - { - $(parent).css('text-align', ''); - } - else - { - $(parent).css('text-align', align); - } - } - else - { - this.execRun(cmd, param); - } - } - else if (cmd === 'formatblock' && param === 'blockquote') - { - parent = this.getCurrentNode(); - if ($(parent).get(0).tagName === 'BLOCKQUOTE') - { - if (this.browser('msie')) - { - var node = $('

' + $(parent).html() + '

'); - $(parent).replaceWith(node); - } - else - { - this.execRun(cmd, 'p'); - } - } - else if ($(parent).get(0).tagName === 'P') - { - var parent2 = $(parent).parent(); - if ($(parent2).get(0).tagName === 'BLOCKQUOTE') - { - var node = $('

' + $(parent).html() + '

'); - $(parent2).replaceWith(node); - this.setSelection(node[0], 0, node[0], 0); - } - else - { - if (this.browser('msie')) - { - var node = $('
' + $(parent).html() + '
'); - $(parent).replaceWith(node); - } - else - { - this.execRun(cmd, param); - } - } - } - else - { - this.execRun(cmd, param); - } - } - else if (cmd === 'formatblock' && (param === 'pre' || param === 'p')) - { - parent = this.getParentNode(); - - if ($(parent).get(0).tagName === 'PRE') - { - $(parent).replaceWith('

' + this.encodeEntities($(parent).text()) + '

'); - } - else - { - this.execRun(cmd, param); - } - } - else - { - if (cmd === 'inserthorizontalrule' && this.browser('msie')) - { - this.$editor.focus(); - } - - if (cmd === 'formatblock' && this.browser('mozilla')) - { - this.$editor.focus(); - } - - this.execRun(cmd, param); - } - - if (cmd === 'inserthorizontalrule') - { - this.$editor.find('hr').removeAttr('id'); - } - - this.syncCode(); - - if (this.oldIE()) - { - this.$editor.focus(); - } - - if (typeof this.opts.execCommandCallback === 'function') - { - this.opts.execCommandCallback(this, cmd); - } - - if (this.opts.air) - { - this.air.hide(); - } - } - catch (e) { } - }, - execRun: function(cmd, param) - { - if (cmd === 'formatblock' && this.browser('msie')) - { - param = '<' + param + '>'; - } - - this.document.execCommand(cmd, false, param); - }, - - // FORMAT NEW LINE - formatNewLine: function(e) - { - var parent = this.getParentNode(); - - if (parent.nodeName === 'DIV' && parent.className === 'redactor_editor') - { - var element = $(this.getCurrentNode()); - - if (element.get(0).tagName === 'DIV' && (element.html() === '' || element.html() === '
')) - { - var newElement = $('

').append(element.clone().get(0).childNodes); - element.replaceWith(newElement); - newElement.html('
'); - this.setSelection(newElement[0], 0, newElement[0], 0); - } - } - }, - - // SAFARI SHIFT KEY + ENTER - safariShiftKeyEnter: function(e, key) - { - if (e.shiftKey && key === 13) - { - e.preventDefault(); - this.insertNodeAtCaret($('
').get(0)); - this.syncCode(); - return false; - } - else - { - return true; - } - }, - - // FORMAT EMPTY - formatEmpty: function(e) - { - var html = $.trim(this.$editor.html()); - - if (this.browser('mozilla')) - { - html = html.replace(/
/i, ''); - } - - var thtml = html.replace(/<(?:.|\n)*?>/gm, ''); - - if (html === '' || thtml === '') - { - e.preventDefault(); - - var node = $(this.opts.emptyHtml).get(0); - this.$editor.html(node); - this.setSelection(node, 0, node, 0); - - this.syncCode(); - return false; - } - else - { - this.syncCode(); - } - }, - - // PARAGRAPHY - paragraphy: function (str) - { - str = $.trim(str); - if (str === '' || str === '

') - { - return this.opts.emptyHtml; - } - - // convert div to p - if (this.opts.convertDivs) - { - str = str.replace(/([\w\W]*?)<\/div>/gi, '

$2

'); - } - - // inner functions - var X = function(x, a, b) { return x.replace(new RegExp(a, 'g'), b); }; - var R = function(a, b) { return X(str, a, b); }; - - // block elements - var blocks = '(table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|style|script|object|input|param|p|h[1-6])'; - - //str = '

' + str; - str += '\n'; - - R('
\\s*
', '\n\n'); - R('(<' + blocks + '[^>]*>)', '\n$1'); - R('()', '$1\n\n'); - R('\r\n|\r', '\n'); // newlines - R('\n\n+', '\n\n'); // remove duplicates - R('\n?((.|\n)+?)$', '

$1

\n'); // including one at the end - R('

\\s*?

', ''); // remove empty p - R('

(]*>\\s*)', '$1

'); - R('

([^<]+)\\s*?(]*>)', '

$1

$2'); - R('

\\s*(]*>)\\s*

', '$1'); - R('

(', '$1'); - R('

\\s*(]*>)', '$1'); - R('(]*>)\\s*

', '$1'); - R('(]*>)\\s*
', '$1'); - R('
(\\s*]*>)', '$1'); - - // pre - if (str.indexOf(')((.|\n)*?)', function(m0, m1, m2, m3) - { - return X(m1, '\\\\([\'\"\\\\])', '$1') + X(X(X(m3, '

', '\n'), '

|
', ''), '\\\\([\'\"\\\\])', '$1') + ''; - }); - } - - return R('\n

$', '

'); - }, - - // REMOVE TAGS - stripTags: function(html) - { - var allowed = this.opts.allowedTags; - var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi; - return html.replace(tags, function ($0, $1) - { - return $.inArray($1.toLowerCase(), allowed) > '-1' ? $0 : ''; - }); - }, - - - savePreCode: function(html) - { - var pre = html.match(/([\w\W]*?)<\/pre>/gi); - if (pre !== null) - { - $.each(pre, $.proxy(function(i,s) - { - var arr = s.match(/([\w\W]*?)<\/pre>/i); - arr[2] = this.encodeEntities(arr[2]); - html = html.replace(s, '' + arr[2] + ''); - }, this)); - } - - return html; - }, - encodeEntities: function(str) - { - str = String(str).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"'); - return String(str).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); - }, - cleanupPre: function(s) - { - s = s.replace(/
/gi, '\n'); - s = s.replace(/<\/p>/gi, '\n'); - s = s.replace(/<\/div>/gi, '\n'); - - var tmp = this.document.createElement("div"); - tmp.innerHTML = s; - return tmp.textContent||tmp.innerText; - - }, - - - // PASTE CLEANUP - pasteCleanUp: function(html) - { - var parent = this.getParentNode(); - - // clean up pre - if ($(parent).get(0).tagName === 'PRE') - { - html = this.cleanupPre(html); - this.pasteCleanUpInsert(html); - return true; - } - - // remove comments and php tags - html = html.replace(/|<\?(?:php)?[\s\S]*?\?>/gi, ''); - - // remove nbsp - html = html.replace(/( ){2,}/gi, ' '); - - // remove google docs marker - html = html.replace(/([\w\W]*?)<\/b>/gi, "$2"); - - // strip tags - html = this.stripTags(html); - - // prevert - html = html.replace(/<\/td>/gi, '[td]'); - html = html.replace(/ <\/td>/gi, '[td]'); - html = html.replace(/
<\/td>/gi, '[td]'); - html = html.replace(/([\w\W]*?)<\/a>/gi, '[a href="$2"]$4[/a]'); - html = html.replace(/([\w\W]*?)<\/iframe>/gi, '[iframe$1]$2[/iframe]'); - html = html.replace(/([\w\W]*?)<\/video>/gi, '[video$1]$2[/video]'); - html = html.replace(/([\w\W]*?)<\/audio>/gi, '[audio$1]$2[/audio]'); - html = html.replace(/([\w\W]*?)<\/embed>/gi, '[embed$1]$2[/embed]'); - html = html.replace(/([\w\W]*?)<\/object>/gi, '[object$1]$2[/object]'); - html = html.replace(//gi, '[param$1]'); - html = html.replace(//gi, '[img$1$3]'); - - // remove attributes - html = html.replace(/<(\w+)([\w\W]*?)>/gi, '<$1>'); - - // remove empty - html = html.replace(/<[^\/>][^>]*>(\s*|\t*|\n*| |
)<\/[^>]+>/gi, ''); - html = html.replace(/<[^\/>][^>]*>(\s*|\t*|\n*| |
)<\/[^>]+>/gi, ''); - - // revert - html = html.replace(/\[td\]/gi, ' '); - html = html.replace(/\[a href="(.*?)"\]([\w\W]*?)\[\/a\]/gi, '$2'); - html = html.replace(/\[iframe(.*?)\]([\w\W]*?)\[\/iframe\]/gi, '$2'); - html = html.replace(/\[video(.*?)\]([\w\W]*?)\[\/video\]/gi, '$2'); - html = html.replace(/\[audio(.*?)\]([\w\W]*?)\[\/audio\]/gi, '$2'); - html = html.replace(/\[embed(.*?)\]([\w\W]*?)\[\/embed\]/gi, '$2'); - html = html.replace(/\[object(.*?)\]([\w\W]*?)\[\/object\]/gi, '$2'); - html = html.replace(/\[param(.*?)\]/gi, ''); - html = html.replace(/\[img(.*?)\]/gi, ''); - - - // convert div to p - if (this.opts.convertDivs) - { - html = html.replace(/([\w\W]*?)<\/div>/gi, '

$2

'); - } - - // remove span - html = html.replace(/([\w\W]*?)<\/span>/gi, '$1'); - - html = html.replace(/\n{3,}/gi, '\n'); - - // remove dirty p - html = html.replace(/

/gi, '

'); - html = html.replace(/<\/p><\/p>/gi, '

'); - - // FF fix - if (this.browser('mozilla')) - { - html = html.replace(/
$/gi, ''); - } - - this.pasteCleanUpInsert(html); - - }, - - pasteCleanUpInsert: function(html) - { - this.execCommand('inserthtml', html); - - if (this.opts.autoresize === true) - { - $(this.document.body).scrollTop(this.saveScroll); - } - else - { - this.$editor.scrollTop(this.saveScroll); - } - }, - - - // TEXTAREA CODE FORMATTING - formattingRemove: function(html) - { - // save pre - var prebuffer = []; - var pre = html.match(/([\w\W]*?)<\/pre>/gi); - if (pre !== null) - { - $.each(pre, function(i,s) - { - html = html.replace(s, 'prebuffer_' + i); - prebuffer.push(s); - }); - } - - html = html.replace(/\s{2,}/g, ' '); - html = html.replace(/\n/g, ' '); - html = html.replace(/[\t]*/g, ''); - html = html.replace(/\n\s*\n/g, "\n"); - html = html.replace(/^[\s\n]*/g, ''); - html = html.replace(/[\s\n]*$/g, ''); - html = html.replace(/>\s+<'); - - if (prebuffer) - { - $.each(prebuffer, function(i,s) - { - html = html.replace('prebuffer_' + i, s); - }); - - prebuffer = []; - } - - return html; - }, - formattingIndenting: function(html) - { - html = html.replace(/
  • /g, "\t"); - - return html; - }, - formattingEmptyTags: function(html) - { - var etags = ["
    ","
    \\s*
    ","\\s*","
      ","
        ","
      1. ","
        ","","\\s*", " ", "\\s*", " ", "

        \\s*

        ", "

         

        ", "

        \\s*
        \\s*

        ", "
        \\s*
        ", "
        \\s*
        \\s*
        "]; - for (var i = 0; i < etags.length; ++i) - { - var bbb = etags[i]; - html = html.replace(new RegExp(bbb,'gi'), ""); - } - - return html; - }, - formattingAddBefore: function(html) - { - var lb = '\r\n'; - var btags = ["", '', "","', '', '', '', '', '', '', '', '
        ', '
        ', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']; - for (var i = 0; i < atags.length; ++i) - { - var aaa = atags[i]; - html = html.replace(new RegExp(aaa,'gi'),aaa+lb); - } - - return html; - }, - formatting: function(html) - { - html = this.formattingRemove(html); - - // empty tags - html = this.formattingEmptyTags(html); - - // add formatting before - html = this.formattingAddBefore(html); - - // add formatting after - html = this.formattingAddAfter(html); - - // indenting - html = this.formattingIndenting(html); - - return html; - }, - - // TOGGLE - toggle: function() - { - var html; - - if (this.opts.visual) - { - var height = this.$editor.innerHeight(); - - this.$editor.hide(); - this.$content.hide(); - - html = this.$editor.html(); - //html = $.trim(this.formatting(html)); - - this.$el.height(height).val(html).show().focus(); - - this.setBtnActive('html'); - this.opts.visual = false; - } - else - { - this.$el.hide(); - var html = this.$el.val(); - - //html = this.savePreCode(html); - - // clean up - //html = this.stripTags(html); - - // set code - this.$editor.html(html).show(); - this.$content.show(); - - if (this.$editor.html() === '') - { - this.setCode(this.opts.emptyHtml); - } - - this.$editor.focus(); - - this.setBtnInactive('html'); - this.opts.visual = true; - - this.observeImages(); - this.observeTables(); - } - }, - - // AUTOSAVE - autoSave: function() - { - this.autosaveInterval = setInterval($.proxy(function() - { - $.ajax({ - url: this.opts.autosave, - type: 'post', - data: this.$el.attr('name') + '=' + escape(encodeURIComponent(this.getCode())), - success: $.proxy(function(data) - { - // callback - if (typeof this.opts.autosaveCallback === 'function') - { - this.opts.autosaveCallback(data, this); - } - - }, this) - }); - - - }, this), this.opts.interval*1000); - }, - - // TOOLBAR - buildToolbar: function() - { - if (this.opts.toolbar === false) - { - return false; - } - - this.$toolbar = $('
          ').addClass('redactor_toolbar'); - - if (this.opts.air) - { - $(this.air).append(this.$toolbar); - $('body').append(this.air); - } - else - { - if (this.opts.toolbarExternal === false) - { - this.$box.prepend(this.$toolbar); - } - else - { - $(this.opts.toolbarExternal).html(this.$toolbar); - } - } - - $.each(this.opts.buttons, $.proxy(function(i,key) - { - - if (key !== '|' && typeof this.opts.toolbar[key] !== 'undefined') - { - var s = this.opts.toolbar[key]; - - if (this.opts.fileUpload === false && key === 'file') - { - return true; - } - - this.$toolbar.append($('
        • ').append(this.buildButton(key, s))); - } - - - if (key === '|') - { - this.$toolbar.append($('
        • ')); - } - - }, this)); - - }, - buildButton: function(key, s) - { - var button = $(''); - - if (typeof s.func === 'undefined') - { - button.click($.proxy(function() - { - if ($.inArray(key, this.opts.activeButtons) != -1) - { - this.inactiveAllButtons(); - this.setBtnActive(key); - } - - if (this.browser('mozilla')) - { - this.$editor.focus(); - //this.restoreSelection(); - } - - this.execCommand(s.exec, key); - - }, this)); - } - else if (s.func !== 'show') - { - button.click($.proxy(function(e) { - - this[s.func](e); - - }, this)); - } - - if (typeof s.callback !== 'undefined' && s.callback !== false) - { - button.click($.proxy(function(e) { s.callback(this, e, key); }, this)); - } - - // dropdown - if (key === 'backcolor' || key === 'fontcolor' || typeof(s.dropdown) !== 'undefined') - { - var dropdown = $('