fonction tableau de garde

This commit is contained in:
Nicolas Bally 2012-01-27 14:44:28 +01:00
parent 3aaabbad5a
commit e23418b733
146 changed files with 6141 additions and 4769 deletions

View File

@ -1,7 +1,7 @@
source 'http://rubygems.org' source 'http://rubygems.org'
gem 'rails', '3.1.0' gem 'rails', '3.1.0'
gem "rake", "0.8.7" #gem "rake", "0.8.7"
# Bundle edge Rails instead: # Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git' # gem 'rails', :git => 'git://github.com/rails/rails.git'

161
Gemfile.lock Normal file
View File

@ -0,0 +1,161 @@
GEM
remote: http://rubygems.org/
specs:
actionmailer (3.1.0)
actionpack (= 3.1.0)
mail (~> 2.3.0)
actionpack (3.1.0)
activemodel (= 3.1.0)
activesupport (= 3.1.0)
builder (~> 3.0.0)
erubis (~> 2.7.0)
i18n (~> 0.6)
rack (~> 1.3.2)
rack-cache (~> 1.0.3)
rack-mount (~> 0.8.2)
rack-test (~> 0.6.1)
sprockets (~> 2.0.0)
activemodel (3.1.0)
activesupport (= 3.1.0)
bcrypt-ruby (~> 3.0.0)
builder (~> 3.0.0)
i18n (~> 0.6)
activerecord (3.1.0)
activemodel (= 3.1.0)
activesupport (= 3.1.0)
arel (~> 2.2.1)
tzinfo (~> 0.3.29)
activeresource (3.1.0)
activemodel (= 3.1.0)
activesupport (= 3.1.0)
activesupport (3.1.0)
multi_json (~> 1.0)
acts_as_list (0.1.4)
acts_as_tree (0.1.1)
ansi (1.4.1)
arel (2.2.1)
bcrypt-ruby (3.0.1)
builder (3.0.0)
cancan (1.6.7)
carrierwave (0.5.8)
activesupport (~> 3.0)
coffee-script (2.2.0)
coffee-script-source
execjs
coffee-script-source (1.1.3)
devise (1.5.2)
bcrypt-ruby (~> 3.0)
orm_adapter (~> 0.0.3)
warden (~> 1.1)
erubis (2.7.0)
execjs (1.2.12)
multi_json (~> 1.0)
formtastic (2.0.2)
rails (~> 3.0)
haml (3.1.4)
hike (1.2.1)
i18n (0.6.0)
jquery-rails (1.0.19)
railties (~> 3.0)
thor (~> 0.14)
json (1.6.3)
kaminari (0.12.4)
rails (>= 3.0.0)
libv8 (3.3.10.4)
mail (2.3.0)
i18n (>= 0.4.0)
mime-types (~> 1.16)
treetop (~> 1.4.8)
meta_search (1.1.1)
actionpack (~> 3.1.0)
activerecord (~> 3.1.0)
activesupport (~> 3.1.0)
polyamorous (~> 0.5.0)
mime-types (1.17.2)
mimetype-fu (0.1.2)
multi_json (1.0.4)
orm_adapter (0.0.5)
polyamorous (0.5.0)
activerecord (~> 3.0)
polyglot (0.3.3)
rack (1.3.5)
rack-cache (1.0.3)
rack (>= 0.4)
rack-mount (0.8.3)
rack (>= 1.0.0)
rack-ssl (1.3.2)
rack
rack-test (0.6.1)
rack (>= 1.0)
rails (3.1.0)
actionmailer (= 3.1.0)
actionpack (= 3.1.0)
activerecord (= 3.1.0)
activeresource (= 3.1.0)
activesupport (= 3.1.0)
bundler (~> 1.0)
railties (= 3.1.0)
railties (3.1.0)
actionpack (= 3.1.0)
activesupport (= 3.1.0)
rack-ssl (~> 1.3.2)
rake (>= 0.8.7)
rdoc (~> 3.4)
thor (~> 0.14.6)
rake (0.9.2.2)
rdoc (3.12)
json (~> 1.4)
rmagick (2.13.1)
sass (3.1.12)
sass-rails (3.1.5)
actionpack (~> 3.1.0)
railties (~> 3.1.0)
sass (~> 3.1.10)
tilt (~> 1.3.2)
simple-navigation (3.6.0)
activesupport (>= 2.3.2)
sprockets (2.0.3)
hike (~> 1.2)
rack (~> 1.0)
tilt (!= 1.3.0, ~> 1.1)
sqlite3 (1.3.5)
therubyracer (0.9.9)
libv8 (~> 3.3.10)
thor (0.14.6)
tilt (1.3.3)
treetop (1.4.10)
polyglot
polyglot (>= 0.3.1)
turn (0.8.3)
ansi
tzinfo (0.3.31)
uglifier (1.2.0)
execjs (>= 0.3.0)
multi_json (>= 1.0.2)
warden (1.1.0)
rack (>= 1.0)
PLATFORMS
ruby
DEPENDENCIES
acts_as_list
acts_as_tree
cancan
carrierwave
coffee-script
devise
formtastic
haml (>= 3.0.0)
jquery-rails
kaminari
meta_search
mimetype-fu
rails (= 3.1.0)
rmagick
sass-rails (~> 3.1.0.rc)
simple-navigation
sqlite3
therubyracer
turn
uglifier

View File

@ -15,6 +15,9 @@
function auto_load_divs() { function auto_load_divs() {
$('div[data-load]').live("resize",function () { $('div[data-load]').live("resize",function () {
@ -145,7 +148,6 @@ function auto_tiny_mce(div)
theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,fontsizeselect,|,cut,copy,paste,pastetext,pasteword,|,bullist,numlist,|,forecolor,backcolor,sub,sup,|,charmap,|,removeformat", theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,fontsizeselect,|,cut,copy,paste,pastetext,pasteword,|,bullist,numlist,|,forecolor,backcolor,sub,sup,|,charmap,|,removeformat",
theme_advanced_buttons2 : "", theme_advanced_buttons2 : "",
theme_advanced_buttons3 : "", theme_advanced_buttons3 : "",
theme_advanced_toolbar_location : "top", theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "left", theme_advanced_toolbar_align : "left",
theme_advanced_statusbar_location : false, theme_advanced_statusbar_location : false,
@ -153,13 +155,53 @@ function auto_tiny_mce(div)
theme_advanced_text_colors : "#D2232A,#40AF49,#00ADEF", theme_advanced_text_colors : "#D2232A,#40AF49,#00ADEF",
theme_advanced_background_colors : "#D2232A,#40AF49,#00ADEF", theme_advanced_background_colors : "#D2232A,#40AF49,#00ADEF",
//theme_advanced_toolbar_location : "external", // theme_advanced_toolbar_location : "external",
}); });
} }
function common_tiny_mce(div)
{
div.css("width", "100%");
div.css("height", "400px");
div.tinymce({
// Location of TinyMCE script
script_url : '/assets/tiny_mce/tiny_mce.js',
content_css : "/assets/admin/admin.css",
// General options
theme : "advanced",
skin: "cirkuit",
plugins : "pagebreak,style,contextmenu,paste,directionality,noneditable,visualchars,nonbreaking,xhtmlxtras",
// Theme options
theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,fontsizeselect,|,cut,copy,paste,pastetext,pasteword,|,bullist,numlist,|,forecolor,backcolor,sub,sup,|,charmap,|,removeformat",
theme_advanced_buttons2 : "",
theme_advanced_buttons3 : "",
// theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "left",
theme_advanced_statusbar_location : false,
theme_advanced_resizing : false,
theme_advanced_text_colors : "#D2232A,#40AF49,#00ADEF",
theme_advanced_background_colors : "#D2232A,#40AF49,#00ADEF",
theme_advanced_toolbar_location : "external",
});
}
function set_prescriptions_big_container_size(){ function set_prescriptions_big_container_size(){

View File

@ -11,4 +11,14 @@
margin-left: 130px; } margin-left: 130px; }
.title a, .description a { .title a, .description a {
color: #604435; color: #604435;
text-decoration: none; } } text-decoration: none; } }
.garde_content td{
border:2px solid rgb(127,127,127);
vertical-align:top;
padding:5px;
}

View File

@ -362,8 +362,22 @@ text-align:center;
border-collapse: collapse; border-collapse: collapse;
td { td {
border: 1px solid black; } } border: 1px solid black; } }
&.garde_content table {
width: 100%;
border-collapse: collapse;
td {
border: 1px solid black;
padding:5px; } }
&.block_content .two_column .column { &.block_content .two_column .column {
float: left; float: left;
width: 50%; width: 50%;
.block { .block {
padding: 10px; } } } padding: 10px; } } }

View File

@ -0,0 +1,111 @@
# -*- encoding : utf-8 -*-
class Portlet::GardeContentsController < ApplicationController
layout "admin"
def new
@garde_content = GardeContent.new
respond_to do |format|
format.html {
if request.xhr?
render :layout => false
end
}
format.js { render :template => "portlet/shared/new" }
end
end
def create
@garde_content = GardeContent.new(params[:garde_content])
respond_to do |format|
if @garde_content.save
@portlet = Portlet.create(:position => params[:position], :block_id => params[:block_id], :content => @garde_content)
format.html { redirect_to([:admin, @portlet.block.blockable], :notice => 'Elément ajouté avec succès.') }
format.js { render :template => "portlet/shared/create" }
else
format.html { render :action => "new" }
format.js { render :template => "portlet/shared/new" }
end
end
end
def edit
@garde_content = GardeContent.find(params[:id])
@portlet = Portlet.find(params[:portlet_id])
respond_to do |format|
format.html {
if request.xhr?
render :template => "portlet/shared/edit", :layout => false
end
}
format.js { render :template => "portlet/shared/edit" }
end
end
def show
end
def update
@garde_content = GardeContent.find(params[:id])
@portlet = Portlet.find(params[:portlet_id])
respond_to do |format|
if @garde_content.update_attributes(params[:garde_content])
if @portlet.block and @portlet.block.blockable
@portlet.block.blockable.updated_at = Time.now
@portlet.block.blockable.save
if @portlet.block.blockable_type == "Page"
to_my_log("[Page_"+@portlet.block.blockable.id.to_s+"] "+"Modification de la page "+@portlet.block.blockable.title.to_s+" (modification d'un portlet)")
end
end
format.html { redirect_to([:admin, @portlet.block.blockable]) }
format.js { render :template => "portlet/shared/update" }
else
format.html { render :action => "portlet/shared/edit" }
format.js { render :template => "portlet/shared/edit" }
end
end
end
def destroy
@portlet = Portlet.find(params[:portlet_id])
@garde_content = GardeContent.find(params[:id])
@garde_content.destroy
if @portlet.block and @portlet.block.blockable
@portlet.block.blockable.updated_at = Time.now
@portlet.block.blockable.save
if @portlet.block.blockable_type == "Page"
to_my_log("[Page_"+@portlet.block.blockable.id.to_s+"] "+"Modification de la page "+@portlet.block.blockable.title.to_s+" (suppression d'un portlet)")
end
end
respond_to do |format|
format.html {}
format.js { render :template => "portlet/shared/destroy" }
end
end
end

View File

@ -0,0 +1,17 @@
# -*- encoding : utf-8 -*-
module Admin::GardeLineHelper
def link_to_remove_fields(name, f)
f.hidden_field(:_destroy) + link_to(name, "#",:onclick => "if(confirm('Voulez-vous vraiment supprimer cette ligne ?')) {remove_fields(this);return false;}else{return false;}")
end
def link_to_add_fields(name, f, association)
new_object = f.object.class.reflect_on_association(association).klass.new
fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
render(association.to_s.singularize + "_fields", :f => builder)
end
link_to_function(name, "add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")")
end
end

View File

@ -0,0 +1,7 @@
class GardeContent < ActiveRecord::Base
has_one :portlet, :as => :content, :dependent => :destroy
has_many :garde_lines, :order => :position
accepts_nested_attributes_for :garde_lines, :allow_destroy => true
end

View File

@ -0,0 +1,3 @@
class GardeLine < ActiveRecord::Base
belongs_to :garde_content
end

View File

@ -0,0 +1,58 @@
=form_for( [:portlet, @garde_content], :remote => true) do |f|
=hidden_field_tag "block_id", params[:block_id]
=hidden_field_tag "portlet_id", params[:portlet_id]
=hidden_field_tag "position", params[:position]
%table
%tr
%td=f.text_area :column_1, :class => "common_editor"
%td=f.text_area :column_2, :class => "common_editor"
%td=f.text_area :column_3, :class => "common_editor"
%td=f.text_area :column_4, :class => "common_editor"
%td
=f.fields_for :garde_lines do |f|
=render :partial => "portlet/garde_contents/garde_line_fields", :locals => {:f => f }
%p= link_to_add_fields "Ajouter une ligne", f, :garde_lines
=f.submit "Sauvegarder"
:javascript
$("textarea.common_editor").each(function() {
common_tiny_mce($(this));
});
function remove_fields(link) {
$(link).prev("input[type=hidden]").val("1");
$(link).closest(".field").hide();
return false;
};
function add_fields(link, association, content) {
var new_id = new Date().getTime();
var regexp = new RegExp("new_" + association, "g")
$(link).closest("form").children('table').append(content.replace(regexp, new_id).replace('<tr', "<tr class='new_field field'"));
$('.new_field textarea.common_editor').each(function() {
common_tiny_mce($(this));
});
$('.new_field').removeClass("new_field")
return false;
};

View File

@ -0,0 +1,16 @@
%table.garde_content
%tr
%td=simple_format garde_content.column_1
%td=simple_format garde_content.column_2
%td=simple_format garde_content.column_3
%td=simple_format garde_content.column_4
-garde_content.garde_lines.each do |garde_line|
%tr
%td=simple_format garde_line.column_1
%td=simple_format garde_line.column_2
%td=simple_format garde_line.column_3
%td=simple_format garde_line.column_4

View File

@ -0,0 +1,6 @@
%tr.field
%td=f.text_area :column_1, :class => "common_editor"
%td=f.text_area :column_2, :class => "common_editor"
%td=f.text_area :column_3, :class => "common_editor"
%td=f.text_area :column_4, :class => "common_editor"
%td= link_to_remove_fields i(:x_alt), f

View File

@ -0,0 +1,33 @@
%table.table_content
-table_rows = @table_content.table_rows
%tr
-table_rows.each do |table_row|
%tr
%td.row_left
.crl
%a{:href => "#", :onclick => "$('.table_row_menu').hide();$('#table_row_menu_"+table_row.id.to_s+"').toggle();return false;"}+
.table_row_menu#table_row_menu{:id => table_row.id}
=link_to "ajouter un rang avant", portlet_table_rows_path(:table_row => {:table_content_id => @table_content.id, :position => (table_row.position)}), :method => :post
%br
=link_to "ajouter un rang après", portlet_table_rows_path(:table_row => {:table_content_id => @table_content.id, :position => (table_row.position+1)}), :method => :post
%br
=link_to "supprimer ce rang", [:portlet, table_row], :method => :delete, :confirm => "Voulez-vous vraiment supprimer ce rang ainsi que son contenu ?", :remote => true
-table_row.cel_tables.each do |cel_table|
%td.table_content_cel
=auto_load_div(admin_block_path(cel_table.block),"Page_"+"@page.id.to_s"+"_blocks_part")
%td.add_col
%span +
-@table_content.nbr_cols.times do
%td.add_col
%span +f

View File

@ -0,0 +1,6 @@
$("#table_content_edit_pane_<%= @table_content.id %>").html("<%= escape_javascript(render(:partial => "portlet/table_contents/table_content_edit_pane")) %>");
<%= flash_notice() %>

View File

@ -1,8 +1 @@
#edit_portlet_content_form=render :partial => "form" #edit_portlet_content_form=render :partial => "form"
:javascript
$("#edit_portlet_content_form .text_editor").each(function() {
auto_tiny_mce($(this));
});

View File

@ -0,0 +1,16 @@
.portlet.garde_content
%table
%tr
%td=simple_format input.column_1
%td=simple_format input.column_2
%td=simple_format input.column_3
%td=simple_format input.column_4
-input.garde_lines.each do |garde_line|
%tr
%td=simple_format garde_line.column_1
%td=simple_format garde_line.column_2
%td=simple_format garde_line.column_3
%td=simple_format garde_line.column_4

View File

@ -33,6 +33,12 @@ Pharma::Application.routes.draw do
devise_for :admins, :controllers => {:sessions => "admins/sessions", :passwords => "admins/passwords"} devise_for :admins, :controllers => {:sessions => "admins/sessions", :passwords => "admins/passwords"}
namespace :portlet do namespace :portlet do
resources :garde_contents do
collection do
get :reorder
end
end
resources :break_contents resources :break_contents
resources :download_contents resources :download_contents
resources :dynamic_contents resources :dynamic_contents

View File

@ -0,0 +1,17 @@
class CreateGardeContents < ActiveRecord::Migration
def change
create_table :garde_contents do |t|
t.text :column_1
t.text :column_2
t.text :column_3
t.text :column_4
t.timestamps
end
ContentType.create(:slug => "GardeContent", :name => "Pharmacie de garde")
end
end

View File

@ -0,0 +1,16 @@
class CreateGardeLines < ActiveRecord::Migration
def change
create_table :garde_lines do |t|
t.references :garde_content
t.integer :position
t.text :column_1
t.text :column_2
t.text :column_3
t.text :column_4
t.timestamps
end
add_index :garde_lines, :garde_content_id
end
end

13
test/fixtures/garde_contents.yml vendored Normal file
View File

@ -0,0 +1,13 @@
# Read about fixtures at http://api.rubyonrails.org/classes/Fixtures.html
one:
column_1: MyText
column_2: MyText
column_3: MyText
column_4: MyText
two:
column_1: MyText
column_2: MyText
column_3: MyText
column_4: MyText

9
test/fixtures/garde_lines.yml vendored Normal file
View File

@ -0,0 +1,9 @@
# Read about fixtures at http://api.rubyonrails.org/classes/Fixtures.html
one:
garde_content:
position: 1
two:
garde_content:
position: 1

View File

@ -0,0 +1,7 @@
require 'test_helper'
class GardeContentTest < ActiveSupport::TestCase
# test "the truth" do
# assert true
# end
end

View File

@ -0,0 +1,7 @@
require 'test_helper'
class GardeLineTest < ActiveSupport::TestCase
# test "the truth" do
# assert true
# end
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

File diff suppressed because one or more lines are too long

View File

@ -1,7 +1 @@
tinyMCE.addI18n('en.advhr_dlg',{ tinyMCE.addI18n('en.advhr_dlg',{size:"Height",noshade:"No Shadow",width:"Width",normal:"Normal",widthunits:"Units"});
normal:"Normal",
width:"Width",
widthunits:"Units",
size:"Height",
noshade:"No shadow"
});

View File

@ -1 +1 @@
(function(){tinymce.create("tinymce.plugins.AdvancedImagePlugin",{init:function(a,b){a.addCommand("mceAdvImage",function(){if(a.dom.getAttrib(a.selection.getNode(),"class").indexOf("mceItem")!=-1){return}a.windowManager.open({file:b+"/image.htm",width:480+parseInt(a.getLang("advimage.delta_width",0)),height:385+parseInt(a.getLang("advimage.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("image",{title:"advimage.image_desc",cmd:"mceAdvImage"})},getInfo:function(){return{longname:"Advanced image",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advimage",tinymce.plugins.AdvancedImagePlugin)})(); (function(){tinymce.create("tinymce.plugins.AdvancedImagePlugin",{init:function(a,b){a.addCommand("mceAdvImage",function(){if(a.dom.getAttrib(a.selection.getNode(),"class","").indexOf("mceItem")!=-1){return}a.windowManager.open({file:b+"/image.htm",width:480+parseInt(a.getLang("advimage.delta_width",0)),height:385+parseInt(a.getLang("advimage.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("image",{title:"advimage.image_desc",cmd:"mceAdvImage"})},getInfo:function(){return{longname:"Advanced image",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advimage",tinymce.plugins.AdvancedImagePlugin)})();

View File

@ -14,7 +14,7 @@
// Register commands // Register commands
ed.addCommand('mceAdvImage', function() { ed.addCommand('mceAdvImage', function() {
// Internal image object like a flash placeholder // Internal image object like a flash placeholder
if (ed.dom.getAttrib(ed.selection.getNode(), 'class').indexOf('mceItem') != -1) if (ed.dom.getAttrib(ed.selection.getNode(), 'class', '').indexOf('mceItem') != -1)
return; return;
ed.windowManager.open({ ed.windowManager.open({

View File

@ -9,13 +9,13 @@ var ImageDialog = {
}, },
init : function(ed) { init : function(ed) {
var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, dom = ed.dom, n = ed.selection.getNode(); var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, dom = ed.dom, n = ed.selection.getNode(), fl = tinyMCEPopup.getParam('external_image_list', 'tinyMCEImageList');
tinyMCEPopup.resizeToInnerSize(); tinyMCEPopup.resizeToInnerSize();
this.fillClassList('class_list'); this.fillClassList('class_list');
this.fillFileList('src_list', 'tinyMCEImageList'); this.fillFileList('src_list', fl);
this.fillFileList('over_list', 'tinyMCEImageList'); this.fillFileList('over_list', fl);
this.fillFileList('out_list', 'tinyMCEImageList'); this.fillFileList('out_list', fl);
TinyMCE_EditableSelects.init(); TinyMCE_EditableSelects.init();
if (n.nodeName == 'IMG') { if (n.nodeName == 'IMG') {
@ -171,9 +171,13 @@ var ImageDialog = {
if (el && el.nodeName == 'IMG') { if (el && el.nodeName == 'IMG') {
ed.dom.setAttribs(el, args); ed.dom.setAttribs(el, args);
} else { } else {
ed.execCommand('mceInsertContent', false, '<img id="__mce_tmp" />', {skip_undo : 1}); tinymce.each(args, function(value, name) {
ed.dom.setAttribs('__mce_tmp', args); if (value === "") {
ed.dom.setAttrib('__mce_tmp', 'id', ''); delete args[name];
}
});
ed.execCommand('mceInsertContent', false, tinyMCEPopup.editor.dom.createHTML('img', args), {skip_undo : 1});
ed.undoManager.add(); ed.undoManager.add();
} }
@ -287,7 +291,7 @@ var ImageDialog = {
fillFileList : function(id, l) { fillFileList : function(id, l) {
var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
l = window[l]; l = typeof(l) === 'function' ? l() : window[l];
lst.options.length = 0; lst.options.length = 0;
if (l && l.length > 0) { if (l && l.length > 0) {
@ -361,7 +365,7 @@ var ImageDialog = {
}, },
updateStyle : function(ty) { updateStyle : function(ty) {
var dom = tinyMCEPopup.dom, st, v, f = document.forms[0], img = dom.create('img', {style : dom.get('style').value}); var dom = tinyMCEPopup.dom, b, bStyle, bColor, v, isIE = tinymce.isIE, f = document.forms[0], img = dom.create('img', {style : dom.get('style').value});
if (tinyMCEPopup.editor.settings.inline_styles) { if (tinyMCEPopup.editor.settings.inline_styles) {
// Handle align // Handle align
@ -380,14 +384,27 @@ var ImageDialog = {
// Handle border // Handle border
if (ty == 'border') { if (ty == 'border') {
b = img.style.border ? img.style.border.split(' ') : [];
bStyle = dom.getStyle(img, 'border-style');
bColor = dom.getStyle(img, 'border-color');
dom.setStyle(img, 'border', ''); dom.setStyle(img, 'border', '');
v = f.border.value; v = f.border.value;
if (v || v == '0') { if (v || v == '0') {
if (v == '0') if (v == '0')
img.style.border = '0 none none'; img.style.border = isIE ? '0' : '0 none none';
else else {
img.style.border = v + 'px solid black'; if (b.length == 3 && b[isIE ? 2 : 1])
bStyle = b[isIE ? 2 : 1];
else if (!bStyle || bStyle == 'none')
bStyle = 'solid';
if (b.length == 3 && b[isIE ? 0 : 2])
bColor = b[isIE ? 0 : 2];
else if (!bColor || bColor == 'none')
bColor = 'black';
img.style.border = v + 'px ' + bStyle + ' ' + bColor;
}
} }
} }

View File

@ -1,45 +1 @@
tinyMCE.addI18n('en.advimage_dlg',{ tinyMCE.addI18n('en.advimage_dlg',{"image_list":"Image List","align_right":"Right","align_left":"Left","align_textbottom":"Text Bottom","align_texttop":"Text Top","align_bottom":"Bottom","align_middle":"Middle","align_top":"Top","align_baseline":"Baseline",align:"Alignment",hspace:"Horizontal Space",vspace:"Vertical Space",dimensions:"Dimensions",border:"Border",list:"Image List",alt:"Image Description",src:"Image URL","dialog_title":"Insert/Edit Image","missing_alt":"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.","example_img":"Appearance Preview Image",misc:"Miscellaneous",mouseout:"For Mouse Out",mouseover:"For Mouse Over","alt_image":"Alternative Image","swap_image":"Swap Image",map:"Image Map",id:"ID",rtl:"Right to Left",ltr:"Left to Right",classes:"Classes",style:"Style","long_desc":"Long Description Link",langcode:"Language Code",langdir:"Language Direction","constrain_proportions":"Constrain Proportions",preview:"Preview",title:"Title",general:"General","tab_advanced":"Advanced","tab_appearance":"Appearance","tab_general":"General",width:"Width",height:"Height"});
tab_general:"General",
tab_appearance:"Appearance",
tab_advanced:"Advanced",
general:"General",
title:"Title",
preview:"Preview",
constrain_proportions:"Constrain proportions",
langdir:"Language direction",
langcode:"Language code",
long_desc:"Long description link",
style:"Style",
classes:"Classes",
ltr:"Left to right",
rtl:"Right to left",
id:"Id",
map:"Image map",
swap_image:"Swap image",
alt_image:"Alternative image",
mouseover:"for mouse over",
mouseout:"for mouse out",
misc:"Miscellaneous",
example_img:"Appearance preview image",
missing_alt:"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.",
dialog_title:"Insert/edit image",
src:"Image URL",
alt:"Image description",
list:"Image list",
border:"Border",
dimensions:"Dimensions",
width:"Width",
height:"Height",
vspace:"Vertical space",
hspace:"Horizontal space",
align:"Alignment",
align_baseline:"Baseline",
align_top:"Top",
align_middle:"Middle",
align_bottom:"Bottom",
align_texttop:"Text top",
align_textbottom:"Text bottom",
align_left:"Left",
align_right:"Right",
image_list:"Image list"
});

View File

@ -30,8 +30,6 @@ function init() {
document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','advlink'); document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','advlink');
document.getElementById('popupurlbrowsercontainer').innerHTML = getBrowserHTML('popupurlbrowser','popupurl','file','advlink'); document.getElementById('popupurlbrowsercontainer').innerHTML = getBrowserHTML('popupurlbrowser','popupurl','file','advlink');
document.getElementById('linklisthrefcontainer').innerHTML = getLinkListHTML('linklisthref','href');
document.getElementById('anchorlistcontainer').innerHTML = getAnchorListHTML('anchorlist','href');
document.getElementById('targetlistcontainer').innerHTML = getTargetListHTML('targetlist','target'); document.getElementById('targetlistcontainer').innerHTML = getTargetListHTML('targetlist','target');
// Link list // Link list
@ -41,6 +39,13 @@ function init() {
else else
document.getElementById("linklisthrefcontainer").innerHTML = html; document.getElementById("linklisthrefcontainer").innerHTML = html;
// Anchor list
html = getAnchorListHTML('anchorlist','href');
if (html == "")
document.getElementById("anchorlistrow").style.display = 'none';
else
document.getElementById("anchorlistcontainer").innerHTML = html;
// Resize some elements // Resize some elements
if (isVisible('hrefbrowser')) if (isVisible('hrefbrowser'))
document.getElementById('href').style.width = '260px'; document.getElementById('href').style.width = '260px';
@ -362,16 +367,20 @@ function setAttrib(elm, attrib, value) {
function getAnchorListHTML(id, target) { function getAnchorListHTML(id, target) {
var ed = tinyMCEPopup.editor, nodes = ed.dom.select('a'), name, i, len, html = ""; var ed = tinyMCEPopup.editor, nodes = ed.dom.select('a'), name, i, len, html = "";
html += '<select id="' + id + '" name="' + id + '" class="mceAnchorList" o2nfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target + '.value=';
html += 'this.options[this.selectedIndex].value;">';
html += '<option value="">---</option>';
for (i=0, len=nodes.length; i<len; i++) { for (i=0, len=nodes.length; i<len; i++) {
if ((name = ed.dom.getAttrib(nodes[i], "name")) != "") if ((name = ed.dom.getAttrib(nodes[i], "name")) != "")
html += '<option value="#' + name + '">' + name + '</option>'; html += '<option value="#' + name + '">' + name + '</option>';
} }
html += '</select>'; if (html == "")
return "";
html = '<select id="' + id + '" name="' + id + '" class="mceAnchorList"'
+ ' onchange="this.form.' + target + '.value=this.options[this.selectedIndex].value"'
+ '>'
+ '<option value="">---</option>'
+ html
+ '</select>';
return html; return html;
} }

View File

@ -1,54 +1 @@
tinyMCE.addI18n('en.advlink_dlg',{ tinyMCE.addI18n('en.advlink_dlg',{"target_name":"Target Name",classes:"Classes",style:"Style",id:"ID","popup_position":"Position (X/Y)",langdir:"Language Direction","popup_size":"Size","popup_dependent":"Dependent (Mozilla/Firefox Only)","popup_resizable":"Make Window Resizable","popup_location":"Show Location Bar","popup_menubar":"Show Menu Bar","popup_toolbar":"Show Toolbars","popup_statusbar":"Show Status Bar","popup_scrollbars":"Show Scrollbars","popup_return":"Insert \'return false\'","popup_name":"Window Name","popup_url":"Popup URL",popup:"JavaScript Popup","target_blank":"Open in New Window","target_top":"Open in Top Frame (Replaces All Frames)","target_parent":"Open in Parent Window/Frame","target_same":"Open in This Window/Frame","anchor_names":"Anchors","popup_opts":"Options","advanced_props":"Advanced Properties","event_props":"Events","popup_props":"Popup Properties","general_props":"General Properties","advanced_tab":"Advanced","events_tab":"Events","popup_tab":"Popup","general_tab":"General",list:"Link List","is_external":"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?","is_email":"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/Edit Link","link_list":"Link List",rtl:"Right to Left",ltr:"Left to Right",accesskey:"AccessKey",tabindex:"TabIndex",rev:"Relationship Target to Page",rel:"Relationship Page to Target",mime:"Target MIME Type",encoding:"Target Character Encoding",langcode:"Language Code","target_langcode":"Target Language",width:"Width",height:"Height"});
title:"Insert/edit link",
url:"Link URL",
target:"Target",
titlefield:"Title",
is_email:"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",
is_external:"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?",
list:"Link list",
general_tab:"General",
popup_tab:"Popup",
events_tab:"Events",
advanced_tab:"Advanced",
general_props:"General properties",
popup_props:"Popup properties",
event_props:"Events",
advanced_props:"Advanced properties",
popup_opts:"Options",
anchor_names:"Anchors",
target_same:"Open in this window / frame",
target_parent:"Open in parent window / frame",
target_top:"Open in top frame (replaces all frames)",
target_blank:"Open in new window",
popup:"Javascript popup",
popup_url:"Popup URL",
popup_name:"Window name",
popup_return:"Insert 'return false'",
popup_scrollbars:"Show scrollbars",
popup_statusbar:"Show status bar",
popup_toolbar:"Show toolbars",
popup_menubar:"Show menu bar",
popup_location:"Show location bar",
popup_resizable:"Make window resizable",
popup_dependent:"Dependent (Mozilla/Firefox only)",
popup_size:"Size",
width:"Width",
height:"Height",
popup_position:"Position (X/Y)",
id:"Id",
style:"Style",
classes:"Classes",
target_name:"Target name",
langdir:"Language direction",
target_langcode:"Target language",
langcode:"Language code",
encoding:"Target character encoding",
mime:"Target MIME type",
rel:"Relationship page to target",
rev:"Relationship target to page",
tabindex:"Tabindex",
accesskey:"Accesskey",
ltr:"Left to right",
rtl:"Right to left",
link_list:"Link list"
});

View File

@ -40,7 +40,7 @@
<td class="column1"><label for="linklisthref">{#advlink_dlg.list}</label></td> <td class="column1"><label for="linklisthref">{#advlink_dlg.list}</label></td>
<td colspan="2" id="linklisthrefcontainer"><select id="linklisthref"><option value=""></option></select></td> <td colspan="2" id="linklisthrefcontainer"><select id="linklisthref"><option value=""></option></select></td>
</tr> </tr>
<tr> <tr id="anchorlistrow">
<td class="column1"><label for="anchorlist">{#advlink_dlg.anchor_names}</label></td> <td class="column1"><label for="anchorlist">{#advlink_dlg.anchor_names}</label></td>
<td colspan="2" id="anchorlistcontainer"><select id="anchorlist"><option value=""></option></select></td> <td colspan="2" id="anchorlistcontainer"><select id="anchorlist"><option value=""></option></select></td>
</tr> </tr>

View File

@ -1 +1 @@
(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.AdvListPlugin",{init:function(b,c){var d=this;d.editor=b;function e(g){var f=[];a(g.split(/,/),function(h){f.push({title:"advlist."+(h=="default"?"def":h.replace(/-/g,"_")),styles:{listStyleType:h=="default"?"":h}})});return f}d.numlist=b.getParam("advlist_number_styles")||e("default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");d.bullist=b.getParam("advlist_bullet_styles")||e("default,circle,disc,square")},createControl:function(d,b){var f=this,e,h;if(d=="numlist"||d=="bullist"){if(f[d][0].title=="advlist.def"){h=f[d][0]}function c(i,k){var j=true;a(k.styles,function(m,l){if(f.editor.dom.getStyle(i,l)!=m){j=false;return false}});return j}function g(){var k,i=f.editor,l=i.dom,j=i.selection;k=l.getParent(j.getNode(),"ol,ul");if(!k||k.nodeName==(d=="bullist"?"OL":"UL")||c(k,h)){i.execCommand(d=="bullist"?"InsertUnorderedList":"InsertOrderedList")}if(h){k=l.getParent(j.getNode(),"ol,ul");if(k){l.setStyles(k,h.styles);k.removeAttribute("data-mce-style")}}i.focus()}e=b.createSplitButton(d,{title:"advanced."+d+"_desc","class":"mce_"+d,onclick:function(){g()}});e.onRenderMenu.add(function(i,j){j.onShowMenu.add(function(){var m=f.editor.dom,l=m.getParent(f.editor.selection.getNode(),"ol,ul"),k;if(l||h){k=f[d];a(j.items,function(n){var o=true;n.setSelected(0);if(l&&!n.isDisabled()){a(k,function(p){if(p.id==n.id){if(!c(l,p)){o=false;return false}}});if(o){n.setSelected(1)}}});if(!l){j.items[h.id].setSelected(1)}}});j.add({id:f.editor.dom.uniqueId(),title:"advlist.types","class":"mceMenuItemTitle",titleItem:true}).setDisabled(1);a(f[d],function(k){k.id=f.editor.dom.uniqueId();j.add({id:k.id,title:k.title,onclick:function(){h=k;g()}})})});return e}},getInfo:function(){return{longname:"Advanced lists",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlist",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advlist",tinymce.plugins.AdvListPlugin)})(); (function(){var a=tinymce.each;tinymce.create("tinymce.plugins.AdvListPlugin",{init:function(b,c){var d=this;d.editor=b;function e(g){var f=[];a(g.split(/,/),function(h){f.push({title:"advlist."+(h=="default"?"def":h.replace(/-/g,"_")),styles:{listStyleType:h=="default"?"":h}})});return f}d.numlist=b.getParam("advlist_number_styles")||e("default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");d.bullist=b.getParam("advlist_bullet_styles")||e("default,circle,disc,square");if(tinymce.isIE&&/MSIE [2-7]/.test(navigator.userAgent)){d.isIE7=true}},createControl:function(d,b){var f=this,e,i,g=f.editor;if(d=="numlist"||d=="bullist"){if(f[d][0].title=="advlist.def"){i=f[d][0]}function c(j,l){var k=true;a(l.styles,function(n,m){if(g.dom.getStyle(j,m)!=n){k=false;return false}});return k}function h(){var k,l=g.dom,j=g.selection;k=l.getParent(j.getNode(),"ol,ul");if(!k||k.nodeName==(d=="bullist"?"OL":"UL")||c(k,i)){g.execCommand(d=="bullist"?"InsertUnorderedList":"InsertOrderedList")}if(i){k=l.getParent(j.getNode(),"ol,ul");if(k){l.setStyles(k,i.styles);k.removeAttribute("data-mce-style")}}g.focus()}e=b.createSplitButton(d,{title:"advanced."+d+"_desc","class":"mce_"+d,onclick:function(){h()}});e.onRenderMenu.add(function(j,k){k.onHideMenu.add(function(){if(f.bookmark){g.selection.moveToBookmark(f.bookmark);f.bookmark=0}});k.onShowMenu.add(function(){var n=g.dom,m=n.getParent(g.selection.getNode(),"ol,ul"),l;if(m||i){l=f[d];a(k.items,function(o){var p=true;o.setSelected(0);if(m&&!o.isDisabled()){a(l,function(q){if(q.id==o.id){if(!c(m,q)){p=false;return false}}});if(p){o.setSelected(1)}}});if(!m){k.items[i.id].setSelected(1)}}g.focus();if(tinymce.isIE){f.bookmark=g.selection.getBookmark(1)}});k.add({id:g.dom.uniqueId(),title:"advlist.types","class":"mceMenuItemTitle",titleItem:true}).setDisabled(1);a(f[d],function(l){if(f.isIE7&&l.styles.listStyleType=="lower-greek"){return}l.id=g.dom.uniqueId();k.add({id:l.id,title:l.title,onclick:function(){i=l;h()}})})});return e}},getInfo:function(){return{longname:"Advanced lists",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlist",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advlist",tinymce.plugins.AdvListPlugin)})();

View File

@ -35,10 +35,13 @@
// Setup number formats from config or default // Setup number formats from config or default
t.numlist = ed.getParam("advlist_number_styles") || buildFormats("default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman"); t.numlist = ed.getParam("advlist_number_styles") || buildFormats("default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");
t.bullist = ed.getParam("advlist_bullet_styles") || buildFormats("default,circle,disc,square"); t.bullist = ed.getParam("advlist_bullet_styles") || buildFormats("default,circle,disc,square");
if (tinymce.isIE && /MSIE [2-7]/.test(navigator.userAgent))
t.isIE7 = true;
}, },
createControl: function(name, cm) { createControl: function(name, cm) {
var t = this, btn, format; var t = this, btn, format, editor = t.editor;
if (name == 'numlist' || name == 'bullist') { if (name == 'numlist' || name == 'bullist') {
// Default to first item if it's a default item // Default to first item if it's a default item
@ -50,7 +53,7 @@
each(format.styles, function(value, name) { each(format.styles, function(value, name) {
// Format doesn't match // Format doesn't match
if (t.editor.dom.getStyle(node, name) != value) { if (editor.dom.getStyle(node, name) != value) {
state = false; state = false;
return false; return false;
} }
@ -60,14 +63,14 @@
}; };
function applyListFormat() { function applyListFormat() {
var list, ed = t.editor, dom = ed.dom, sel = ed.selection; var list, dom = editor.dom, sel = editor.selection;
// Check for existing list element // Check for existing list element
list = dom.getParent(sel.getNode(), 'ol,ul'); list = dom.getParent(sel.getNode(), 'ol,ul');
// Switch/add list type if needed // Switch/add list type if needed
if (!list || list.nodeName == (name == 'bullist' ? 'OL' : 'UL') || hasFormat(list, format)) if (!list || list.nodeName == (name == 'bullist' ? 'OL' : 'UL') || hasFormat(list, format))
ed.execCommand(name == 'bullist' ? 'InsertUnorderedList' : 'InsertOrderedList'); editor.execCommand(name == 'bullist' ? 'InsertUnorderedList' : 'InsertOrderedList');
// Append styles to new list element // Append styles to new list element
if (format) { if (format) {
@ -77,7 +80,8 @@
list.removeAttribute('data-mce-style'); list.removeAttribute('data-mce-style');
} }
} }
ed.focus();
editor.focus();
}; };
btn = cm.createSplitButton(name, { btn = cm.createSplitButton(name, {
@ -89,8 +93,15 @@
}); });
btn.onRenderMenu.add(function(btn, menu) { btn.onRenderMenu.add(function(btn, menu) {
menu.onHideMenu.add(function() {
if (t.bookmark) {
editor.selection.moveToBookmark(t.bookmark);
t.bookmark = 0;
}
});
menu.onShowMenu.add(function() { menu.onShowMenu.add(function() {
var dom = t.editor.dom, list = dom.getParent(t.editor.selection.getNode(), 'ol,ul'), fmtList; var dom = editor.dom, list = dom.getParent(editor.selection.getNode(), 'ol,ul'), fmtList;
if (list || format) { if (list || format) {
fmtList = t[name]; fmtList = t[name];
@ -120,12 +131,23 @@
if (!list) if (!list)
menu.items[format.id].setSelected(1); menu.items[format.id].setSelected(1);
} }
editor.focus();
// IE looses it's selection so store it away and restore it later
if (tinymce.isIE) {
t.bookmark = editor.selection.getBookmark(1);
}
}); });
menu.add({id : t.editor.dom.uniqueId(), title : 'advlist.types', 'class' : 'mceMenuItemTitle', titleItem: true}).setDisabled(1); menu.add({id : editor.dom.uniqueId(), title : 'advlist.types', 'class' : 'mceMenuItemTitle', titleItem: true}).setDisabled(1);
each(t[name], function(item) { each(t[name], function(item) {
item.id = t.editor.dom.uniqueId(); // IE<8 doesn't support lower-greek, skip it
if (t.isIE7 && item.styles.listStyleType == 'lower-greek')
return;
item.id = editor.dom.uniqueId();
menu.add({id : item.id, title : item.title, onclick : function() { menu.add({id : item.id, title : item.title, onclick : function() {
format = item; format = item;

View File

@ -1 +1 @@
(function(){tinymce.create("tinymce.plugins.AutolinkPlugin",{init:function(a,b){var c=this;if(tinyMCE.isIE){return}a.onKeyDown.add(function(d,f){if(f.keyCode==13){return c.handleEnter(d)}if(f.shiftKey&&f.keyCode==48){return c.handleEclipse(d)}});a.onKeyUp.add(function(d,f){if(f.keyCode==32){return c.handleSpacebar(d)}})},handleEclipse:function(a){this.parseCurrentLine(a,-1,"(",true)},handleSpacebar:function(a){this.parseCurrentLine(a,0,"",true)},handleEnter:function(a){this.parseCurrentLine(a,-1,"",false)},parseCurrentLine:function(i,d,b,g){var a,f,c,n,k,m,h,e,j;a=i.selection.getRng().cloneRange();if(a.startOffset<5){e=a.endContainer.previousSibling;if(e==null){if(a.endContainer.firstChild==null||a.endContainer.firstChild.nextSibling==null){return}e=a.endContainer.firstChild.nextSibling}j=e.length;a.setStart(e,j);a.setEnd(e,j);if(a.endOffset<5){return}f=a.endOffset;n=e}else{n=a.endContainer;if(n.nodeType!=3&&n.firstChild){while(n.nodeType!=3&&n.firstChild){n=n.firstChild}a.setStart(n,0);a.setEnd(n,n.nodeValue.length)}if(a.endOffset==1){f=2}else{f=a.endOffset-1-d}}c=f;do{a.setStart(n,f-2);a.setEnd(n,f-1);f-=1}while(a.toString()!=" "&&a.toString()!=""&&a.toString().charCodeAt(0)!=160&&(f-2)>=0&&a.toString()!=b);if(a.toString()==b||a.toString().charCodeAt(0)==160){a.setStart(n,f);a.setEnd(n,c);f+=1}else{if(a.startOffset==0){a.setStart(n,0);a.setEnd(n,c)}else{a.setStart(n,f);a.setEnd(n,c)}}m=a.toString();h=m.match(/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)(.+)$/i);if(h){if(h[1]=="www."){h[1]="http://www."}k=i.selection.getBookmark();i.selection.setRng(a);tinyMCE.execCommand("mceInsertLink",false,h[1]+h[2]);i.selection.moveToBookmark(k);if(tinyMCE.isWebKit){i.selection.collapse(false);var l=Math.min(n.length,c+1);a.setStart(n,l);a.setEnd(n,l);i.selection.setRng(a)}}},getInfo:function(){return{longname:"Autolink",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autolink",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("autolink",tinymce.plugins.AutolinkPlugin)})(); (function(){tinymce.create("tinymce.plugins.AutolinkPlugin",{init:function(a,b){var c=this;if(tinyMCE.isIE){return}a.onKeyDown.add(function(d,f){if(f.keyCode==13){return c.handleEnter(d)}});a.onKeyPress.add(function(d,f){if(f.which==41){return c.handleEclipse(d)}});a.onKeyUp.add(function(d,f){if(f.keyCode==32){return c.handleSpacebar(d)}})},handleEclipse:function(a){this.parseCurrentLine(a,-1,"(",true)},handleSpacebar:function(a){this.parseCurrentLine(a,0,"",true)},handleEnter:function(a){this.parseCurrentLine(a,-1,"",false)},parseCurrentLine:function(i,d,b,g){var a,f,c,n,k,m,h,e,j;a=i.selection.getRng().cloneRange();if(a.startOffset<5){e=a.endContainer.previousSibling;if(e==null){if(a.endContainer.firstChild==null||a.endContainer.firstChild.nextSibling==null){return}e=a.endContainer.firstChild.nextSibling}j=e.length;a.setStart(e,j);a.setEnd(e,j);if(a.endOffset<5){return}f=a.endOffset;n=e}else{n=a.endContainer;if(n.nodeType!=3&&n.firstChild){while(n.nodeType!=3&&n.firstChild){n=n.firstChild}a.setStart(n,0);a.setEnd(n,n.nodeValue.length)}if(a.endOffset==1){f=2}else{f=a.endOffset-1-d}}c=f;do{a.setStart(n,f-2);a.setEnd(n,f-1);f-=1}while(a.toString()!=" "&&a.toString()!=""&&a.toString().charCodeAt(0)!=160&&(f-2)>=0&&a.toString()!=b);if(a.toString()==b||a.toString().charCodeAt(0)==160){a.setStart(n,f);a.setEnd(n,c);f+=1}else{if(a.startOffset==0){a.setStart(n,0);a.setEnd(n,c)}else{a.setStart(n,f);a.setEnd(n,c)}}m=a.toString();h=m.match(/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)(.+)$/i);if(h){if(h[1]=="www."){h[1]="http://www."}k=i.selection.getBookmark();i.selection.setRng(a);tinyMCE.execCommand("createlink",false,h[1]+h[2]);i.selection.moveToBookmark(k);if(tinyMCE.isWebKit){i.selection.collapse(false);var l=Math.min(n.length,c+1);a.setStart(n,l);a.setEnd(n,l);i.selection.setRng(a)}}},getInfo:function(){return{longname:"Autolink",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autolink",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("autolink",tinymce.plugins.AutolinkPlugin)})();

View File

@ -30,10 +30,13 @@
ed.onKeyDown.add(function(ed, e) { ed.onKeyDown.add(function(ed, e) {
if (e.keyCode == 13) if (e.keyCode == 13)
return t.handleEnter(ed); return t.handleEnter(ed);
if (e.shiftKey && e.keyCode == 48)
return t.handleEclipse(ed);
}); });
ed.onKeyPress.add(function(ed, e) {
if (e.which == 41)
return t.handleEclipse(ed);
});
// Add a key up handler // Add a key up handler
ed.onKeyUp.add(function(ed, e) { ed.onKeyUp.add(function(ed, e) {
if (e.keyCode == 32) if (e.keyCode == 32)
@ -132,7 +135,7 @@
bookmark = ed.selection.getBookmark(); bookmark = ed.selection.getBookmark();
ed.selection.setRng(r); ed.selection.setRng(r);
tinyMCE.execCommand('mceInsertLink',false, matches[1] + matches[2]); tinyMCE.execCommand('createlink',false, matches[1] + matches[2]);
ed.selection.moveToBookmark(bookmark); ed.selection.moveToBookmark(bookmark);
// TODO: Determine if this is still needed. // TODO: Determine if this is still needed.

View File

@ -1 +1 @@
(function(){tinymce.create("tinymce.plugins.AutoResizePlugin",{init:function(a,c){var d=this;if(a.getParam("fullscreen_is_enabled")){return}function b(){var h=a.getDoc(),e=h.body,j=h.documentElement,g=tinymce.DOM,i=d.autoresize_min_height,f;f=tinymce.isIE?e.scrollHeight:j.offsetHeight;if(f>d.autoresize_min_height){i=f}g.setStyle(g.get(a.id+"_ifr"),"height",i+"px");if(d.throbbing){a.setProgressState(false);a.setProgressState(true)}}d.editor=a;d.autoresize_min_height=a.getElement().offsetHeight;a.onChange.add(b);a.onSetContent.add(b);a.onPaste.add(b);a.onKeyUp.add(b);a.onPostRender.add(b);if(a.getParam("autoresize_on_init",true)){a.onInit.add(function(f,e){f.setProgressState(true);d.throbbing=true;f.getBody().style.overflowY="hidden"});a.onLoadContent.add(function(f,e){b();setTimeout(function(){b();f.setProgressState(false);d.throbbing=false},1250)})}a.addCommand("mceAutoResize",b)},getInfo:function(){return{longname:"Auto Resize",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autoresize",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("autoresize",tinymce.plugins.AutoResizePlugin)})(); (function(){tinymce.create("tinymce.plugins.AutoResizePlugin",{init:function(a,c){var d=this,e=0;if(a.getParam("fullscreen_is_enabled")){return}function b(){var i=a.getDoc(),f=i.body,k=i.documentElement,h=tinymce.DOM,j=d.autoresize_min_height,g;g=tinymce.isIE?f.scrollHeight:i.body.offsetHeight;if(g>d.autoresize_min_height){j=g}if(d.autoresize_max_height&&g>d.autoresize_max_height){j=d.autoresize_max_height;a.getBody().style.overflowY="auto"}else{a.getBody().style.overflowY="hidden"}if(j!==e){h.setStyle(h.get(a.id+"_ifr"),"height",j+"px");e=j}if(d.throbbing){a.setProgressState(false);a.setProgressState(true)}}d.editor=a;d.autoresize_min_height=parseInt(a.getParam("autoresize_min_height",a.getElement().offsetHeight));d.autoresize_max_height=parseInt(a.getParam("autoresize_max_height",0));a.onInit.add(function(f){f.dom.setStyle(f.getBody(),"paddingBottom",f.getParam("autoresize_bottom_margin",50)+"px")});a.onChange.add(b);a.onSetContent.add(b);a.onPaste.add(b);a.onKeyUp.add(b);a.onPostRender.add(b);if(a.getParam("autoresize_on_init",true)){a.onInit.add(function(g,f){g.setProgressState(true);d.throbbing=true;g.getBody().style.overflowY="hidden"});a.onLoadContent.add(function(g,f){b();setTimeout(function(){b();g.setProgressState(false);d.throbbing=false},1250)})}a.addCommand("mceAutoResize",b)},getInfo:function(){return{longname:"Auto Resize",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autoresize",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("autoresize",tinymce.plugins.AutoResizePlugin)})();

View File

@ -26,7 +26,7 @@
* @param {string} url Absolute URL to where the plugin is located. * @param {string} url Absolute URL to where the plugin is located.
*/ */
init : function(ed, url) { init : function(ed, url) {
var t = this; var t = this, oldSize = 0;
if (ed.getParam('fullscreen_is_enabled')) if (ed.getParam('fullscreen_is_enabled'))
return; return;
@ -38,14 +38,24 @@
var d = ed.getDoc(), b = d.body, de = d.documentElement, DOM = tinymce.DOM, resizeHeight = t.autoresize_min_height, myHeight; var d = ed.getDoc(), b = d.body, de = d.documentElement, DOM = tinymce.DOM, resizeHeight = t.autoresize_min_height, myHeight;
// Get height differently depending on the browser used // Get height differently depending on the browser used
myHeight = tinymce.isIE ? b.scrollHeight : de.offsetHeight; myHeight = tinymce.isIE ? b.scrollHeight : d.body.offsetHeight;
// Don't make it smaller than the minimum height // Don't make it smaller than the minimum height
if (myHeight > t.autoresize_min_height) if (myHeight > t.autoresize_min_height)
resizeHeight = myHeight; resizeHeight = myHeight;
// If a maximum height has been defined don't exceed this height
if (t.autoresize_max_height && myHeight > t.autoresize_max_height) {
resizeHeight = t.autoresize_max_height;
ed.getBody().style.overflowY = "auto";
} else
ed.getBody().style.overflowY = "hidden";
// Resize content element // Resize content element
DOM.setStyle(DOM.get(ed.id + '_ifr'), 'height', resizeHeight + 'px'); if (resizeHeight !== oldSize) {
DOM.setStyle(DOM.get(ed.id + '_ifr'), 'height', resizeHeight + 'px');
oldSize = resizeHeight;
}
// if we're throbbing, we'll re-throb to match the new size // if we're throbbing, we'll re-throb to match the new size
if (t.throbbing) { if (t.throbbing) {
@ -57,7 +67,15 @@
t.editor = ed; t.editor = ed;
// Define minimum height // Define minimum height
t.autoresize_min_height = ed.getElement().offsetHeight; t.autoresize_min_height = parseInt( ed.getParam('autoresize_min_height', ed.getElement().offsetHeight) );
// Define maximum height
t.autoresize_max_height = parseInt( ed.getParam('autoresize_max_height', 0) );
// Add padding at the bottom for better UX
ed.onInit.add(function(ed){
ed.dom.setStyle(ed.getBody(), 'paddingBottom', ed.getParam('autoresize_bottom_margin', 50) + 'px');
});
// Add appropriate listeners for resizing content area // Add appropriate listeners for resizing content area
ed.onChange.add(resize); ed.onChange.add(resize);
@ -116,4 +134,4 @@
// Register plugin // Register plugin
tinymce.PluginManager.add('autoresize', tinymce.plugins.AutoResizePlugin); tinymce.PluginManager.add('autoresize', tinymce.plugins.AutoResizePlugin);
})(); })();

View File

@ -1 +1 @@
(function(e){var c="autosave",g="restoredraft",b=true,f,d,a=e.util.Dispatcher;e.create("tinymce.plugins.AutoSave",{init:function(i,j){var h=this,l=i.settings;h.editor=i;function k(n){var m={s:1000,m:60000};n=/^(\d+)([ms]?)$/.exec(""+n);return(n[2]?m[n[2]]:1)*parseInt(n)}e.each({ask_before_unload:b,interval:"30s",retention:"20m",minlength:50},function(n,m){m=c+"_"+m;if(l[m]===f){l[m]=n}});l.autosave_interval=k(l.autosave_interval);l.autosave_retention=k(l.autosave_retention);i.addButton(g,{title:c+".restore_content",onclick:function(){if(i.getContent({draft:true}).replace(/\s|&nbsp;|<\/?p[^>]*>|<br[^>]*>/gi,"").length>0){i.windowManager.confirm(c+".warning_message",function(m){if(m){h.restoreDraft()}})}else{h.restoreDraft()}}});i.onNodeChange.add(function(){var m=i.controlManager;if(m.get(g)){m.setDisabled(g,!h.hasDraft())}});i.onInit.add(function(){if(i.controlManager.get(g)){h.setupStorage(i);setInterval(function(){h.storeDraft();i.nodeChanged()},l.autosave_interval)}});h.onStoreDraft=new a(h);h.onRestoreDraft=new a(h);h.onRemoveDraft=new a(h);if(!d){window.onbeforeunload=e.plugins.AutoSave._beforeUnloadHandler;d=b}},getInfo:function(){return{longname:"Auto save",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave",version:e.majorVersion+"."+e.minorVersion}},getExpDate:function(){return new Date(new Date().getTime()+this.editor.settings.autosave_retention).toUTCString()},setupStorage:function(i){var h=this,k=c+"_test",j="OK";h.key=c+i.id;e.each([function(){if(localStorage){localStorage.setItem(k,j);if(localStorage.getItem(k)===j){localStorage.removeItem(k);return localStorage}}},function(){if(sessionStorage){sessionStorage.setItem(k,j);if(sessionStorage.getItem(k)===j){sessionStorage.removeItem(k);return sessionStorage}}},function(){if(e.isIE){i.getElement().style.behavior="url('#default#userData')";return{autoExpires:b,setItem:function(l,n){var m=i.getElement();m.setAttribute(l,n);m.expires=h.getExpDate();try{m.save("TinyMCE")}catch(o){}},getItem:function(l){var m=i.getElement();try{m.load("TinyMCE");return m.getAttribute(l)}catch(n){return null}},removeItem:function(l){i.getElement().removeAttribute(l)}}}},],function(l){try{h.storage=l();if(h.storage){return false}}catch(m){}})},storeDraft:function(){var i=this,l=i.storage,j=i.editor,h,k;if(l){if(!l.getItem(i.key)&&!j.isDirty()){return}k=j.getContent({draft:true});if(k.length>j.settings.autosave_minlength){h=i.getExpDate();if(!i.storage.autoExpires){i.storage.setItem(i.key+"_expires",h)}i.storage.setItem(i.key,k);i.onStoreDraft.dispatch(i,{expires:h,content:k})}}},restoreDraft:function(){var h=this,i=h.storage;if(i){content=i.getItem(h.key);if(content){h.editor.setContent(content);h.onRestoreDraft.dispatch(h,{content:content})}}},hasDraft:function(){var h=this,k=h.storage,i,j;if(k){j=!!k.getItem(h.key);if(j){if(!h.storage.autoExpires){i=new Date(k.getItem(h.key+"_expires"));if(new Date().getTime()<i.getTime()){return b}h.removeDraft()}else{return b}}}return false},removeDraft:function(){var h=this,k=h.storage,i=h.key,j;if(k){j=k.getItem(i);k.removeItem(i);k.removeItem(i+"_expires");if(j){h.onRemoveDraft.dispatch(h,{content:j})}}},"static":{_beforeUnloadHandler:function(h){var i;e.each(tinyMCE.editors,function(j){if(j.plugins.autosave){j.plugins.autosave.storeDraft()}if(j.getParam("fullscreen_is_enabled")){return}if(!i&&j.isDirty()&&j.getParam("autosave_ask_before_unload")){i=j.getLang("autosave.unload_msg")}});return i}}});e.PluginManager.add("autosave",e.plugins.AutoSave)})(tinymce); (function(e){var c="autosave",g="restoredraft",b=true,f,d,a=e.util.Dispatcher;e.create("tinymce.plugins.AutoSave",{init:function(i,j){var h=this,l=i.settings;h.editor=i;function k(n){var m={s:1000,m:60000};n=/^(\d+)([ms]?)$/.exec(""+n);return(n[2]?m[n[2]]:1)*parseInt(n)}e.each({ask_before_unload:b,interval:"30s",retention:"20m",minlength:50},function(n,m){m=c+"_"+m;if(l[m]===f){l[m]=n}});l.autosave_interval=k(l.autosave_interval);l.autosave_retention=k(l.autosave_retention);i.addButton(g,{title:c+".restore_content",onclick:function(){if(i.getContent({draft:true}).replace(/\s|&nbsp;|<\/?p[^>]*>|<br[^>]*>/gi,"").length>0){i.windowManager.confirm(c+".warning_message",function(m){if(m){h.restoreDraft()}})}else{h.restoreDraft()}}});i.onNodeChange.add(function(){var m=i.controlManager;if(m.get(g)){m.setDisabled(g,!h.hasDraft())}});i.onInit.add(function(){if(i.controlManager.get(g)){h.setupStorage(i);setInterval(function(){h.storeDraft();i.nodeChanged()},l.autosave_interval)}});h.onStoreDraft=new a(h);h.onRestoreDraft=new a(h);h.onRemoveDraft=new a(h);if(!d){window.onbeforeunload=e.plugins.AutoSave._beforeUnloadHandler;d=b}},getInfo:function(){return{longname:"Auto save",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave",version:e.majorVersion+"."+e.minorVersion}},getExpDate:function(){return new Date(new Date().getTime()+this.editor.settings.autosave_retention).toUTCString()},setupStorage:function(i){var h=this,k=c+"_test",j="OK";h.key=c+i.id;e.each([function(){if(localStorage){localStorage.setItem(k,j);if(localStorage.getItem(k)===j){localStorage.removeItem(k);return localStorage}}},function(){if(sessionStorage){sessionStorage.setItem(k,j);if(sessionStorage.getItem(k)===j){sessionStorage.removeItem(k);return sessionStorage}}},function(){if(e.isIE){i.getElement().style.behavior="url('#default#userData')";return{autoExpires:b,setItem:function(l,n){var m=i.getElement();m.setAttribute(l,n);m.expires=h.getExpDate();try{m.save("TinyMCE")}catch(o){}},getItem:function(l){var m=i.getElement();try{m.load("TinyMCE");return m.getAttribute(l)}catch(n){return null}},removeItem:function(l){i.getElement().removeAttribute(l)}}}},],function(l){try{h.storage=l();if(h.storage){return false}}catch(m){}})},storeDraft:function(){var i=this,l=i.storage,j=i.editor,h,k;if(l){if(!l.getItem(i.key)&&!j.isDirty()){return}k=j.getContent({draft:true});if(k.length>j.settings.autosave_minlength){h=i.getExpDate();if(!i.storage.autoExpires){i.storage.setItem(i.key+"_expires",h)}i.storage.setItem(i.key,k);i.onStoreDraft.dispatch(i,{expires:h,content:k})}}},restoreDraft:function(){var h=this,j=h.storage,i;if(j){i=j.getItem(h.key);if(i){h.editor.setContent(i);h.onRestoreDraft.dispatch(h,{content:i})}}},hasDraft:function(){var h=this,k=h.storage,i,j;if(k){j=!!k.getItem(h.key);if(j){if(!h.storage.autoExpires){i=new Date(k.getItem(h.key+"_expires"));if(new Date().getTime()<i.getTime()){return b}h.removeDraft()}else{return b}}}return false},removeDraft:function(){var h=this,k=h.storage,i=h.key,j;if(k){j=k.getItem(i);k.removeItem(i);k.removeItem(i+"_expires");if(j){h.onRemoveDraft.dispatch(h,{content:j})}}},"static":{_beforeUnloadHandler:function(h){var i;e.each(tinyMCE.editors,function(j){if(j.plugins.autosave){j.plugins.autosave.storeDraft()}if(j.getParam("fullscreen_is_enabled")){return}if(!i&&j.isDirty()&&j.getParam("autosave_ask_before_unload")){i=j.getLang("autosave.unload_msg")}});return i}}});e.PluginManager.add("autosave",e.plugins.AutoSave)})(tinymce);

View File

@ -335,7 +335,7 @@
* @method restoreDraft * @method restoreDraft
*/ */
restoreDraft : function() { restoreDraft : function() {
var self = this, storage = self.storage; var self = this, storage = self.storage, content;
if (storage) { if (storage) {
content = storage.getItem(self.key); content = storage.getItem(self.key);

View File

@ -1 +1 @@
(function(){var a=tinymce.dom.Event,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.ContextMenu",{init:function(e){var h=this,i,f,d;h.editor=e;d=e.settings.contextmenu_never_use_native;h.onContextMenu=new tinymce.util.Dispatcher(this);f=e.onContextMenu.add(function(j,k){if(k.ctrlKey&&!d){return}if(i){j.selection.setRng(i)}h._getMenu(j).showMenu(k.clientX||k.pageX,k.clientY||k.pageX);a.add(j.getDoc(),"click",function(l){g(j,l)});a.cancel(k)});e.onRemove.add(function(){if(h._menu){h._menu.removeAll()}});function g(j,k){i=null;if(k&&k.button==2){i=j.selection.getRng();return}if(h._menu){h._menu.removeAll();h._menu.destroy();a.remove(j.getDoc(),"click",g)}}e.onMouseDown.add(g);e.onKeyDown.add(g);e.onKeyDown.add(function(j,k){if(k.shiftKey&&!k.ctrlKey&&!k.altKey&&k.keyCode===121){a.cancel(k);f(j,k)}})},getInfo:function(){return{longname:"Contextmenu",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_getMenu:function(h){var l=this,f=l._menu,i=h.selection,e=i.isCollapsed(),d=i.getNode()||h.getBody(),g,k,j;if(f){f.removeAll();f.destroy()}k=b.getPos(h.getContentAreaContainer());j=b.getPos(h.getContainer());f=h.controlManager.createDropMenu("contextmenu",{offset_x:k.x+h.getParam("contextmenu_offset_x",0),offset_y:k.y+h.getParam("contextmenu_offset_y",0),constrain:1,keyboard_focus:true});l._menu=f;f.add({title:"advanced.cut_desc",icon:"cut",cmd:"Cut"}).setDisabled(e);f.add({title:"advanced.copy_desc",icon:"copy",cmd:"Copy"}).setDisabled(e);f.add({title:"advanced.paste_desc",icon:"paste",cmd:"Paste"});if((d.nodeName=="A"&&!h.dom.getAttrib(d,"name"))||!e){f.addSeparator();f.add({title:"advanced.link_desc",icon:"link",cmd:h.plugins.advlink?"mceAdvLink":"mceLink",ui:true});f.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"})}f.addSeparator();f.add({title:"advanced.image_desc",icon:"image",cmd:h.plugins.advimage?"mceAdvImage":"mceImage",ui:true});f.addSeparator();g=f.addMenu({title:"contextmenu.align"});g.add({title:"contextmenu.left",icon:"justifyleft",cmd:"JustifyLeft"});g.add({title:"contextmenu.center",icon:"justifycenter",cmd:"JustifyCenter"});g.add({title:"contextmenu.right",icon:"justifyright",cmd:"JustifyRight"});g.add({title:"contextmenu.full",icon:"justifyfull",cmd:"JustifyFull"});l.onContextMenu.dispatch(l,f,d,e);return f}});tinymce.PluginManager.add("contextmenu",tinymce.plugins.ContextMenu)})(); (function(){var a=tinymce.dom.Event,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.ContextMenu",{init:function(e){var h=this,f,d,i;h.editor=e;d=e.settings.contextmenu_never_use_native;h.onContextMenu=new tinymce.util.Dispatcher(this);f=e.onContextMenu.add(function(j,k){if((i!==0?i:k.ctrlKey)&&!d){return}a.cancel(k);if(k.target.nodeName=="IMG"){j.selection.select(k.target)}h._getMenu(j).showMenu(k.clientX||k.pageX,k.clientY||k.pageY);a.add(j.getDoc(),"click",function(l){g(j,l)});j.nodeChanged()});e.onRemove.add(function(){if(h._menu){h._menu.removeAll()}});function g(j,k){i=0;if(k&&k.button==2){i=k.ctrlKey;return}if(h._menu){h._menu.removeAll();h._menu.destroy();a.remove(j.getDoc(),"click",g)}}e.onMouseDown.add(g);e.onKeyDown.add(g);e.onKeyDown.add(function(j,k){if(k.shiftKey&&!k.ctrlKey&&!k.altKey&&k.keyCode===121){a.cancel(k);f(j,k)}})},getInfo:function(){return{longname:"Contextmenu",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_getMenu:function(e){var g=this,d=g._menu,j=e.selection,f=j.isCollapsed(),h=j.getNode()||e.getBody(),i,k;if(d){d.removeAll();d.destroy()}k=b.getPos(e.getContentAreaContainer());d=e.controlManager.createDropMenu("contextmenu",{offset_x:k.x+e.getParam("contextmenu_offset_x",0),offset_y:k.y+e.getParam("contextmenu_offset_y",0),constrain:1,keyboard_focus:true});g._menu=d;d.add({title:"advanced.cut_desc",icon:"cut",cmd:"Cut"}).setDisabled(f);d.add({title:"advanced.copy_desc",icon:"copy",cmd:"Copy"}).setDisabled(f);d.add({title:"advanced.paste_desc",icon:"paste",cmd:"Paste"});if((h.nodeName=="A"&&!e.dom.getAttrib(h,"name"))||!f){d.addSeparator();d.add({title:"advanced.link_desc",icon:"link",cmd:e.plugins.advlink?"mceAdvLink":"mceLink",ui:true});d.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"})}d.addSeparator();d.add({title:"advanced.image_desc",icon:"image",cmd:e.plugins.advimage?"mceAdvImage":"mceImage",ui:true});d.addSeparator();i=d.addMenu({title:"contextmenu.align"});i.add({title:"contextmenu.left",icon:"justifyleft",cmd:"JustifyLeft"});i.add({title:"contextmenu.center",icon:"justifycenter",cmd:"JustifyCenter"});i.add({title:"contextmenu.right",icon:"justifyright",cmd:"JustifyRight"});i.add({title:"contextmenu.full",icon:"justifyfull",cmd:"JustifyFull"});g.onContextMenu.dispatch(g,d,h,f);return d}});tinymce.PluginManager.add("contextmenu",tinymce.plugins.ContextMenu)})();

View File

@ -27,7 +27,7 @@
* @param {string} url Absolute URL to where the plugin is located. * @param {string} url Absolute URL to where the plugin is located.
*/ */
init : function(ed) { init : function(ed) {
var t = this, lastRng, showMenu, contextmenuNeverUseNative; var t = this, showMenu, contextmenuNeverUseNative, realCtrlKey;
t.editor = ed; t.editor = ed;
@ -43,17 +43,22 @@
t.onContextMenu = new tinymce.util.Dispatcher(this); t.onContextMenu = new tinymce.util.Dispatcher(this);
showMenu = ed.onContextMenu.add(function(ed, e) { showMenu = ed.onContextMenu.add(function(ed, e) {
if (e.ctrlKey && !contextmenuNeverUseNative) return; // Block TinyMCE menu on ctrlKey and work around Safari issue
if ((realCtrlKey !== 0 ? realCtrlKey : e.ctrlKey) && !contextmenuNeverUseNative)
return;
// Restore the last selection since it was removed Event.cancel(e);
if (lastRng)
ed.selection.setRng(lastRng);
t._getMenu(ed).showMenu(e.clientX || e.pageX, e.clientY || e.pageX); // Select the image if it's clicked. WebKit would other wise expand the selection
if (e.target.nodeName == 'IMG')
ed.selection.select(e.target);
t._getMenu(ed).showMenu(e.clientX || e.pageX, e.clientY || e.pageY);
Event.add(ed.getDoc(), 'click', function(e) { Event.add(ed.getDoc(), 'click', function(e) {
hide(ed, e); hide(ed, e);
}); });
Event.cancel(e);
ed.nodeChanged();
}); });
ed.onRemove.add(function() { ed.onRemove.add(function() {
@ -62,12 +67,12 @@
}); });
function hide(ed, e) { function hide(ed, e) {
lastRng = null; realCtrlKey = 0;
// Since the contextmenu event moves // Since the contextmenu event moves
// the selection we need to store it away // the selection we need to store it away
if (e && e.button == 2) { if (e && e.button == 2) {
lastRng = ed.selection.getRng(); realCtrlKey = e.ctrlKey;
return; return;
} }
@ -106,19 +111,18 @@
}, },
_getMenu : function(ed) { _getMenu : function(ed) {
var t = this, m = t._menu, se = ed.selection, col = se.isCollapsed(), el = se.getNode() || ed.getBody(), am, p1, p2; var t = this, m = t._menu, se = ed.selection, col = se.isCollapsed(), el = se.getNode() || ed.getBody(), am, p;
if (m) { if (m) {
m.removeAll(); m.removeAll();
m.destroy(); m.destroy();
} }
p1 = DOM.getPos(ed.getContentAreaContainer()); p = DOM.getPos(ed.getContentAreaContainer());
p2 = DOM.getPos(ed.getContainer());
m = ed.controlManager.createDropMenu('contextmenu', { m = ed.controlManager.createDropMenu('contextmenu', {
offset_x : p1.x + ed.getParam('contextmenu_offset_x', 0), offset_x : p.x + ed.getParam('contextmenu_offset_x', 0),
offset_y : p1.y + ed.getParam('contextmenu_offset_y', 0), offset_y : p.y + ed.getParam('contextmenu_offset_y', 0),
constrain : 1, constrain : 1,
keyboard_focus: true keyboard_focus: true
}); });

View File

@ -10,32 +10,33 @@
<div align="center"> <div align="center">
<div class="title">{#emotions_dlg.title}:<br /><br /></div> <div class="title">{#emotions_dlg.title}:<br /><br /></div>
<table role="presentation" border="0" cellspacing="0" cellpadding="4"> <table id="emoticon_table" role="presentation" border="0" cellspacing="0" cellpadding="4">
<tr> <tr>
<td><a href="javascript:EmotionsDialog.insert('smiley-cool.gif','emotions_dlg.cool');"><img src="img/smiley-cool.gif" width="18" height="18" border="0" alt="{#emotions_dlg.cool}" title="{#emotions_dlg.cool}" /></a></td> <td><a class="emoticon_link" role="button" title="{#emotions_dlg.cool}. {#emotions_dlg.usage}" href="javascript:EmotionsDialog.insert('smiley-cool.gif','emotions_dlg.cool');"><img src="img/smiley-cool.gif" width="18" height="18" border="0" alt="{#emotions_dlg.cool}. {#emotions_dlg.usage}" /></a></td>
<td><a href="javascript:EmotionsDialog.insert('smiley-cry.gif','emotions_dlg.cry');"><img src="img/smiley-cry.gif" width="18" height="18" border="0" alt="{#emotions_dlg.cry}" title="{#emotions_dlg.cry}" /></a></td> <td><a class="emoticon_link" role="button" title="{#emotions_dlg.cry}. {#emotions_dlg.usage}" href="javascript:EmotionsDialog.insert('smiley-cry.gif','emotions_dlg.cry');"><img src="img/smiley-cry.gif" width="18" height="18" border="0" alt="{#emotions_dlg.cry}. {#emotions_dlg.usage}" /></a></td>
<td><a href="javascript:EmotionsDialog.insert('smiley-embarassed.gif','emotions_dlg.embarassed');"><img src="img/smiley-embarassed.gif" width="18" height="18" border="0" alt="{#emotions_dlg.embarassed}" title="{#emotions_dlg.embarassed}" /></a></td> <td><a class="emoticon_link" role="button" title="{#emotions_dlg.embarassed}. {#emotions_dlg.usage}" href="javascript:EmotionsDialog.insert('smiley-embarassed.gif','emotions_dlg.embarassed');"><img src="img/smiley-embarassed.gif" width="18" height="18" border="0" alt="{#emotions_dlg.embarassed}. {#emotions_dlg.usage}" /></a></td>
<td><a href="javascript:EmotionsDialog.insert('smiley-foot-in-mouth.gif','emotions_dlg.foot_in_mouth');"><img src="img/smiley-foot-in-mouth.gif" width="18" height="18" border="0" alt="{#emotions_dlg.foot_in_mouth}" title="{#emotions_dlg.foot_in_mouth}" /></a></td> <td><a class="emoticon_link" role="button" title="{#emotions_dlg.foot_in_mouth}. {#emotions_dlg.usage}" href="javascript:EmotionsDialog.insert('smiley-foot-in-mouth.gif','emotions_dlg.foot_in_mouth');"><img src="img/smiley-foot-in-mouth.gif" width="18" height="18" border="0" alt="{#emotions_dlg.foot_in_mouth}. {#emotions_dlg.usage}" /></a></td>
</tr> </tr>
<tr> <tr>
<td><a href="javascript:EmotionsDialog.insert('smiley-frown.gif','emotions_dlg.frown');"><img src="img/smiley-frown.gif" width="18" height="18" border="0" alt="{#emotions_dlg.frown}" title="{#emotions_dlg.frown}" /></a></td> <td><a class="emoticon_link" role="button" title="{#emotions_dlg.frown}. {#emotions_dlg.usage}" href="javascript:EmotionsDialog.insert('smiley-frown.gif','emotions_dlg.frown');"><img src="img/smiley-frown.gif" width="18" height="18" border="0" alt="{#emotions_dlg.frown}. {#emotions_dlg.usage}" /></a></td>
<td><a href="javascript:EmotionsDialog.insert('smiley-innocent.gif','emotions_dlg.innocent');"><img src="img/smiley-innocent.gif" width="18" height="18" border="0" alt="{#emotions_dlg.innocent}" title="{#emotions_dlg.innocent}" /></a></td> <td><a class="emoticon_link" role="button" title="{#emotions_dlg.innocent}. {#emotions_dlg.usage}" href="javascript:EmotionsDialog.insert('smiley-innocent.gif','emotions_dlg.innocent');"><img src="img/smiley-innocent.gif" width="18" height="18" border="0" alt="{#emotions_dlg.innocent}. {#emotions_dlg.usage}" /></a></td>
<td><a href="javascript:EmotionsDialog.insert('smiley-kiss.gif','emotions_dlg.kiss');"><img src="img/smiley-kiss.gif" width="18" height="18" border="0" alt="{#emotions_dlg.kiss}" title="{#emotions_dlg.kiss}" /></a></td> <td><a class="emoticon_link" role="button" title="{#emotions_dlg.kiss}. {#emotions_dlg.usage}" href="javascript:EmotionsDialog.insert('smiley-kiss.gif','emotions_dlg.kiss');"><img src="img/smiley-kiss.gif" width="18" height="18" border="0" alt="{#emotions_dlg.kiss}. {#emotions_dlg.usage}" /></a></td>
<td><a href="javascript:EmotionsDialog.insert('smiley-laughing.gif','emotions_dlg.laughing');"><img src="img/smiley-laughing.gif" width="18" height="18" border="0" alt="{#emotions_dlg.laughing}" title="{#emotions_dlg.laughing}" /></a></td> <td><a class="emoticon_link" role="button" title="{#emotions_dlg.laughing}. {#emotions_dlg.usage}" href="javascript:EmotionsDialog.insert('smiley-laughing.gif','emotions_dlg.laughing');"><img src="img/smiley-laughing.gif" width="18" height="18" border="0" alt="{#emotions_dlg.laughing}. {#emotions_dlg.usage}" /></a></td>
</tr> </tr>
<tr> <tr>
<td><a href="javascript:EmotionsDialog.insert('smiley-money-mouth.gif','emotions_dlg.money_mouth');"><img src="img/smiley-money-mouth.gif" width="18" height="18" border="0" alt="{#emotions_dlg.money_mouth}" title="{#emotions_dlg.money_mouth}" /></a></td> <td><a class="emoticon_link" role="button" title="{#emotions_dlg.money_mouth}. {#emotions_dlg.usage}" href="javascript:EmotionsDialog.insert('smiley-money-mouth.gif','emotions_dlg.money_mouth');"><img src="img/smiley-money-mouth.gif" width="18" height="18" border="0" alt="{#emotions_dlg.money_mouth}. {#emotions_dlg.usage}"/></a></td>
<td><a href="javascript:EmotionsDialog.insert('smiley-sealed.gif','emotions_dlg.sealed');"><img src="img/smiley-sealed.gif" width="18" height="18" border="0" alt="{#emotions_dlg.sealed}" title="{#emotions_dlg.sealed}" /></a></td> <td><a class="emoticon_link" role="button" title="{#emotions_dlg.sealed}. {#emotions_dlg.usage}" href="javascript:EmotionsDialog.insert('smiley-sealed.gif','emotions_dlg.sealed');"><img src="img/smiley-sealed.gif" width="18" height="18" border="0" alt="{#emotions_dlg.sealed}. {#emotions_dlg.usage}" /></a></td>
<td><a href="javascript:EmotionsDialog.insert('smiley-smile.gif','emotions_dlg.smile');"><img src="img/smiley-smile.gif" width="18" height="18" border="0" alt="{#emotions_dlg.smile}" title="{#emotions_dlg.smile}" /></a></td> <td><a class="emoticon_link" role="button" title="{#emotions_dlg.smile}. {#emotions_dlg.usage}" href="javascript:EmotionsDialog.insert('smiley-smile.gif','emotions_dlg.smile');"><img src="img/smiley-smile.gif" width="18" height="18" border="0" alt="{#emotions_dlg.smile}. {#emotions_dlg.usage}" /></a></td>
<td><a href="javascript:EmotionsDialog.insert('smiley-surprised.gif','emotions_dlg.surprised');"><img src="img/smiley-surprised.gif" width="18" height="18" border="0" alt="{#emotions_dlg.surprised}" title="{#emotions_dlg.surprised}" /></a></td> <td><a class="emoticon_link" role="button" title="{#emotions_dlg.surprised}. {#emotions_dlg.usage}" href="javascript:EmotionsDialog.insert('smiley-surprised.gif','emotions_dlg.surprised');"><img src="img/smiley-surprised.gif" width="18" height="18" border="0" alt="{#emotions_dlg.surprised}. {#emotions_dlg.usage}" /></a></td>
</tr> </tr>
<tr> <tr>
<td><a href="javascript:EmotionsDialog.insert('smiley-tongue-out.gif','emotions_dlg.tongue_out');"><img src="img/smiley-tongue-out.gif" width="18" height="18" border="0" alt="{#emotions_dlg.tongue-out}" title="{#emotions_dlg.tongue_out}" /></a></td> <td><a class="emoticon_link" role="button" title="{#emotions_dlg.tongue-out}. {#emotions_dlg.usage}" href="javascript:EmotionsDialog.insert('smiley-tongue-out.gif','emotions_dlg.tongue_out');"><img src="img/smiley-tongue-out.gif" width="18" height="18" border="0" alt="{#emotions_dlg.tongue-out}. {#emotions_dlg.usage}" /></a></td>
<td><a href="javascript:EmotionsDialog.insert('smiley-undecided.gif','emotions_dlg.undecided');"><img src="img/smiley-undecided.gif" width="18" height="18" border="0" alt="{#emotions_dlg.undecided}" title="{#emotions_dlg.undecided}" /></a></td> <td><a class="emoticon_link" role="button" title="{#emotions_dlg.undecided}. {#emotions_dlg.usage}" href="javascript:EmotionsDialog.insert('smiley-undecided.gif','emotions_dlg.undecided');"><img src="img/smiley-undecided.gif" width="18" height="18" border="0" alt="{#emotions_dlg.undecided}. {#emotions_dlg.usage}" /></a></td>
<td><a href="javascript:EmotionsDialog.insert('smiley-wink.gif','emotions_dlg.wink');"><img src="img/smiley-wink.gif" width="18" height="18" border="0" alt="{#emotions_dlg.wink}" title="{#emotions_dlg.wink}" /></a></td> <td><a class="emoticon_link" role="button" title="{#emotions_dlg.wink}. {#emotions_dlg.usage}" href="javascript:EmotionsDialog.insert('smiley-wink.gif','emotions_dlg.wink');"><img src="img/smiley-wink.gif" width="18" height="18" border="0" alt="{#emotions_dlg.wink}. {#emotions_dlg.usage}" /></a></td>
<td><a href="javascript:EmotionsDialog.insert('smiley-yell.gif','emotions_dlg.yell');"><img src="img/smiley-yell.gif" width="18" height="18" border="0" alt="{#emotions_dlg.yell}" title="{#emotions_dlg.yell}" /></a></td> <td><a class="emoticon_link" role="button" title="{#emotions_dlg.yell}. {#emotions_dlg.usage}" href="javascript:EmotionsDialog.insert('smiley-yell.gif','emotions_dlg.yell');"><img src="img/smiley-yell.gif" width="18" height="18" border="0" alt="{#emotions_dlg.yell}. {#emotions_dlg.usage}" /></a></td>
</tr> </tr>
</table> </table>
<div>{#emotions_dlg.usage}</div>
</div> </div>
</body> </body>
</html> </html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 344 B

After

Width:  |  Height:  |  Size: 342 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 344 B

After

Width:  |  Height:  |  Size: 343 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 325 B

After

Width:  |  Height:  |  Size: 323 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 345 B

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 342 B

After

Width:  |  Height:  |  Size: 338 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 351 B

After

Width:  |  Height:  |  Size: 350 B

View File

@ -1,8 +1,29 @@
tinyMCEPopup.requireLangPack(); tinyMCEPopup.requireLangPack();
var EmotionsDialog = { var EmotionsDialog = {
addKeyboardNavigation: function(){
var tableElm, cells, settings;
cells = tinyMCEPopup.dom.select("a.emoticon_link", "emoticon_table");
settings ={
root: "emoticon_table",
items: cells
};
cells[0].tabindex=0;
tinyMCEPopup.dom.addClass(cells[0], "mceFocus");
if (tinymce.isGecko) {
cells[0].focus();
} else {
setTimeout(function(){
cells[0].focus();
}, 100);
}
tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', settings, tinyMCEPopup.dom);
},
init : function(ed) { init : function(ed) {
tinyMCEPopup.resizeToInnerSize(); tinyMCEPopup.resizeToInnerSize();
this.addKeyboardNavigation();
}, },
insert : function(file, title) { insert : function(file, title) {

View File

@ -1,20 +1 @@
tinyMCE.addI18n('en.emotions_dlg',{ tinyMCE.addI18n('en.emotions_dlg',{cry:"Cry",cool:"Cool",desc:"Emotions",title:"Insert Emotion",usage:"Use left and right arrows to navigate.",yell:"Yell",wink:"Wink",undecided:"Undecided","tongue_out":"Tongue Out",surprised:"Surprised",smile:"Smile",sealed:"Sealed","money_mouth":"Money Mouth",laughing:"Laughing",kiss:"Kiss",innocent:"Innocent",frown:"Frown","foot_in_mouth":"Foot in Mouth",embarassed:"Embarassed"});
title:"Insert emotion",
desc:"Emotions",
cool:"Cool",
cry:"Cry",
embarassed:"Embarassed",
foot_in_mouth:"Foot in mouth",
frown:"Frown",
innocent:"Innocent",
kiss:"Kiss",
laughing:"Laughing",
money_mouth:"Money mouth",
sealed:"Sealed",
smile:"Smile",
surprised:"Surprised",
tongue_out:"Tongue out",
undecided:"Undecided",
wink:"Wink",
yell:"Yell"
});

View File

@ -0,0 +1 @@
(function(){tinymce.create("tinymce.plugins.ExampleDependencyPlugin",{init:function(a,b){},getInfo:function(){return{longname:"Example Dependency plugin",author:"Some author",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example_dependency",version:"1.0"}}});tinymce.PluginManager.add("example_dependency",tinymce.plugins.ExampleDependencyPlugin,["example"])})();

View File

@ -0,0 +1,50 @@
/**
* editor_plugin_src.js
*
* Copyright 2009, Moxiecode Systems AB
* Released under LGPL License.
*
* License: http://tinymce.moxiecode.com/license
* Contributing: http://tinymce.moxiecode.com/contributing
*/
(function() {
tinymce.create('tinymce.plugins.ExampleDependencyPlugin', {
/**
* Initializes the plugin, this will be executed after the plugin has been created.
* This call is done before the editor instance has finished it's initialization so use the onInit event
* of the editor instance to intercept that event.
*
* @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
* @param {string} url Absolute URL to where the plugin is located.
*/
init : function(ed, url) {
},
/**
* Returns information about the plugin as a name/value array.
* The current keys are longname, author, authorurl, infourl and version.
*
* @return {Object} Name/value array containing information about the plugin.
*/
getInfo : function() {
return {
longname : 'Example Dependency plugin',
author : 'Some author',
authorurl : 'http://tinymce.moxiecode.com',
infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example_dependency',
version : "1.0"
};
}
});
/**
* Register the plugin, specifying the list of the plugins that this plugin depends on. They are specified in a list, with the list loaded in order.
* plugins in this list will be initialised when this plugin is initialized. (before the init method is called).
* plugins in a depends list should typically be specified using the short name). If neccesary this can be done
* with an object which has the url to the plugin and the shortname.
*/
tinymce.PluginManager.add('example_dependency', tinymce.plugins.ExampleDependencyPlugin, ['example']);
})();

View File

@ -45,47 +45,6 @@
width: 100%; width: 100%;
} }
/* not implemented advanced tab buttons
.addbutton, .removebutton, .moveupbutton, .movedownbutton {
border-top: 1px solid;
border-left: 1px solid;
border-bottom: 1px solid;
border-right: 1px solid;
border-color: #F0F0EE;
cursor: default;
display: block;
width: 20px;
height: 20px;
}
.addbutton:hover, .removebutton:hover, .moveupbutton:hover, .movedownbutton:hover {
border: 1px solid #0A246A;
background-color: #B6BDD2;
}
.addbutton {
background-image: url('../images/add.gif');
float: left;
margin-right: 3px;
}
.removebutton {
background-image: url('../images/remove.gif');
float: left;
}
.moveupbutton {
background-image: url('../images/move_up.gif');
float: left;
margin-right: 3px;
}
.movedownbutton {
background-image: url('../images/move_down.gif');
float: left;
}
*/
.selected { .selected {
border: 1px solid #0A246A; border: 1px solid #0A246A;
background-color: #B6BDD2; background-color: #B6BDD2;

File diff suppressed because one or more lines are too long

View File

@ -9,6 +9,8 @@
*/ */
(function() { (function() {
var each = tinymce.each, Node = tinymce.html.Node;
tinymce.create('tinymce.plugins.FullPagePlugin', { tinymce.create('tinymce.plugins.FullPagePlugin', {
init : function(ed, url) { init : function(ed, url) {
var t = this; var t = this;
@ -24,7 +26,7 @@
inline : 1 inline : 1
}, { }, {
plugin_url : url, plugin_url : url,
head_html : t.head data : t._htmlToData()
}); });
}); });
@ -32,7 +34,6 @@
ed.addButton('fullpage', {title : 'fullpage.desc', cmd : 'mceFullPageProperties'}); ed.addButton('fullpage', {title : 'fullpage.desc', cmd : 'mceFullPageProperties'});
ed.onBeforeSetContent.add(t._setContent, t); ed.onBeforeSetContent.add(t._setContent, t);
ed.onSetContent.add(t._setBodyAttribs, t);
ed.onGetContent.add(t._getContent, t); ed.onGetContent.add(t._getContent, t);
}, },
@ -48,149 +49,355 @@
// Private plugin internal methods // Private plugin internal methods
_setBodyAttribs : function(ed, o) { _htmlToData : function() {
var bdattr, i, len, kv, k, v, t, attr = this.head.match(/body(.*?)>/i), bddir = '',htattr, hattr = this.head.match(/<html([^>]*?)>/i); var headerFragment = this._parseHeader(), data = {}, nodes, elm, matches, editor = this.editor;
if (attr && attr[1]) { function getAttr(elm, name) {
bdattr = attr[1].match(/\s*(\w+\s*=\s*".*?"|\w+\s*=\s*'.*?'|\w+\s*=\s*\w+|\w+)\s*/g); var value = elm.attr(name);
if (bdattr) { return value || '';
for(i = 0, len = bdattr.length; i < len; i++) { };
kv = bdattr[i].split('=');
k = kv[0].replace(/\s/,'');
v = kv[1];
if (v) { // Default some values
v = v.replace(/^\s+/,'').replace(/\s+$/,''); data.fontface = editor.getParam("fullpage_default_fontface", "");
t = v.match(/^["'](.*)["']$/); data.fontsize = editor.getParam("fullpage_default_fontsize", "");
if (t) // Parse XML PI
v = t[1]; elm = headerFragment.firstChild;
if(k == 'dir') if (elm.type == 7) {
bddir = v; data.xml_pi = true;
} else matches = /encoding="([^"]+)"/.exec(elm.value);
v = k; if (matches)
data.docencoding = matches[1];
}
ed.dom.setAttrib(ed.getBody(), 'style', v); // Parse doctype
} elm = headerFragment.getAll('#doctype')[0];
if (elm)
data.doctype = '<!DOCTYPE' + elm.value + ">";
// Parse title element
elm = headerFragment.getAll('title')[0];
if (elm && elm.firstChild) {
data.metatitle = elm.firstChild.value;
}
// Parse meta elements
each(headerFragment.getAll('meta'), function(meta) {
var name = meta.attr('name'), httpEquiv = meta.attr('http-equiv'), matches;
if (name)
data['meta' + name.toLowerCase()] = meta.attr('content');
else if (httpEquiv == "Content-Type") {
matches = /charset\s*=\s*(.*)\s*/gi.exec(meta.attr('content'));
if (matches)
data.docencoding = matches[1];
} }
});
// Parse html attribs
elm = headerFragment.getAll('html')[0];
if (elm)
data.langcode = getAttr(elm, 'lang') || getAttr(elm, 'xml:lang');
// Parse stylesheet
elm = headerFragment.getAll('link')[0];
if (elm && elm.attr('rel') == 'stylesheet')
data.stylesheet = elm.attr('href');
// Parse body parts
elm = headerFragment.getAll('body')[0];
if (elm) {
data.langdir = getAttr(elm, 'dir');
data.style = getAttr(elm, 'style');
data.visited_color = getAttr(elm, 'vlink');
data.link_color = getAttr(elm, 'link');
data.active_color = getAttr(elm, 'alink');
} }
//if found fetch the dir-attribute from the html-tag and apply it to the editor-body
if(bddir == '' && hattr && hattr[1]){ return data;
htattr = hattr[1].match(/dir\s*=\s*["']([^"']*)["']/i);
if (htattr && htattr[1])
bddir = htattr[1];
}
bd = ed.getBody();
bd.setAttribute('dir', bddir);
}, },
_createSerializer : function() { _dataToHtml : function(data) {
return new tinymce.dom.Serializer({ var headerFragment, headElement, html, elm, value, dom = this.editor.dom;
dom : this.editor.dom,
indent : true, function setAttr(elm, name, value) {
apply_source_formatting : true, elm.attr(name, value ? value : undefined);
indent_before : 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,title,meta,head', };
indent_after : 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,title,meta,head'
function addHeadNode(node) {
if (headElement.firstChild)
headElement.insert(node, headElement.firstChild);
else
headElement.append(node);
};
headerFragment = this._parseHeader();
headElement = headerFragment.getAll('head')[0];
if (!headElement) {
elm = headerFragment.getAll('html')[0];
headElement = new Node('head', 1);
if (elm.firstChild)
elm.insert(headElement, elm.firstChild, true);
else
elm.append(headElement);
}
// Add/update/remove XML-PI
elm = headerFragment.firstChild;
if (data.xml_pi) {
value = 'version="1.0"';
if (data.docencoding)
value += ' encoding="' + data.docencoding + '"';
if (elm.type != 7) {
elm = new Node('xml', 7);
headerFragment.insert(elm, headerFragment.firstChild, true);
}
elm.value = value;
} else if (elm && elm.type == 7)
elm.remove();
// Add/update/remove doctype
elm = headerFragment.getAll('#doctype')[0];
if (data.doctype) {
if (!elm) {
elm = new Node('#doctype', 10);
if (data.xml_pi)
headerFragment.insert(elm, headerFragment.firstChild);
else
addHeadNode(elm);
}
elm.value = data.doctype.substring(9, data.doctype.length - 1);
} else if (elm)
elm.remove();
// Add/update/remove title
elm = headerFragment.getAll('title')[0];
if (data.metatitle) {
if (!elm) {
elm = new Node('title', 1);
elm.append(new Node('#text', 3)).value = data.metatitle;
addHeadNode(elm);
}
}
// Add meta encoding
if (data.docencoding) {
elm = null;
each(headerFragment.getAll('meta'), function(meta) {
if (meta.attr('http-equiv') == 'Content-Type')
elm = meta;
});
if (!elm) {
elm = new Node('meta', 1);
elm.attr('http-equiv', 'Content-Type');
elm.shortEnded = true;
addHeadNode(elm);
}
elm.attr('content', 'text/html; charset=' + data.docencoding);
}
// Add/update/remove meta
each('keywords,description,author,copyright,robots'.split(','), function(name) {
var nodes = headerFragment.getAll('meta'), i, meta, value = data['meta' + name];
for (i = 0; i < nodes.length; i++) {
meta = nodes[i];
if (meta.attr('name') == name) {
if (value)
meta.attr('content', value);
else
meta.remove();
return;
}
}
if (value) {
elm = new Node('meta', 1);
elm.attr('name', name);
elm.attr('content', value);
elm.shortEnded = true;
addHeadNode(elm);
}
}); });
// Add/update/delete link
elm = headerFragment.getAll('link')[0];
if (elm && elm.attr('rel') == 'stylesheet') {
if (data.stylesheet)
elm.attr('href', data.stylesheet);
else
elm.remove();
} else if (data.stylesheet) {
elm = new Node('link', 1);
elm.attr({
rel : 'stylesheet',
text : 'text/css',
href : data.stylesheet
});
elm.shortEnded = true;
addHeadNode(elm);
}
// Update body attributes
elm = headerFragment.getAll('body')[0];
if (elm) {
setAttr(elm, 'dir', data.langdir);
setAttr(elm, 'style', data.style);
setAttr(elm, 'vlink', data.visited_color);
setAttr(elm, 'link', data.link_color);
setAttr(elm, 'alink', data.active_color);
// Update iframe body as well
dom.setAttribs(this.editor.getBody(), {
style : data.style,
dir : data.dir,
vLink : data.visited_color,
link : data.link_color,
aLink : data.active_color
});
}
// Set html attributes
elm = headerFragment.getAll('html')[0];
if (elm) {
setAttr(elm, 'lang', data.langcode);
setAttr(elm, 'xml:lang', data.langcode);
}
// Serialize header fragment and crop away body part
html = new tinymce.html.Serializer({
validate: false,
indent: true,
apply_source_formatting : true,
indent_before: 'head,html,body,meta,title,script,link,style',
indent_after: 'head,html,body,meta,title,script,link,style'
}).serialize(headerFragment);
this.head = html.substring(0, html.indexOf('</body>'));
},
_parseHeader : function() {
// Parse the contents with a DOM parser
return new tinymce.html.DomParser({
validate: false,
root_name: '#document'
}).parse(this.head);
}, },
_setContent : function(ed, o) { _setContent : function(ed, o) {
var t = this, sp, ep, c = o.content, v, st = ''; var self = this, startPos, endPos, content = o.content, headerFragment, styles = '', dom = self.editor.dom, elm;
function low(s) {
return s.replace(/<\/?[A-Z]+/g, function(a) {
return a.toLowerCase();
})
};
// Ignore raw updated if we already have a head, this will fix issues with undo/redo keeping the head/foot separate // Ignore raw updated if we already have a head, this will fix issues with undo/redo keeping the head/foot separate
if (o.format == 'raw' && t.head) if (o.format == 'raw' && self.head)
return; return;
if (o.source_view && ed.getParam('fullpage_hide_in_source_view')) if (o.source_view && ed.getParam('fullpage_hide_in_source_view'))
return; return;
// Parse out head, body and footer // Parse out head, body and footer
c = c.replace(/<(\/?)BODY/gi, '<$1body'); content = content.replace(/<(\/?)BODY/gi, '<$1body');
sp = c.indexOf('<body'); startPos = content.indexOf('<body');
if (sp != -1) { if (startPos != -1) {
sp = c.indexOf('>', sp); startPos = content.indexOf('>', startPos);
t.head = c.substring(0, sp + 1); self.head = low(content.substring(0, startPos + 1));
// Concatenate all <style>'s text into t.css endPos = content.indexOf('</body', startPos);
var ss = 0, es; if (endPos == -1)
t.css = ''; endPos = content.length;
while ((ss = t.head.indexOf('<style', ss)) != -1) {
ss = c.indexOf('>', ss) + 1;
if ( (es = t.head.indexOf('</style', ss)) == -1)
break;
t.css += t.head.substring(ss, es);
ss = es;
}
ep = c.indexOf('</body', sp); o.content = content.substring(startPos + 1, endPos);
if (ep == -1) self.foot = low(content.substring(endPos));
ep = c.length;
o.content = c.substring(sp + 1, ep);
t.foot = c.substring(ep);
function low(s) {
return s.replace(/<\/?[A-Z]+/g, function(a) {
return a.toLowerCase();
})
};
t.head = low(t.head);
t.foot = low(t.foot);
} else { } else {
t.head = ''; self.head = this._getDefaultHeader();
if (ed.getParam('fullpage_default_xml_pi')) self.foot = '\n</body>\n</html>';
t.head += '<?xml version="1.0" encoding="' + ed.getParam('fullpage_default_encoding', 'ISO-8859-1') + '" ?>\n';
t.head += ed.getParam('fullpage_default_doctype', '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');
t.head += '\n<html>\n<head>\n';
if (v = ed.getParam('fullpage_default_title'))
t.head += '<title>' + v + '</title>\n';
if (v = ed.getParam('fullpage_default_encoding'))
t.head += '<meta http-equiv="Content-Type" content="text/html; charset=' + v + '" />\n';
if (v = ed.getParam('fullpage_default_font_family'))
st += 'font-family: ' + v + ';';
if (v = ed.getParam('fullpage_default_font_size'))
st += 'font-size: ' + v + ';';
if (v = ed.getParam('fullpage_default_text_color'))
st += 'color: ' + v + ';';
t.head += '</head>\n<body' + (st ? ' style="' + st + '"' : '') + '>\n';
t.foot = '\n</body>\n</html>';
} }
// Parse header and update iframe
headerFragment = self._parseHeader();
each(headerFragment.getAll('style'), function(node) {
if (node.firstChild)
styles += node.firstChild.value;
});
elm = headerFragment.getAll('body')[0];
if (elm) {
dom.setAttribs(self.editor.getBody(), {
style : elm.attr('style') || '',
dir : elm.attr('dir') || '',
vLink : elm.attr('vlink') || '',
link : elm.attr('link') || '',
aLink : elm.attr('alink') || ''
});
}
dom.remove('fullpage_styles');
if (styles) {
dom.add(self.editor.getDoc().getElementsByTagName('head')[0], 'style', {id : 'fullpage_styles'}, styles);
// Needed for IE 6/7
elm = dom.get('fullpage_styles');
if (elm.styleSheet)
elm.styleSheet.cssText = styles;
}
},
_getDefaultHeader : function() {
var header = '', editor = this.editor, value, styles = '';
if (editor.getParam('fullpage_default_xml_pi'))
header += '<?xml version="1.0" encoding="' + editor.getParam('fullpage_default_encoding', 'ISO-8859-1') + '" ?>\n';
header += editor.getParam('fullpage_default_doctype', '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');
header += '\n<html>\n<head>\n';
if (value = editor.getParam('fullpage_default_title'))
header += '<title>' + value + '</title>\n';
if (value = editor.getParam('fullpage_default_encoding'))
header += '<meta http-equiv="Content-Type" content="text/html; charset=' + value + '" />\n';
if (value = editor.getParam('fullpage_default_font_family'))
styles += 'font-family: ' + value + ';';
if (value = editor.getParam('fullpage_default_font_size'))
styles += 'font-size: ' + value + ';';
if (value = editor.getParam('fullpage_default_text_color'))
styles += 'color: ' + value + ';';
header += '</head>\n<body' + (styles ? ' style="' + styles + '"' : '') + '>\n';
return header;
}, },
_getContent : function(ed, o) { _getContent : function(ed, o) {
var t = this; var self = this;
if (!o.source_view || !ed.getParam('fullpage_hide_in_source_view')) { if (!o.source_view || !ed.getParam('fullpage_hide_in_source_view'))
o.content = tinymce.trim(t.head) + '\n' + tinymce.trim(o.content) + '\n' + tinymce.trim(t.foot); o.content = tinymce.trim(self.head) + '\n' + tinymce.trim(o.content) + '\n' + tinymce.trim(self.foot);
}
if (t.css)
t._setStyle(ed, t.css);
}
},
_setStyle : function(ed, css) {
ed.dom.remove('injectedCSS');
var doc = ed.dom.doc, style = doc.createElement('style');
style.type = 'text/css';
style.id = 'injectedCSS';
if (style.styleSheet) // IE
style.styleSheet.cssText = css;
else // other browsers
style.appendChild(doc.createTextNode(css));
doc.getElementsByTagName('head')[0].appendChild(style);
}
}); });
// Register plugin // Register plugin

View File

@ -8,13 +8,12 @@
<script type="text/javascript" src="js/fullpage.js"></script> <script type="text/javascript" src="js/fullpage.js"></script>
<link href="css/fullpage.css" rel="stylesheet" type="text/css" /> <link href="css/fullpage.css" rel="stylesheet" type="text/css" />
</head> </head>
<body id="advlink" style="display: none"> <body id="fullpage" style="display: none">
<form onsubmit="updateAction();return false;" name="fullpage" action="#"> <form onsubmit="FullPageDialog.update();return false;" name="fullpage" action="#">
<div class="tabs"> <div class="tabs">
<ul> <ul>
<li id="meta_tab" class="current"><span><a href="javascript:mcTabs.displayTab('meta_tab','meta_panel');" onmousedown="return false;">{#fullpage_dlg.meta_tab}</a></span></li> <li id="meta_tab" class="current"><span><a href="javascript:mcTabs.displayTab('meta_tab','meta_panel');" onmousedown="return false;">{#fullpage_dlg.meta_tab}</a></span></li>
<li id="appearance_tab"><span><a href="javascript:mcTabs.displayTab('appearance_tab','appearance_panel');" onmousedown="return false;">{#fullpage_dlg.appearance_tab}</a></span></li> <li id="appearance_tab"><span><a href="javascript:mcTabs.displayTab('appearance_tab','appearance_panel');" onmousedown="return false;">{#fullpage_dlg.appearance_tab}</a></span></li>
<li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#fullpage_dlg.advanced_tab}</a></span></li>
</ul> </ul>
</div> </div>
@ -72,9 +71,9 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="nowrap"><label for="doctypes">{#fullpage_dlg.doctypes}</label>&nbsp;</td> <td class="nowrap"><label for="doctype">{#fullpage_dlg.doctypes}</label>&nbsp;</td>
<td> <td>
<select id="doctypes" name="doctypes"> <select id="doctype" name="doctype">
<option value="">{#not_set}</option> <option value="">{#not_set}</option>
</select> </select>
</td> </td>
@ -109,7 +108,7 @@
<tr> <tr>
<td class="column1"><label for="fontface">{#fullpage_dlg.fontface}</label></td> <td class="column1"><label for="fontface">{#fullpage_dlg.fontface}</label></td>
<td> <td>
<select id="fontface" name="fontface" onchange="changedStyleField(this);"> <select id="fontface" name="fontface" onchange="FullPageDialog.changedStyleProp();">
<option value="">{#not_set}</option> <option value="">{#not_set}</option>
</select> </select>
</td> </td>
@ -118,7 +117,7 @@
<tr> <tr>
<td class="column1"><label for="fontsize">{#fullpage_dlg.fontsize}</label></td> <td class="column1"><label for="fontsize">{#fullpage_dlg.fontsize}</label></td>
<td> <td>
<select id="fontsize" name="fontsize" onchange="changedStyleField(this);"> <select id="fontsize" name="fontsize" onchange="FullPageDialog.changedStyleProp();">
<option value="">{#not_set}</option> <option value="">{#not_set}</option>
</select> </select>
</td> </td>
@ -129,7 +128,7 @@
<td> <td>
<table border="0" cellpadding="0" cellspacing="0"> <table border="0" cellpadding="0" cellspacing="0">
<tr> <tr>
<td><input id="textcolor" name="textcolor" type="text" value="" size="9" onchange="updateColor('textcolor_pick','textcolor');changedStyleField(this);" /></td> <td><input id="textcolor" name="textcolor" type="text" value="" size="9" onchange="updateColor('textcolor_pick','textcolor');FullPageDialog.changedStyleProp();" /></td>
<td id="textcolor_pickcontainer">&nbsp;</td> <td id="textcolor_pickcontainer">&nbsp;</td>
</tr> </tr>
</table> </table>
@ -147,7 +146,7 @@
<td> <td>
<table border="0" cellpadding="0" cellspacing="0"> <table border="0" cellpadding="0" cellspacing="0">
<tr> <tr>
<td><input id="bgimage" name="bgimage" type="text" value="" onchange="changedStyleField(this);" /></td> <td><input id="bgimage" name="bgimage" type="text" value="" onchange="FullPageDialog.changedStyleProp();" /></td>
<td id="bgimage_pickcontainer">&nbsp;</td> <td id="bgimage_pickcontainer">&nbsp;</td>
</tr> </tr>
</table> </table>
@ -158,7 +157,7 @@
<td> <td>
<table border="0" cellpadding="0" cellspacing="0"> <table border="0" cellpadding="0" cellspacing="0">
<tr> <tr>
<td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedStyleField(this);" /></td> <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');FullPageDialog.changedStyleProp();" /></td>
<td id="bgcolor_pickcontainer">&nbsp;</td> <td id="bgcolor_pickcontainer">&nbsp;</td>
</tr> </tr>
</table> </table>
@ -173,15 +172,15 @@
<table border="0" cellpadding="4" cellspacing="0"> <table border="0" cellpadding="4" cellspacing="0">
<tr> <tr>
<td class="column1"><label for="leftmargin">{#fullpage_dlg.left_margin}</label></td> <td class="column1"><label for="leftmargin">{#fullpage_dlg.left_margin}</label></td>
<td><input id="leftmargin" name="leftmargin" type="text" value="" onchange="changedStyleField(this);" /></td> <td><input id="leftmargin" name="leftmargin" type="text" value="" onchange="FullPageDialog.changedStyleProp();" /></td>
<td class="column1"><label for="rightmargin">{#fullpage_dlg.right_margin}</label></td> <td class="column1"><label for="rightmargin">{#fullpage_dlg.right_margin}</label></td>
<td><input id="rightmargin" name="rightmargin" type="text" value="" onchange="changedStyleField(this);" /></td> <td><input id="rightmargin" name="rightmargin" type="text" value="" onchange="FullPageDialog.changedStyleProp();" /></td>
</tr> </tr>
<tr> <tr>
<td class="column1"><label for="topmargin">{#fullpage_dlg.top_margin}</label></td> <td class="column1"><label for="topmargin">{#fullpage_dlg.top_margin}</label></td>
<td><input id="topmargin" name="topmargin" type="text" value="" onchange="changedStyleField(this);" /></td> <td><input id="topmargin" name="topmargin" type="text" value="" onchange="FullPageDialog.changedStyleProp();" /></td>
<td class="column1"><label for="bottommargin">{#fullpage_dlg.bottom_margin}</label></td> <td class="column1"><label for="bottommargin">{#fullpage_dlg.bottom_margin}</label></td>
<td><input id="bottommargin" name="bottommargin" type="text" value="" onchange="changedStyleField(this);" /></td> <td><input id="bottommargin" name="bottommargin" type="text" value="" onchange="FullPageDialog.changedStyleProp();" /></td>
</tr> </tr>
</table> </table>
</fieldset> </fieldset>
@ -195,7 +194,7 @@
<td> <td>
<table border="0" cellpadding="0" cellspacing="0"> <table border="0" cellpadding="0" cellspacing="0">
<tr> <tr>
<td><input id="link_color" name="link_color" type="text" value="" size="9" onchange="updateColor('link_color_pick','link_color');changedStyleField(this);" /></td> <td><input id="link_color" name="link_color" type="text" value="" size="9" onchange="updateColor('link_color_pick','link_color');FullPageDialog.changedStyleProp();" /></td>
<td id="link_color_pickcontainer">&nbsp;</td> <td id="link_color_pickcontainer">&nbsp;</td>
</tr> </tr>
</table> </table>
@ -205,7 +204,7 @@
<td> <td>
<table border="0" cellpadding="0" cellspacing="0"> <table border="0" cellpadding="0" cellspacing="0">
<tr> <tr>
<td><input id="visited_color" name="visited_color" type="text" value="" size="9" onchange="updateColor('visited_color_pick','visited_color');changedStyleField(this);" /></td> <td><input id="visited_color" name="visited_color" type="text" value="" size="9" onchange="updateColor('visited_color_pick','visited_color');FullPageDialog.changedStyleProp();" /></td>
<td id="visited_color_pickcontainer">&nbsp;</td> <td id="visited_color_pickcontainer">&nbsp;</td>
</tr> </tr>
</table> </table>
@ -217,7 +216,7 @@
<td> <td>
<table border="0" cellpadding="0" cellspacing="0"> <table border="0" cellpadding="0" cellspacing="0">
<tr> <tr>
<td><input id="active_color" name="active_color" type="text" value="" size="9" onchange="updateColor('active_color_pick','active_color');changedStyleField(this);" /></td> <td><input id="active_color" name="active_color" type="text" value="" size="9" onchange="updateColor('active_color_pick','active_color');FullPageDialog.changedStyleProp();" /></td>
<td id="active_color_pickcontainer">&nbsp;</td> <td id="active_color_pickcontainer">&nbsp;</td>
</tr> </tr>
</table> </table>
@ -225,16 +224,6 @@
<td>&nbsp;</td> <td>&nbsp;</td>
<td>&nbsp;</td> <td>&nbsp;</td>
<!-- <td class="column1"><label for="hover_color">{#fullpage_dlg.hover_color}</label></td>
<td>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td><input id="hover_color" name="hover_color" type="text" value="" size="9" onchange="changedStyleField(this);" /></td>
<td id="hover_color_pickcontainer">&nbsp;</td>
</tr>
</table>
</td> -->
</tr> </tr>
</table> </table>
</fieldset> </fieldset>
@ -254,312 +243,11 @@
</tr> </tr>
<tr> <tr>
<td class="column1"><label for="style">{#fullpage_dlg.style}</label></td> <td class="column1"><label for="style">{#fullpage_dlg.style}</label></td>
<td><input id="style" name="style" type="text" value="" onchange="changedStyleField(this);" /></td> <td><input id="style" name="style" type="text" value="" onchange="FullPageDialog.changedStyle();" /></td>
</tr> </tr>
</table> </table>
</fieldset> </fieldset>
</div> </div>
<div id="advanced_panel" class="panel">
<div id="addmenu">
<table border="0" cellpadding="0" cellspacing="0">
<tr><td><a href="javascript:addHeadElm('title');" onmousedown="return false;"><span>{#fullpage_dlg.add_title}</span></a></td></tr>
<tr><td><a href="javascript:addHeadElm('meta');" onmousedown="return false;"><span>{#fullpage_dlg.add_meta}</span></a></td></tr>
<tr><td><a href="javascript:addHeadElm('script');" onmousedown="return false;"><span>{#fullpage_dlg.add_script}</span></a></td></tr>
<tr><td><a href="javascript:addHeadElm('style');" onmousedown="return false;"><span>{#fullpage_dlg.add_style}</span></a></td></tr>
<tr><td><a href="javascript:addHeadElm('link');" onmousedown="return false;"><span>{#fullpage_dlg.add_link}</span></a></td></tr>
<tr><td><a href="javascript:addHeadElm('base');" onmousedown="return false;"><span>{#fullpage_dlg.add_base}</span></a></td></tr>
<tr><td><a href="javascript:addHeadElm('comment');" onmousedown="return false;"><span>{#fullpage_dlg.add_comment}</span></a></td></tr>
</table>
</div>
<fieldset>
<legend>{#fullpage_dlg.head_elements}</legend>
<div class="headlistwrapper">
<div class="toolbar">
<div style="float: left">
<a id="addbutton" href="javascript:showAddMenu();" onmousedown="return false;" class="addbutton" title="{#fullpage_dlg.add}"></a>
<a href="#" onmousedown="return false;" class="removebutton" title="{#fullpage_dlg.remove}"></a>
</div>
<div style="float: right">
<a href="#" onmousedown="return false;" class="moveupbutton" title="{#fullpage_dlg.moveup}"></a>
<a href="#" onmousedown="return false;" class="movedownbutton" title="{#fullpage_dlg.movedown}"></a>
</div>
<br style="clear: both" />
</div>
<select id="headlist" size="26" onchange="updateHeadElm(this.options[this.selectedIndex].value);">
<option value="title_0">&lt;title&gt;Some title bla bla bla&lt;/title&gt;</option>
<option value="meta_1">&lt;meta name="keywords"&gt;Some bla bla bla&lt;/meta&gt;</option>
<option value="meta_2">&lt;meta name="description"&gt;Some bla bla bla bla bla bla bla bla bla&lt;/meta&gt;</option>
<option value="script_3">&lt;script language=&quot;javascript&quot;&gt;...&lt;/script&gt;</option>
<option value="style_4">&lt;style&gt;...&lt;/style&gt;</option>
<option value="base_5">&lt;base href="." /&gt;</option>
<option value="comment_6">&lt;!-- ... --&gt;</option>
<option value="link_7">&lt;link href="." /&gt;</option>
</select>
</div>
</fieldset>
<fieldset id="meta_element">
<legend>{#fullpage_dlg.meta_element}</legend>
<table border="0" cellpadding="4" cellspacing="0">
<tr>
<td class="column1"><label for="element_meta_type">{#fullpage_dlg.type}</label></td>
<td><select id="element_meta_type">
<option value="name">name</option>
<option value="http-equiv">http-equiv</option>
</select></td>
</tr>
<tr>
<td class="column1"><label for="element_meta_name">{#fullpage_dlg.name}</label></td>
<td><input id="element_meta_name" name="element_meta_name" type="text" value="" /></td>
</tr>
<tr>
<td class="column1"><label for="element_meta_content">{#fullpage_dlg.content}</label></td>
<td><input id="element_meta_content" name="element_meta_content" type="text" value="" /></td>
</tr>
</table>
<input type="button" id="meta_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
</fieldset>
<fieldset id="title_element">
<legend>{#fullpage_dlg.title_element}</legend>
<table border="0" cellpadding="4" cellspacing="0">
<tr>
<td class="column1"><label for="element_title">{#fullpage_dlg.meta_title}</label></td>
<td><input id="element_title" name="element_title" type="text" value="" /></td>
</tr>
</table>
<input type="button" id="title_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
</fieldset>
<fieldset id="script_element">
<legend>{#fullpage_dlg.script_element}</legend>
<div class="tabs">
<ul>
<li id="script_props_tab" class="current"><span><a href="javascript:mcTabs.displayTab('script_props_tab','script_props_panel');" onmousedown="return false;">{#fullpage_dlg.properties}</a></span></li>
<li id="script_value_tab"><span><a href="javascript:mcTabs.displayTab('script_value_tab','script_value_panel');" onmousedown="return false;">{#fullpage_dlg.value}</a></span></li>
</ul>
</div>
<br style="clear: both" />
<div class="panel_wrapper">
<div id="script_props_panel" class="panel current">
<table border="0" cellpadding="4" cellspacing="0">
<tr>
<td class="column1"><label for="element_script_type">{#fullpage_dlg.type}</label></td>
<td><select id="element_script_type">
<option value="text/javascript">text/javascript</option>
<option value="text/jscript">text/jscript</option>
<option value="text/vbscript">text/vbscript</option>
<option value="text/vbs">text/vbs</option>
<option value="text/ecmascript">text/ecmascript</option>
<option value="text/xml">text/xml</option>
</select></td>
</tr>
<tr>
<td class="column1"><label for="element_script_src">{#fullpage_dlg.src}</label></td>
<td><table border="0" cellpadding="0" cellspacing="0">
<tr>
<td><input id="element_script_src" name="element_script_src" type="text" value="" /></td>
<td id="script_src_pickcontainer">&nbsp;</td>
</tr>
</table></td>
</tr>
<tr>
<td class="column1"><label for="element_script_charset">{#fullpage_dlg.charset}</label></td>
<td><select id="element_script_charset"><option value="">{#not_set}</option></select></td>
</tr>
<tr>
<td class="column1"><label for="element_script_defer">{#fullpage_dlg.defer}</label></td>
<td><input type="checkbox" id="element_script_defer" name="element_script_defer" class="checkbox" /></td>
</tr>
</table>
</div>
<div id="script_value_panel" class="panel">
<textarea id="element_script_value"></textarea>
</div>
</div>
<input type="button" id="script_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
</fieldset>
<fieldset id="style_element">
<legend>{#fullpage_dlg.style_element}</legend>
<div class="tabs">
<ul>
<li id="style_props_tab" class="current"><span><a href="javascript:mcTabs.displayTab('style_props_tab','style_props_panel');" onmousedown="return false;">{#fullpage_dlg.properties}</a></span></li>
<li id="style_value_tab"><span><a href="javascript:mcTabs.displayTab('style_value_tab','style_value_panel');" onmousedown="return false;">{#fullpage_dlg.value}</a></span></li>
</ul>
</div>
<br style="clear: both" />
<div class="panel_wrapper">
<div id="style_props_panel" class="panel current">
<table border="0" cellpadding="4" cellspacing="0">
<tr>
<td class="column1"><label for="element_style_type">{#fullpage_dlg.type}</label></td>
<td><select id="element_style_type">
<option value="text/css">text/css</option>
</select></td>
</tr>
<tr>
<td class="column1"><label for="element_style_media">{#fullpage_dlg.media}</label></td>
<td><select id="element_style_media"></select></td>
</tr>
</table>
</div>
<div id="style_value_panel" class="panel">
<textarea id="element_style_value"></textarea>
</div>
</div>
<input type="button" id="style_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
</fieldset>
<fieldset id="base_element">
<legend>{#fullpage_dlg.base_element}</legend>
<table border="0" cellpadding="4" cellspacing="0">
<tr>
<td class="column1"><label for="element_base_href">{#fullpage_dlg.href}</label></td>
<td><input id="element_base_href" name="element_base_href" type="text" value="" /></td>
</tr>
<tr>
<td class="column1"><label for="element_base_target">{#fullpage_dlg.target}</label></td>
<td><input id="element_base_target" name="element_base_target" type="text" value="" /></td>
</tr>
</table>
<input type="button" id="base_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
</fieldset>
<fieldset id="link_element">
<legend>{#fullpage_dlg.link_element}</legend>
<div class="tabs">
<ul>
<li id="link_general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('link_general_tab','link_general_panel');" onmousedown="return false;">{#fullpage_dlg.general_props}</a></span></li>
<li id="link_advanced_tab"><span><a href="javascript:mcTabs.displayTab('link_advanced_tab','link_advanced_panel');" onmousedown="return false;">{#fullpage_dlg.advanced_props}</a></span></li>
</ul>
</div>
<br style="clear: both" />
<div class="panel_wrapper">
<div id="link_general_panel" class="panel current">
<table border="0" cellpadding="4" cellspacing="0">
<tr>
<td class="column1"><label for="element_link_href">{#fullpage_dlg.href}</label></td>
<td><table border="0" cellpadding="0" cellspacing="0">
<tr>
<td><input id="element_link_href" name="element_link_href" type="text" value="" /></td>
<td id="link_href_pickcontainer">&nbsp;</td>
</tr>
</table></td>
</tr>
<tr>
<td class="column1"><label for="element_link_title">{#fullpage_dlg.meta_title}</label></td>
<td><input id="element_link_title" name="element_link_title" type="text" value="" /></td>
</tr>
<tr>
<td class="column1"><label for="element_link_type">{#fullpage_dlg.type}</label></td>
<td><select id="element_link_type" name="element_link_type">
<option value="text/css">text/css</option>
<option value="text/javascript">text/javascript</option>
</select></td>
</tr>
<tr>
<td class="column1"><label for="element_link_media">{#fullpage_dlg.media}</label></td>
<td><select id="element_link_media" name="element_link_media"></select></td>
</tr>
<tr>
<td><label for="element_style_rel">{#fullpage_dlg.rel}</label></td>
<td><select id="element_style_rel" name="element_style_rel">
<option value="">{#not_set}</option>
<option value="stylesheet">Stylesheet</option>
<option value="alternate">Alternate</option>
<option value="designates">Designates</option>
<option value="start">Start</option>
<option value="next">Next</option>
<option value="prev">Prev</option>
<option value="contents">Contents</option>
<option value="index">Index</option>
<option value="glossary">Glossary</option>
<option value="copyright">Copyright</option>
<option value="chapter">Chapter</option>
<option value="subsection">Subsection</option>
<option value="appendix">Appendix</option>
<option value="help">Help</option>
<option value="bookmark">Bookmark</option>
</select>
</td>
</tr>
</table>
</div>
<div id="link_advanced_panel" class="panel">
<table border="0" cellpadding="4" cellspacing="0">
<tr>
<td class="column1"><label for="element_link_charset">{#fullpage_dlg.charset}</label></td>
<td><select id="element_link_charset"><option value="">{#not_set}</option></select></td>
</tr>
<tr>
<td class="column1"><label for="element_link_hreflang">{#fullpage_dlg.hreflang}</label></td>
<td><input id="element_link_hreflang" name="element_link_hreflang" type="text" value="" /></td>
</tr>
<tr>
<td class="column1"><label for="element_link_target">{#fullpage_dlg.target}</label></td>
<td><input id="element_link_target" name="element_link_target" type="text" value="" /></td>
</tr>
<tr>
<td><label for="element_style_rev">{#fullpage_dlg.rev}</label></td>
<td><select id="element_style_rev" name="element_style_rev">
<option value="">{#not_set}</option>
<option value="alternate">Alternate</option>
<option value="designates">Designates</option>
<option value="stylesheet">Stylesheet</option>
<option value="start">Start</option>
<option value="next">Next</option>
<option value="prev">Prev</option>
<option value="contents">Contents</option>
<option value="index">Index</option>
<option value="glossary">Glossary</option>
<option value="copyright">Copyright</option>
<option value="chapter">Chapter</option>
<option value="subsection">Subsection</option>
<option value="appendix">Appendix</option>
<option value="help">Help</option>
<option value="bookmark">Bookmark</option>
</select>
</td>
</tr>
</table>
</div>
</div>
<input type="button" id="link_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
</fieldset>
<fieldset id="comment_element">
<legend>{#fullpage_dlg.comment_element}</legend>
<textarea id="element_comment_value"></textarea>
<input type="button" id="comment_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
</fieldset>
</div>
</div> </div>
<div class="mceActionPanel"> <div class="mceActionPanel">

View File

@ -8,490 +8,225 @@
* Contributing: http://tinymce.moxiecode.com/contributing * Contributing: http://tinymce.moxiecode.com/contributing
*/ */
tinyMCEPopup.requireLangPack(); (function() {
tinyMCEPopup.requireLangPack();
var doc; var defaultDocTypes =
'XHTML 1.0 Transitional=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">,' +
'XHTML 1.0 Frameset=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">,' +
'XHTML 1.0 Strict=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">,' +
'XHTML 1.1=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">,' +
'HTML 4.01 Transitional=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">,' +
'HTML 4.01 Strict=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">,' +
'HTML 4.01 Frameset=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">';
var defaultDocTypes = var defaultEncodings =
'XHTML 1.0 Transitional=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">,' + 'Western european (iso-8859-1)=iso-8859-1,' +
'XHTML 1.0 Frameset=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">,' + 'Central European (iso-8859-2)=iso-8859-2,' +
'XHTML 1.0 Strict=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">,' + 'Unicode (UTF-8)=utf-8,' +
'XHTML 1.1=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">,' + 'Chinese traditional (Big5)=big5,' +
'HTML 4.01 Transitional=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">,' + 'Cyrillic (iso-8859-5)=iso-8859-5,' +
'HTML 4.01 Strict=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">,' + 'Japanese (iso-2022-jp)=iso-2022-jp,' +
'HTML 4.01 Frameset=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">'; 'Greek (iso-8859-7)=iso-8859-7,' +
'Korean (iso-2022-kr)=iso-2022-kr,' +
'ASCII (us-ascii)=us-ascii';
var defaultEncodings = var defaultFontNames = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings';
'Western european (iso-8859-1)=iso-8859-1,' + var defaultFontSizes = '10px,11px,12px,13px,14px,15px,16px';
'Central European (iso-8859-2)=iso-8859-2,' +
'Unicode (UTF-8)=utf-8,' +
'Chinese traditional (Big5)=big5,' +
'Cyrillic (iso-8859-5)=iso-8859-5,' +
'Japanese (iso-2022-jp)=iso-2022-jp,' +
'Greek (iso-8859-7)=iso-8859-7,' +
'Korean (iso-2022-kr)=iso-2022-kr,' +
'ASCII (us-ascii)=us-ascii';
var defaultMediaTypes = function setVal(id, value) {
'all=all,' + var elm = document.getElementById(id);
'screen=screen,' +
'print=print,' +
'tty=tty,' +
'tv=tv,' +
'projection=projection,' +
'handheld=handheld,' +
'braille=braille,' +
'aural=aural';
var defaultFontNames = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings'; if (elm) {
var defaultFontSizes = '10px,11px,12px,13px,14px,15px,16px'; value = value || '';
function init() { if (elm.nodeName == "SELECT")
var f = document.forms['fullpage'], el = f.elements, e, i, p, doctypes, encodings, mediaTypes, dir, fonts, ed = tinyMCEPopup.editor, dom = tinyMCEPopup.dom, style, xmlVer, xmlEnc, docType; selectByValue(document.forms[0], id, value);
else if (elm.type == "checkbox")
// Setup doctype select box elm.checked = !!value;
doctypes = ed.getParam("fullpage_doctypes", defaultDocTypes).split(','); else
for (i=0; i<doctypes.length; i++) { elm.value = value;
p = doctypes[i].split('=');
if (p.length > 1)
addSelectValue(f, 'doctypes', p[0], p[1]);
}
// Setup fonts select box
fonts = ed.getParam("fullpage_fonts", defaultFontNames).split(';');
for (i=0; i<fonts.length; i++) {
p = fonts[i].split('=');
if (p.length > 1)
addSelectValue(f, 'fontface', p[0], p[1]);
}
// Setup fontsize select box
fonts = ed.getParam("fullpage_fontsizes", defaultFontSizes).split(',');
for (i=0; i<fonts.length; i++)
addSelectValue(f, 'fontsize', fonts[i], fonts[i]);
// Setup mediatype select boxs
mediaTypes = ed.getParam("fullpage_media_types", defaultMediaTypes).split(',');
for (i=0; i<mediaTypes.length; i++) {
p = mediaTypes[i].split('=');
if (p.length > 1) {
addSelectValue(f, 'element_style_media', p[0], p[1]);
addSelectValue(f, 'element_link_media', p[0], p[1]);
} }
} };
// Setup encodings select box function getVal(id) {
encodings = ed.getParam("fullpage_encodings", defaultEncodings).split(','); var elm = document.getElementById(id);
for (i=0; i<encodings.length; i++) {
p = encodings[i].split('=');
if (p.length > 1) { if (elm.nodeName == "SELECT")
addSelectValue(f, 'docencoding', p[0], p[1]); return elm.options[elm.selectedIndex].value;
addSelectValue(f, 'element_script_charset', p[0], p[1]);
addSelectValue(f, 'element_link_charset', p[0], p[1]);
}
}
document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); if (elm.type == "checkbox")
document.getElementById('link_color_pickcontainer').innerHTML = getColorPickerHTML('link_color_pick','link_color'); return elm.checked;
//document.getElementById('hover_color_pickcontainer').innerHTML = getColorPickerHTML('hover_color_pick','hover_color');
document.getElementById('visited_color_pickcontainer').innerHTML = getColorPickerHTML('visited_color_pick','visited_color');
document.getElementById('active_color_pickcontainer').innerHTML = getColorPickerHTML('active_color_pick','active_color');
document.getElementById('textcolor_pickcontainer').innerHTML = getColorPickerHTML('textcolor_pick','textcolor');
document.getElementById('stylesheet_browsercontainer').innerHTML = getBrowserHTML('stylesheetbrowser','stylesheet','file','fullpage');
document.getElementById('link_href_pickcontainer').innerHTML = getBrowserHTML('link_href_browser','element_link_href','file','fullpage');
document.getElementById('script_src_pickcontainer').innerHTML = getBrowserHTML('script_src_browser','element_script_src','file','fullpage');
document.getElementById('bgimage_pickcontainer').innerHTML = getBrowserHTML('bgimage_browser','bgimage','image','fullpage');
// Resize some elements return elm.value;
if (isVisible('stylesheetbrowser')) };
document.getElementById('stylesheet').style.width = '220px';
if (isVisible('link_href_browser')) window.FullPageDialog = {
document.getElementById('element_link_href').style.width = '230px'; changedStyle : function() {
var val, styles = tinyMCEPopup.editor.dom.parseStyle(getVal('style'));
if (isVisible('bgimage_browser')) setVal('fontface', styles['font-face']);
document.getElementById('bgimage').style.width = '210px'; setVal('fontsize', styles['font-size']);
setVal('textcolor', styles['color']);
// Add iframe if (val = styles['background-image'])
dom.add(document.body, 'iframe', {id : 'documentIframe', src : 'javascript:""', style : {display : 'none'}}); setVal('bgimage', val.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"));
doc = dom.get('documentIframe').contentWindow.document; else
h = tinyMCEPopup.getWindowArg('head_html'); setVal('bgimage', '');
// Preprocess the HTML disable scripts and urls setVal('bgcolor', styles['background-color']);
h = h.replace(/<script>/gi, '<script type="text/javascript">');
h = h.replace(/type=([\"\'])?/gi, 'type=$1-mce-');
h = h.replace(/(src=|href=)/g, 'data-mce-$1');
// Write in the content in the iframe // Reset margin form elements
doc.write(h + '</body></html>'); setVal('topmargin', '');
doc.close(); setVal('rightmargin', '');
setVal('bottommargin', '');
setVal('leftmargin', '');
// Parse xml and doctype // Expand margin
xmlVer = getReItem(/<\?\s*?xml.*?version\s*?=\s*?"(.*?)".*?\?>/gi, h, 1); if (val = styles['margin']) {
xmlEnc = getReItem(/<\?\s*?xml.*?encoding\s*?=\s*?"(.*?)".*?\?>/gi, h, 1); val = val.split(' ');
docType = getReItem(/<\!DOCTYPE.*?>/gi, h.replace(/\n/g, ''), 0).replace(/ +/g, ' '); styles['margin-top'] = val[0] || '';
f.langcode.value = getReItem(/lang="(.*?)"/gi, h, 1); styles['margin-right'] = val[1] || val[0] || '';
styles['margin-bottom'] = val[2] || val[0] || '';
styles['margin-left'] = val[3] || val[0] || '';
}
if (val = styles['margin-top'])
setVal('topmargin', val.replace(/px/, ''));
if (val = styles['margin-right'])
setVal('rightmargin', val.replace(/px/, ''));
if (val = styles['margin-bottom'])
setVal('bottommargin', val.replace(/px/, ''));
if (val = styles['margin-left'])
setVal('leftmargin', val.replace(/px/, ''));
updateColor('bgcolor_pick', 'bgcolor');
updateColor('textcolor_pick', 'textcolor');
},
changedStyleProp : function() {
var val, dom = tinyMCEPopup.editor.dom, styles = dom.parseStyle(getVal('style'));
// Get direction and inherit it from the html-tag too (according to w3c recommandation) styles['font-face'] = getVal('fontface');
dir = getReItem(/dir\s*=\s*["']([^"']*)["']/i, h, 1); styles['font-size'] = getVal('fontsize');
if(doc.body.hasAttribute('dir') && (doc.body.getAttribute('dir') != '')) styles['color'] = getVal('textcolor');
dir = doc.body.getAttribute('dir'); styles['background-color'] = getVal('bgcolor');
// Parse title if (val = getVal('bgimage'))
if (e = doc.getElementsByTagName('title')[0]) styles['background-image'] = "url('" + val + "')";
el.metatitle.value = e.textContent || e.text;
// Parse meta
tinymce.each(doc.getElementsByTagName('meta'), function(n) {
var na = (n.getAttribute('name', 2) || '').toLowerCase(), va = n.getAttribute('content', 2), eq = n.getAttribute('http-equiv', 2) || '';
e = el['meta' + na];
if (na == 'robots') {
selectByValue(f, 'metarobots', tinymce.trim(va), true, true);
return;
}
switch (eq.toLowerCase()) {
case "content-type":
tmp = getReItem(/charset\s*=\s*(.*)\s*/gi, va, 1);
// Override XML encoding
if (tmp != "")
xmlEnc = tmp;
return;
}
if (e)
e.value = va;
});
selectByValue(f, 'doctypes', docType, true, true);
selectByValue(f, 'docencoding', xmlEnc, true, true);
selectByValue(f, 'langdir', dir, true, true);
if (xmlVer != '')
el.xml_pi.checked = true;
// Parse appearance
// Parse primary stylesheet
tinymce.each(doc.getElementsByTagName("link"), function(l) {
var m = l.getAttribute('media', 2) || '', t = l.getAttribute('type', 2) || '';
if (t == "-mce-text/css" && (m == "" || m == "screen" || m == "all") && (l.getAttribute('rel', 2) || '') == "stylesheet") {
f.stylesheet.value = l.getAttribute('data-mce-href', 2) || '';
return false;
}
});
// Get from style elements
tinymce.each(doc.getElementsByTagName("style"), function(st) {
var tmp = parseStyleElement(st);
for (x=0; x<tmp.length; x++) {
if (tmp[x].rule.indexOf('a:visited') != -1 && tmp[x].data['color'])
f.visited_color.value = tmp[x].data['color'];
if (tmp[x].rule.indexOf('a:link') != -1 && tmp[x].data['color'])
f.link_color.value = tmp[x].data['color'];
if (tmp[x].rule.indexOf('a:active') != -1 && tmp[x].data['color'])
f.active_color.value = tmp[x].data['color'];
}
});
f.textcolor.value = tinyMCEPopup.dom.getAttrib(doc.body, "text");
f.active_color.value = tinyMCEPopup.dom.getAttrib(doc.body, "alink");
f.link_color.value = tinyMCEPopup.dom.getAttrib(doc.body, "link");
f.visited_color.value = tinyMCEPopup.dom.getAttrib(doc.body, "vlink");
f.bgcolor.value = tinyMCEPopup.dom.getAttrib(doc.body, "bgcolor");
f.bgimage.value = tinyMCEPopup.dom.getAttrib(doc.body, "background");
// Get from style info
style = tinyMCEPopup.dom.parseStyle(tinyMCEPopup.dom.getAttrib(doc.body, 'style'));
if (style['font-family'])
selectByValue(f, 'fontface', style['font-family'], true, true);
else
selectByValue(f, 'fontface', ed.getParam("fullpage_default_fontface", ""), true, true);
if (style['font-size'])
selectByValue(f, 'fontsize', style['font-size'], true, true);
else
selectByValue(f, 'fontsize', ed.getParam("fullpage_default_fontsize", ""), true, true);
if (style['color'])
f.textcolor.value = convertRGBToHex(style['color']);
if (style['background-image'])
f.bgimage.value = style['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
if (style['background-color'])
f.bgcolor.value = style['background-color'];
if (style['margin']) {
tmp = style['margin'].replace(/[^0-9 ]/g, '');
tmp = tmp.split(/ +/);
f.topmargin.value = tmp.length > 0 ? tmp[0] : '';
f.rightmargin.value = tmp.length > 1 ? tmp[1] : tmp[0];
f.bottommargin.value = tmp.length > 2 ? tmp[2] : tmp[0];
f.leftmargin.value = tmp.length > 3 ? tmp[3] : tmp[0];
}
if (style['margin-left'])
f.leftmargin.value = style['margin-left'].replace(/[^0-9]/g, '');
if (style['margin-right'])
f.rightmargin.value = style['margin-right'].replace(/[^0-9]/g, '');
if (style['margin-top'])
f.topmargin.value = style['margin-top'].replace(/[^0-9]/g, '');
if (style['margin-bottom'])
f.bottommargin.value = style['margin-bottom'].replace(/[^0-9]/g, '');
f.style.value = tinyMCEPopup.dom.serializeStyle(style);
// Update colors
updateColor('textcolor_pick', 'textcolor');
updateColor('bgcolor_pick', 'bgcolor');
updateColor('visited_color_pick', 'visited_color');
updateColor('active_color_pick', 'active_color');
updateColor('link_color_pick', 'link_color');
}
function getReItem(r, s, i) {
var c = r.exec(s);
if (c && c.length > i)
return c[i];
return '';
}
function updateAction() {
var f = document.forms[0], nl, i, h, v, s, head, html, l, tmp, addlink = true, ser;
head = doc.getElementsByTagName('head')[0];
// Fix scripts without a type
nl = doc.getElementsByTagName('script');
for (i=0; i<nl.length; i++) {
if (tinyMCEPopup.dom.getAttrib(nl[i], 'data-mce-type') == '')
nl[i].setAttribute('mce-type', 'text/javascript');
}
// Get primary stylesheet
nl = doc.getElementsByTagName("link");
for (i=0; i<nl.length; i++) {
l = nl[i];
tmp = tinyMCEPopup.dom.getAttrib(l, 'media');
if (tinyMCEPopup.dom.getAttrib(l, 'data-mce-type') == "text/css" && (tmp == "" || tmp == "screen" || tmp == "all") && tinyMCEPopup.dom.getAttrib(l, 'rel') == "stylesheet") {
addlink = false;
if (f.stylesheet.value == '')
l.parentNode.removeChild(l);
else else
l.setAttribute('data-mce-href', f.stylesheet.value); styles['background-image'] = '';
break; delete styles['margin'];
}
}
// Add new link if (val = getVal('topmargin'))
if (f.stylesheet.value != '') { styles['margin-top'] = val + "px";
l = doc.createElement('link');
l.setAttribute('type', 'text/css');
l.setAttribute('data-mce-href', f.stylesheet.value);
l.setAttribute('rel', 'stylesheet');
head.appendChild(l);
}
setMeta(head, 'keywords', f.metakeywords.value);
setMeta(head, 'description', f.metadescription.value);
setMeta(head, 'author', f.metaauthor.value);
setMeta(head, 'copyright', f.metacopyright.value);
setMeta(head, 'robots', getSelectValue(f, 'metarobots'));
setMeta(head, 'Content-Type', getSelectValue(f, 'docencoding'));
setAttr(doc.body, 'dir', getSelectValue(f, 'langdir'));
doc.body.style.cssText = f.style.value;
function setAttr(elm, name, value) {
value = "" + value;
if (value.length > 0)
elm.setAttribute(name, value);
else
elm.removeAttribute(name, value);
}
setAttr(doc.body, 'vLink', f.visited_color.value);
setAttr(doc.body, 'link', f.link_color.value);
setAttr(doc.body, 'aLink', f.active_color.value);
doc.body.style.fontFamily = getSelectValue(f, 'fontface');
doc.body.style.fontSize = getSelectValue(f, 'fontsize');
doc.body.style.backgroundColor = f.bgcolor.value;
// Bug #4216: Using deprecated text attribute does not work in all browsers
doc.body.style.color = f.textcolor.value;
setAttr(doc.body, 'text', '');
if (f.leftmargin.value != '')
doc.body.style.marginLeft = f.leftmargin.value + 'px';
if (f.rightmargin.value != '')
doc.body.style.marginRight = f.rightmargin.value + 'px';
if (f.bottommargin.value != '')
doc.body.style.marginBottom = f.bottommargin.value + 'px';
if (f.topmargin.value != '')
doc.body.style.marginTop = f.topmargin.value + 'px';
html = doc.getElementsByTagName('html')[0];
setAttr(html, 'lang', f.langcode.value);
setAttr(html, 'xml:lang', f.langcode.value);
if (f.bgimage.value != '')
doc.body.style.backgroundImage = "url('" + f.bgimage.value + "')";
else
doc.body.style.backgroundImage = '';
ser = tinyMCEPopup.editor.plugins.fullpage._createSerializer();
ser.setRules('-title,meta[http-equiv|name|content],base[href|target],link[href|rel|type|title|media],style[type],script[type|language|src],html[lang|xml::lang|xmlns],body[style|dir|vlink|link|text|alink],head');
h = ser.serialize(doc.documentElement);
h = h.substring(0, h.lastIndexOf('</body>'));
if (h.indexOf('<title>') == -1 && f.metatitle.value)
h = h.replace(/<head.*?>/, '$&\n' + '<title>' + tinyMCEPopup.dom.encode(f.metatitle.value) + '</title>');
else if (f.metatitle.value)
h = h.replace(/<title>(.*?)<\/title>/, '<title>' + tinyMCEPopup.dom.encode(f.metatitle.value) + '</title>');
else
h = h.replace(/<title>(.*?)<\/title>\n*/, '');
if(v = f.langcode.value)
htmlt = '<html lang="' + v + '" xml:lang="' + v + '">';
else
htmlt = '<html>';
h = h.replace(/<html.*?>/, htmlt);
if ((v = getSelectValue(f, 'doctypes')) != '')
h = v + '\n' + h;
if (f.xml_pi.checked) {
s = '<?xml version="1.0"';
if ((v = getSelectValue(f, 'docencoding')) != '')
s += ' encoding="' + v + '"';
s += '?>\n';
h = s + h;
}
h = h.replace(/type=\"\-mce\-/gi, 'type="');
tinyMCEPopup.editor.plugins.fullpage.head = h;
tinyMCEPopup.editor.plugins.fullpage._setBodyAttribs(tinyMCEPopup.editor, {});
tinyMCEPopup.close();
}
function changedStyleField(field) {
}
function setMeta(he, k, v) {
var nl, i, m;
nl = he.getElementsByTagName('meta');
for (i=0; i<nl.length; i++) {
if (k == 'Content-Type' && tinyMCEPopup.dom.getAttrib(nl[i], 'http-equiv') == k) {
if (v == '')
nl[i].parentNode.removeChild(nl[i]);
else else
nl[i].setAttribute('content', "text/html; charset=" + v); styles['margin-top'] = '';
return; if (val = getVal('rightmargin'))
} styles['margin-right'] = val + "px";
if (tinyMCEPopup.dom.getAttrib(nl[i], 'name') == k) {
if (v == '')
nl[i].parentNode.removeChild(nl[i]);
else else
nl[i].setAttribute('content', v); styles['margin-right'] = '';
return;
if (val = getVal('bottommargin'))
styles['margin-bottom'] = val + "px";
else
styles['margin-bottom'] = '';
if (val = getVal('leftmargin'))
styles['margin-left'] = val + "px";
else
styles['margin-left'] = '';
// Serialize, parse and reserialize this will compress redundant styles
setVal('style', dom.serializeStyle(dom.parseStyle(dom.serializeStyle(styles))));
this.changedStyle();
},
update : function() {
var data = {};
tinymce.each(tinyMCEPopup.dom.select('select,input,textarea'), function(node) {
data[node.id] = getVal(node.id);
});
tinyMCEPopup.editor.plugins.fullpage._dataToHtml(data);
tinyMCEPopup.close();
} }
} };
function init() {
var form = document.forms[0], i, item, list, editor = tinyMCEPopup.editor;
if (v == '') // Setup doctype select box
return; list = editor.getParam("fullpage_doctypes", defaultDocTypes).split(',');
for (i = 0; i < list.length; i++) {
item = list[i].split('=');
m = doc.createElement('meta'); if (item.length > 1)
addSelectValue(form, 'doctype', item[0], item[1]);
}
if (k == 'Content-Type') // Setup fonts select box
m.httpEquiv = k; list = editor.getParam("fullpage_fonts", defaultFontNames).split(';');
else for (i = 0; i < list.length; i++) {
m.setAttribute('name', k); item = list[i].split('=');
m.setAttribute('content', v); if (item.length > 1)
he.appendChild(m); addSelectValue(form, 'fontface', item[0], item[1]);
} }
function parseStyleElement(e) { // Setup fontsize select box
var v = e.innerHTML; list = editor.getParam("fullpage_fontsizes", defaultFontSizes).split(',');
var p, i, r; for (i = 0; i < list.length; i++)
addSelectValue(form, 'fontsize', list[i], list[i]);
v = v.replace(/<!--/gi, ''); // Setup encodings select box
v = v.replace(/-->/gi, ''); list = editor.getParam("fullpage_encodings", defaultEncodings).split(',');
v = v.replace(/[\n\r]/gi, ''); for (i = 0; i < list.length; i++) {
v = v.replace(/\s+/gi, ' '); item = list[i].split('=');
r = []; if (item.length > 1)
p = v.split(/{|}/); addSelectValue(form, 'docencoding', item[0], item[1]);
}
for (i=0; i<p.length; i+=2) { // Setup color pickers
if (p[i] != "") document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
r[r.length] = {rule : tinymce.trim(p[i]), data : tinyMCEPopup.dom.parseStyle(p[i+1])}; document.getElementById('link_color_pickcontainer').innerHTML = getColorPickerHTML('link_color_pick','link_color');
} document.getElementById('visited_color_pickcontainer').innerHTML = getColorPickerHTML('visited_color_pick','visited_color');
document.getElementById('active_color_pickcontainer').innerHTML = getColorPickerHTML('active_color_pick','active_color');
document.getElementById('textcolor_pickcontainer').innerHTML = getColorPickerHTML('textcolor_pick','textcolor');
document.getElementById('stylesheet_browsercontainer').innerHTML = getBrowserHTML('stylesheetbrowser','stylesheet','file','fullpage');
document.getElementById('bgimage_pickcontainer').innerHTML = getBrowserHTML('bgimage_browser','bgimage','image','fullpage');
return r; // Resize some elements
} if (isVisible('stylesheetbrowser'))
document.getElementById('stylesheet').style.width = '220px';
function serializeStyleElement(d) { if (isVisible('link_href_browser'))
var i, s, st; document.getElementById('element_link_href').style.width = '230px';
s = '<!--\n'; if (isVisible('bgimage_browser'))
document.getElementById('bgimage').style.width = '210px';
for (i=0; i<d.length; i++) { // Update form
s += d[i].rule + ' {\n'; tinymce.each(tinyMCEPopup.getWindowArg('data'), function(value, key) {
setVal(key, value);
});
st = tinyMCE.serializeStyle(d[i].data); FullPageDialog.changedStyle();
if (st != '') // Update colors
st += ';'; updateColor('textcolor_pick', 'textcolor');
updateColor('bgcolor_pick', 'bgcolor');
updateColor('visited_color_pick', 'visited_color');
updateColor('active_color_pick', 'active_color');
updateColor('link_color_pick', 'link_color');
};
s += st.replace(/;/g, ';\n'); tinyMCEPopup.onInit.add(init);
s += '}\n'; })();
if (i != d.length - 1)
s += '\n';
}
s += '\n-->';
return s;
}
tinyMCEPopup.onInit.add(init);

View File

@ -1,85 +1 @@
tinyMCE.addI18n('en.fullpage_dlg',{ tinyMCE.addI18n('en.fullpage_dlg',{title:"Document Properties","meta_tab":"General","appearance_tab":"Appearance","advanced_tab":"Advanced","meta_props":"Meta Information",langprops:"Language and Encoding","meta_title":"Title","meta_keywords":"Keywords","meta_description":"Description","meta_robots":"Robots",doctypes:"Doctype",langcode:"Language Code",langdir:"Language Direction",ltr:"Left to Right",rtl:"Right to Left","xml_pi":"XML Declaration",encoding:"Character Encoding","appearance_bgprops":"Background Properties","appearance_marginprops":"Body Margins","appearance_linkprops":"Link Colors","appearance_textprops":"Text Properties",bgcolor:"Background Color",bgimage:"Background Image","left_margin":"Left Margin","right_margin":"Right Margin","top_margin":"Top Margin","bottom_margin":"Bottom Margin","text_color":"Text Color","font_size":"Font Size","font_face":"Font Face","link_color":"Link Color","hover_color":"Hover Color","visited_color":"Visited Color","active_color":"Active Color",textcolor:"Color",fontsize:"Font Size",fontface:"Font Family","meta_index_follow":"Index and Follow the Links","meta_index_nofollow":"Index and Don\'t Follow the Links","meta_noindex_follow":"Do Not Index but Follow the Links","meta_noindex_nofollow":"Do Not Index and Don\'t Follow the Links","appearance_style":"Stylesheet and Style Properties",stylesheet:"Stylesheet",style:"Style",author:"Author",copyright:"Copyright",add:"Add New Element",remove:"Remove Selected Element",moveup:"Move Selected Element Up",movedown:"Move Selected Element Down","head_elements":"Head Elements",info:"Information","add_title":"Title Element","add_meta":"Meta Element","add_script":"Script Element","add_style":"Style Element","add_link":"Link Element","add_base":"Base Element","add_comment":"Comment Node","title_element":"Title Element","script_element":"Script Element","style_element":"Style Element","base_element":"Base Element","link_element":"Link Element","meta_element":"Meta Element","comment_element":"Comment",src:"Source",language:"Language",href:"HREF",target:"Target",type:"Type",charset:"Charset",defer:"Defer",media:"Media",properties:"Properties",name:"Name",value:"Value",content:"Content",rel:"Rel",rev:"Rev",hreflang:"HREF Lang","general_props":"General","advanced_props":"Advanced"});
title:"Document properties",
meta_tab:"General",
appearance_tab:"Appearance",
advanced_tab:"Advanced",
meta_props:"Meta information",
langprops:"Language and encoding",
meta_title:"Title",
meta_keywords:"Keywords",
meta_description:"Description",
meta_robots:"Robots",
doctypes:"Doctype",
langcode:"Language code",
langdir:"Language direction",
ltr:"Left to right",
rtl:"Right to left",
xml_pi:"XML declaration",
encoding:"Character encoding",
appearance_bgprops:"Background properties",
appearance_marginprops:"Body margins",
appearance_linkprops:"Link colors",
appearance_textprops:"Text properties",
bgcolor:"Background color",
bgimage:"Background image",
left_margin:"Left margin",
right_margin:"Right margin",
top_margin:"Top margin",
bottom_margin:"Bottom margin",
text_color:"Text color",
font_size:"Font size",
font_face:"Font face",
link_color:"Link color",
hover_color:"Hover color",
visited_color:"Visited color",
active_color:"Active color",
textcolor:"Color",
fontsize:"Font size",
fontface:"Font family",
meta_index_follow:"Index and follow the links",
meta_index_nofollow:"Index and don't follow the links",
meta_noindex_follow:"Do not index but follow the links",
meta_noindex_nofollow:"Do not index and don\'t follow the links",
appearance_style:"Stylesheet and style properties",
stylesheet:"Stylesheet",
style:"Style",
author:"Author",
copyright:"Copyright",
add:"Add new element",
remove:"Remove selected element",
moveup:"Move selected element up",
movedown:"Move selected element down",
head_elements:"Head elements",
info:"Information",
add_title:"Title element",
add_meta:"Meta element",
add_script:"Script element",
add_style:"Style element",
add_link:"Link element",
add_base:"Base element",
add_comment:"Comment node",
title_element:"Title element",
script_element:"Script element",
style_element:"Style element",
base_element:"Base element",
link_element:"Link element",
meta_element:"Meta element",
comment_element:"Comment",
src:"Src",
language:"Language",
href:"Href",
target:"Target",
type:"Type",
charset:"Charset",
defer:"Defer",
media:"Media",
properties:"Properties",
name:"Name",
value:"Value",
content:"Content",
rel:"Rel",
rev:"Rev",
hreflang:"Href lang",
general_props:"General",
advanced_props:"Advanced"
});

View File

@ -1 +1 @@
(function(){var a=tinymce.DOM;tinymce.create("tinymce.plugins.FullScreenPlugin",{init:function(d,e){var f=this,g={},c,b;f.editor=d;d.addCommand("mceFullScreen",function(){var i,j=a.doc.documentElement;if(d.getParam("fullscreen_is_enabled")){if(d.getParam("fullscreen_new_window")){closeFullscreen()}else{a.win.setTimeout(function(){tinymce.dom.Event.remove(a.win,"resize",f.resizeFunc);tinyMCE.get(d.getParam("fullscreen_editor_id")).setContent(d.getContent({format:"raw"}),{format:"raw"});tinyMCE.remove(d);a.remove("mce_fullscreen_container");j.style.overflow=d.getParam("fullscreen_html_overflow");a.setStyle(a.doc.body,"overflow",d.getParam("fullscreen_overflow"));a.win.scrollTo(d.getParam("fullscreen_scrollx"),d.getParam("fullscreen_scrolly"));tinyMCE.settings=tinyMCE.oldSettings},10)}return}if(d.getParam("fullscreen_new_window")){i=a.win.open(e+"/fullscreen.htm","mceFullScreenPopup","fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width="+screen.availWidth+",height="+screen.availHeight);try{i.resizeTo(screen.availWidth,screen.availHeight)}catch(h){}}else{tinyMCE.oldSettings=tinyMCE.settings;g.fullscreen_overflow=a.getStyle(a.doc.body,"overflow",1)||"auto";g.fullscreen_html_overflow=a.getStyle(j,"overflow",1);c=a.getViewPort();g.fullscreen_scrollx=c.x;g.fullscreen_scrolly=c.y;if(tinymce.isOpera&&g.fullscreen_overflow=="visible"){g.fullscreen_overflow="auto"}if(tinymce.isIE&&g.fullscreen_overflow=="scroll"){g.fullscreen_overflow="auto"}if(tinymce.isIE&&(g.fullscreen_html_overflow=="visible"||g.fullscreen_html_overflow=="scroll")){g.fullscreen_html_overflow="auto"}if(g.fullscreen_overflow=="0px"){g.fullscreen_overflow=""}a.setStyle(a.doc.body,"overflow","hidden");j.style.overflow="hidden";c=a.getViewPort();a.win.scrollTo(0,0);if(tinymce.isIE){c.h-=1}if(tinymce.isIE6){b="absolute;top:"+c.y}else{b="fixed;top:0"}n=a.add(a.doc.body,"div",{id:"mce_fullscreen_container",style:"position:"+b+";left:0;width:"+c.w+"px;height:"+c.h+"px;z-index:200000;"});a.add(n,"div",{id:"mce_fullscreen"});tinymce.each(d.settings,function(k,l){g[l]=k});g.id="mce_fullscreen";g.width=n.clientWidth;g.height=n.clientHeight-15;g.fullscreen_is_enabled=true;g.fullscreen_editor_id=d.id;g.theme_advanced_resizing=false;g.save_onsavecallback=function(){d.setContent(tinyMCE.get(g.id).getContent({format:"raw"}),{format:"raw"});d.execCommand("mceSave")};tinymce.each(d.getParam("fullscreen_settings"),function(m,l){g[l]=m});if(g.theme_advanced_toolbar_location==="external"){g.theme_advanced_toolbar_location="top"}f.fullscreenEditor=new tinymce.Editor("mce_fullscreen",g);f.fullscreenEditor.onInit.add(function(){f.fullscreenEditor.setContent(d.getContent());f.fullscreenEditor.focus()});f.fullscreenEditor.render();f.fullscreenElement=new tinymce.dom.Element("mce_fullscreen_container");f.fullscreenElement.update();f.resizeFunc=tinymce.dom.Event.add(a.win,"resize",function(){var o=tinymce.DOM.getViewPort(),l=f.fullscreenEditor,k,m;k=l.dom.getSize(l.getContainer().firstChild);m=l.dom.getSize(l.getContainer().getElementsByTagName("iframe")[0]);l.theme.resizeTo(o.w-k.w+m.w,o.h-k.h+m.h)})}});d.addButton("fullscreen",{title:"fullscreen.desc",cmd:"mceFullScreen"});d.onNodeChange.add(function(i,h){h.setActive("fullscreen",i.getParam("fullscreen_is_enabled"))})},getInfo:function(){return{longname:"Fullscreen",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("fullscreen",tinymce.plugins.FullScreenPlugin)})(); (function(){var a=tinymce.DOM;tinymce.create("tinymce.plugins.FullScreenPlugin",{init:function(d,e){var f=this,g={},c,b;f.editor=d;d.addCommand("mceFullScreen",function(){var i,j=a.doc.documentElement;if(d.getParam("fullscreen_is_enabled")){if(d.getParam("fullscreen_new_window")){closeFullscreen()}else{a.win.setTimeout(function(){tinymce.dom.Event.remove(a.win,"resize",f.resizeFunc);tinyMCE.get(d.getParam("fullscreen_editor_id")).setContent(d.getContent());tinyMCE.remove(d);a.remove("mce_fullscreen_container");j.style.overflow=d.getParam("fullscreen_html_overflow");a.setStyle(a.doc.body,"overflow",d.getParam("fullscreen_overflow"));a.win.scrollTo(d.getParam("fullscreen_scrollx"),d.getParam("fullscreen_scrolly"));tinyMCE.settings=tinyMCE.oldSettings},10)}return}if(d.getParam("fullscreen_new_window")){i=a.win.open(e+"/fullscreen.htm","mceFullScreenPopup","fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width="+screen.availWidth+",height="+screen.availHeight);try{i.resizeTo(screen.availWidth,screen.availHeight)}catch(h){}}else{tinyMCE.oldSettings=tinyMCE.settings;g.fullscreen_overflow=a.getStyle(a.doc.body,"overflow",1)||"auto";g.fullscreen_html_overflow=a.getStyle(j,"overflow",1);c=a.getViewPort();g.fullscreen_scrollx=c.x;g.fullscreen_scrolly=c.y;if(tinymce.isOpera&&g.fullscreen_overflow=="visible"){g.fullscreen_overflow="auto"}if(tinymce.isIE&&g.fullscreen_overflow=="scroll"){g.fullscreen_overflow="auto"}if(tinymce.isIE&&(g.fullscreen_html_overflow=="visible"||g.fullscreen_html_overflow=="scroll")){g.fullscreen_html_overflow="auto"}if(g.fullscreen_overflow=="0px"){g.fullscreen_overflow=""}a.setStyle(a.doc.body,"overflow","hidden");j.style.overflow="hidden";c=a.getViewPort();a.win.scrollTo(0,0);if(tinymce.isIE){c.h-=1}if(tinymce.isIE6){b="absolute;top:"+c.y}else{b="fixed;top:0"}n=a.add(a.doc.body,"div",{id:"mce_fullscreen_container",style:"position:"+b+";left:0;width:"+c.w+"px;height:"+c.h+"px;z-index:200000;"});a.add(n,"div",{id:"mce_fullscreen"});tinymce.each(d.settings,function(k,l){g[l]=k});g.id="mce_fullscreen";g.width=n.clientWidth;g.height=n.clientHeight-15;g.fullscreen_is_enabled=true;g.fullscreen_editor_id=d.id;g.theme_advanced_resizing=false;g.save_onsavecallback=function(){d.setContent(tinyMCE.get(g.id).getContent());d.execCommand("mceSave")};tinymce.each(d.getParam("fullscreen_settings"),function(m,l){g[l]=m});if(g.theme_advanced_toolbar_location==="external"){g.theme_advanced_toolbar_location="top"}f.fullscreenEditor=new tinymce.Editor("mce_fullscreen",g);f.fullscreenEditor.onInit.add(function(){f.fullscreenEditor.setContent(d.getContent());f.fullscreenEditor.focus()});f.fullscreenEditor.render();f.fullscreenElement=new tinymce.dom.Element("mce_fullscreen_container");f.fullscreenElement.update();f.resizeFunc=tinymce.dom.Event.add(a.win,"resize",function(){var o=tinymce.DOM.getViewPort(),l=f.fullscreenEditor,k,m;k=l.dom.getSize(l.getContainer().firstChild);m=l.dom.getSize(l.getContainer().getElementsByTagName("iframe")[0]);l.theme.resizeTo(o.w-k.w+m.w,o.h-k.h+m.h)})}});d.addButton("fullscreen",{title:"fullscreen.desc",cmd:"mceFullScreen"});d.onNodeChange.add(function(i,h){h.setActive("fullscreen",i.getParam("fullscreen_is_enabled"))})},getInfo:function(){return{longname:"Fullscreen",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("fullscreen",tinymce.plugins.FullScreenPlugin)})();

View File

@ -27,7 +27,7 @@
else { else {
DOM.win.setTimeout(function() { DOM.win.setTimeout(function() {
tinymce.dom.Event.remove(DOM.win, 'resize', t.resizeFunc); tinymce.dom.Event.remove(DOM.win, 'resize', t.resizeFunc);
tinyMCE.get(ed.getParam('fullscreen_editor_id')).setContent(ed.getContent({format : 'raw'}), {format : 'raw'}); tinyMCE.get(ed.getParam('fullscreen_editor_id')).setContent(ed.getContent());
tinyMCE.remove(ed); tinyMCE.remove(ed);
DOM.remove('mce_fullscreen_container'); DOM.remove('mce_fullscreen_container');
de.style.overflow = ed.getParam('fullscreen_html_overflow'); de.style.overflow = ed.getParam('fullscreen_html_overflow');
@ -100,7 +100,7 @@
s.fullscreen_editor_id = ed.id; s.fullscreen_editor_id = ed.id;
s.theme_advanced_resizing = false; s.theme_advanced_resizing = false;
s.save_onsavecallback = function() { s.save_onsavecallback = function() {
ed.setContent(tinyMCE.get(s.id).getContent({format : 'raw'}), {format : 'raw'}); ed.setContent(tinyMCE.get(s.id).getContent());
ed.execCommand('mceSave'); ed.execCommand('mceSave');
}; };

View File

@ -1,7 +1,8 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<title></title> <title></title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<script type="text/javascript" src="../../tiny_mce.js"></script> <script type="text/javascript" src="../../tiny_mce.js"></script>
<script type="text/javascript"> <script type="text/javascript">
function patchCallback(settings, key) { function patchCallback(settings, key) {

File diff suppressed because one or more lines are too long

View File

@ -219,7 +219,10 @@
t.focus(id); t.focus(id);
if (n.nodeName == 'A' || n.nodeName == 'a') { if (n.nodeName == 'A' || n.nodeName == 'a') {
if (n.className == 'mceMax') { if (n.className == 'mceClose') {
t.close(null, id);
return Event.cancel(e);
} else if (n.className == 'mceMax') {
w.oldPos = w.element.getXY(); w.oldPos = w.element.getXY();
w.oldSize = w.element.getSize(); w.oldSize = w.element.getSize();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 818 B

After

Width:  |  Height:  |  Size: 810 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 280 B

After

Width:  |  Height:  |  Size: 272 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 915 B

After

Width:  |  Height:  |  Size: 907 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 911 B

After

Width:  |  Height:  |  Size: 909 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 B

After

Width:  |  Height:  |  Size: 84 B

View File

@ -1 +1 @@
(function(){tinymce.create("tinymce.plugins.Layer",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceInsertLayer",c._insertLayer,c);a.addCommand("mceMoveForward",function(){c._move(1)});a.addCommand("mceMoveBackward",function(){c._move(-1)});a.addCommand("mceMakeAbsolute",function(){c._toggleAbsolute()});a.addButton("moveforward",{title:"layer.forward_desc",cmd:"mceMoveForward"});a.addButton("movebackward",{title:"layer.backward_desc",cmd:"mceMoveBackward"});a.addButton("absolute",{title:"layer.absolute_desc",cmd:"mceMakeAbsolute"});a.addButton("insertlayer",{title:"layer.insertlayer_desc",cmd:"mceInsertLayer"});a.onInit.add(function(){if(tinymce.isIE){a.getDoc().execCommand("2D-Position",false,true)}});a.onNodeChange.add(c._nodeChange,c);a.onVisualAid.add(c._visualAid,c)},getInfo:function(){return{longname:"Layer",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/layer",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_nodeChange:function(b,a,e){var c,d;c=this._getParentLayer(e);d=b.dom.getParent(e,"DIV,P,IMG");if(!d){a.setDisabled("absolute",1);a.setDisabled("moveforward",1);a.setDisabled("movebackward",1)}else{a.setDisabled("absolute",0);a.setDisabled("moveforward",!c);a.setDisabled("movebackward",!c);a.setActive("absolute",c&&c.style.position.toLowerCase()=="absolute")}},_visualAid:function(a,c,b){var d=a.dom;tinymce.each(d.select("div,p",c),function(f){if(/^(absolute|relative|static)$/i.test(f.style.position)){if(b){d.addClass(f,"mceItemVisualAid")}else{d.removeClass(f,"mceItemVisualAid")}}})},_move:function(h){var b=this.editor,f,g=[],e=this._getParentLayer(b.selection.getNode()),c=-1,j=-1,a;a=[];tinymce.walk(b.getBody(),function(d){if(d.nodeType==1&&/^(absolute|relative|static)$/i.test(d.style.position)){a.push(d)}},"childNodes");for(f=0;f<a.length;f++){g[f]=a[f].style.zIndex?parseInt(a[f].style.zIndex):0;if(c<0&&a[f]==e){c=f}}if(h<0){for(f=0;f<g.length;f++){if(g[f]<g[c]){j=f;break}}if(j>-1){a[c].style.zIndex=g[j];a[j].style.zIndex=g[c]}else{if(g[c]>0){a[c].style.zIndex=g[c]-1}}}else{for(f=0;f<g.length;f++){if(g[f]>g[c]){j=f;break}}if(j>-1){a[c].style.zIndex=g[j];a[j].style.zIndex=g[c]}else{a[c].style.zIndex=g[c]+1}}b.execCommand("mceRepaint")},_getParentLayer:function(a){return this.editor.dom.getParent(a,function(b){return b.nodeType==1&&/^(absolute|relative|static)$/i.test(b.style.position)})},_insertLayer:function(){var a=this.editor,b=a.dom.getPos(a.dom.getParent(a.selection.getNode(),"*"));a.dom.add(a.getBody(),"div",{style:{position:"absolute",left:b.x,top:(b.y>20?b.y:20),width:100,height:100},"class":"mceItemVisualAid"},a.selection.getContent()||a.getLang("layer.content"))},_toggleAbsolute:function(){var a=this.editor,b=this._getParentLayer(a.selection.getNode());if(!b){b=a.dom.getParent(a.selection.getNode(),"DIV,P,IMG")}if(b){if(b.style.position.toLowerCase()=="absolute"){a.dom.setStyles(b,{position:"",left:"",top:"",width:"",height:""});a.dom.removeClass(b,"mceItemVisualAid")}else{if(b.style.left==""){b.style.left=20+"px"}if(b.style.top==""){b.style.top=20+"px"}if(b.style.width==""){b.style.width=b.width?(b.width+"px"):"100px"}if(b.style.height==""){b.style.height=b.height?(b.height+"px"):"100px"}b.style.position="absolute";a.dom.setAttrib(b,"data-mce-style","");a.addVisual(a.getBody())}a.execCommand("mceRepaint");a.nodeChanged()}}});tinymce.PluginManager.add("layer",tinymce.plugins.Layer)})(); (function(){function a(b){do{if(b.className&&b.className.indexOf("mceItemLayer")!=-1){return b}}while(b=b.parentNode)}tinymce.create("tinymce.plugins.Layer",{init:function(b,c){var d=this;d.editor=b;b.addCommand("mceInsertLayer",d._insertLayer,d);b.addCommand("mceMoveForward",function(){d._move(1)});b.addCommand("mceMoveBackward",function(){d._move(-1)});b.addCommand("mceMakeAbsolute",function(){d._toggleAbsolute()});b.addButton("moveforward",{title:"layer.forward_desc",cmd:"mceMoveForward"});b.addButton("movebackward",{title:"layer.backward_desc",cmd:"mceMoveBackward"});b.addButton("absolute",{title:"layer.absolute_desc",cmd:"mceMakeAbsolute"});b.addButton("insertlayer",{title:"layer.insertlayer_desc",cmd:"mceInsertLayer"});b.onInit.add(function(){var e=b.dom;if(tinymce.isIE){b.getDoc().execCommand("2D-Position",false,true)}});b.onMouseUp.add(function(f,h){var g=a(h.target);if(g){f.dom.setAttrib(g,"data-mce-style","")}});b.onMouseDown.add(function(f,j){var h=j.target,i=f.getDoc(),g;if(tinymce.isGecko){if(a(h)){if(i.designMode!=="on"){i.designMode="on";h=i.body;g=h.parentNode;g.removeChild(h);g.appendChild(h)}}else{if(i.designMode=="on"){i.designMode="off"}}}});b.onNodeChange.add(d._nodeChange,d);b.onVisualAid.add(d._visualAid,d)},getInfo:function(){return{longname:"Layer",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/layer",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_nodeChange:function(c,b,f){var d,e;d=this._getParentLayer(f);e=c.dom.getParent(f,"DIV,P,IMG");if(!e){b.setDisabled("absolute",1);b.setDisabled("moveforward",1);b.setDisabled("movebackward",1)}else{b.setDisabled("absolute",0);b.setDisabled("moveforward",!d);b.setDisabled("movebackward",!d);b.setActive("absolute",d&&d.style.position.toLowerCase()=="absolute")}},_visualAid:function(b,d,c){var f=b.dom;tinymce.each(f.select("div,p",d),function(g){if(/^(absolute|relative|fixed)$/i.test(g.style.position)){if(c){f.addClass(g,"mceItemVisualAid")}else{f.removeClass(g,"mceItemVisualAid")}f.addClass(g,"mceItemLayer")}})},_move:function(j){var c=this.editor,g,h=[],f=this._getParentLayer(c.selection.getNode()),e=-1,k=-1,b;b=[];tinymce.walk(c.getBody(),function(d){if(d.nodeType==1&&/^(absolute|relative|static)$/i.test(d.style.position)){b.push(d)}},"childNodes");for(g=0;g<b.length;g++){h[g]=b[g].style.zIndex?parseInt(b[g].style.zIndex):0;if(e<0&&b[g]==f){e=g}}if(j<0){for(g=0;g<h.length;g++){if(h[g]<h[e]){k=g;break}}if(k>-1){b[e].style.zIndex=h[k];b[k].style.zIndex=h[e]}else{if(h[e]>0){b[e].style.zIndex=h[e]-1}}}else{for(g=0;g<h.length;g++){if(h[g]>h[e]){k=g;break}}if(k>-1){b[e].style.zIndex=h[k];b[k].style.zIndex=h[e]}else{b[e].style.zIndex=h[e]+1}}c.execCommand("mceRepaint")},_getParentLayer:function(b){return this.editor.dom.getParent(b,function(c){return c.nodeType==1&&/^(absolute|relative|static)$/i.test(c.style.position)})},_insertLayer:function(){var c=this.editor,e=c.dom,d=e.getPos(e.getParent(c.selection.getNode(),"*")),b=c.getBody();c.dom.add(b,"div",{style:{position:"absolute",left:d.x,top:(d.y>20?d.y:20),width:100,height:100},"class":"mceItemVisualAid mceItemLayer"},c.selection.getContent()||c.getLang("layer.content"));if(tinymce.isIE){e.setHTML(b,b.innerHTML)}},_toggleAbsolute:function(){var b=this.editor,c=this._getParentLayer(b.selection.getNode());if(!c){c=b.dom.getParent(b.selection.getNode(),"DIV,P,IMG")}if(c){if(c.style.position.toLowerCase()=="absolute"){b.dom.setStyles(c,{position:"",left:"",top:"",width:"",height:""});b.dom.removeClass(c,"mceItemVisualAid");b.dom.removeClass(c,"mceItemLayer")}else{if(c.style.left==""){c.style.left=20+"px"}if(c.style.top==""){c.style.top=20+"px"}if(c.style.width==""){c.style.width=c.width?(c.width+"px"):"100px"}if(c.style.height==""){c.style.height=c.height?(c.height+"px"):"100px"}c.style.position="absolute";b.dom.setAttrib(c,"data-mce-style","");b.addVisual(b.getBody())}b.execCommand("mceRepaint");b.nodeChanged()}}});tinymce.PluginManager.add("layer",tinymce.plugins.Layer)})();

View File

@ -9,6 +9,14 @@
*/ */
(function() { (function() {
function findParentLayer(node) {
do {
if (node.className && node.className.indexOf('mceItemLayer') != -1) {
return node;
}
} while (node = node.parentNode);
};
tinymce.create('tinymce.plugins.Layer', { tinymce.create('tinymce.plugins.Layer', {
init : function(ed, url) { init : function(ed, url) {
var t = this; var t = this;
@ -37,10 +45,43 @@
ed.addButton('insertlayer', {title : 'layer.insertlayer_desc', cmd : 'mceInsertLayer'}); ed.addButton('insertlayer', {title : 'layer.insertlayer_desc', cmd : 'mceInsertLayer'});
ed.onInit.add(function() { ed.onInit.add(function() {
var dom = ed.dom;
if (tinymce.isIE) if (tinymce.isIE)
ed.getDoc().execCommand('2D-Position', false, true); ed.getDoc().execCommand('2D-Position', false, true);
}); });
// Remove serialized styles when selecting a layer since it might be changed by a drag operation
ed.onMouseUp.add(function(ed, e) {
var layer = findParentLayer(e.target);
if (layer) {
ed.dom.setAttrib(layer, 'data-mce-style', '');
}
});
// Fixes edit focus issues with layers on Gecko
// This will enable designMode while inside a layer and disable it when outside
ed.onMouseDown.add(function(ed, e) {
var node = e.target, doc = ed.getDoc(), parent;
if (tinymce.isGecko) {
if (findParentLayer(node)) {
if (doc.designMode !== 'on') {
doc.designMode = 'on';
// Repaint caret
node = doc.body;
parent = node.parentNode;
parent.removeChild(node);
parent.appendChild(node);
}
} else if (doc.designMode == 'on') {
doc.designMode = 'off';
}
}
});
ed.onNodeChange.add(t._nodeChange, t); ed.onNodeChange.add(t._nodeChange, t);
ed.onVisualAid.add(t._visualAid, t); ed.onVisualAid.add(t._visualAid, t);
}, },
@ -81,11 +122,13 @@
var dom = ed.dom; var dom = ed.dom;
tinymce.each(dom.select('div,p', e), function(e) { tinymce.each(dom.select('div,p', e), function(e) {
if (/^(absolute|relative|static)$/i.test(e.style.position)) { if (/^(absolute|relative|fixed)$/i.test(e.style.position)) {
if (s) if (s)
dom.addClass(e, 'mceItemVisualAid'); dom.addClass(e, 'mceItemVisualAid');
else else
dom.removeClass(e, 'mceItemVisualAid'); dom.removeClass(e, 'mceItemVisualAid');
dom.addClass(e, 'mceItemLayer');
} }
}); });
}, },
@ -153,9 +196,9 @@
}, },
_insertLayer : function() { _insertLayer : function() {
var ed = this.editor, p = ed.dom.getPos(ed.dom.getParent(ed.selection.getNode(), '*')); var ed = this.editor, dom = ed.dom, p = dom.getPos(dom.getParent(ed.selection.getNode(), '*')), body = ed.getBody();
ed.dom.add(ed.getBody(), 'div', { ed.dom.add(body, 'div', {
style : { style : {
position : 'absolute', position : 'absolute',
left : p.x, left : p.x,
@ -163,8 +206,12 @@
width : 100, width : 100,
height : 100 height : 100
}, },
'class' : 'mceItemVisualAid' 'class' : 'mceItemVisualAid mceItemLayer'
}, ed.selection.getContent() || ed.getLang('layer.content')); }, ed.selection.getContent() || ed.getLang('layer.content'));
// Workaround for IE where it messes up the JS engine if you insert a layer on IE 6,7
if (tinymce.isIE)
dom.setHTML(body, body.innerHTML);
}, },
_toggleAbsolute : function() { _toggleAbsolute : function() {
@ -184,6 +231,7 @@
}); });
ed.dom.removeClass(le, 'mceItemVisualAid'); ed.dom.removeClass(le, 'mceItemVisualAid');
ed.dom.removeClass(le, 'mceItemLayer');
} else { } else {
if (le.style.left == "") if (le.style.left == "")
le.style.left = 20 + 'px'; le.style.left = 20 + 'px';

View File

@ -1 +1 @@
(function(a){a.onAddEditor.addToTop(function(c,b){b.settings.inline_styles=false});a.create("tinymce.plugins.LegacyOutput",{init:function(b){b.onInit.add(function(){var c="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img",e=a.explode(b.settings.font_size_style_values),d=b.schema;b.formatter.register({alignleft:{selector:c,attributes:{align:"left"}},aligncenter:{selector:c,attributes:{align:"center"}},alignright:{selector:c,attributes:{align:"right"}},alignfull:{selector:c,attributes:{align:"full"}},bold:[{inline:"b",remove:"all"},{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}}],italic:[{inline:"i",remove:"all"},{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}}],underline:[{inline:"u",remove:"all"},{inline:"span",styles:{textDecoration:"underline"},exact:true}],strikethrough:[{inline:"strike",remove:"all"},{inline:"span",styles:{textDecoration:"line-through"},exact:true}],fontname:{inline:"font",attributes:{face:"%value"}},fontsize:{inline:"font",attributes:{size:function(f){return a.inArray(e,f.value)+1}}},forecolor:{inline:"font",styles:{color:"%value"}},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"}}});a.each("b,i,u,strike".split(","),function(f){d.addValidElements(f+"[*]")});if(!d.getElementRule("font")){d.addValidElements("font[face|size|color|style]")}a.each(c.split(","),function(f){var h=d.getElementRule(f),g;if(h){if(!h.attributes.align){h.attributes.align={};h.attributesOrder.push("align")}}});b.onNodeChange.add(function(g,k){var j,f,h,i;f=g.dom.getParent(g.selection.getNode(),"font");if(f){h=f.face;i=f.size}if(j=k.get("fontselect")){j.select(function(l){return l==h})}if(j=k.get("fontsizeselect")){j.select(function(m){var l=a.inArray(e,m.fontSize);return l+1==i})}})})},getInfo:function(){return{longname:"LegacyOutput",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/legacyoutput",version:a.majorVersion+"."+a.minorVersion}}});a.PluginManager.add("legacyoutput",a.plugins.LegacyOutput)})(tinymce); (function(a){a.onAddEditor.addToTop(function(c,b){b.settings.inline_styles=false});a.create("tinymce.plugins.LegacyOutput",{init:function(b){b.onInit.add(function(){var c="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img",e=a.explode(b.settings.font_size_style_values),d=b.schema;b.formatter.register({alignleft:{selector:c,attributes:{align:"left"}},aligncenter:{selector:c,attributes:{align:"center"}},alignright:{selector:c,attributes:{align:"right"}},alignfull:{selector:c,attributes:{align:"justify"}},bold:[{inline:"b",remove:"all"},{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}}],italic:[{inline:"i",remove:"all"},{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}}],underline:[{inline:"u",remove:"all"},{inline:"span",styles:{textDecoration:"underline"},exact:true}],strikethrough:[{inline:"strike",remove:"all"},{inline:"span",styles:{textDecoration:"line-through"},exact:true}],fontname:{inline:"font",attributes:{face:"%value"}},fontsize:{inline:"font",attributes:{size:function(f){return a.inArray(e,f.value)+1}}},forecolor:{inline:"font",styles:{color:"%value"}},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"}}});a.each("b,i,u,strike".split(","),function(f){d.addValidElements(f+"[*]")});if(!d.getElementRule("font")){d.addValidElements("font[face|size|color|style]")}a.each(c.split(","),function(f){var h=d.getElementRule(f),g;if(h){if(!h.attributes.align){h.attributes.align={};h.attributesOrder.push("align")}}});b.onNodeChange.add(function(g,k){var j,f,h,i;f=g.dom.getParent(g.selection.getNode(),"font");if(f){h=f.face;i=f.size}if(j=k.get("fontselect")){j.select(function(l){return l==h})}if(j=k.get("fontsizeselect")){j.select(function(m){var l=a.inArray(e,m.fontSize);return l+1==i})}})})},getInfo:function(){return{longname:"LegacyOutput",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/legacyoutput",version:a.majorVersion+"."+a.minorVersion}}});a.PluginManager.add("legacyoutput",a.plugins.LegacyOutput)})(tinymce);

View File

@ -34,7 +34,7 @@
alignleft : {selector : alignElements, attributes : {align : 'left'}}, alignleft : {selector : alignElements, attributes : {align : 'left'}},
aligncenter : {selector : alignElements, attributes : {align : 'center'}}, aligncenter : {selector : alignElements, attributes : {align : 'center'}},
alignright : {selector : alignElements, attributes : {align : 'right'}}, alignright : {selector : alignElements, attributes : {align : 'right'}},
alignfull : {selector : alignElements, attributes : {align : 'full'}}, alignfull : {selector : alignElements, attributes : {align : 'justify'}},
// Change the basic formatting elements to use deprecated element types // Change the basic formatting elements to use deprecated element types
bold : [ bold : [

File diff suppressed because one or more lines are too long

View File

@ -18,25 +18,29 @@
} }
return e; return e;
} }
function skipWhitespaceNodesBackwards(e) { function skipWhitespaceNodesBackwards(e) {
return skipWhitespaceNodes(e, function(e) { return e.previousSibling; }); return skipWhitespaceNodes(e, function(e) {
return e.previousSibling;
});
} }
function skipWhitespaceNodesForwards(e) { function skipWhitespaceNodesForwards(e) {
return skipWhitespaceNodes(e, function(e) { return e.nextSibling; }); return skipWhitespaceNodes(e, function(e) {
return e.nextSibling;
});
} }
function hasParentInList(ed, e, list) { function hasParentInList(ed, e, list) {
return ed.dom.getParent(e, function(p) { return ed.dom.getParent(e, function(p) {
return tinymce.inArray(list, p) !== -1; return tinymce.inArray(list, p) !== -1;
}); });
} }
function isList(e) { function isList(e) {
return e && (e.tagName === 'OL' || e.tagName === 'UL'); return e && (e.tagName === 'OL' || e.tagName === 'UL');
} }
function splitNestedLists(element, dom) { function splitNestedLists(element, dom) {
var tmp, nested, wrapItem; var tmp, nested, wrapItem;
tmp = skipWhitespaceNodesBackwards(element.lastChild); tmp = skipWhitespaceNodesBackwards(element.lastChild);
@ -54,12 +58,12 @@
} }
return element; return element;
} }
function attemptMergeWithAdjacent(e, allowDifferentListStyles, mergeParagraphs) { function attemptMergeWithAdjacent(e, allowDifferentListStyles, mergeParagraphs) {
e = attemptMergeWithPrevious(e, allowDifferentListStyles, mergeParagraphs); e = attemptMergeWithPrevious(e, allowDifferentListStyles, mergeParagraphs);
return attemptMergeWithNext(e, allowDifferentListStyles, mergeParagraphs); return attemptMergeWithNext(e, allowDifferentListStyles, mergeParagraphs);
} }
function attemptMergeWithPrevious(e, allowDifferentListStyles, mergeParagraphs) { function attemptMergeWithPrevious(e, allowDifferentListStyles, mergeParagraphs) {
var prev = skipWhitespaceNodesBackwards(e.previousSibling); var prev = skipWhitespaceNodesBackwards(e.previousSibling);
if (prev) { if (prev) {
@ -68,7 +72,7 @@
return e; return e;
} }
} }
function attemptMergeWithNext(e, allowDifferentListStyles, mergeParagraphs) { function attemptMergeWithNext(e, allowDifferentListStyles, mergeParagraphs) {
var next = skipWhitespaceNodesForwards(e.nextSibling); var next = skipWhitespaceNodesForwards(e.nextSibling);
if (next) { if (next) {
@ -77,7 +81,7 @@
return e; return e;
} }
} }
function attemptMerge(e1, e2, differentStylesMasterElement, mergeParagraphs) { function attemptMerge(e1, e2, differentStylesMasterElement, mergeParagraphs) {
if (canMerge(e1, e2, !!differentStylesMasterElement, mergeParagraphs)) { if (canMerge(e1, e2, !!differentStylesMasterElement, mergeParagraphs)) {
return merge(e1, e2, differentStylesMasterElement); return merge(e1, e2, differentStylesMasterElement);
@ -87,7 +91,7 @@
} }
return e2; return e2;
} }
function canMerge(e1, e2, allowDifferentListStyles, mergeParagraphs) { function canMerge(e1, e2, allowDifferentListStyles, mergeParagraphs) {
if (!e1 || !e2) { if (!e1 || !e2) {
return false; return false;
@ -95,23 +99,19 @@
return e2.style.listStyleType === 'none' || containsOnlyAList(e2); return e2.style.listStyleType === 'none' || containsOnlyAList(e2);
} else if (isList(e1)) { } else if (isList(e1)) {
return (e1.tagName === e2.tagName && (allowDifferentListStyles || e1.style.listStyleType === e2.style.listStyleType)) || isListForIndent(e2); return (e1.tagName === e2.tagName && (allowDifferentListStyles || e1.style.listStyleType === e2.style.listStyleType)) || isListForIndent(e2);
} else if (mergeParagraphs && e1.tagName === 'P' && e2.tagName === 'P') { } else return mergeParagraphs && e1.tagName === 'P' && e2.tagName === 'P';
return true;
} else {
return false;
}
} }
function isListForIndent(e) { function isListForIndent(e) {
var firstLI = skipWhitespaceNodesForwards(e.firstChild), lastLI = skipWhitespaceNodesBackwards(e.lastChild); var firstLI = skipWhitespaceNodesForwards(e.firstChild), lastLI = skipWhitespaceNodesBackwards(e.lastChild);
return firstLI && lastLI && isList(e) && firstLI === lastLI && (isList(firstLI) || firstLI.style.listStyleType === 'none' || containsOnlyAList(firstLI)); return firstLI && lastLI && isList(e) && firstLI === lastLI && (isList(firstLI) || firstLI.style.listStyleType === 'none' || containsOnlyAList(firstLI));
} }
function containsOnlyAList(e) { function containsOnlyAList(e) {
var firstChild = skipWhitespaceNodesForwards(e.firstChild), lastChild = skipWhitespaceNodesBackwards(e.lastChild); var firstChild = skipWhitespaceNodesForwards(e.firstChild), lastChild = skipWhitespaceNodesBackwards(e.lastChild);
return firstChild && lastChild && firstChild === lastChild && isList(firstChild); return firstChild && lastChild && firstChild === lastChild && isList(firstChild);
} }
function merge(e1, e2, masterElement) { function merge(e1, e2, masterElement) {
var lastOriginal = skipWhitespaceNodesBackwards(e1.lastChild), firstNew = skipWhitespaceNodesForwards(e2.firstChild); var lastOriginal = skipWhitespaceNodesBackwards(e1.lastChild), firstNew = skipWhitespaceNodesForwards(e2.firstChild);
if (e1.tagName === 'P') { if (e1.tagName === 'P') {
@ -127,7 +127,7 @@
attemptMerge(lastOriginal, firstNew, false); attemptMerge(lastOriginal, firstNew, false);
return e1; return e1;
} }
function findItemToOperateOn(e, dom) { function findItemToOperateOn(e, dom) {
var item; var item;
if (!dom.is(e, 'li,ol,ul')) { if (!dom.is(e, 'li,ol,ul')) {
@ -138,27 +138,214 @@
} }
return e; return e;
} }
tinymce.create('tinymce.plugins.Lists', { tinymce.create('tinymce.plugins.Lists', {
init: function(ed, url) { init: function(ed) {
var enterDownInEmptyList = false; var LIST_TABBING = 'TABBING';
function isTriggerKey(e) { var LIST_EMPTY_ITEM = 'EMPTY';
return e.keyCode === 9 && (ed.queryCommandState('InsertUnorderedList') || ed.queryCommandState('InsertOrderedList')); var LIST_ESCAPE = 'ESCAPE';
var LIST_PARAGRAPH = 'PARAGRAPH';
var LIST_UNKNOWN = 'UNKNOWN';
var state = LIST_UNKNOWN;
function isTabInList(e) {
// Don't indent on Ctrl+Tab or Alt+Tab
return e.keyCode === tinymce.VK.TAB && !(e.altKey || e.ctrlKey) &&
(ed.queryCommandState('InsertUnorderedList') || ed.queryCommandState('InsertOrderedList'));
} }
function isEnterInEmptyListItem(ed, e) {
var sel = ed.selection, n; function isCursorAtEndOfContainer() {
if (e.keyCode === 13) { var range = ed.selection.getRng();
n = sel.getStart(); var startContainer = range.startContainer;
enterDownInEmptyList = sel.isCollapsed() && n && n.tagName === 'LI' && n.childNodes.length === 0; if (startContainer.nodeType == 3) {
return enterDownInEmptyList; return (range.endOffset == startContainer.nodeValue.length);
} else if (startContainer.nodeType == 1) {
return range.endOffset == startContainer.childNodes.length;
}
return false;
}
// If we are at the end of a paragraph in a list item, pressing enter should create a new list item instead of a new paragraph.
function isEndOfParagraph() {
var node = ed.selection.getNode();
var isLastParagraphOfLi = node.tagName === 'P' && node.parentNode.tagName === 'LI' && node.parentNode.lastChild === node;
return ed.selection.isCollapsed() && isLastParagraphOfLi && isCursorAtEndOfContainer();
}
function isOnLastListItem() {
var li = getLi();
var grandParent = li.parentNode.parentNode;
var isLastItem = li.parentNode.lastChild === li;
return isLastItem && !isNestedList(grandParent) && isEmptyListItem(li);
}
function isNestedList(grandParent) {
if (isList(grandParent)) {
return grandParent.parentNode && grandParent.parentNode.tagName === 'LI';
} else {
return grandParent.tagName === 'LI';
} }
} }
function cancelKeys(ed, e) {
if (isTriggerKey(e) || isEnterInEmptyListItem(ed, e)) { function isInEmptyListItem() {
return Event.cancel(e); return ed.selection.isCollapsed() && isEmptyListItem(getLi());
}
function getLi() {
var n = ed.selection.getStart();
// Get start will return BR if the LI only contains a BR or an empty element as we use these to fix caret position
return ((n.tagName == 'BR' || n.tagName == '') && n.parentNode.tagName == 'LI') ? n.parentNode : n;
}
function isEmptyListItem(li) {
var numChildren = li.childNodes.length;
if (li.tagName === 'LI') {
return numChildren == 0 ? true : numChildren == 1 && (li.firstChild.tagName == '' || li.firstChild.tagName == 'BR' || isEmptyIE9Li(li));
}
return false;
}
function isEmptyIE9Li(li) {
// only consider this to be last item if there is no list item content or that content is nbsp or space since IE9 creates these
var lis = tinymce.grep(li.parentNode.childNodes, function(n) {return n.tagName == 'LI'});
var isLastLi = li == lis[lis.length - 1];
var child = li.firstChild;
return tinymce.isIE9 && isLastLi && (child.nodeValue == String.fromCharCode(160) || child.nodeValue == String.fromCharCode(32));
}
function isEnter(e) {
return e.keyCode === tinymce.VK.ENTER;
}
function isEnterWithoutShift(e) {
return isEnter(e) && !e.shiftKey;
}
function getListKeyState(e) {
if (isTabInList(e)) {
return LIST_TABBING;
} else if (isEnterWithoutShift(e) && isOnLastListItem()) {
return LIST_ESCAPE;
} else if (isEnterWithoutShift(e) && isInEmptyListItem()) {
return LIST_EMPTY_ITEM;
} else if (isEnterWithoutShift(e) && isEndOfParagraph()) {
return LIST_PARAGRAPH;
} else {
return LIST_UNKNOWN;
}
}
function cancelDefaultEvents(ed, e) {
// list escape is done manually using outdent as it does not create paragraphs correctly in td's
if (state == LIST_TABBING || state == LIST_EMPTY_ITEM || tinymce.isGecko && state == LIST_ESCAPE) {
Event.cancel(e);
} }
} }
// Creates a new list item after the current selection's list item parent
function createNewLi(ed, e) {
if (state == LIST_PARAGRAPH) {
var node = ed.selection.getNode();
var li = ed.dom.create("li");
var parentLi = ed.dom.getParent(node, 'li');
ed.dom.insertAfter(li, parentLi);
// Move caret to new list element.
if (tinyMCE.isIE8) {
li.appendChild(ed.dom.create("&nbsp;")); // IE needs an element within the bullet point
ed.selection.setCursorLocation(li, 1);
} else if (tinyMCE.isGecko) {
// This setTimeout is a hack as FF behaves badly if there is no content after the bullet point
setTimeout(function () {
var n = ed.getDoc().createTextNode('\uFEFF');
li.appendChild(n);
ed.selection.setCursorLocation(li, 0);
}, 0);
} else {
ed.selection.setCursorLocation(li, 0);
}
Event.cancel(e);
}
}
function imageJoiningListItem(ed, e) {
var prevSibling;
if (!tinymce.isGecko)
return;
var n = ed.selection.getStart();
if (e.keyCode != tinymce.VK.BACKSPACE || n.tagName !== 'IMG')
return;
function lastLI(node) {
var child = node.firstChild;
var li = null;
do {
if (!child)
break;
if (child.tagName === 'LI')
li = child;
} while (child = child.nextSibling);
return li;
}
function addChildren(parentNode, destination) {
while (parentNode.childNodes.length > 0)
destination.appendChild(parentNode.childNodes[0]);
}
// Check if there is a previous sibling
prevSibling = n.parentNode.previousSibling;
if (!prevSibling)
return;
var ul;
if (prevSibling.tagName === 'UL' || prevSibling.tagName === 'OL')
ul = prevSibling;
else if (prevSibling.previousSibling && (prevSibling.previousSibling.tagName === 'UL' || prevSibling.previousSibling.tagName === 'OL'))
ul = prevSibling.previousSibling;
else
return;
var li = lastLI(ul);
// move the caret to the end of the list item
var rng = ed.dom.createRng();
rng.setStart(li, 1);
rng.setEnd(li, 1);
ed.selection.setRng(rng);
ed.selection.collapse(true);
// save a bookmark at the end of the list item
var bookmark = ed.selection.getBookmark();
// copy the image an its text to the list item
var clone = n.parentNode.cloneNode(true);
if (clone.tagName === 'P' || clone.tagName === 'DIV')
addChildren(clone, li);
else
li.appendChild(clone);
// remove the old copy of the image
n.parentNode.parentNode.removeChild(n.parentNode);
// move the caret where we saved the bookmark
ed.selection.moveToBookmark(bookmark);
}
// fix the cursor position to ensure it is correct in IE
function setCursorPositionToOriginalLi(li) {
var list = ed.dom.getParent(li, 'ol,ul');
if (list != null) {
var lastLi = list.lastChild;
lastLi.appendChild(ed.getDoc().createElement(''));
ed.selection.setCursorLocation(lastLi, 0);
}
}
this.ed = ed; this.ed = ed;
ed.addCommand('Indent', this.indent, this); ed.addCommand('Indent', this.indent, this);
ed.addCommand('Outdent', this.outdent, this); ed.addCommand('Outdent', this.outdent, this);
@ -168,84 +355,162 @@
ed.addCommand('InsertOrderedList', function() { ed.addCommand('InsertOrderedList', function() {
this.applyList('OL', 'UL'); this.applyList('OL', 'UL');
}, this); }, this);
ed.onInit.add(function() { ed.onInit.add(function() {
ed.editorCommands.addCommands({ ed.editorCommands.addCommands({
'outdent': function() { 'outdent': function() {
var sel = ed.selection, dom = ed.dom; var sel = ed.selection, dom = ed.dom;
function hasStyleIndent(n) { function hasStyleIndent(n) {
n = dom.getParent(n, dom.isBlock); n = dom.getParent(n, dom.isBlock);
return n && (parseInt(ed.dom.getStyle(n, 'margin-left') || 0, 10) + parseInt(ed.dom.getStyle(n, 'padding-left') || 0, 10)) > 0; return n && (parseInt(ed.dom.getStyle(n, 'margin-left') || 0, 10) + parseInt(ed.dom.getStyle(n, 'padding-left') || 0, 10)) > 0;
} }
return hasStyleIndent(sel.getStart()) || hasStyleIndent(sel.getEnd()) || ed.queryCommandState('InsertOrderedList') || ed.queryCommandState('InsertUnorderedList'); return hasStyleIndent(sel.getStart()) || hasStyleIndent(sel.getEnd()) || ed.queryCommandState('InsertOrderedList') || ed.queryCommandState('InsertUnorderedList');
} }
}, 'state'); }, 'state');
}); });
ed.onKeyUp.add(function(ed, e) { ed.onKeyUp.add(function(ed, e) {
var n, rng; if (state == LIST_TABBING) {
if (isTriggerKey(e)) {
ed.execCommand(e.shiftKey ? 'Outdent' : 'Indent', true, null); ed.execCommand(e.shiftKey ? 'Outdent' : 'Indent', true, null);
return Event.cancel(e); state = LIST_UNKNOWN;
} else if (enterDownInEmptyList && isEnterInEmptyListItem(ed, e)) { return Event.cancel(e);
if (ed.queryCommandState('InsertOrderedList')) { } else if (state == LIST_EMPTY_ITEM) {
ed.execCommand('InsertOrderedList'); var li = getLi();
} else { var shouldOutdent = ed.settings.list_outdent_on_enter === true || e.shiftKey;
ed.execCommand('InsertUnorderedList'); ed.execCommand(shouldOutdent ? 'Outdent' : 'Indent', true, null);
} if (tinymce.isIE) {
n = ed.selection.getStart(); setCursorPositionToOriginalLi(li);
if (n && n.tagName === 'LI') {
// Fix the caret position on IE since it jumps back up to the previous list item.
n = ed.dom.getParent(n, 'ol,ul').nextSibling;
if (n && n.tagName === 'P') {
if (!n.firstChild) {
n.appendChild(ed.getDoc().createTextNode(''));
}
rng = ed.dom.createRng();
rng.setStart(n.firstChild, 1);
rng.setEnd(n.firstChild, 1);
ed.selection.setRng(rng);
}
} }
return Event.cancel(e); return Event.cancel(e);
} else if (state == LIST_ESCAPE) {
if (tinymce.isIE8) {
// append a zero sized nbsp so that caret is positioned correctly in IE8 after escaping and applying formatting.
// if there is no text then applying formatting for e.g a H1 to the P tag immediately following list after
// escaping from it will cause the caret to be positioned on the last li instead of staying the in P tag.
var n = ed.getDoc().createTextNode('\uFEFF');
ed.selection.getNode().appendChild(n);
} else if (tinymce.isIE9 || tinymce.isGecko) {
// IE9 does not escape the list so we use outdent to do this and cancel the default behaviour
// Gecko does not create a paragraph outdenting inside a TD so default behaviour is cancelled and we outdent ourselves
ed.execCommand('Outdent');
return Event.cancel(e);
}
} }
}); });
ed.onKeyPress.add(cancelKeys);
ed.onKeyDown.add(cancelKeys); function fixListItem(parent, reference) {
// a zero-sized non-breaking space is placed in the empty list item so that the nested list is
// displayed on the below line instead of next to it
var n = ed.getDoc().createTextNode('\uFEFF');
parent.insertBefore(n, reference);
ed.selection.setCursorLocation(n, 0);
// repaint to remove rendering artifact. only visible when creating new list
ed.execCommand('mceRepaint');
}
function fixIndentedListItemForGecko(ed, e) {
if (isEnter(e)) {
var li = getLi();
if (li) {
var parent = li.parentNode;
var grandParent = parent && parent.parentNode;
if (grandParent && grandParent.nodeName == 'LI' && grandParent.firstChild == parent && li == parent.firstChild) {
fixListItem(grandParent, parent);
}
}
}
}
function fixIndentedListItemForIE8(ed, e) {
if (isEnter(e)) {
var li = getLi();
if (ed.dom.select('ul li', li).length === 1) {
var list = li.firstChild;
fixListItem(li, list);
}
}
}
function fixDeletingFirstCharOfList(ed, e) {
function listElements(list, li) {
var elements = [];
var walker = new tinymce.dom.TreeWalker(li, list);
for (var node = walker.current(); node; node = walker.next()) {
if (ed.dom.is(node, 'ol,ul,li')) {
elements.push(node);
}
}
return elements;
}
if (e.keyCode == tinymce.VK.BACKSPACE) {
var li = getLi();
if (li) {
var list = ed.dom.getParent(li, 'ol,ul');
if (list && list.firstChild === li) {
var elements = listElements(list, li);
ed.execCommand("Outdent", false, elements);
ed.undoManager.add();
return Event.cancel(e);
}
}
}
}
ed.onKeyDown.add(function(_, e) { state = getListKeyState(e); });
ed.onKeyDown.add(cancelDefaultEvents);
ed.onKeyDown.add(imageJoiningListItem);
ed.onKeyDown.add(createNewLi);
if (tinymce.isGecko) {
ed.onKeyUp.add(fixIndentedListItemForGecko);
}
if (tinymce.isIE8) {
ed.onKeyUp.add(fixIndentedListItemForIE8);
}
if (tinymce.isGecko || tinymce.isWebKit) {
ed.onKeyDown.add(fixDeletingFirstCharOfList);
}
}, },
applyList: function(targetListType, oppositeListType) { applyList: function(targetListType, oppositeListType) {
var t = this, ed = t.ed, dom = ed.dom, applied = [], hasSameType = false, hasOppositeType = false, hasNonList = false, actions, var t = this, ed = t.ed, dom = ed.dom, applied = [], hasSameType = false, hasOppositeType = false, hasNonList = false, actions,
selectedBlocks = ed.selection.getSelectedBlocks(); selectedBlocks = ed.selection.getSelectedBlocks();
function cleanupBr(e) { function cleanupBr(e) {
if (e && e.tagName === 'BR') { if (e && e.tagName === 'BR') {
dom.remove(e); dom.remove(e);
} }
} }
function makeList(element) { function makeList(element) {
var list = dom.create(targetListType), li; var list = dom.create(targetListType), li;
function adjustIndentForNewList(element) { function adjustIndentForNewList(element) {
// If there's a margin-left, outdent one level to account for the extra list margin. // If there's a margin-left, outdent one level to account for the extra list margin.
if (element.style.marginLeft || element.style.paddingLeft) { if (element.style.marginLeft || element.style.paddingLeft) {
t.adjustPaddingFunction(false)(element); t.adjustPaddingFunction(false)(element);
} }
} }
if (element.tagName === 'LI') { if (element.tagName === 'LI') {
// No change required. // No change required.
} else if (element.tagName === 'P' || element.tagName === 'DIV' || element.tagName === 'BODY') { } else if (element.tagName === 'P' || element.tagName === 'DIV' || element.tagName === 'BODY') {
processBrs(element, function(startSection, br, previousBR) { processBrs(element, function(startSection, br) {
doWrapList(startSection, br, element.tagName === 'BODY' ? null : startSection.parentNode); doWrapList(startSection, br, element.tagName === 'BODY' ? null : startSection.parentNode);
li = startSection.parentNode; li = startSection.parentNode;
adjustIndentForNewList(li); adjustIndentForNewList(li);
cleanupBr(br); cleanupBr(br);
}); });
if (element.tagName === 'P' || selectedBlocks.length > 1) { if (li) {
dom.split(li.parentNode.parentNode, li.parentNode); if (li.tagName === 'LI' && (element.tagName === 'P' || selectedBlocks.length > 1)) {
dom.split(li.parentNode.parentNode, li.parentNode);
}
attemptMergeWithAdjacent(li.parentNode, true);
} }
attemptMergeWithAdjacent(li.parentNode, true);
return; return;
} else { } else {
// Put the list around the element. // Put the list around the element.
@ -260,9 +525,9 @@
attemptMergeWithAdjacent(list, true); attemptMergeWithAdjacent(list, true);
applied.push(element); applied.push(element);
} }
function doWrapList(start, end, template) { function doWrapList(start, end, template) {
var li, n = start, tmp, i; var li, n = start, tmp;
while (!dom.isBlock(start.parentNode) && start.parentNode !== dom.getRoot()) { while (!dom.isBlock(start.parentNode) && start.parentNode !== dom.getRoot()) {
start = dom.split(start.parentNode, start.previousSibling); start = dom.split(start.parentNode, start.previousSibling);
start = start.nextSibling; start = start.nextSibling;
@ -277,7 +542,7 @@
li = dom.create('li'); li = dom.create('li');
start.parentNode.insertBefore(li, start); start.parentNode.insertBefore(li, start);
} }
while (n && n != end) { while (n && n != end) {
tmp = n.nextSibling; tmp = n.nextSibling;
li.appendChild(n); li.appendChild(n);
n = tmp; n = tmp;
@ -287,10 +552,11 @@
} }
makeList(li); makeList(li);
} }
function processBrs(element, callback) { function processBrs(element, callback) {
var startSection, previousBR, END_TO_START = 3, START_TO_END = 1, var startSection, previousBR, END_TO_START = 3, START_TO_END = 1,
breakElements = 'br,ul,ol,p,div,h1,h2,h3,h4,h5,h6,table,blockquote,address,pre,form,center,dl'; breakElements = 'br,ul,ol,p,div,h1,h2,h3,h4,h5,h6,table,blockquote,address,pre,form,center,dl';
function isAnyPartSelected(start, end) { function isAnyPartSelected(start, end) {
var r = dom.createRng(), sel; var r = dom.createRng(), sel;
bookmark.keep = true; bookmark.keep = true;
@ -304,18 +570,19 @@
r.setEndAfter(end); r.setEndAfter(end);
return !(r.compareBoundaryPoints(END_TO_START, sel) > 0 || r.compareBoundaryPoints(START_TO_END, sel) <= 0); return !(r.compareBoundaryPoints(END_TO_START, sel) > 0 || r.compareBoundaryPoints(START_TO_END, sel) <= 0);
} }
function nextLeaf(br) { function nextLeaf(br) {
if (br.nextSibling) if (br.nextSibling)
return br.nextSibling; return br.nextSibling;
if (!dom.isBlock(br.parentNode) && br.parentNode !== dom.getRoot()) if (!dom.isBlock(br.parentNode) && br.parentNode !== dom.getRoot())
return nextLeaf(br.parentNode); return nextLeaf(br.parentNode);
} }
// Split on BRs within the range and process those. // Split on BRs within the range and process those.
startSection = element.firstChild; startSection = element.firstChild;
// First mark the BRs that have any part of the previous section selected. // First mark the BRs that have any part of the previous section selected.
var trailingContentSelected = false; var trailingContentSelected = false;
each(dom.select(breakElements, element), function(br) { each(dom.select(breakElements, element), function(br) {
var b;
if (br.hasAttribute && br.hasAttribute('_mce_bogus')) { if (br.hasAttribute && br.hasAttribute('_mce_bogus')) {
return true; // Skip the bogus Brs that are put in to appease Firefox and Safari. return true; // Skip the bogus Brs that are put in to appease Firefox and Safari.
} }
@ -344,7 +611,7 @@
callback(startSection, undefined, previousBR); callback(startSection, undefined, previousBR);
} }
} }
function wrapList(element) { function wrapList(element) {
processBrs(element, function(startSection, br, previousBR) { processBrs(element, function(startSection, br, previousBR) {
// Need to indent this part // Need to indent this part
@ -353,7 +620,7 @@
cleanupBr(previousBR); cleanupBr(previousBR);
}); });
} }
function changeList(element) { function changeList(element) {
if (tinymce.inArray(applied, element) !== -1) { if (tinymce.inArray(applied, element) !== -1) {
return; return;
@ -365,7 +632,7 @@
} }
applied.push(element); applied.push(element);
} }
function convertListItemToParagraph(element) { function convertListItemToParagraph(element) {
var child, nextChild, mergedElement, splitLast; var child, nextChild, mergedElement, splitLast;
if (tinymce.inArray(applied, element) !== -1) { if (tinymce.inArray(applied, element) !== -1) {
@ -387,7 +654,7 @@
if (dom.isBlock(child)) { if (dom.isBlock(child)) {
child = dom.split(child.parentNode, child); child = dom.split(child.parentNode, child);
splitLast = true; splitLast = true;
nextChild = child.nextSibling && child.nextSibling.firstChild; nextChild = child.nextSibling && child.nextSibling.firstChild;
} else { } else {
nextChild = child.nextSibling; nextChild = child.nextSibling;
if (splitLast && child.tagName === 'BR') { if (splitLast && child.tagName === 'BR') {
@ -399,7 +666,7 @@
} }
} }
} }
each(selectedBlocks, function(e) { each(selectedBlocks, function(e) {
e = findItemToOperateOn(e, dom); e = findItemToOperateOn(e, dom);
if (e.tagName === oppositeListType || (e.tagName === 'LI' && e.parentNode.tagName === oppositeListType)) { if (e.tagName === oppositeListType || (e.tagName === 'LI' && e.parentNode.tagName === oppositeListType)) {
@ -411,7 +678,7 @@
} }
}); });
if (hasNonList || hasOppositeType || selectedBlocks.length === 0) { if (hasNonList &&!hasSameType || hasOppositeType || selectedBlocks.length === 0) {
actions = { actions = {
'LI': changeList, 'LI': changeList,
'H1': makeList, 'H1': makeList,
@ -423,32 +690,34 @@
'P': makeList, 'P': makeList,
'BODY': makeList, 'BODY': makeList,
'DIV': selectedBlocks.length > 1 ? makeList : wrapList, 'DIV': selectedBlocks.length > 1 ? makeList : wrapList,
defaultAction: wrapList defaultAction: wrapList,
elements: this.selectedBlocks()
}; };
} else { } else {
actions = { actions = {
defaultAction: convertListItemToParagraph defaultAction: convertListItemToParagraph,
elements: this.selectedBlocks()
}; };
} }
this.process(actions); this.process(actions);
}, },
indent: function() { indent: function() {
var ed = this.ed, dom = ed.dom, indented = []; var ed = this.ed, dom = ed.dom, indented = [];
function createWrapItem(element) { function createWrapItem(element) {
var wrapItem = dom.create('li', { style: 'list-style-type: none;'}); var wrapItem = dom.create('li', { style: 'list-style-type: none;'});
dom.insertAfter(wrapItem, element); dom.insertAfter(wrapItem, element);
return wrapItem; return wrapItem;
} }
function createWrapList(element) { function createWrapList(element) {
var wrapItem = createWrapItem(element), var wrapItem = createWrapItem(element),
list = dom.getParent(element, 'ol,ul'), list = dom.getParent(element, 'ol,ul'),
listType = list.tagName, listType = list.tagName,
listStyle = dom.getStyle(list, 'list-style-type'), listStyle = dom.getStyle(list, 'list-style-type'),
attrs = {}, attrs = {},
wrapList; wrapList;
if (listStyle !== '') { if (listStyle !== '') {
attrs.style = 'list-style-type: ' + listStyle + ';'; attrs.style = 'list-style-type: ' + listStyle + ';';
} }
@ -456,7 +725,7 @@
wrapItem.appendChild(wrapList); wrapItem.appendChild(wrapList);
return wrapList; return wrapList;
} }
function indentLI(element) { function indentLI(element) {
if (!hasParentInList(ed, element, indented)) { if (!hasParentInList(ed, element, indented)) {
element = splitNestedLists(element, dom); element = splitNestedLists(element, dom);
@ -467,17 +736,18 @@
indented.push(element); indented.push(element);
} }
} }
this.process({ this.process({
'LI': indentLI, 'LI': indentLI,
defaultAction: this.adjustPaddingFunction(true) defaultAction: this.adjustPaddingFunction(true),
elements: this.selectedBlocks()
}); });
}, },
outdent: function() { outdent: function(ui, elements) {
var t = this, ed = t.ed, dom = ed.dom, outdented = []; var t = this, ed = t.ed, dom = ed.dom, outdented = [];
function outdentLI(element) { function outdentLI(element) {
var listElement, targetParent, align; var listElement, targetParent, align;
if (!hasParentInList(ed, element, outdented)) { if (!hasParentInList(ed, element, outdented)) {
@ -506,20 +776,31 @@
outdented.push(element); outdented.push(element);
} }
} }
var listElements = elements && tinymce.is(elements, 'array') ? elements : this.selectedBlocks();
this.process({ this.process({
'LI': outdentLI, 'LI': outdentLI,
defaultAction: this.adjustPaddingFunction(false) defaultAction: this.adjustPaddingFunction(false),
elements: listElements
}); });
each(outdented, attemptMergeWithAdjacent); each(outdented, attemptMergeWithAdjacent);
}, },
process: function(actions) { process: function(actions) {
var t = this, sel = t.ed.selection, dom = t.ed.dom, selectedBlocks, r; var t = this, sel = t.ed.selection, dom = t.ed.dom, selectedBlocks, r;
function isEmptyElement(element) {
var excludeBrsAndBookmarks = tinymce.grep(element.childNodes, function(n) {
return !(n.nodeName === 'BR' || n.nodeName === 'SPAN' && dom.getAttrib(n, 'data-mce-type') == 'bookmark'
|| n.nodeType == 3 && (n.nodeValue == String.fromCharCode(160) || n.nodeValue == ''));
});
return excludeBrsAndBookmarks.length === 0;
}
function processElement(element) { function processElement(element) {
dom.removeClass(element, '_mce_act_on'); dom.removeClass(element, '_mce_act_on');
if (!element || element.nodeType !== 1) { if (!element || element.nodeType !== 1 || selectedBlocks.length > 1 && isEmptyElement(element)) {
return; return;
} }
element = findItemToOperateOn(element, dom); element = findItemToOperateOn(element, dom);
@ -529,18 +810,24 @@
} }
action(element); action(element);
} }
function recurse(element) { function recurse(element) {
t.splitSafeEach(element.childNodes, processElement); t.splitSafeEach(element.childNodes, processElement);
} }
function brAtEdgeOfSelection(container, offset) { function brAtEdgeOfSelection(container, offset) {
return offset >= 0 && container.hasChildNodes() && offset < container.childNodes.length && return offset >= 0 && container.hasChildNodes() && offset < container.childNodes.length &&
container.childNodes[offset].tagName === 'BR'; container.childNodes[offset].tagName === 'BR';
} }
selectedBlocks = sel.getSelectedBlocks();
if (selectedBlocks.length === 0) { function isInTable() {
selectedBlocks = [ dom.getRoot() ]; var n = sel.getNode();
var p = dom.getParent(n, 'td');
return p !== null;
} }
selectedBlocks = actions.elements;
r = sel.getRng(true); r = sel.getRng(true);
if (!r.collapsed) { if (!r.collapsed) {
if (brAtEdgeOfSelection(r.endContainer, r.endOffset - 1)) { if (brAtEdgeOfSelection(r.endContainer, r.endOffset - 1)) {
@ -552,15 +839,30 @@
sel.setRng(r); sel.setRng(r);
} }
} }
if (tinymce.isIE8) {
// append a zero sized nbsp so that caret is restored correctly using bookmark
var s = t.ed.selection.getNode();
if (s.tagName === 'LI' && !(s.parentNode.lastChild === s)) {
var i = t.ed.getDoc().createTextNode('\uFEFF');
s.appendChild(i);
}
}
bookmark = sel.getBookmark(); bookmark = sel.getBookmark();
actions.OL = actions.UL = recurse; actions.OL = actions.UL = recurse;
t.splitSafeEach(selectedBlocks, processElement); t.splitSafeEach(selectedBlocks, processElement);
sel.moveToBookmark(bookmark); sel.moveToBookmark(bookmark);
bookmark = null; bookmark = null;
// Avoids table or image handles being left behind in Firefox.
t.ed.execCommand('mceRepaint'); // we avoid doing repaint in a table as this will move the caret out of the table in Firefox 3.6
if (!isInTable()) {
// Avoids table or image handles being left behind in Firefox.
t.ed.execCommand('mceRepaint');
}
}, },
splitSafeEach: function(elements, f) { splitSafeEach: function(elements, f) {
if (tinymce.isGecko && (/Firefox\/[12]\.[0-9]/.test(navigator.userAgent) || if (tinymce.isGecko && (/Firefox\/[12]\.[0-9]/.test(navigator.userAgent) ||
/Firefox\/3\.[0-4]/.test(navigator.userAgent))) { /Firefox\/3\.[0-4]/.test(navigator.userAgent))) {
@ -569,7 +871,7 @@
each(elements, f); each(elements, f);
} }
}, },
classBasedEach: function(elements, f) { classBasedEach: function(elements, f) {
var dom = this.ed.dom, nodes, element; var dom = this.ed.dom, nodes, element;
// Mark nodes // Mark nodes
@ -584,7 +886,7 @@
nodes = dom.select('._mce_act_on'); nodes = dom.select('._mce_act_on');
} }
}, },
adjustPaddingFunction: function(isIndent) { adjustPaddingFunction: function(isIndent) {
var indentAmount, indentUnits, ed = this.ed; var indentAmount, indentUnits, ed = this.ed;
indentAmount = ed.settings.indentation; indentAmount = ed.settings.indentation;
@ -602,7 +904,13 @@
ed.dom.setStyle(element, 'margin-left', newIndentAmount > 0 ? newIndentAmount + indentUnits : ''); ed.dom.setStyle(element, 'margin-left', newIndentAmount > 0 ? newIndentAmount + indentUnits : '');
}; };
}, },
selectedBlocks: function() {
var ed = this.ed
var selectedBlocks = ed.selection.getSelectedBlocks();
return selectedBlocks.length == 0 ? [ ed.dom.getRoot() ] : selectedBlocks;
},
getInfo: function() { getInfo: function() {
return { return {
longname : 'Lists', longname : 'Lists',

File diff suppressed because one or more lines are too long

View File

@ -23,7 +23,9 @@
["Java", "8ad9c840-044e-11d1-b3e9-00805f499d93", "application/x-java-applet", "http://java.sun.com/products/plugin/autodl/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"], ["Java", "8ad9c840-044e-11d1-b3e9-00805f499d93", "application/x-java-applet", "http://java.sun.com/products/plugin/autodl/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"],
["Silverlight", "dfeaf541-f3e1-4c24-acac-99c30715084a", "application/x-silverlight-2"], ["Silverlight", "dfeaf541-f3e1-4c24-acac-99c30715084a", "application/x-silverlight-2"],
["Iframe"], ["Iframe"],
["Video"] ["Video"],
["EmbeddedAudio"],
["Audio"]
]; ];
function toArray(obj) { function toArray(obj) {
@ -86,11 +88,12 @@
"silverlight=xap;" + "silverlight=xap;" +
"flash=swf,flv;" + "flash=swf,flv;" +
"shockwave=dcr;" + "shockwave=dcr;" +
"quicktime=mov,qt,mpg,mp3,mpeg;" + "quicktime=mov,qt,mpg,mpeg;" +
"shockwave=dcr;" + "shockwave=dcr;" +
"windowsmedia=avi,wmv,wm,asf,asx,wmx,wvx;" + "windowsmedia=avi,wmv,wm,asf,asx,wmx,wvx;" +
"realmedia=rm,ra,ram;" + "realmedia=rm,ra,ram;" +
"java=jar" "java=jar;" +
"audio=mp3,ogg"
).split(';'), function(item) { ).split(';'), function(item) {
var i, extensions, type; var i, extensions, type;
@ -155,17 +158,20 @@
img = ed.selection.getNode(); img = ed.selection.getNode();
if (isMediaImg(img)) { if (isMediaImg(img)) {
data = JSON.parse(ed.dom.getAttrib(img, 'data-mce-json')); data = ed.dom.getAttrib(img, 'data-mce-json');
if (data) {
data = JSON.parse(data);
// Add some extra properties to the data object // Add some extra properties to the data object
tinymce.each(rootAttributes, function(name) { tinymce.each(rootAttributes, function(name) {
var value = ed.dom.getAttrib(img, name); var value = ed.dom.getAttrib(img, name);
if (value) if (value)
data[name] = value; data[name] = value;
}); });
data.type = self.getType(img.className).name.toLowerCase(); data.type = self.getType(img.className).name.toLowerCase();
}
} }
if (!data) { if (!data) {
@ -245,13 +251,15 @@
id : data.id, id : data.id,
style : data.style, style : data.style,
align : data.align, align : data.align,
hspace : data.hspace,
vspace : data.vspace,
src : self.editor.theme.url + '/img/trans.gif', src : self.editor.theme.url + '/img/trans.gif',
'class' : 'mceItemMedia mceItem' + self.getType(data.type).name, 'class' : 'mceItemMedia mceItem' + self.getType(data.type).name,
'data-mce-json' : JSON.serialize(data, "'") 'data-mce-json' : JSON.serialize(data, "'")
}); });
img.width = data.width || "320"; img.width = data.width || (data.type == 'audio' ? "300" : "320");
img.height = data.height || "240"; img.height = data.height || (data.type == 'audio' ? "32" : "240");
return img; return img;
}, },
@ -260,7 +268,7 @@
* Converts the JSON data object to a HTML string. * Converts the JSON data object to a HTML string.
*/ */
dataToHtml : function(data, force_absolute) { dataToHtml : function(data, force_absolute) {
return this.editor.serializer.serialize(this.dataToImg(data, force_absolute), {force_absolute : force_absolute}); return this.editor.serializer.serialize(this.dataToImg(data, force_absolute), {forced_root_block : '', force_absolute : force_absolute});
}, },
/** /**
@ -320,7 +328,7 @@
imgToObject : function(node, args) { imgToObject : function(node, args) {
var self = this, editor = self.editor, video, object, embed, iframe, name, value, data, var self = this, editor = self.editor, video, object, embed, iframe, name, value, data,
source, sources, params, param, typeItem, i, item, mp4Source, replacement, source, sources, params, param, typeItem, i, item, mp4Source, replacement,
posterSrc, style; posterSrc, style, audio;
// Adds the flash player // Adds the flash player
function addPlayer(video_src, poster_src) { function addPlayer(video_src, poster_src) {
@ -363,7 +371,11 @@
} }
}; };
data = JSON.parse(node.attr('data-mce-json')); data = node.attr('data-mce-json');
if (!data)
return;
data = JSON.parse(data);
typeItem = this.getType(node.attr('class')); typeItem = this.getType(node.attr('class'));
style = node.attr('data-mce-style') style = node.attr('data-mce-style')
@ -456,6 +468,57 @@
data.params.src = ''; data.params.src = '';
} }
// Add HTML5 audio element
if (typeItem.name === 'Audio' && data.video.sources[0]) {
// Create new object element
audio = new Node('audio', 1).attr(tinymce.extend({
id : node.attr('id'),
width: node.attr('width'),
height: node.attr('height'),
style : style
}, data.video.attrs));
// Get poster source and use that for flash fallback
if (data.video.attrs)
posterSrc = data.video.attrs.poster;
sources = data.video.sources = toArray(data.video.sources);
if (!sources[0].type) {
audio.attr('src', sources[0].src);
sources.splice(0, 1);
}
for (i = 0; i < sources.length; i++) {
source = new Node('source', 1).attr(sources[i]);
source.shortEnded = true;
audio.append(source);
}
data.params.src = '';
}
if (typeItem.name === 'EmbeddedAudio') {
embed = new Node('embed', 1);
embed.shortEnded = true;
embed.attr({
id: node.attr('id'),
width: node.attr('width'),
height: node.attr('height'),
style : style,
type: node.attr('type')
});
for (name in data.params)
embed.attr(name, data.params[name]);
tinymce.each(rootAttributes, function(name) {
if (data[name] && name != 'type')
embed.attr(name, data[name]);
});
data.params.src = '';
}
// Do we have a params src then we can generate object // Do we have a params src then we can generate object
if (data.params.src) { if (data.params.src) {
// Is flv movie add player for it // Is flv movie add player for it
@ -474,8 +537,13 @@
}); });
tinymce.each(rootAttributes, function(name) { tinymce.each(rootAttributes, function(name) {
if (data[name] && name != 'type') var value = data[name];
object.attr(name, data[name]);
if (name == 'class' && value)
value = value.replace(/mceItem.+ ?/g, '');
if (value && name != 'type')
object.attr(name, value);
}); });
// Add params // Add params
@ -548,8 +616,19 @@
} }
} }
if (video || object) if (audio) {
node.replace(video || object); // Insert raw HTML
if (data.video_html) {
value = new Node('#text', 3);
value.raw = true;
value.value = data.video_html;
audio.append(value);
}
}
var n = video || audio || object || embed;
if (n)
node.replace(n);
else else
node.remove(); node.remove();
}, },
@ -567,7 +646,8 @@
var object, embed, video, iframe, img, name, id, width, height, style, i, html, var object, embed, video, iframe, img, name, id, width, height, style, i, html,
param, params, source, sources, data, type, lookup = this.lookup, param, params, source, sources, data, type, lookup = this.lookup,
matches, attrs, urlConverter = this.editor.settings.url_converter, matches, attrs, urlConverter = this.editor.settings.url_converter,
urlConverterScope = this.editor.settings.url_converter_scope; urlConverterScope = this.editor.settings.url_converter_scope,
hspace, vspace, align, bgcolor;
function getInnerHTML(node) { function getInnerHTML(node) {
return new tinymce.html.Serializer({ return new tinymce.html.Serializer({
@ -576,6 +656,15 @@
}).serialize(node); }).serialize(node);
}; };
function lookupAttribute(o, attr) {
return lookup[(o.attr(attr) || '').toLowerCase()];
}
function lookupExtension(src) {
var ext = src.replace(/^.*\.([^.]+)$/, '$1');
return lookup[ext.toLowerCase() || ''];
}
// If node isn't in document // If node isn't in document
if (!node.parent) if (!node.parent)
return; return;
@ -608,7 +697,7 @@
// Video element // Video element
name = node.name; name = node.name;
if (name === 'video') { if (name === 'video' || name == 'audio') {
video = node; video = node;
object = node.getAll('object')[0]; object = node.getAll('object')[0];
embed = node.getAll('embed')[0]; embed = node.getAll('embed')[0];
@ -624,7 +713,7 @@
source = node.attr('src'); source = node.attr('src');
if (source) if (source)
data.video.sources.push({src : urlConverter.call(urlConverterScope, source, 'src', 'video')}); data.video.sources.push({src : urlConverter.call(urlConverterScope, source, 'src', node.name)});
// Get all sources // Get all sources
sources = video.getAll("source"); sources = video.getAll("source");
@ -640,7 +729,7 @@
// Convert the poster URL // Convert the poster URL
if (attrs.poster) if (attrs.poster)
attrs.poster = urlConverter.call(urlConverterScope, attrs.poster, 'poster', 'video'); attrs.poster = urlConverter.call(urlConverterScope, attrs.poster, 'poster', node.name);
} }
// Object element // Object element
@ -665,6 +754,11 @@
height = height || object.attr('height'); height = height || object.attr('height');
style = style || object.attr('style'); style = style || object.attr('style');
id = id || object.attr('id'); id = id || object.attr('id');
hspace = hspace || object.attr('hspace');
vspace = vspace || object.attr('vspace');
align = align || object.attr('align');
bgcolor = bgcolor || object.attr('bgcolor');
data.name = object.attr('name');
// Get all object params // Get all object params
params = object.getAll("param"); params = object.getAll("param");
@ -685,6 +779,10 @@
height = height || embed.attr('height'); height = height || embed.attr('height');
style = style || embed.attr('style'); style = style || embed.attr('style');
id = id || embed.attr('id'); id = id || embed.attr('id');
hspace = hspace || embed.attr('hspace');
vspace = vspace || embed.attr('vspace');
align = align || embed.attr('align');
bgcolor = bgcolor || embed.attr('bgcolor');
// Get all embed attributes // Get all embed attributes
for (name in embed.attributes.map) { for (name in embed.attributes.map) {
@ -699,6 +797,10 @@
height = iframe.attr('height'); height = iframe.attr('height');
style = style || iframe.attr('style'); style = style || iframe.attr('style');
id = iframe.attr('id'); id = iframe.attr('id');
hspace = iframe.attr('hspace');
vspace = iframe.attr('vspace');
align = iframe.attr('align');
bgcolor = iframe.attr('bgcolor');
tinymce.each(rootAttributes, function(name) { tinymce.each(rootAttributes, function(name) {
img.attr(name, iframe.attr(name)); img.attr(name, iframe.attr(name));
@ -721,14 +823,23 @@
if (data.params.src) if (data.params.src)
data.params.src = urlConverter.call(urlConverterScope, data.params.src, 'src', 'object'); data.params.src = urlConverter.call(urlConverterScope, data.params.src, 'src', 'object');
if (video) if (video) {
type = lookup.video.name; if (node.name === 'video')
type = lookup.video.name;
else if (node.name === 'audio')
type = lookup.audio.name;
}
if (object && !type) if (object && !type)
type = (lookup[(object.attr('clsid') || '').toLowerCase()] || lookup[(object.attr('type') || '').toLowerCase()] || {}).name; type = (lookupAttribute(object, 'clsid') || lookupAttribute(object, 'classid') || lookupAttribute(object, 'type') || {}).name;
if (embed && !type) if (embed && !type)
type = (lookup[(embed.attr('type') || '').toLowerCase()] || {}).name; type = (lookupAttribute(embed, 'type') || lookupExtension(data.params.src) || {}).name;
// for embedded audio we preserve the original specified type
if (embed && type == 'EmbeddedAudio') {
data.params.type = embed.attr('type');
}
// Replace the video/object/embed element with a placeholder image containing the data // Replace the video/object/embed element with a placeholder image containing the data
node.replace(img); node.replace(img);
@ -753,13 +864,22 @@
data.video_html = html; data.video_html = html;
} }
data.hspace = hspace;
data.vspace = vspace;
data.align = align;
data.bgcolor = bgcolor;
// Set width/height of placeholder // Set width/height of placeholder
img.attr({ img.attr({
id : id, id : id,
'class' : 'mceItemMedia mceItem' + (type || 'Flash'), 'class' : 'mceItemMedia mceItem' + (type || 'Flash'),
style : style, style : style,
width : width || "320", width : width || (node.name == 'audio' ? "300" : "320"),
height : height || "240", height : height || (node.name == 'audio' ? "32" : "240"),
hspace : hspace,
vspace : vspace,
align : align,
bgcolor : bgcolor,
"data-mce-json" : JSON.serialize(data, "'") "data-mce-json" : JSON.serialize(data, "'")
}); });
} }
@ -767,4 +887,4 @@
// Register plugin // Register plugin
tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin); tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin);
})(); })();

View File

@ -8,6 +8,33 @@
return document.getElementById(id); return document.getElementById(id);
} }
function clone(obj) {
var i, len, copy, attr;
if (null == obj || "object" != typeof obj)
return obj;
// Handle Array
if ('length' in obj) {
copy = [];
for (i = 0, len = obj.length; i < len; ++i) {
copy[i] = clone(obj[i]);
}
return copy;
}
// Handle Object
copy = {};
for (attr in obj) {
if (obj.hasOwnProperty(attr))
copy[attr] = clone(obj[attr]);
}
return copy;
}
function getVal(id) { function getVal(id) {
var elm = get(id); var elm = get(id);
@ -20,17 +47,18 @@
return elm.value; return elm.value;
} }
function setVal(id, value) { function setVal(id, value, name) {
if (typeof(value) != 'undefined') { if (typeof(value) != 'undefined') {
var elm = get(id); var elm = get(id);
if (elm.nodeName == "SELECT") if (elm.nodeName == "SELECT")
selectByValue(document.forms[0], id, value); selectByValue(document.forms[0], id, value);
else if (elm.type == "checkbox") { else if (elm.type == "checkbox") {
if (typeof(value) == 'string') if (typeof(value) == 'string') {
elm.checked = value.toLowerCase() === 'true' ? true : false; value = value.toLowerCase();
else value = (!name && value === 'true') || (name && value === name.toLowerCase());
elm.checked = !!value; }
elm.checked = !!value;
} else } else
elm.value = value; elm.value = value;
} }
@ -38,19 +66,21 @@
window.Media = { window.Media = {
init : function() { init : function() {
var html, editor; var html, editor, self = this;
this.editor = editor = tinyMCEPopup.editor; self.editor = editor = tinyMCEPopup.editor;
// Setup file browsers and color pickers // Setup file browsers and color pickers
get('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media'); get('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media');
get('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','quicktime_qtsrc','media','media'); get('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','quicktime_qtsrc','media','media');
get('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); get('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
get('video_altsource1_filebrowser').innerHTML = getBrowserHTML('filebrowser_altsource1','video_altsource1','media','media'); get('video_altsource1_filebrowser').innerHTML = getBrowserHTML('video_filebrowser_altsource1','video_altsource1','media','media');
get('video_altsource2_filebrowser').innerHTML = getBrowserHTML('filebrowser_altsource2','video_altsource2','media','media'); get('video_altsource2_filebrowser').innerHTML = getBrowserHTML('video_filebrowser_altsource2','video_altsource2','media','media');
get('audio_altsource1_filebrowser').innerHTML = getBrowserHTML('audio_filebrowser_altsource1','audio_altsource1','media','media');
get('audio_altsource2_filebrowser').innerHTML = getBrowserHTML('audio_filebrowser_altsource2','audio_altsource2','media','media');
get('video_poster_filebrowser').innerHTML = getBrowserHTML('filebrowser_poster','video_poster','media','image'); get('video_poster_filebrowser').innerHTML = getBrowserHTML('filebrowser_poster','video_poster','media','image');
html = this.getMediaListHTML('medialist', 'src', 'media', 'media'); html = self.getMediaListHTML('medialist', 'src', 'media', 'media');
if (html == "") if (html == "")
get("linklistrow").style.display = 'none'; get("linklistrow").style.display = 'none';
else else
@ -59,18 +89,29 @@
if (isVisible('filebrowser')) if (isVisible('filebrowser'))
get('src').style.width = '230px'; get('src').style.width = '230px';
if (isVisible('filebrowser_altsource1')) if (isVisible('video_filebrowser_altsource1'))
get('video_altsource1').style.width = '220px'; get('video_altsource1').style.width = '220px';
if (isVisible('filebrowser_altsource2')) if (isVisible('video_filebrowser_altsource2'))
get('video_altsource2').style.width = '220px'; get('video_altsource2').style.width = '220px';
if (isVisible('audio_filebrowser_altsource1'))
get('audio_altsource1').style.width = '220px';
if (isVisible('audio_filebrowser_altsource2'))
get('audio_altsource2').style.width = '220px';
if (isVisible('filebrowser_poster')) if (isVisible('filebrowser_poster'))
get('video_poster').style.width = '220px'; get('video_poster').style.width = '220px';
this.data = tinyMCEPopup.getWindowArg('data'); editor.dom.setOuterHTML(get('media_type'), self.getMediaTypeHTML(editor));
this.dataToForm();
this.preview(); self.setDefaultDialogSettings(editor);
self.data = clone(tinyMCEPopup.getWindowArg('data'));
self.dataToForm();
self.preview();
updateColor('bgcolor_pick', 'bgcolor');
}, },
insert : function() { insert : function() {
@ -88,7 +129,7 @@
}, },
moveStates : function(to_form, field) { moveStates : function(to_form, field) {
var data = this.data, editor = this.editor, data = this.data, var data = this.data, editor = this.editor,
mediaPlugin = editor.plugins.media, ext, src, typeInfo, defaultStates, src; mediaPlugin = editor.plugins.media, ext, src, typeInfo, defaultStates, src;
defaultStates = { defaultStates = {
@ -136,7 +177,7 @@
if (type == 'global') if (type == 'global')
list = data; list = data;
else if (type == 'video') { else if (type == 'video' || type == 'audio') {
list = data.video.attrs; list = data.video.attrs;
if (!list && !to_form) if (!list && !to_form)
@ -146,12 +187,12 @@
if (list) { if (list) {
if (to_form) { if (to_form) {
setVal(formItemName, list[name]); setVal(formItemName, list[name], type == 'video' || type == 'audio' ? name : '');
} else { } else {
delete list[name]; delete list[name];
value = getVal(formItemName); value = getVal(formItemName);
if (type == 'video' && value === true) if ((type == 'video' || type == 'audio') && value === true)
value = name; value = name;
if (defaultStates[formItemName]) { if (defaultStates[formItemName]) {
@ -184,7 +225,7 @@
setVal('media_type', data.type); setVal('media_type', data.type);
} }
if (data.type == "video") { if (data.type == "video" || data.type == "audio") {
if (!data.video.sources) if (!data.video.sources)
data.video.sources = []; data.video.sources = [];
@ -194,11 +235,13 @@
// Hide all fieldsets and show the one active // Hide all fieldsets and show the one active
get('video_options').style.display = 'none'; get('video_options').style.display = 'none';
get('audio_options').style.display = 'none';
get('flash_options').style.display = 'none'; get('flash_options').style.display = 'none';
get('quicktime_options').style.display = 'none'; get('quicktime_options').style.display = 'none';
get('shockwave_options').style.display = 'none'; get('shockwave_options').style.display = 'none';
get('windowsmedia_options').style.display = 'none'; get('windowsmedia_options').style.display = 'none';
get('realmedia_options').style.display = 'none'; get('realmedia_options').style.display = 'none';
get('embeddedaudio_options').style.display = 'none';
if (get(data.type + '_options')) if (get(data.type + '_options'))
get(data.type + '_options').style.display = 'block'; get(data.type + '_options').style.display = 'block';
@ -210,7 +253,9 @@
setOptions('shockwave', 'sound,progress,autostart,swliveconnect,swvolume,swstretchstyle,swstretchhalign,swstretchvalign'); setOptions('shockwave', 'sound,progress,autostart,swliveconnect,swvolume,swstretchstyle,swstretchhalign,swstretchvalign');
setOptions('windowsmedia', 'autostart,enabled,enablecontextmenu,fullscreen,invokeurls,mute,stretchtofit,windowlessvideo,balance,baseurl,captioningid,currentmarker,currentposition,defaultframe,playcount,rate,uimode,volume'); setOptions('windowsmedia', 'autostart,enabled,enablecontextmenu,fullscreen,invokeurls,mute,stretchtofit,windowlessvideo,balance,baseurl,captioningid,currentmarker,currentposition,defaultframe,playcount,rate,uimode,volume');
setOptions('realmedia', 'autostart,loop,autogotourl,center,imagestatus,maintainaspect,nojava,prefetch,shuffle,console,controls,numloop,scriptcallbacks'); setOptions('realmedia', 'autostart,loop,autogotourl,center,imagestatus,maintainaspect,nojava,prefetch,shuffle,console,controls,numloop,scriptcallbacks');
setOptions('video', 'poster,autoplay,loop,preload,controls'); setOptions('video', 'poster,autoplay,loop,muted,preload,controls');
setOptions('audio', 'autoplay,loop,preload,controls');
setOptions('embeddedaudio', 'autoplay,loop,controls');
setOptions('global', 'id,name,vspace,hspace,bgcolor,align,width,height'); setOptions('global', 'id,name,vspace,hspace,bgcolor,align,width,height');
if (to_form) { if (to_form) {
@ -225,12 +270,23 @@
src = data.video.sources[2]; src = data.video.sources[2];
if (src) if (src)
setVal('video_altsource2', src.src); setVal('video_altsource2', src.src);
} else if (data.type == 'audio') {
if (data.video.sources[0])
setVal('src', data.video.sources[0].src);
src = data.video.sources[1];
if (src)
setVal('audio_altsource1', src.src);
src = data.video.sources[2];
if (src)
setVal('audio_altsource2', src.src);
} else { } else {
// Check flash vars // Check flash vars
if (data.type == 'flash') { if (data.type == 'flash') {
tinymce.each(editor.getParam('flash_video_player_flashvars', {url : '$url', poster : '$poster'}), function(value, name) { tinymce.each(editor.getParam('flash_video_player_flashvars', {url : '$url', poster : '$poster'}), function(value, name) {
if (value == '$url') if (value == '$url')
data.params.src = parseQueryParams(data.params.flashvars)[name] || data.params.src; data.params.src = parseQueryParams(data.params.flashvars)[name] || data.params.src || '';
}); });
} }
@ -238,7 +294,18 @@
} }
} else { } else {
src = getVal("src"); src = getVal("src");
// YouTube *NEW*
if (src.match(/youtu.be\/[a-z1-9.-_]+/)) {
data.width = 425;
data.height = 350;
data.params.frameborder = '0';
data.type = 'iframe';
src = 'http://www.youtube.com/embed/' + src.match(/youtu.be\/([a-z1-9.-_]+)/)[1];
setVal('src', src);
setVal('media_type', data.type);
}
// YouTube // YouTube
if (src.match(/youtube.com(.+)v=([^&]+)/)) { if (src.match(/youtube.com(.+)v=([^&]+)/)) {
data.width = 425; data.width = 425;
@ -273,12 +340,25 @@
src = getVal("video_altsource2"); src = getVal("video_altsource2");
if (src) if (src)
data.video.sources[2] = {src : src}; data.video.sources[2] = {src : src};
} else if (data.type == 'audio') {
if (!data.video.sources)
data.video.sources = [];
data.video.sources[0] = {src : src};
src = getVal("audio_altsource1");
if (src)
data.video.sources[1] = {src : src};
src = getVal("audio_altsource2");
if (src)
data.video.sources[2] = {src : src};
} else } else
data.params.src = src; data.params.src = src;
// Set default size // Set default size
setVal('width', data.width || 320); setVal('width', data.width || (data.type == 'audio' ? 300 : 320));
setVal('height', data.height || 240); setVal('height', data.height || (data.type == 'audio' ? 32 : 240));
} }
}, },
@ -296,7 +376,7 @@
this.panel = 'source'; this.panel = 'source';
} else { } else {
if (this.panel == 'source') { if (this.panel == 'source') {
this.data = this.editor.plugins.media.htmlToData(getVal('source')); this.data = clone(this.editor.plugins.media.htmlToData(getVal('source')));
this.dataToForm(); this.dataToForm();
this.panel = ''; this.panel = '';
} }
@ -307,16 +387,16 @@
}, },
beforeResize : function() { beforeResize : function() {
this.width = parseInt(getVal('width') || "320", 10); this.width = parseInt(getVal('width') || (this.data.type == 'audio' ? "300" : "320"), 10);
this.height = parseInt(getVal('height') || "240", 10); this.height = parseInt(getVal('height') || (this.data.type == 'audio' ? "32" : "240"), 10);
}, },
changeSize : function(type) { changeSize : function(type) {
var width, height, scale, size; var width, height, scale, size;
if (get('constrain').checked) { if (get('constrain').checked) {
width = parseInt(getVal('width') || "320", 10); width = parseInt(getVal('width') || (this.data.type == 'audio' ? "300" : "320"), 10);
height = parseInt(getVal('height') || "240", 10); height = parseInt(getVal('height') || (this.data.type == 'audio' ? "32" : "240"), 10);
if (type == 'width') { if (type == 'width') {
this.height = Math.round((width / this.width) * height); this.height = Math.round((width / this.width) * height);
@ -344,6 +424,36 @@
} }
return ""; return "";
},
getMediaTypeHTML : function(editor) {
function option(media_type){
return '<option value="'+media_type+'">'+tinyMCEPopup.editor.translate("media_dlg."+media_type)+'</option>'
}
var html = "";
html += '<select id="media_type" name="media_type" onchange="Media.formToData(\'type\');">';
html += option("video");
html += option("audio");
html += option("flash");
html += option("quicktime");
html += option("shockwave");
html += option("windowsmedia");
html += option("realmedia");
html += option("iframe");
if (editor.getParam('media_embedded_audio', false)) {
html += option('embeddedaudio');
}
html += '</select>';
return html;
},
setDefaultDialogSettings : function(editor) {
var defaultDialogSettings = editor.getParam("media_dialog_defaults", {});
tinymce.each(defaultDialogSettings, function(v, k) {
setVal(k, v);
});
} }
}; };
@ -351,4 +461,4 @@
tinyMCEPopup.onInit.add(function() { tinyMCEPopup.onInit.add(function() {
Media.init(); Media.init();
}); });
})(); })();

View File

@ -1,109 +1 @@
tinyMCE.addI18n('en.media_dlg',{ tinyMCE.addI18n('en.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert/Edit Embedded Media","align_top_left":"Top Left","align_center":"Center","align_left":"Left","align_bottom":"Bottom","align_right":"Right","align_top":"Top","qt_stream_warn":"Streamed RTSP resources should be added to the QT Source field under the Advanced tab.\nYou should also add a non-streamed version to the Source field.",qtsrc:"QT Source",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch Style",scriptcallbacks:"Script Callbacks","align_top_right":"Top Right",uimode:"UI Mode",rate:"Rate",playcount:"Play Count",defaultframe:"Default Frame",currentposition:"Current Position",currentmarker:"Current Marker",captioningid:"Captioning ID",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless Video",stretchtofit:"Stretch to Fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Full Screen",enabled:"Enabled",autostart:"Auto Start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke Speed",href:"HREF",endtime:"End Time",starttime:"Start Time",enablejavascript:"Enable JavaScript",correction:"No Correction",targetcache:"Target Cache",playeveryframe:"Play Every Frame",kioskmode:"Kiosk Mode",controller:"Controller",menu:"Show Menu",loop:"Loop",play:"Auto Play",hspace:"H-Space",vspace:"V-Space","class_name":"Class",name:"Name",id:"ID",type:"Type",size:"Dimensions",preview:"Preview","constrain_proportions":"Constrain Proportions",controls:"Controls",numloop:"Num Loops",console:"Console",cache:"Cache",autohref:"Auto HREF",liveconnect:"SWLiveConnect",flashvars:"Flash Vars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No Java",maintainaspect:"Maintain Aspect",imagestatus:"Image Status",center:"Center",autogotourl:"Auto Goto URL","shockwave_options":"Shockwave Options","rmp_options":"Real Media Player Options","wmp_options":"Windows Media Player Options","qt_options":"QuickTime Options","flash_options":"Flash Options",hidden:"Hidden","align_bottom_left":"Bottom Left","align_bottom_right":"Bottom Right","html5_video_options":"HTML5 Video Options",altsource1:"Alternative source 1",altsource2:"Alternative source 2",preload:"Preload",poster:"Poster",source:"Source","html5_audio_options":"Audio Options","preload_none":"Don\'t Preload","preload_metadata":"Preload video metadata","preload_auto":"Let user\'s browser decide", "embedded_audio_options":"Embedded Audio Options", video:"HTML5 Video", audio:"HTML5 Audio", flash:"Flash", quicktime:"QuickTime", shockwave:"Shockwave", windowsmedia:"Windows Media", realmedia:"Real Media", iframe:"Iframe", embeddedaudio:"Embedded Audio" });
title:"Insert / edit embedded media",
general:"General",
advanced:"Advanced",
file:"File/URL",
list:"List",
size:"Dimensions",
preview:"Preview",
constrain_proportions:"Constrain proportions",
type:"Type",
id:"Id",
name:"Name",
class_name:"Class",
vspace:"V-Space",
hspace:"H-Space",
play:"Auto play",
loop:"Loop",
menu:"Show menu",
quality:"Quality",
scale:"Scale",
align:"Align",
salign:"SAlign",
wmode:"WMode",
bgcolor:"Background",
base:"Base",
flashvars:"Flashvars",
liveconnect:"SWLiveConnect",
autohref:"AutoHREF",
cache:"Cache",
hidden:"Hidden",
controller:"Controller",
kioskmode:"Kiosk mode",
playeveryframe:"Play every frame",
targetcache:"Target cache",
correction:"No correction",
enablejavascript:"Enable JavaScript",
starttime:"Start time",
endtime:"End time",
href:"Href",
qtsrcchokespeed:"Choke speed",
target:"Target",
volume:"Volume",
autostart:"Auto start",
enabled:"Enabled",
fullscreen:"Fullscreen",
invokeurls:"Invoke URLs",
mute:"Mute",
stretchtofit:"Stretch to fit",
windowlessvideo:"Windowless video",
balance:"Balance",
baseurl:"Base URL",
captioningid:"Captioning id",
currentmarker:"Current marker",
currentposition:"Current position",
defaultframe:"Default frame",
playcount:"Play count",
rate:"Rate",
uimode:"UI Mode",
flash_options:"Flash options",
qt_options:"Quicktime options",
wmp_options:"Windows media player options",
rmp_options:"Real media player options",
shockwave_options:"Shockwave options",
autogotourl:"Auto goto URL",
center:"Center",
imagestatus:"Image status",
maintainaspect:"Maintain aspect",
nojava:"No java",
prefetch:"Prefetch",
shuffle:"Shuffle",
console:"Console",
numloop:"Num loops",
controls:"Controls",
scriptcallbacks:"Script callbacks",
swstretchstyle:"Stretch style",
swstretchhalign:"Stretch H-Align",
swstretchvalign:"Stretch V-Align",
sound:"Sound",
progress:"Progress",
qtsrc:"QT Src",
qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",
align_top:"Top",
align_right:"Right",
align_bottom:"Bottom",
align_left:"Left",
align_center:"Center",
align_top_left:"Top left",
align_top_right:"Top right",
align_bottom_left:"Bottom left",
align_bottom_right:"Bottom right",
flv_options:"Flash video options",
flv_scalemode:"Scale mode",
flv_buffer:"Buffer",
flv_starttime:"Start time",
flv_defaultvolume:"Default volumne",
flv_hiddengui:"Hidden GUI",
flv_autostart:"Auto start",
flv_loop:"Loop",
flv_showscalemodes:"Show scale modes",
flv_smoothvideo:"Smooth video",
flv_jscallback:"JS Callback",
html5_video_options:"HTML5 Video Options",
altsource1:"Alternative source 1",
altsource2:"Alternative source 2",
preload:"Preload",
poster:"Poster",
source:"Source"
});

View File

@ -29,15 +29,7 @@
<tr> <tr>
<td><label for="media_type">{#media_dlg.type}</label></td> <td><label for="media_type">{#media_dlg.type}</label></td>
<td> <td>
<select id="media_type" name="media_type" onchange="Media.formToData('type');"> <select id="media_type"></select>
<option value="video">HTML5 Video</option>
<option value="flash">Flash</option>
<option value="quicktime">QuickTime</option>
<option value="shockwave">Shockwave</option>
<option value="windowsmedia">Windows Media</option>
<option value="realmedia">Real Media</option>
<option value="iframe">Iframe</option>
</select>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -159,6 +151,17 @@
</table> </table>
</td> </td>
</tr> </tr>
<tr>
<td><label for="video_preload">{#media_dlg.preload}</label></td>
<td>
<select id="video_preload" name="video_preload" onchange="Media.formToData();">
<option value="none">{#media_dlg.preload_none}</option>
<option value="metadata">{#media_dlg.preload_metadata}</option>
<option value="auto">{#media_dlg.preload_auto}</option>
</select>
</td>
</tr>
</table> </table>
<table role="presentation" border="0" cellpadding="4" cellspacing="0"> <table role="presentation" border="0" cellpadding="4" cellspacing="0">
@ -175,19 +178,19 @@
<td> <td>
<table role="presentation" border="0" cellpadding="0" cellspacing="0"> <table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr> <tr>
<td><input type="checkbox" class="checkbox" id="video_loop" name="video_loop" onchange="Media.formToData();" /></td> <td><input type="checkbox" class="checkbox" id="video_muted" name="video_muted" onchange="Media.formToData();" /></td>
<td><label for="video_loop">{#media_dlg.loop}</label></td> <td><label for="video_muted">{#media_dlg.mute}</label></td>
</tr> </tr>
</table> </table>
</td> </td>
<td> <td>
<table role="presentation" border="0" cellpadding="0" cellspacing="0"> <table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr> <tr>
<td><input type="checkbox" class="checkbox" id="video_preload" name="video_preload" onchange="Media.formToData();" /></td> <td><input type="checkbox" class="checkbox" id="video_loop" name="video_loop" onchange="Media.formToData();" /></td>
<td><label for="video_preload">{#media_dlg.preload}</label></td> <td><label for="video_loop">{#media_dlg.loop}</label></td>
</tr> </tr>
</table> </table>
</td> </td>
<td> <td>
@ -202,6 +205,113 @@
</table> </table>
</fieldset> </fieldset>
<fieldset id="embeddedaudio_options">
<legend>{#media_dlg.embedded_audio_options}</legend>
<table role="presentation" border="0" cellpadding="4" cellspacing="0">
<tr>
<td>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td><input type="checkbox" class="checkbox" id="embeddedaudio_autoplay" name="audio_autoplay" onchange="Media.formToData();" /></td>
<td><label for="audio_autoplay">{#media_dlg.play}</label></td>
</tr>
</table>
</td>
<td>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td><input type="checkbox" class="checkbox" id="embeddedaudio_loop" name="audio_loop" onchange="Media.formToData();" /></td>
<td><label for="audio_loop">{#media_dlg.loop}</label></td>
</tr>
</table>
</td>
<td>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td><input type="checkbox" class="checkbox" id="embeddedaudio_controls" name="audio_controls" onchange="Media.formToData();" /></td>
<td><label for="audio_controls">{#media_dlg.controls}</label></td>
</tr>
</table>
</td>
</tr>
</table>
</fieldset>
<fieldset id="audio_options">
<legend>{#media_dlg.html5_audio_options}</legend>
<table role="presentation">
<tr>
<td><label for="audio_altsource1">{#media_dlg.altsource1}</label></td>
<td>
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><input type="text" id="audio_altsource1" name="audio_altsource1" onchange="Media.formToData();" style="width: 240px" /></td>
<td id="audio_altsource1_filebrowser">&nbsp;</td>
</tr>
</table>
</td>
</tr>
<tr>
<td><label for="audio_altsource2">{#media_dlg.altsource2}</label></td>
<td>
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><input type="text" id="audio_altsource2" name="audio_altsource2" onchange="Media.formToData();" style="width: 240px" /></td>
<td id="audio_altsource2_filebrowser">&nbsp;</td>
</tr>
</table>
</td>
</tr>
<tr>
<td><label for="audio_preload">{#media_dlg.preload}</label></td>
<td>
<select id="audio_preload" name="audio_preload" onchange="Media.formToData();">
<option value="none">{#media_dlg.preload_none}</option>
<option value="metadata">{#media_dlg.preload_metadata}</option>
<option value="auto">{#media_dlg.preload_auto}</option>
</select>
</td>
</tr>
</table>
<table role="presentation" border="0" cellpadding="4" cellspacing="0">
<tr>
<td>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td><input type="checkbox" class="checkbox" id="audio_autoplay" name="audio_autoplay" onchange="Media.formToData();" /></td>
<td><label for="audio_autoplay">{#media_dlg.play}</label></td>
</tr>
</table>
</td>
<td>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td><input type="checkbox" class="checkbox" id="audio_loop" name="audio_loop" onchange="Media.formToData();" /></td>
<td><label for="audio_loop">{#media_dlg.loop}</label></td>
</tr>
</table>
</td>
<td>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td><input type="checkbox" class="checkbox" id="audio_controls" name="audio_controls" onchange="Media.formToData();" /></td>
<td><label for="audio_controls">{#media_dlg.controls}</label></td>
</tr>
</table>
</td>
</tr>
</table>
</fieldset>
<fieldset id="flash_options"> <fieldset id="flash_options">
<legend>{#media_dlg.flash_options}</legend> <legend>{#media_dlg.flash_options}</legend>
@ -798,7 +908,7 @@
<div id="source_panel" class="panel"> <div id="source_panel" class="panel">
<fieldset> <fieldset>
<legend>{#media_dlg.source}</legend> <legend>{#media_dlg.source}</legend>
<textarea id="source" style="width: 100%; height: 390px"></textarea> <textarea id="source" style="width: 99%; height: 390px"></textarea>
</fieldset> </fieldset>
</div> </div>
</div> </div>

View File

@ -1 +1 @@
(function(){tinymce.create("tinymce.plugins.Nonbreaking",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceNonBreaking",function(){a.execCommand("mceInsertContent",false,(a.plugins.visualchars&&a.plugins.visualchars.state)?'<span data-mce-bogus="1" class="mceItemHidden mceItemNbsp">&nbsp;</span>':"&nbsp;")});a.addButton("nonbreaking",{title:"nonbreaking.nonbreaking_desc",cmd:"mceNonBreaking"});if(a.getParam("nonbreaking_force_tab")){a.onKeyDown.add(function(d,f){if(tinymce.isIE&&f.keyCode==9){d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking");tinymce.dom.Event.cancel(f)}})}},getInfo:function(){return{longname:"Nonbreaking space",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/nonbreaking",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("nonbreaking",tinymce.plugins.Nonbreaking)})(); (function(){tinymce.create("tinymce.plugins.Nonbreaking",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceNonBreaking",function(){a.execCommand("mceInsertContent",false,(a.plugins.visualchars&&a.plugins.visualchars.state)?'<span data-mce-bogus="1" class="mceItemHidden mceItemNbsp">&nbsp;</span>':"&nbsp;")});a.addButton("nonbreaking",{title:"nonbreaking.nonbreaking_desc",cmd:"mceNonBreaking"});if(a.getParam("nonbreaking_force_tab")){a.onKeyDown.add(function(d,f){if(f.keyCode==9){f.preventDefault();d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking")}})}},getInfo:function(){return{longname:"Nonbreaking space",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/nonbreaking",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("nonbreaking",tinymce.plugins.Nonbreaking)})();

View File

@ -25,11 +25,12 @@
if (ed.getParam('nonbreaking_force_tab')) { if (ed.getParam('nonbreaking_force_tab')) {
ed.onKeyDown.add(function(ed, e) { ed.onKeyDown.add(function(ed, e) {
if (tinymce.isIE && e.keyCode == 9) { if (e.keyCode == 9) {
e.preventDefault();
ed.execCommand('mceNonBreaking'); ed.execCommand('mceNonBreaking');
ed.execCommand('mceNonBreaking'); ed.execCommand('mceNonBreaking');
ed.execCommand('mceNonBreaking'); ed.execCommand('mceNonBreaking');
tinymce.dom.Event.cancel(e);
} }
}); });
} }

View File

@ -1 +1 @@
(function(){var a=tinymce.dom.Event;tinymce.create("tinymce.plugins.NonEditablePlugin",{init:function(d,e){var f=this,c,b;f.editor=d;c=d.getParam("noneditable_editable_class","mceEditable");b=d.getParam("noneditable_noneditable_class","mceNonEditable");d.onNodeChange.addToTop(function(h,g,k){var j,i;j=h.dom.getParent(h.selection.getStart(),function(l){return h.dom.hasClass(l,b)});i=h.dom.getParent(h.selection.getEnd(),function(l){return h.dom.hasClass(l,b)});if(j||i){f._setDisabled(1);return false}else{f._setDisabled(0)}})},getInfo:function(){return{longname:"Non editable elements",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_block:function(c,d){var b=d.keyCode;if((b>32&&b<41)||(b>111&&b<124)){return}return a.cancel(d)},_setDisabled:function(d){var c=this,b=c.editor;tinymce.each(b.controlManager.controls,function(e){e.setDisabled(d)});if(d!==c.disabled){if(d){b.onKeyDown.addToTop(c._block);b.onKeyPress.addToTop(c._block);b.onKeyUp.addToTop(c._block);b.onPaste.addToTop(c._block)}else{b.onKeyDown.remove(c._block);b.onKeyPress.remove(c._block);b.onKeyUp.remove(c._block);b.onPaste.remove(c._block)}c.disabled=d}}});tinymce.PluginManager.add("noneditable",tinymce.plugins.NonEditablePlugin)})(); (function(){var a=tinymce.dom.Event;tinymce.create("tinymce.plugins.NonEditablePlugin",{init:function(d,e){var f=this,c,b,g;f.editor=d;c=d.getParam("noneditable_editable_class","mceEditable");b=d.getParam("noneditable_noneditable_class","mceNonEditable");d.onNodeChange.addToTop(function(i,h,l){var k,j;k=i.dom.getParent(i.selection.getStart(),function(m){return i.dom.hasClass(m,b)});j=i.dom.getParent(i.selection.getEnd(),function(m){return i.dom.hasClass(m,b)});if(k||j){g=1;f._setDisabled(1);return false}else{if(g==1){f._setDisabled(0);g=0}}})},getInfo:function(){return{longname:"Non editable elements",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_block:function(c,d){var b=d.keyCode;if((b>32&&b<41)||(b>111&&b<124)){return}return a.cancel(d)},_setDisabled:function(d){var c=this,b=c.editor;tinymce.each(b.controlManager.controls,function(e){e.setDisabled(d)});if(d!==c.disabled){if(d){b.onKeyDown.addToTop(c._block);b.onKeyPress.addToTop(c._block);b.onKeyUp.addToTop(c._block);b.onPaste.addToTop(c._block);b.onContextMenu.addToTop(c._block)}else{b.onKeyDown.remove(c._block);b.onKeyPress.remove(c._block);b.onKeyUp.remove(c._block);b.onPaste.remove(c._block);b.onContextMenu.remove(c._block)}c.disabled=d}}});tinymce.PluginManager.add("noneditable",tinymce.plugins.NonEditablePlugin)})();

View File

@ -13,7 +13,7 @@
tinymce.create('tinymce.plugins.NonEditablePlugin', { tinymce.create('tinymce.plugins.NonEditablePlugin', {
init : function(ed, url) { init : function(ed, url) {
var t = this, editClass, nonEditClass; var t = this, editClass, nonEditClass, state;
t.editor = ed; t.editor = ed;
editClass = ed.getParam("noneditable_editable_class", "mceEditable"); editClass = ed.getParam("noneditable_editable_class", "mceEditable");
@ -33,10 +33,13 @@
// Block or unblock // Block or unblock
if (sc || ec) { if (sc || ec) {
state = 1;
t._setDisabled(1); t._setDisabled(1);
return false; return false;
} else } else if (state == 1) {
t._setDisabled(0); t._setDisabled(0);
state = 0;
}
}); });
}, },
@ -73,11 +76,13 @@
ed.onKeyPress.addToTop(t._block); ed.onKeyPress.addToTop(t._block);
ed.onKeyUp.addToTop(t._block); ed.onKeyUp.addToTop(t._block);
ed.onPaste.addToTop(t._block); ed.onPaste.addToTop(t._block);
ed.onContextMenu.addToTop(t._block);
} else { } else {
ed.onKeyDown.remove(t._block); ed.onKeyDown.remove(t._block);
ed.onKeyPress.remove(t._block); ed.onKeyPress.remove(t._block);
ed.onKeyUp.remove(t._block); ed.onKeyUp.remove(t._block);
ed.onPaste.remove(t._block); ed.onPaste.remove(t._block);
ed.onContextMenu.remove(t._block);
} }
t.disabled = s; t.disabled = s;

File diff suppressed because one or more lines are too long

View File

@ -25,8 +25,9 @@
paste_dialog_height : "400", paste_dialog_height : "400",
paste_text_use_dialog : false, paste_text_use_dialog : false,
paste_text_sticky : false, paste_text_sticky : false,
paste_text_sticky_default : false,
paste_text_notifyalways : false, paste_text_notifyalways : false,
paste_text_linebreaktype : "p", paste_text_linebreaktype : "combined",
paste_text_replacements : [ paste_text_replacements : [
[/\u2026/g, "..."], [/\u2026/g, "..."],
[/[\x93\x94\u201c\u201d]/g, '"'], [/[\x93\x94\u201c\u201d]/g, '"'],
@ -70,12 +71,12 @@
}); });
// Initialize plain text flag // Initialize plain text flag
ed.pasteAsPlainText = false; ed.pasteAsPlainText = getParam(ed, 'paste_text_sticky_default');
// This function executes the process handlers and inserts the contents // This function executes the process handlers and inserts the contents
// force_rich overrides plain text mode set by user, important for pasting with execCommand // force_rich overrides plain text mode set by user, important for pasting with execCommand
function process(o, force_rich) { function process(o, force_rich) {
var dom = ed.dom, rng, nodes; var dom = ed.dom, rng;
// Execute pre process handlers // Execute pre process handlers
t.onPreProcess.dispatch(t, o); t.onPreProcess.dispatch(t, o);
@ -88,11 +89,9 @@
if (tinymce.isGecko) { if (tinymce.isGecko) {
rng = ed.selection.getRng(true); rng = ed.selection.getRng(true);
if (rng.startContainer == rng.endContainer && rng.startContainer.nodeType == 3) { if (rng.startContainer == rng.endContainer && rng.startContainer.nodeType == 3) {
nodes = dom.select('p,h1,h2,h3,h4,h5,h6,pre', o.node);
// Is only one block node and it doesn't contain word stuff // Is only one block node and it doesn't contain word stuff
if (nodes.length == 1 && o.content.indexOf('__MCE_ITEM__') === -1) if (o.node.childNodes.length === 1 && /^(p|h[1-6]|pre)$/i.test(o.node.firstChild.nodeName) && o.content.indexOf('__MCE_ITEM__') === -1)
dom.remove(nodes.reverse(), true); dom.remove(o.node.firstChild, true);
} }
} }
@ -100,11 +99,11 @@
t.onPostProcess.dispatch(t, o); t.onPostProcess.dispatch(t, o);
// Serialize content // Serialize content
o.content = ed.serializer.serialize(o.node, {getInner : 1}); o.content = ed.serializer.serialize(o.node, {getInner : 1, forced_root_block : ''});
// Plain text option active? // Plain text option active?
if ((!force_rich) && (ed.pasteAsPlainText)) { if ((!force_rich) && (ed.pasteAsPlainText)) {
t._insertPlainText(ed, dom, o.content); t._insertPlainText(o.content);
if (!getParam(ed, "paste_text_sticky")) { if (!getParam(ed, "paste_text_sticky")) {
ed.pasteAsPlainText = false; ed.pasteAsPlainText = false;
@ -131,7 +130,7 @@
if (getParam(ed, "paste_text_sticky")) { if (getParam(ed, "paste_text_sticky")) {
ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky')); ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky'));
} else { } else {
ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky')); ed.windowManager.alert(ed.translate('paste.plaintext_mode'));
} }
if (!getParam(ed, "paste_text_notifyalways")) { if (!getParam(ed, "paste_text_notifyalways")) {
@ -156,7 +155,7 @@
if (ed.pasteAsPlainText) { if (ed.pasteAsPlainText) {
e.preventDefault(); e.preventDefault();
process({content : textContent.replace(/\r?\n/g, '<br />')}); process({content : dom.encode(textContent).replace(/\r?\n/g, '<br />')});
return; return;
} }
} }
@ -165,19 +164,20 @@
return; return;
// Create container to paste into // Create container to paste into
n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste', 'data-mce-bogus' : '1'}, '\uFEFF\uFEFF<br data-mce-bogus="1">'); n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste', 'data-mce-bogus' : '1'}, '\uFEFF\uFEFF');
// If contentEditable mode we need to find out the position of the closest element // If contentEditable mode we need to find out the position of the closest element
if (body != ed.getDoc().body) if (body != ed.getDoc().body)
posY = dom.getPos(ed.selection.getStart(), body).y; posY = dom.getPos(ed.selection.getStart(), body).y;
else else
posY = body.scrollTop + dom.getViewPort().y; posY = body.scrollTop + dom.getViewPort(ed.getWin()).y;
// Styles needs to be applied after the element is added to the document since WebKit will otherwise remove all styles // Styles needs to be applied after the element is added to the document since WebKit will otherwise remove all styles
// If also needs to be in view on IE or the paste would fail
dom.setStyles(n, { dom.setStyles(n, {
position : 'absolute', position : 'absolute',
left : -10000, left : tinymce.isGecko ? -40 : 0, // Need to move it out of site on Gecko since it will othewise display a ghost resize rect for the div
top : posY, top : posY - 25,
width : 1, width : 1,
height : 1, height : 1,
overflow : 'hidden' overflow : 'hidden'
@ -197,7 +197,7 @@
// Check if the contents was changed, if it wasn't then clipboard extraction failed probably due // Check if the contents was changed, if it wasn't then clipboard extraction failed probably due
// to IE security settings so we pass the junk though better than nothing right // to IE security settings so we pass the junk though better than nothing right
if (n.innerHTML === '\uFEFF') { if (n.innerHTML === '\uFEFF\uFEFF') {
ed.execCommand('mcePasteWord'); ed.execCommand('mcePasteWord');
e.preventDefault(); e.preventDefault();
return; return;
@ -228,11 +228,11 @@
or = ed.selection.getRng(); or = ed.selection.getRng();
// Move caret into hidden div // Move select contents inside DIV
n = n.firstChild; n = n.firstChild;
rng = ed.getDoc().createRange(); rng = ed.getDoc().createRange();
rng.setStart(n, 0); rng.setStart(n, 0);
rng.setEnd(n, 1); rng.setEnd(n, 2);
sel.setRng(rng); sel.setRng(rng);
// Wait a while and grab the pasted contents // Wait a while and grab the pasted contents
@ -267,8 +267,9 @@
h += n.innerHTML; h += n.innerHTML;
}); });
} else { } else {
// Found WebKit weirdness so force the content into plain text mode // Found WebKit weirdness so force the content into paragraphs this seems to happen when you paste plain text from Nodepad etc
h = '<pre>' + dom.encode(textContent).replace(/\r?\n/g, '<br />') + '</pre>'; // So this logic will replace double enter with paragraphs and single enter with br so it kind of looks the same
h = '<p>' + dom.encode(textContent).replace(/\r?\n\r?\n/g, '</p><p>').replace(/\r?\n/g, '<br />') + '</p>';
} }
// Remove the nodes // Remove the nodes
@ -305,17 +306,19 @@
} }
} }
// Block all drag/drop events ed.onInit.add(function() {
if (getParam(ed, "paste_block_drop")) { ed.controlManager.setActive("pastetext", ed.pasteAsPlainText);
ed.onInit.add(function() {
// Block all drag/drop events
if (getParam(ed, "paste_block_drop")) {
ed.dom.bind(ed.getBody(), ['dragend', 'dragover', 'draggesture', 'dragdrop', 'drop', 'drag'], function(e) { ed.dom.bind(ed.getBody(), ['dragend', 'dragover', 'draggesture', 'dragdrop', 'drop', 'drag'], function(e) {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
return false; return false;
}); });
}); }
} });
// Add legacy support // Add legacy support
t._legacySupport(); t._legacySupport();
@ -356,9 +359,18 @@
} }
// IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser // IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser
if (tinymce.isIE && document.documentMode >= 9) if (tinymce.isIE && document.documentMode >= 9) {
// IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser
process([[/(?:<br>&nbsp;[\s\r\n]+|<br>)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:<br>&nbsp;[\s\r\n]+|<br>)*/g, '$1']]); process([[/(?:<br>&nbsp;[\s\r\n]+|<br>)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:<br>&nbsp;[\s\r\n]+|<br>)*/g, '$1']]);
// IE9 also adds an extra BR element for each soft-linefeed and it also adds a BR for each word wrap break
process([
[/<br><br>/g, '<BR><BR>'], // Replace multiple BR elements with uppercase BR to keep them intact
[/<br>/g, ' '], // Replace single br elements with space since they are word wrap BR:s
[/<BR><BR>/g, '<br>'] // Replace back the double brs but into a single BR
]);
}
// Detect Word content and process it more aggressive // Detect Word content and process it more aggressive
if (/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(h) || o.wordContent) { if (/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(h) || o.wordContent) {
o.wordContent = true; // Mark the pasted contents as word specific content o.wordContent = true; // Mark the pasted contents as word specific content
@ -744,28 +756,24 @@
* plugin, and requires minimal changes to add the new functionality. * plugin, and requires minimal changes to add the new functionality.
* Speednet - June 2009 * Speednet - June 2009
*/ */
_insertPlainText : function(ed, dom, h) { _insertPlainText : function(content) {
var i, len, pos, rpos, node, breakElms, before, after, var ed = this.editor,
w = ed.getWin(),
d = ed.getDoc(),
sel = ed.selection,
is = tinymce.is,
inArray = tinymce.inArray,
linebr = getParam(ed, "paste_text_linebreaktype"), linebr = getParam(ed, "paste_text_linebreaktype"),
rl = getParam(ed, "paste_text_replacements"); rl = getParam(ed, "paste_text_replacements"),
is = tinymce.is;
function process(items) { function process(items) {
each(items, function(v) { each(items, function(v) {
if (v.constructor == RegExp) if (v.constructor == RegExp)
h = h.replace(v, ""); content = content.replace(v, "");
else else
h = h.replace(v[0], v[1]); content = content.replace(v[0], v[1]);
}); });
}; };
if ((typeof(h) === "string") && (h.length > 0)) { if ((typeof(content) === "string") && (content.length > 0)) {
// If HTML content with line-breaking tags, then remove all cr/lf chars because only tags will break a line // If HTML content with line-breaking tags, then remove all cr/lf chars because only tags will break a line
if (/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(h)) { if (/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(content)) {
process([ process([
/[\n\r]+/g /[\n\r]+/g
]); ]);
@ -782,114 +790,47 @@
[/<\/t[dh]>\s*<t[dh][^>]*>/gi, "\t"], // Table cells get tabs betweem them [/<\/t[dh]>\s*<t[dh][^>]*>/gi, "\t"], // Table cells get tabs betweem them
/<[a-z!\/?][^>]*>/gi, // Delete all remaining tags /<[a-z!\/?][^>]*>/gi, // Delete all remaining tags
[/&nbsp;/gi, " "], // Convert non-break spaces to regular spaces (remember, *plain text*) [/&nbsp;/gi, " "], // Convert non-break spaces to regular spaces (remember, *plain text*)
[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi, "$1"], // Cool little RegExp deletes whitespace around linebreak chars. [/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi, "$1"],// Cool little RegExp deletes whitespace around linebreak chars.
[/\n{3,}/g, "\n\n"], // Max. 2 consecutive linebreaks [/\n{3,}/g, "\n\n"] // Max. 2 consecutive linebreaks
/^\s+|\s+$/g // Trim the front & back
]); ]);
h = dom.decode(tinymce.html.Entities.encodeRaw(h)); content = ed.dom.decode(tinymce.html.Entities.encodeRaw(content));
// Delete any highlighted text before pasting
if (!sel.isCollapsed()) {
d.execCommand("Delete", false, null);
}
// Perform default or custom replacements // Perform default or custom replacements
if (is(rl, "array") || (is(rl, "array"))) { if (is(rl, "array")) {
process(rl); process(rl);
} } else if (is(rl, "string")) {
else if (is(rl, "string")) {
process(new RegExp(rl, "gi")); process(new RegExp(rl, "gi"));
} }
// Treat paragraphs as specified in the config // Treat paragraphs as specified in the config
if (linebr == "none") { if (linebr == "none") {
// Convert all line breaks to space
process([ process([
[/\n+/g, " "] [/\n+/g, " "]
]); ]);
} } else if (linebr == "br") {
else if (linebr == "br") { // Convert all line breaks to <br />
process([ process([
[/\n/g, "<br />"] [/\n/g, "<br />"]
]); ]);
} } else if (linebr == "p") {
else { // Convert all line breaks to <p>...</p>
process([
[/\n+/g, "</p><p>"],
[/^(.*<\/p>)(<p>)$/, '<p>$1']
]);
} else {
// defaults to "combined"
// Convert single line breaks to <br /> and double line breaks to <p>...</p>
process([ process([
/^\s+|\s+$/g,
[/\n\n/g, "</p><p>"], [/\n\n/g, "</p><p>"],
[/^(.*<\/p>)(<p>)$/, '<p>$1'],
[/\n/g, "<br />"] [/\n/g, "<br />"]
]); ]);
} }
// This next piece of code handles the situation where we're pasting more than one paragraph of plain ed.execCommand('mceInsertContent', false, content);
// text, and we are pasting the content into the middle of a block node in the editor. The block
// node gets split at the selection point into "Para A" and "Para B" (for the purposes of explaining).
// The first paragraph of the pasted text is appended to "Para A", and the last paragraph of the
// pasted text is prepended to "Para B". Any other paragraphs of pasted text are placed between
// "Para A" and "Para B". This code solves a host of problems with the original plain text plugin and
// now handles styles correctly. (Pasting plain text into a styled paragraph is supposed to make the
// plain text take the same style as the existing paragraph.)
if ((pos = h.indexOf("</p><p>")) != -1) {
rpos = h.lastIndexOf("</p><p>");
node = sel.getNode();
breakElms = []; // Get list of elements to break
do {
if (node.nodeType == 1) {
// Don't break tables and break at body
if (node.nodeName == "TD" || node.nodeName == "BODY") {
break;
}
breakElms[breakElms.length] = node;
}
} while (node = node.parentNode);
// Are we in the middle of a block node?
if (breakElms.length > 0) {
before = h.substring(0, pos);
after = "";
for (i=0, len=breakElms.length; i<len; i++) {
before += "</" + breakElms[i].nodeName.toLowerCase() + ">";
after += "<" + breakElms[breakElms.length-i-1].nodeName.toLowerCase() + ">";
}
if (pos == rpos) {
h = before + after + h.substring(pos+7);
}
else {
h = before + h.substring(pos+4, rpos+4) + after + h.substring(rpos+7);
}
}
}
// Insert content at the caret, plus add a marker for repositioning the caret
ed.execCommand("mceInsertRawHTML", false, h + '<span id="_plain_text_marker">&nbsp;</span>');
// Reposition the caret to the marker, which was placed immediately after the inserted content.
// Needs to be done asynchronously (in window.setTimeout) or else it doesn't work in all browsers.
// The second part of the code scrolls the content up if the caret is positioned off-screen.
// This is only necessary for WebKit browsers, but it doesn't hurt to use for all.
window.setTimeout(function() {
var marker = dom.get('_plain_text_marker'),
elm, vp, y, elmHeight;
sel.select(marker, false);
d.execCommand("Delete", false, null);
marker = null;
// Get element, position and height
elm = sel.getStart();
vp = dom.getViewPort(w);
y = dom.getPos(elm).y;
elmHeight = elm.clientHeight;
// Is element within viewport if not then scroll it into view
if ((y < vp.y) || (y + elmHeight > vp.y + vp.h)) {
d.body.scrollTop = y < vp.y ? y : y - vp.h + 25;
}
}, 0);
} }
}, },

View File

@ -1,5 +1 @@
tinyMCE.addI18n('en.paste_dlg',{ tinyMCE.addI18n('en.paste_dlg',{"word_title":"Use Ctrl+V on your keyboard to paste the text into the window.","text_linebreaks":"Keep Linebreaks","text_title":"Use Ctrl+V on your keyboard to paste the text into the window."});
text_title:"Use CTRL+V on your keyboard to paste the text into the window.",
text_linebreaks:"Keep linebreaks",
word_title:"Use CTRL+V on your keyboard to paste the text into the window."
});

View File

@ -1,16 +1 @@
tinyMCE.addI18n('en.searchreplace_dlg',{ tinyMCE.addI18n('en.searchreplace_dlg',{findwhat:"Find What",replacewith:"Replace with",direction:"Direction",up:"Up",down:"Down",mcase:"Match Case",findnext:"Find Next",allreplaced:"All occurrences of the search string were replaced.","searchnext_desc":"Find Again",notfound:"The search has been completed. The search string could not be found.","search_title":"Find","replace_title":"Find/Replace",replaceall:"Replace All",replace:"Replace"});
searchnext_desc:"Find again",
notfound:"The search has been completed. The search string could not be found.",
search_title:"Find",
replace_title:"Find/Replace",
allreplaced:"All occurrences of the search string were replaced.",
findwhat:"Find what",
replacewith:"Replace with",
direction:"Direction",
up:"Up",
down:"Down",
mcase:"Match case",
findnext:"Find next",
replace:"Replace",
replaceall:"Replace all"
});

File diff suppressed because one or more lines are too long

View File

@ -221,7 +221,7 @@
}, },
_markWords : function(wl) { _markWords : function(wl) {
var ed = this.editor, dom = ed.dom, se = ed.selection, b = se.getBookmark(), nl = [], var ed = this.editor, dom = ed.dom, doc = ed.getDoc(), se = ed.selection, b = se.getBookmark(), nl = [],
w = wl.join('|'), re = this._getSeparators(), rx = new RegExp('(^|[' + re + '])(' + w + ')(?=[' + re + ']|$)', 'g'); w = wl.join('|'), re = this._getSeparators(), rx = new RegExp('(^|[' + re + '])(' + w + ')(?=[' + re + ']|$)', 'g');
// Collect all text nodes // Collect all text nodes
@ -254,7 +254,7 @@
// Add text node for the content before the word // Add text node for the content before the word
txt = v.substring(0, pos); txt = v.substring(0, pos);
if (txt.length) { if (txt.length) {
node = document.createTextNode(dom.decode(txt)); node = doc.createTextNode(dom.decode(txt));
elem.appendChild(node); elem.appendChild(node);
} }
v = v.substring(pos+10); v = v.substring(pos+10);
@ -266,7 +266,7 @@
} }
// Add text node for the rest of the content // Add text node for the rest of the content
if (v.length) { if (v.length) {
node = document.createTextNode(dom.decode(v)); node = doc.createTextNode(dom.decode(v));
elem.appendChild(node); elem.appendChild(node);
} }
} else { } else {
@ -314,43 +314,44 @@
} else } else
m.add({title : 'spellchecker.no_sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1); m.add({title : 'spellchecker.no_sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1);
ignoreRpc = t.editor.getParam("spellchecker_enable_ignore_rpc", ''); if (ed.getParam('show_ignore_words', true)) {
m.add({ ignoreRpc = t.editor.getParam("spellchecker_enable_ignore_rpc", '');
title : 'spellchecker.ignore_word', m.add({
onclick : function() { title : 'spellchecker.ignore_word',
var word = wordSpan.innerHTML; onclick : function() {
var word = wordSpan.innerHTML;
dom.remove(wordSpan, 1); dom.remove(wordSpan, 1);
t._checkDone(); t._checkDone();
// tell the server if we need to // tell the server if we need to
if (ignoreRpc) { if (ignoreRpc) {
ed.setProgressState(1); ed.setProgressState(1);
t._sendRPC('ignoreWord', [t.selectedLang, word], function(r) { t._sendRPC('ignoreWord', [t.selectedLang, word], function(r) {
ed.setProgressState(0); ed.setProgressState(0);
}); });
}
} }
} });
});
m.add({ m.add({
title : 'spellchecker.ignore_words', title : 'spellchecker.ignore_words',
onclick : function() { onclick : function() {
var word = wordSpan.innerHTML; var word = wordSpan.innerHTML;
t._removeWords(dom.decode(word)); t._removeWords(dom.decode(word));
t._checkDone(); t._checkDone();
// tell the server if we need to // tell the server if we need to
if (ignoreRpc) { if (ignoreRpc) {
ed.setProgressState(1); ed.setProgressState(1);
t._sendRPC('ignoreWords', [t.selectedLang, word], function(r) { t._sendRPC('ignoreWords', [t.selectedLang, word], function(r) {
ed.setProgressState(0); ed.setProgressState(0);
}); });
}
} }
} });
}); }
if (t.editor.getParam("spellchecker_enable_learn_rpc")) { if (t.editor.getParam("spellchecker_enable_learn_rpc")) {
m.add({ m.add({
@ -372,7 +373,7 @@
m.update(); m.update();
}); });
p1 = dom.getPos(ed.getContentAreaContainer()); p1 = DOM.getPos(ed.getContentAreaContainer());
m.settings.offset_x = p1.x; m.settings.offset_x = p1.x;
m.settings.offset_y = p1.y; m.settings.offset_y = p1.y;

View File

@ -372,7 +372,7 @@ function applyAction() {
generateCSS(); generateCSS();
tinyMCEPopup.restoreSelection(); tinyMCEPopup.restoreSelection();
ed.dom.setAttrib(ed.selection.getNode(), 'style', tinyMCEPopup.editor.dom.serializeStyle(tinyMCEPopup.editor.dom.parseStyle(ce.style.cssText))); ed.dom.setAttrib(ed.selection.getSelectedBlocks(), 'style', tinyMCEPopup.editor.dom.serializeStyle(tinyMCEPopup.editor.dom.parseStyle(ce.style.cssText)));
} }
function updateAction() { function updateAction() {

View File

@ -1,70 +1 @@
tinyMCE.addI18n('en.style_dlg',{ tinyMCE.addI18n('en.style_dlg',{"text_lineheight":"Line Height","text_variant":"Variant","text_style":"Style","text_weight":"Weight","text_size":"Size","text_font":"Font","text_props":"Text","positioning_tab":"Positioning","list_tab":"List","border_tab":"Border","box_tab":"Box","block_tab":"Block","background_tab":"Background","text_tab":"Text",apply:"Apply",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility","positioning_type":"Type",position:"Position","bullet_image":"Bullet Image","list_type":"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for All",padding:"Padding","box_clear":"Clear","box_float":"Float","box_height":"Height","box_width":"Width","block_display":"Display","block_whitespace":"Whitespace","block_text_indent":"Text Indent","block_text_align":"Text Align","block_vertical_alignment":"Vertical Alignment","block_letterspacing":"Letter Spacing","block_wordspacing":"Word Spacing","background_vpos":"Vertical Position","background_hpos":"Horizontal Position","background_attachment":"Attachment","background_repeat":"Repeat","background_image":"Background Image","background_color":"Background Color","text_none":"None","text_blink":"Blink","text_case":"Case","text_striketrough":"Strikethrough","text_underline":"Underline","text_overline":"Overline","text_decoration":"Decoration","text_color":"Color",text:"Text",background:"Background",block:"Block",box:"Box",border:"Border",list:"List"});
title:"Edit CSS Style",
apply:"Apply",
text_tab:"Text",
background_tab:"Background",
block_tab:"Block",
box_tab:"Box",
border_tab:"Border",
list_tab:"List",
positioning_tab:"Positioning",
text_props:"Text",
text_font:"Font",
text_size:"Size",
text_weight:"Weight",
text_style:"Style",
text_variant:"Variant",
text_lineheight:"Line height",
text_case:"Case",
text_color:"Color",
text_decoration:"Decoration",
text_overline:"overline",
text_underline:"underline",
text_striketrough:"strikethrough",
text_blink:"blink",
text_none:"none",
background_color:"Background color",
background_image:"Background image",
background_repeat:"Repeat",
background_attachment:"Attachment",
background_hpos:"Horizontal position",
background_vpos:"Vertical position",
block_wordspacing:"Word spacing",
block_letterspacing:"Letter spacing",
block_vertical_alignment:"Vertical alignment",
block_text_align:"Text align",
block_text_indent:"Text indent",
block_whitespace:"Whitespace",
block_display:"Display",
box_width:"Width",
box_height:"Height",
box_float:"Float",
box_clear:"Clear",
padding:"Padding",
same:"Same for all",
top:"Top",
right:"Right",
bottom:"Bottom",
left:"Left",
margin:"Margin",
style:"Style",
width:"Width",
height:"Height",
color:"Color",
list_type:"Type",
bullet_image:"Bullet image",
position:"Position",
positioning_type:"Type",
visibility:"Visibility",
zindex:"Z-index",
overflow:"Overflow",
placement:"Placement",
clip:"Clip",
text:"Text",
background:"Background",
block:"Block",
box:"Box",
border:"Border",
list:"List",
position:"Position"
});

View File

@ -316,6 +316,8 @@
<td><select id="box_clear" name="box_clear" class="mceEditableSelect"></select></td> <td><select id="box_clear" name="box_clear" class="mceEditableSelect"></select></td>
</tr> </tr>
</table> </table>
</fieldset>
<div style="float: left; width: 49%"> <div style="float: left; width: 49%">
<fieldset> <fieldset>
<legend>{#style_dlg.padding}</legend> <legend>{#style_dlg.padding}</legend>
@ -672,6 +674,7 @@
<td><select id="positioning_overflow" name="positioning_overflow" class="mceEditableSelect"></select></td> <td><select id="positioning_overflow" name="positioning_overflow" class="mceEditableSelect"></select></td>
</tr> </tr>
</table> </table>
</fieldset>
<div style="float: left; width: 49%"> <div style="float: left; width: 49%">
<fieldset> <fieldset>
@ -820,7 +823,6 @@
</div> </div>
<br style="clear: both" /> <br style="clear: both" />
</div> </div>
</fieldset>
</div> </div>
<div class="mceActionPanel"> <div class="mceActionPanel">

View File

@ -1 +1 @@
(function(){var c=tinymce.DOM,a=tinymce.dom.Event,d=tinymce.each,b=tinymce.explode;tinymce.create("tinymce.plugins.TabFocusPlugin",{init:function(f,g){function e(i,j){if(j.keyCode===9){return a.cancel(j)}}function h(l,p){var j,m,o,n,k;function q(r){n=c.select(":input:enabled,*[tabindex]");function i(s){return s.type!="hidden"&&s.tabIndex!="-1"&&!(n[m].style.display=="none")&&!(n[m].style.visibility=="hidden")}d(n,function(t,s){if(t.id==l.id){j=s;return false}});if(r>0){for(m=j+1;m<n.length;m++){if(i(n[m])){return n[m]}}}else{for(m=j-1;m>=0;m--){if(i(n[m])){return n[m]}}}return null}if(p.keyCode===9){k=b(l.getParam("tab_focus",l.getParam("tabfocus_elements",":prev,:next")));if(k.length==1){k[1]=k[0];k[0]=":prev"}if(p.shiftKey){if(k[0]==":prev"){n=q(-1)}else{n=c.get(k[0])}}else{if(k[1]==":next"){n=q(1)}else{n=c.get(k[1])}}if(n){if(n.id&&(l=tinymce.get(n.id||n.name))){l.focus()}else{window.setTimeout(function(){if(!tinymce.isWebKit){window.focus()}n.focus()},10)}return a.cancel(p)}}}f.onKeyUp.add(e);if(tinymce.isGecko){f.onKeyPress.add(h);f.onKeyDown.add(e)}else{f.onKeyDown.add(h)}},getInfo:function(){return{longname:"Tabfocus",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("tabfocus",tinymce.plugins.TabFocusPlugin)})(); (function(){var c=tinymce.DOM,a=tinymce.dom.Event,d=tinymce.each,b=tinymce.explode;tinymce.create("tinymce.plugins.TabFocusPlugin",{init:function(f,g){function e(i,j){if(j.keyCode===9){return a.cancel(j)}}function h(l,p){var j,m,o,n,k;function q(t){n=c.select(":input:enabled,*[tabindex]");function s(v){return v.nodeName==="BODY"||(v.type!="hidden"&&!(v.style.display=="none")&&!(v.style.visibility=="hidden")&&s(v.parentNode))}function i(v){return v.attributes.tabIndex.specified||v.nodeName=="INPUT"||v.nodeName=="TEXTAREA"}function u(){return tinymce.isIE6||tinymce.isIE7}function r(v){return((!u()||i(v)))&&v.getAttribute("tabindex")!="-1"&&s(v)}d(n,function(w,v){if(w.id==l.id){j=v;return false}});if(t>0){for(m=j+1;m<n.length;m++){if(r(n[m])){return n[m]}}}else{for(m=j-1;m>=0;m--){if(r(n[m])){return n[m]}}}return null}if(p.keyCode===9){k=b(l.getParam("tab_focus",l.getParam("tabfocus_elements",":prev,:next")));if(k.length==1){k[1]=k[0];k[0]=":prev"}if(p.shiftKey){if(k[0]==":prev"){n=q(-1)}else{n=c.get(k[0])}}else{if(k[1]==":next"){n=q(1)}else{n=c.get(k[1])}}if(n){if(n.id&&(l=tinymce.get(n.id||n.name))){l.focus()}else{window.setTimeout(function(){if(!tinymce.isWebKit){window.focus()}n.focus()},10)}return a.cancel(p)}}}f.onKeyUp.add(e);if(tinymce.isGecko){f.onKeyPress.add(h);f.onKeyDown.add(e)}else{f.onKeyDown.add(h)}},getInfo:function(){return{longname:"Tabfocus",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("tabfocus",tinymce.plugins.TabFocusPlugin)})();

View File

@ -1,114 +1,122 @@
/** /**
* editor_plugin_src.js * editor_plugin_src.js
* *
* Copyright 2009, Moxiecode Systems AB * Copyright 2009, Moxiecode Systems AB
* Released under LGPL License. * Released under LGPL License.
* *
* License: http://tinymce.moxiecode.com/license * License: http://tinymce.moxiecode.com/license
* Contributing: http://tinymce.moxiecode.com/contributing * Contributing: http://tinymce.moxiecode.com/contributing
*/ */
(function() { (function() {
var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, explode = tinymce.explode; var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, explode = tinymce.explode;
tinymce.create('tinymce.plugins.TabFocusPlugin', { tinymce.create('tinymce.plugins.TabFocusPlugin', {
init : function(ed, url) { init : function(ed, url) {
function tabCancel(ed, e) { function tabCancel(ed, e) {
if (e.keyCode === 9) if (e.keyCode === 9)
return Event.cancel(e); return Event.cancel(e);
}; }
function tabHandler(ed, e) { function tabHandler(ed, e) {
var x, i, f, el, v; var x, i, f, el, v;
function find(d) { function find(d) {
el = DOM.select(':input:enabled,*[tabindex]'); el = DOM.select(':input:enabled,*[tabindex]');
function canSelect(e) {
return e.type != 'hidden' && function canSelectRecursive(e) {
e.tabIndex != '-1' && return e.nodeName==="BODY" || (e.type != 'hidden' &&
!(el[i].style.display == "none") && !(e.style.display == "none") &&
!(el[i].style.visibility == "hidden"); !(e.style.visibility == "hidden") && canSelectRecursive(e.parentNode));
} }
function canSelectInOldIe(el) {
each(el, function(e, i) { return el.attributes["tabIndex"].specified || el.nodeName == "INPUT" || el.nodeName == "TEXTAREA";
if (e.id == ed.id) { }
x = i; function isOldIe() {
return false; return tinymce.isIE6 || tinymce.isIE7;
} }
}); function canSelect(el) {
return ((!isOldIe() || canSelectInOldIe(el))) && el.getAttribute("tabindex") != '-1' && canSelectRecursive(el);
if (d > 0) { }
for (i = x + 1; i < el.length; i++) {
if (canSelect(el[i])) each(el, function(e, i) {
return el[i]; if (e.id == ed.id) {
} x = i;
} else { return false;
for (i = x - 1; i >= 0; i--) { }
if (canSelect(el[i])) });
return el[i]; if (d > 0) {
} for (i = x + 1; i < el.length; i++) {
} if (canSelect(el[i]))
return el[i];
return null; }
}; } else {
for (i = x - 1; i >= 0; i--) {
if (e.keyCode === 9) { if (canSelect(el[i]))
v = explode(ed.getParam('tab_focus', ed.getParam('tabfocus_elements', ':prev,:next'))); return el[i];
}
if (v.length == 1) { }
v[1] = v[0];
v[0] = ':prev'; return null;
} }
// Find element to focus if (e.keyCode === 9) {
if (e.shiftKey) { v = explode(ed.getParam('tab_focus', ed.getParam('tabfocus_elements', ':prev,:next')));
if (v[0] == ':prev')
el = find(-1); if (v.length == 1) {
else v[1] = v[0];
el = DOM.get(v[0]); v[0] = ':prev';
} else { }
if (v[1] == ':next')
el = find(1); // Find element to focus
else if (e.shiftKey) {
el = DOM.get(v[1]); if (v[0] == ':prev')
} el = find(-1);
else
if (el) { el = DOM.get(v[0]);
if (el.id && (ed = tinymce.get(el.id || el.name))) } else {
ed.focus(); if (v[1] == ':next')
else el = find(1);
window.setTimeout(function() { else
if (!tinymce.isWebKit) el = DOM.get(v[1]);
window.focus(); }
el.focus();
}, 10); if (el) {
if (el.id && (ed = tinymce.get(el.id || el.name)))
return Event.cancel(e); ed.focus();
} else
} window.setTimeout(function() {
}; if (!tinymce.isWebKit)
window.focus();
ed.onKeyUp.add(tabCancel); el.focus();
}, 10);
if (tinymce.isGecko) {
ed.onKeyPress.add(tabHandler); return Event.cancel(e);
ed.onKeyDown.add(tabCancel); }
} else }
ed.onKeyDown.add(tabHandler); }
}, ed.onKeyUp.add(tabCancel);
getInfo : function() { if (tinymce.isGecko) {
return { ed.onKeyPress.add(tabHandler);
longname : 'Tabfocus', ed.onKeyDown.add(tabCancel);
author : 'Moxiecode Systems AB', } else
authorurl : 'http://tinymce.moxiecode.com', ed.onKeyDown.add(tabHandler);
infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus',
version : tinymce.majorVersion + "." + tinymce.minorVersion },
};
} getInfo : function() {
}); return {
longname : 'Tabfocus',
// Register plugin author : 'Moxiecode Systems AB',
tinymce.PluginManager.add('tabfocus', tinymce.plugins.TabFocusPlugin); authorurl : 'http://tinymce.moxiecode.com',
})(); infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus',
version : tinymce.majorVersion + "." + tinymce.minorVersion
};
}
});
// Register plugin
tinymce.PluginManager.add('tabfocus', tinymce.plugins.TabFocusPlugin);
})();

View File

@ -5,6 +5,7 @@
<script type="text/javascript" src="../../tiny_mce_popup.js"></script> <script type="text/javascript" src="../../tiny_mce_popup.js"></script>
<script type="text/javascript" src="../../utils/mctabs.js"></script> <script type="text/javascript" src="../../utils/mctabs.js"></script>
<script type="text/javascript" src="../../utils/form_utils.js"></script> <script type="text/javascript" src="../../utils/form_utils.js"></script>
<script type="text/javascript" src="../../utils/validate.js"></script>
<script type="text/javascript" src="../../utils/editable_selects.js"></script> <script type="text/javascript" src="../../utils/editable_selects.js"></script>
<script type="text/javascript" src="js/cell.js"></script> <script type="text/javascript" src="js/cell.js"></script>
<link href="css/cell.css" rel="stylesheet" type="text/css" /> <link href="css/cell.css" rel="stylesheet" type="text/css" />
@ -70,10 +71,10 @@
<tr> <tr>
<td><label for="width">{#table_dlg.width}</label></td> <td><label for="width">{#table_dlg.width}</label></td>
<td><input id="width" name="width" type="text" value="" size="4" maxlength="4" onchange="changedSize();" /></td> <td><input id="width" name="width" type="text" value="" size="7" maxlength="7" onchange="changedSize();" class="size" /></td>
<td><label for="height">{#table_dlg.height}</label></td> <td><label for="height">{#table_dlg.height}</label></td>
<td><input id="height" name="height" type="text" value="" size="4" maxlength="4" onchange="changedSize();" /></td> <td><input id="height" name="height" type="text" value="" size="7" maxlength="7" onchange="changedSize();" class="size" /></td>
</tr> </tr>
<tr id="styleSelectRow"> <tr id="styleSelectRow">
@ -166,6 +167,7 @@
<select id="action" name="action"> <select id="action" name="action">
<option value="cell">{#table_dlg.cell_cell}</option> <option value="cell">{#table_dlg.cell_cell}</option>
<option value="row">{#table_dlg.cell_row}</option> <option value="row">{#table_dlg.cell_row}</option>
<option value="col">{#table_dlg.cell_col}</option>
<option value="all">{#table_dlg.cell_all}</option> <option value="all">{#table_dlg.cell_all}</option>
</select> </select>
</div> </div>

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More