added cms assets
Hesham E
committed Aug 27, 2010
commit 54b8ef3823bb61c59cedf70a934b365c9a5afea5
Showing 141
changed files with
25936 additions
and 3275 deletions
Gemfile
+2
-1
| @@ | @@ -8,7 +8,8 @@ gem 'rails', '3.0.0.rc' |
| gem 'sqlite3-ruby', :require => 'sqlite3' | |
| gem 'haml' | |
| gem 'active_link_to' | |
| - | |
| + | gem 'paperclip' |
| + | gem 'mime-types', :require => 'mime/types' |
| # Use unicorn as the web server | |
| # gem 'unicorn' | |
Gemfile.lock
+8
-3
| @@ | @@ -41,9 +41,12 @@ GEM |
| mime-types | |
| treetop (>= 1.4.5) | |
| mime-types (1.16) | |
| + | paperclip (2.3.3) |
| + | activerecord |
| + | activesupport |
| polyglot (0.3.1) | |
| rack (1.2.1) | |
| - | rack-mount (0.6.9) |
| + | rack-mount (0.6.12) |
| rack (>= 1.0.0) | |
| rack-test (0.5.4) | |
| rack (>= 1.0) | |
| @@ | @@ -61,11 +64,11 @@ GEM |
| rake (>= 0.8.3) | |
| thor (~> 0.14.0) | |
| rake (0.8.7) | |
| - | sqlite3-ruby (1.2.5) |
| + | sqlite3-ruby (1.3.1) |
| thor (0.14.0) | |
| treetop (1.4.8) | |
| polyglot (>= 0.3.1) | |
| - | tzinfo (0.3.22) |
| + | tzinfo (0.3.23) |
| PLATFORMS | |
| ruby | |
| @@ | @@ -73,5 +76,7 @@ PLATFORMS |
| DEPENDENCIES | |
| active_link_to | |
| haml | |
| + | mime-types |
| + | paperclip |
| rails (= 3.0.0.rc) | |
| sqlite3-ruby | |
app/controllers/cms_admin/assets_controller.rb
+29
-0
| @@ | @@ -0,0 +1,29 @@ |
| + | class CmsAdmin::AssetsController < CmsAdmin::BaseController |
| + | before_filter :load_cms_asset, |
| + | :only => :destroy |
| + | |
| + | def index |
| + | render :update do |page| |
| + | page << "$('#assets_list').html(\"#{ escape_javascript(render(:partial => 'cms_admin/assets/index')) }\")" |
| + | end |
| + | end |
| + | |
| + | def create |
| + | @cms_asset = CmsAsset.create!(:uploaded_file => params[:file]) |
| + | render :nothing => true |
| + | end |
| + | |
| + | def destroy |
| + | @cms_asset.destroy |
| + | render :update do |page| |
| + | page << "$('##{dom_id(@cms_asset)}').fadeOut('slow')" |
| + | end |
| + | end |
| + | |
| + | protected |
| + | def load_cms_asset |
| + | @cms_asset = CmsAsset.find(params[:id]) |
| + | rescue ActiveRecord::RecordNotFound |
| + | render :nothing => true |
| + | end |
| + | end |
app/controllers/cms_admin/base_controller.rb
+12
-6
| @@ | @@ -1,5 +1,5 @@ |
| class CmsAdmin::BaseController < ApplicationController | |
| - | |
| + | before_filter :register_asset_expansions |
| before_filter :authenticate | |
| layout 'cms_admin' | |
| @@ | @@ -20,11 +20,6 @@ class CmsAdmin::BaseController < ApplicationController |
| end | |
| end | |
| - | def js_helper_installed?(name, library = nil) |
| - | File.exists?(File.expand_path("public/javascripts/#{name}/#{library||name}.js", Rails.root)) |
| - | end |
| - | helper_method :js_helper_installed? |
| - | |
| protected | |
| def authenticate | |
| @@ | @@ -33,5 +28,16 @@ protected |
| password == ComfortableMexicanSofa::Config.http_auth_password | |
| end if ComfortableMexicanSofa::Config.http_auth_enabled | |
| end | |
| + | |
| + | def register_asset_expansions |
| + | js_includes = ['jquery', 'jquery-ui', 'rails', 'cms'].collect{|f| ['cms', f].join('/')} |
| + | js_includes += ['tiny_mce/jquery.tinymce', 'tiny_mce/tiny_mce', 'codemirror/codemirror', 'plupload/plupload.full.min' ].collect{|f| ['cms/3rdparty', f].join('/')} |
| + | js_includes += ['rteditor', 'syntax_highlighter', 'uploader'].collect{|f| ['cms', f].join('/')} |
| + | css_includes = %w(cms_master jquery-ui).collect{|f| ['cms', f].join('/')} |
| + | |
| + | |
| + | ActionView::Helpers::AssetTagHelper.register_javascript_expansion :cms => js_includes |
| + | ActionView::Helpers::AssetTagHelper.register_stylesheet_expansion :cms => css_includes |
| + | end |
| end | |
app/models/cms_asset.rb
+29
-0
| @@ | @@ -0,0 +1,29 @@ |
| + | class CmsAsset < ActiveRecord::Base |
| + | |
| + | # -- AR Extensions -------------------------------------------------------- |
| + | |
| + | has_attached_file :file, |
| + | :styles => { :thumb => '60x60>' } |
| + | |
| + | before_post_process :image? |
| + | |
| + | # -- Validations ---------------------------------------------------------- |
| + | |
| + | validates_attachment_presence :file |
| + | |
| + | # -- Relationships -------------------------------------------------------- |
| + | |
| + | belongs_to :cms_page |
| + | |
| + | # -- Instance Methods ----------------------------------------------------- |
| + | |
| + | def image? |
| + | !(file_content_type =~ /^image.*/).nil? |
| + | end |
| + | |
| + | def uploaded_file=(data) |
| + | data.content_type = MIME::Types.type_for(data.original_filename).to_s |
| + | self.file = data |
| + | end |
| + | |
| + | end |
app/models/cms_page.rb
+2
-0
| @@ | @@ -27,6 +27,8 @@ class CmsPage < ActiveRecord::Base |
| has_one :redirected_from_page, | |
| :class_name => 'CmsPage', | |
| :foreign_key => :redirect_to_page_id | |
| + | has_many :cms_assets, |
| + | :dependent => :destroy |
| #-- Validations ----------------------------------------------------------- | |
app/views/cms_admin/assets/_asset.html.erb
+15
-0
| @@ | @@ -0,0 +1,15 @@ |
| + | <div class='asset' id="<%= dom_id(asset) %>"> |
| + | <div class='thumb'> |
| + | <% if asset.image? %> |
| + | <%= image_tag(asset.file.url(:thumb)) %> |
| + | <% else %> |
| + | <%= image_tag("cms/file_types/#{asset.file_content_type.gsub('/', '_')}.gif") %> |
| + | <% end %> |
| + | <%= link_to 'delete', cms_admin_asset_path(asset), :method => :delete, :remote => true %> |
| + | </div> |
| + | <div class='name'> |
| + | <%= asset.file_file_name %> |
| + | </div> |
| + | </div> |
| + | |
| + | |
app/views/cms_admin/assets/_index.html.erb
+12
-0
| @@ | @@ -0,0 +1,12 @@ |
| + | <div id='assets_list'> |
| + | <% cms_assets = CmsAsset.all %> |
| + | <% if cms_assets.present? %> |
| + | <% cms_assets.in_groups_of(3).each do |row| %> |
| + | <div class='assets'> |
| + | <%= render :partial => 'cms_admin/assets/asset', :collection => row.compact %> |
| + | </div> |
| + | <% end %> |
| + | <% else %> |
| + | <p>No assets found.</p> |
| + | <% end %> |
| + | </div> |
| \ No newline at end of file | |
app/views/cms_admin/assets/_uploader.html.erb
+1
-0
| @@ | @@ -0,0 +1 @@ |
| + | <div id='filelist'></div> |
| \ No newline at end of file | |
app/views/cms_admin/pages/_form.html.haml
+9
-4
| @@ | @@ -3,10 +3,15 @@ |
| %h2 Publishing Options | |
| = f.check_box :published, :label => 'Is Published?' | |
| = f.check_box :excluded_from_nav, :label => 'Exclude from Navigation?' | |
| - | |
| - | .form_element_group |
| - | %h2 W3C Validation |
| - | = link_to 'Check Validation', 'http://validator.w3.org/check?uri=http://'+request.host+@cms_page.full_path, :target => "_new" |
| + | |
| + | .form_element_group.assets |
| + | %h2 |
| + | Assets |
| + | = link_to 'select files', '#', :id => 'pickfiles', :class => 'button' |
| + | |
| + | = render :partial => 'cms_admin/assets/index' |
| + | = render :partial => 'cms_admin/assets/uploader' |
| + | |
| %h2= @cms_page.new_record? ? "New Page" : "Editing \"#{@cms_page.label}\"" | |
| = render :partial => 'cms_admin/flash_message' | |
app/views/layouts/cms_admin.html.haml
+3
-10
| @@ | @@ -3,16 +3,9 @@ |
| %head | |
| %title= application_name | |
| = csrf_meta_tag | |
| - | = stylesheet_link_tag 'cms_master' |
| - | = stylesheet_link_tag 'jquery_ui' |
| - | = javascript_include_tag 'cms/jquery', 'cms/jquery-ui', 'cms/cms' |
| - | = javascript_include_tag 'cms/rails' |
| - | |
| - | - if js_helper_installed?('ckeditor') |
| - | = javascript_include_tag 'ckeditor/ckeditor', 'ckeditor/adapters/jquery', 'cms/rteditor' |
| - | - if js_helper_installed?('codemirror') |
| - | = javascript_include_tag 'codemirror/codemirror', 'cms/codemirror' |
| - | |
| + | = stylesheet_link_tag :cms |
| + | = javascript_include_tag :cms |
| + | |
| = yield :head | |
| %body{ :id => "#{params[:controller]}_#{params[:action]}".idify } | |
config/application.rb
+0
-1
| @@ | @@ -31,7 +31,6 @@ module ComfortableMexicanSofa |
| # config.i18n.default_locale = :de | |
| # JavaScript files you want as :defaults (application.js is always included). | |
| - | config.action_view.javascript_expansions[:defaults] = %w(jquery rails) |
| # Configure the default encoding used in templates for Ruby 1.9. | |
| config.encoding = "utf-8" | |
config/initializers/paperclip.rb
+3
-0
| @@ | @@ -0,0 +1,3 @@ |
| + | Paperclip.options[:command_path] = case Rails.env |
| + | when 'development' then "/opt/local/bin" |
| + | end |
| \ No newline at end of file | |
config/routes.rb
+2
-0
| @@ | @@ -28,6 +28,8 @@ Rails.application.routes.draw do |
| put :reorder | |
| end | |
| end | |
| + | |
| + | resources :assets |
| end | |
| controller :cms_content do | |
migrate/01_create_cms.rb b/db/migrate/01_create_cms.rb
+10
-0
| @@ | @@ -60,6 +60,15 @@ class CreateCms < ActiveRecord::Migration |
| t.timestamps | |
| end | |
| add_index :cms_snippets, :label, :unique => true | |
| + | |
| + | create_table :cms_assets do |t| |
| + | t.string :cms_page_id |
| + | t.string :file_file_name |
| + | t.string :file_content_type |
| + | t.integer :file_file_size |
| + | t.timestamps |
| + | end |
| + | add_index :cms_assets, :cms_page_id |
| end | |
| def self.down | |
| @@ | @@ -67,5 +76,6 @@ class CreateCms < ActiveRecord::Migration |
| drop_table :cms_pages | |
| drop_table :cms_snippets | |
| drop_table :cms_blocks | |
| + | drop_table :cms_assets |
| end | |
| end | |
public/images/cms/jquery_ui/ui-bg_diagonals-thick_18_b81900_40x40.png
+0
-0
public/images/cms/jquery_ui/ui-bg_diagonals-thick_20_666666_40x40.png
+0
-0
public/images/cms/jquery_ui/ui-bg_flat_10_000000_40x100.png
+0
-0
public/images/cms/jquery_ui/ui-bg_glass_100_f6f6f6_1x400.png
+0
-0
public/images/cms/jquery_ui/ui-bg_glass_100_fdf5ce_1x400.png
+0
-0
public/images/cms/jquery_ui/ui-bg_glass_65_ffffff_1x400.png
+0
-0
public/images/cms/jquery_ui/ui-bg_gloss-wave_35_f6a828_500x100.png
+0
-0
public/images/cms/jquery_ui/ui-bg_highlight-soft_100_eeeeee_1x100.png
+0
-0
public/images/cms/jquery_ui/ui-bg_highlight-soft_75_ffe45c_1x100.png
+0
-0
public/images/cms/jquery_ui/ui-icons_222222_256x240.png
+0
-0
public/images/cms/jquery_ui/ui-icons_228ef1_256x240.png
+0
-0
public/images/cms/jquery_ui/ui-icons_ef8c08_256x240.png
+0
-0
public/images/cms/jquery_ui/ui-icons_ffd27a_256x240.png
+0
-0
public/images/cms/jquery_ui/ui-icons_ffffff_256x240.png
+0
-0
public/javascripts/cms/3rdparty/codemirror/codemirror.js
+538
-0
| @@ | @@ -0,0 +1,538 @@ |
| + | /* CodeMirror main module |
| + | * |
| + | * Implements the CodeMirror constructor and prototype, which take care |
| + | * of initializing the editor frame, and providing the outside interface. |
| + | */ |
| + | |
| + | // The CodeMirrorConfig object is used to specify a default |
| + | // configuration. If you specify such an object before loading this |
| + | // file, the values you put into it will override the defaults given |
| + | // below. You can also assign to it after loading. |
| + | var CodeMirrorConfig = window.CodeMirrorConfig || {}; |
| + | |
| + | var CodeMirror = (function(){ |
| + | function setDefaults(object, defaults) { |
| + | for (var option in defaults) { |
| + | if (!object.hasOwnProperty(option)) |
| + | object[option] = defaults[option]; |
| + | } |
| + | } |
| + | function forEach(array, action) { |
| + | for (var i = 0; i < array.length; i++) |
| + | action(array[i]); |
| + | } |
| + | |
| + | // These default options can be overridden by passing a set of |
| + | // options to a specific CodeMirror constructor. See manual.html for |
| + | // their meaning. |
| + | setDefaults(CodeMirrorConfig, { |
| + | stylesheet: [], |
| + | path: "", |
| + | parserfile: [], |
| + | basefiles: ["util.js", "stringstream.js", "select.js", "undo.js", "editor.js", "tokenize.js"], |
| + | iframeClass: null, |
| + | passDelay: 200, |
| + | passTime: 50, |
| + | lineNumberDelay: 200, |
| + | lineNumberTime: 50, |
| + | continuousScanning: false, |
| + | saveFunction: null, |
| + | onChange: null, |
| + | undoDepth: 50, |
| + | undoDelay: 800, |
| + | disableSpellcheck: true, |
| + | textWrapping: true, |
| + | readOnly: false, |
| + | width: "", |
| + | height: "300px", |
| + | minHeight: 100, |
| + | autoMatchParens: false, |
| + | parserConfig: null, |
| + | tabMode: "indent", // or "spaces", "default", "shift" |
| + | reindentOnLoad: false, |
| + | activeTokens: null, |
| + | cursorActivity: null, |
| + | lineNumbers: false, |
| + | indentUnit: 2, |
| + | domain: null |
| + | }); |
| + | |
| + | function addLineNumberDiv(container) { |
| + | var nums = document.createElement("DIV"), |
| + | scroller = document.createElement("DIV"); |
| + | nums.style.position = "absolute"; |
| + | nums.style.height = "100%"; |
| + | if (nums.style.setExpression) { |
| + | try {nums.style.setExpression("height", "this.previousSibling.offsetHeight + 'px'");} |
| + | catch(e) {} // Seems to throw 'Not Implemented' on some IE8 versions |
| + | } |
| + | nums.style.top = "0px"; |
| + | nums.style.left = "0px"; |
| + | nums.style.overflow = "hidden"; |
| + | container.appendChild(nums); |
| + | scroller.className = "CodeMirror-line-numbers"; |
| + | nums.appendChild(scroller); |
| + | scroller.innerHTML = "<div>1</div>"; |
| + | return nums; |
| + | } |
| + | |
| + | function frameHTML(options) { |
| + | if (typeof options.parserfile == "string") |
| + | options.parserfile = [options.parserfile]; |
| + | if (typeof options.stylesheet == "string") |
| + | options.stylesheet = [options.stylesheet]; |
| + | |
| + | var html = ["<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\"><html><head>"]; |
| + | // Hack to work around a bunch of IE8-specific problems. |
| + | html.push("<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EmulateIE7\"/>"); |
| + | forEach(options.stylesheet, function(file) { |
| + | html.push("<link rel=\"stylesheet\" type=\"text/css\" href=\"" + file + "\"/>"); |
| + | }); |
| + | forEach(options.basefiles.concat(options.parserfile), function(file) { |
| + | if (!/^https?:/.test(file)) file = options.path + file; |
| + | html.push("<script type=\"text/javascript\" src=\"" + file + "\"><" + "/script>"); |
| + | }); |
| + | html.push("</head><body style=\"border-width: 0;\" class=\"editbox\" spellcheck=\"" + |
| + | (options.disableSpellcheck ? "false" : "true") + "\"></body></html>"); |
| + | return html.join(""); |
| + | } |
| + | |
| + | var internetExplorer = document.selection && window.ActiveXObject && /MSIE/.test(navigator.userAgent); |
| + | |
| + | function CodeMirror(place, options) { |
| + | // Use passed options, if any, to override defaults. |
| + | this.options = options = options || {}; |
| + | setDefaults(options, CodeMirrorConfig); |
| + | |
| + | // Backward compatibility for deprecated options. |
| + | if (options.dumbTabs) options.tabMode = "spaces"; |
| + | else if (options.normalTab) options.tabMode = "default"; |
| + | |
| + | var frame = this.frame = document.createElement("IFRAME"); |
| + | if (options.iframeClass) frame.className = options.iframeClass; |
| + | frame.frameBorder = 0; |
| + | frame.style.border = "0"; |
| + | frame.style.width = '100%'; |
| + | frame.style.height = '100%'; |
| + | // display: block occasionally suppresses some Firefox bugs, so we |
| + | // always add it, redundant as it sounds. |
| + | frame.style.display = "block"; |
| + | |
| + | var div = this.wrapping = document.createElement("DIV"); |
| + | div.style.position = "relative"; |
| + | div.className = "CodeMirror-wrapping"; |
| + | div.style.width = options.width; |
| + | div.style.height = (options.height == "dynamic") ? options.minHeight + "px" : options.height; |
| + | // This is used by Editor.reroutePasteEvent |
| + | var teHack = this.textareaHack = document.createElement("TEXTAREA"); |
| + | div.appendChild(teHack); |
| + | teHack.style.position = "absolute"; |
| + | teHack.style.left = "-10000px"; |
| + | teHack.style.width = "10px"; |
| + | |
| + | // Link back to this object, so that the editor can fetch options |
| + | // and add a reference to itself. |
| + | frame.CodeMirror = this; |
| + | if (options.domain && internetExplorer) { |
| + | this.html = frameHTML(options); |
| + | frame.src = "javascript:(function(){document.open();" + |
| + | (options.domain ? "document.domain=\"" + options.domain + "\";" : "") + |
| + | "document.write(window.frameElement.CodeMirror.html);document.close();})()"; |
| + | } |
| + | else { |
| + | frame.src = "javascript:false"; |
| + | } |
| + | |
| + | if (place.appendChild) place.appendChild(div); |
| + | else place(div); |
| + | div.appendChild(frame); |
| + | if (options.lineNumbers) this.lineNumbers = addLineNumberDiv(div); |
| + | |
| + | this.win = frame.contentWindow; |
| + | if (!options.domain || !internetExplorer) { |
| + | this.win.document.open(); |
| + | this.win.document.write(frameHTML(options)); |
| + | this.win.document.close(); |
| + | } |
| + | } |
| + | |
| + | CodeMirror.prototype = { |
| + | init: function() { |
| + | if (this.options.initCallback) this.options.initCallback(this); |
| + | if (this.options.lineNumbers) this.activateLineNumbers(); |
| + | if (this.options.reindentOnLoad) this.reindent(); |
| + | if (this.options.height == "dynamic") this.setDynamicHeight(); |
| + | }, |
| + | |
| + | getCode: function() {return this.editor.getCode();}, |
| + | setCode: function(code) {this.editor.importCode(code);}, |
| + | selection: function() {this.focusIfIE(); return this.editor.selectedText();}, |
| + | reindent: function() {this.editor.reindent();}, |
| + | reindentSelection: function() {this.focusIfIE(); this.editor.reindentSelection(null);}, |
| + | |
| + | focusIfIE: function() { |
| + | // in IE, a lot of selection-related functionality only works when the frame is focused |
| + | if (this.win.select.ie_selection) this.focus(); |
| + | }, |
| + | focus: function() { |
| + | this.win.focus(); |
| + | if (this.editor.selectionSnapshot) // IE hack |
| + | this.win.select.setBookmark(this.win.document.body, this.editor.selectionSnapshot); |
| + | }, |
| + | replaceSelection: function(text) { |
| + | this.focus(); |
| + | this.editor.replaceSelection(text); |
| + | return true; |
| + | }, |
| + | replaceChars: function(text, start, end) { |
| + | this.editor.replaceChars(text, start, end); |
| + | }, |
| + | getSearchCursor: function(string, fromCursor, caseFold) { |
| + | return this.editor.getSearchCursor(string, fromCursor, caseFold); |
| + | }, |
| + | |
| + | undo: function() {this.editor.history.undo();}, |
| + | redo: function() {this.editor.history.redo();}, |
| + | historySize: function() {return this.editor.history.historySize();}, |
| + | clearHistory: function() {this.editor.history.clear();}, |
| + | |
| + | grabKeys: function(callback, filter) {this.editor.grabKeys(callback, filter);}, |
| + | ungrabKeys: function() {this.editor.ungrabKeys();}, |
| + | |
| + | setParser: function(name, parserConfig) {this.editor.setParser(name, parserConfig);}, |
| + | setSpellcheck: function(on) {this.win.document.body.spellcheck = on;}, |
| + | setStylesheet: function(names) { |
| + | if (typeof names === "string") names = [names]; |
| + | var activeStylesheets = {}; |
| + | var matchedNames = {}; |
| + | var links = this.win.document.getElementsByTagName("link"); |
| + | // Create hashes of active stylesheets and matched names. |
| + | // This is O(n^2) but n is expected to be very small. |
| + | for (var x = 0, link; link = links[x]; x++) { |
| + | if (link.rel.indexOf("stylesheet") !== -1) { |
| + | for (var y = 0; y < names.length; y++) { |
| + | var name = names[y]; |
| + | if (link.href.substring(link.href.length - name.length) === name) { |
| + | activeStylesheets[link.href] = true; |
| + | matchedNames[name] = true; |
| + | } |
| + | } |
| + | } |
| + | } |
| + | // Activate the selected stylesheets and disable the rest. |
| + | for (var x = 0, link; link = links[x]; x++) { |
| + | if (link.rel.indexOf("stylesheet") !== -1) { |
| + | link.disabled = !(link.href in activeStylesheets); |
| + | } |
| + | } |
| + | // Create any new stylesheets. |
| + | for (var y = 0; y < names.length; y++) { |
| + | var name = names[y]; |
| + | if (!(name in matchedNames)) { |
| + | var link = this.win.document.createElement("link"); |
| + | link.rel = "stylesheet"; |
| + | link.type = "text/css"; |
| + | link.href = name; |
| + | this.win.document.getElementsByTagName('head')[0].appendChild(link); |
| + | } |
| + | } |
| + | }, |
| + | setTextWrapping: function(on) { |
| + | if (on == this.options.textWrapping) return; |
| + | this.win.document.body.style.whiteSpace = on ? "" : "nowrap"; |
| + | this.options.textWrapping = on; |
| + | if (this.lineNumbers) { |
| + | this.setLineNumbers(false); |
| + | this.setLineNumbers(true); |
| + | } |
| + | }, |
| + | setIndentUnit: function(unit) {this.win.indentUnit = unit;}, |
| + | setUndoDepth: function(depth) {this.editor.history.maxDepth = depth;}, |
| + | setTabMode: function(mode) {this.options.tabMode = mode;}, |
| + | setLineNumbers: function(on) { |
| + | if (on && !this.lineNumbers) { |
| + | this.lineNumbers = addLineNumberDiv(this.wrapping); |
| + | this.activateLineNumbers(); |
| + | } |
| + | else if (!on && this.lineNumbers) { |
| + | this.wrapping.removeChild(this.lineNumbers); |
| + | this.wrapping.style.marginLeft = ""; |
| + | this.lineNumbers = null; |
| + | } |
| + | }, |
| + | |
| + | cursorPosition: function(start) {this.focusIfIE(); return this.editor.cursorPosition(start);}, |
| + | firstLine: function() {return this.editor.firstLine();}, |
| + | lastLine: function() {return this.editor.lastLine();}, |
| + | nextLine: function(line) {return this.editor.nextLine(line);}, |
| + | prevLine: function(line) {return this.editor.prevLine(line);}, |
| + | lineContent: function(line) {return this.editor.lineContent(line);}, |
| + | setLineContent: function(line, content) {this.editor.setLineContent(line, content);}, |
| + | removeLine: function(line){this.editor.removeLine(line);}, |
| + | insertIntoLine: function(line, position, content) {this.editor.insertIntoLine(line, position, content);}, |
| + | selectLines: function(startLine, startOffset, endLine, endOffset) { |
| + | this.win.focus(); |
| + | this.editor.selectLines(startLine, startOffset, endLine, endOffset); |
| + | }, |
| + | nthLine: function(n) { |
| + | var line = this.firstLine(); |
| + | for (; n > 1 && line !== false; n--) |
| + | line = this.nextLine(line); |
| + | return line; |
| + | }, |
| + | lineNumber: function(line) { |
| + | var num = 0; |
| + | while (line !== false) { |
| + | num++; |
| + | line = this.prevLine(line); |
| + | } |
| + | return num; |
| + | }, |
| + | jumpToLine: function(line) { |
| + | if (typeof line == "number") line = this.nthLine(line); |
| + | this.selectLines(line, 0); |
| + | this.win.focus(); |
| + | }, |
| + | currentLine: function() { // Deprecated, but still there for backward compatibility |
| + | return this.lineNumber(this.cursorLine()); |
| + | }, |
| + | cursorLine: function() { |
| + | return this.cursorPosition().line; |
| + | }, |
| + | cursorCoords: function(start) {return this.editor.cursorCoords(start);}, |
| + | |
| + | activateLineNumbers: function() { |
| + | var frame = this.frame, win = frame.contentWindow, doc = win.document, body = doc.body, |
| + | nums = this.lineNumbers, scroller = nums.firstChild, self = this; |
| + | var barWidth = null; |
| + | |
| + | function sizeBar() { |
| + | if (frame.offsetWidth == 0) return; |
| + | for (var root = frame; root.parentNode; root = root.parentNode); |
| + | if (!nums.parentNode || root != document || !win.Editor) { |
| + | // Clear event handlers (their nodes might already be collected, so try/catch) |
| + | try{clear();}catch(e){} |
| + | clearInterval(sizeInterval); |
| + | return; |
| + | } |
| + | |
| + | if (nums.offsetWidth != barWidth) { |
| + | barWidth = nums.offsetWidth; |
| + | frame.parentNode.style.paddingLeft = barWidth + "px"; |
| + | } |
| + | } |
| + | function doScroll() { |
| + | nums.scrollTop = body.scrollTop || doc.documentElement.scrollTop || 0; |
| + | } |
| + | // Cleanup function, registered by nonWrapping and wrapping. |
| + | var clear = function(){}; |
| + | sizeBar(); |
| + | var sizeInterval = setInterval(sizeBar, 500); |
| + | |
| + | function ensureEnoughLineNumbers(fill) { |
| + | var lineHeight = scroller.firstChild.offsetHeight; |
| + | if (lineHeight == 0) return; |
| + | var targetHeight = 50 + Math.max(body.offsetHeight, Math.max(frame.offsetHeight, body.scrollHeight || 0)), |
| + | lastNumber = Math.ceil(targetHeight / lineHeight); |
| + | for (var i = scroller.childNodes.length; i <= lastNumber; i++) { |
| + | var div = document.createElement("DIV"); |
| + | div.appendChild(document.createTextNode(fill ? String(i + 1) : "\u00a0")); |
| + | scroller.appendChild(div); |
| + | } |
| + | } |
| + | |
| + | function nonWrapping() { |
| + | function update() { |
| + | ensureEnoughLineNumbers(true); |
| + | doScroll(); |
| + | } |
| + | self.updateNumbers = update; |
| + | var onScroll = win.addEventHandler(win, "scroll", doScroll, true), |
| + | onResize = win.addEventHandler(win, "resize", update, true); |
| + | clear = function(){ |
| + | onScroll(); onResize(); |
| + | if (self.updateNumbers == update) self.updateNumbers = null; |
| + | }; |
| + | update(); |
| + | } |
| + | |
| + | function wrapping() { |
| + | var node, lineNum, next, pos, changes = [], styleNums = self.options.styleNumbers; |
| + | |
| + | function setNum(n, node) { |
| + | // Does not typically happen (but can, if you mess with the |
| + | // document during the numbering) |
| + | if (!lineNum) lineNum = scroller.appendChild(document.createElement("DIV")); |
| + | if (styleNums) styleNums(lineNum, node, n); |
| + | // Changes are accumulated, so that the document layout |
| + | // doesn't have to be recomputed during the pass |
| + | changes.push(lineNum); changes.push(n); |
| + | pos = lineNum.offsetHeight + lineNum.offsetTop; |
| + | lineNum = lineNum.nextSibling; |
| + | } |
| + | function commitChanges() { |
| + | for (var i = 0; i < changes.length; i += 2) |
| + | changes[i].innerHTML = changes[i + 1]; |
| + | changes = []; |
| + | } |
| + | function work() { |
| + | if (!scroller.parentNode || scroller.parentNode != self.lineNumbers) return; |
| + | |
| + | var endTime = new Date().getTime() + self.options.lineNumberTime; |
| + | while (node) { |
| + | setNum(next++, node.previousSibling); |
| + | for (; node && !win.isBR(node); node = node.nextSibling) { |
| + | var bott = node.offsetTop + node.offsetHeight; |
| + | while (scroller.offsetHeight && bott - 3 > pos) setNum(" "); |
| + | } |
| + | if (node) node = node.nextSibling; |
| + | if (new Date().getTime() > endTime) { |
| + | commitChanges(); |
| + | pending = setTimeout(work, self.options.lineNumberDelay); |
| + | return; |
| + | } |
| + | } |
| + | while (lineNum) setNum(next++); |
| + | commitChanges(); |
| + | doScroll(); |
| + | } |
| + | function start(firstTime) { |
| + | doScroll(); |
| + | ensureEnoughLineNumbers(firstTime); |
| + | node = body.firstChild; |
| + | lineNum = scroller.firstChild; |
| + | pos = 0; |
| + | next = 1; |
| + | work(); |
| + | } |
| + | |
| + | start(true); |
| + | var pending = null; |
| + | function update() { |
| + | if (pending) clearTimeout(pending); |
| + | if (self.editor.allClean()) start(); |
| + | else pending = setTimeout(update, 200); |
| + | } |
| + | self.updateNumbers = update; |
| + | var onScroll = win.addEventHandler(win, "scroll", doScroll, true), |
| + | onResize = win.addEventHandler(win, "resize", update, true); |
| + | clear = function(){ |
| + | if (pending) clearTimeout(pending); |
| + | if (self.updateNumbers == update) self.updateNumbers = null; |
| + | onScroll(); |
| + | onResize(); |
| + | }; |
| + | } |
| + | (this.options.textWrapping || this.options.styleNumbers ? wrapping : nonWrapping)(); |
| + | }, |
| + | |
| + | setDynamicHeight: function() { |
| + | var self = this, activity = self.options.cursorActivity, win = self.win, body = win.document.body, |
| + | lineHeight = null, timeout = null, vmargin = 2 * self.frame.offsetTop; |
| + | body.style.overflowY = "hidden"; |
| + | win.document.documentElement.style.overflowY = "hidden"; |
| + | this.frame.scrolling = "no"; |
| + | |
| + | function updateHeight() { |
| + | for (var span = body.firstChild, sawBR = false; span; span = span.nextSibling) |
| + | if (win.isSpan(span) && span.offsetHeight) { |
| + | lineHeight = span.offsetHeight; |
| + | if (!sawBR) vmargin = 2 * (self.frame.offsetTop + span.offsetTop + body.offsetTop + (internetExplorer ? 10 : 0)); |
| + | break; |
| + | } |
| + | if (lineHeight) |
| + | self.wrapping.style.height = Math.max(vmargin + lineHeight * (body.getElementsByTagName("BR").length + 1), |
| + | self.options.minHeight) + "px"; |
| + | } |
| + | setTimeout(updateHeight, 100); |
| + | self.options.cursorActivity = function(x) { |
| + | if (activity) activity(x); |
| + | clearTimeout(timeout); |
| + | timeout = setTimeout(updateHeight, 200); |
| + | }; |
| + | } |
| + | }; |
| + | |
| + | CodeMirror.InvalidLineHandle = {toString: function(){return "CodeMirror.InvalidLineHandle";}}; |
| + | |
| + | CodeMirror.replace = function(element) { |
| + | if (typeof element == "string") |
| + | element = document.getElementById(element); |
| + | return function(newElement) { |
| + | element.parentNode.replaceChild(newElement, element); |
| + | }; |
| + | }; |
| + | |
| + | CodeMirror.fromTextArea = function(area, options) { |
| + | if (typeof area == "string") |
| + | area = document.getElementById(area); |
| + | |
| + | options = options || {}; |
| + | if (area.style.width && options.width == null) |
| + | options.width = area.style.width; |
| + | if (area.style.height && options.height == null) |
| + | options.height = area.style.height; |
| + | if (options.content == null) options.content = area.value; |
| + | |
| + | if (area.form) { |
| + | function updateField() { |
| + | area.value = mirror.getCode(); |
| + | } |
| + | if (typeof area.form.addEventListener == "function") |
| + | area.form.addEventListener("submit", updateField, false); |
| + | else |
| + | area.form.attachEvent("onsubmit", updateField); |
| + | var realSubmit = area.form.submit; |
| + | function wrapSubmit() { |
| + | updateField(); |
| + | // Can't use realSubmit.apply because IE6 is too stupid |
| + | area.form.submit = realSubmit; |
| + | area.form.submit(); |
| + | area.form.submit = wrapSubmit; |
| + | } |
| + | area.form.submit = wrapSubmit; |
| + | } |
| + | |
| + | function insert(frame) { |
| + | if (area.nextSibling) |
| + | area.parentNode.insertBefore(frame, area.nextSibling); |
| + | else |
| + | area.parentNode.appendChild(frame); |
| + | } |
| + | |
| + | area.style.display = "none"; |
| + | var mirror = new CodeMirror(insert, options); |
| + | mirror.toTextArea = function() { |
| + | area.parentNode.removeChild(mirror.wrapping); |
| + | area.style.display = ""; |
| + | if (area.form) { |
| + | area.form.submit = realSubmit; |
| + | if (typeof area.form.removeEventListener == "function") |
| + | area.form.removeEventListener("submit", updateField, false); |
| + | else |
| + | area.form.detachEvent("onsubmit", updateField); |
| + | } |
| + | }; |
| + | |
| + | return mirror; |
| + | }; |
| + | |
| + | CodeMirror.isProbablySupported = function() { |
| + | // This is rather awful, but can be useful. |
| + | var match; |
| + | if (window.opera) |
| + | return Number(window.opera.version()) >= 9.52; |
| + | else if (/Apple Computers, Inc/.test(navigator.vendor) && (match = navigator.userAgent.match(/Version\/(\d+(?:\.\d+)?)\./))) |
| + | return Number(match[1]) >= 3; |
| + | else if (document.selection && window.ActiveXObject && (match = navigator.userAgent.match(/MSIE (\d+(?:\.\d*)?)\b/))) |
| + | return Number(match[1]) >= 6; |
| + | else if (match = navigator.userAgent.match(/gecko\/(\d{8})/i)) |
| + | return Number(match[1]) >= 20050901; |
| + | else if (match = navigator.userAgent.match(/AppleWebKit\/(\d+)/)) |
| + | return Number(match[1]) >= 525; |
| + | else |
| + | return null; |
| + | }; |
| + | |
| + | return CodeMirror; |
| + | })(); |
public/javascripts/cms/3rdparty/codemirror/editor.js
+1514
-0
| @@ | @@ -0,0 +1,1514 @@ |
| + | /* The Editor object manages the content of the editable frame. It |
| + | * catches events, colours nodes, and indents lines. This file also |
| + | * holds some functions for transforming arbitrary DOM structures into |
| + | * plain sequences of <span> and <br> elements |
| + | */ |
| + | |
| + | var internetExplorer = document.selection && window.ActiveXObject && /MSIE/.test(navigator.userAgent); |
| + | var webkit = /AppleWebKit/.test(navigator.userAgent); |
| + | var safari = /Apple Computers, Inc/.test(navigator.vendor); |
| + | var gecko = /gecko\/(\d{8})/i.test(navigator.userAgent); |
| + | // TODO this is related to the backspace-at-end-of-line bug. Remove |
| + | // this if Opera gets their act together, make the version check more |
| + | // broad if they don't. |
| + | var brokenOpera = window.opera && /Version\/10.[56]/.test(navigator.userAgent); |
| + | |
| + | // Make sure a string does not contain two consecutive 'collapseable' |
| + | // whitespace characters. |
| + | function makeWhiteSpace(n) { |
| + | var buffer = [], nb = true; |
| + | for (; n > 0; n--) { |
| + | buffer.push((nb || n == 1) ? nbsp : " "); |
| + | nb ^= true; |
| + | } |
| + | return buffer.join(""); |
| + | } |
| + | |
| + | // Create a set of white-space characters that will not be collapsed |
| + | // by the browser, but will not break text-wrapping either. |
| + | function fixSpaces(string) { |
| + | if (string.charAt(0) == " ") string = nbsp + string.slice(1); |
| + | return string.replace(/\t/g, function() {return makeWhiteSpace(indentUnit);}) |
| + | .replace(/[ \u00a0]{2,}/g, function(s) {return makeWhiteSpace(s.length);}); |
| + | } |
| + | |
| + | function cleanText(text) { |
| + | return text.replace(/\u00a0/g, " "); |
| + | } |
| + | |
| + | // Create a SPAN node with the expected properties for document part |
| + | // spans. |
| + | function makePartSpan(value, doc) { |
| + | var text = value; |
| + | if (value.nodeType == 3) text = value.nodeValue; |
| + | else value = doc.createTextNode(text); |
| + | |
| + | var span = doc.createElement("SPAN"); |
| + | span.isPart = true; |
| + | span.appendChild(value); |
| + | span.currentText = text; |
| + | return span; |
| + | } |
| + | |
| + | var Editor = (function(){ |
| + | // The HTML elements whose content should be suffixed by a newline |
| + | // when converting them to flat text. |
| + | var newlineElements = {"P": true, "DIV": true, "LI": true}; |
| + | |
| + | function asEditorLines(string) { |
| + | var tab = makeWhiteSpace(indentUnit); |
| + | return map(string.replace(/\t/g, tab).replace(/\u00a0/g, " ").replace(/\r\n?/g, "\n").split("\n"), fixSpaces); |
| + | } |
| + | |
| + | // Helper function for traverseDOM. Flattens an arbitrary DOM node |
| + | // into an array of textnodes and <br> tags. |
| + | function simplifyDOM(root, atEnd) { |
| + | var doc = root.ownerDocument; |
| + | var result = []; |
| + | var leaving = true; |
| + | |
| + | function simplifyNode(node, top) { |
| + | if (node.nodeType == 3) { |
| + | var text = node.nodeValue = fixSpaces(node.nodeValue.replace(/\r/g, "").replace(/\n/g, " ")); |
| + | if (text.length) leaving = false; |
| + | result.push(node); |
| + | } |
| + | else if (isBR(node) && node.childNodes.length == 0) { |
| + | leaving = true; |
| + | result.push(node); |
| + | } |
| + | else { |
| + | for (var n = node.firstChild; n; n = n.nextSibling) simplifyNode(n); |
| + | if (!leaving && newlineElements.hasOwnProperty(node.nodeName.toUpperCase())) { |
| + | leaving = true; |
| + | if (!atEnd || !top) |
| + | result.push(doc.createElement("BR")); |
| + | } |
| + | } |
| + | } |
| + | |
| + | simplifyNode(root, true); |
| + | return result; |
| + | } |
| + | |
| + | // Creates a MochiKit-style iterator that goes over a series of DOM |
| + | // nodes. The values it yields are strings, the textual content of |
| + | // the nodes. It makes sure that all nodes up to and including the |
| + | // one whose text is being yielded have been 'normalized' to be just |
| + | // <span> and <br> elements. |
| + | function traverseDOM(start){ |
| + | var owner = start.ownerDocument; |
| + | var nodeQueue = []; |
| + | |
| + | // Create a function that can be used to insert nodes after the |
| + | // one given as argument. |
| + | function pointAt(node){ |
| + | var parent = node.parentNode; |
| + | var next = node.nextSibling; |
| + | return function(newnode) { |
| + | parent.insertBefore(newnode, next); |
| + | }; |
| + | } |
| + | var point = null; |
| + | |
| + | // This an Opera-specific hack -- always insert an empty span |
| + | // between two BRs, because Opera's cursor code gets terribly |
| + | // confused when the cursor is between two BRs. |
| + | var afterBR = true; |
| + | |
| + | // Insert a normalized node at the current point. If it is a text |
| + | // node, wrap it in a <span>, and give that span a currentText |
| + | // property -- this is used to cache the nodeValue, because |
| + | // directly accessing nodeValue is horribly slow on some browsers. |
| + | // The dirty property is used by the highlighter to determine |
| + | // which parts of the document have to be re-highlighted. |
| + | function insertPart(part){ |
| + | var text = "\n"; |
| + | if (part.nodeType == 3) { |
| + | select.snapshotChanged(); |
| + | part = makePartSpan(part, owner); |
| + | text = part.currentText; |
| + | afterBR = false; |
| + | } |
| + | else { |
| + | if (afterBR && window.opera) |
| + | point(makePartSpan("", owner)); |
| + | afterBR = true; |
| + | } |
| + | part.dirty = true; |
| + | nodeQueue.push(part); |
| + | point(part); |
| + | return text; |
| + | } |
| + | |
| + | // Extract the text and newlines from a DOM node, insert them into |
| + | // the document, and return the textual content. Used to replace |
| + | // non-normalized nodes. |
| + | function writeNode(node, end) { |
| + | var simplified = simplifyDOM(node, end); |
| + | for (var i = 0; i < simplified.length; i++) |
| + | simplified[i] = insertPart(simplified[i]); |
| + | return simplified.join(""); |
| + | } |
| + | |
| + | // Check whether a node is a normalized <span> element. |
| + | function partNode(node){ |
| + | if (node.isPart && node.childNodes.length == 1 && node.firstChild.nodeType == 3) { |
| + | node.currentText = node.firstChild.nodeValue; |
| + | return !/[\n\t\r]/.test(node.currentText); |
| + | } |
| + | return false; |
| + | } |
| + | |
| + | // Advance to next node, return string for current node. |
| + | function next() { |
| + | if (!start) throw StopIteration; |
| + | var node = start; |
| + | start = node.nextSibling; |
| + | |
| + | if (partNode(node)){ |
| + | nodeQueue.push(node); |
| + | afterBR = false; |
| + | return node.currentText; |
| + | } |
| + | else if (isBR(node)) { |
| + | if (afterBR && window.opera) |
| + | node.parentNode.insertBefore(makePartSpan("", owner), node); |
| + | nodeQueue.push(node); |
| + | afterBR = true; |
| + | return "\n"; |
| + | } |
| + | else { |
| + | var end = !node.nextSibling; |
| + | point = pointAt(node); |
| + | removeElement(node); |
| + | return writeNode(node, end); |
| + | } |
| + | } |
| + | |
| + | // MochiKit iterators are objects with a next function that |
| + | // returns the next value or throws StopIteration when there are |
| + | // no more values. |
| + | return {next: next, nodes: nodeQueue}; |
| + | } |
| + | |
| + | // Determine the text size of a processed node. |
| + | function nodeSize(node) { |
| + | return isBR(node) ? 1 : node.currentText.length; |
| + | } |
| + | |
| + | // Search backwards through the top-level nodes until the next BR or |
| + | // the start of the frame. |
| + | function startOfLine(node) { |
| + | while (node && !isBR(node)) node = node.previousSibling; |
| + | return node; |
| + | } |
| + | function endOfLine(node, container) { |
| + | if (!node) node = container.firstChild; |
| + | else if (isBR(node)) node = node.nextSibling; |
| + | |
| + | while (node && !isBR(node)) node = node.nextSibling; |
| + | return node; |
| + | } |
| + | |
| + | function time() {return new Date().getTime();} |
| + | |
| + | // Client interface for searching the content of the editor. Create |
| + | // these by calling CodeMirror.getSearchCursor. To use, call |
| + | // findNext on the resulting object -- this returns a boolean |
| + | // indicating whether anything was found, and can be called again to |
| + | // skip to the next find. Use the select and replace methods to |
| + | // actually do something with the found locations. |
| + | function SearchCursor(editor, string, fromCursor, caseFold) { |
| + | this.editor = editor; |
| + | if (caseFold == undefined) { |
| + | caseFold = (string == string.toLowerCase()); |
| + | } |
| + | this.caseFold = caseFold; |
| + | if (caseFold) string = string.toLowerCase(); |
| + | this.history = editor.history; |
| + | this.history.commit(); |
| + | |
| + | // Are we currently at an occurrence of the search string? |
| + | this.atOccurrence = false; |
| + | // The object stores a set of nodes coming after its current |
| + | // position, so that when the current point is taken out of the |
| + | // DOM tree, we can still try to continue. |
| + | this.fallbackSize = 15; |
| + | var cursor; |
| + | // Start from the cursor when specified and a cursor can be found. |
| + | if (fromCursor && (cursor = select.cursorPos(this.editor.container))) { |
| + | this.line = cursor.node; |
| + | this.offset = cursor.offset; |
| + | } |
| + | else { |
| + | this.line = null; |
| + | this.offset = 0; |
| + | } |
| + | this.valid = !!string; |
| + | |
| + | // Create a matcher function based on the kind of string we have. |
| + | var target = string.split("\n"), self = this; |
| + | this.matches = (target.length == 1) ? |
| + | // For one-line strings, searching can be done simply by calling |
| + | // indexOf on the current line. |
| + | function() { |
| + | var line = cleanText(self.history.textAfter(self.line).slice(self.offset)); |
| + | var match = (self.caseFold ? line.toLowerCase() : line).indexOf(string); |
| + | if (match > -1) |
| + | return {from: {node: self.line, offset: self.offset + match}, |
| + | to: {node: self.line, offset: self.offset + match + string.length}}; |
| + | } : |
| + | // Multi-line strings require internal iteration over lines, and |
| + | // some clunky checks to make sure the first match ends at the |
| + | // end of the line and the last match starts at the start. |
| + | function() { |
| + | var firstLine = cleanText(self.history.textAfter(self.line).slice(self.offset)); |
| + | var match = (self.caseFold ? firstLine.toLowerCase() : firstLine).lastIndexOf(target[0]); |
| + | if (match == -1 || match != firstLine.length - target[0].length) |
| + | return false; |
| + | var startOffset = self.offset + match; |
| + | |
| + | var line = self.history.nodeAfter(self.line); |
| + | for (var i = 1; i < target.length - 1; i++) { |
| + | var lineText = cleanText(self.history.textAfter(line)); |
| + | if ((self.caseFold ? lineText.toLowerCase() : lineText) != target[i]) |
| + | return false; |
| + | line = self.history.nodeAfter(line); |
| + | } |
| + | |
| + | var lastLine = cleanText(self.history.textAfter(line)); |
| + | if ((self.caseFold ? lastLine.toLowerCase() : lastLine).indexOf(target[target.length - 1]) != 0) |
| + | return false; |
| + | |
| + | return {from: {node: self.line, offset: startOffset}, |
| + | to: {node: line, offset: target[target.length - 1].length}}; |
| + | }; |
| + | } |
| + | |
| + | SearchCursor.prototype = { |
| + | findNext: function() { |
| + | if (!this.valid) return false; |
| + | this.atOccurrence = false; |
| + | var self = this; |
| + | |
| + | // Go back to the start of the document if the current line is |
| + | // no longer in the DOM tree. |
| + | if (this.line && !this.line.parentNode) { |
| + | this.line = null; |
| + | this.offset = 0; |
| + | } |
| + | |
| + | // Set the cursor's position one character after the given |
| + | // position. |
| + | function saveAfter(pos) { |
| + | if (self.history.textAfter(pos.node).length > pos.offset) { |
| + | self.line = pos.node; |
| + | self.offset = pos.offset + 1; |
| + | } |
| + | else { |
| + | self.line = self.history.nodeAfter(pos.node); |
| + | self.offset = 0; |
| + | } |
| + | } |
| + | |
| + | while (true) { |
| + | var match = this.matches(); |
| + | // Found the search string. |
| + | if (match) { |
| + | this.atOccurrence = match; |
| + | saveAfter(match.from); |
| + | return true; |
| + | } |
| + | this.line = this.history.nodeAfter(this.line); |
| + | this.offset = 0; |
| + | // End of document. |
| + | if (!this.line) { |
| + | this.valid = false; |
| + | return false; |
| + | } |
| + | } |
| + | }, |
| + | |
| + | select: function() { |
| + | if (this.atOccurrence) { |
| + | select.setCursorPos(this.editor.container, this.atOccurrence.from, this.atOccurrence.to); |
| + | select.scrollToCursor(this.editor.container); |
| + | } |
| + | }, |
| + | |
| + | replace: function(string) { |
| + | if (this.atOccurrence) { |
| + | var end = this.editor.replaceRange(this.atOccurrence.from, this.atOccurrence.to, string); |
| + | this.line = end.node; |
| + | this.offset = end.offset; |
| + | this.atOccurrence = false; |
| + | } |
| + | } |
| + | }; |
| + | |
| + | // The Editor object is the main inside-the-iframe interface. |
| + | function Editor(options) { |
| + | this.options = options; |
| + | window.indentUnit = options.indentUnit; |
| + | this.parent = parent; |
| + | this.doc = document; |
| + | var container = this.container = this.doc.body; |
| + | this.win = window; |
| + | this.history = new UndoHistory(container, options.undoDepth, options.undoDelay, this); |
| + | var self = this; |
| + | |
| + | if (!Editor.Parser) |
| + | throw "No parser loaded."; |
| + | if (options.parserConfig && Editor.Parser.configure) |
| + | Editor.Parser.configure(options.parserConfig); |
| + | |
| + | if (!options.readOnly) |
| + | select.setCursorPos(container, {node: null, offset: 0}); |
| + | |
| + | this.dirty = []; |
| + | this.importCode(options.content || ""); |
| + | this.history.onChange = options.onChange; |
| + | |
| + | if (!options.readOnly) { |
| + | if (options.continuousScanning !== false) { |
| + | this.scanner = this.documentScanner(options.passTime); |
| + | this.delayScanning(); |
| + | } |
| + | |
| + | function setEditable() { |
| + | // Use contentEditable instead of designMode on IE, since designMode frames |
| + | // can not run any scripts. It would be nice if we could use contentEditable |
| + | // everywhere, but it is significantly flakier than designMode on every |
| + | // single non-IE browser. |
| + | if (document.body.contentEditable != undefined && internetExplorer) |
| + | document.body.contentEditable = "true"; |
| + | else |
| + | document.designMode = "on"; |
| + | |
| + | document.documentElement.style.borderWidth = "0"; |
| + | if (!options.textWrapping) |
| + | container.style.whiteSpace = "nowrap"; |
| + | } |
| + | |
| + | // If setting the frame editable fails, try again when the user |
| + | // focus it (happens when the frame is not visible on |
| + | // initialisation, in Firefox). |
| + | try { |
| + | setEditable(); |
| + | } |
| + | catch(e) { |
| + | var focusEvent = addEventHandler(document, "focus", function() { |
| + | focusEvent(); |
| + | setEditable(); |
| + | }, true); |
| + | } |
| + | |
| + | addEventHandler(document, "keydown", method(this, "keyDown")); |
| + | addEventHandler(document, "keypress", method(this, "keyPress")); |
| + | addEventHandler(document, "keyup", method(this, "keyUp")); |
| + | |
| + | function cursorActivity() {self.cursorActivity(false);} |
| + | addEventHandler(document.body, "mouseup", cursorActivity); |
| + | addEventHandler(document.body, "cut", cursorActivity); |
| + | |
| + | // workaround for a gecko bug [?] where going forward and then |
| + | // back again breaks designmode (no more cursor) |
| + | if (gecko) |
| + | addEventHandler(this.win, "pagehide", function(){self.unloaded = true;}); |
| + | |
| + | addEventHandler(document.body, "paste", function(event) { |
| + | cursorActivity(); |
| + | var text = null; |
| + | try { |
| + | var clipboardData = event.clipboardData || window.clipboardData; |
| + | if (clipboardData) text = clipboardData.getData('Text'); |
| + | } |
| + | catch(e) {} |
| + | if (text !== null) { |
| + | event.stop(); |
| + | self.replaceSelection(text); |
| + | select.scrollToCursor(self.container); |
| + | } |
| + | }); |
| + | |
| + | if (this.options.autoMatchParens) |
| + | addEventHandler(document.body, "click", method(this, "scheduleParenHighlight")); |
| + | } |
| + | else if (!options.textWrapping) { |
| + | container.style.whiteSpace = "nowrap"; |
| + | } |
| + | } |
| + | |
| + | function isSafeKey(code) { |
| + | return (code >= 16 && code <= 18) || // shift, control, alt |
| + | (code >= 33 && code <= 40); // arrows, home, end |
| + | } |
| + | |
| + | Editor.prototype = { |
| + | // Import a piece of code into the editor. |
| + | importCode: function(code) { |
| + | this.history.push(null, null, asEditorLines(code)); |
| + | this.history.reset(); |
| + | }, |
| + | |
| + | // Extract the code from the editor. |
| + | getCode: function() { |
| + | if (!this.container.firstChild) |
| + | return ""; |
| + | |
| + | var accum = []; |
| + | select.markSelection(this.win); |
| + | forEach(traverseDOM(this.container.firstChild), method(accum, "push")); |
| + | select.selectMarked(); |
| + | return cleanText(accum.join("")); |
| + | }, |
| + | |
| + | checkLine: function(node) { |
| + | if (node === false || !(node == null || node.parentNode == this.container)) |
| + | throw parent.CodeMirror.InvalidLineHandle; |
| + | }, |
| + | |
| + | cursorPosition: function(start) { |
| + | if (start == null) start = true; |
| + | var pos = select.cursorPos(this.container, start); |
| + | if (pos) return {line: pos.node, character: pos.offset}; |
| + | else return {line: null, character: 0}; |
| + | }, |
| + | |
| + | firstLine: function() { |
| + | return null; |
| + | }, |
| + | |
| + | lastLine: function() { |
| + | if (this.container.lastChild) return startOfLine(this.container.lastChild); |
| + | else return null; |
| + | }, |
| + | |
| + | nextLine: function(line) { |
| + | this.checkLine(line); |
| + | var end = endOfLine(line, this.container); |
| + | return end || false; |
| + | }, |
| + | |
| + | prevLine: function(line) { |
| + | this.checkLine(line); |
| + | if (line == null) return false; |
| + | return startOfLine(line.previousSibling); |
| + | }, |
| + | |
| + | visibleLineCount: function() { |
| + | var line = this.container.firstChild; |
| + | while (line && isBR(line)) line = line.nextSibling; // BR heights are unreliable |
| + | if (!line) return false; |
| + | var innerHeight = (window.innerHeight |
| + | || document.documentElement.clientHeight |
| + | || document.body.clientHeight); |
| + | return Math.floor(innerHeight / line.offsetHeight); |
| + | }, |
| + | |
| + | selectLines: function(startLine, startOffset, endLine, endOffset) { |
| + | this.checkLine(startLine); |
| + | var start = {node: startLine, offset: startOffset}, end = null; |
| + | if (endOffset !== undefined) { |
| + | this.checkLine(endLine); |
| + | end = {node: endLine, offset: endOffset}; |
| + | } |
| + | select.setCursorPos(this.container, start, end); |
| + | select.scrollToCursor(this.container); |
| + | }, |
| + | |
| + | lineContent: function(line) { |
| + | var accum = []; |
| + | for (line = line ? line.nextSibling : this.container.firstChild; |
| + | line && !isBR(line); line = line.nextSibling) |
| + | accum.push(nodeText(line)); |
| + | return cleanText(accum.join("")); |
| + | }, |
| + | |
| + | setLineContent: function(line, content) { |
| + | this.history.commit(); |
| + | this.replaceRange({node: line, offset: 0}, |
| + | {node: line, offset: this.history.textAfter(line).length}, |
| + | content); |
| + | this.addDirtyNode(line); |
| + | this.scheduleHighlight(); |
| + | }, |
| + | |
| + | removeLine: function(line) { |
| + | var node = line ? line.nextSibling : this.container.firstChild; |
| + | while (node) { |
| + | var next = node.nextSibling; |
| + | removeElement(node); |
| + | if (isBR(node)) break; |
| + | node = next; |
| + | } |
| + | this.addDirtyNode(line); |
| + | this.scheduleHighlight(); |
| + | }, |
| + | |
| + | insertIntoLine: function(line, position, content) { |
| + | var before = null; |
| + | if (position == "end") { |
| + | before = endOfLine(line, this.container); |
| + | } |
| + | else { |
| + | for (var cur = line ? line.nextSibling : this.container.firstChild; cur; cur = cur.nextSibling) { |
| + | if (position == 0) { |
| + | before = cur; |
| + | break; |
| + | } |
| + | var text = nodeText(cur); |
| + | if (text.length > position) { |
| + | before = cur.nextSibling; |
| + | content = text.slice(0, position) + content + text.slice(position); |
| + | removeElement(cur); |
| + | break; |
| + | } |
| + | position -= text.length; |
| + | } |
| + | } |
| + | |
| + | var lines = asEditorLines(content), doc = this.container.ownerDocument; |
| + | for (var i = 0; i < lines.length; i++) { |
| + | if (i > 0) this.container.insertBefore(doc.createElement("BR"), before); |
| + | this.container.insertBefore(makePartSpan(lines[i], doc), before); |
| + | } |
| + | this.addDirtyNode(line); |
| + | this.scheduleHighlight(); |
| + | }, |
| + | |
| + | // Retrieve the selected text. |
| + | selectedText: function() { |
| + | var h = this.history; |
| + | h.commit(); |
| + | |
| + | var start = select.cursorPos(this.container, true), |
| + | end = select.cursorPos(this.container, false); |
| + | if (!start || !end) return ""; |
| + | |
| + | if (start.node == end.node) |
| + | return h.textAfter(start.node).slice(start.offset, end.offset); |
| + | |
| + | var text = [h.textAfter(start.node).slice(start.offset)]; |
| + | for (var pos = h.nodeAfter(start.node); pos != end.node; pos = h.nodeAfter(pos)) |
| + | text.push(h.textAfter(pos)); |
| + | text.push(h.textAfter(end.node).slice(0, end.offset)); |
| + | return cleanText(text.join("\n")); |
| + | }, |
| + | |
| + | // Replace the selection with another piece of text. |
| + | replaceSelection: function(text) { |
| + | this.history.commit(); |
| + | |
| + | var start = select.cursorPos(this.container, true), |
| + | end = select.cursorPos(this.container, false); |
| + | if (!start || !end) return; |
| + | |
| + | end = this.replaceRange(start, end, text); |
| + | select.setCursorPos(this.container, end); |
| + | }, |
| + | |
| + | cursorCoords: function(start) { |
| + | var sel = select.cursorPos(this.container, start); |
| + | if (!sel) return null; |
| + | var off = sel.offset, node = sel.node, doc = this.win.document, self = this; |
| + | function measureFromNode(node, xOffset) { |
| + | var y = -(self.win.document.body.scrollTop || self.win.document.documentElement.scrollTop || 0), |
| + | x = -(self.win.document.body.scrollLeft || self.win.document.documentElement.scrollLeft || 0) + xOffset; |
| + | forEach([node, self.win.frameElement], function(n) { |
| + | while (n) {x += n.offsetLeft; y += n.offsetTop;n = n.offsetParent;} |
| + | }); |
| + | return {x: x, y: y, yBot: y + node.offsetHeight}; |
| + | } |
| + | function withTempNode(text, f) { |
| + | var node = doc.createElement("SPAN"); |
| + | node.appendChild(doc.createTextNode(text)); |
| + | try {return f(node);} |
| + | finally {if (node.parentNode) node.parentNode.removeChild(node);} |
| + | } |
| + | |
| + | while (off) { |
| + | node = node ? node.nextSibling : this.container.firstChild; |
| + | var txt = nodeText(node); |
| + | if (off < txt.length) |
| + | return withTempNode(txt.substr(0, off), function(tmp) { |
| + | tmp.style.position = "absolute"; tmp.style.visibility = "hidden"; |
| + | tmp.className = node.className; |
| + | self.container.appendChild(tmp); |
| + | return measureFromNode(node, tmp.offsetWidth); |
| + | }); |
| + | off -= txt.length; |
| + | } |
| + | if (node && isSpan(node)) |
| + | return measureFromNode(node, node.offsetWidth); |
| + | else if (node && node.nextSibling && isSpan(node.nextSibling)) |
| + | return measureFromNode(node.nextSibling, 0); |
| + | else |
| + | return withTempNode("\u200b", function(tmp) { |
| + | if (node) node.parentNode.insertBefore(tmp, node.nextSibling); |
| + | else self.container.insertBefore(tmp, self.container.firstChild); |
| + | return measureFromNode(tmp, 0); |
| + | }); |
| + | }, |
| + | |
| + | reroutePasteEvent: function() { |
| + | if (this.capturingPaste || window.opera) return; |
| + | this.capturingPaste = true; |
| + | var te = window.frameElement.CodeMirror.textareaHack; |
| + | parent.focus(); |
| + | te.value = ""; |
| + | te.focus(); |
| + | |
| + | var self = this; |
| + | this.parent.setTimeout(function() { |
| + | self.capturingPaste = false; |
| + | self.win.focus(); |
| + | if (self.selectionSnapshot) // IE hack |
| + | self.win.select.setBookmark(self.container, self.selectionSnapshot); |
| + | var text = te.value; |
| + | if (text) { |
| + | self.replaceSelection(text); |
| + | select.scrollToCursor(self.container); |
| + | } |
| + | }, 10); |
| + | }, |
| + | |
| + | replaceRange: function(from, to, text) { |
| + | var lines = asEditorLines(text); |
| + | lines[0] = this.history.textAfter(from.node).slice(0, from.offset) + lines[0]; |
| + | var lastLine = lines[lines.length - 1]; |
| + | lines[lines.length - 1] = lastLine + this.history.textAfter(to.node).slice(to.offset); |
| + | var end = this.history.nodeAfter(to.node); |
| + | this.history.push(from.node, end, lines); |
| + | return {node: this.history.nodeBefore(end), |
| + | offset: lastLine.length}; |
| + | }, |
| + | |
| + | getSearchCursor: function(string, fromCursor, caseFold) { |
| + | return new SearchCursor(this, string, fromCursor, caseFold); |
| + | }, |
| + | |
| + | // Re-indent the whole buffer |
| + | reindent: function() { |
| + | if (this.container.firstChild) |
| + | this.indentRegion(null, this.container.lastChild); |
| + | }, |
| + | |
| + | reindentSelection: function(direction) { |
| + | if (!select.somethingSelected(this.win)) { |
| + | this.indentAtCursor(direction); |
| + | } |
| + | else { |
| + | var start = select.selectionTopNode(this.container, true), |
| + | end = select.selectionTopNode(this.container, false); |
| + | if (start === false || end === false) return; |
| + | this.indentRegion(start, end, direction); |
| + | } |
| + | }, |
| + | |
| + | grabKeys: function(eventHandler, filter) { |
| + | this.frozen = eventHandler; |
| + | this.keyFilter = filter; |
| + | }, |
| + | ungrabKeys: function() { |
| + | this.frozen = "leave"; |
| + | }, |
| + | |
| + | setParser: function(name, parserConfig) { |
| + | Editor.Parser = window[name]; |
| + | parserConfig = parserConfig || this.options.parserConfig; |
| + | if (parserConfig && Editor.Parser.configure) |
| + | Editor.Parser.configure(parserConfig); |
| + | |
| + | if (this.container.firstChild) { |
| + | forEach(this.container.childNodes, function(n) { |
| + | if (n.nodeType != 3) n.dirty = true; |
| + | }); |
| + | this.addDirtyNode(this.firstChild); |
| + | this.scheduleHighlight(); |
| + | } |
| + | }, |
| + | |
| + | // Intercept enter and tab, and assign their new functions. |
| + | keyDown: function(event) { |
| + | if (this.frozen == "leave") {this.frozen = null; this.keyFilter = null;} |
| + | if (this.frozen && (!this.keyFilter || this.keyFilter(event.keyCode, event))) { |
| + | event.stop(); |
| + | this.frozen(event); |
| + | return; |
| + | } |
| + | |
| + | var code = this.lastKeyDownCode = event.keyCode; |
| + | // Don't scan when the user is typing. |
| + | this.delayScanning(); |
| + | // Schedule a paren-highlight event, if configured. |
| + | if (this.options.autoMatchParens) |
| + | this.scheduleParenHighlight(); |
| + | |
| + | // The various checks for !altKey are there because AltGr sets both |
| + | // ctrlKey and altKey to true, and should not be recognised as |
| + | // Control. |
| + | if (code == 13) { // enter |
| + | if (event.ctrlKey && !event.altKey) { |
| + | this.reparseBuffer(); |
| + | } |
| + | else { |
| + | select.insertNewlineAtCursor(this.win); |
| + | this.indentAtCursor(); |
| + | select.scrollToCursor(this.container); |
| + | } |
| + | event.stop(); |
| + | } |
| + | else if (code == 9 && this.options.tabMode != "default" && !event.ctrlKey) { // tab |
| + | this.handleTab(!event.shiftKey); |
| + | event.stop(); |
| + | } |
| + | else if (code == 32 && event.shiftKey && this.options.tabMode == "default") { // space |
| + | this.handleTab(true); |
| + | event.stop(); |
| + | } |
| + | else if (code == 36 && !event.shiftKey && !event.ctrlKey) { // home |
| + | if (this.home()) event.stop(); |
| + | } |
| + | else if (code == 35 && !event.shiftKey && !event.ctrlKey) { // end |
| + | if (this.end()) event.stop(); |
| + | } |
| + | // Only in Firefox is the default behavior for PgUp/PgDn correct. |
| + | else if (code == 33 && !event.shiftKey && !event.ctrlKey && !gecko) { // PgUp |
| + | if (this.pageUp()) event.stop(); |
| + | } |
| + | else if (code == 34 && !event.shiftKey && !event.ctrlKey && !gecko) { // PgDn |
| + | if (this.pageDown()) event.stop(); |
| + | } |
| + | else if ((code == 219 || code == 221) && event.ctrlKey && !event.altKey) { // [, ] |
| + | this.highlightParens(event.shiftKey, true); |
| + | event.stop(); |
| + | } |
| + | else if (event.metaKey && !event.shiftKey && (code == 37 || code == 39)) { // Meta-left/right |
| + | var cursor = select.selectionTopNode(this.container); |
| + | if (cursor !== false && this.container.firstChild) { |
| + | if (code == 37) select.focusAfterNode(startOfLine(cursor), this.container); |
| + | else { |
| + | var end = endOfLine(cursor, this.container); |
| + | select.focusAfterNode(end ? end.previousSibling : this.container.lastChild, this.container); |
| + | } |
| + | event.stop(); |
| + | } |
| + | } |
| + | else if ((event.ctrlKey || event.metaKey) && !event.altKey) { |
| + | if ((event.shiftKey && code == 90) || code == 89) { // shift-Z, Y |
| + | select.scrollToNode(this.history.redo()); |
| + | event.stop(); |
| + | } |
| + | else if (code == 90 || (safari && code == 8)) { // Z, backspace |
| + | select.scrollToNode(this.history.undo()); |
| + | event.stop(); |
| + | } |
| + | else if (code == 83 && this.options.saveFunction) { // S |
| + | this.options.saveFunction(); |
| + | event.stop(); |
| + | } |
| + | else if (internetExplorer && code == 86) { |
| + | this.reroutePasteEvent(); |
| + | } |
| + | } |
| + | this.keyUpOrPressAfterLastKeyDown = false; |
| + | }, |
| + | |
| + | // Check for characters that should re-indent the current line, |
| + | // and prevent Opera from handling enter and tab anyway. |
| + | keyPress: function(event) { |
| + | this.keyUpOrPressAfterLastKeyDown = true; |
| + | var electric = Editor.Parser.electricChars, self = this; |
| + | // Hack for Opera, and Firefox on OS X, in which stopping a |
| + | // keydown event does not prevent the associated keypress event |
| + | // from happening, so we have to cancel enter and tab again |
| + | // here. |
| + | if ((this.frozen && (!this.keyFilter || this.keyFilter(event.keyCode || event.code, event))) || |
| + | event.code == 13 || (event.code == 9 && this.options.tabMode != "default") || |
| + | (event.code == 32 && event.shiftKey && this.options.tabMode == "default")) |
| + | event.stop(); |
| + | else if (electric && electric.indexOf(event.character) != -1) |
| + | this.parent.setTimeout(function(){self.indentAtCursor(null);}, 0); |
| + | else if ((event.character == "v" || event.character == "V") |
| + | && (event.ctrlKey || event.metaKey) && !event.altKey) // ctrl-V |
| + | this.reroutePasteEvent(); |
| + | // Work around a bug where pressing backspace at the end of a |
| + | // line often causes the cursor to jump to the start of the line |
| + | // in Opera 10.60. |
| + | else if (brokenOpera && event.code == 8) { |
| + | var sel = select.selectionTopNode(this.container), self = this, |
| + | next = sel ? sel.nextSibling : this.container.firstChild; |
| + | if (sel !== false && next && isBR(next)) |
| + | this.parent.setTimeout(function(){ |
| + | if (select.selectionTopNode(self.container) == next) |
| + | select.focusAfterNode(next.previousSibling, self.container); |
| + | }, 20); |
| + | } |
| + | }, |
| + | |
| + | // Mark the node at the cursor dirty when a non-safe key is |
| + | // released. |
| + | keyUp: function(event) { |
| + | this.keyUpOrPressAfterLastKeyDown = true; |
| + | this.cursorActivity(isSafeKey(event.keyCode)); |
| + | }, |
| + | |
| + | // Indent the line following a given <br>, or null for the first |
| + | // line. If given a <br> element, this must have been highlighted |
| + | // so that it has an indentation method. Returns the whitespace |
| + | // element that has been modified or created (if any). |
| + | indentLineAfter: function(start, direction) { |
| + | // whiteSpace is the whitespace span at the start of the line, |
| + | // or null if there is no such node. |
| + | var whiteSpace = start ? start.nextSibling : this.container.firstChild; |
| + | if (whiteSpace && !hasClass(whiteSpace, "whitespace")) |
| + | whiteSpace = null; |
| + | |
| + | // Sometimes the start of the line can influence the correct |
| + | // indentation, so we retrieve it. |
| + | var firstText = whiteSpace ? whiteSpace.nextSibling : (start ? start.nextSibling : this.container.firstChild); |
| + | var nextChars = (start && firstText && firstText.currentText) ? firstText.currentText : ""; |
| + | |
| + | // Ask the lexical context for the correct indentation, and |
| + | // compute how much this differs from the current indentation. |
| + | var newIndent = 0, curIndent = whiteSpace ? whiteSpace.currentText.length : 0; |
| + | if (direction != null && this.options.tabMode == "shift") |
| + | newIndent = direction ? curIndent + indentUnit : Math.max(0, curIndent - indentUnit) |
| + | else if (start) |
| + | newIndent = start.indentation(nextChars, curIndent, direction); |
| + | else if (Editor.Parser.firstIndentation) |
| + | newIndent = Editor.Parser.firstIndentation(nextChars, curIndent, direction); |
| + | var indentDiff = newIndent - curIndent; |
| + | |
| + | // If there is too much, this is just a matter of shrinking a span. |
| + | if (indentDiff < 0) { |
| + | if (newIndent == 0) { |
| + | if (firstText) select.snapshotMove(whiteSpace.firstChild, firstText.firstChild, 0); |
| + | removeElement(whiteSpace); |
| + | whiteSpace = null; |
| + | } |
| + | else { |
| + | select.snapshotMove(whiteSpace.firstChild, whiteSpace.firstChild, indentDiff, true); |
| + | whiteSpace.currentText = makeWhiteSpace(newIndent); |
| + | whiteSpace.firstChild.nodeValue = whiteSpace.currentText; |
| + | } |
| + | } |
| + | // Not enough... |
| + | else if (indentDiff > 0) { |
| + | // If there is whitespace, we grow it. |
| + | if (whiteSpace) { |
| + | whiteSpace.currentText = makeWhiteSpace(newIndent); |
| + | whiteSpace.firstChild.nodeValue = whiteSpace.currentText; |
| + | select.snapshotMove(whiteSpace.firstChild, whiteSpace.firstChild, indentDiff, true); |
| + | } |
| + | // Otherwise, we have to add a new whitespace node. |
| + | else { |
| + | whiteSpace = makePartSpan(makeWhiteSpace(newIndent), this.doc); |
| + | whiteSpace.className = "whitespace"; |
| + | if (start) insertAfter(whiteSpace, start); |
| + | else this.container.insertBefore(whiteSpace, this.container.firstChild); |
| + | select.snapshotMove(firstText && (firstText.firstChild || firstText), |
| + | whiteSpace.firstChild, newIndent, false, true); |
| + | } |
| + | } |
| + | if (indentDiff != 0) this.addDirtyNode(start); |
| + | }, |
| + | |
| + | // Re-highlight the selected part of the document. |
| + | highlightAtCursor: function() { |
| + | var pos = select.selectionTopNode(this.container, true); |
| + | var to = select.selectionTopNode(this.container, false); |
| + | if (pos === false || to === false) return false; |
| + | |
| + | select.markSelection(this.win); |
| + | if (this.highlight(pos, endOfLine(to, this.container), true, 20) === false) |
| + | return false; |
| + | select.selectMarked(); |
| + | return true; |
| + | }, |
| + | |
| + | // When tab is pressed with text selected, the whole selection is |
| + | // re-indented, when nothing is selected, the line with the cursor |
| + | // is re-indented. |
| + | handleTab: function(direction) { |
| + | if (this.options.tabMode == "spaces") |
| + | select.insertTabAtCursor(this.win); |
| + | else |
| + | this.reindentSelection(direction); |
| + | }, |
| + | |
| + | // Custom home behaviour that doesn't land the cursor in front of |
| + | // leading whitespace unless pressed twice. |
| + | home: function() { |
| + | var cur = select.selectionTopNode(this.container, true), start = cur; |
| + | if (cur === false || !(!cur || cur.isPart || isBR(cur)) || !this.container.firstChild) |
| + | return false; |
| + | |
| + | while (cur && !isBR(cur)) cur = cur.previousSibling; |
| + | var next = cur ? cur.nextSibling : this.container.firstChild; |
| + | if (next && next != start && next.isPart && hasClass(next, "whitespace")) |
| + | select.focusAfterNode(next, this.container); |
| + | else |
| + | select.focusAfterNode(cur, this.container); |
| + | |
| + | select.scrollToCursor(this.container); |
| + | return true; |
| + | }, |
| + | |
| + | // Some browsers (Opera) don't manage to handle the end key |
| + | // properly in the face of vertical scrolling. |
| + | end: function() { |
| + | var cur = select.selectionTopNode(this.container, true); |
| + | if (cur === false) return false; |
| + | cur = endOfLine(cur, this.container); |
| + | if (!cur) return false; |
| + | select.focusAfterNode(cur.previousSibling, this.container); |
| + | select.scrollToCursor(this.container); |
| + | return true; |
| + | }, |
| + | |
| + | pageUp: function() { |
| + | var line = this.cursorPosition().line, scrollAmount = this.visibleLineCount(); |
| + | if (line === false || scrollAmount === false) return false; |
| + | // Try to keep one line on the screen. |
| + | scrollAmount -= 2; |
| + | for (var i = 0; i < scrollAmount; i++) { |
| + | line = this.prevLine(line); |
| + | if (line === false) break; |
| + | } |
| + | if (i == 0) return false; // Already at first line |
| + | select.setCursorPos(this.container, {node: line, offset: 0}); |
| + | select.scrollToCursor(this.container); |
| + | return true; |
| + | }, |
| + | |
| + | pageDown: function() { |
| + | var line = this.cursorPosition().line, scrollAmount = this.visibleLineCount(); |
| + | if (line === false || scrollAmount === false) return false; |
| + | // Try to move to the last line of the current page. |
| + | scrollAmount -= 2; |
| + | for (var i = 0; i < scrollAmount; i++) { |
| + | var nextLine = this.nextLine(line); |
| + | if (nextLine === false) break; |
| + | line = nextLine; |
| + | } |
| + | if (i == 0) return false; // Already at last line |
| + | select.setCursorPos(this.container, {node: line, offset: 0}); |
| + | select.scrollToCursor(this.container); |
| + | return true; |
| + | }, |
| + | |
| + | // Delay (or initiate) the next paren highlight event. |
| + | scheduleParenHighlight: function() { |
| + | if (this.parenEvent) this.parent.clearTimeout(this.parenEvent); |
| + | var self = this; |
| + | this.parenEvent = this.parent.setTimeout(function(){self.highlightParens();}, 300); |
| + | }, |
| + | |
| + | // Take the token before the cursor. If it contains a character in |
| + | // '()[]{}', search for the matching paren/brace/bracket, and |
| + | // highlight them in green for a moment, or red if no proper match |
| + | // was found. |
| + | highlightParens: function(jump, fromKey) { |
| + | var self = this; |
| + | // give the relevant nodes a colour. |
| + | function highlight(node, ok) { |
| + | if (!node) return; |
| + | if (self.options.markParen) { |
| + | self.options.markParen(node, ok); |
| + | } |
| + | else { |
| + | node.style.fontWeight = "bold"; |
| + | node.style.color = ok ? "#8F8" : "#F88"; |
| + | } |
| + | } |
| + | function unhighlight(node) { |
| + | if (!node) return; |
| + | if (self.options.unmarkParen) { |
| + | self.options.unmarkParen(node); |
| + | } |
| + | else { |
| + | node.style.fontWeight = ""; |
| + | node.style.color = ""; |
| + | } |
| + | } |
| + | if (!fromKey && self.highlighted) { |
| + | unhighlight(self.highlighted[0]); |
| + | unhighlight(self.highlighted[1]); |
| + | } |
| + | |
| + | if (!window.select) return; |
| + | // Clear the event property. |
| + | if (this.parenEvent) this.parent.clearTimeout(this.parenEvent); |
| + | this.parenEvent = null; |
| + | |
| + | // Extract a 'paren' from a piece of text. |
| + | function paren(node) { |
| + | if (node.currentText) { |
| + | var match = node.currentText.match(/^[\s\u00a0]*([\(\)\[\]{}])[\s\u00a0]*$/); |
| + | return match && match[1]; |
| + | } |
| + | } |
| + | // Determine the direction a paren is facing. |
| + | function forward(ch) { |
| + | return /[\(\[\{]/.test(ch); |
| + | } |
| + | |
| + | var ch, cursor = select.selectionTopNode(this.container, true); |
| + | if (!cursor || !this.highlightAtCursor()) return; |
| + | cursor = select.selectionTopNode(this.container, true); |
| + | if (!(cursor && ((ch = paren(cursor)) || (cursor = cursor.nextSibling) && (ch = paren(cursor))))) |
| + | return; |
| + | // We only look for tokens with the same className. |
| + | var className = cursor.className, dir = forward(ch), match = matching[ch]; |
| + | |
| + | // Since parts of the document might not have been properly |
| + | // highlighted, and it is hard to know in advance which part we |
| + | // have to scan, we just try, and when we find dirty nodes we |
| + | // abort, parse them, and re-try. |
| + | function tryFindMatch() { |
| + | var stack = [], ch, ok = true; |
| + | for (var runner = cursor; runner; runner = dir ? runner.nextSibling : runner.previousSibling) { |
| + | if (runner.className == className && isSpan(runner) && (ch = paren(runner))) { |
| + | if (forward(ch) == dir) |
| + | stack.push(ch); |
| + | else if (!stack.length) |
| + | ok = false; |
| + | else if (stack.pop() != matching[ch]) |
| + | ok = false; |
| + | if (!stack.length) break; |
| + | } |
| + | else if (runner.dirty || !isSpan(runner) && !isBR(runner)) { |
| + | return {node: runner, status: "dirty"}; |
| + | } |
| + | } |
| + | return {node: runner, status: runner && ok}; |
| + | } |
| + | |
| + | while (true) { |
| + | var found = tryFindMatch(); |
| + | if (found.status == "dirty") { |
| + | this.highlight(found.node, endOfLine(found.node)); |
| + | // Needed because in some corner cases a highlight does not |
| + | // reach a node. |
| + | found.node.dirty = false; |
| + | continue; |
| + | } |
| + | else { |
| + | highlight(cursor, found.status); |
| + | highlight(found.node, found.status); |
| + | if (fromKey) |
| + | self.parent.setTimeout(function() {unhighlight(cursor); unhighlight(found.node);}, 500); |
| + | else |
| + | self.highlighted = [cursor, found.node]; |
| + | if (jump && found.node) |
| + | select.focusAfterNode(found.node.previousSibling, this.container); |
| + | break; |
| + | } |
| + | } |
| + | }, |
| + | |
| + | // Adjust the amount of whitespace at the start of the line that |
| + | // the cursor is on so that it is indented properly. |
| + | indentAtCursor: function(direction) { |
| + | if (!this.container.firstChild) return; |
| + | // The line has to have up-to-date lexical information, so we |
| + | // highlight it first. |
| + | if (!this.highlightAtCursor()) return; |
| + | var cursor = select.selectionTopNode(this.container, false); |
| + | // If we couldn't determine the place of the cursor, |
| + | // there's nothing to indent. |
| + | if (cursor === false) |
| + | return; |
| + | select.markSelection(this.win); |
| + | this.indentLineAfter(startOfLine(cursor), direction); |
| + | select.selectMarked(); |
| + | }, |
| + | |
| + | // Indent all lines whose start falls inside of the current |
| + | // selection. |
| + | indentRegion: function(start, end, direction) { |
| + | var current = (start = startOfLine(start)), before = start && startOfLine(start.previousSibling); |
| + | if (!isBR(end)) end = endOfLine(end, this.container); |
| + | this.addDirtyNode(start); |
| + | |
| + | do { |
| + | var next = endOfLine(current, this.container); |
| + | if (current) this.highlight(before, next, true); |
| + | this.indentLineAfter(current, direction); |
| + | before = current; |
| + | current = next; |
| + | } while (current != end); |
| + | select.setCursorPos(this.container, {node: start, offset: 0}, {node: end, offset: 0}); |
| + | }, |
| + | |
| + | // Find the node that the cursor is in, mark it as dirty, and make |
| + | // sure a highlight pass is scheduled. |
| + | cursorActivity: function(safe) { |
| + | // pagehide event hack above |
| + | if (this.unloaded) { |
| + | this.win.document.designMode = "off"; |
| + | this.win.document.designMode = "on"; |
| + | this.unloaded = false; |
| + | } |
| + | |
| + | if (internetExplorer) { |
| + | this.container.createTextRange().execCommand("unlink"); |
| + | this.selectionSnapshot = select.getBookmark(this.container); |
| + | } |
| + | |
| + | var activity = this.options.cursorActivity; |
| + | if (!safe || activity) { |
| + | var cursor = select.selectionTopNode(this.container, false); |
| + | if (cursor === false || !this.container.firstChild) return; |
| + | cursor = cursor || this.container.firstChild; |
| + | if (activity) activity(cursor); |
| + | if (!safe) { |
| + | this.scheduleHighlight(); |
| + | this.addDirtyNode(cursor); |
| + | } |
| + | } |
| + | }, |
| + | |
| + | reparseBuffer: function() { |
| + | forEach(this.container.childNodes, function(node) {node.dirty = true;}); |
| + | if (this.container.firstChild) |
| + | this.addDirtyNode(this.container.firstChild); |
| + | }, |
| + | |
| + | // Add a node to the set of dirty nodes, if it isn't already in |
| + | // there. |
| + | addDirtyNode: function(node) { |
| + | node = node || this.container.firstChild; |
| + | if (!node) return; |
| + | |
| + | for (var i = 0; i < this.dirty.length; i++) |
| + | if (this.dirty[i] == node) return; |
| + | |
| + | if (node.nodeType != 3) |
| + | node.dirty = true; |
| + | this.dirty.push(node); |
| + | }, |
| + | |
| + | allClean: function() { |
| + | return !this.dirty.length; |
| + | }, |
| + | |
| + | // Cause a highlight pass to happen in options.passDelay |
| + | // milliseconds. Clear the existing timeout, if one exists. This |
| + | // way, the passes do not happen while the user is typing, and |
| + | // should as unobtrusive as possible. |
| + | scheduleHighlight: function() { |
| + | // Timeouts are routed through the parent window, because on |
| + | // some browsers designMode windows do not fire timeouts. |
| + | var self = this; |
| + | this.parent.clearTimeout(this.highlightTimeout); |
| + | this.highlightTimeout = this.parent.setTimeout(function(){self.highlightDirty();}, this.options.passDelay); |
| + | }, |
| + | |
| + | // Fetch one dirty node, and remove it from the dirty set. |
| + | getDirtyNode: function() { |
| + | while (this.dirty.length > 0) { |
| + | var found = this.dirty.pop(); |
| + | // IE8 sometimes throws an unexplainable 'invalid argument' |
| + | // exception for found.parentNode |
| + | try { |
| + | // If the node has been coloured in the meantime, or is no |
| + | // longer in the document, it should not be returned. |
| + | while (found && found.parentNode != this.container) |
| + | found = found.parentNode; |
| + | if (found && (found.dirty || found.nodeType == 3)) |
| + | return found; |
| + | } catch (e) {} |
| + | } |
| + | return null; |
| + | }, |
| + | |
| + | // Pick dirty nodes, and highlight them, until options.passTime |
| + | // milliseconds have gone by. The highlight method will continue |
| + | // to next lines as long as it finds dirty nodes. It returns |
| + | // information about the place where it stopped. If there are |
| + | // dirty nodes left after this function has spent all its lines, |
| + | // it shedules another highlight to finish the job. |
| + | highlightDirty: function(force) { |
| + | // Prevent FF from raising an error when it is firing timeouts |
| + | // on a page that's no longer loaded. |
| + | if (!window.select) return false; |
| + | |
| + | if (!this.options.readOnly) select.markSelection(this.win); |
| + | var start, endTime = force ? null : time() + this.options.passTime; |
| + | while ((time() < endTime || force) && (start = this.getDirtyNode())) { |
| + | var result = this.highlight(start, endTime); |
| + | if (result && result.node && result.dirty) |
| + | this.addDirtyNode(result.node); |
| + | } |
| + | if (!this.options.readOnly) select.selectMarked(); |
| + | if (start) this.scheduleHighlight(); |
| + | return this.dirty.length == 0; |
| + | }, |
| + | |
| + | // Creates a function that, when called through a timeout, will |
| + | // continuously re-parse the document. |
| + | documentScanner: function(passTime) { |
| + | var self = this, pos = null; |
| + | return function() { |
| + | // FF timeout weirdness workaround. |
| + | if (!window.select) return; |
| + | // If the current node is no longer in the document... oh |
| + | // well, we start over. |
| + | if (pos && pos.parentNode != self.container) |
| + | pos = null; |
| + | select.markSelection(self.win); |
| + | var result = self.highlight(pos, time() + passTime, true); |
| + | select.selectMarked(); |
| + | var newPos = result ? (result.node && result.node.nextSibling) : null; |
| + | pos = (pos == newPos) ? null : newPos; |
| + | self.delayScanning(); |
| + | }; |
| + | }, |
| + | |
| + | // Starts the continuous scanning process for this document after |
| + | // a given interval. |
| + | delayScanning: function() { |
| + | if (this.scanner) { |
| + | this.parent.clearTimeout(this.documentScan); |
| + | this.documentScan = this.parent.setTimeout(this.scanner, this.options.continuousScanning); |
| + | } |
| + | }, |
| + | |
| + | isIMEOn: function() { |
| + | // chrome: keyDown keyCode is 229 while IME on |
| + | // firefox: no keyUps or keyPresses fires after first keyDown while IME on |
| + | return this.lastKeyDownCode == 229 || this.keyUpOrPressAfterLastKeyDown === false; |
| + | }, |
| + | |
| + | // The function that does the actual highlighting/colouring (with |
| + | // help from the parser and the DOM normalizer). Its interface is |
| + | // rather overcomplicated, because it is used in different |
| + | // situations: ensuring that a certain line is highlighted, or |
| + | // highlighting up to X milliseconds starting from a certain |
| + | // point. The 'from' argument gives the node at which it should |
| + | // start. If this is null, it will start at the beginning of the |
| + | // document. When a timestamp is given with the 'target' argument, |
| + | // it will stop highlighting at that time. If this argument holds |
| + | // a DOM node, it will highlight until it reaches that node. If at |
| + | // any time it comes across two 'clean' lines (no dirty nodes), it |
| + | // will stop, except when 'cleanLines' is true. maxBacktrack is |
| + | // the maximum number of lines to backtrack to find an existing |
| + | // parser instance. This is used to give up in situations where a |
| + | // highlight would take too long and freeze the browser interface. |
| + | highlight: function(from, target, cleanLines, maxBacktrack){ |
| + | var container = this.container, self = this, active = this.options.activeTokens; |
| + | var endTime = (typeof target == "number" ? target : null); |
| + | |
| + | if (!container.firstChild || this.isIMEOn()) |
| + | return false; |
| + | // Backtrack to the first node before from that has a partial |
| + | // parse stored. |
| + | while (from && (!from.parserFromHere || from.dirty)) { |
| + | if (maxBacktrack != null && isBR(from) && (--maxBacktrack) < 0) |
| + | return false; |
| + | from = from.previousSibling; |
| + | } |
| + | // If we are at the end of the document, do nothing. |
| + | if (from && !from.nextSibling) |
| + | return false; |
| + | |
| + | // Check whether a part (<span> node) and the corresponding token |
| + | // match. |
| + | function correctPart(token, part){ |
| + | return !part.reduced && part.currentText == token.value && part.className == token.style; |
| + | } |
| + | // Shorten the text associated with a part by chopping off |
| + | // characters from the front. Note that only the currentText |
| + | // property gets changed. For efficiency reasons, we leave the |
| + | // nodeValue alone -- we set the reduced flag to indicate that |
| + | // this part must be replaced. |
| + | function shortenPart(part, minus){ |
| + | part.currentText = part.currentText.substring(minus); |
| + | part.reduced = true; |
| + | } |
| + | // Create a part corresponding to a given token. |
| + | function tokenPart(token){ |
| + | var part = makePartSpan(token.value, self.doc); |
| + | part.className = token.style; |
| + | return part; |
| + | } |
| + | |
| + | function maybeTouch(node) { |
| + | if (node) { |
| + | var old = node.oldNextSibling; |
| + | if (lineDirty || old === undefined || node.nextSibling != old) |
| + | self.history.touch(node); |
| + | node.oldNextSibling = node.nextSibling; |
| + | } |
| + | else { |
| + | var old = self.container.oldFirstChild; |
| + | if (lineDirty || old === undefined || self.container.firstChild != old) |
| + | self.history.touch(null); |
| + | self.container.oldFirstChild = self.container.firstChild; |
| + | } |
| + | } |
| + | |
| + | // Get the token stream. If from is null, we start with a new |
| + | // parser from the start of the frame, otherwise a partial parse |
| + | // is resumed. |
| + | var traversal = traverseDOM(from ? from.nextSibling : container.firstChild), |
| + | stream = stringStream(traversal), |
| + | parsed = from ? from.parserFromHere(stream) : Editor.Parser.make(stream); |
| + | |
| + | function surroundedByBRs(node) { |
| + | return (node.previousSibling == null || isBR(node.previousSibling)) && |
| + | (node.nextSibling == null || isBR(node.nextSibling)); |
| + | } |
| + | |
| + | // parts is an interface to make it possible to 'delay' fetching |
| + | // the next DOM node until we are completely done with the one |
| + | // before it. This is necessary because often the next node is |
| + | // not yet available when we want to proceed past the current |
| + | // one. |
| + | var parts = { |
| + | current: null, |
| + | // Fetch current node. |
| + | get: function(){ |
| + | if (!this.current) |
| + | this.current = traversal.nodes.shift(); |
| + | return this.current; |
| + | }, |
| + | // Advance to the next part (do not fetch it yet). |
| + | next: function(){ |
| + | this.current = null; |
| + | }, |
| + | // Remove the current part from the DOM tree, and move to the |
| + | // next. |
| + | remove: function(){ |
| + | container.removeChild(this.get()); |
| + | this.current = null; |
| + | }, |
| + | // Advance to the next part that is not empty, discarding empty |
| + | // parts. |
| + | getNonEmpty: function(){ |
| + | var part = this.get(); |
| + | // Allow empty nodes when they are alone on a line, needed |
| + | // for the FF cursor bug workaround (see select.js, |
| + | // insertNewlineAtCursor). |
| + | while (part && isSpan(part) && part.currentText == "") { |
| + | // Leave empty nodes that are alone on a line alone in |
| + | // Opera, since that browsers doesn't deal well with |
| + | // having 2 BRs in a row. |
| + | if (window.opera && surroundedByBRs(part)) { |
| + | this.next(); |
| + | part = this.get(); |
| + | } |
| + | else { |
| + | var old = part; |
| + | this.remove(); |
| + | part = this.get(); |
| + | // Adjust selection information, if any. See select.js for details. |
| + | select.snapshotMove(old.firstChild, part && (part.firstChild || part), 0); |
| + | } |
| + | } |
| + | |
| + | return part; |
| + | } |
| + | }; |
| + | |
| + | var lineDirty = false, prevLineDirty = true, lineNodes = 0; |
| + | |
| + | // This forEach loops over the tokens from the parsed stream, and |
| + | // at the same time uses the parts object to proceed through the |
| + | // corresponding DOM nodes. |
| + | forEach(parsed, function(token){ |
| + | var part = parts.getNonEmpty(); |
| + | |
| + | if (token.value == "\n"){ |
| + | // The idea of the two streams actually staying synchronized |
| + | // is such a long shot that we explicitly check. |
| + | if (!isBR(part)) |
| + | throw "Parser out of sync. Expected BR."; |
| + | |
| + | if (part.dirty || !part.indentation) lineDirty = true; |
| + | maybeTouch(from); |
| + | from = part; |
| + | |
| + | // Every <br> gets a copy of the parser state and a lexical |
| + | // context assigned to it. The first is used to be able to |
| + | // later resume parsing from this point, the second is used |
| + | // for indentation. |
| + | part.parserFromHere = parsed.copy(); |
| + | part.indentation = token.indentation; |
| + | part.dirty = false; |
| + | |
| + | // If the target argument wasn't an integer, go at least |
| + | // until that node. |
| + | if (endTime == null && part == target) throw StopIteration; |
| + | |
| + | // A clean line with more than one node means we are done. |
| + | // Throwing a StopIteration is the way to break out of a |
| + | // MochiKit forEach loop. |
| + | if ((endTime != null && time() >= endTime) || (!lineDirty && !prevLineDirty && lineNodes > 1 && !cleanLines)) |
| + | throw StopIteration; |
| + | prevLineDirty = lineDirty; lineDirty = false; lineNodes = 0; |
| + | parts.next(); |
| + | } |
| + | else { |
| + | if (!isSpan(part)) |
| + | throw "Parser out of sync. Expected SPAN."; |
| + | if (part.dirty) |
| + | lineDirty = true; |
| + | lineNodes++; |
| + | |
| + | // If the part matches the token, we can leave it alone. |
| + | if (correctPart(token, part)){ |
| + | part.dirty = false; |
| + | parts.next(); |
| + | } |
| + | // Otherwise, we have to fix it. |
| + | else { |
| + | lineDirty = true; |
| + | // Insert the correct part. |
| + | var newPart = tokenPart(token); |
| + | container.insertBefore(newPart, part); |
| + | if (active) active(newPart, token, self); |
| + | var tokensize = token.value.length; |
| + | var offset = 0; |
| + | // Eat up parts until the text for this token has been |
| + | // removed, adjusting the stored selection info (see |
| + | // select.js) in the process. |
| + | while (tokensize > 0) { |
| + | part = parts.get(); |
| + | var partsize = part.currentText.length; |
| + | select.snapshotReplaceNode(part.firstChild, newPart.firstChild, tokensize, offset); |
| + | if (partsize > tokensize){ |
| + | shortenPart(part, tokensize); |
| + | tokensize = 0; |
| + | } |
| + | else { |
| + | tokensize -= partsize; |
| + | offset += partsize; |
| + | parts.remove(); |
| + | } |
| + | } |
| + | } |
| + | } |
| + | }); |
| + | maybeTouch(from); |
| + | |
| + | // The function returns some status information that is used by |
| + | // hightlightDirty to determine whether and where it has to |
| + | // continue. |
| + | return {node: parts.getNonEmpty(), |
| + | dirty: lineDirty}; |
| + | } |
| + | }; |
| + | |
| + | return Editor; |
| + | })(); |
| + | |
| + | addEventHandler(window, "load", function() { |
| + | var CodeMirror = window.frameElement.CodeMirror; |
| + | var e = CodeMirror.editor = new Editor(CodeMirror.options); |
| + | this.parent.setTimeout(method(CodeMirror, "init"), 0); |
| + | }); |
public/javascripts/cms/3rdparty/codemirror/highlight.js
+68
-0
| @@ | @@ -0,0 +1,68 @@ |
| + | // Minimal framing needed to use CodeMirror-style parsers to highlight |
| + | // code. Load this along with tokenize.js, stringstream.js, and your |
| + | // parser. Then call highlightText, passing a string as the first |
| + | // argument, and as the second argument either a callback function |
| + | // that will be called with an array of SPAN nodes for every line in |
| + | // the code, or a DOM node to which to append these spans, and |
| + | // optionally (not needed if you only loaded one parser) a parser |
| + | // object. |
| + | |
| + | // Stuff from util.js that the parsers are using. |
| + | var StopIteration = {toString: function() {return "StopIteration"}}; |
| + | |
| + | var Editor = {}; |
| + | var indentUnit = 2; |
| + | |
| + | (function(){ |
| + | function normaliseString(string) { |
| + | var tab = ""; |
| + | for (var i = 0; i < indentUnit; i++) tab += " "; |
| + | |
| + | string = string.replace(/\t/g, tab).replace(/\u00a0/g, " ").replace(/\r\n?/g, "\n"); |
| + | var pos = 0, parts = [], lines = string.split("\n"); |
| + | for (var line = 0; line < lines.length; line++) { |
| + | if (line != 0) parts.push("\n"); |
| + | parts.push(lines[line]); |
| + | } |
| + | |
| + | return { |
| + | next: function() { |
| + | if (pos < parts.length) return parts[pos++]; |
| + | else throw StopIteration; |
| + | } |
| + | }; |
| + | } |
| + | |
| + | window.highlightText = function(string, callback, parser) { |
| + | parser = (parser || Editor.Parser).make(stringStream(normaliseString(string))); |
| + | var line = []; |
| + | if (callback.nodeType == 1) { |
| + | var node = callback; |
| + | callback = function(line) { |
| + | for (var i = 0; i < line.length; i++) |
| + | node.appendChild(line[i]); |
| + | node.appendChild(document.createElement("BR")); |
| + | }; |
| + | } |
| + | |
| + | try { |
| + | while (true) { |
| + | var token = parser.next(); |
| + | if (token.value == "\n") { |
| + | callback(line); |
| + | line = []; |
| + | } |
| + | else { |
| + | var span = document.createElement("SPAN"); |
| + | span.className = token.style; |
| + | span.appendChild(document.createTextNode(token.value)); |
| + | line.push(span); |
| + | } |
| + | } |
| + | } |
| + | catch (e) { |
| + | if (e != StopIteration) throw e; |
| + | } |
| + | if (line.length) callback(line); |
| + | } |
| + | })(); |
public/javascripts/cms/3rdparty/codemirror/mirrorframe.js
+81
-0
| @@ | @@ -0,0 +1,81 @@ |
| + | /* Demonstration of embedding CodeMirror in a bigger application. The |
| + | * interface defined here is a mess of prompts and confirms, and |
| + | * should probably not be used in a real project. |
| + | */ |
| + | |
| + | function MirrorFrame(place, options) { |
| + | this.home = document.createElement("DIV"); |
| + | if (place.appendChild) |
| + | place.appendChild(this.home); |
| + | else |
| + | place(this.home); |
| + | |
| + | var self = this; |
| + | function makeButton(name, action) { |
| + | var button = document.createElement("INPUT"); |
| + | button.type = "button"; |
| + | button.value = name; |
| + | self.home.appendChild(button); |
| + | button.onclick = function(){self[action].call(self);}; |
| + | } |
| + | |
| + | makeButton("Search", "search"); |
| + | makeButton("Replace", "replace"); |
| + | makeButton("Current line", "line"); |
| + | makeButton("Jump to line", "jump"); |
| + | makeButton("Insert constructor", "macro"); |
| + | makeButton("Indent all", "reindent"); |
| + | |
| + | this.mirror = new CodeMirror(this.home, options); |
| + | } |
| + | |
| + | MirrorFrame.prototype = { |
| + | search: function() { |
| + | var text = prompt("Enter search term:", ""); |
| + | if (!text) return; |
| + | |
| + | var first = true; |
| + | do { |
| + | var cursor = this.mirror.getSearchCursor(text, first); |
| + | first = false; |
| + | while (cursor.findNext()) { |
| + | cursor.select(); |
| + | if (!confirm("Search again?")) |
| + | return; |
| + | } |
| + | } while (confirm("End of document reached. Start over?")); |
| + | }, |
| + | |
| + | replace: function() { |
| + | // This is a replace-all, but it is possible to implement a |
| + | // prompting replace. |
| + | var from = prompt("Enter search string:", ""), to; |
| + | if (from) to = prompt("What should it be replaced with?", ""); |
| + | if (to == null) return; |
| + | |
| + | var cursor = this.mirror.getSearchCursor(from, false); |
| + | while (cursor.findNext()) |
| + | cursor.replace(to); |
| + | }, |
| + | |
| + | jump: function() { |
| + | var line = prompt("Jump to line:", ""); |
| + | if (line && !isNaN(Number(line))) |
| + | this.mirror.jumpToLine(Number(line)); |
| + | }, |
| + | |
| + | line: function() { |
| + | alert("The cursor is currently at line " + this.mirror.currentLine()); |
| + | this.mirror.focus(); |
| + | }, |
| + | |
| + | macro: function() { |
| + | var name = prompt("Name your constructor:", ""); |
| + | if (name) |
| + | this.mirror.replaceSelection("function " + name + "() {\n \n}\n\n" + name + ".prototype = {\n \n};\n"); |
| + | }, |
| + | |
| + | reindent: function() { |
| + | this.mirror.reindent(); |
| + | } |
| + | }; |
public/javascripts/cms/3rdparty/codemirror/parsecss.js
+159
-0
| @@ | @@ -0,0 +1,159 @@ |
| + | /* Simple parser for CSS */ |
| + | |
| + | var CSSParser = Editor.Parser = (function() { |
| + | var tokenizeCSS = (function() { |
| + | function normal(source, setState) { |
| + | var ch = source.next(); |
| + | if (ch == "@") { |
| + | source.nextWhileMatches(/\w/); |
| + | return "css-at"; |
| + | } |
| + | else if (ch == "/" && source.equals("*")) { |
| + | setState(inCComment); |
| + | return null; |
| + | } |
| + | else if (ch == "<" && source.equals("!")) { |
| + | setState(inSGMLComment); |
| + | return null; |
| + | } |
| + | else if (ch == "=") { |
| + | return "css-compare"; |
| + | } |
| + | else if (source.equals("=") && (ch == "~" || ch == "|")) { |
| + | source.next(); |
| + | return "css-compare"; |
| + | } |
| + | else if (ch == "\"" || ch == "'") { |
| + | setState(inString(ch)); |
| + | return null; |
| + | } |
| + | else if (ch == "#") { |
| + | source.nextWhileMatches(/\w/); |
| + | return "css-hash"; |
| + | } |
| + | else if (ch == "!") { |
| + | source.nextWhileMatches(/[ \t]/); |
| + | source.nextWhileMatches(/\w/); |
| + | return "css-important"; |
| + | } |
| + | else if (/\d/.test(ch)) { |
| + | source.nextWhileMatches(/[\w.%]/); |
| + | return "css-unit"; |
| + | } |
| + | else if (/[,.+>*\/]/.test(ch)) { |
| + | return "css-select-op"; |
| + | } |
| + | else if (/[;{}:\[\]]/.test(ch)) { |
| + | return "css-punctuation"; |
| + | } |
| + | else { |
| + | source.nextWhileMatches(/[\w\\\-_]/); |
| + | return "css-identifier"; |
| + | } |
| + | } |
| + | |
| + | function inCComment(source, setState) { |
| + | var maybeEnd = false; |
| + | while (!source.endOfLine()) { |
| + | var ch = source.next(); |
| + | if (maybeEnd && ch == "/") { |
| + | setState(normal); |
| + | break; |
| + | } |
| + | maybeEnd = (ch == "*"); |
| + | } |
| + | return "css-comment"; |
| + | } |
| + | |
| + | function inSGMLComment(source, setState) { |
| + | var dashes = 0; |
| + | while (!source.endOfLine()) { |
| + | var ch = source.next(); |
| + | if (dashes >= 2 && ch == ">") { |
| + | setState(normal); |
| + | break; |
| + | } |
| + | dashes = (ch == "-") ? dashes + 1 : 0; |
| + | } |
| + | return "css-comment"; |
| + | } |
| + | |
| + | function inString(quote) { |
| + | return function(source, setState) { |
| + | var escaped = false; |
| + | while (!source.endOfLine()) { |
| + | var ch = source.next(); |
| + | if (ch == quote && !escaped) |
| + | break; |
| + | escaped = !escaped && ch == "\\"; |
| + | } |
| + | if (!escaped) |
| + | setState(normal); |
| + | return "css-string"; |
| + | }; |
| + | } |
| + | |
| + | return function(source, startState) { |
| + | return tokenizer(source, startState || normal); |
| + | }; |
| + | })(); |
| + | |
| + | function indentCSS(inBraces, inRule, base) { |
| + | return function(nextChars) { |
| + | if (!inBraces || /^\}/.test(nextChars)) return base; |
| + | else if (inRule) return base + indentUnit * 2; |
| + | else return base + indentUnit; |
| + | }; |
| + | } |
| + | |
| + | // This is a very simplistic parser -- since CSS does not really |
| + | // nest, it works acceptably well, but some nicer colouroing could |
| + | // be provided with a more complicated parser. |
| + | function parseCSS(source, basecolumn) { |
| + | basecolumn = basecolumn || 0; |
| + | var tokens = tokenizeCSS(source); |
| + | var inBraces = false, inRule = false, inDecl = false;; |
| + | |
| + | var iter = { |
| + | next: function() { |
| + | var token = tokens.next(), style = token.style, content = token.content; |
| + | |
| + | if (style == "css-hash") |
| + | style = token.style = inRule ? "css-colorcode" : "css-identifier"; |
| + | if (style == "css-identifier") { |
| + | if (inRule) token.style = "css-value"; |
| + | else if (!inBraces && !inDecl) token.style = "css-selector"; |
| + | } |
| + | |
| + | if (content == "\n") |
| + | token.indentation = indentCSS(inBraces, inRule, basecolumn); |
| + | |
| + | if (content == "{") |
| + | inBraces = true; |
| + | else if (content == "}") |
| + | inBraces = inRule = inDecl = false; |
| + | else if (content == ";") |
| + | inRule = inDecl = false; |
| + | else if (inBraces && style != "css-comment" && style != "whitespace") |
| + | inRule = true; |
| + | else if (!inBraces && style == "css-at") |
| + | inDecl = true; |
| + | |
| + | return token; |
| + | }, |
| + | |
| + | copy: function() { |
| + | var _inBraces = inBraces, _inRule = inRule, _tokenState = tokens.state; |
| + | return function(source) { |
| + | tokens = tokenizeCSS(source, _tokenState); |
| + | inBraces = _inBraces; |
| + | inRule = _inRule; |
| + | return iter; |
| + | }; |
| + | } |
| + | }; |
| + | return iter; |
| + | } |
| + | |
| + | return {make: parseCSS, electricChars: "}"}; |
| + | })(); |
public/javascripts/cms/3rdparty/codemirror/parsedummy.js
+32
-0
| @@ | @@ -0,0 +1,32 @@ |
| + | var DummyParser = Editor.Parser = (function() { |
| + | function tokenizeDummy(source) { |
| + | while (!source.endOfLine()) source.next(); |
| + | return "text"; |
| + | } |
| + | function parseDummy(source) { |
| + | function indentTo(n) {return function() {return n;}} |
| + | source = tokenizer(source, tokenizeDummy); |
| + | var space = 0; |
| + | |
| + | var iter = { |
| + | next: function() { |
| + | var tok = source.next(); |
| + | if (tok.type == "whitespace") { |
| + | if (tok.value == "\n") tok.indentation = indentTo(space); |
| + | else space = tok.value.length; |
| + | } |
| + | return tok; |
| + | }, |
| + | copy: function() { |
| + | var _space = space; |
| + | return function(_source) { |
| + | space = _space; |
| + | source = tokenizer(_source, tokenizeDummy); |
| + | return iter; |
| + | }; |
| + | } |
| + | }; |
| + | return iter; |
| + | } |
| + | return {make: parseDummy}; |
| + | })(); |
public/javascripts/cms/3rdparty/codemirror/parsehtmlmixed.js
+74
-0
| @@ | @@ -0,0 +1,74 @@ |
| + | var HTMLMixedParser = Editor.Parser = (function() { |
| + | if (!(CSSParser && JSParser && XMLParser)) |
| + | throw new Error("CSS, JS, and XML parsers must be loaded for HTML mixed mode to work."); |
| + | XMLParser.configure({useHTMLKludges: true}); |
| + | |
| + | function parseMixed(stream) { |
| + | var htmlParser = XMLParser.make(stream), localParser = null, inTag = false; |
| + | var iter = {next: top, copy: copy}; |
| + | |
| + | function top() { |
| + | var token = htmlParser.next(); |
| + | if (token.content == "<") |
| + | inTag = true; |
| + | else if (token.style == "xml-tagname" && inTag === true) |
| + | inTag = token.content.toLowerCase(); |
| + | else if (token.content == ">") { |
| + | if (inTag == "script") |
| + | iter.next = local(JSParser, "</script"); |
| + | else if (inTag == "style") |
| + | iter.next = local(CSSParser, "</style"); |
| + | inTag = false; |
| + | } |
| + | return token; |
| + | } |
| + | function local(parser, tag) { |
| + | var baseIndent = htmlParser.indentation(); |
| + | localParser = parser.make(stream, baseIndent + indentUnit); |
| + | return function() { |
| + | if (stream.lookAhead(tag, false, false, true)) { |
| + | localParser = null; |
| + | iter.next = top; |
| + | return top(); |
| + | } |
| + | |
| + | var token = localParser.next(); |
| + | var lt = token.value.lastIndexOf("<"), sz = Math.min(token.value.length - lt, tag.length); |
| + | if (lt != -1 && token.value.slice(lt, lt + sz).toLowerCase() == tag.slice(0, sz) && |
| + | stream.lookAhead(tag.slice(sz), false, false, true)) { |
| + | stream.push(token.value.slice(lt)); |
| + | token.value = token.value.slice(0, lt); |
| + | } |
| + | |
| + | if (token.indentation) { |
| + | var oldIndent = token.indentation; |
| + | token.indentation = function(chars) { |
| + | if (chars == "</") |
| + | return baseIndent; |
| + | else |
| + | return oldIndent(chars); |
| + | } |
| + | } |
| + | |
| + | return token; |
| + | }; |
| + | } |
| + | |
| + | function copy() { |
| + | var _html = htmlParser.copy(), _local = localParser && localParser.copy(), |
| + | _next = iter.next, _inTag = inTag; |
| + | return function(_stream) { |
| + | stream = _stream; |
| + | htmlParser = _html(_stream); |
| + | localParser = _local && _local(_stream); |
| + | iter.next = _next; |
| + | inTag = _inTag; |
| + | return iter; |
| + | }; |
| + | } |
| + | return iter; |
| + | } |
| + | |
| + | return {make: parseMixed, electricChars: "{}/:"}; |
| + | |
| + | })(); |
public/javascripts/cms/3rdparty/codemirror/parsejavascript.js
+353
-0
| @@ | @@ -0,0 +1,353 @@ |
| + | /* Parse function for JavaScript. Makes use of the tokenizer from |
| + | * tokenizejavascript.js. Note that your parsers do not have to be |
| + | * this complicated -- if you don't want to recognize local variables, |
| + | * in many languages it is enough to just look for braces, semicolons, |
| + | * parentheses, etc, and know when you are inside a string or comment. |
| + | * |
| + | * See manual.html for more info about the parser interface. |
| + | */ |
| + | |
| + | var JSParser = Editor.Parser = (function() { |
| + | // Token types that can be considered to be atoms. |
| + | var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true}; |
| + | // Setting that can be used to have JSON data indent properly. |
| + | var json = false; |
| + | // Constructor for the lexical context objects. |
| + | function JSLexical(indented, column, type, align, prev, info) { |
| + | // indentation at start of this line |
| + | this.indented = indented; |
| + | // column at which this scope was opened |
| + | this.column = column; |
| + | // type of scope ('vardef', 'stat' (statement), 'form' (special form), '[', '{', or '(') |
| + | this.type = type; |
| + | // '[', '{', or '(' blocks that have any text after their opening |
| + | // character are said to be 'aligned' -- any lines below are |
| + | // indented all the way to the opening character. |
| + | if (align != null) |
| + | this.align = align; |
| + | // Parent scope, if any. |
| + | this.prev = prev; |
| + | this.info = info; |
| + | } |
| + | |
| + | // My favourite JavaScript indentation rules. |
| + | function indentJS(lexical) { |
| + | return function(firstChars) { |
| + | var firstChar = firstChars && firstChars.charAt(0), type = lexical.type; |
| + | var closing = firstChar == type; |
| + | if (type == "vardef") |
| + | return lexical.indented + 4; |
| + | else if (type == "form" && firstChar == "{") |
| + | return lexical.indented; |
| + | else if (type == "stat" || type == "form") |
| + | return lexical.indented + indentUnit; |
| + | else if (lexical.info == "switch" && !closing) |
| + | return lexical.indented + (/^(?:case|default)\b/.test(firstChars) ? indentUnit : 2 * indentUnit); |
| + | else if (lexical.align) |
| + | return lexical.column - (closing ? 1 : 0); |
| + | else |
| + | return lexical.indented + (closing ? 0 : indentUnit); |
| + | }; |
| + | } |
| + | |
| + | // The parser-iterator-producing function itself. |
| + | function parseJS(input, basecolumn) { |
| + | // Wrap the input in a token stream |
| + | var tokens = tokenizeJavaScript(input); |
| + | // The parser state. cc is a stack of actions that have to be |
| + | // performed to finish the current statement. For example we might |
| + | // know that we still need to find a closing parenthesis and a |
| + | // semicolon. Actions at the end of the stack go first. It is |
| + | // initialized with an infinitely looping action that consumes |
| + | // whole statements. |
| + | var cc = [json ? expressions : statements]; |
| + | // Context contains information about the current local scope, the |
| + | // variables defined in that, and the scopes above it. |
| + | var context = null; |
| + | // The lexical scope, used mostly for indentation. |
| + | var lexical = new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false); |
| + | // Current column, and the indentation at the start of the current |
| + | // line. Used to create lexical scope objects. |
| + | var column = 0; |
| + | var indented = 0; |
| + | // Variables which are used by the mark, cont, and pass functions |
| + | // below to communicate with the driver loop in the 'next' |
| + | // function. |
| + | var consume, marked; |
| + | |
| + | // The iterator object. |
| + | var parser = {next: next, copy: copy}; |
| + | |
| + | function next(){ |
| + | // Start by performing any 'lexical' actions (adjusting the |
| + | // lexical variable), or the operations below will be working |
| + | // with the wrong lexical state. |
| + | while(cc[cc.length - 1].lex) |
| + | cc.pop()(); |
| + | |
| + | // Fetch a token. |
| + | var token = tokens.next(); |
| + | |
| + | // Adjust column and indented. |
| + | if (token.type == "whitespace" && column == 0) |
| + | indented = token.value.length; |
| + | column += token.value.length; |
| + | if (token.content == "\n"){ |
| + | indented = column = 0; |
| + | // If the lexical scope's align property is still undefined at |
| + | // the end of the line, it is an un-aligned scope. |
| + | if (!("align" in lexical)) |
| + | lexical.align = false; |
| + | // Newline tokens get an indentation function associated with |
| + | // them. |
| + | token.indentation = indentJS(lexical); |
| + | } |
| + | // No more processing for meaningless tokens. |
| + | if (token.type == "whitespace" || token.type == "comment") |
| + | return token; |
| + | // When a meaningful token is found and the lexical scope's |
| + | // align is undefined, it is an aligned scope. |
| + | if (!("align" in lexical)) |
| + | lexical.align = true; |
| + | |
| + | // Execute actions until one 'consumes' the token and we can |
| + | // return it. |
| + | while(true) { |
| + | consume = marked = false; |
| + | // Take and execute the topmost action. |
| + | cc.pop()(token.type, token.content); |
| + | if (consume){ |
| + | // Marked is used to change the style of the current token. |
| + | if (marked) |
| + | token.style = marked; |
| + | // Here we differentiate between local and global variables. |
| + | else if (token.type == "variable" && inScope(token.content)) |
| + | token.style = "js-localvariable"; |
| + | return token; |
| + | } |
| + | } |
| + | } |
| + | |
| + | // This makes a copy of the parser state. It stores all the |
| + | // stateful variables in a closure, and returns a function that |
| + | // will restore them when called with a new input stream. Note |
| + | // that the cc array has to be copied, because it is contantly |
| + | // being modified. Lexical objects are not mutated, and context |
| + | // objects are not mutated in a harmful way, so they can be shared |
| + | // between runs of the parser. |
| + | function copy(){ |
| + | var _context = context, _lexical = lexical, _cc = cc.concat([]), _tokenState = tokens.state; |
| + | |
| + | return function copyParser(input){ |
| + | context = _context; |
| + | lexical = _lexical; |
| + | cc = _cc.concat([]); // copies the array |
| + | column = indented = 0; |
| + | tokens = tokenizeJavaScript(input, _tokenState); |
| + | return parser; |
| + | }; |
| + | } |
| + | |
| + | // Helper function for pushing a number of actions onto the cc |
| + | // stack in reverse order. |
| + | function push(fs){ |
| + | for (var i = fs.length - 1; i >= 0; i--) |
| + | cc.push(fs[i]); |
| + | } |
| + | // cont and pass are used by the action functions to add other |
| + | // actions to the stack. cont will cause the current token to be |
| + | // consumed, pass will leave it for the next action. |
| + | function cont(){ |
| + | push(arguments); |
| + | consume = true; |
| + | } |
| + | function pass(){ |
| + | push(arguments); |
| + | consume = false; |
| + | } |
| + | // Used to change the style of the current token. |
| + | function mark(style){ |
| + | marked = style; |
| + | } |
| + | |
| + | // Push a new scope. Will automatically link the current scope. |
| + | function pushcontext(){ |
| + | context = {prev: context, vars: {"this": true, "arguments": true}}; |
| + | } |
| + | // Pop off the current scope. |
| + | function popcontext(){ |
| + | context = context.prev; |
| + | } |
| + | // Register a variable in the current scope. |
| + | function register(varname){ |
| + | if (context){ |
| + | mark("js-variabledef"); |
| + | context.vars[varname] = true; |
| + | } |
| + | } |
| + | // Check whether a variable is defined in the current scope. |
| + | function inScope(varname){ |
| + | var cursor = context; |
| + | while (cursor) { |
| + | if (cursor.vars[varname]) |
| + | return true; |
| + | cursor = cursor.prev; |
| + | } |
| + | return false; |
| + | } |
| + | |
| + | // Push a new lexical context of the given type. |
| + | function pushlex(type, info) { |
| + | var result = function(){ |
| + | lexical = new JSLexical(indented, column, type, null, lexical, info) |
| + | }; |
| + | result.lex = true; |
| + | return result; |
| + | } |
| + | // Pop off the current lexical context. |
| + | function poplex(){ |
| + | lexical = lexical.prev; |
| + | } |
| + | poplex.lex = true; |
| + | // The 'lex' flag on these actions is used by the 'next' function |
| + | // to know they can (and have to) be ran before moving on to the |
| + | // next token. |
| + | |
| + | // Creates an action that discards tokens until it finds one of |
| + | // the given type. |
| + | function expect(wanted){ |
| + | return function expecting(type){ |
| + | if (type == wanted) cont(); |
| + | else cont(arguments.callee); |
| + | }; |
| + | } |
| + | |
| + | // Looks for a statement, and then calls itself. |
| + | function statements(type){ |
| + | return pass(statement, statements); |
| + | } |
| + | function expressions(type){ |
| + | return pass(expression, expressions); |
| + | } |
| + | // Dispatches various types of statements based on the type of the |
| + | // current token. |
| + | function statement(type){ |
| + | if (type == "var") cont(pushlex("vardef"), vardef1, expect(";"), poplex); |
| + | else if (type == "keyword a") cont(pushlex("form"), expression, statement, poplex); |
| + | else if (type == "keyword b") cont(pushlex("form"), statement, poplex); |
| + | else if (type == "{") cont(pushlex("}"), block, poplex); |
| + | else if (type == "function") cont(functiondef); |
| + | else if (type == "for") cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"), poplex, statement, poplex); |
| + | else if (type == "variable") cont(pushlex("stat"), maybelabel); |
| + | else if (type == "switch") cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"), block, poplex, poplex); |
| + | else if (type == "case") cont(expression, expect(":")); |
| + | else if (type == "default") cont(expect(":")); |
| + | else if (type == "catch") cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), statement, poplex, popcontext); |
| + | else pass(pushlex("stat"), expression, expect(";"), poplex); |
| + | } |
| + | // Dispatch expression types. |
| + | function expression(type){ |
| + | if (atomicTypes.hasOwnProperty(type)) cont(maybeoperator); |
| + | else if (type == "function") cont(functiondef); |
| + | else if (type == "keyword c") cont(expression); |
| + | else if (type == "(") cont(pushlex(")"), expression, expect(")"), poplex, maybeoperator); |
| + | else if (type == "operator") cont(expression); |
| + | else if (type == "[") cont(pushlex("]"), commasep(expression, "]"), poplex, maybeoperator); |
| + | else if (type == "{") cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator); |
| + | else cont(); |
| + | } |
| + | // Called for places where operators, function calls, or |
| + | // subscripts are valid. Will skip on to the next action if none |
| + | // is found. |
| + | function maybeoperator(type){ |
| + | if (type == "operator") cont(expression); |
| + | else if (type == "(") cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator); |
| + | else if (type == ".") cont(property, maybeoperator); |
| + | else if (type == "[") cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator); |
| + | } |
| + | // When a statement starts with a variable name, it might be a |
| + | // label. If no colon follows, it's a regular statement. |
| + | function maybelabel(type){ |
| + | if (type == ":") cont(poplex, statement); |
| + | else pass(maybeoperator, expect(";"), poplex); |
| + | } |
| + | // Property names need to have their style adjusted -- the |
| + | // tokenizer thinks they are variables. |
| + | function property(type){ |
| + | if (type == "variable") {mark("js-property"); cont();} |
| + | } |
| + | // This parses a property and its value in an object literal. |
| + | function objprop(type){ |
| + | if (type == "variable") mark("js-property"); |
| + | if (atomicTypes.hasOwnProperty(type)) cont(expect(":"), expression); |
| + | } |
| + | // Parses a comma-separated list of the things that are recognized |
| + | // by the 'what' argument. |
| + | function commasep(what, end){ |
| + | function proceed(type) { |
| + | if (type == ",") cont(what, proceed); |
| + | else if (type == end) cont(); |
| + | else cont(expect(end)); |
| + | } |
| + | return function commaSeparated(type) { |
| + | if (type == end) cont(); |
| + | else pass(what, proceed); |
| + | }; |
| + | } |
| + | // Look for statements until a closing brace is found. |
| + | function block(type){ |
| + | if (type == "}") cont(); |
| + | else pass(statement, block); |
| + | } |
| + | // Variable definitions are split into two actions -- 1 looks for |
| + | // a name or the end of the definition, 2 looks for an '=' sign or |
| + | // a comma. |
| + | function vardef1(type, value){ |
| + | if (type == "variable"){register(value); cont(vardef2);} |
| + | else cont(); |
| + | } |
| + | function vardef2(type, value){ |
| + | if (value == "=") cont(expression, vardef2); |
| + | else if (type == ",") cont(vardef1); |
| + | } |
| + | // For loops. |
| + | function forspec1(type){ |
| + | if (type == "var") cont(vardef1, forspec2); |
| + | else if (type == ";") pass(forspec2); |
| + | else if (type == "variable") cont(formaybein); |
| + | else pass(forspec2); |
| + | } |
| + | function formaybein(type, value){ |
| + | if (value == "in") cont(expression); |
| + | else cont(maybeoperator, forspec2); |
| + | } |
| + | function forspec2(type, value){ |
| + | if (type == ";") cont(forspec3); |
| + | else if (value == "in") cont(expression); |
| + | else cont(expression, expect(";"), forspec3); |
| + | } |
| + | function forspec3(type) { |
| + | if (type == ")") pass(); |
| + | else cont(expression); |
| + | } |
| + | // A function definition creates a new context, and the variables |
| + | // in its argument list have to be added to this context. |
| + | function functiondef(type, value){ |
| + | if (type == "variable"){register(value); cont(functiondef);} |
| + | else if (type == "(") cont(pushcontext, commasep(funarg, ")"), statement, popcontext); |
| + | } |
| + | function funarg(type, value){ |
| + | if (type == "variable"){register(value); cont();} |
| + | } |
| + | |
| + | return parser; |
| + | } |
| + | |
| + | return { |
| + | make: parseJS, |
| + | electricChars: "{}:", |
| + | configure: function(obj) { |
| + | if (obj.json != null) json = obj.json; |
| + | } |
| + | }; |
| + | })(); |
public/javascripts/cms/3rdparty/codemirror/parsesparql.js
+162
-0
| @@ | @@ -0,0 +1,162 @@ |
| + | var SparqlParser = Editor.Parser = (function() { |
| + | function wordRegexp(words) { |
| + | return new RegExp("^(?:" + words.join("|") + ")$", "i"); |
| + | } |
| + | var ops = wordRegexp(["str", "lang", "langmatches", "datatype", "bound", "sameterm", "isiri", "isuri", |
| + | "isblank", "isliteral", "union", "a"]); |
| + | var keywords = wordRegexp(["base", "prefix", "select", "distinct", "reduced", "construct", "describe", |
| + | "ask", "from", "named", "where", "order", "limit", "offset", "filter", "optional", |
| + | "graph", "by", "asc", "desc"]); |
| + | var operatorChars = /[*+\-<>=&|]/; |
| + | |
| + | var tokenizeSparql = (function() { |
| + | function normal(source, setState) { |
| + | var ch = source.next(); |
| + | if (ch == "$" || ch == "?") { |
| + | source.nextWhileMatches(/[\w\d]/); |
| + | return "sp-var"; |
| + | } |
| + | else if (ch == "<" && !source.matches(/[\s\u00a0=]/)) { |
| + | source.nextWhileMatches(/[^\s\u00a0>]/); |
| + | if (source.equals(">")) source.next(); |
| + | return "sp-uri"; |
| + | } |
| + | else if (ch == "\"" || ch == "'") { |
| + | setState(inLiteral(ch)); |
| + | return null; |
| + | } |
| + | else if (/[{}\(\),\.;\[\]]/.test(ch)) { |
| + | return "sp-punc"; |
| + | } |
| + | else if (ch == "#") { |
| + | while (!source.endOfLine()) source.next(); |
| + | return "sp-comment"; |
| + | } |
| + | else if (operatorChars.test(ch)) { |
| + | source.nextWhileMatches(operatorChars); |
| + | return "sp-operator"; |
| + | } |
| + | else if (ch == ":") { |
| + | source.nextWhileMatches(/[\w\d\._\-]/); |
| + | return "sp-prefixed"; |
| + | } |
| + | else { |
| + | source.nextWhileMatches(/[_\w\d]/); |
| + | if (source.equals(":")) { |
| + | source.next(); |
| + | source.nextWhileMatches(/[\w\d_\-]/); |
| + | return "sp-prefixed"; |
| + | } |
| + | var word = source.get(), type; |
| + | if (ops.test(word)) |
| + | type = "sp-operator"; |
| + | else if (keywords.test(word)) |
| + | type = "sp-keyword"; |
| + | else |
| + | type = "sp-word"; |
| + | return {style: type, content: word}; |
| + | } |
| + | } |
| + | |
| + | function inLiteral(quote) { |
| + | return function(source, setState) { |
| + | var escaped = false; |
| + | while (!source.endOfLine()) { |
| + | var ch = source.next(); |
| + | if (ch == quote && !escaped) { |
| + | setState(normal); |
| + | break; |
| + | } |
| + | escaped = !escaped && ch == "\\"; |
| + | } |
| + | return "sp-literal"; |
| + | }; |
| + | } |
| + | |
| + | return function(source, startState) { |
| + | return tokenizer(source, startState || normal); |
| + | }; |
| + | })(); |
| + | |
| + | function indentSparql(context) { |
| + | return function(nextChars) { |
| + | var firstChar = nextChars && nextChars.charAt(0); |
| + | if (/[\]\}]/.test(firstChar)) |
| + | while (context && context.type == "pattern") context = context.prev; |
| + | |
| + | var closing = context && firstChar == matching[context.type]; |
| + | if (!context) |
| + | return 0; |
| + | else if (context.type == "pattern") |
| + | return context.col; |
| + | else if (context.align) |
| + | return context.col - (closing ? context.width : 0); |
| + | else |
| + | return context.indent + (closing ? 0 : indentUnit); |
| + | } |
| + | } |
| + | |
| + | function parseSparql(source) { |
| + | var tokens = tokenizeSparql(source); |
| + | var context = null, indent = 0, col = 0; |
| + | function pushContext(type, width) { |
| + | context = {prev: context, indent: indent, col: col, type: type, width: width}; |
| + | } |
| + | function popContext() { |
| + | context = context.prev; |
| + | } |
| + | |
| + | var iter = { |
| + | next: function() { |
| + | var token = tokens.next(), type = token.style, content = token.content, width = token.value.length; |
| + | |
| + | if (content == "\n") { |
| + | token.indentation = indentSparql(context); |
| + | indent = col = 0; |
| + | if (context && context.align == null) context.align = false; |
| + | } |
| + | else if (type == "whitespace" && col == 0) { |
| + | indent = width; |
| + | } |
| + | else if (type != "sp-comment" && context && context.align == null) { |
| + | context.align = true; |
| + | } |
| + | |
| + | if (content != "\n") col += width; |
| + | |
| + | if (/[\[\{\(]/.test(content)) { |
| + | pushContext(content, width); |
| + | } |
| + | else if (/[\]\}\)]/.test(content)) { |
| + | while (context && context.type == "pattern") |
| + | popContext(); |
| + | if (context && content == matching[context.type]) |
| + | popContext(); |
| + | } |
| + | else if (content == "." && context && context.type == "pattern") { |
| + | popContext(); |
| + | } |
| + | else if ((type == "sp-word" || type == "sp-prefixed" || type == "sp-uri" || type == "sp-var" || type == "sp-literal") && |
| + | context && /[\{\[]/.test(context.type)) { |
| + | pushContext("pattern", width); |
| + | } |
| + | |
| + | return token; |
| + | }, |
| + | |
| + | copy: function() { |
| + | var _context = context, _indent = indent, _col = col, _tokenState = tokens.state; |
| + | return function(source) { |
| + | tokens = tokenizeSparql(source, _tokenState); |
| + | context = _context; |
| + | indent = _indent; |
| + | col = _col; |
| + | return iter; |
| + | }; |
| + | } |
| + | }; |
| + | return iter; |
| + | } |
| + | |
| + | return {make: parseSparql, electricChars: "}]"}; |
| + | })(); |
public/javascripts/cms/3rdparty/codemirror/parsexml.js
+286
-0
| @@ | @@ -0,0 +1,286 @@ |
| + | /* This file defines an XML parser, with a few kludges to make it |
| + | * useable for HTML. autoSelfClosers defines a set of tag names that |
| + | * are expected to not have a closing tag, and doNotIndent specifies |
| + | * the tags inside of which no indentation should happen (see Config |
| + | * object). These can be disabled by passing the editor an object like |
| + | * {useHTMLKludges: false} as parserConfig option. |
| + | */ |
| + | |
| + | var XMLParser = Editor.Parser = (function() { |
| + | var Kludges = { |
| + | autoSelfClosers: {"br": true, "img": true, "hr": true, "link": true, "input": true, |
| + | "meta": true, "col": true, "frame": true, "base": true, "area": true}, |
| + | doNotIndent: {"pre": true, "!cdata": true} |
| + | }; |
| + | var NoKludges = {autoSelfClosers: {}, doNotIndent: {"!cdata": true}}; |
| + | var UseKludges = Kludges; |
| + | var alignCDATA = false; |
| + | |
| + | // Simple stateful tokenizer for XML documents. Returns a |
| + | // MochiKit-style iterator, with a state property that contains a |
| + | // function encapsulating the current state. See tokenize.js. |
| + | var tokenizeXML = (function() { |
| + | function inText(source, setState) { |
| + | var ch = source.next(); |
| + | if (ch == "<") { |
| + | if (source.equals("!")) { |
| + | source.next(); |
| + | if (source.equals("[")) { |
| + | if (source.lookAhead("[CDATA[", true)) { |
| + | setState(inBlock("xml-cdata", "]]>")); |
| + | return null; |
| + | } |
| + | else { |
| + | return "xml-text"; |
| + | } |
| + | } |
| + | else if (source.lookAhead("--", true)) { |
| + | setState(inBlock("xml-comment", "-->")); |
| + | return null; |
| + | } |
| + | else { |
| + | return "xml-text"; |
| + | } |
| + | } |
| + | else if (source.equals("?")) { |
| + | source.next(); |
| + | source.nextWhileMatches(/[\w\._\-]/); |
| + | setState(inBlock("xml-processing", "?>")); |
| + | return "xml-processing"; |
| + | } |
| + | else { |
| + | if (source.equals("/")) source.next(); |
| + | setState(inTag); |
| + | return "xml-punctuation"; |
| + | } |
| + | } |
| + | else if (ch == "&") { |
| + | while (!source.endOfLine()) { |
| + | if (source.next() == ";") |
| + | break; |
| + | } |
| + | return "xml-entity"; |
| + | } |
| + | else { |
| + | source.nextWhileMatches(/[^&<\n]/); |
| + | return "xml-text"; |
| + | } |
| + | } |
| + | |
| + | function inTag(source, setState) { |
| + | var ch = source.next(); |
| + | if (ch == ">") { |
| + | setState(inText); |
| + | return "xml-punctuation"; |
| + | } |
| + | else if (/[?\/]/.test(ch) && source.equals(">")) { |
| + | source.next(); |
| + | setState(inText); |
| + | return "xml-punctuation"; |
| + | } |
| + | else if (ch == "=") { |
| + | return "xml-punctuation"; |
| + | } |
| + | else if (/[\'\"]/.test(ch)) { |
| + | setState(inAttribute(ch)); |
| + | return null; |
| + | } |
| + | else { |
| + | source.nextWhileMatches(/[^\s\u00a0=<>\"\'\/?]/); |
| + | return "xml-name"; |
| + | } |
| + | } |
| + | |
| + | function inAttribute(quote) { |
| + | return function(source, setState) { |
| + | while (!source.endOfLine()) { |
| + | if (source.next() == quote) { |
| + | setState(inTag); |
| + | break; |
| + | } |
| + | } |
| + | return "xml-attribute"; |
| + | }; |
| + | } |
| + | |
| + | function inBlock(style, terminator) { |
| + | return function(source, setState) { |
| + | while (!source.endOfLine()) { |
| + | if (source.lookAhead(terminator, true)) { |
| + | setState(inText); |
| + | break; |
| + | } |
| + | source.next(); |
| + | } |
| + | return style; |
| + | }; |
| + | } |
| + | |
| + | return function(source, startState) { |
| + | return tokenizer(source, startState || inText); |
| + | }; |
| + | })(); |
| + | |
| + | // The parser. The structure of this function largely follows that of |
| + | // parseJavaScript in parsejavascript.js (there is actually a bit more |
| + | // shared code than I'd like), but it is quite a bit simpler. |
| + | function parseXML(source) { |
| + | var tokens = tokenizeXML(source), token; |
| + | var cc = [base]; |
| + | var tokenNr = 0, indented = 0; |
| + | var currentTag = null, context = null; |
| + | var consume; |
| + | |
| + | function push(fs) { |
| + | for (var i = fs.length - 1; i >= 0; i--) |
| + | cc.push(fs[i]); |
| + | } |
| + | function cont() { |
| + | push(arguments); |
| + | consume = true; |
| + | } |
| + | function pass() { |
| + | push(arguments); |
| + | consume = false; |
| + | } |
| + | |
| + | function markErr() { |
| + | token.style += " xml-error"; |
| + | } |
| + | function expect(text) { |
| + | return function(style, content) { |
| + | if (content == text) cont(); |
| + | else {markErr(); cont(arguments.callee);} |
| + | }; |
| + | } |
| + | |
| + | function pushContext(tagname, startOfLine) { |
| + | var noIndent = UseKludges.doNotIndent.hasOwnProperty(tagname) || (context && context.noIndent); |
| + | context = {prev: context, name: tagname, indent: indented, startOfLine: startOfLine, noIndent: noIndent}; |
| + | } |
| + | function popContext() { |
| + | context = context.prev; |
| + | } |
| + | function computeIndentation(baseContext) { |
| + | return function(nextChars, current) { |
| + | var context = baseContext; |
| + | if (context && context.noIndent) |
| + | return current; |
| + | if (alignCDATA && /<!\[CDATA\[/.test(nextChars)) |
| + | return 0; |
| + | if (context && /^<\//.test(nextChars)) |
| + | context = context.prev; |
| + | while (context && !context.startOfLine) |
| + | context = context.prev; |
| + | if (context) |
| + | return context.indent + indentUnit; |
| + | else |
| + | return 0; |
| + | }; |
| + | } |
| + | |
| + | function base() { |
| + | return pass(element, base); |
| + | } |
| + | var harmlessTokens = {"xml-text": true, "xml-entity": true, "xml-comment": true, "xml-processing": true}; |
| + | function element(style, content) { |
| + | if (content == "<") cont(tagname, attributes, endtag(tokenNr == 1)); |
| + | else if (content == "</") cont(closetagname, expect(">")); |
| + | else if (style == "xml-cdata") { |
| + | if (!context || context.name != "!cdata") pushContext("!cdata"); |
| + | if (/\]\]>$/.test(content)) popContext(); |
| + | cont(); |
| + | } |
| + | else if (harmlessTokens.hasOwnProperty(style)) cont(); |
| + | else {markErr(); cont();} |
| + | } |
| + | function tagname(style, content) { |
| + | if (style == "xml-name") { |
| + | currentTag = content.toLowerCase(); |
| + | token.style = "xml-tagname"; |
| + | cont(); |
| + | } |
| + | else { |
| + | currentTag = null; |
| + | pass(); |
| + | } |
| + | } |
| + | function closetagname(style, content) { |
| + | if (style == "xml-name") { |
| + | token.style = "xml-tagname"; |
| + | if (context && content.toLowerCase() == context.name) popContext(); |
| + | else markErr(); |
| + | } |
| + | cont(); |
| + | } |
| + | function endtag(startOfLine) { |
| + | return function(style, content) { |
| + | if (content == "/>" || (content == ">" && UseKludges.autoSelfClosers.hasOwnProperty(currentTag))) cont(); |
| + | else if (content == ">") {pushContext(currentTag, startOfLine); cont();} |
| + | else {markErr(); cont(arguments.callee);} |
| + | }; |
| + | } |
| + | function attributes(style) { |
| + | if (style == "xml-name") {token.style = "xml-attname"; cont(attribute, attributes);} |
| + | else pass(); |
| + | } |
| + | function attribute(style, content) { |
| + | if (content == "=") cont(value); |
| + | else if (content == ">" || content == "/>") pass(endtag); |
| + | else pass(); |
| + | } |
| + | function value(style) { |
| + | if (style == "xml-attribute") cont(value); |
| + | else pass(); |
| + | } |
| + | |
| + | return { |
| + | indentation: function() {return indented;}, |
| + | |
| + | next: function(){ |
| + | token = tokens.next(); |
| + | if (token.style == "whitespace" && tokenNr == 0) |
| + | indented = token.value.length; |
| + | else |
| + | tokenNr++; |
| + | if (token.content == "\n") { |
| + | indented = tokenNr = 0; |
| + | token.indentation = computeIndentation(context); |
| + | } |
| + | |
| + | if (token.style == "whitespace" || token.type == "xml-comment") |
| + | return token; |
| + | |
| + | while(true){ |
| + | consume = false; |
| + | cc.pop()(token.style, token.content); |
| + | if (consume) return token; |
| + | } |
| + | }, |
| + | |
| + | copy: function(){ |
| + | var _cc = cc.concat([]), _tokenState = tokens.state, _context = context; |
| + | var parser = this; |
| + | |
| + | return function(input){ |
| + | cc = _cc.concat([]); |
| + | tokenNr = indented = 0; |
| + | context = _context; |
| + | tokens = tokenizeXML(input, _tokenState); |
| + | return parser; |
| + | }; |
| + | } |
| + | }; |
| + | } |
| + | |
| + | return { |
| + | make: parseXML, |
| + | electricChars: "/", |
| + | configure: function(config) { |
| + | if (config.useHTMLKludges != null) |
| + | UseKludges = config.useHTMLKludges ? Kludges : NoKludges; |
| + | if (config.alignCDATA) |
| + | alignCDATA = config.alignCDATA; |
| + | } |
| + | }; |
| + | })(); |
public/javascripts/cms/3rdparty/codemirror/select.js
+672
-0
| @@ | @@ -0,0 +1,672 @@ |
| + | /* Functionality for finding, storing, and restoring selections |
| + | * |
| + | * This does not provide a generic API, just the minimal functionality |
| + | * required by the CodeMirror system. |
| + | */ |
| + | |
| + | // Namespace object. |
| + | var select = {}; |
| + | |
| + | (function() { |
| + | select.ie_selection = document.selection && document.selection.createRangeCollection; |
| + | |
| + | // Find the 'top-level' (defined as 'a direct child of the node |
| + | // passed as the top argument') node that the given node is |
| + | // contained in. Return null if the given node is not inside the top |
| + | // node. |
| + | function topLevelNodeAt(node, top) { |
| + | while (node && node.parentNode != top) |
| + | node = node.parentNode; |
| + | return node; |
| + | } |
| + | |
| + | // Find the top-level node that contains the node before this one. |
| + | function topLevelNodeBefore(node, top) { |
| + | while (!node.previousSibling && node.parentNode != top) |
| + | node = node.parentNode; |
| + | return topLevelNodeAt(node.previousSibling, top); |
| + | } |
| + | |
| + | var fourSpaces = "\u00a0\u00a0\u00a0\u00a0"; |
| + | |
| + | select.scrollToNode = function(node, cursor) { |
| + | if (!node) return; |
| + | var element = node, |
| + | doc = element.ownerDocument, body = doc.body, |
| + | win = (doc.defaultView || doc.parentWindow), |
| + | html = doc.documentElement, |
| + | atEnd = !element.nextSibling || !element.nextSibling.nextSibling |
| + | || !element.nextSibling.nextSibling.nextSibling; |
| + | // In Opera (and recent Webkit versions), BR elements *always* |
| + | // have a offsetTop property of zero. |
| + | var compensateHack = 0; |
| + | while (element && !element.offsetTop) { |
| + | compensateHack++; |
| + | element = element.previousSibling; |
| + | } |
| + | // atEnd is another kludge for these browsers -- if the cursor is |
| + | // at the end of the document, and the node doesn't have an |
| + | // offset, just scroll to the end. |
| + | if (compensateHack == 0) atEnd = false; |
| + | |
| + | // WebKit has a bad habit of (sometimes) happily returning bogus |
| + | // offsets when the document has just been changed. This seems to |
| + | // always be 5/5, so we don't use those. |
| + | if (webkit && element && element.offsetTop == 5 && element.offsetLeft == 5) |
| + | return; |
| + | |
| + | var y = compensateHack * (element ? element.offsetHeight : 0), x = 0, |
| + | width = (node ? node.offsetWidth : 0), pos = element; |
| + | while (pos && pos.offsetParent) { |
| + | y += pos.offsetTop; |
| + | // Don't count X offset for <br> nodes |
| + | if (!isBR(pos)) |
| + | x += pos.offsetLeft; |
| + | pos = pos.offsetParent; |
| + | } |
| + | |
| + | var scroll_x = body.scrollLeft || html.scrollLeft || 0, |
| + | scroll_y = body.scrollTop || html.scrollTop || 0, |
| + | scroll = false, screen_width = win.innerWidth || html.clientWidth || 0; |
| + | |
| + | if (cursor || width < screen_width) { |
| + | if (cursor) { |
| + | var off = select.offsetInNode(win, node), size = nodeText(node).length; |
| + | if (size) x += width * (off / size); |
| + | } |
| + | var screen_x = x - scroll_x; |
| + | if (screen_x < 0 || screen_x > screen_width) { |
| + | scroll_x = x; |
| + | scroll = true; |
| + | } |
| + | } |
| + | var screen_y = y - scroll_y; |
| + | if (screen_y < 0 || atEnd || screen_y > (win.innerHeight || html.clientHeight || 0) - 50) { |
| + | scroll_y = atEnd ? 1e6 : y; |
| + | scroll = true; |
| + | } |
| + | if (scroll) win.scrollTo(scroll_x, scroll_y); |
| + | }; |
| + | |
| + | select.scrollToCursor = function(container) { |
| + | select.scrollToNode(select.selectionTopNode(container, true) || container.firstChild, true); |
| + | }; |
| + | |
| + | // Used to prevent restoring a selection when we do not need to. |
| + | var currentSelection = null; |
| + | |
| + | select.snapshotChanged = function() { |
| + | if (currentSelection) currentSelection.changed = true; |
| + | }; |
| + | |
| + | // This is called by the code in editor.js whenever it is replacing |
| + | // a text node. The function sees whether the given oldNode is part |
| + | // of the current selection, and updates this selection if it is. |
| + | // Because nodes are often only partially replaced, the length of |
| + | // the part that gets replaced has to be taken into account -- the |
| + | // selection might stay in the oldNode if the newNode is smaller |
| + | // than the selection's offset. The offset argument is needed in |
| + | // case the selection does move to the new object, and the given |
| + | // length is not the whole length of the new node (part of it might |
| + | // have been used to replace another node). |
| + | select.snapshotReplaceNode = function(from, to, length, offset) { |
| + | if (!currentSelection) return; |
| + | |
| + | function replace(point) { |
| + | if (from == point.node) { |
| + | currentSelection.changed = true; |
| + | if (length && point.offset > length) { |
| + | point.offset -= length; |
| + | } |
| + | else { |
| + | point.node = to; |
| + | point.offset += (offset || 0); |
| + | } |
| + | } |
| + | } |
| + | replace(currentSelection.start); |
| + | replace(currentSelection.end); |
| + | }; |
| + | |
| + | select.snapshotMove = function(from, to, distance, relative, ifAtStart) { |
| + | if (!currentSelection) return; |
| + | |
| + | function move(point) { |
| + | if (from == point.node && (!ifAtStart || point.offset == 0)) { |
| + | currentSelection.changed = true; |
| + | point.node = to; |
| + | if (relative) point.offset = Math.max(0, point.offset + distance); |
| + | else point.offset = distance; |
| + | } |
| + | } |
| + | move(currentSelection.start); |
| + | move(currentSelection.end); |
| + | }; |
| + | |
| + | // Most functions are defined in two ways, one for the IE selection |
| + | // model, one for the W3C one. |
| + | if (select.ie_selection) { |
| + | function selectionNode(win, start) { |
| + | var range = win.document.selection.createRange(); |
| + | range.collapse(start); |
| + | |
| + | function nodeAfter(node) { |
| + | var found = null; |
| + | while (!found && node) { |
| + | found = node.nextSibling; |
| + | node = node.parentNode; |
| + | } |
| + | return nodeAtStartOf(found); |
| + | } |
| + | |
| + | function nodeAtStartOf(node) { |
| + | while (node && node.firstChild) node = node.firstChild; |
| + | return {node: node, offset: 0}; |
| + | } |
| + | |
| + | var containing = range.parentElement(); |
| + | if (!isAncestor(win.document.body, containing)) return null; |
| + | if (!containing.firstChild) return nodeAtStartOf(containing); |
| + | |
| + | var working = range.duplicate(); |
| + | working.moveToElementText(containing); |
| + | working.collapse(true); |
| + | for (var cur = containing.firstChild; cur; cur = cur.nextSibling) { |
| + | if (cur.nodeType == 3) { |
| + | var size = cur.nodeValue.length; |
| + | working.move("character", size); |
| + | } |
| + | else { |
| + | working.moveToElementText(cur); |
| + | working.collapse(false); |
| + | } |
| + | |
| + | var dir = range.compareEndPoints("StartToStart", working); |
| + | if (dir == 0) return nodeAfter(cur); |
| + | if (dir == 1) continue; |
| + | if (cur.nodeType != 3) return nodeAtStartOf(cur); |
| + | |
| + | working.setEndPoint("StartToEnd", range); |
| + | return {node: cur, offset: size - working.text.length}; |
| + | } |
| + | return nodeAfter(containing); |
| + | } |
| + | |
| + | select.markSelection = function(win) { |
| + | currentSelection = null; |
| + | var sel = win.document.selection; |
| + | if (!sel) return; |
| + | var start = selectionNode(win, true), |
| + | end = selectionNode(win, false); |
| + | if (!start || !end) return; |
| + | currentSelection = {start: start, end: end, window: win, changed: false}; |
| + | }; |
| + | |
| + | select.selectMarked = function() { |
| + | if (!currentSelection || !currentSelection.changed) return; |
| + | var win = currentSelection.window, doc = win.document; |
| + | |
| + | function makeRange(point) { |
| + | var range = doc.body.createTextRange(), |
| + | node = point.node; |
| + | if (!node) { |
| + | range.moveToElementText(currentSelection.window.document.body); |
| + | range.collapse(false); |
| + | } |
| + | else if (node.nodeType == 3) { |
| + | range.moveToElementText(node.parentNode); |
| + | var offset = point.offset; |
| + | while (node.previousSibling) { |
| + | node = node.previousSibling; |
| + | offset += (node.innerText || "").length; |
| + | } |
| + | range.move("character", offset); |
| + | } |
| + | else { |
| + | range.moveToElementText(node); |
| + | range.collapse(true); |
| + | } |
| + | return range; |
| + | } |
| + | |
| + | var start = makeRange(currentSelection.start), end = makeRange(currentSelection.end); |
| + | start.setEndPoint("StartToEnd", end); |
| + | start.select(); |
| + | }; |
| + | |
| + | select.offsetInNode = function(win, node) { |
| + | var sel = win.document.selection; |
| + | if (!sel) return 0; |
| + | var range = sel.createRange(), range2 = range.duplicate(); |
| + | try {range2.moveToElementText(node);} catch(e){return 0;} |
| + | range.setEndPoint("StartToStart", range2); |
| + | return range.text.length; |
| + | }; |
| + | |
| + | // Get the top-level node that one end of the cursor is inside or |
| + | // after. Note that this returns false for 'no cursor', and null |
| + | // for 'start of document'. |
| + | select.selectionTopNode = function(container, start) { |
| + | var selection = container.ownerDocument.selection; |
| + | if (!selection) return false; |
| + | |
| + | var range = selection.createRange(), range2 = range.duplicate(); |
| + | range.collapse(start); |
| + | var around = range.parentElement(); |
| + | if (around && isAncestor(container, around)) { |
| + | // Only use this node if the selection is not at its start. |
| + | range2.moveToElementText(around); |
| + | if (range.compareEndPoints("StartToStart", range2) == 1) |
| + | return topLevelNodeAt(around, container); |
| + | } |
| + | |
| + | // Move the start of a range to the start of a node, |
| + | // compensating for the fact that you can't call |
| + | // moveToElementText with text nodes. |
| + | function moveToNodeStart(range, node) { |
| + | if (node.nodeType == 3) { |
| + | var count = 0, cur = node.previousSibling; |
| + | while (cur && cur.nodeType == 3) { |
| + | count += cur.nodeValue.length; |
| + | cur = cur.previousSibling; |
| + | } |
| + | if (cur) { |
| + | try{range.moveToElementText(cur);} |
| + | catch(e){return false;} |
| + | range.collapse(false); |
| + | } |
| + | else range.moveToElementText(node.parentNode); |
| + | if (count) range.move("character", count); |
| + | } |
| + | else { |
| + | try{range.moveToElementText(node);} |
| + | catch(e){return false;} |
| + | } |
| + | return true; |
| + | } |
| + | |
| + | // Do a binary search through the container object, comparing |
| + | // the start of each node to the selection |
| + | var start = 0, end = container.childNodes.length - 1; |
| + | while (start < end) { |
| + | var middle = Math.ceil((end + start) / 2), node = container.childNodes[middle]; |
| + | if (!node) return false; // Don't ask. IE6 manages this sometimes. |
| + | if (!moveToNodeStart(range2, node)) return false; |
| + | if (range.compareEndPoints("StartToStart", range2) == 1) |
| + | start = middle; |
| + | else |
| + | end = middle - 1; |
| + | } |
| + | return container.childNodes[start] || null; |
| + | }; |
| + | |
| + | // Place the cursor after this.start. This is only useful when |
| + | // manually moving the cursor instead of restoring it to its old |
| + | // position. |
| + | select.focusAfterNode = function(node, container) { |
| + | var range = container.ownerDocument.body.createTextRange(); |
| + | range.moveToElementText(node || container); |
| + | range.collapse(!node); |
| + | range.select(); |
| + | }; |
| + | |
| + | select.somethingSelected = function(win) { |
| + | var sel = win.document.selection; |
| + | return sel && (sel.createRange().text != ""); |
| + | }; |
| + | |
| + | function insertAtCursor(window, html) { |
| + | var selection = window.document.selection; |
| + | if (selection) { |
| + | var range = selection.createRange(); |
| + | range.pasteHTML(html); |
| + | range.collapse(false); |
| + | range.select(); |
| + | } |
| + | } |
| + | |
| + | // Used to normalize the effect of the enter key, since browsers |
| + | // do widely different things when pressing enter in designMode. |
| + | select.insertNewlineAtCursor = function(window) { |
| + | insertAtCursor(window, "<br>"); |
| + | }; |
| + | |
| + | select.insertTabAtCursor = function(window) { |
| + | insertAtCursor(window, fourSpaces); |
| + | }; |
| + | |
| + | // Get the BR node at the start of the line on which the cursor |
| + | // currently is, and the offset into the line. Returns null as |
| + | // node if cursor is on first line. |
| + | select.cursorPos = function(container, start) { |
| + | var selection = container.ownerDocument.selection; |
| + | if (!selection) return null; |
| + | |
| + | var topNode = select.selectionTopNode(container, start); |
| + | while (topNode && !isBR(topNode)) |
| + | topNode = topNode.previousSibling; |
| + | |
| + | var range = selection.createRange(), range2 = range.duplicate(); |
| + | range.collapse(start); |
| + | if (topNode) { |
| + | range2.moveToElementText(topNode); |
| + | range2.collapse(false); |
| + | } |
| + | else { |
| + | // When nothing is selected, we can get all kinds of funky errors here. |
| + | try { range2.moveToElementText(container); } |
| + | catch (e) { return null; } |
| + | range2.collapse(true); |
| + | } |
| + | range.setEndPoint("StartToStart", range2); |
| + | |
| + | return {node: topNode, offset: range.text.length}; |
| + | }; |
| + | |
| + | select.setCursorPos = function(container, from, to) { |
| + | function rangeAt(pos) { |
| + | var range = container.ownerDocument.body.createTextRange(); |
| + | if (!pos.node) { |
| + | range.moveToElementText(container); |
| + | range.collapse(true); |
| + | } |
| + | else { |
| + | range.moveToElementText(pos.node); |
| + | range.collapse(false); |
| + | } |
| + | range.move("character", pos.offset); |
| + | return range; |
| + | } |
| + | |
| + | var range = rangeAt(from); |
| + | if (to && to != from) |
| + | range.setEndPoint("EndToEnd", rangeAt(to)); |
| + | range.select(); |
| + | } |
| + | |
| + | // Some hacks for storing and re-storing the selection when the editor loses and regains focus. |
| + | select.getBookmark = function (container) { |
| + | var from = select.cursorPos(container, true), to = select.cursorPos(container, false); |
| + | if (from && to) return {from: from, to: to}; |
| + | }; |
| + | |
| + | // Restore a stored selection. |
| + | select.setBookmark = function(container, mark) { |
| + | if (!mark) return; |
| + | select.setCursorPos(container, mark.from, mark.to); |
| + | }; |
| + | } |
| + | // W3C model |
| + | else { |
| + | // Find the node right at the cursor, not one of its |
| + | // ancestors with a suitable offset. This goes down the DOM tree |
| + | // until a 'leaf' is reached (or is it *up* the DOM tree?). |
| + | function innerNode(node, offset) { |
| + | while (node.nodeType != 3 && !isBR(node)) { |
| + | var newNode = node.childNodes[offset] || node.nextSibling; |
| + | offset = 0; |
| + | while (!newNode && node.parentNode) { |
| + | node = node.parentNode; |
| + | newNode = node.nextSibling; |
| + | } |
| + | node = newNode; |
| + | if (!newNode) break; |
| + | } |
| + | return {node: node, offset: offset}; |
| + | } |
| + | |
| + | // Store start and end nodes, and offsets within these, and refer |
| + | // back to the selection object from those nodes, so that this |
| + | // object can be updated when the nodes are replaced before the |
| + | // selection is restored. |
| + | select.markSelection = function (win) { |
| + | var selection = win.getSelection(); |
| + | if (!selection || selection.rangeCount == 0) |
| + | return (currentSelection = null); |
| + | var range = selection.getRangeAt(0); |
| + | |
| + | currentSelection = { |
| + | start: innerNode(range.startContainer, range.startOffset), |
| + | end: innerNode(range.endContainer, range.endOffset), |
| + | window: win, |
| + | changed: false |
| + | }; |
| + | }; |
| + | |
| + | select.selectMarked = function () { |
| + | var cs = currentSelection; |
| + | // on webkit-based browsers, it is apparently possible that the |
| + | // selection gets reset even when a node that is not one of the |
| + | // endpoints get messed with. the most common situation where |
| + | // this occurs is when a selection is deleted or overwitten. we |
| + | // check for that here. |
| + | function focusIssue() { |
| + | if (cs.start.node == cs.end.node && cs.start.offset == cs.end.offset) { |
| + | var selection = cs.window.getSelection(); |
| + | if (!selection || selection.rangeCount == 0) return true; |
| + | var range = selection.getRangeAt(0), point = innerNode(range.startContainer, range.startOffset); |
| + | return cs.start.node != point.node || cs.start.offset != point.offset; |
| + | } |
| + | } |
| + | if (!cs || !(cs.changed || (webkit && focusIssue()))) return; |
| + | var win = cs.window, range = win.document.createRange(); |
| + | |
| + | function setPoint(point, which) { |
| + | if (point.node) { |
| + | // Some magic to generalize the setting of the start and end |
| + | // of a range. |
| + | if (point.offset == 0) |
| + | range["set" + which + "Before"](point.node); |
| + | else |
| + | range["set" + which](point.node, point.offset); |
| + | } |
| + | else { |
| + | range.setStartAfter(win.document.body.lastChild || win.document.body); |
| + | } |
| + | } |
| + | |
| + | setPoint(cs.end, "End"); |
| + | setPoint(cs.start, "Start"); |
| + | selectRange(range, win); |
| + | }; |
| + | |
| + | // Helper for selecting a range object. |
| + | function selectRange(range, window) { |
| + | var selection = window.getSelection(); |
| + | if (!selection) return; |
| + | selection.removeAllRanges(); |
| + | selection.addRange(range); |
| + | } |
| + | function selectionRange(window) { |
| + | var selection = window.getSelection(); |
| + | if (!selection || selection.rangeCount == 0) |
| + | return false; |
| + | else |
| + | return selection.getRangeAt(0); |
| + | } |
| + | |
| + | // Finding the top-level node at the cursor in the W3C is, as you |
| + | // can see, quite an involved process. |
| + | select.selectionTopNode = function(container, start) { |
| + | var range = selectionRange(container.ownerDocument.defaultView); |
| + | if (!range) return false; |
| + | |
| + | var node = start ? range.startContainer : range.endContainer; |
| + | var offset = start ? range.startOffset : range.endOffset; |
| + | // Work around (yet another) bug in Opera's selection model. |
| + | if (window.opera && !start && range.endContainer == container && range.endOffset == range.startOffset + 1 && |
| + | container.childNodes[range.startOffset] && isBR(container.childNodes[range.startOffset])) |
| + | offset--; |
| + | |
| + | // For text nodes, we look at the node itself if the cursor is |
| + | // inside, or at the node before it if the cursor is at the |
| + | // start. |
| + | if (node.nodeType == 3){ |
| + | if (offset > 0) |
| + | return topLevelNodeAt(node, container); |
| + | else |
| + | return topLevelNodeBefore(node, container); |
| + | } |
| + | // Occasionally, browsers will return the HTML node as |
| + | // selection. If the offset is 0, we take the start of the frame |
| + | // ('after null'), otherwise, we take the last node. |
| + | else if (node.nodeName.toUpperCase() == "HTML") { |
| + | return (offset == 1 ? null : container.lastChild); |
| + | } |
| + | // If the given node is our 'container', we just look up the |
| + | // correct node by using the offset. |
| + | else if (node == container) { |
| + | return (offset == 0) ? null : node.childNodes[offset - 1]; |
| + | } |
| + | // In any other case, we have a regular node. If the cursor is |
| + | // at the end of the node, we use the node itself, if it is at |
| + | // the start, we use the node before it, and in any other |
| + | // case, we look up the child before the cursor and use that. |
| + | else { |
| + | if (offset == node.childNodes.length) |
| + | return topLevelNodeAt(node, container); |
| + | else if (offset == 0) |
| + | return topLevelNodeBefore(node, container); |
| + | else |
| + | return topLevelNodeAt(node.childNodes[offset - 1], container); |
| + | } |
| + | }; |
| + | |
| + | select.focusAfterNode = function(node, container) { |
| + | var win = container.ownerDocument.defaultView, |
| + | range = win.document.createRange(); |
| + | range.setStartBefore(container.firstChild || container); |
| + | // In Opera, setting the end of a range at the end of a line |
| + | // (before a BR) will cause the cursor to appear on the next |
| + | // line, so we set the end inside of the start node when |
| + | // possible. |
| + | if (node && !node.firstChild) |
| + | range.setEndAfter(node); |
| + | else if (node) |
| + | range.setEnd(node, node.childNodes.length); |
| + | else |
| + | range.setEndBefore(container.firstChild || container); |
| + | range.collapse(false); |
| + | selectRange(range, win); |
| + | }; |
| + | |
| + | select.somethingSelected = function(win) { |
| + | var range = selectionRange(win); |
| + | return range && !range.collapsed; |
| + | }; |
| + | |
| + | select.offsetInNode = function(win, node) { |
| + | var range = selectionRange(win); |
| + | if (!range) return 0; |
| + | range = range.cloneRange(); |
| + | range.setStartBefore(node); |
| + | return range.toString().length; |
| + | }; |
| + | |
| + | function insertNodeAtCursor(window, node) { |
| + | var range = selectionRange(window); |
| + | if (!range) return; |
| + | |
| + | range.deleteContents(); |
| + | range.insertNode(node); |
| + | |
| + | // work around weirdness where Opera will magically insert a new |
| + | // BR node when a BR node inside a span is moved around. makes |
| + | // sure the BR ends up outside of spans. |
| + | if (window.opera && isBR(node) && isSpan(node.parentNode)) { |
| + | var next = node.nextSibling, p = node.parentNode, outer = p.parentNode; |
| + | outer.insertBefore(node, p.nextSibling); |
| + | var textAfter = ""; |
| + | for (; next && next.nodeType == 3; next = next.nextSibling) { |
| + | textAfter += next.nodeValue; |
| + | removeElement(next); |
| + | } |
| + | outer.insertBefore(makePartSpan(textAfter, window.document), node.nextSibling); |
| + | } |
| + | range = window.document.createRange(); |
| + | range.selectNode(node); |
| + | range.collapse(false); |
| + | selectRange(range, window); |
| + | } |
| + | |
| + | select.insertNewlineAtCursor = function(window) { |
| + | if (webkit) |
| + | document.execCommand('insertLineBreak'); |
| + | else |
| + | insertNodeAtCursor(window, window.document.createElement("BR")); |
| + | }; |
| + | |
| + | select.insertTabAtCursor = function(window) { |
| + | insertNodeAtCursor(window, window.document.createTextNode(fourSpaces)); |
| + | }; |
| + | |
| + | select.cursorPos = function(container, start) { |
| + | var range = selectionRange(window); |
| + | if (!range) return; |
| + | |
| + | var topNode = select.selectionTopNode(container, start); |
| + | while (topNode && !isBR(topNode)) |
| + | topNode = topNode.previousSibling; |
| + | |
| + | range = range.cloneRange(); |
| + | range.collapse(start); |
| + | if (topNode) |
| + | range.setStartAfter(topNode); |
| + | else |
| + | range.setStartBefore(container); |
| + | |
| + | return {node: topNode, offset: range.toString().length}; |
| + | }; |
| + | |
| + | select.setCursorPos = function(container, from, to) { |
| + | var win = container.ownerDocument.defaultView, |
| + | range = win.document.createRange(); |
| + | |
| + | function setPoint(node, offset, side) { |
| + | if (offset == 0 && node && !node.nextSibling) { |
| + | range["set" + side + "After"](node); |
| + | return true; |
| + | } |
| + | |
| + | if (!node) |
| + | node = container.firstChild; |
| + | else |
| + | node = node.nextSibling; |
| + | |
| + | if (!node) return; |
| + | |
| + | if (offset == 0) { |
| + | range["set" + side + "Before"](node); |
| + | return true; |
| + | } |
| + | |
| + | var backlog = [] |
| + | function decompose(node) { |
| + | if (node.nodeType == 3) |
| + | backlog.push(node); |
| + | else |
| + | forEach(node.childNodes, decompose); |
| + | } |
| + | while (true) { |
| + | while (node && !backlog.length) { |
| + | decompose(node); |
| + | node = node.nextSibling; |
| + | } |
| + | var cur = backlog.shift(); |
| + | if (!cur) return false; |
| + | |
| + | var length = cur.nodeValue.length; |
| + | if (length >= offset) { |
| + | range["set" + side](cur, offset); |
| + | return true; |
| + | } |
| + | offset -= length; |
| + | } |
| + | } |
| + | |
| + | to = to || from; |
| + | if (setPoint(to.node, to.offset, "End") && setPoint(from.node, from.offset, "Start")) |
| + | selectRange(range, win); |
| + | }; |
| + | } |
| + | })(); |
public/javascripts/cms/3rdparty/codemirror/stringstream.js
+140
-0
| @@ | @@ -0,0 +1,140 @@ |
| + | /* String streams are the things fed to parsers (which can feed them |
| + | * to a tokenizer if they want). They provide peek and next methods |
| + | * for looking at the current character (next 'consumes' this |
| + | * character, peek does not), and a get method for retrieving all the |
| + | * text that was consumed since the last time get was called. |
| + | * |
| + | * An easy mistake to make is to let a StopIteration exception finish |
| + | * the token stream while there are still characters pending in the |
| + | * string stream (hitting the end of the buffer while parsing a |
| + | * token). To make it easier to detect such errors, the stringstreams |
| + | * throw an exception when this happens. |
| + | */ |
| + | |
| + | // Make a stringstream stream out of an iterator that returns strings. |
| + | // This is applied to the result of traverseDOM (see codemirror.js), |
| + | // and the resulting stream is fed to the parser. |
| + | var stringStream = function(source){ |
| + | // String that's currently being iterated over. |
| + | var current = ""; |
| + | // Position in that string. |
| + | var pos = 0; |
| + | // Accumulator for strings that have been iterated over but not |
| + | // get()-ed yet. |
| + | var accum = ""; |
| + | // Make sure there are more characters ready, or throw |
| + | // StopIteration. |
| + | function ensureChars() { |
| + | while (pos == current.length) { |
| + | accum += current; |
| + | current = ""; // In case source.next() throws |
| + | pos = 0; |
| + | try {current = source.next();} |
| + | catch (e) { |
| + | if (e != StopIteration) throw e; |
| + | else return false; |
| + | } |
| + | } |
| + | return true; |
| + | } |
| + | |
| + | return { |
| + | // Return the next character in the stream. |
| + | peek: function() { |
| + | if (!ensureChars()) return null; |
| + | return current.charAt(pos); |
| + | }, |
| + | // Get the next character, throw StopIteration if at end, check |
| + | // for unused content. |
| + | next: function() { |
| + | if (!ensureChars()) { |
| + | if (accum.length > 0) |
| + | throw "End of stringstream reached without emptying buffer ('" + accum + "')."; |
| + | else |
| + | throw StopIteration; |
| + | } |
| + | return current.charAt(pos++); |
| + | }, |
| + | // Return the characters iterated over since the last call to |
| + | // .get(). |
| + | get: function() { |
| + | var temp = accum; |
| + | accum = ""; |
| + | if (pos > 0){ |
| + | temp += current.slice(0, pos); |
| + | current = current.slice(pos); |
| + | pos = 0; |
| + | } |
| + | return temp; |
| + | }, |
| + | // Push a string back into the stream. |
| + | push: function(str) { |
| + | current = current.slice(0, pos) + str + current.slice(pos); |
| + | }, |
| + | lookAhead: function(str, consume, skipSpaces, caseInsensitive) { |
| + | function cased(str) {return caseInsensitive ? str.toLowerCase() : str;} |
| + | str = cased(str); |
| + | var found = false; |
| + | |
| + | var _accum = accum, _pos = pos; |
| + | if (skipSpaces) this.nextWhileMatches(/[\s\u00a0]/); |
| + | |
| + | while (true) { |
| + | var end = pos + str.length, left = current.length - pos; |
| + | if (end <= current.length) { |
| + | found = str == cased(current.slice(pos, end)); |
| + | pos = end; |
| + | break; |
| + | } |
| + | else if (str.slice(0, left) == cased(current.slice(pos))) { |
| + | accum += current; current = ""; |
| + | try {current = source.next();} |
| + | catch (e) {break;} |
| + | pos = 0; |
| + | str = str.slice(left); |
| + | } |
| + | else { |
| + | break; |
| + | } |
| + | } |
| + | |
| + | if (!(found && consume)) { |
| + | current = accum.slice(_accum.length) + current; |
| + | pos = _pos; |
| + | accum = _accum; |
| + | } |
| + | |
| + | return found; |
| + | }, |
| + | |
| + | // Utils built on top of the above |
| + | more: function() { |
| + | return this.peek() !== null; |
| + | }, |
| + | applies: function(test) { |
| + | var next = this.peek(); |
| + | return (next !== null && test(next)); |
| + | }, |
| + | nextWhile: function(test) { |
| + | var next; |
| + | while ((next = this.peek()) !== null && test(next)) |
| + | this.next(); |
| + | }, |
| + | matches: function(re) { |
| + | var next = this.peek(); |
| + | return (next !== null && re.test(next)); |
| + | }, |
| + | nextWhileMatches: function(re) { |
| + | var next; |
| + | while ((next = this.peek()) !== null && re.test(next)) |
| + | this.next(); |
| + | }, |
| + | equals: function(ch) { |
| + | return ch === this.peek(); |
| + | }, |
| + | endOfLine: function() { |
| + | var next = this.peek(); |
| + | return next == null || next == "\n"; |
| + | } |
| + | }; |
| + | }; |
public/javascripts/cms/3rdparty/codemirror/tokenize.js
+57
-0
| @@ | @@ -0,0 +1,57 @@ |
| + | // A framework for simple tokenizers. Takes care of newlines and |
| + | // white-space, and of getting the text from the source stream into |
| + | // the token object. A state is a function of two arguments -- a |
| + | // string stream and a setState function. The second can be used to |
| + | // change the tokenizer's state, and can be ignored for stateless |
| + | // tokenizers. This function should advance the stream over a token |
| + | // and return a string or object containing information about the next |
| + | // token, or null to pass and have the (new) state be called to finish |
| + | // the token. When a string is given, it is wrapped in a {style, type} |
| + | // object. In the resulting object, the characters consumed are stored |
| + | // under the content property. Any whitespace following them is also |
| + | // automatically consumed, and added to the value property. (Thus, |
| + | // content is the actual meaningful part of the token, while value |
| + | // contains all the text it spans.) |
| + | |
| + | function tokenizer(source, state) { |
| + | // Newlines are always a separate token. |
| + | function isWhiteSpace(ch) { |
| + | // The messy regexp is because IE's regexp matcher is of the |
| + | // opinion that non-breaking spaces are no whitespace. |
| + | return ch != "\n" && /^[\s\u00a0]*$/.test(ch); |
| + | } |
| + | |
| + | var tokenizer = { |
| + | state: state, |
| + | |
| + | take: function(type) { |
| + | if (typeof(type) == "string") |
| + | type = {style: type, type: type}; |
| + | |
| + | type.content = (type.content || "") + source.get(); |
| + | if (!/\n$/.test(type.content)) |
| + | source.nextWhile(isWhiteSpace); |
| + | type.value = type.content + source.get(); |
| + | return type; |
| + | }, |
| + | |
| + | next: function () { |
| + | if (!source.more()) throw StopIteration; |
| + | |
| + | var type; |
| + | if (source.equals("\n")) { |
| + | source.next(); |
| + | return this.take("whitespace"); |
| + | } |
| + | |
| + | if (source.applies(isWhiteSpace)) |
| + | type = "whitespace"; |
| + | else |
| + | while (!type) |
| + | type = this.state(source, function(s) {tokenizer.state = s;}); |
| + | |
| + | return this.take(type); |
| + | } |
| + | }; |
| + | return tokenizer; |
| + | } |
public/javascripts/cms/3rdparty/codemirror/tokenizejavascript.js
+174
-0
| @@ | @@ -0,0 +1,174 @@ |
| + | /* Tokenizer for JavaScript code */ |
| + | |
| + | var tokenizeJavaScript = (function() { |
| + | // Advance the stream until the given character (not preceded by a |
| + | // backslash) is encountered, or the end of the line is reached. |
| + | function nextUntilUnescaped(source, end) { |
| + | var escaped = false; |
| + | while (!source.endOfLine()) { |
| + | var next = source.next(); |
| + | if (next == end && !escaped) |
| + | return false; |
| + | escaped = !escaped && next == "\\"; |
| + | } |
| + | return escaped; |
| + | } |
| + | |
| + | // A map of JavaScript's keywords. The a/b/c keyword distinction is |
| + | // very rough, but it gives the parser enough information to parse |
| + | // correct code correctly (we don't care that much how we parse |
| + | // incorrect code). The style information included in these objects |
| + | // is used by the highlighter to pick the correct CSS style for a |
| + | // token. |
| + | var keywords = function(){ |
| + | function result(type, style){ |
| + | return {type: type, style: "js-" + style}; |
| + | } |
| + | // keywords that take a parenthised expression, and then a |
| + | // statement (if) |
| + | var keywordA = result("keyword a", "keyword"); |
| + | // keywords that take just a statement (else) |
| + | var keywordB = result("keyword b", "keyword"); |
| + | // keywords that optionally take an expression, and form a |
| + | // statement (return) |
| + | var keywordC = result("keyword c", "keyword"); |
| + | var operator = result("operator", "keyword"); |
| + | var atom = result("atom", "atom"); |
| + | return { |
| + | "if": keywordA, "while": keywordA, "with": keywordA, |
| + | "else": keywordB, "do": keywordB, "try": keywordB, "finally": keywordB, |
| + | "return": keywordC, "break": keywordC, "continue": keywordC, "new": keywordC, "delete": keywordC, "throw": keywordC, |
| + | "in": operator, "typeof": operator, "instanceof": operator, |
| + | "var": result("var", "keyword"), "function": result("function", "keyword"), "catch": result("catch", "keyword"), |
| + | "for": result("for", "keyword"), "switch": result("switch", "keyword"), |
| + | "case": result("case", "keyword"), "default": result("default", "keyword"), |
| + | "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom |
| + | }; |
| + | }(); |
| + | |
| + | // Some helper regexps |
| + | var isOperatorChar = /[+\-*&%=<>!?|]/; |
| + | var isHexDigit = /[0-9A-Fa-f]/; |
| + | var isWordChar = /[\w\$_]/; |
| + | |
| + | // Wrapper around jsToken that helps maintain parser state (whether |
| + | // we are inside of a multi-line comment and whether the next token |
| + | // could be a regular expression). |
| + | function jsTokenState(inside, regexp) { |
| + | return function(source, setState) { |
| + | var newInside = inside; |
| + | var type = jsToken(inside, regexp, source, function(c) {newInside = c;}); |
| + | var newRegexp = type.type == "operator" || type.type == "keyword c" || type.type.match(/^[\[{}\(,;:]$/); |
| + | if (newRegexp != regexp || newInside != inside) |
| + | setState(jsTokenState(newInside, newRegexp)); |
| + | return type; |
| + | }; |
| + | } |
| + | |
| + | // The token reader, intended to be used by the tokenizer from |
| + | // tokenize.js (through jsTokenState). Advances the source stream |
| + | // over a token, and returns an object containing the type and style |
| + | // of that token. |
| + | function jsToken(inside, regexp, source, setInside) { |
| + | function readHexNumber(){ |
| + | source.next(); // skip the 'x' |
| + | source.nextWhileMatches(isHexDigit); |
| + | return {type: "number", style: "js-atom"}; |
| + | } |
| + | |
| + | function readNumber() { |
| + | source.nextWhileMatches(/[0-9]/); |
| + | if (source.equals(".")){ |
| + | source.next(); |
| + | source.nextWhileMatches(/[0-9]/); |
| + | } |
| + | if (source.equals("e") || source.equals("E")){ |
| + | source.next(); |
| + | if (source.equals("-")) |
| + | source.next(); |
| + | source.nextWhileMatches(/[0-9]/); |
| + | } |
| + | return {type: "number", style: "js-atom"}; |
| + | } |
| + | // Read a word, look it up in keywords. If not found, it is a |
| + | // variable, otherwise it is a keyword of the type found. |
| + | function readWord() { |
| + | source.nextWhileMatches(isWordChar); |
| + | var word = source.get(); |
| + | var known = keywords.hasOwnProperty(word) && keywords.propertyIsEnumerable(word) && keywords[word]; |
| + | return known ? {type: known.type, style: known.style, content: word} : |
| + | {type: "variable", style: "js-variable", content: word}; |
| + | } |
| + | function readRegexp() { |
| + | nextUntilUnescaped(source, "/"); |
| + | source.nextWhileMatches(/[gi]/); |
| + | return {type: "regexp", style: "js-string"}; |
| + | } |
| + | // Mutli-line comments are tricky. We want to return the newlines |
| + | // embedded in them as regular newline tokens, and then continue |
| + | // returning a comment token for every line of the comment. So |
| + | // some state has to be saved (inside) to indicate whether we are |
| + | // inside a /* */ sequence. |
| + | function readMultilineComment(start){ |
| + | var newInside = "/*"; |
| + | var maybeEnd = (start == "*"); |
| + | while (true) { |
| + | if (source.endOfLine()) |
| + | break; |
| + | var next = source.next(); |
| + | if (next == "/" && maybeEnd){ |
| + | newInside = null; |
| + | break; |
| + | } |
| + | maybeEnd = (next == "*"); |
| + | } |
| + | setInside(newInside); |
| + | return {type: "comment", style: "js-comment"}; |
| + | } |
| + | function readOperator() { |
| + | source.nextWhileMatches(isOperatorChar); |
| + | return {type: "operator", style: "js-operator"}; |
| + | } |
| + | function readString(quote) { |
| + | var endBackSlash = nextUntilUnescaped(source, quote); |
| + | setInside(endBackSlash ? quote : null); |
| + | return {type: "string", style: "js-string"}; |
| + | } |
| + | |
| + | // Fetch the next token. Dispatches on first character in the |
| + | // stream, or first two characters when the first is a slash. |
| + | if (inside == "\"" || inside == "'") |
| + | return readString(inside); |
| + | var ch = source.next(); |
| + | if (inside == "/*") |
| + | return readMultilineComment(ch); |
| + | else if (ch == "\"" || ch == "'") |
| + | return readString(ch); |
| + | // with punctuation, the type of the token is the symbol itself |
| + | else if (/[\[\]{}\(\),;\:\.]/.test(ch)) |
| + | return {type: ch, style: "js-punctuation"}; |
| + | else if (ch == "0" && (source.equals("x") || source.equals("X"))) |
| + | return readHexNumber(); |
| + | else if (/[0-9]/.test(ch)) |
| + | return readNumber(); |
| + | else if (ch == "/"){ |
| + | if (source.equals("*")) |
| + | { source.next(); return readMultilineComment(ch); } |
| + | else if (source.equals("/")) |
| + | { nextUntilUnescaped(source, null); return {type: "comment", style: "js-comment"};} |
| + | else if (regexp) |
| + | return readRegexp(); |
| + | else |
| + | return readOperator(); |
| + | } |
| + | else if (isOperatorChar.test(ch)) |
| + | return readOperator(); |
| + | else |
| + | return readWord(); |
| + | } |
| + | |
| + | // The external interface to the tokenizer. |
| + | return function(source, startState) { |
| + | return tokenizer(source, startState || jsTokenState(false, true)); |
| + | }; |
| + | })(); |
public/javascripts/cms/3rdparty/codemirror/undo.js
+410
-0
| @@ | @@ -0,0 +1,410 @@ |
| + | /** |
| + | * Storage and control for undo information within a CodeMirror |
| + | * editor. 'Why on earth is such a complicated mess required for |
| + | * that?', I hear you ask. The goal, in implementing this, was to make |
| + | * the complexity of storing and reverting undo information depend |
| + | * only on the size of the edited or restored content, not on the size |
| + | * of the whole document. This makes it necessary to use a kind of |
| + | * 'diff' system, which, when applied to a DOM tree, causes some |
| + | * complexity and hackery. |
| + | * |
| + | * In short, the editor 'touches' BR elements as it parses them, and |
| + | * the UndoHistory stores these. When nothing is touched in commitDelay |
| + | * milliseconds, the changes are committed: It goes over all touched |
| + | * nodes, throws out the ones that did not change since last commit or |
| + | * are no longer in the document, and assembles the rest into zero or |
| + | * more 'chains' -- arrays of adjacent lines. Links back to these |
| + | * chains are added to the BR nodes, while the chain that previously |
| + | * spanned these nodes is added to the undo history. Undoing a change |
| + | * means taking such a chain off the undo history, restoring its |
| + | * content (text is saved per line) and linking it back into the |
| + | * document. |
| + | */ |
| + | |
| + | // A history object needs to know about the DOM container holding the |
| + | // document, the maximum amount of undo levels it should store, the |
| + | // delay (of no input) after which it commits a set of changes, and, |
| + | // unfortunately, the 'parent' window -- a window that is not in |
| + | // designMode, and on which setTimeout works in every browser. |
| + | function UndoHistory(container, maxDepth, commitDelay, editor) { |
| + | this.container = container; |
| + | this.maxDepth = maxDepth; this.commitDelay = commitDelay; |
| + | this.editor = editor; this.parent = editor.parent; |
| + | // This line object represents the initial, empty editor. |
| + | var initial = {text: "", from: null, to: null}; |
| + | // As the borders between lines are represented by BR elements, the |
| + | // start of the first line and the end of the last one are |
| + | // represented by null. Since you can not store any properties |
| + | // (links to line objects) in null, these properties are used in |
| + | // those cases. |
| + | this.first = initial; this.last = initial; |
| + | // Similarly, a 'historyTouched' property is added to the BR in |
| + | // front of lines that have already been touched, and 'firstTouched' |
| + | // is used for the first line. |
| + | this.firstTouched = false; |
| + | // History is the set of committed changes, touched is the set of |
| + | // nodes touched since the last commit. |
| + | this.history = []; this.redoHistory = []; this.touched = []; |
| + | } |
| + | |
| + | UndoHistory.prototype = { |
| + | // Schedule a commit (if no other touches come in for commitDelay |
| + | // milliseconds). |
| + | scheduleCommit: function() { |
| + | var self = this; |
| + | this.parent.clearTimeout(this.commitTimeout); |
| + | this.commitTimeout = this.parent.setTimeout(function(){self.tryCommit();}, this.commitDelay); |
| + | }, |
| + | |
| + | // Mark a node as touched. Null is a valid argument. |
| + | touch: function(node) { |
| + | this.setTouched(node); |
| + | this.scheduleCommit(); |
| + | }, |
| + | |
| + | // Undo the last change. |
| + | undo: function() { |
| + | // Make sure pending changes have been committed. |
| + | this.commit(); |
| + | |
| + | if (this.history.length) { |
| + | // Take the top diff from the history, apply it, and store its |
| + | // shadow in the redo history. |
| + | var item = this.history.pop(); |
| + | this.redoHistory.push(this.updateTo(item, "applyChain")); |
| + | this.notifyEnvironment(); |
| + | return this.chainNode(item); |
| + | } |
| + | }, |
| + | |
| + | // Redo the last undone change. |
| + | redo: function() { |
| + | this.commit(); |
| + | if (this.redoHistory.length) { |
| + | // The inverse of undo, basically. |
| + | var item = this.redoHistory.pop(); |
| + | this.addUndoLevel(this.updateTo(item, "applyChain")); |
| + | this.notifyEnvironment(); |
| + | return this.chainNode(item); |
| + | } |
| + | }, |
| + | |
| + | clear: function() { |
| + | this.history = []; |
| + | this.redoHistory = []; |
| + | }, |
| + | |
| + | // Ask for the size of the un/redo histories. |
| + | historySize: function() { |
| + | return {undo: this.history.length, redo: this.redoHistory.length}; |
| + | }, |
| + | |
| + | // Push a changeset into the document. |
| + | push: function(from, to, lines) { |
| + | var chain = []; |
| + | for (var i = 0; i < lines.length; i++) { |
| + | var end = (i == lines.length - 1) ? to : this.container.ownerDocument.createElement("BR"); |
| + | chain.push({from: from, to: end, text: cleanText(lines[i])}); |
| + | from = end; |
| + | } |
| + | this.pushChains([chain], from == null && to == null); |
| + | this.notifyEnvironment(); |
| + | }, |
| + | |
| + | pushChains: function(chains, doNotHighlight) { |
| + | this.commit(doNotHighlight); |
| + | this.addUndoLevel(this.updateTo(chains, "applyChain")); |
| + | this.redoHistory = []; |
| + | }, |
| + | |
| + | // Retrieve a DOM node from a chain (for scrolling to it after undo/redo). |
| + | chainNode: function(chains) { |
| + | for (var i = 0; i < chains.length; i++) { |
| + | var start = chains[i][0], node = start && (start.from || start.to); |
| + | if (node) return node; |
| + | } |
| + | }, |
| + | |
| + | // Clear the undo history, make the current document the start |
| + | // position. |
| + | reset: function() { |
| + | this.history = []; this.redoHistory = []; |
| + | }, |
| + | |
| + | textAfter: function(br) { |
| + | return this.after(br).text; |
| + | }, |
| + | |
| + | nodeAfter: function(br) { |
| + | return this.after(br).to; |
| + | }, |
| + | |
| + | nodeBefore: function(br) { |
| + | return this.before(br).from; |
| + | }, |
| + | |
| + | // Commit unless there are pending dirty nodes. |
| + | tryCommit: function() { |
| + | if (!window.UndoHistory) return; // Stop when frame has been unloaded |
| + | if (this.editor.highlightDirty()) this.commit(true); |
| + | else this.scheduleCommit(); |
| + | }, |
| + | |
| + | // Check whether the touched nodes hold any changes, if so, commit |
| + | // them. |
| + | commit: function(doNotHighlight) { |
| + | this.parent.clearTimeout(this.commitTimeout); |
| + | // Make sure there are no pending dirty nodes. |
| + | if (!doNotHighlight) this.editor.highlightDirty(true); |
| + | // Build set of chains. |
| + | var chains = this.touchedChains(), self = this; |
| + | |
| + | if (chains.length) { |
| + | this.addUndoLevel(this.updateTo(chains, "linkChain")); |
| + | this.redoHistory = []; |
| + | this.notifyEnvironment(); |
| + | } |
| + | }, |
| + | |
| + | // [ end of public interface ] |
| + | |
| + | // Update the document with a given set of chains, return its |
| + | // shadow. updateFunc should be "applyChain" or "linkChain". In the |
| + | // second case, the chains are taken to correspond the the current |
| + | // document, and only the state of the line data is updated. In the |
| + | // first case, the content of the chains is also pushed iinto the |
| + | // document. |
| + | updateTo: function(chains, updateFunc) { |
| + | var shadows = [], dirty = []; |
| + | for (var i = 0; i < chains.length; i++) { |
| + | shadows.push(this.shadowChain(chains[i])); |
| + | dirty.push(this[updateFunc](chains[i])); |
| + | } |
| + | if (updateFunc == "applyChain") |
| + | this.notifyDirty(dirty); |
| + | return shadows; |
| + | }, |
| + | |
| + | // Notify the editor that some nodes have changed. |
| + | notifyDirty: function(nodes) { |
| + | forEach(nodes, method(this.editor, "addDirtyNode")) |
| + | this.editor.scheduleHighlight(); |
| + | }, |
| + | |
| + | notifyEnvironment: function() { |
| + | if (this.onChange) this.onChange(); |
| + | // Used by the line-wrapping line-numbering code. |
| + | if (window.frameElement && window.frameElement.CodeMirror.updateNumbers) |
| + | window.frameElement.CodeMirror.updateNumbers(); |
| + | }, |
| + | |
| + | // Link a chain into the DOM nodes (or the first/last links for null |
| + | // nodes). |
| + | linkChain: function(chain) { |
| + | for (var i = 0; i < chain.length; i++) { |
| + | var line = chain[i]; |
| + | if (line.from) line.from.historyAfter = line; |
| + | else this.first = line; |
| + | if (line.to) line.to.historyBefore = line; |
| + | else this.last = line; |
| + | } |
| + | }, |
| + | |
| + | // Get the line object after/before a given node. |
| + | after: function(node) { |
| + | return node ? node.historyAfter : this.first; |
| + | }, |
| + | before: function(node) { |
| + | return node ? node.historyBefore : this.last; |
| + | }, |
| + | |
| + | // Mark a node as touched if it has not already been marked. |
| + | setTouched: function(node) { |
| + | if (node) { |
| + | if (!node.historyTouched) { |
| + | this.touched.push(node); |
| + | node.historyTouched = true; |
| + | } |
| + | } |
| + | else { |
| + | this.firstTouched = true; |
| + | } |
| + | }, |
| + | |
| + | // Store a new set of undo info, throw away info if there is more of |
| + | // it than allowed. |
| + | addUndoLevel: function(diffs) { |
| + | this.history.push(diffs); |
| + | if (this.history.length > this.maxDepth) |
| + | this.history.shift(); |
| + | }, |
| + | |
| + | // Build chains from a set of touched nodes. |
| + | touchedChains: function() { |
| + | var self = this; |
| + | |
| + | // The temp system is a crummy hack to speed up determining |
| + | // whether a (currently touched) node has a line object associated |
| + | // with it. nullTemp is used to store the object for the first |
| + | // line, other nodes get it stored in their historyTemp property. |
| + | var nullTemp = null; |
| + | function temp(node) {return node ? node.historyTemp : nullTemp;} |
| + | function setTemp(node, line) { |
| + | if (node) node.historyTemp = line; |
| + | else nullTemp = line; |
| + | } |
| + | |
| + | function buildLine(node) { |
| + | var text = []; |
| + | for (var cur = node ? node.nextSibling : self.container.firstChild; |
| + | cur && !isBR(cur); cur = cur.nextSibling) |
| + | if (cur.currentText) text.push(cur.currentText); |
| + | return {from: node, to: cur, text: cleanText(text.join(""))}; |
| + | } |
| + | |
| + | // Filter out unchanged lines and nodes that are no longer in the |
| + | // document. Build up line objects for remaining nodes. |
| + | var lines = []; |
| + | if (self.firstTouched) self.touched.push(null); |
| + | forEach(self.touched, function(node) { |
| + | if (node && node.parentNode != self.container) return; |
| + | |
| + | if (node) node.historyTouched = false; |
| + | else self.firstTouched = false; |
| + | |
| + | var line = buildLine(node), shadow = self.after(node); |
| + | if (!shadow || shadow.text != line.text || shadow.to != line.to) { |
| + | lines.push(line); |
| + | setTemp(node, line); |
| + | } |
| + | }); |
| + | |
| + | // Get the BR element after/before the given node. |
| + | function nextBR(node, dir) { |
| + | var link = dir + "Sibling", search = node[link]; |
| + | while (search && !isBR(search)) |
| + | search = search[link]; |
| + | return search; |
| + | } |
| + | |
| + | // Assemble line objects into chains by scanning the DOM tree |
| + | // around them. |
| + | var chains = []; self.touched = []; |
| + | forEach(lines, function(line) { |
| + | // Note that this makes the loop skip line objects that have |
| + | // been pulled into chains by lines before them. |
| + | if (!temp(line.from)) return; |
| + | |
| + | var chain = [], curNode = line.from, safe = true; |
| + | // Put any line objects (referred to by temp info) before this |
| + | // one on the front of the array. |
| + | while (true) { |
| + | var curLine = temp(curNode); |
| + | if (!curLine) { |
| + | if (safe) break; |
| + | else curLine = buildLine(curNode); |
| + | } |
| + | chain.unshift(curLine); |
| + | setTemp(curNode, null); |
| + | if (!curNode) break; |
| + | safe = self.after(curNode); |
| + | curNode = nextBR(curNode, "previous"); |
| + | } |
| + | curNode = line.to; safe = self.before(line.from); |
| + | // Add lines after this one at end of array. |
| + | while (true) { |
| + | if (!curNode) break; |
| + | var curLine = temp(curNode); |
| + | if (!curLine) { |
| + | if (safe) break; |
| + | else curLine = buildLine(curNode); |
| + | } |
| + | chain.push(curLine); |
| + | setTemp(curNode, null); |
| + | safe = self.before(curNode); |
| + | curNode = nextBR(curNode, "next"); |
| + | } |
| + | chains.push(chain); |
| + | }); |
| + | |
| + | return chains; |
| + | }, |
| + | |
| + | // Find the 'shadow' of a given chain by following the links in the |
| + | // DOM nodes at its start and end. |
| + | shadowChain: function(chain) { |
| + | var shadows = [], next = this.after(chain[0].from), end = chain[chain.length - 1].to; |
| + | while (true) { |
| + | shadows.push(next); |
| + | var nextNode = next.to; |
| + | if (!nextNode || nextNode == end) |
| + | break; |
| + | else |
| + | next = nextNode.historyAfter || this.before(end); |
| + | // (The this.before(end) is a hack -- FF sometimes removes |
| + | // properties from BR nodes, in which case the best we can hope |
| + | // for is to not break.) |
| + | } |
| + | return shadows; |
| + | }, |
| + | |
| + | // Update the DOM tree to contain the lines specified in a given |
| + | // chain, link this chain into the DOM nodes. |
| + | applyChain: function(chain) { |
| + | // Some attempt is made to prevent the cursor from jumping |
| + | // randomly when an undo or redo happens. It still behaves a bit |
| + | // strange sometimes. |
| + | var cursor = select.cursorPos(this.container, false), self = this; |
| + | |
| + | // Remove all nodes in the DOM tree between from and to (null for |
| + | // start/end of container). |
| + | function removeRange(from, to) { |
| + | var pos = from ? from.nextSibling : self.container.firstChild; |
| + | while (pos != to) { |
| + | var temp = pos.nextSibling; |
| + | removeElement(pos); |
| + | pos = temp; |
| + | } |
| + | } |
| + | |
| + | var start = chain[0].from, end = chain[chain.length - 1].to; |
| + | // Clear the space where this change has to be made. |
| + | removeRange(start, end); |
| + | |
| + | // Insert the content specified by the chain into the DOM tree. |
| + | for (var i = 0; i < chain.length; i++) { |
| + | var line = chain[i]; |
| + | // The start and end of the space are already correct, but BR |
| + | // tags inside it have to be put back. |
| + | if (i > 0) |
| + | self.container.insertBefore(line.from, end); |
| + | |
| + | // Add the text. |
| + | var node = makePartSpan(fixSpaces(line.text), this.container.ownerDocument); |
| + | self.container.insertBefore(node, end); |
| + | // See if the cursor was on this line. Put it back, adjusting |
| + | // for changed line length, if it was. |
| + | if (cursor && cursor.node == line.from) { |
| + | var cursordiff = 0; |
| + | var prev = this.after(line.from); |
| + | if (prev && i == chain.length - 1) { |
| + | // Only adjust if the cursor is after the unchanged part of |
| + | // the line. |
| + | for (var match = 0; match < cursor.offset && |
| + | line.text.charAt(match) == prev.text.charAt(match); match++); |
| + | if (cursor.offset > match) |
| + | cursordiff = line.text.length - prev.text.length; |
| + | } |
| + | select.setCursorPos(this.container, {node: line.from, offset: Math.max(0, cursor.offset + cursordiff)}); |
| + | } |
| + | // Cursor was in removed line, this is last new line. |
| + | else if (cursor && (i == chain.length - 1) && cursor.node && cursor.node.parentNode != this.container) { |
| + | select.setCursorPos(this.container, {node: line.from, offset: line.text.length}); |
| + | } |
| + | } |
| + | |
| + | // Anchor the chain in the DOM tree. |
| + | this.linkChain(chain); |
| + | return start; |
| + | } |
| + | }; |
public/javascripts/cms/3rdparty/codemirror/util.js
+130
-0
| @@ | @@ -0,0 +1,130 @@ |
| + | /* A few useful utility functions. */ |
| + | |
| + | // Capture a method on an object. |
| + | function method(obj, name) { |
| + | return function() {obj[name].apply(obj, arguments);}; |
| + | } |
| + | |
| + | // The value used to signal the end of a sequence in iterators. |
| + | var StopIteration = {toString: function() {return "StopIteration"}}; |
| + | |
| + | // Apply a function to each element in a sequence. |
| + | function forEach(iter, f) { |
| + | if (iter.next) { |
| + | try {while (true) f(iter.next());} |
| + | catch (e) {if (e != StopIteration) throw e;} |
| + | } |
| + | else { |
| + | for (var i = 0; i < iter.length; i++) |
| + | f(iter[i]); |
| + | } |
| + | } |
| + | |
| + | // Map a function over a sequence, producing an array of results. |
| + | function map(iter, f) { |
| + | var accum = []; |
| + | forEach(iter, function(val) {accum.push(f(val));}); |
| + | return accum; |
| + | } |
| + | |
| + | // Create a predicate function that tests a string againsts a given |
| + | // regular expression. No longer used but might be used by 3rd party |
| + | // parsers. |
| + | function matcher(regexp){ |
| + | return function(value){return regexp.test(value);}; |
| + | } |
| + | |
| + | // Test whether a DOM node has a certain CSS class. Much faster than |
| + | // the MochiKit equivalent, for some reason. |
| + | function hasClass(element, className){ |
| + | var classes = element.className; |
| + | return classes && new RegExp("(^| )" + className + "($| )").test(classes); |
| + | } |
| + | |
| + | // Insert a DOM node after another node. |
| + | function insertAfter(newNode, oldNode) { |
| + | var parent = oldNode.parentNode; |
| + | parent.insertBefore(newNode, oldNode.nextSibling); |
| + | return newNode; |
| + | } |
| + | |
| + | function removeElement(node) { |
| + | if (node.parentNode) |
| + | node.parentNode.removeChild(node); |
| + | } |
| + | |
| + | function clearElement(node) { |
| + | while (node.firstChild) |
| + | node.removeChild(node.firstChild); |
| + | } |
| + | |
| + | // Check whether a node is contained in another one. |
| + | function isAncestor(node, child) { |
| + | while (child = child.parentNode) { |
| + | if (node == child) |
| + | return true; |
| + | } |
| + | return false; |
| + | } |
| + | |
| + | // The non-breaking space character. |
| + | var nbsp = "\u00a0"; |
| + | var matching = {"{": "}", "[": "]", "(": ")", |
| + | "}": "{", "]": "[", ")": "("}; |
| + | |
| + | // Standardize a few unportable event properties. |
| + | function normalizeEvent(event) { |
| + | if (!event.stopPropagation) { |
| + | event.stopPropagation = function() {this.cancelBubble = true;}; |
| + | event.preventDefault = function() {this.returnValue = false;}; |
| + | } |
| + | if (!event.stop) { |
| + | event.stop = function() { |
| + | this.stopPropagation(); |
| + | this.preventDefault(); |
| + | }; |
| + | } |
| + | |
| + | if (event.type == "keypress") { |
| + | event.code = (event.charCode == null) ? event.keyCode : event.charCode; |
| + | event.character = String.fromCharCode(event.code); |
| + | } |
| + | return event; |
| + | } |
| + | |
| + | // Portably register event handlers. |
| + | function addEventHandler(node, type, handler, removeFunc) { |
| + | function wrapHandler(event) { |
| + | handler(normalizeEvent(event || window.event)); |
| + | } |
| + | if (typeof node.addEventListener == "function") { |
| + | node.addEventListener(type, wrapHandler, false); |
| + | if (removeFunc) return function() {node.removeEventListener(type, wrapHandler, false);}; |
| + | } |
| + | else { |
| + | node.attachEvent("on" + type, wrapHandler); |
| + | if (removeFunc) return function() {node.detachEvent("on" + type, wrapHandler);}; |
| + | } |
| + | } |
| + | |
| + | function nodeText(node) { |
| + | return node.textContent || node.innerText || node.nodeValue || ""; |
| + | } |
| + | |
| + | function nodeTop(node) { |
| + | var top = 0; |
| + | while (node.offsetParent) { |
| + | top += node.offsetTop; |
| + | node = node.offsetParent; |
| + | } |
| + | return top; |
| + | } |
| + | |
| + | function isBR(node) { |
| + | var nn = node.nodeName; |
| + | return nn == "BR" || nn == "br"; |
| + | } |
| + | function isSpan(node) { |
| + | var nn = node.nodeName; |
| + | return nn == "SPAN" || nn == "span"; |
| + | } |
public/javascripts/cms/3rdparty/plupload/plupload.full.min.js
+1
-0
| @@ | @@ -0,0 +1 @@ |
| + | (function(){var c=0,h=[],j={},f={},a={"<":"lt",">":"gt","&":"amp",'"':"quot","'":"#39"},i=/[<>&\"\']/g,b;function e(){this.returnValue=false}function g(){this.cancelBubble=true}(function(k){var l=k.split(/,/),m,o,n;for(m=0;m<l.length;m+=2){n=l[m+1].split(/ /);for(o=0;o<n.length;o++){f[n[o]]=l[m]}}})("application/msword,doc dot,application/pdf,pdf,application/pgp-signature,pgp,application/postscript,ps ai eps,application/rtf,rtf,application/vnd.ms-excel,xls xlb,application/vnd.ms-powerpoint,ppt pps pot,application/zip,zip,application/x-shockwave-flash,swf swfl,application/vnd.openxmlformats,docx pptx xlsx,audio/mpeg,mpga mpega mp2 mp3,audio/x-wav,wav,image/bmp,bmp,image/gif,gif,image/jpeg,jpeg jpg jpe,image/png,png,image/svg+xml,svg svgz,image/tiff,tiff tif,text/html,htm html xhtml,text/rtf,rtf,video/mpeg,mpeg mpg mpe,video/quicktime,qt mov,video/x-flv,flv,video/vnd.rn-realvideo,rv,text/plain,asc txt text diff log,application/octet-stream,exe");var d={STOPPED:1,STARTED:2,QUEUED:1,UPLOADING:2,FAILED:4,DONE:5,GENERIC_ERROR:-100,HTTP_ERROR:-200,IO_ERROR:-300,SECURITY_ERROR:-400,INIT_ERROR:-500,FILE_SIZE_ERROR:-600,FILE_EXTENSION_ERROR:-700,mimeTypes:f,extend:function(k){d.each(arguments,function(l,m){if(m>0){d.each(l,function(o,n){k[n]=o})}});return k},cleanName:function(k){var l,m;m=[/[\300-\306]/g,"A",/[\340-\346]/g,"a",/\307/g,"C",/\347/g,"c",/[\310-\313]/g,"E",/[\350-\353]/g,"e",/[\314-\317]/g,"I",/[\354-\357]/g,"i",/\321/g,"N",/\361/g,"n",/[\322-\330]/g,"O",/[\362-\370]/g,"o",/[\331-\334]/g,"U",/[\371-\374]/g,"u"];for(l=0;l<m.length;l+=2){k=k.replace(m[l],m[l+1])}k=k.replace(/\s+/g,"_");k=k.replace(/[^a-z0-9_\-\.]+/gi,"");return k},addRuntime:function(k,l){l.name=k;h[k]=l;h.push(l);return l},guid:function(){var k=new Date().getTime().toString(32),l;for(l=0;l<5;l++){k+=Math.floor(Math.random()*65535).toString(32)}return(d.guidPrefix||"p")+k+(c++).toString(32)},buildUrl:function(l,k){var m="";d.each(k,function(o,n){m+=(m?"&":"")+encodeURIComponent(n)+"="+encodeURIComponent(o)});if(m){l+=(l.indexOf("?")>0?"&":"?")+m}return l},each:function(n,o){var m,l,k;if(n){m=n.length;if(m===b){for(l in n){if(n.hasOwnProperty(l)){if(o(n[l],l)===false){return}}}}else{for(k=0;k<m;k++){if(o(n[k],k)===false){return}}}}},formatSize:function(k){if(k===b){return d.translate("N/A")}if(k>1048576){return Math.round(k/1048576,1)+" MB"}if(k>1024){return Math.round(k/1024,1)+" KB"}return k+" b"},getPos:function(l,p){var q=0,o=0,s,r=document,m,n;l=l;p=p||r.body;function k(w){var u,v,t=0,z=0;if(w){v=w.getBoundingClientRect();u=r.compatMode==="CSS1Compat"?r.documentElement:r.body;t=v.left+u.scrollLeft;z=v.top+u.scrollTop}return{x:t,y:z}}if(l.getBoundingClientRect&&(navigator.userAgent.indexOf("MSIE")>0&&r.documentMode!==8)){m=k(l);n=k(p);return{x:m.x-n.x,y:m.y-n.y}}s=l;while(s&&s!=p&&s.nodeType){q+=s.offsetLeft||0;o+=s.offsetTop||0;s=s.offsetParent}s=l.parentNode;while(s&&s!=p&&s.nodeType){q-=s.scrollLeft||0;o-=s.scrollTop||0;s=s.parentNode}return{x:q,y:o}},getSize:function(k){return{w:k.clientWidth||k.offsetWidth,h:k.clientHeight||k.offsetHeight}},parseSize:function(k){var l;if(typeof(k)=="string"){k=/^([0-9]+)([mgk]+)$/.exec(k.toLowerCase().replace(/[^0-9mkg]/g,""));l=k[2];k=+k[1];if(l=="g"){k*=1073741824}if(l=="m"){k*=1048576}if(l=="k"){k*=1024}}return k},xmlEncode:function(k){return k?(""+k).replace(i,function(l){return a[l]?"&"+a[l]+";":l}):k},toArray:function(m){var l,k=[];for(l=0;l<m.length;l++){k[l]=m[l]}return k},addI18n:function(k){return d.extend(j,k)},translate:function(k){return j[k]||k},addEvent:function(l,k,m){if(l.attachEvent){l.attachEvent("on"+k,function(){var n=window.event;if(!n.target){n.target=n.srcElement}n.preventDefault=e;n.stopPropagation=g;m(n)})}else{if(l.addEventListener){l.addEventListener(k,m,false)}}}};d.Uploader=function(n){var l={},q,p=[],r,m;q=new d.QueueProgress();n=d.extend({chunk_size:0,max_file_size:"1gb",multi_selection:true,file_data_name:"file",filters:[]},n);function o(){var s;if(this.state==d.STARTED&&r<p.length){s=p[r++];if(s.status==d.QUEUED){this.trigger("UploadFile",s)}else{o.call(this)}}else{this.stop()}}function k(){var t,s;q.reset();for(t=0;t<p.length;t++){s=p[t];if(s.size!==b){q.size+=s.size;q.loaded+=s.loaded}else{q.size=b}if(s.status==d.DONE){q.uploaded++}else{if(s.status==d.FAILED){q.failed++}else{q.queued++}}}if(q.size===b){q.percent=p.length>0?Math.ceil(q.uploaded/p.length*100):0}else{q.bytesPerSec=Math.ceil(q.loaded/((+new Date()-m||1)/1000));q.percent=q.size>0?Math.ceil(q.loaded/q.size*100):0}}d.extend(this,{state:d.STOPPED,features:{},files:p,settings:n,total:q,id:d.guid(),init:function(){var x=this,y,u,t,w=0,v;n.page_url=n.page_url||document.location.pathname.replace(/\/[^\/]+$/g,"/");if(!/^(\w+:\/\/|\/)/.test(n.url)){n.url=n.page_url+n.url}n.chunk_size=d.parseSize(n.chunk_size);n.max_file_size=d.parseSize(n.max_file_size);x.bind("FilesAdded",function(z,C){var B,A,F=0,E,D=n.filters;if(D&&D.length){E={};d.each(D,function(G){d.each(G.extensions.split(/,/),function(H){E[H.toLowerCase()]=true})})}for(B=0;B<C.length;B++){A=C[B];A.loaded=0;A.percent=0;A.status=d.QUEUED;if(E&&!E[A.name.toLowerCase().split(".").slice(-1)]){z.trigger("Error",{code:d.FILE_EXTENSION_ERROR,message:"File extension error.",file:A});continue}if(A.size!==b&&A.size>n.max_file_size){z.trigger("Error",{code:d.FILE_SIZE_ERROR,message:"File size error.",file:A});continue}p.push(A);F++}if(F){x.trigger("QueueChanged");x.refresh()}});if(n.unique_names){x.bind("UploadFile",function(z,A){A.target_name=A.id+".tmp"})}x.bind("UploadProgress",function(z,A){if(A.status==d.QUEUED){A.status=d.UPLOADING}A.percent=A.size>0?Math.ceil(A.loaded/A.size*100):100;k()});x.bind("StateChanged",function(z){if(z.state==d.STARTED){m=(+new Date())}});x.bind("QueueChanged",k);x.bind("Error",function(z,A){if(A.file){A.file.status=d.FAILED;k();window.setTimeout(function(){o.call(x)})}});x.bind("FileUploaded",function(z,A){A.status=d.DONE;z.trigger("UploadProgress",A);o.call(x)});if(n.runtimes){u=[];v=n.runtimes.split(/\s?,\s?/);for(y=0;y<v.length;y++){if(h[v[y]]){u.push(h[v[y]])}}}else{u=h}function s(){var C=u[w++],B,z,A;if(C){B=C.getFeatures();z=x.settings.required_features;if(z){z=z.split(",");for(A=0;A<z.length;A++){if(!B[z[A]]){s();return}}}C.init(x,function(D){if(D&&D.success){x.features=B;x.trigger("Init",{runtime:C.name});x.trigger("PostInit");x.refresh()}else{s()}})}else{x.trigger("Error",{code:d.INIT_ERROR,message:"Init error."})}}s()},refresh:function(){this.trigger("Refresh")},start:function(){if(this.state!=d.STARTED){r=0;this.state=d.STARTED;this.trigger("StateChanged");o.call(this)}},stop:function(){if(this.state!=d.STOPPED){this.state=d.STOPPED;this.trigger("StateChanged")}},getFile:function(t){var s;for(s=p.length-1;s>=0;s--){if(p[s].id===t){return p[s]}}},removeFile:function(t){var s;for(s=p.length-1;s>=0;s--){if(p[s].id===t.id){return this.splice(s,1)[0]}}},splice:function(u,s){var t;t=p.splice(u,s);this.trigger("FilesRemoved",t);this.trigger("QueueChanged");return t},trigger:function(t){var v=l[t.toLowerCase()],u,s;if(v){s=Array.prototype.slice.call(arguments);s[0]=this;for(u=0;u<v.length;u++){if(v[u].func.apply(v[u].scope,s)===false){return false}}}return true},bind:function(s,u,t){var v;s=s.toLowerCase();v=l[s]||[];v.push({func:u,scope:t||this});l[s]=v},unbind:function(s,u){var v=l[s.toLowerCase()],t;if(v){for(t=v.length-1;t>=0;t--){if(v[t].func===u){v.splice(t,1)}}}}})};d.File=function(n,l,m){var k=this;k.id=n;k.name=l;k.size=m;k.loaded=0;k.percent=0;k.status=0};d.Runtime=function(){this.getFeatures=function(){};this.init=function(k,l){}};d.QueueProgress=function(){var k=this;k.size=0;k.loaded=0;k.uploaded=0;k.failed=0;k.queued=0;k.percent=0;k.bytesPerSec=0;k.reset=function(){k.size=k.loaded=k.uploaded=k.failed=k.queued=k.percent=k.bytesPerSec=0}};d.runtimes={};window.plupload=d})();(function(b){var c={};function a(i,e,k,j,d){var l,g,f,h;g=google.gears.factory.create("beta.canvas");g.decode(i);h=Math.min(e/g.width,k/g.height);if(h<1){e=Math.round(g.width*h);k=Math.round(g.height*h)}else{e=g.width;k=g.height}g.resize(e,k);return g.encode(d,{quality:j/100})}b.runtimes.Gears=b.addRuntime("gears",{getFeatures:function(){return{dragdrop:true,jpgresize:true,pngresize:true,chunks:true,progress:true,multipart:true}},init:function(g,i){var h;if(!window.google||!google.gears){return i({success:false})}try{h=google.gears.factory.create("beta.desktop")}catch(f){return i({success:false})}function d(k){var j,e,l=[],m;for(e=0;e<k.length;e++){j=k[e];m=b.guid();c[m]=j.blob;l.push(new b.File(m,j.name,j.blob.length))}g.trigger("FilesAdded",l)}g.bind("PostInit",function(){var j=g.settings,e=document.getElementById(j.drop_element);if(e){b.addEvent(e,"dragover",function(k){h.setDropEffect(k,"copy");k.preventDefault()});b.addEvent(e,"drop",function(l){var k=h.getDragData(l,"application/x-gears-files");if(k){d(k.files)}l.preventDefault()});e=0}b.addEvent(document.getElementById(j.browse_button),"click",function(o){var n=[],l,k,m;o.preventDefault();for(l=0;l<j.filters.length;l++){m=j.filters[l].extensions.split(",");for(k=0;k<m.length;k++){n.push("."+m[k])}}h.openFiles(d,{singleFile:!j.multi_selection,filter:n})})});g.bind("UploadFile",function(o,l){var q=0,p,m,n=0,k=o.settings.resize,e;m=o.settings.chunk_size;e=m>0;p=Math.ceil(l.size/m);if(!e){m=l.size;p=1}if(k&&/\.(png|jpg|jpeg)$/i.test(l.name)){c[l.id]=a(c[l.id],k.width,k.height,k.quality||90,/\.png$/i.test(l.name)?"image/png":"image/jpeg")}l.size=c[l.id].length;function j(){var u,w,s=o.settings.multipart,r=0,v={name:l.target_name||l.name};function t(y){var x,C="----pluploadboundary"+b.guid(),A="--",B="\r\n",z;if(s){u.setRequestHeader("Content-Type","multipart/form-data; boundary="+C);x=google.gears.factory.create("beta.blobbuilder");b.each(o.settings.multipart_params,function(E,D){x.append(A+C+B+'Content-Disposition: form-data; name="'+D+'"'+B+B);x.append(E+B)});x.append(A+C+B+'Content-Disposition: form-data; name="'+o.settings.file_data_name+'"; filename="'+l.name+'"'+B+"Content-Type: application/octet-stream"+B+B);x.append(y);x.append(B+A+C+A+B);z=x.getAsBlob();r=z.length-y.length;y=z}u.send(y)}if(l.status==b.DONE||l.status==b.FAILED||o.state==b.STOPPED){return}if(e){v.chunk=q;v.chunks=p}w=Math.min(m,l.size-(q*m));u=google.gears.factory.create("beta.httprequest");u.open("POST",b.buildUrl(o.settings.url,v));if(!s){u.setRequestHeader("Content-Disposition",'attachment; filename="'+l.name+'"');u.setRequestHeader("Content-Type","application/octet-stream")}b.each(o.settings.headers,function(y,x){u.setRequestHeader(x,y)});u.upload.onprogress=function(x){l.loaded=n+x.loaded-r;o.trigger("UploadProgress",l)};u.onreadystatechange=function(){var x;if(u.readyState==4){if(u.status==200){x={chunk:q,chunks:p,response:u.responseText,status:u.status};o.trigger("ChunkUploaded",l,x);if(x.cancelled){l.status=b.FAILED;return}n+=w;if(++q>=p){l.status=b.DONE;o.trigger("FileUploaded",l,{response:u.responseText,status:u.status})}else{j()}}else{o.trigger("Error",{code:b.HTTP_ERROR,message:"HTTP Error.",file:l,chunk:q,chunks:p,status:u.status})}}};if(q<p){t(c[l.id].slice(q*m,w))}}j()});i({success:true})}})})(plupload);(function(c){var a={};function b(l){var k,j=typeof l,h,e,g,f;if(j==="string"){k="\bb\tt\nn\ff\rr\"\"''\\\\";return'"'+l.replace(/([\u0080-\uFFFF\x00-\x1f\"])/g,function(n,m){var i=k.indexOf(m);if(i+1){return"\\"+k.charAt(i+1)}n=m.charCodeAt().toString(16);return"\\u"+"0000".substring(n.length)+n})+'"'}if(j=="object"){e=l.length!==h;k="";if(e){for(g=0;g<l.length;g++){if(k){k+=","}k+=b(l[g])}k="["+k+"]"}else{for(f in l){if(l.hasOwnProperty(f)){if(k){k+=","}k+=b(f)+":"+b(l[f])}}k="{"+k+"}"}return k}if(l===h){return"null"}return""+l}function d(o){var r=false,f=null,k=null,g,h,i,q,j,m=0;try{try{k=new ActiveXObject("AgControl.AgControl");if(k.IsVersionSupported(o)){r=true}k=null}catch(n){var l=navigator.plugins["Silverlight Plug-In"];if(l){g=l.description;if(g==="1.0.30226.2"){g="2.0.30226.2"}h=g.split(".");while(h.length>3){h.pop()}while(h.length<4){h.push(0)}i=o.split(".");while(i.length>4){i.pop()}do{q=parseInt(i[m],10);j=parseInt(h[m],10);m++}while(m<i.length&&q===j);if(q<=j&&!isNaN(q)){r=true}}}}catch(p){r=false}return r}c.silverlight={trigger:function(j,f){var h=a[j],g,e;if(h){e=c.toArray(arguments).slice(1);e[0]="Silverlight:"+f;setTimeout(function(){h.trigger.apply(h,e)},0)}}};c.runtimes.Silverlight=c.addRuntime("silverlight",{getFeatures:function(){return{jpgresize:true,pngresize:true,chunks:true,progress:true,multipart:true}},init:function(l,m){var k,h="",j=l.settings.filters,g,f=document.body;if(!d("2.0.31005.0")||(window.opera&&window.opera.buildNumber)){m({success:false});return}a[l.id]=l;k=document.createElement("div");k.id=l.id+"_silverlight_container";c.extend(k.style,{position:"absolute",top:"0px",background:l.settings.shim_bgcolor||"transparent",zIndex:99999,width:"100px",height:"100px",overflow:"hidden",opacity:l.settings.shim_bgcolor?"":0.01});k.className="plupload silverlight";if(l.settings.container){f=document.getElementById(l.settings.container);f.style.position="relative"}f.appendChild(k);for(g=0;g<j.length;g++){h+=(h!=""?"|":"")+j[g].title+" | *."+j[g].extensions.replace(/,/g,";*.")}k.innerHTML='<object id="'+l.id+'_silverlight" data="data:application/x-silverlight," type="application/x-silverlight-2" style="outline:none;" width="1024" height="1024"><param name="source" value="'+l.settings.silverlight_xap_url+'"/><param name="background" value="Transparent"/><param name="windowless" value="true"/><param name="initParams" value="id='+l.id+",filter="+h+'"/></object>';function e(){return document.getElementById(l.id+"_silverlight").content.Upload}l.bind("Silverlight:Init",function(){var i,n={};l.bind("Silverlight:StartSelectFiles",function(o){i=[]});l.bind("Silverlight:SelectFile",function(o,r,p,q){var s;s=c.guid();n[s]=r;n[r]=s;i.push(new c.File(s,p,q))});l.bind("Silverlight:SelectSuccessful",function(){if(i.length){l.trigger("FilesAdded",i)}});l.bind("Silverlight:UploadChunkError",function(o,r,p,s,q){l.trigger("Error",{code:c.IO_ERROR,message:"IO Error.",details:q,file:o.getFile(n[r])})});l.bind("Silverlight:UploadFileProgress",function(o,s,p,r){var q=o.getFile(n[s]);if(q.status!=c.FAILED){q.size=r;q.loaded=p;o.trigger("UploadProgress",q)}});l.bind("Refresh",function(o){var p,q,r;p=document.getElementById(o.settings.browse_button);q=c.getPos(p,document.getElementById(o.settings.container));r=c.getSize(p);c.extend(document.getElementById(o.id+"_silverlight_container").style,{top:q.y+"px",left:q.x+"px",width:r.w+"px",height:r.h+"px"})});l.bind("Silverlight:UploadChunkSuccessful",function(o,r,p,u,t){var s,q=o.getFile(n[r]);s={chunk:p,chunks:u,response:t};o.trigger("ChunkUploaded",q,s);if(q.status!=c.FAILED){e().UploadNextChunk()}if(p==u-1){q.status=c.DONE;o.trigger("FileUploaded",q,{response:t})}});l.bind("Silverlight:UploadSuccessful",function(o,r,p){var q=o.getFile(n[r]);q.status=c.DONE;o.trigger("FileUploaded",q,{response:p})});l.bind("FilesRemoved",function(o,q){var p;for(p=0;p<q.length;p++){e().RemoveFile(n[q[p].id])}});l.bind("UploadFile",function(o,q){var r=o.settings,p=r.resize||{};e().UploadFile(n[q.id],c.buildUrl(o.settings.url,{name:q.target_name||q.name}),b({chunk_size:r.chunk_size,image_width:p.width,image_height:p.height,image_quality:p.quality||90,multipart:!!r.multipart,multipart_params:r.multipart_params||{},headers:r.headers}))});m({success:true})})}})})(plupload);(function(c){var a={};function b(){var d;try{d=navigator.plugins["Shockwave Flash"];d=d.description}catch(f){try{d=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(e){d="0.0"}}d=d.match(/\d+/g);return parseFloat(d[0]+"."+d[1])}c.flash={trigger:function(f,d,e){setTimeout(function(){var j=a[f],h,g;if(j){j.trigger("Flash:"+d,e)}},0)}};c.runtimes.Flash=c.addRuntime("flash",{getFeatures:function(){return{jpgresize:true,pngresize:true,chunks:true,progress:true,multipart:true}},init:function(g,l){var k,f,h,e,m=0,d=document.body;if(b()<10){l({success:false});return}a[g.id]=g;k=document.getElementById(g.settings.browse_button);f=document.createElement("div");f.id=g.id+"_flash_container";c.extend(f.style,{position:"absolute",top:"0px",background:g.settings.shim_bgcolor||"transparent",zIndex:99999,width:"100%",height:"100%"});f.className="plupload flash";if(g.settings.container){d=document.getElementById(g.settings.container);d.style.position="relative"}d.appendChild(f);h="id="+escape(g.id);f.innerHTML='<object id="'+g.id+'_flash" width="100%" height="100%" style="outline:0" type="application/x-shockwave-flash" data="'+g.settings.flash_swf_url+'"><param name="movie" value="'+g.settings.flash_swf_url+'" /><param name="flashvars" value="'+h+'" /><param name="wmode" value="transparent" /><param name="allowscriptaccess" value="always" /></object>';function j(){return document.getElementById(g.id+"_flash")}function i(){if(m++>5000){l({success:false});return}if(!e){setTimeout(i,1)}}i();k=f=null;g.bind("Flash:Init",function(){var p={},o,n=g.settings.resize||{};e=true;j().setFileFilters(g.settings.filters,g.settings.multi_selection);g.bind("UploadFile",function(q,r){var s=q.settings;j().uploadFile(p[r.id],c.buildUrl(s.url,{name:r.target_name||r.name}),{chunk_size:s.chunk_size,width:n.width,height:n.height,quality:n.quality||90,multipart:s.multipart,multipart_params:s.multipart_params,file_data_name:s.file_data_name,format:/\.(jpg|jpeg)$/i.test(r.name)?"jpg":"png",headers:s.headers})});g.bind("Flash:UploadProcess",function(r,q){var s=r.getFile(p[q.id]);if(s.status!=c.FAILED){s.loaded=q.loaded;s.size=q.size;r.trigger("UploadProgress",s)}});g.bind("Flash:UploadChunkComplete",function(q,s){var t,r=q.getFile(p[s.id]);t={chunk:s.chunk,chunks:s.chunks,response:s.text};q.trigger("ChunkUploaded",r,t);if(r.status!=c.FAILED){j().uploadNextChunk()}if(s.chunk==s.chunks-1){r.status=c.DONE;q.trigger("FileUploaded",r,{response:s.text})}});g.bind("Flash:SelectFiles",function(q,t){var s,r,u=[],v;for(r=0;r<t.length;r++){s=t[r];v=c.guid();p[v]=s.id;p[s.id]=v;u.push(new c.File(v,s.name,s.size))}if(u.length){g.trigger("FilesAdded",u)}});g.bind("Flash:SecurityError",function(q,r){g.trigger("Error",{code:c.SECURITY_ERROR,message:"Security error.",details:r.message,file:g.getFile(p[r.id])})});g.bind("Flash:GenericError",function(q,r){g.trigger("Error",{code:c.GENERIC_ERROR,message:"Generic error.",details:r.message,file:g.getFile(p[r.id])})});g.bind("Flash:IOError",function(q,r){g.trigger("Error",{code:c.IO_ERROR,message:"IO error.",details:r.message,file:g.getFile(p[r.id])})});g.bind("QueueChanged",function(q){g.refresh()});g.bind("FilesRemoved",function(q,s){var r;for(r=0;r<s.length;r++){j().removeFile(p[s[r].id])}});g.bind("StateChanged",function(q){g.refresh()});g.bind("Refresh",function(q){var r,s,t;j().setFileFilters(g.settings.filters,g.settings.multi_selection);r=document.getElementById(q.settings.browse_button);s=c.getPos(r,document.getElementById(q.settings.container));t=c.getSize(r);c.extend(document.getElementById(q.id+"_flash_container").style,{top:s.y+"px",left:s.x+"px",width:t.w+"px",height:t.h+"px"})});l({success:true})})}})})(plupload);(function(a){a.runtimes.BrowserPlus=a.addRuntime("browserplus",{getFeatures:function(){return{dragdrop:true,jpgresize:true,pngresize:true,chunks:true,progress:true,multipart:true}},init:function(g,i){var e=window.BrowserPlus,h={},d=g.settings,c=d.resize;function f(n){var m,l,j=[],k,o;for(l=0;l<n.length;l++){k=n[l];o=a.guid();h[o]=k;j.push(new a.File(o,k.name,k.size))}if(l){g.trigger("FilesAdded",j)}}function b(){g.bind("PostInit",function(){var m,k=d.drop_element,o=g.id+"_droptarget",j=document.getElementById(k),l;function p(r,q){e.DragAndDrop.AddDropTarget({id:r},function(s){e.DragAndDrop.AttachCallbacks({id:r,hover:function(t){if(!t&&q){q()}},drop:function(t){if(q){q()}f(t)}},function(){})})}function n(){document.getElementById(o).style.top="-1000px"}if(j){if(document.attachEvent&&(/MSIE/gi).test(navigator.userAgent)){m=document.createElement("div");m.setAttribute("id",o);a.extend(m.style,{position:"absolute",top:"-1000px",background:"red",filter:"alpha(opacity=0)",opacity:0});document.body.appendChild(m);a.addEvent(j,"dragenter",function(r){var q,s;q=document.getElementById(k);s=a.getPos(q);a.extend(document.getElementById(o).style,{top:s.y+"px",left:s.x+"px",width:q.offsetWidth+"px",height:q.offsetHeight+"px"})});p(o,n)}else{p(k)}}a.addEvent(document.getElementById(d.browse_button),"click",function(v){var t=[],r,q,u=d.filters,s;v.preventDefault();for(r=0;r<u.length;r++){s=u[r].extensions.split(",");for(q=0;q<s.length;q++){t.push(a.mimeTypes[s[q]])}}e.FileBrowse.OpenBrowseDialog({mimeTypes:t},function(w){if(w.success){f(w.value)}})});j=m=null});g.bind("UploadFile",function(n,k){var m=h[k.id],j={},l=n.settings.chunk_size,o,p=[];function r(s,u){var t;if(k.status==a.FAILED){return}j.name=k.target_name||k.name;if(l){j.chunk=s;j.chunks=u}t=p.shift();e.Uploader.upload({url:a.buildUrl(n.settings.url,j),files:{file:t},cookies:document.cookies,postvars:n.settings.multipart_params,progressCallback:function(x){var w,v=0;o[s]=parseInt(x.filePercent*t.size/100,10);for(w=0;w<o.length;w++){v+=o[w]}k.loaded=v;n.trigger("UploadProgress",k)}},function(w){var v,x;if(w.success){v=w.value.statusCode;if(l){n.trigger("ChunkUploaded",k,{chunk:s,chunks:u,response:w.value.body,status:v})}if(p.length>0){r(++s,u)}else{k.status=a.DONE;n.trigger("FileUploaded",k,{response:w.value.body,status:v});if(v>=400){n.trigger("Error",{code:a.HTTP_ERROR,message:"HTTP Error.",file:k,status:v})}}}else{n.trigger("Error",{code:a.GENERIC_ERROR,message:"Generic Error.",file:k,details:w.error})}})}function q(s){k.size=s.size;if(l){e.FileAccess.chunk({file:s,chunkSize:l},function(v){if(v.success){var w=v.value,t=w.length;o=Array(t);for(var u=0;u<t;u++){o[u]=0;p.push(w[u])}r(0,t)}})}else{o=Array(1);p.push(s);r(0,1)}}if(c&&/\.(png|jpg|jpeg)$/i.test(k.name)){BrowserPlus.ImageAlter.transform({file:m,quality:c.quality||90,actions:[{scale:{maxwidth:c.width,maxheight:c.height}}]},function(s){if(s.success){q(s.value.file)}})}else{q(m)}});i({success:true})}if(e){e.init(function(k){var j=[{service:"Uploader",version:"3"},{service:"DragAndDrop",version:"1"},{service:"FileBrowse",version:"1"},{service:"FileAccess",version:"2"}];if(c){j.push({service:"ImageAlter",version:"4"})}if(k.success){e.require({services:j},function(l){if(l.success){b()}else{i()}})}else{i()}})}else{i()}}})})(plupload);(function(b){function a(i,l,j,c,k){var e,d,h,g,f;e=document.createElement("canvas");e.style.display="none";document.body.appendChild(e);d=e.getContext("2d");h=new Image();h.onload=function(){var o,m,n;f=Math.min(l/h.width,j/h.height);if(f<1){o=Math.round(h.width*f);m=Math.round(h.height*f)}else{o=h.width;m=h.height}e.width=o;e.height=m;d.drawImage(h,0,0,o,m);g=e.toDataURL(c);g=g.substring(g.indexOf("base64,")+7);g=atob(g);e.parentNode.removeChild(e);k({success:true,data:g})};h.src=i}b.runtimes.Html5=b.addRuntime("html5",{getFeatures:function(){var g,d,f,e,c;d=f=e=c=false;if(window.XMLHttpRequest){g=new XMLHttpRequest();f=!!g.upload;d=!!(g.sendAsBinary||g.upload)}if(d){e=!!(File&&File.prototype.getAsDataURL);c=!!(File&&File.prototype.slice)}return{html5:d,dragdrop:window.mozInnerScreenX!==undefined||c,jpgresize:e,pngresize:e,multipart:e,progress:f}},init:function(e,f){var c={};function d(k){var h,g,j=[],l;for(g=0;g<k.length;g++){h=k[g];l=b.guid();c[l]=h;j.push(new b.File(l,h.fileName,h.fileSize))}if(j.length){e.trigger("FilesAdded",j)}}if(!this.getFeatures().html5){f({success:false});return}e.bind("Init",function(l){var p,n=[],k,o,h=l.settings.filters,j,m,g=document.body;p=document.createElement("div");p.id=l.id+"_html5_container";for(k=0;k<h.length;k++){j=h[k].extensions.split(/,/);for(o=0;o<j.length;o++){m=b.mimeTypes[j[o]];if(m){n.push(m)}}}b.extend(p.style,{position:"absolute",background:e.settings.shim_bgcolor||"transparent",width:"100px",height:"100px",overflow:"hidden",zIndex:99999,opacity:e.settings.shim_bgcolor?"":0});p.className="plupload html5";if(e.settings.container){g=document.getElementById(e.settings.container);g.style.position="relative"}g.appendChild(p);p.innerHTML='<input id="'+e.id+'_html5" style="width:100%;" type="file" accept="'+n.join(",")+'" '+(e.settings.multi_selection?'multiple="multiple"':"")+" />";document.getElementById(e.id+"_html5").onchange=function(){d(this.files);this.value=""}});e.bind("PostInit",function(){var g=document.getElementById(e.settings.drop_element);if(g){b.addEvent(g,"dragover",function(h){h.preventDefault()});b.addEvent(g,"drop",function(i){var h=i.dataTransfer;if(h&&h.files){d(h.files)}i.preventDefault()})}});e.bind("Refresh",function(g){var h,i,j;h=document.getElementById(e.settings.browse_button);i=b.getPos(h,document.getElementById(g.settings.container));j=b.getSize(h);b.extend(document.getElementById(e.id+"_html5_container").style,{top:i.y+"px",left:i.x+"px",width:j.w+"px",height:j.h+"px"})});e.bind("UploadFile",function(g,j){var n=new XMLHttpRequest(),i=n.upload,h=g.settings.resize,m,l=0;function k(o){var s="----pluploadboundary"+b.guid(),q="--",r="\r\n",p="";if(g.settings.multipart){n.setRequestHeader("Content-Type","multipart/form-data; boundary="+s);b.each(g.settings.multipart_params,function(u,t){p+=q+s+r+'Content-Disposition: form-data; name="'+t+'"'+r+r;p+=u+r});p+=q+s+r+'Content-Disposition: form-data; name="'+g.settings.file_data_name+'"; filename="'+j.name+'"'+r+"Content-Type: application/octet-stream"+r+r+o+r+q+s+q+r;l=p.length-o.length;o=p}n.sendAsBinary(o)}if(j.status==b.DONE||j.status==b.FAILED||g.state==b.STOPPED){return}if(i){i.onprogress=function(o){j.loaded=o.loaded-l;g.trigger("UploadProgress",j)}}n.onreadystatechange=function(){var o;if(n.readyState==4){try{o=n.status}catch(p){o=0}j.status=b.DONE;j.loaded=j.size;g.trigger("UploadProgress",j);g.trigger("FileUploaded",j,{response:n.responseText,status:o});if(o>=400){g.trigger("Error",{code:b.HTTP_ERROR,message:"HTTP Error.",file:j,status:o})}}};n.open("post",b.buildUrl(g.settings.url,{name:j.target_name||j.name}),true);n.setRequestHeader("Content-Type","application/octet-stream");b.each(g.settings.headers,function(p,o){n.setRequestHeader(o,p)});m=c[j.id];if(n.sendAsBinary){if(h&&/\.(png|jpg|jpeg)$/i.test(j.name)){a(m.getAsDataURL(),h.width,h.height,/\.png$/i.test(j.name)?"image/png":"image/jpeg",function(o){if(o.success){j.size=o.data.length;k(o.data)}else{k(m.getAsBinary())}})}else{k(m.getAsBinary())}}else{n.send(m)}});f({success:true})}})})(plupload);(function(a){a.runtimes.Html4=a.addRuntime("html4",{getFeatures:function(){return{multipart:true}},init:function(f,g){var d={},c,b;function e(l){var k,j,m=[],n,h;h=l.value.replace(/\\/g,"/");h=h.substring(h.length,h.lastIndexOf("/")+1);n=a.guid();k=new a.File(n,h);d[n]=k;k.input=l;m.push(k);if(m.length){f.trigger("FilesAdded",m)}}f.bind("Init",function(p){var h,x,v,t=[],o,u,m=p.settings.filters,l,s,r=/MSIE/.test(navigator.userAgent),k="javascript",w,j=document.body,n;if(f.settings.container){j=document.getElementById(f.settings.container);j.style.position="relative"}c=(typeof p.settings.form=="string")?document.getElementById(p.settings.form):p.settings.form;if(!c){n=document.getElementById(f.settings.browse_button);for(;n;n=n.parentNode){if(n.nodeName=="FORM"){c=n}}}if(!c){c=document.createElement("form");c.style.display="inline";n=document.getElementById(f.settings.container);n.parentNode.insertBefore(c,n);c.appendChild(n)}c.setAttribute("method","post");c.setAttribute("enctype","multipart/form-data");a.each(p.settings.multipart_params,function(z,y){var i=document.createElement("input");a.extend(i,{type:"hidden",name:y,value:z});c.appendChild(i)});b=document.createElement("iframe");b.setAttribute("src",k+':""');b.setAttribute("name",p.id+"_iframe");b.setAttribute("id",p.id+"_iframe");b.style.display="none";a.addEvent(b,"load",function(B){var C=B.target,z=f.currentfile,A;try{A=C.contentWindow.document||C.contentDocument||window.frames[C.id].document}catch(y){p.trigger("Error",{code:a.SECURITY_ERROR,message:"Security error.",file:z});return}if(A.location.href=="about:blank"||!z){return}var i=A.documentElement.innerText||A.documentElement.textContent;if(i!=""){z.status=a.DONE;z.loaded=1025;z.percent=100;if(z.input){z.input.removeAttribute("name")}p.trigger("UploadProgress",z);p.trigger("FileUploaded",z,{response:i});if(c.tmpAction){c.setAttribute("action",c.tmpAction)}if(c.tmpTarget){c.setAttribute("target",c.tmpTarget)}}});c.appendChild(b);if(r){window.frames[b.id].name=b.name}x=document.createElement("div");x.id=p.id+"_iframe_container";for(o=0;o<m.length;o++){l=m[o].extensions.split(/,/);for(u=0;u<l.length;u++){s=a.mimeTypes[l[u]];if(s){t.push(s)}}}a.extend(x.style,{position:"absolute",background:"transparent",width:"100px",height:"100px",overflow:"hidden",zIndex:99999,opacity:0});w=f.settings.shim_bgcolor;if(w){a.extend(x.style,{background:w,opacity:1})}x.className="plupload_iframe";j.appendChild(x);function q(){v=document.createElement("input");v.setAttribute("type","file");v.setAttribute("accept",t.join(","));v.setAttribute("size",1);a.extend(v.style,{width:"100%",height:"100%",opacity:0});if(r){a.extend(v.style,{filter:"alpha(opacity=0)"})}a.addEvent(v,"change",function(i){var y=i.target;if(y.value){q();y.style.display="none";e(y)}});x.appendChild(v);return true}q()});f.bind("Refresh",function(h){var i,j,k;i=document.getElementById(f.settings.browse_button);j=a.getPos(i,document.getElementById(h.settings.container));k=a.getSize(i);a.extend(document.getElementById(f.id+"_iframe_container").style,{top:j.y+"px",left:j.x+"px",width:k.w+"px",height:k.h+"px"})});f.bind("UploadFile",function(h,i){if(i.status==a.DONE||i.status==a.FAILED||h.state==a.STOPPED){return}if(!i.input){i.status=a.ERROR;return}i.input.setAttribute("name",h.settings.file_data_name);c.tmpAction=c.getAttribute("action");c.setAttribute("action",a.buildUrl(h.settings.url,{name:i.target_name||i.name}));c.tmpTarget=c.getAttribute("target");c.setAttribute("target",b.name);this.currentfile=i;c.submit()});f.bind("FilesRemoved",function(h,k){var j,l;for(j=0;j<k.length;j++){l=k[j].input;if(l){l.parentNode.removeChild(l)}}});g({success:true})}})})(plupload); |
| \ No newline at end of file | |
public/javascripts/cms/3rdparty/plupload/plupload.html4.min.js
+1
-0
| @@ | @@ -0,0 +1 @@ |
| + | (function(a){a.runtimes.Html4=a.addRuntime("html4",{getFeatures:function(){return{multipart:true}},init:function(f,g){var d={},c,b;function e(l){var k,j,m=[],n,h;h=l.value.replace(/\\/g,"/");h=h.substring(h.length,h.lastIndexOf("/")+1);n=a.guid();k=new a.File(n,h);d[n]=k;k.input=l;m.push(k);if(m.length){f.trigger("FilesAdded",m)}}f.bind("Init",function(p){var h,x,v,t=[],o,u,m=p.settings.filters,l,s,r=/MSIE/.test(navigator.userAgent),k="javascript",w,j=document.body,n;if(f.settings.container){j=document.getElementById(f.settings.container);j.style.position="relative"}c=(typeof p.settings.form=="string")?document.getElementById(p.settings.form):p.settings.form;if(!c){n=document.getElementById(f.settings.browse_button);for(;n;n=n.parentNode){if(n.nodeName=="FORM"){c=n}}}if(!c){c=document.createElement("form");c.style.display="inline";n=document.getElementById(f.settings.container);n.parentNode.insertBefore(c,n);c.appendChild(n)}c.setAttribute("method","post");c.setAttribute("enctype","multipart/form-data");a.each(p.settings.multipart_params,function(z,y){var i=document.createElement("input");a.extend(i,{type:"hidden",name:y,value:z});c.appendChild(i)});b=document.createElement("iframe");b.setAttribute("src",k+':""');b.setAttribute("name",p.id+"_iframe");b.setAttribute("id",p.id+"_iframe");b.style.display="none";a.addEvent(b,"load",function(B){var C=B.target,z=f.currentfile,A;try{A=C.contentWindow.document||C.contentDocument||window.frames[C.id].document}catch(y){p.trigger("Error",{code:a.SECURITY_ERROR,message:"Security error.",file:z});return}if(A.location.href=="about:blank"||!z){return}var i=A.documentElement.innerText||A.documentElement.textContent;if(i!=""){z.status=a.DONE;z.loaded=1025;z.percent=100;if(z.input){z.input.removeAttribute("name")}p.trigger("UploadProgress",z);p.trigger("FileUploaded",z,{response:i});if(c.tmpAction){c.setAttribute("action",c.tmpAction)}if(c.tmpTarget){c.setAttribute("target",c.tmpTarget)}}});c.appendChild(b);if(r){window.frames[b.id].name=b.name}x=document.createElement("div");x.id=p.id+"_iframe_container";for(o=0;o<m.length;o++){l=m[o].extensions.split(/,/);for(u=0;u<l.length;u++){s=a.mimeTypes[l[u]];if(s){t.push(s)}}}a.extend(x.style,{position:"absolute",background:"transparent",width:"100px",height:"100px",overflow:"hidden",zIndex:99999,opacity:0});w=f.settings.shim_bgcolor;if(w){a.extend(x.style,{background:w,opacity:1})}x.className="plupload_iframe";j.appendChild(x);function q(){v=document.createElement("input");v.setAttribute("type","file");v.setAttribute("accept",t.join(","));v.setAttribute("size",1);a.extend(v.style,{width:"100%",height:"100%",opacity:0});if(r){a.extend(v.style,{filter:"alpha(opacity=0)"})}a.addEvent(v,"change",function(i){var y=i.target;if(y.value){q();y.style.display="none";e(y)}});x.appendChild(v);return true}q()});f.bind("Refresh",function(h){var i,j,k;i=document.getElementById(f.settings.browse_button);j=a.getPos(i,document.getElementById(h.settings.container));k=a.getSize(i);a.extend(document.getElementById(f.id+"_iframe_container").style,{top:j.y+"px",left:j.x+"px",width:k.w+"px",height:k.h+"px"})});f.bind("UploadFile",function(h,i){if(i.status==a.DONE||i.status==a.FAILED||h.state==a.STOPPED){return}if(!i.input){i.status=a.ERROR;return}i.input.setAttribute("name",h.settings.file_data_name);c.tmpAction=c.getAttribute("action");c.setAttribute("action",a.buildUrl(h.settings.url,{name:i.target_name||i.name}));c.tmpTarget=c.getAttribute("target");c.setAttribute("target",b.name);this.currentfile=i;c.submit()});f.bind("FilesRemoved",function(h,k){var j,l;for(j=0;j<k.length;j++){l=k[j].input;if(l){l.parentNode.removeChild(l)}}});g({success:true})}})})(plupload); |
| \ No newline at end of file | |
public/javascripts/cms/3rdparty/plupload/plupload.html5.min.js
+1
-0
| @@ | @@ -0,0 +1 @@ |
| + | (function(b){function a(i,l,j,c,k){var e,d,h,g,f;e=document.createElement("canvas");e.style.display="none";document.body.appendChild(e);d=e.getContext("2d");h=new Image();h.onload=function(){var o,m,n;f=Math.min(l/h.width,j/h.height);if(f<1){o=Math.round(h.width*f);m=Math.round(h.height*f)}else{o=h.width;m=h.height}e.width=o;e.height=m;d.drawImage(h,0,0,o,m);g=e.toDataURL(c);g=g.substring(g.indexOf("base64,")+7);g=atob(g);e.parentNode.removeChild(e);k({success:true,data:g})};h.src=i}b.runtimes.Html5=b.addRuntime("html5",{getFeatures:function(){var g,d,f,e,c;d=f=e=c=false;if(window.XMLHttpRequest){g=new XMLHttpRequest();f=!!g.upload;d=!!(g.sendAsBinary||g.upload)}if(d){e=!!(File&&File.prototype.getAsDataURL);c=!!(File&&File.prototype.slice)}return{html5:d,dragdrop:window.mozInnerScreenX!==undefined||c,jpgresize:e,pngresize:e,multipart:e,progress:f}},init:function(e,f){var c={};function d(k){var h,g,j=[],l;for(g=0;g<k.length;g++){h=k[g];l=b.guid();c[l]=h;j.push(new b.File(l,h.fileName,h.fileSize))}if(j.length){e.trigger("FilesAdded",j)}}if(!this.getFeatures().html5){f({success:false});return}e.bind("Init",function(l){var p,n=[],k,o,h=l.settings.filters,j,m,g=document.body;p=document.createElement("div");p.id=l.id+"_html5_container";for(k=0;k<h.length;k++){j=h[k].extensions.split(/,/);for(o=0;o<j.length;o++){m=b.mimeTypes[j[o]];if(m){n.push(m)}}}b.extend(p.style,{position:"absolute",background:e.settings.shim_bgcolor||"transparent",width:"100px",height:"100px",overflow:"hidden",zIndex:99999,opacity:e.settings.shim_bgcolor?"":0});p.className="plupload html5";if(e.settings.container){g=document.getElementById(e.settings.container);g.style.position="relative"}g.appendChild(p);p.innerHTML='<input id="'+e.id+'_html5" style="width:100%;" type="file" accept="'+n.join(",")+'" '+(e.settings.multi_selection?'multiple="multiple"':"")+" />";document.getElementById(e.id+"_html5").onchange=function(){d(this.files);this.value=""}});e.bind("PostInit",function(){var g=document.getElementById(e.settings.drop_element);if(g){b.addEvent(g,"dragover",function(h){h.preventDefault()});b.addEvent(g,"drop",function(i){var h=i.dataTransfer;if(h&&h.files){d(h.files)}i.preventDefault()})}});e.bind("Refresh",function(g){var h,i,j;h=document.getElementById(e.settings.browse_button);i=b.getPos(h,document.getElementById(g.settings.container));j=b.getSize(h);b.extend(document.getElementById(e.id+"_html5_container").style,{top:i.y+"px",left:i.x+"px",width:j.w+"px",height:j.h+"px"})});e.bind("UploadFile",function(g,j){var n=new XMLHttpRequest(),i=n.upload,h=g.settings.resize,m,l=0;function k(o){var s="----pluploadboundary"+b.guid(),q="--",r="\r\n",p="";if(g.settings.multipart){n.setRequestHeader("Content-Type","multipart/form-data; boundary="+s);b.each(g.settings.multipart_params,function(u,t){p+=q+s+r+'Content-Disposition: form-data; name="'+t+'"'+r+r;p+=u+r});p+=q+s+r+'Content-Disposition: form-data; name="'+g.settings.file_data_name+'"; filename="'+j.name+'"'+r+"Content-Type: application/octet-stream"+r+r+o+r+q+s+q+r;l=p.length-o.length;o=p}n.sendAsBinary(o)}if(j.status==b.DONE||j.status==b.FAILED||g.state==b.STOPPED){return}if(i){i.onprogress=function(o){j.loaded=o.loaded-l;g.trigger("UploadProgress",j)}}n.onreadystatechange=function(){var o;if(n.readyState==4){try{o=n.status}catch(p){o=0}j.status=b.DONE;j.loaded=j.size;g.trigger("UploadProgress",j);g.trigger("FileUploaded",j,{response:n.responseText,status:o});if(o>=400){g.trigger("Error",{code:b.HTTP_ERROR,message:"HTTP Error.",file:j,status:o})}}};n.open("post",b.buildUrl(g.settings.url,{name:j.target_name||j.name}),true);n.setRequestHeader("Content-Type","application/octet-stream");b.each(g.settings.headers,function(p,o){n.setRequestHeader(o,p)});m=c[j.id];if(n.sendAsBinary){if(h&&/\.(png|jpg|jpeg)$/i.test(j.name)){a(m.getAsDataURL(),h.width,h.height,/\.png$/i.test(j.name)?"image/png":"image/jpeg",function(o){if(o.success){j.size=o.data.length;k(o.data)}else{k(m.getAsBinary())}})}else{k(m.getAsBinary())}}else{n.send(m)}});f({success:true})}})})(plupload); |
| \ No newline at end of file | |
public/javascripts/cms/3rdparty/tiny_mce/jquery.tinymce.js
+1
-0
| @@ | @@ -0,0 +1 @@ |
| + | (function(b){var e,d,a=[],c=window;b.fn.tinymce=function(j){var p=this,g,k,h,m,i,l="",n="";if(!p.length){return p}if(!j){return tinyMCE.get(p[0].id)}function o(){var r=[],q=0;if(f){f();f=null}p.each(function(t,u){var s,w=u.id,v=j.oninit;if(!w){u.id=w=tinymce.DOM.uniqueId()}s=new tinymce.Editor(w,j);r.push(s);if(v){s.onInit.add(function(){var x,y=v;if(++q==r.length){if(tinymce.is(y,"string")){x=(y.indexOf(".")===-1)?null:tinymce.resolve(y.replace(/\.\w+$/,""));y=tinymce.resolve(y)}y.apply(x||tinymce,r)}})}});b.each(r,function(t,s){s.render()})}if(!c.tinymce&&!d&&(g=j.script_url)){d=1;h=g.substring(0,g.lastIndexOf("/"));if(/_(src|dev)\.js/g.test(g)){n="_src"}m=g.lastIndexOf("?");if(m!=-1){l=g.substring(m+1)}c.tinyMCEPreInit=c.tinyMCEPreInit||{base:h,suffix:n,query:l};if(g.indexOf("gzip")!=-1){i=j.language||"en";g=g+(/\?/.test(g)?"&":"?")+"js=true&core=true&suffix="+escape(n)+"&themes="+escape(j.theme)+"&plugins="+escape(j.plugins)+"&languages="+i;if(!c.tinyMCE_GZ){tinyMCE_GZ={start:function(){tinymce.suffix=n;function q(r){tinymce.ScriptLoader.markDone(tinyMCE.baseURI.toAbsolute(r))}q("langs/"+i+".js");q("themes/"+j.theme+"/editor_template"+n+".js");q("themes/"+j.theme+"/langs/"+i+".js");b.each(j.plugins.split(","),function(s,r){if(r){q("plugins/"+r+"/editor_plugin"+n+".js");q("plugins/"+r+"/langs/"+i+".js")}})},end:function(){}}}}b.ajax({type:"GET",url:g,dataType:"script",cache:true,success:function(){tinymce.dom.Event.domLoaded=1;d=2;if(j.script_loaded){j.script_loaded()}o();b.each(a,function(q,r){r()})}})}else{if(d===1){a.push(o)}else{o()}}return p};b.extend(b.expr[":"],{tinymce:function(g){return g.id&&!!tinyMCE.get(g.id)}});function f(){function i(l){if(l==="remove"){this.each(function(n,o){var m=h(o);if(m){m.remove()}})}this.find("span.mceEditor,div.mceEditor").each(function(n,o){var m=tinyMCE.get(o.id.replace(/_parent$/,""));if(m){m.remove()}})}function k(n){var m=this,l;if(n!==e){i.call(m);m.each(function(p,q){var o;if(o=tinyMCE.get(q.id)){o.setContent(n)}})}else{if(m.length>0){if(l=tinyMCE.get(m[0].id)){return l.getContent()}}}}function h(m){var l=null;(m)&&(m.id)&&(c.tinymce)&&(l=tinyMCE.get(m.id));return l}function g(l){return !!((l)&&(l.length)&&(c.tinymce)&&(l.is(":tinymce")))}var j={};b.each(["text","html","val"],function(n,l){var o=j[l]=b.fn[l],m=(l==="text");b.fn[l]=function(s){var p=this;if(!g(p)){return o.apply(p,arguments)}if(s!==e){k.call(p.filter(":tinymce"),s);o.apply(p.not(":tinymce"),arguments);return p}else{var r="";var q=arguments;(m?p:p.eq(0)).each(function(u,v){var t=h(v);r+=t?(m?t.getContent().replace(/<(?:"[^"]*"|'[^']*'|[^'">])*>/g,""):t.getContent()):o.apply(b(v),q)});return r}}});b.each(["append","prepend"],function(n,m){var o=j[m]=b.fn[m],l=(m==="prepend");b.fn[m]=function(q){var p=this;if(!g(p)){return o.apply(p,arguments)}if(q!==e){p.filter(":tinymce").each(function(s,t){var r=h(t);r&&r.setContent(l?q+r.getContent():r.getContent()+q)});o.apply(p.not(":tinymce"),arguments);return p}}});b.each(["remove","replaceWith","replaceAll","empty"],function(m,l){var n=j[l]=b.fn[l];b.fn[l]=function(){i.call(this,l);return n.apply(this,arguments)}});j.attr=b.fn.attr;b.fn.attr=function(n,q,o){var m=this;if((!n)||(n!=="value")||(!g(m))){return j.attr.call(m,n,q,o)}if(q!==e){k.call(m.filter(":tinymce"),q);j.attr.call(m.not(":tinymce"),n,q,o);return m}else{var p=m[0],l=h(p);return l?l.getContent():j.attr.call(b(p),n,q,o)}}}})(jQuery); |
| \ No newline at end of file | |
public/javascripts/cms/3rdparty/tiny_mce/langs/en.js
+170
-0
| @@ | @@ -0,0 +1,170 @@ |
| + | tinyMCE.addI18n({en:{ |
| + | common:{ |
| + | edit_confirm:"Do you want to use the WYSIWYG mode for this textarea?", |
| + | apply:"Apply", |
| + | insert:"Insert", |
| + | update:"Update", |
| + | cancel:"Cancel", |
| + | close:"Close", |
| + | browse:"Browse", |
| + | class_name:"Class", |
| + | not_set:"-- Not set --", |
| + | clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?", |
| + | clipboard_no_support:"Currently not supported by your browser, use keyboard shortcuts instead.", |
| + | popup_blocked:"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.", |
| + | invalid_data:"Error: Invalid values entered, these are marked in red.", |
| + | more_colors:"More colors" |
| + | }, |
| + | contextmenu:{ |
| + | align:"Alignment", |
| + | left:"Left", |
| + | center:"Center", |
| + | right:"Right", |
| + | full:"Full" |
| + | }, |
| + | insertdatetime:{ |
| + | date_fmt:"%Y-%m-%d", |
| + | time_fmt:"%H:%M:%S", |
| + | insertdate_desc:"Insert date", |
| + | inserttime_desc:"Insert time", |
| + | months_long:"January,February,March,April,May,June,July,August,September,October,November,December", |
| + | months_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", |
| + | day_long:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday", |
| + | day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun" |
| + | }, |
| + | print:{ |
| + | print_desc:"Print" |
| + | }, |
| + | preview:{ |
| + | preview_desc:"Preview" |
| + | }, |
| + | directionality:{ |
| + | ltr_desc:"Direction left to right", |
| + | rtl_desc:"Direction right to left" |
| + | }, |
| + | layer:{ |
| + | insertlayer_desc:"Insert new layer", |
| + | forward_desc:"Move forward", |
| + | backward_desc:"Move backward", |
| + | absolute_desc:"Toggle absolute positioning", |
| + | content:"New layer..." |
| + | }, |
| + | save:{ |
| + | save_desc:"Save", |
| + | cancel_desc:"Cancel all changes" |
| + | }, |
| + | nonbreaking:{ |
| + | nonbreaking_desc:"Insert non-breaking space character" |
| + | }, |
| + | iespell:{ |
| + | iespell_desc:"Run spell checking", |
| + | download:"ieSpell not detected. Do you want to install it now?" |
| + | }, |
| + | advhr:{ |
| + | advhr_desc:"Horizontal rule" |
| + | }, |
| + | emotions:{ |
| + | emotions_desc:"Emotions" |
| + | }, |
| + | searchreplace:{ |
| + | search_desc:"Find", |
| + | replace_desc:"Find/Replace" |
| + | }, |
| + | advimage:{ |
| + | image_desc:"Insert/edit image" |
| + | }, |
| + | advlink:{ |
| + | link_desc:"Insert/edit link" |
| + | }, |
| + | xhtmlxtras:{ |
| + | cite_desc:"Citation", |
| + | abbr_desc:"Abbreviation", |
| + | acronym_desc:"Acronym", |
| + | del_desc:"Deletion", |
| + | ins_desc:"Insertion", |
| + | attribs_desc:"Insert/Edit Attributes" |
| + | }, |
| + | style:{ |
| + | desc:"Edit CSS Style" |
| + | }, |
| + | paste:{ |
| + | paste_text_desc:"Paste as Plain Text", |
| + | paste_word_desc:"Paste from Word", |
| + | selectall_desc:"Select All", |
| + | plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.", |
| + | plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode." |
| + | }, |
| + | paste_dlg:{ |
| + | 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." |
| + | }, |
| + | table:{ |
| + | desc:"Inserts a new table", |
| + | row_before_desc:"Insert row before", |
| + | row_after_desc:"Insert row after", |
| + | delete_row_desc:"Delete row", |
| + | col_before_desc:"Insert column before", |
| + | col_after_desc:"Insert column after", |
| + | delete_col_desc:"Remove column", |
| + | split_cells_desc:"Split merged table cells", |
| + | merge_cells_desc:"Merge table cells", |
| + | row_desc:"Table row properties", |
| + | cell_desc:"Table cell properties", |
| + | props_desc:"Table properties", |
| + | paste_row_before_desc:"Paste table row before", |
| + | paste_row_after_desc:"Paste table row after", |
| + | cut_row_desc:"Cut table row", |
| + | copy_row_desc:"Copy table row", |
| + | del:"Delete table", |
| + | row:"Row", |
| + | col:"Column", |
| + | cell:"Cell" |
| + | }, |
| + | autosave:{ |
| + | unload_msg:"The changes you made will be lost if you navigate away from this page.", |
| + | restore_content:"Restore auto-saved content.", |
| + | warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?." |
| + | }, |
| + | fullscreen:{ |
| + | desc:"Toggle fullscreen mode" |
| + | }, |
| + | media:{ |
| + | desc:"Insert / edit embedded media", |
| + | edit:"Edit embedded media" |
| + | }, |
| + | fullpage:{ |
| + | desc:"Document properties" |
| + | }, |
| + | template:{ |
| + | desc:"Insert predefined template content" |
| + | }, |
| + | visualchars:{ |
| + | desc:"Visual control characters on/off." |
| + | }, |
| + | spellchecker:{ |
| + | desc:"Toggle spellchecker", |
| + | menu:"Spellchecker settings", |
| + | ignore_word:"Ignore word", |
| + | ignore_words:"Ignore all", |
| + | langs:"Languages", |
| + | wait:"Please wait...", |
| + | sug:"Suggestions", |
| + | no_sug:"No suggestions", |
| + | no_mpell:"No misspellings found." |
| + | }, |
| + | pagebreak:{ |
| + | desc:"Insert page break." |
| + | }, |
| + | advlist:{ |
| + | types:"Types", |
| + | def:"Default", |
| + | lower_alpha:"Lower alpha", |
| + | lower_greek:"Lower greek", |
| + | lower_roman:"Lower roman", |
| + | upper_alpha:"Upper alpha", |
| + | upper_roman:"Upper roman", |
| + | circle:"Circle", |
| + | disc:"Disc", |
| + | square:"Square" |
| + | }}}); |
| \ No newline at end of file | |
public/javascripts/cms/3rdparty/tiny_mce/license.txt
+504
-0
| @@ | @@ -0,0 +1,504 @@ |
| + | GNU LESSER GENERAL PUBLIC LICENSE |
| + | Version 2.1, February 1999 |
| + | |
| + | Copyright (C) 1991, 1999 Free Software Foundation, Inc. |
| + | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| + | Everyone is permitted to copy and distribute verbatim copies |
| + | of this license document, but changing it is not allowed. |
| + | |
| + | [This is the first released version of the Lesser GPL. It also counts |
| + | as the successor of the GNU Library Public License, version 2, hence |
| + | the version number 2.1.] |
| + | |
| + | Preamble |
| + | |
| + | The licenses for most software are designed to take away your |
| + | freedom to share and change it. By contrast, the GNU General Public |
| + | Licenses are intended to guarantee your freedom to share and change |
| + | free software--to make sure the software is free for all its users. |
| + | |
| + | This license, the Lesser General Public License, applies to some |
| + | specially designated software packages--typically libraries--of the |
| + | Free Software Foundation and other authors who decide to use it. You |
| + | can use it too, but we suggest you first think carefully about whether |
| + | this license or the ordinary General Public License is the better |
| + | strategy to use in any particular case, based on the explanations below. |
| + | |
| + | When we speak of free software, we are referring to freedom of use, |
| + | not price. Our General Public Licenses are designed to make sure that |
| + | you have the freedom to distribute copies of free software (and charge |
| + | for this service if you wish); that you receive source code or can get |
| + | it if you want it; that you can change the software and use pieces of |
| + | it in new free programs; and that you are informed that you can do |
| + | these things. |
| + | |
| + | To protect your rights, we need to make restrictions that forbid |
| + | distributors to deny you these rights or to ask you to surrender these |
| + | rights. These restrictions translate to certain responsibilities for |
| + | you if you distribute copies of the library or if you modify it. |
| + | |
| + | For example, if you distribute copies of the library, whether gratis |
| + | or for a fee, you must give the recipients all the rights that we gave |
| + | you. You must make sure that they, too, receive or can get the source |
| + | code. If you link other code with the library, you must provide |
| + | complete object files to the recipients, so that they can relink them |
| + | with the library after making changes to the library and recompiling |
| + | it. And you must show them these terms so they know their rights. |
| + | |
| + | We protect your rights with a two-step method: (1) we copyright the |
| + | library, and (2) we offer you this license, which gives you legal |
| + | permission to copy, distribute and/or modify the library. |
| + | |
| + | To protect each distributor, we want to make it very clear that |
| + | there is no warranty for the free library. Also, if the library is |
| + | modified by someone else and passed on, the recipients should know |
| + | that what they have is not the original version, so that the original |
| + | author's reputation will not be affected by problems that might be |
| + | introduced by others. |
| + | |
| + | Finally, software patents pose a constant threat to the existence of |
| + | any free program. We wish to make sure that a company cannot |
| + | effectively restrict the users of a free program by obtaining a |
| + | restrictive license from a patent holder. Therefore, we insist that |
| + | any patent license obtained for a version of the library must be |
| + | consistent with the full freedom of use specified in this license. |
| + | |
| + | Most GNU software, including some libraries, is covered by the |
| + | ordinary GNU General Public License. This license, the GNU Lesser |
| + | General Public License, applies to certain designated libraries, and |
| + | is quite different from the ordinary General Public License. We use |
| + | this license for certain libraries in order to permit linking those |
| + | libraries into non-free programs. |
| + | |
| + | When a program is linked with a library, whether statically or using |
| + | a shared library, the combination of the two is legally speaking a |
| + | combined work, a derivative of the original library. The ordinary |
| + | General Public License therefore permits such linking only if the |
| + | entire combination fits its criteria of freedom. The Lesser General |
| + | Public License permits more lax criteria for linking other code with |
| + | the library. |
| + | |
| + | We call this license the "Lesser" General Public License because it |
| + | does Less to protect the user's freedom than the ordinary General |
| + | Public License. It also provides other free software developers Less |
| + | of an advantage over competing non-free programs. These disadvantages |
| + | are the reason we use the ordinary General Public License for many |
| + | libraries. However, the Lesser license provides advantages in certain |
| + | special circumstances. |
| + | |
| + | For example, on rare occasions, there may be a special need to |
| + | encourage the widest possible use of a certain library, so that it becomes |
| + | a de-facto standard. To achieve this, non-free programs must be |
| + | allowed to use the library. A more frequent case is that a free |
| + | library does the same job as widely used non-free libraries. In this |
| + | case, there is little to gain by limiting the free library to free |
| + | software only, so we use the Lesser General Public License. |
| + | |
| + | In other cases, permission to use a particular library in non-free |
| + | programs enables a greater number of people to use a large body of |
| + | free software. For example, permission to use the GNU C Library in |
| + | non-free programs enables many more people to use the whole GNU |
| + | operating system, as well as its variant, the GNU/Linux operating |
| + | system. |
| + | |
| + | Although the Lesser General Public License is Less protective of the |
| + | users' freedom, it does ensure that the user of a program that is |
| + | linked with the Library has the freedom and the wherewithal to run |
| + | that program using a modified version of the Library. |
| + | |
| + | The precise terms and conditions for copying, distribution and |
| + | modification follow. Pay close attention to the difference between a |
| + | "work based on the library" and a "work that uses the library". The |
| + | former contains code derived from the library, whereas the latter must |
| + | be combined with the library in order to run. |
| + | |
| + | GNU LESSER GENERAL PUBLIC LICENSE |
| + | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
| + | |
| + | 0. This License Agreement applies to any software library or other |
| + | program which contains a notice placed by the copyright holder or |
| + | other authorized party saying it may be distributed under the terms of |
| + | this Lesser General Public License (also called "this License"). |
| + | Each licensee is addressed as "you". |
| + | |
| + | A "library" means a collection of software functions and/or data |
| + | prepared so as to be conveniently linked with application programs |
| + | (which use some of those functions and data) to form executables. |
| + | |
| + | The "Library", below, refers to any such software library or work |
| + | which has been distributed under these terms. A "work based on the |
| + | Library" means either the Library or any derivative work under |
| + | copyright law: that is to say, a work containing the Library or a |
| + | portion of it, either verbatim or with modifications and/or translated |
| + | straightforwardly into another language. (Hereinafter, translation is |
| + | included without limitation in the term "modification".) |
| + | |
| + | "Source code" for a work means the preferred form of the work for |
| + | making modifications to it. For a library, complete source code means |
| + | all the source code for all modules it contains, plus any associated |
| + | interface definition files, plus the scripts used to control compilation |
| + | and installation of the library. |
| + | |
| + | Activities other than copying, distribution and modification are not |
| + | covered by this License; they are outside its scope. The act of |
| + | running a program using the Library is not restricted, and output from |
| + | such a program is covered only if its contents constitute a work based |
| + | on the Library (independent of the use of the Library in a tool for |
| + | writing it). Whether that is true depends on what the Library does |
| + | and what the program that uses the Library does. |
| + | |
| + | 1. You may copy and distribute verbatim copies of the Library's |
| + | complete source code as you receive it, in any medium, provided that |
| + | you conspicuously and appropriately publish on each copy an |
| + | appropriate copyright notice and disclaimer of warranty; keep intact |
| + | all the notices that refer to this License and to the absence of any |
| + | warranty; and distribute a copy of this License along with the |
| + | Library. |
| + | |
| + | You may charge a fee for the physical act of transferring a copy, |
| + | and you may at your option offer warranty protection in exchange for a |
| + | fee. |
| + | |
| + | 2. You may modify your copy or copies of the Library or any portion |
| + | of it, thus forming a work based on the Library, and copy and |
| + | distribute such modifications or work under the terms of Section 1 |
| + | above, provided that you also meet all of these conditions: |
| + | |
| + | a) The modified work must itself be a software library. |
| + | |
| + | b) You must cause the files modified to carry prominent notices |
| + | stating that you changed the files and the date of any change. |
| + | |
| + | c) You must cause the whole of the work to be licensed at no |
| + | charge to all third parties under the terms of this License. |
| + | |
| + | d) If a facility in the modified Library refers to a function or a |
| + | table of data to be supplied by an application program that uses |
| + | the facility, other than as an argument passed when the facility |
| + | is invoked, then you must make a good faith effort to ensure that, |
| + | in the event an application does not supply such function or |
| + | table, the facility still operates, and performs whatever part of |
| + | its purpose remains meaningful. |
| + | |
| + | (For example, a function in a library to compute square roots has |
| + | a purpose that is entirely well-defined independent of the |
| + | application. Therefore, Subsection 2d requires that any |
| + | application-supplied function or table used by this function must |
| + | be optional: if the application does not supply it, the square |
| + | root function must still compute square roots.) |
| + | |
| + | These requirements apply to the modified work as a whole. If |
| + | identifiable sections of that work are not derived from the Library, |
| + | and can be reasonably considered independent and separate works in |
| + | themselves, then this License, and its terms, do not apply to those |
| + | sections when you distribute them as separate works. But when you |
| + | distribute the same sections as part of a whole which is a work based |
| + | on the Library, the distribution of the whole must be on the terms of |
| + | this License, whose permissions for other licensees extend to the |
| + | entire whole, and thus to each and every part regardless of who wrote |
| + | it. |
| + | |
| + | Thus, it is not the intent of this section to claim rights or contest |
| + | your rights to work written entirely by you; rather, the intent is to |
| + | exercise the right to control the distribution of derivative or |
| + | collective works based on the Library. |
| + | |
| + | In addition, mere aggregation of another work not based on the Library |
| + | with the Library (or with a work based on the Library) on a volume of |
| + | a storage or distribution medium does not bring the other work under |
| + | the scope of this License. |
| + | |
| + | 3. You may opt to apply the terms of the ordinary GNU General Public |
| + | License instead of this License to a given copy of the Library. To do |
| + | this, you must alter all the notices that refer to this License, so |
| + | that they refer to the ordinary GNU General Public License, version 2, |
| + | instead of to this License. (If a newer version than version 2 of the |
| + | ordinary GNU General Public License has appeared, then you can specify |
| + | that version instead if you wish.) Do not make any other change in |
| + | these notices. |
| + | |
| + | Once this change is made in a given copy, it is irreversible for |
| + | that copy, so the ordinary GNU General Public License applies to all |
| + | subsequent copies and derivative works made from that copy. |
| + | |
| + | This option is useful when you wish to copy part of the code of |
| + | the Library into a program that is not a library. |
| + | |
| + | 4. You may copy and distribute the Library (or a portion or |
| + | derivative of it, under Section 2) in object code or executable form |
| + | under the terms of Sections 1 and 2 above provided that you accompany |
| + | it with the complete corresponding machine-readable source code, which |
| + | must be distributed under the terms of Sections 1 and 2 above on a |
| + | medium customarily used for software interchange. |
| + | |
| + | If distribution of object code is made by offering access to copy |
| + | from a designated place, then offering equivalent access to copy the |
| + | source code from the same place satisfies the requirement to |
| + | distribute the source code, even though third parties are not |
| + | compelled to copy the source along with the object code. |
| + | |
| + | 5. A program that contains no derivative of any portion of the |
| + | Library, but is designed to work with the Library by being compiled or |
| + | linked with it, is called a "work that uses the Library". Such a |
| + | work, in isolation, is not a derivative work of the Library, and |
| + | therefore falls outside the scope of this License. |
| + | |
| + | However, linking a "work that uses the Library" with the Library |
| + | creates an executable that is a derivative of the Library (because it |
| + | contains portions of the Library), rather than a "work that uses the |
| + | library". The executable is therefore covered by this License. |
| + | Section 6 states terms for distribution of such executables. |
| + | |
| + | When a "work that uses the Library" uses material from a header file |
| + | that is part of the Library, the object code for the work may be a |
| + | derivative work of the Library even though the source code is not. |
| + | Whether this is true is especially significant if the work can be |
| + | linked without the Library, or if the work is itself a library. The |
| + | threshold for this to be true is not precisely defined by law. |
| + | |
| + | If such an object file uses only numerical parameters, data |
| + | structure layouts and accessors, and small macros and small inline |
| + | functions (ten lines or less in length), then the use of the object |
| + | file is unrestricted, regardless of whether it is legally a derivative |
| + | work. (Executables containing this object code plus portions of the |
| + | Library will still fall under Section 6.) |
| + | |
| + | Otherwise, if the work is a derivative of the Library, you may |
| + | distribute the object code for the work under the terms of Section 6. |
| + | Any executables containing that work also fall under Section 6, |
| + | whether or not they are linked directly with the Library itself. |
| + | |
| + | 6. As an exception to the Sections above, you may also combine or |
| + | link a "work that uses the Library" with the Library to produce a |
| + | work containing portions of the Library, and distribute that work |
| + | under terms of your choice, provided that the terms permit |
| + | modification of the work for the customer's own use and reverse |
| + | engineering for debugging such modifications. |
| + | |
| + | You must give prominent notice with each copy of the work that the |
| + | Library is used in it and that the Library and its use are covered by |
| + | this License. You must supply a copy of this License. If the work |
| + | during execution displays copyright notices, you must include the |
| + | copyright notice for the Library among them, as well as a reference |
| + | directing the user to the copy of this License. Also, you must do one |
| + | of these things: |
| + | |
| + | a) Accompany the work with the complete corresponding |
| + | machine-readable source code for the Library including whatever |
| + | changes were used in the work (which must be distributed under |
| + | Sections 1 and 2 above); and, if the work is an executable linked |
| + | with the Library, with the complete machine-readable "work that |
| + | uses the Library", as object code and/or source code, so that the |
| + | user can modify the Library and then relink to produce a modified |
| + | executable containing the modified Library. (It is understood |
| + | that the user who changes the contents of definitions files in the |
| + | Library will not necessarily be able to recompile the application |
| + | to use the modified definitions.) |
| + | |
| + | b) Use a suitable shared library mechanism for linking with the |
| + | Library. A suitable mechanism is one that (1) uses at run time a |
| + | copy of the library already present on the user's computer system, |
| + | rather than copying library functions into the executable, and (2) |
| + | will operate properly with a modified version of the library, if |
| + | the user installs one, as long as the modified version is |
| + | interface-compatible with the version that the work was made with. |
| + | |
| + | c) Accompany the work with a written offer, valid for at |
| + | least three years, to give the same user the materials |
| + | specified in Subsection 6a, above, for a charge no more |
| + | than the cost of performing this distribution. |
| + | |
| + | d) If distribution of the work is made by offering access to copy |
| + | from a designated place, offer equivalent access to copy the above |
| + | specified materials from the same place. |
| + | |
| + | e) Verify that the user has already received a copy of these |
| + | materials or that you have already sent this user a copy. |
| + | |
| + | For an executable, the required form of the "work that uses the |
| + | Library" must include any data and utility programs needed for |
| + | reproducing the executable from it. However, as a special exception, |
| + | the materials to be distributed need not include anything that is |
| + | normally distributed (in either source or binary form) with the major |
| + | components (compiler, kernel, and so on) of the operating system on |
| + | which the executable runs, unless that component itself accompanies |
| + | the executable. |
| + | |
| + | It may happen that this requirement contradicts the license |
| + | restrictions of other proprietary libraries that do not normally |
| + | accompany the operating system. Such a contradiction means you cannot |
| + | use both them and the Library together in an executable that you |
| + | distribute. |
| + | |
| + | 7. You may place library facilities that are a work based on the |
| + | Library side-by-side in a single library together with other library |
| + | facilities not covered by this License, and distribute such a combined |
| + | library, provided that the separate distribution of the work based on |
| + | the Library and of the other library facilities is otherwise |
| + | permitted, and provided that you do these two things: |
| + | |
| + | a) Accompany the combined library with a copy of the same work |
| + | based on the Library, uncombined with any other library |
| + | facilities. This must be distributed under the terms of the |
| + | Sections above. |
| + | |
| + | b) Give prominent notice with the combined library of the fact |
| + | that part of it is a work based on the Library, and explaining |
| + | where to find the accompanying uncombined form of the same work. |
| + | |
| + | 8. You may not copy, modify, sublicense, link with, or distribute |
| + | the Library except as expressly provided under this License. Any |
| + | attempt otherwise to copy, modify, sublicense, link with, or |
| + | distribute the Library is void, and will automatically terminate your |
| + | rights under this License. However, parties who have received copies, |
| + | or rights, from you under this License will not have their licenses |
| + | terminated so long as such parties remain in full compliance. |
| + | |
| + | 9. You are not required to accept this License, since you have not |
| + | signed it. However, nothing else grants you permission to modify or |
| + | distribute the Library or its derivative works. These actions are |
| + | prohibited by law if you do not accept this License. Therefore, by |
| + | modifying or distributing the Library (or any work based on the |
| + | Library), you indicate your acceptance of this License to do so, and |
| + | all its terms and conditions for copying, distributing or modifying |
| + | the Library or works based on it. |
| + | |
| + | 10. Each time you redistribute the Library (or any work based on the |
| + | Library), the recipient automatically receives a license from the |
| + | original licensor to copy, distribute, link with or modify the Library |
| + | subject to these terms and conditions. You may not impose any further |
| + | restrictions on the recipients' exercise of the rights granted herein. |
| + | You are not responsible for enforcing compliance by third parties with |
| + | this License. |
| + | |
| + | 11. If, as a consequence of a court judgment or allegation of patent |
| + | infringement or for any other reason (not limited to patent issues), |
| + | conditions are imposed on you (whether by court order, agreement or |
| + | otherwise) that contradict the conditions of this License, they do not |
| + | excuse you from the conditions of this License. If you cannot |
| + | distribute so as to satisfy simultaneously your obligations under this |
| + | License and any other pertinent obligations, then as a consequence you |
| + | may not distribute the Library at all. For example, if a patent |
| + | license would not permit royalty-free redistribution of the Library by |
| + | all those who receive copies directly or indirectly through you, then |
| + | the only way you could satisfy both it and this License would be to |
| + | refrain entirely from distribution of the Library. |
| + | |
| + | If any portion of this section is held invalid or unenforceable under any |
| + | particular circumstance, the balance of the section is intended to apply, |
| + | and the section as a whole is intended to apply in other circumstances. |
| + | |
| + | It is not the purpose of this section to induce you to infringe any |
| + | patents or other property right claims or to contest validity of any |
| + | such claims; this section has the sole purpose of protecting the |
| + | integrity of the free software distribution system which is |
| + | implemented by public license practices. Many people have made |
| + | generous contributions to the wide range of software distributed |
| + | through that system in reliance on consistent application of that |
| + | system; it is up to the author/donor to decide if he or she is willing |
| + | to distribute software through any other system and a licensee cannot |
| + | impose that choice. |
| + | |
| + | This section is intended to make thoroughly clear what is believed to |
| + | be a consequence of the rest of this License. |
| + | |
| + | 12. If the distribution and/or use of the Library is restricted in |
| + | certain countries either by patents or by copyrighted interfaces, the |
| + | original copyright holder who places the Library under this License may add |
| + | an explicit geographical distribution limitation excluding those countries, |
| + | so that distribution is permitted only in or among countries not thus |
| + | excluded. In such case, this License incorporates the limitation as if |
| + | written in the body of this License. |
| + | |
| + | 13. The Free Software Foundation may publish revised and/or new |
| + | versions of the Lesser General Public License from time to time. |
| + | Such new versions will be similar in spirit to the present version, |
| + | but may differ in detail to address new problems or concerns. |
| + | |
| + | Each version is given a distinguishing version number. If the Library |
| + | specifies a version number of this License which applies to it and |
| + | "any later version", you have the option of following the terms and |
| + | conditions either of that version or of any later version published by |
| + | the Free Software Foundation. If the Library does not specify a |
| + | license version number, you may choose any version ever published by |
| + | the Free Software Foundation. |
| + | |
| + | 14. If you wish to incorporate parts of the Library into other free |
| + | programs whose distribution conditions are incompatible with these, |
| + | write to the author to ask for permission. For software which is |
| + | copyrighted by the Free Software Foundation, write to the Free |
| + | Software Foundation; we sometimes make exceptions for this. Our |
| + | decision will be guided by the two goals of preserving the free status |
| + | of all derivatives of our free software and of promoting the sharing |
| + | and reuse of software generally. |
| + | |
| + | NO WARRANTY |
| + | |
| + | 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO |
| + | WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. |
| + | EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR |
| + | OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY |
| + | KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE |
| + | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| + | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE |
| + | LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME |
| + | THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. |
| + | |
| + | 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN |
| + | WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY |
| + | AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU |
| + | FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR |
| + | CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE |
| + | LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING |
| + | RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A |
| + | FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF |
| + | SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH |
| + | DAMAGES. |
| + | |
| + | END OF TERMS AND CONDITIONS |
| + | |
| + | How to Apply These Terms to Your New Libraries |
| + | |
| + | If you develop a new library, and you want it to be of the greatest |
| + | possible use to the public, we recommend making it free software that |
| + | everyone can redistribute and change. You can do so by permitting |
| + | redistribution under these terms (or, alternatively, under the terms of the |
| + | ordinary General Public License). |
| + | |
| + | To apply these terms, attach the following notices to the library. It is |
| + | safest to attach them to the start of each source file to most effectively |
| + | convey the exclusion of warranty; and each file should have at least the |
| + | "copyright" line and a pointer to where the full notice is found. |
| + | |
| + | <one line to give the library's name and a brief idea of what it does.> |
| + | Copyright (C) <year> <name of author> |
| + | |
| + | This library is free software; you can redistribute it and/or |
| + | modify it under the terms of the GNU Lesser General Public |
| + | License as published by the Free Software Foundation; either |
| + | version 2.1 of the License, or (at your option) any later version. |
| + | |
| + | This library is distributed in the hope that it will be useful, |
| + | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| + | Lesser General Public License for more details. |
| + | |
| + | You should have received a copy of the GNU Lesser General Public |
| + | License along with this library; if not, write to the Free Software |
| + | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| + | |
| + | Also add information on how to contact you by electronic and paper mail. |
| + | |
| + | You should also get your employer (if you work as a programmer) or your |
| + | school, if any, to sign a "copyright disclaimer" for the library, if |
| + | necessary. Here is a sample; alter the names: |
| + | |
| + | Yoyodyne, Inc., hereby disclaims all copyright interest in the |
| + | library `Frob' (a library for tweaking knobs) written by James Random Hacker. |
| + | |
| + | <signature of Ty Coon>, 1 April 1990 |
| + | Ty Coon, President of Vice |
| + | |
| + | That's all there is to it! |
| + | |
| + | |
public/javascripts/cms/3rdparty/tiny_mce/plugins/paste/editor_plugin.js
+1
-0
| @@ | @@ -0,0 +1 @@ |
| + | (function(){var c=tinymce.each,d=null,a={paste_auto_cleanup_on_paste:true,paste_block_drop:false,paste_retain_style_properties:"none",paste_strip_class_attributes:"mso",paste_remove_spans:false,paste_remove_styles:false,paste_remove_styles_if_webkit:true,paste_convert_middot_lists:true,paste_convert_headers_to_strong:false,paste_dialog_width:"450",paste_dialog_height:"400",paste_text_use_dialog:false,paste_text_sticky:false,paste_text_notifyalways:false,paste_text_linebreaktype:"p",paste_text_replacements:[[/\u2026/g,"..."],[/[\x93\x94\u201c\u201d]/g,'"'],[/[\x60\x91\x92\u2018\u2019]/g,"'"]]};function b(e,f){return e.getParam(f,a[f])}tinymce.create("tinymce.plugins.PastePlugin",{init:function(e,f){var g=this;g.editor=e;g.url=f;g.onPreProcess=new tinymce.util.Dispatcher(g);g.onPostProcess=new tinymce.util.Dispatcher(g);g.onPreProcess.add(g._preProcess);g.onPostProcess.add(g._postProcess);g.onPreProcess.add(function(j,k){e.execCallback("paste_preprocess",j,k)});g.onPostProcess.add(function(j,k){e.execCallback("paste_postprocess",j,k)});e.pasteAsPlainText=false;function i(l,j){var k=e.dom;g.onPreProcess.dispatch(g,l);l.node=k.create("div",0,l.content);g.onPostProcess.dispatch(g,l);l.content=e.serializer.serialize(l.node,{getInner:1});if((!j)&&(e.pasteAsPlainText)){g._insertPlainText(e,k,l.content);if(!b(e,"paste_text_sticky")){e.pasteAsPlainText=false;e.controlManager.setActive("pastetext",false)}}else{if(/<(p|h[1-6]|ul|ol)/.test(l.content)){g._insertBlockContent(e,k,l.content)}else{g._insert(l.content)}}}e.addCommand("mceInsertClipboardContent",function(j,k){i(k,true)});if(!b(e,"paste_text_use_dialog")){e.addCommand("mcePasteText",function(k,j){var l=tinymce.util.Cookie;e.pasteAsPlainText=!e.pasteAsPlainText;e.controlManager.setActive("pastetext",e.pasteAsPlainText);if((e.pasteAsPlainText)&&(!l.get("tinymcePasteText"))){if(b(e,"paste_text_sticky")){e.windowManager.alert(e.translate("paste.plaintext_mode_sticky"))}else{e.windowManager.alert(e.translate("paste.plaintext_mode_sticky"))}if(!b(e,"paste_text_notifyalways")){l.set("tinymcePasteText","1",new Date(new Date().getFullYear()+1,12,31))}}})}e.addButton("pastetext",{title:"paste.paste_text_desc",cmd:"mcePasteText"});e.addButton("selectall",{title:"paste.selectall_desc",cmd:"selectall"});function h(s){var m,q,k,l=e.selection,p=e.dom,r=e.getBody(),j;if(e.pasteAsPlainText&&(s.clipboardData||p.doc.dataTransfer)){s.preventDefault();i({content:(s.clipboardData||p.doc.dataTransfer).getData("Text")},true);return}if(p.get("_mcePaste")){return}m=p.add(r,"div",{id:"_mcePaste","class":"mcePaste"},'\uFEFF<br _mce_bogus="1">');if(r!=e.getDoc().body){j=p.getPos(e.selection.getStart(),r).y}else{j=r.scrollTop}p.setStyles(m,{position:"absolute",left:-10000,top:j,width:1,height:1,overflow:"hidden"});if(tinymce.isIE){k=p.doc.body.createTextRange();k.moveToElementText(m);k.execCommand("Paste");p.remove(m);if(m.innerHTML==="\uFEFF"){e.execCommand("mcePasteWord");s.preventDefault();return}i({content:m.innerHTML});return tinymce.dom.Event.cancel(s)}else{function o(n){n.preventDefault()}p.bind(e.getDoc(),"mousedown",o);p.bind(e.getDoc(),"keydown",o);q=e.selection.getRng();m=m.firstChild;k=e.getDoc().createRange();k.setStart(m,0);k.setEnd(m,1);l.setRng(k);window.setTimeout(function(){var t="",n=p.select("div.mcePaste");c(n,function(v){var u=v.firstChild;if(u&&u.nodeName=="DIV"&&u.style.marginTop&&u.style.backgroundColor){p.remove(u,1)}c(p.select("div.mcePaste",v),function(w){p.remove(w,1)});c(p.select("span.Apple-style-span",v),function(w){p.remove(w,1)});c(p.select("br[_mce_bogus]",v),function(w){p.remove(w)});t+=v.innerHTML});c(n,function(u){p.remove(u)});if(q){l.setRng(q)}i({content:t});p.unbind(e.getDoc(),"mousedown",o);p.unbind(e.getDoc(),"keydown",o)},0)}}if(b(e,"paste_auto_cleanup_on_paste")){if(tinymce.isOpera||/Firefox\/2/.test(navigator.userAgent)){e.onKeyDown.add(function(j,k){if(((tinymce.isMac?k.metaKey:k.ctrlKey)&&k.keyCode==86)||(k.shiftKey&&k.keyCode==45)){h(k)}})}else{e.onPaste.addToTop(function(j,k){return h(k)})}}if(b(e,"paste_block_drop")){e.onInit.add(function(){e.dom.bind(e.getBody(),["dragend","dragover","draggesture","dragdrop","drop","drag"],function(j){j.preventDefault();j.stopPropagation();return false})})}g._legacySupport()},getInfo:function(){return{longname:"Paste text/word",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_preProcess:function(i,f){var l=this.editor,k=f.content,q=tinymce.grep,p=tinymce.explode,g=tinymce.trim,m,j;function e(h){c(h,function(o){if(o.constructor==RegExp){k=k.replace(o,"")}else{k=k.replace(o[0],o[1])}})}if(/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(k)||f.wordContent){f.wordContent=true;e([/^\s*( )+/gi,/( |<br[^>]*>)+\s*$/gi]);if(b(l,"paste_convert_headers_to_strong")){k=k.replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"<p><strong>$1</strong></p>")}if(b(l,"paste_convert_middot_lists")){e([[/<!--\[if !supportLists\]-->/gi,"$&__MCE_ITEM__"],[/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]+>)/gi,"$1__MCE_ITEM__"]])}e([/<!--[\s\S]+?-->/gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/ /gi,"\u00a0"]]);do{m=k.length;k=k.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi,"$1")}while(m!=k.length);if(b(l,"paste_retain_style_properties").replace(/^none$/i,"").length==0){k=k.replace(/<\/?span[^>]*>/gi,"")}else{e([[/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi,function(o,h){return(h.length>0)?h.replace(/./," ").slice(Math.floor(h.length/2)).split("").join("\u00a0"):""}],[/(<[a-z][^>]*)\sstyle="([^"]*)"/gi,function(u,h,t){var v=[],o=0,r=p(g(t).replace(/"/gi,"'"),";");c(r,function(s){var w,y,z=p(s,":");function x(A){return A+((A!=="0")&&(/\d$/.test(A)))?"px":""}if(z.length==2){w=z[0].toLowerCase();y=z[1].toLowerCase();switch(w){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-table-layout-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":v[o++]=w.replace(/^mso-|-alt$/g,"")+":"+x(y);return;case"horiz-align":v[o++]="text-align:"+y;return;case"vert-align":v[o++]="vertical-align:"+y;return;case"font-color":case"mso-foreground":v[o++]="color:"+y;return;case"mso-background":case"mso-highlight":v[o++]="background:"+y;return;case"mso-default-height":v[o++]="min-height:"+x(y);return;case"mso-default-width":v[o++]="min-width:"+x(y);return;case"mso-padding-between-alt":v[o++]="border-collapse:separate;border-spacing:"+x(y);return;case"text-line-through":if((y=="single")||(y=="double")){v[o++]="text-decoration:line-through"}return;case"mso-zero-height":if(y=="yes"){v[o++]="display:none"}return}if(/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(w)){return}v[o++]=w+":"+z[1]}});if(o>0){return h+' style="'+v.join(";")+'"'}else{return h}}]])}}if(b(l,"paste_convert_headers_to_strong")){e([[/<h[1-6][^>]*>/gi,"<p><strong>"],[/<\/h[1-6][^>]*>/gi,"</strong></p>"]])}j=b(l,"paste_strip_class_attributes");if(j!=="none"){function n(r,o){if(j==="all"){return""}var h=q(p(o.replace(/^(["'])(.*)\1$/,"$2")," "),function(s){return(/^(?!mso)/i.test(s))});return h.length?' class="'+h.join(" ")+'"':""}k=k.replace(/ class="([^"]+)"/gi,n);k=k.replace(/ class=(\w+)/gi,n)}if(b(l,"paste_remove_spans")){k=k.replace(/<\/?span[^>]*>/gi,"")}f.content=k},_postProcess:function(h,j){var g=this,f=g.editor,i=f.dom,e;if(j.wordContent){c(i.select("a",j.node),function(k){if(!k.href||k.href.indexOf("#_Toc")!=-1){i.remove(k,1)}});if(b(f,"paste_convert_middot_lists")){g._convertLists(h,j)}e=b(f,"paste_retain_style_properties");if((tinymce.is(e,"string"))&&(e!=="all")&&(e!=="*")){e=tinymce.explode(e.replace(/^none$/i,""));c(i.select("*",j.node),function(n){var o={},l=0,m,p,k;if(e){for(m=0;m<e.length;m++){p=e[m];k=i.getStyle(n,p);if(k){o[p]=k;l++}}}i.setAttrib(n,"style","");if(e&&l>0){i.setStyles(n,o)}else{if(n.nodeName=="SPAN"&&!n.className){i.remove(n,true)}}})}}if(b(f,"paste_remove_styles")||(b(f,"paste_remove_styles_if_webkit")&&tinymce.isWebKit)){c(i.select("*[style]",j.node),function(k){k.removeAttribute("style");k.removeAttribute("_mce_style")})}else{if(tinymce.isWebKit){c(i.select("*",j.node),function(k){k.removeAttribute("_mce_style")})}}},_convertLists:function(h,f){var j=h.editor.dom,i,m,e=-1,g,n=[],l,k;c(j.select("p",f.node),function(u){var r,v="",t,s,o,q;for(r=u.firstChild;r&&r.nodeType==3;r=r.nextSibling){v+=r.nodeValue}v=u.innerHTML.replace(/<\/?\w+[^>]*>/gi,"").replace(/ /g,"\u00a0");if(/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o]\s*\u00a0*/.test(v)){t="ul"}if(/^__MCE_ITEM__\s*\w+\.\s*\u00a0{2,}/.test(v)){t="ol"}if(t){g=parseFloat(u.style.marginLeft||0);if(g>e){n.push(g)}if(!i||t!=l){i=j.create(t);j.insertAfter(i,u)}else{if(g>e){i=m.appendChild(j.create(t))}else{if(g<e){o=tinymce.inArray(n,g);q=j.getParents(i.parentNode,t);i=q[q.length-1-o]||i}}}c(j.select("span",u),function(w){var p=w.innerHTML.replace(/<\/?\w+[^>]*>/gi,"");if(t=="ul"&&/^[\u2022\u00b7\u00a7\u00d8o]/.test(p)){j.remove(w)}else{if(/^[\s\S]*\w+\.( |\u00a0)*\s*/.test(p)){j.remove(w)}}});s=u.innerHTML;if(t=="ul"){s=u.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^[\u2022\u00b7\u00a7\u00d8o]\s*( |\u00a0)+\s*/,"")}else{s=u.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^\s*\w+\.( |\u00a0)+\s*/,"")}m=i.appendChild(j.create("li",0,s));j.remove(u);e=g;l=t}else{i=e=0}});k=f.node.innerHTML;if(k.indexOf("__MCE_ITEM__")!=-1){f.node.innerHTML=k.replace(/__MCE_ITEM__/g,"")}},_insertBlockContent:function(l,h,m){var f,j,g=l.selection,q,n,e,o,i,k="mce_marker";function p(t){var s;if(tinymce.isIE){s=l.getDoc().body.createTextRange();s.moveToElementText(t);s.collapse(false);s.select()}else{g.select(t,1);g.collapse(false)}}this._insert('<span id="'+k+'"></span>',1);j=h.get(k);f=h.getParent(j,"p,h1,h2,h3,h4,h5,h6,ul,ol,th,td");if(f&&!/TD|TH/.test(f.nodeName)){j=h.split(f,j);c(h.create("div",0,m).childNodes,function(r){q=j.parentNode.insertBefore(r.cloneNode(true),j)});p(q)}else{h.setOuterHTML(j,m);g.select(l.getBody(),1);g.collapse(0)}while(n=h.get(k)){h.remove(n)}n=g.getStart();e=h.getViewPort(l.getWin());o=l.dom.getPos(n).y;i=n.clientHeight;if(o<e.y||o+i>e.y+e.h){l.getDoc().body.scrollTop=o<e.y?o:o-e.h+25}},_insert:function(g,e){var f=this.editor,i=f.selection.getRng();if(!f.selection.isCollapsed()&&i.startContainer!=i.endContainer){f.getDoc().execCommand("Delete",false,null)}f.execCommand(tinymce.isGecko?"insertHTML":"mceInsertContent",false,g,{skip_undo:e})},_insertPlainText:function(j,x,v){var t,u,l,k,r,e,p,f,n=j.getWin(),z=j.getDoc(),s=j.selection,m=tinymce.is,y=tinymce.inArray,g=b(j,"paste_text_linebreaktype"),o=b(j,"paste_text_replacements");function q(h){c(h,function(i){if(i.constructor==RegExp){v=v.replace(i,"")}else{v=v.replace(i[0],i[1])}})}if((typeof(v)==="string")&&(v.length>0)){if(!d){d=("34,quot,38,amp,39,apos,60,lt,62,gt,"+j.serializer.settings.entities).split(",")}if(/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(v)){q([/[\n\r]+/g])}else{q([/\r+/g])}q([[/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi,"\n\n"],[/<br[^>]*>|<\/tr>/gi,"\n"],[/<\/t[dh]>\s*<t[dh][^>]*>/gi,"\t"],/<[a-z!\/?][^>]*>/gi,[/ /gi," "],[/&(#\d+|[a-z0-9]{1,10});/gi,function(i,h){if(h.charAt(0)==="#"){return String.fromCharCode(h.slice(1))}else{return((i=y(d,h))>0)?String.fromCharCode(d[i-1]):" "}}],[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi,"$1"],[/\n{3,}/g,"\n\n"],/^\s+|\s+$/g]);v=x.encode(v);if(!s.isCollapsed()){z.execCommand("Delete",false,null)}if(m(o,"array")||(m(o,"array"))){q(o)}else{if(m(o,"string")){q(new RegExp(o,"gi"))}}if(g=="none"){q([[/\n+/g," "]])}else{if(g=="br"){q([[/\n/g,"<br />"]])}else{q([/^\s+|\s+$/g,[/\n\n/g,"</p><p>"],[/\n/g,"<br />"]])}}if((l=v.indexOf("</p><p>"))!=-1){k=v.lastIndexOf("</p><p>");r=s.getNode();e=[];do{if(r.nodeType==1){if(r.nodeName=="TD"||r.nodeName=="BODY"){break}e[e.length]=r}}while(r=r.parentNode);if(e.length>0){p=v.substring(0,l);f="";for(t=0,u=e.length;t<u;t++){p+="</"+e[t].nodeName.toLowerCase()+">";f+="<"+e[e.length-t-1].nodeName.toLowerCase()+">"}if(l==k){v=p+f+v.substring(l+7)}else{v=p+v.substring(l+4,k+4)+f+v.substring(k+7)}}}j.execCommand("mceInsertRawHTML",false,v+'<span id="_plain_text_marker"> </span>');window.setTimeout(function(){var h=x.get("_plain_text_marker"),B,i,A,w;s.select(h,false);z.execCommand("Delete",false,null);h=null;B=s.getStart();i=x.getViewPort(n);A=x.getPos(B).y;w=B.clientHeight;if((A<i.y)||(A+w>i.y+i.h)){z.body.scrollTop=A<i.y?A:A-i.h+25}},0)}},_legacySupport:function(){var f=this,e=f.editor;e.addCommand("mcePasteWord",function(){e.windowManager.open({file:f.url+"/pasteword.htm",width:parseInt(b(e,"paste_dialog_width")),height:parseInt(b(e,"paste_dialog_height")),inline:1})});if(b(e,"paste_text_use_dialog")){e.addCommand("mcePasteText",function(){e.windowManager.open({file:f.url+"/pastetext.htm",width:parseInt(b(e,"paste_dialog_width")),height:parseInt(b(e,"paste_dialog_height")),inline:1})})}e.addButton("pasteword",{title:"paste.paste_word_desc",cmd:"mcePasteWord"})}});tinymce.PluginManager.add("paste",tinymce.plugins.PastePlugin)})(); |
| \ No newline at end of file | |
public/javascripts/cms/3rdparty/tiny_mce/plugins/paste/editor_plugin_src.js
+952
-0
| @@ | @@ -0,0 +1,952 @@ |
| + | /** |
| + | * 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() { |
| + | var each = tinymce.each, |
| + | entities = null, |
| + | defs = { |
| + | paste_auto_cleanup_on_paste : true, |
| + | paste_block_drop : false, |
| + | paste_retain_style_properties : "none", |
| + | paste_strip_class_attributes : "mso", |
| + | paste_remove_spans : false, |
| + | paste_remove_styles : false, |
| + | paste_remove_styles_if_webkit : true, |
| + | paste_convert_middot_lists : true, |
| + | paste_convert_headers_to_strong : false, |
| + | paste_dialog_width : "450", |
| + | paste_dialog_height : "400", |
| + | paste_text_use_dialog : false, |
| + | paste_text_sticky : false, |
| + | paste_text_notifyalways : false, |
| + | paste_text_linebreaktype : "p", |
| + | paste_text_replacements : [ |
| + | [/\u2026/g, "..."], |
| + | [/[\x93\x94\u201c\u201d]/g, '"'], |
| + | [/[\x60\x91\x92\u2018\u2019]/g, "'"] |
| + | ] |
| + | }; |
| + | |
| + | function getParam(ed, name) { |
| + | return ed.getParam(name, defs[name]); |
| + | } |
| + | |
| + | tinymce.create('tinymce.plugins.PastePlugin', { |
| + | init : function(ed, url) { |
| + | var t = this; |
| + | |
| + | t.editor = ed; |
| + | t.url = url; |
| + | |
| + | // Setup plugin events |
| + | t.onPreProcess = new tinymce.util.Dispatcher(t); |
| + | t.onPostProcess = new tinymce.util.Dispatcher(t); |
| + | |
| + | // Register default handlers |
| + | t.onPreProcess.add(t._preProcess); |
| + | t.onPostProcess.add(t._postProcess); |
| + | |
| + | // Register optional preprocess handler |
| + | t.onPreProcess.add(function(pl, o) { |
| + | ed.execCallback('paste_preprocess', pl, o); |
| + | }); |
| + | |
| + | // Register optional postprocess |
| + | t.onPostProcess.add(function(pl, o) { |
| + | ed.execCallback('paste_postprocess', pl, o); |
| + | }); |
| + | |
| + | // Initialize plain text flag |
| + | ed.pasteAsPlainText = false; |
| + | |
| + | // This function executes the process handlers and inserts the contents |
| + | // force_rich overrides plain text mode set by user, important for pasting with execCommand |
| + | function process(o, force_rich) { |
| + | var dom = ed.dom; |
| + | |
| + | // Execute pre process handlers |
| + | t.onPreProcess.dispatch(t, o); |
| + | |
| + | // Create DOM structure |
| + | o.node = dom.create('div', 0, o.content); |
| + | |
| + | // Execute post process handlers |
| + | t.onPostProcess.dispatch(t, o); |
| + | |
| + | // Serialize content |
| + | o.content = ed.serializer.serialize(o.node, {getInner : 1}); |
| + | |
| + | // Plain text option active? |
| + | if ((!force_rich) && (ed.pasteAsPlainText)) { |
| + | t._insertPlainText(ed, dom, o.content); |
| + | |
| + | if (!getParam(ed, "paste_text_sticky")) { |
| + | ed.pasteAsPlainText = false; |
| + | ed.controlManager.setActive("pastetext", false); |
| + | } |
| + | } else if (/<(p|h[1-6]|ul|ol)/.test(o.content)) { |
| + | // Handle insertion of contents containing block elements separately |
| + | t._insertBlockContent(ed, dom, o.content); |
| + | } else { |
| + | t._insert(o.content); |
| + | } |
| + | } |
| + | |
| + | // Add command for external usage |
| + | ed.addCommand('mceInsertClipboardContent', function(u, o) { |
| + | process(o, true); |
| + | }); |
| + | |
| + | if (!getParam(ed, "paste_text_use_dialog")) { |
| + | ed.addCommand('mcePasteText', function(u, v) { |
| + | var cookie = tinymce.util.Cookie; |
| + | |
| + | ed.pasteAsPlainText = !ed.pasteAsPlainText; |
| + | ed.controlManager.setActive('pastetext', ed.pasteAsPlainText); |
| + | |
| + | if ((ed.pasteAsPlainText) && (!cookie.get("tinymcePasteText"))) { |
| + | if (getParam(ed, "paste_text_sticky")) { |
| + | ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky')); |
| + | } else { |
| + | ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky')); |
| + | } |
| + | |
| + | if (!getParam(ed, "paste_text_notifyalways")) { |
| + | cookie.set("tinymcePasteText", "1", new Date(new Date().getFullYear() + 1, 12, 31)) |
| + | } |
| + | } |
| + | }); |
| + | } |
| + | |
| + | ed.addButton('pastetext', {title: 'paste.paste_text_desc', cmd: 'mcePasteText'}); |
| + | ed.addButton('selectall', {title: 'paste.selectall_desc', cmd: 'selectall'}); |
| + | |
| + | // This function grabs the contents from the clipboard by adding a |
| + | // hidden div and placing the caret inside it and after the browser paste |
| + | // is done it grabs that contents and processes that |
| + | function grabContent(e) { |
| + | var n, or, rng, sel = ed.selection, dom = ed.dom, body = ed.getBody(), posY; |
| + | |
| + | // Check if browser supports direct plaintext access |
| + | if (ed.pasteAsPlainText && (e.clipboardData || dom.doc.dataTransfer)) { |
| + | e.preventDefault(); |
| + | process({content : (e.clipboardData || dom.doc.dataTransfer).getData('Text')}, true); |
| + | return; |
| + | } |
| + | |
| + | if (dom.get('_mcePaste')) |
| + | return; |
| + | |
| + | // Create container to paste into |
| + | n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste'}, '\uFEFF<br _mce_bogus="1">'); |
| + | |
| + | // If contentEditable mode we need to find out the position of the closest element |
| + | if (body != ed.getDoc().body) |
| + | posY = dom.getPos(ed.selection.getStart(), body).y; |
| + | else |
| + | posY = body.scrollTop; |
| + | |
| + | // Styles needs to be applied after the element is added to the document since WebKit will otherwise remove all styles |
| + | dom.setStyles(n, { |
| + | position : 'absolute', |
| + | left : -10000, |
| + | top : posY, |
| + | width : 1, |
| + | height : 1, |
| + | overflow : 'hidden' |
| + | }); |
| + | |
| + | if (tinymce.isIE) { |
| + | // Select the container |
| + | rng = dom.doc.body.createTextRange(); |
| + | rng.moveToElementText(n); |
| + | rng.execCommand('Paste'); |
| + | |
| + | // Remove container |
| + | dom.remove(n); |
| + | |
| + | // 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 |
| + | if (n.innerHTML === '\uFEFF') { |
| + | ed.execCommand('mcePasteWord'); |
| + | e.preventDefault(); |
| + | return; |
| + | } |
| + | |
| + | // Process contents |
| + | process({content : n.innerHTML}); |
| + | |
| + | // Block the real paste event |
| + | return tinymce.dom.Event.cancel(e); |
| + | } else { |
| + | function block(e) { |
| + | e.preventDefault(); |
| + | }; |
| + | |
| + | // Block mousedown and click to prevent selection change |
| + | dom.bind(ed.getDoc(), 'mousedown', block); |
| + | dom.bind(ed.getDoc(), 'keydown', block); |
| + | |
| + | or = ed.selection.getRng(); |
| + | |
| + | // Move caret into hidden div |
| + | n = n.firstChild; |
| + | rng = ed.getDoc().createRange(); |
| + | rng.setStart(n, 0); |
| + | rng.setEnd(n, 1); |
| + | sel.setRng(rng); |
| + | |
| + | // Wait a while and grab the pasted contents |
| + | window.setTimeout(function() { |
| + | var h = '', nl = dom.select('div.mcePaste'); |
| + | |
| + | // WebKit will split the div into multiple ones so this will loop through then all and join them to get the whole HTML string |
| + | each(nl, function(n) { |
| + | var child = n.firstChild; |
| + | |
| + | // WebKit inserts a DIV container with lots of odd styles |
| + | if (child && child.nodeName == 'DIV' && child.style.marginTop && child.style.backgroundColor) { |
| + | dom.remove(child, 1); |
| + | } |
| + | |
| + | // WebKit duplicates the divs so we need to remove them |
| + | each(dom.select('div.mcePaste', n), function(n) { |
| + | dom.remove(n, 1); |
| + | }); |
| + | |
| + | // Remove apply style spans |
| + | each(dom.select('span.Apple-style-span', n), function(n) { |
| + | dom.remove(n, 1); |
| + | }); |
| + | |
| + | // Remove bogus br elements |
| + | each(dom.select('br[_mce_bogus]', n), function(n) { |
| + | dom.remove(n); |
| + | }); |
| + | |
| + | h += n.innerHTML; |
| + | }); |
| + | |
| + | // Remove the nodes |
| + | each(nl, function(n) { |
| + | dom.remove(n); |
| + | }); |
| + | |
| + | // Restore the old selection |
| + | if (or) |
| + | sel.setRng(or); |
| + | |
| + | process({content : h}); |
| + | |
| + | // Unblock events ones we got the contents |
| + | dom.unbind(ed.getDoc(), 'mousedown', block); |
| + | dom.unbind(ed.getDoc(), 'keydown', block); |
| + | }, 0); |
| + | } |
| + | } |
| + | |
| + | // Check if we should use the new auto process method |
| + | if (getParam(ed, "paste_auto_cleanup_on_paste")) { |
| + | // Is it's Opera or older FF use key handler |
| + | if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) { |
| + | ed.onKeyDown.add(function(ed, e) { |
| + | if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45)) |
| + | grabContent(e); |
| + | }); |
| + | } else { |
| + | // Grab contents on paste event on Gecko and WebKit |
| + | ed.onPaste.addToTop(function(ed, e) { |
| + | return grabContent(e); |
| + | }); |
| + | } |
| + | } |
| + | |
| + | // Block all drag/drop events |
| + | if (getParam(ed, "paste_block_drop")) { |
| + | ed.onInit.add(function() { |
| + | ed.dom.bind(ed.getBody(), ['dragend', 'dragover', 'draggesture', 'dragdrop', 'drop', 'drag'], function(e) { |
| + | e.preventDefault(); |
| + | e.stopPropagation(); |
| + | |
| + | return false; |
| + | }); |
| + | }); |
| + | } |
| + | |
| + | // Add legacy support |
| + | t._legacySupport(); |
| + | }, |
| + | |
| + | getInfo : function() { |
| + | return { |
| + | longname : 'Paste text/word', |
| + | author : 'Moxiecode Systems AB', |
| + | authorurl : 'http://tinymce.moxiecode.com', |
| + | infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste', |
| + | version : tinymce.majorVersion + "." + tinymce.minorVersion |
| + | }; |
| + | }, |
| + | |
| + | _preProcess : function(pl, o) { |
| + | //console.log('Before preprocess:' + o.content); |
| + | |
| + | var ed = this.editor, |
| + | h = o.content, |
| + | grep = tinymce.grep, |
| + | explode = tinymce.explode, |
| + | trim = tinymce.trim, |
| + | len, stripClass; |
| + | |
| + | function process(items) { |
| + | each(items, function(v) { |
| + | // Remove or replace |
| + | if (v.constructor == RegExp) |
| + | h = h.replace(v, ''); |
| + | else |
| + | h = h.replace(v[0], v[1]); |
| + | }); |
| + | } |
| + | |
| + | // Detect Word content and process it more aggressive |
| + | if (/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(h) || o.wordContent) { |
| + | o.wordContent = true; // Mark the pasted contents as word specific content |
| + | //console.log('Word contents detected.'); |
| + | |
| + | // Process away some basic content |
| + | process([ |
| + | /^\s*( )+/gi, // entities at the start of contents |
| + | /( |<br[^>]*>)+\s*$/gi // entities at the end of contents |
| + | ]); |
| + | |
| + | if (getParam(ed, "paste_convert_headers_to_strong")) { |
| + | h = h.replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "<p><strong>$1</strong></p>"); |
| + | } |
| + | |
| + | if (getParam(ed, "paste_convert_middot_lists")) { |
| + | process([ |
| + | [/<!--\[if !supportLists\]-->/gi, '$&__MCE_ITEM__'], // Convert supportLists to a list item marker |
| + | [/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]+>)/gi, '$1__MCE_ITEM__'] // Convert mso-list and symbol spans to item markers |
| + | ]); |
| + | } |
| + | |
| + | process([ |
| + | // Word comments like conditional comments etc |
| + | /<!--[\s\S]+?-->/gi, |
| + | |
| + | // Remove comments, scripts (e.g., msoShowComment), XML tag, VML content, MS Office namespaced tags, and a few other tags |
| + | /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi, |
| + | |
| + | // Convert <s> into <strike> for line-though |
| + | [/<(\/?)s>/gi, "<$1strike>"], |
| + | |
| + | // Replace nsbp entites to char since it's easier to handle |
| + | [/ /gi, "\u00a0"] |
| + | ]); |
| + | |
| + | // Remove bad attributes, with or without quotes, ensuring that attribute text is really inside a tag. |
| + | // If JavaScript had a RegExp look-behind, we could have integrated this with the last process() array and got rid of the loop. But alas, it does not, so we cannot. |
| + | do { |
| + | len = h.length; |
| + | h = h.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi, "$1"); |
| + | } while (len != h.length); |
| + | |
| + | // Remove all spans if no styles is to be retained |
| + | if (getParam(ed, "paste_retain_style_properties").replace(/^none$/i, "").length == 0) { |
| + | h = h.replace(/<\/?span[^>]*>/gi, ""); |
| + | } else { |
| + | // We're keeping styles, so at least clean them up. |
| + | // CSS Reference: http://msdn.microsoft.com/en-us/library/aa155477.aspx |
| + | |
| + | process([ |
| + | // Convert <span style="mso-spacerun:yes">___</span> to string of alternating breaking/non-breaking spaces of same length |
| + | [/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi, |
| + | function(str, spaces) { |
| + | return (spaces.length > 0)? spaces.replace(/./, " ").slice(Math.floor(spaces.length/2)).split("").join("\u00a0") : ""; |
| + | } |
| + | ], |
| + | |
| + | // Examine all styles: delete junk, transform some, and keep the rest |
| + | [/(<[a-z][^>]*)\sstyle="([^"]*)"/gi, |
| + | function(str, tag, style) { |
| + | var n = [], |
| + | i = 0, |
| + | s = explode(trim(style).replace(/"/gi, "'"), ";"); |
| + | |
| + | // Examine each style definition within the tag's style attribute |
| + | each(s, function(v) { |
| + | var name, value, |
| + | parts = explode(v, ":"); |
| + | |
| + | function ensureUnits(v) { |
| + | return v + ((v !== "0") && (/\d$/.test(v)))? "px" : ""; |
| + | } |
| + | |
| + | if (parts.length == 2) { |
| + | name = parts[0].toLowerCase(); |
| + | value = parts[1].toLowerCase(); |
| + | |
| + | // Translate certain MS Office styles into their CSS equivalents |
| + | switch (name) { |
| + | case "mso-padding-alt": |
| + | case "mso-padding-top-alt": |
| + | case "mso-padding-right-alt": |
| + | case "mso-padding-bottom-alt": |
| + | case "mso-padding-left-alt": |
| + | case "mso-margin-alt": |
| + | case "mso-margin-top-alt": |
| + | case "mso-margin-right-alt": |
| + | case "mso-margin-bottom-alt": |
| + | case "mso-margin-left-alt": |
| + | case "mso-table-layout-alt": |
| + | case "mso-height": |
| + | case "mso-width": |
| + | case "mso-vertical-align-alt": |
| + | n[i++] = name.replace(/^mso-|-alt$/g, "") + ":" + ensureUnits(value); |
| + | return; |
| + | |
| + | case "horiz-align": |
| + | n[i++] = "text-align:" + value; |
| + | return; |
| + | |
| + | case "vert-align": |
| + | n[i++] = "vertical-align:" + value; |
| + | return; |
| + | |
| + | case "font-color": |
| + | case "mso-foreground": |
| + | n[i++] = "color:" + value; |
| + | return; |
| + | |
| + | case "mso-background": |
| + | case "mso-highlight": |
| + | n[i++] = "background:" + value; |
| + | return; |
| + | |
| + | case "mso-default-height": |
| + | n[i++] = "min-height:" + ensureUnits(value); |
| + | return; |
| + | |
| + | case "mso-default-width": |
| + | n[i++] = "min-width:" + ensureUnits(value); |
| + | return; |
| + | |
| + | case "mso-padding-between-alt": |
| + | n[i++] = "border-collapse:separate;border-spacing:" + ensureUnits(value); |
| + | return; |
| + | |
| + | case "text-line-through": |
| + | if ((value == "single") || (value == "double")) { |
| + | n[i++] = "text-decoration:line-through"; |
| + | } |
| + | return; |
| + | |
| + | case "mso-zero-height": |
| + | if (value == "yes") { |
| + | n[i++] = "display:none"; |
| + | } |
| + | return; |
| + | } |
| + | |
| + | // Eliminate all MS Office style definitions that have no CSS equivalent by examining the first characters in the name |
| + | if (/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(name)) { |
| + | return; |
| + | } |
| + | |
| + | // If it reached this point, it must be a valid CSS style |
| + | n[i++] = name + ":" + parts[1]; // Lower-case name, but keep value case |
| + | } |
| + | }); |
| + | |
| + | // If style attribute contained any valid styles the re-write it; otherwise delete style attribute. |
| + | if (i > 0) { |
| + | return tag + ' style="' + n.join(';') + '"'; |
| + | } else { |
| + | return tag; |
| + | } |
| + | } |
| + | ] |
| + | ]); |
| + | } |
| + | } |
| + | |
| + | // Replace headers with <strong> |
| + | if (getParam(ed, "paste_convert_headers_to_strong")) { |
| + | process([ |
| + | [/<h[1-6][^>]*>/gi, "<p><strong>"], |
| + | [/<\/h[1-6][^>]*>/gi, "</strong></p>"] |
| + | ]); |
| + | } |
| + | |
| + | // Class attribute options are: leave all as-is ("none"), remove all ("all"), or remove only those starting with mso ("mso"). |
| + | // Note:- paste_strip_class_attributes: "none", verify_css_classes: true is also a good variation. |
| + | stripClass = getParam(ed, "paste_strip_class_attributes"); |
| + | |
| + | if (stripClass !== "none") { |
| + | function removeClasses(match, g1) { |
| + | if (stripClass === "all") |
| + | return ''; |
| + | |
| + | var cls = grep(explode(g1.replace(/^(["'])(.*)\1$/, "$2"), " "), |
| + | function(v) { |
| + | return (/^(?!mso)/i.test(v)); |
| + | } |
| + | ); |
| + | |
| + | return cls.length ? ' class="' + cls.join(" ") + '"' : ''; |
| + | }; |
| + | |
| + | h = h.replace(/ class="([^"]+)"/gi, removeClasses); |
| + | h = h.replace(/ class=(\w+)/gi, removeClasses); |
| + | } |
| + | |
| + | // Remove spans option |
| + | if (getParam(ed, "paste_remove_spans")) { |
| + | h = h.replace(/<\/?span[^>]*>/gi, ""); |
| + | } |
| + | |
| + | //console.log('After preprocess:' + h); |
| + | |
| + | o.content = h; |
| + | }, |
| + | |
| + | /** |
| + | * Various post process items. |
| + | */ |
| + | _postProcess : function(pl, o) { |
| + | var t = this, ed = t.editor, dom = ed.dom, styleProps; |
| + | |
| + | if (o.wordContent) { |
| + | // Remove named anchors or TOC links |
| + | each(dom.select('a', o.node), function(a) { |
| + | if (!a.href || a.href.indexOf('#_Toc') != -1) |
| + | dom.remove(a, 1); |
| + | }); |
| + | |
| + | if (getParam(ed, "paste_convert_middot_lists")) { |
| + | t._convertLists(pl, o); |
| + | } |
| + | |
| + | // Process styles |
| + | styleProps = getParam(ed, "paste_retain_style_properties"); // retained properties |
| + | |
| + | // Process only if a string was specified and not equal to "all" or "*" |
| + | if ((tinymce.is(styleProps, "string")) && (styleProps !== "all") && (styleProps !== "*")) { |
| + | styleProps = tinymce.explode(styleProps.replace(/^none$/i, "")); |
| + | |
| + | // Retains some style properties |
| + | each(dom.select('*', o.node), function(el) { |
| + | var newStyle = {}, npc = 0, i, sp, sv; |
| + | |
| + | // Store a subset of the existing styles |
| + | if (styleProps) { |
| + | for (i = 0; i < styleProps.length; i++) { |
| + | sp = styleProps[i]; |
| + | sv = dom.getStyle(el, sp); |
| + | |
| + | if (sv) { |
| + | newStyle[sp] = sv; |
| + | npc++; |
| + | } |
| + | } |
| + | } |
| + | |
| + | // Remove all of the existing styles |
| + | dom.setAttrib(el, 'style', ''); |
| + | |
| + | if (styleProps && npc > 0) |
| + | dom.setStyles(el, newStyle); // Add back the stored subset of styles |
| + | else // Remove empty span tags that do not have class attributes |
| + | if (el.nodeName == 'SPAN' && !el.className) |
| + | dom.remove(el, true); |
| + | }); |
| + | } |
| + | } |
| + | |
| + | // Remove all style information or only specifically on WebKit to avoid the style bug on that browser |
| + | if (getParam(ed, "paste_remove_styles") || (getParam(ed, "paste_remove_styles_if_webkit") && tinymce.isWebKit)) { |
| + | each(dom.select('*[style]', o.node), function(el) { |
| + | el.removeAttribute('style'); |
| + | el.removeAttribute('_mce_style'); |
| + | }); |
| + | } else { |
| + | if (tinymce.isWebKit) { |
| + | // We need to compress the styles on WebKit since if you paste <img border="0" /> it will become <img border="0" style="... lots of junk ..." /> |
| + | // Removing the mce_style that contains the real value will force the Serializer engine to compress the styles |
| + | each(dom.select('*', o.node), function(el) { |
| + | el.removeAttribute('_mce_style'); |
| + | }); |
| + | } |
| + | } |
| + | }, |
| + | |
| + | /** |
| + | * Converts the most common bullet and number formats in Office into a real semantic UL/LI list. |
| + | */ |
| + | _convertLists : function(pl, o) { |
| + | var dom = pl.editor.dom, listElm, li, lastMargin = -1, margin, levels = [], lastType, html; |
| + | |
| + | // Convert middot lists into real semantic lists |
| + | each(dom.select('p', o.node), function(p) { |
| + | var sib, val = '', type, html, idx, parents; |
| + | |
| + | // Get text node value at beginning of paragraph |
| + | for (sib = p.firstChild; sib && sib.nodeType == 3; sib = sib.nextSibling) |
| + | val += sib.nodeValue; |
| + | |
| + | val = p.innerHTML.replace(/<\/?\w+[^>]*>/gi, '').replace(/ /g, '\u00a0'); |
| + | |
| + | // Detect unordered lists look for bullets |
| + | if (/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o]\s*\u00a0*/.test(val)) |
| + | type = 'ul'; |
| + | |
| + | // Detect ordered lists 1., a. or ixv. |
| + | if (/^__MCE_ITEM__\s*\w+\.\s*\u00a0{2,}/.test(val)) |
| + | type = 'ol'; |
| + | |
| + | // Check if node value matches the list pattern: o |
| + | if (type) { |
| + | margin = parseFloat(p.style.marginLeft || 0); |
| + | |
| + | if (margin > lastMargin) |
| + | levels.push(margin); |
| + | |
| + | if (!listElm || type != lastType) { |
| + | listElm = dom.create(type); |
| + | dom.insertAfter(listElm, p); |
| + | } else { |
| + | // Nested list element |
| + | if (margin > lastMargin) { |
| + | listElm = li.appendChild(dom.create(type)); |
| + | } else if (margin < lastMargin) { |
| + | // Find parent level based on margin value |
| + | idx = tinymce.inArray(levels, margin); |
| + | parents = dom.getParents(listElm.parentNode, type); |
| + | listElm = parents[parents.length - 1 - idx] || listElm; |
| + | } |
| + | } |
| + | |
| + | // Remove middot or number spans if they exists |
| + | each(dom.select('span', p), function(span) { |
| + | var html = span.innerHTML.replace(/<\/?\w+[^>]*>/gi, ''); |
| + | |
| + | // Remove span with the middot or the number |
| + | if (type == 'ul' && /^[\u2022\u00b7\u00a7\u00d8o]/.test(html)) |
| + | dom.remove(span); |
| + | else if (/^[\s\S]*\w+\.( |\u00a0)*\s*/.test(html)) |
| + | dom.remove(span); |
| + | }); |
| + | |
| + | html = p.innerHTML; |
| + | |
| + | // Remove middot/list items |
| + | if (type == 'ul') |
| + | html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^[\u2022\u00b7\u00a7\u00d8o]\s*( |\u00a0)+\s*/, ''); |
| + | else |
| + | html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^\s*\w+\.( |\u00a0)+\s*/, ''); |
| + | |
| + | // Create li and add paragraph data into the new li |
| + | li = listElm.appendChild(dom.create('li', 0, html)); |
| + | dom.remove(p); |
| + | |
| + | lastMargin = margin; |
| + | lastType = type; |
| + | } else |
| + | listElm = lastMargin = 0; // End list element |
| + | }); |
| + | |
| + | // Remove any left over makers |
| + | html = o.node.innerHTML; |
| + | if (html.indexOf('__MCE_ITEM__') != -1) |
| + | o.node.innerHTML = html.replace(/__MCE_ITEM__/g, ''); |
| + | }, |
| + | |
| + | /** |
| + | * This method will split the current block parent and insert the contents inside the split position. |
| + | * This logic can be improved so text nodes at the start/end remain in the start/end block elements |
| + | */ |
| + | _insertBlockContent : function(ed, dom, content) { |
| + | var parentBlock, marker, sel = ed.selection, last, elm, vp, y, elmHeight, markerId = 'mce_marker'; |
| + | |
| + | function select(n) { |
| + | var r; |
| + | |
| + | if (tinymce.isIE) { |
| + | r = ed.getDoc().body.createTextRange(); |
| + | r.moveToElementText(n); |
| + | r.collapse(false); |
| + | r.select(); |
| + | } else { |
| + | sel.select(n, 1); |
| + | sel.collapse(false); |
| + | } |
| + | } |
| + | |
| + | // Insert a marker for the caret position |
| + | this._insert('<span id="' + markerId + '"></span>', 1); |
| + | marker = dom.get(markerId); |
| + | parentBlock = dom.getParent(marker, 'p,h1,h2,h3,h4,h5,h6,ul,ol,th,td'); |
| + | |
| + | // If it's a parent block but not a table cell |
| + | if (parentBlock && !/TD|TH/.test(parentBlock.nodeName)) { |
| + | // Split parent block |
| + | marker = dom.split(parentBlock, marker); |
| + | |
| + | // Insert nodes before the marker |
| + | each(dom.create('div', 0, content).childNodes, function(n) { |
| + | last = marker.parentNode.insertBefore(n.cloneNode(true), marker); |
| + | }); |
| + | |
| + | // Move caret after marker |
| + | select(last); |
| + | } else { |
| + | dom.setOuterHTML(marker, content); |
| + | sel.select(ed.getBody(), 1); |
| + | sel.collapse(0); |
| + | } |
| + | |
| + | // Remove marker if it's left |
| + | while (elm = dom.get(markerId)) |
| + | dom.remove(elm); |
| + | |
| + | // Get element, position and height |
| + | elm = sel.getStart(); |
| + | vp = dom.getViewPort(ed.getWin()); |
| + | y = ed.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) |
| + | ed.getDoc().body.scrollTop = y < vp.y ? y : y - vp.h + 25; |
| + | }, |
| + | |
| + | /** |
| + | * Inserts the specified contents at the caret position. |
| + | */ |
| + | _insert : function(h, skip_undo) { |
| + | var ed = this.editor, r = ed.selection.getRng(); |
| + | |
| + | // First delete the contents seems to work better on WebKit when the selection spans multiple list items or multiple table cells. |
| + | if (!ed.selection.isCollapsed() && r.startContainer != r.endContainer) |
| + | ed.getDoc().execCommand('Delete', false, null); |
| + | |
| + | // It's better to use the insertHTML method on Gecko since it will combine paragraphs correctly before inserting the contents |
| + | ed.execCommand(tinymce.isGecko ? 'insertHTML' : 'mceInsertContent', false, h, {skip_undo : skip_undo}); |
| + | }, |
| + | |
| + | /** |
| + | * Instead of the old plain text method which tried to re-create a paste operation, the |
| + | * new approach adds a plain text mode toggle switch that changes the behavior of paste. |
| + | * This function is passed the same input that the regular paste plugin produces. |
| + | * It performs additional scrubbing and produces (and inserts) the plain text. |
| + | * This approach leverages all of the great existing functionality in the paste |
| + | * plugin, and requires minimal changes to add the new functionality. |
| + | * Speednet - June 2009 |
| + | */ |
| + | _insertPlainText : function(ed, dom, h) { |
| + | var i, len, pos, rpos, node, breakElms, before, after, |
| + | w = ed.getWin(), |
| + | d = ed.getDoc(), |
| + | sel = ed.selection, |
| + | is = tinymce.is, |
| + | inArray = tinymce.inArray, |
| + | linebr = getParam(ed, "paste_text_linebreaktype"), |
| + | rl = getParam(ed, "paste_text_replacements"); |
| + | |
| + | function process(items) { |
| + | each(items, function(v) { |
| + | if (v.constructor == RegExp) |
| + | h = h.replace(v, ""); |
| + | else |
| + | h = h.replace(v[0], v[1]); |
| + | }); |
| + | }; |
| + | |
| + | if ((typeof(h) === "string") && (h.length > 0)) { |
| + | if (!entities) |
| + | entities = ("34,quot,38,amp,39,apos,60,lt,62,gt," + ed.serializer.settings.entities).split(","); |
| + | |
| + | // 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)) { |
| + | process([ |
| + | /[\n\r]+/g |
| + | ]); |
| + | } else { |
| + | // Otherwise just get rid of carriage returns (only need linefeeds) |
| + | process([ |
| + | /\r+/g |
| + | ]); |
| + | } |
| + | |
| + | process([ |
| + | [/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi, "\n\n"], // Block tags get a blank line after them |
| + | [/<br[^>]*>|<\/tr>/gi, "\n"], // Single linebreak for <br /> tags and table rows |
| + | [/<\/t[dh]>\s*<t[dh][^>]*>/gi, "\t"], // Table cells get tabs betweem them |
| + | /<[a-z!\/?][^>]*>/gi, // Delete all remaining tags |
| + | [/ /gi, " "], // Convert non-break spaces to regular spaces (remember, *plain text*) |
| + | [ |
| + | // HTML entity |
| + | /&(#\d+|[a-z0-9]{1,10});/gi, |
| + | |
| + | // Replace with actual character |
| + | function(e, s) { |
| + | if (s.charAt(0) === "#") { |
| + | return String.fromCharCode(s.slice(1)); |
| + | } |
| + | else { |
| + | return ((e = inArray(entities, s)) > 0)? String.fromCharCode(entities[e-1]) : " "; |
| + | } |
| + | } |
| + | ], |
| + | [/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi, "$1"], // Cool little RegExp deletes whitespace around linebreak chars. |
| + | [/\n{3,}/g, "\n\n"], // Max. 2 consecutive linebreaks |
| + | /^\s+|\s+$/g // Trim the front & back |
| + | ]); |
| + | |
| + | h = dom.encode(h); |
| + | |
| + | // Delete any highlighted text before pasting |
| + | if (!sel.isCollapsed()) { |
| + | d.execCommand("Delete", false, null); |
| + | } |
| + | |
| + | // Perform default or custom replacements |
| + | if (is(rl, "array") || (is(rl, "array"))) { |
| + | process(rl); |
| + | } |
| + | else if (is(rl, "string")) { |
| + | process(new RegExp(rl, "gi")); |
| + | } |
| + | |
| + | // Treat paragraphs as specified in the config |
| + | if (linebr == "none") { |
| + | process([ |
| + | [/\n+/g, " "] |
| + | ]); |
| + | } |
| + | else if (linebr == "br") { |
| + | process([ |
| + | [/\n/g, "<br />"] |
| + | ]); |
| + | } |
| + | else { |
| + | process([ |
| + | /^\s+|\s+$/g, |
| + | [/\n\n/g, "</p><p>"], |
| + | [/\n/g, "<br />"] |
| + | ]); |
| + | } |
| + | |
| + | // This next piece of code handles the situation where we're pasting more than one paragraph of plain |
| + | // 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"> </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); |
| + | } |
| + | }, |
| + | |
| + | /** |
| + | * This method will open the old style paste dialogs. Some users might want the old behavior but still use the new cleanup engine. |
| + | */ |
| + | _legacySupport : function() { |
| + | var t = this, ed = t.editor; |
| + | |
| + | // Register command(s) for backwards compatibility |
| + | ed.addCommand("mcePasteWord", function() { |
| + | ed.windowManager.open({ |
| + | file: t.url + "/pasteword.htm", |
| + | width: parseInt(getParam(ed, "paste_dialog_width")), |
| + | height: parseInt(getParam(ed, "paste_dialog_height")), |
| + | inline: 1 |
| + | }); |
| + | }); |
| + | |
| + | if (getParam(ed, "paste_text_use_dialog")) { |
| + | ed.addCommand("mcePasteText", function() { |
| + | ed.windowManager.open({ |
| + | file : t.url + "/pastetext.htm", |
| + | width: parseInt(getParam(ed, "paste_dialog_width")), |
| + | height: parseInt(getParam(ed, "paste_dialog_height")), |
| + | inline : 1 |
| + | }); |
| + | }); |
| + | } |
| + | |
| + | // Register button for backwards compatibility |
| + | ed.addButton("pasteword", {title : "paste.paste_word_desc", cmd : "mcePasteWord"}); |
| + | } |
| + | }); |
| + | |
| + | // Register plugin |
| + | tinymce.PluginManager.add("paste", tinymce.plugins.PastePlugin); |
| + | })(); |
public/javascripts/cms/3rdparty/tiny_mce/plugins/paste/js/pastetext.js
+36
-0
| @@ | @@ -0,0 +1,36 @@ |
| + | tinyMCEPopup.requireLangPack(); |
| + | |
| + | var PasteTextDialog = { |
| + | init : function() { |
| + | this.resize(); |
| + | }, |
| + | |
| + | insert : function() { |
| + | var h = tinyMCEPopup.dom.encode(document.getElementById('content').value), lines; |
| + | |
| + | // Convert linebreaks into paragraphs |
| + | if (document.getElementById('linebreaks').checked) { |
| + | lines = h.split(/\r?\n/); |
| + | if (lines.length > 1) { |
| + | h = ''; |
| + | tinymce.each(lines, function(row) { |
| + | h += '<p>' + row + '</p>'; |
| + | }); |
| + | } |
| + | } |
| + | |
| + | tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h}); |
| + | tinyMCEPopup.close(); |
| + | }, |
| + | |
| + | resize : function() { |
| + | var vp = tinyMCEPopup.dom.getViewPort(window), el; |
| + | |
| + | el = document.getElementById('content'); |
| + | |
| + | el.style.width = (vp.w - 20) + 'px'; |
| + | el.style.height = (vp.h - 90) + 'px'; |
| + | } |
| + | }; |
| + | |
| + | tinyMCEPopup.onInit.add(PasteTextDialog.init, PasteTextDialog); |
public/javascripts/cms/3rdparty/tiny_mce/plugins/paste/js/pasteword.js
+51
-0
| @@ | @@ -0,0 +1,51 @@ |
| + | tinyMCEPopup.requireLangPack(); |
| + | |
| + | var PasteWordDialog = { |
| + | init : function() { |
| + | var ed = tinyMCEPopup.editor, el = document.getElementById('iframecontainer'), ifr, doc, css, cssHTML = ''; |
| + | |
| + | // Create iframe |
| + | el.innerHTML = '<iframe id="iframe" src="javascript:\'\';" frameBorder="0" style="border: 1px solid gray"></iframe>'; |
| + | ifr = document.getElementById('iframe'); |
| + | doc = ifr.contentWindow.document; |
| + | |
| + | // Force absolute CSS urls |
| + | css = [ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css")]; |
| + | css = css.concat(tinymce.explode(ed.settings.content_css) || []); |
| + | tinymce.each(css, function(u) { |
| + | cssHTML += '<link href="' + ed.documentBaseURI.toAbsolute('' + u) + '" rel="stylesheet" type="text/css" />'; |
| + | }); |
| + | |
| + | // Write content into iframe |
| + | doc.open(); |
| + | doc.write('<html><head>' + cssHTML + '</head><body class="mceContentBody" spellcheck="false"></body></html>'); |
| + | doc.close(); |
| + | |
| + | doc.designMode = 'on'; |
| + | this.resize(); |
| + | |
| + | window.setTimeout(function() { |
| + | ifr.contentWindow.focus(); |
| + | }, 10); |
| + | }, |
| + | |
| + | insert : function() { |
| + | var h = document.getElementById('iframe').contentWindow.document.body.innerHTML; |
| + | |
| + | tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h, wordContent : true}); |
| + | tinyMCEPopup.close(); |
| + | }, |
| + | |
| + | resize : function() { |
| + | var vp = tinyMCEPopup.dom.getViewPort(window), el; |
| + | |
| + | el = document.getElementById('iframe'); |
| + | |
| + | if (el) { |
| + | el.style.width = (vp.w - 20) + 'px'; |
| + | el.style.height = (vp.h - 90) + 'px'; |
| + | } |
| + | } |
| + | }; |
| + | |
| + | tinyMCEPopup.onInit.add(PasteWordDialog.init, PasteWordDialog); |
public/javascripts/cms/3rdparty/tiny_mce/plugins/paste/langs/en_dlg.js
+5
-0
| @@ | @@ -0,0 +1,5 @@ |
| + | tinyMCE.addI18n('en.paste_dlg',{ |
| + | 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." |
| + | }); |
| \ No newline at end of file | |
public/javascripts/cms/3rdparty/tiny_mce/plugins/paste/pastetext.htm
+27
-0
| @@ | @@ -0,0 +1,27 @@ |
| + | <html xmlns="http://www.w3.org/1999/xhtml"> |
| + | <head> |
| + | <title>{#paste.paste_text_desc}</title> |
| + | <script type="text/javascript" src="../../tiny_mce_popup.js"></script> |
| + | <script type="text/javascript" src="js/pastetext.js"></script> |
| + | </head> |
| + | <body onresize="PasteTextDialog.resize();" style="display:none; overflow:hidden;"> |
| + | <form name="source" onsubmit="return PasteTextDialog.insert();" action="#"> |
| + | <div style="float: left" class="title">{#paste.paste_text_desc}</div> |
| + | |
| + | <div style="float: right"> |
| + | <input type="checkbox" name="linebreaks" id="linebreaks" class="wordWrapCode" checked="checked" /><label for="linebreaks">{#paste_dlg.text_linebreaks}</label> |
| + | </div> |
| + | |
| + | <br style="clear: both" /> |
| + | |
| + | <div>{#paste_dlg.text_title}</div> |
| + | |
| + | <textarea id="content" name="content" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,mono; font-size: 12px;" dir="ltr" wrap="soft" class="mceFocus"></textarea> |
| + | |
| + | <div class="mceActionPanel"> |
| + | <input type="submit" name="insert" value="{#insert}" id="insert" /> |
| + | <input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" /> |
| + | </div> |
| + | </form> |
| + | </body> |
| + | </html> |
| \ No newline at end of file | |
public/javascripts/cms/3rdparty/tiny_mce/plugins/paste/pasteword.htm
+21
-0
| @@ | @@ -0,0 +1,21 @@ |
| + | <html xmlns="http://www.w3.org/1999/xhtml"> |
| + | <head> |
| + | <title>{#paste.paste_word_desc}</title> |
| + | <script type="text/javascript" src="../../tiny_mce_popup.js"></script> |
| + | <script type="text/javascript" src="js/pasteword.js"></script> |
| + | </head> |
| + | <body onresize="PasteWordDialog.resize();" style="display:none; overflow:hidden;"> |
| + | <form name="source" onsubmit="return PasteWordDialog.insert();" action="#"> |
| + | <div class="title">{#paste.paste_word_desc}</div> |
| + | |
| + | <div>{#paste_dlg.word_title}</div> |
| + | |
| + | <div id="iframecontainer"></div> |
| + | |
| + | <div class="mceActionPanel"> |
| + | <input type="submit" id="insert" name="insert" value="{#insert}" /> |
| + | <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> |
| + | </div> |
| + | </form> |
| + | </body> |
| + | </html> |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/about.htm
+54
-0
| @@ | @@ -0,0 +1,54 @@ |
| + | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
| + | <html xmlns="http://www.w3.org/1999/xhtml"> |
| + | <head> |
| + | <title>{#advanced_dlg.about_title}</title> |
| + | <script type="text/javascript" src="../../tiny_mce_popup.js"></script> |
| + | <script type="text/javascript" src="../../utils/mctabs.js"></script> |
| + | <script type="text/javascript" src="js/about.js"></script> |
| + | </head> |
| + | <body id="about" style="display: none"> |
| + | <div class="tabs"> |
| + | <ul> |
| + | <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advanced_dlg.about_general}</a></span></li> |
| + | <li id="help_tab" style="display:none"><span><a href="javascript:mcTabs.displayTab('help_tab','help_panel');" onmousedown="return false;">{#advanced_dlg.about_help}</a></span></li> |
| + | <li id="plugins_tab"><span><a href="javascript:mcTabs.displayTab('plugins_tab','plugins_panel');" onmousedown="return false;">{#advanced_dlg.about_plugins}</a></span></li> |
| + | </ul> |
| + | </div> |
| + | |
| + | <div class="panel_wrapper"> |
| + | <div id="general_panel" class="panel current"> |
| + | <h3>{#advanced_dlg.about_title}</h3> |
| + | <p>Version: <span id="version"></span> (<span id="date"></span>)</p> |
| + | <p>TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control released as Open Source under <a href="../../license.txt" target="_blank">LGPL</a> |
| + | by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.</p> |
| + | <p>Copyright © 2003-2008, <a href="http://www.moxiecode.com" target="_blank">Moxiecode Systems AB</a>, All rights reserved.</p> |
| + | <p>For more information about this software visit the <a href="http://tinymce.moxiecode.com" target="_blank">TinyMCE website</a>.</p> |
| + | |
| + | <div id="buttoncontainer"> |
| + | <a href="http://www.moxiecode.com" target="_blank"><img src="http://tinymce.moxiecode.com/images/gotmoxie.png" alt="Got Moxie?" border="0" /></a> |
| + | <a href="http://sourceforge.net/projects/tinymce/" target="_blank"><img src="http://sourceforge.net/sflogo.php?group_id=103281" alt="Hosted By Sourceforge" border="0" /></a> |
| + | <a href="http://www.freshmeat.net/projects/tinymce" target="_blank"><img src="http://tinymce.moxiecode.com/images/fm.gif" alt="Also on freshmeat" border="0" /></a> |
| + | </div> |
| + | </div> |
| + | |
| + | <div id="plugins_panel" class="panel"> |
| + | <div id="pluginscontainer"> |
| + | <h3>{#advanced_dlg.about_loaded}</h3> |
| + | |
| + | <div id="plugintablecontainer"> |
| + | </div> |
| + | |
| + | <p> </p> |
| + | </div> |
| + | </div> |
| + | |
| + | <div id="help_panel" class="panel noscroll" style="overflow: visible;"> |
| + | <div id="iframecontainer"></div> |
| + | </div> |
| + | </div> |
| + | |
| + | <div class="mceActionPanel"> |
| + | <input type="button" id="cancel" name="cancel" value="{#close}" onclick="tinyMCEPopup.close();" /> |
| + | </div> |
| + | </body> |
| + | </html> |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/anchor.htm
+26
-0
| @@ | @@ -0,0 +1,26 @@ |
| + | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
| + | <html xmlns="http://www.w3.org/1999/xhtml"> |
| + | <head> |
| + | <title>{#advanced_dlg.anchor_title}</title> |
| + | <script type="text/javascript" src="../../tiny_mce_popup.js"></script> |
| + | <script type="text/javascript" src="js/anchor.js"></script> |
| + | </head> |
| + | <body style="display: none"> |
| + | <form onsubmit="AnchorDialog.update();return false;" action="#"> |
| + | <table border="0" cellpadding="4" cellspacing="0"> |
| + | <tr> |
| + | <td colspan="2" class="title">{#advanced_dlg.anchor_title}</td> |
| + | </tr> |
| + | <tr> |
| + | <td class="nowrap">{#advanced_dlg.anchor_name}:</td> |
| + | <td><input name="anchorName" type="text" class="mceFocus" id="anchorName" value="" style="width: 200px" /></td> |
| + | </tr> |
| + | </table> |
| + | |
| + | <div class="mceActionPanel"> |
| + | <input type="submit" id="insert" name="insert" value="{#update}" /> |
| + | <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> |
| + | </div> |
| + | </form> |
| + | </body> |
| + | </html> |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/charmap.htm
+52
-0
| @@ | @@ -0,0 +1,52 @@ |
| + | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
| + | <html xmlns="http://www.w3.org/1999/xhtml"> |
| + | <head> |
| + | <title>{#advanced_dlg.charmap_title}</title> |
| + | <script type="text/javascript" src="../../tiny_mce_popup.js"></script> |
| + | <script type="text/javascript" src="js/charmap.js"></script> |
| + | </head> |
| + | <body id="charmap" style="display:none"> |
| + | <table align="center" border="0" cellspacing="0" cellpadding="2"> |
| + | <tr> |
| + | <td colspan="2" class="title">{#advanced_dlg.charmap_title}</td> |
| + | </tr> |
| + | <tr> |
| + | <td id="charmapView" rowspan="2" align="left" valign="top"> |
| + | <!-- Chars will be rendered here --> |
| + | </td> |
| + | <td width="100" align="center" valign="top"> |
| + | <table border="0" cellpadding="0" cellspacing="0" width="100" style="height:100px"> |
| + | <tr> |
| + | <td id="codeV"> </td> |
| + | </tr> |
| + | <tr> |
| + | <td id="codeN"> </td> |
| + | </tr> |
| + | </table> |
| + | </td> |
| + | </tr> |
| + | <tr> |
| + | <td valign="bottom" style="padding-bottom: 3px;"> |
| + | <table width="100" align="center" border="0" cellpadding="2" cellspacing="0"> |
| + | <tr> |
| + | <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;">HTML-Code</td> |
| + | </tr> |
| + | <tr> |
| + | <td style="font-size: 16px; font-weight: bold; border-left: 1px solid #666699; border-bottom: 1px solid #666699; border-right: 1px solid #666699;" id="codeA" align="center"> </td> |
| + | </tr> |
| + | <tr> |
| + | <td style="font-size: 1px;"> </td> |
| + | </tr> |
| + | <tr> |
| + | <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;">NUM-Code</td> |
| + | </tr> |
| + | <tr> |
| + | <td style="font-size: 16px; font-weight: bold; border-left: 1px solid #666699; border-bottom: 1px solid #666699; border-right: 1px solid #666699;" id="codeB" align="center"> </td> |
| + | </tr> |
| + | </table> |
| + | </td> |
| + | </tr> |
| + | </table> |
| + | |
| + | </body> |
| + | </html> |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/color_picker.htm
+73
-0
| @@ | @@ -0,0 +1,73 @@ |
| + | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
| + | <html xmlns="http://www.w3.org/1999/xhtml"> |
| + | <head> |
| + | <title>{#advanced_dlg.colorpicker_title}</title> |
| + | <script type="text/javascript" src="../../tiny_mce_popup.js"></script> |
| + | <script type="text/javascript" src="../../utils/mctabs.js"></script> |
| + | <script type="text/javascript" src="js/color_picker.js"></script> |
| + | </head> |
| + | <body id="colorpicker" style="display: none"> |
| + | <form onsubmit="insertAction();return false" action="#"> |
| + | <div class="tabs"> |
| + | <ul> |
| + | <li id="picker_tab" class="current"><span><a href="javascript:mcTabs.displayTab('picker_tab','picker_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_picker_tab}</a></span></li> |
| + | <li id="rgb_tab"><span><a href="javascript:;" onclick="generateWebColors();mcTabs.displayTab('rgb_tab','rgb_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_palette_tab}</a></span></li> |
| + | <li id="named_tab"><span><a href="javascript:;" onclick="generateNamedColors();javascript:mcTabs.displayTab('named_tab','named_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_named_tab}</a></span></li> |
| + | </ul> |
| + | </div> |
| + | |
| + | <div class="panel_wrapper"> |
| + | <div id="picker_panel" class="panel current"> |
| + | <fieldset> |
| + | <legend>{#advanced_dlg.colorpicker_picker_title}</legend> |
| + | <div id="picker"> |
| + | <img id="colors" src="img/colorpicker.jpg" onclick="computeColor(event)" onmousedown="isMouseDown = true;return false;" onmouseup="isMouseDown = false;" onmousemove="if (isMouseDown && isMouseOver) computeColor(event); return false;" onmouseover="isMouseOver=true;" onmouseout="isMouseOver=false;" alt="" /> |
| + | |
| + | <div id="light"> |
| + | <!-- Will be filled with divs --> |
| + | </div> |
| + | |
| + | <br style="clear: both" /> |
| + | </div> |
| + | </fieldset> |
| + | </div> |
| + | |
| + | <div id="rgb_panel" class="panel"> |
| + | <fieldset> |
| + | <legend>{#advanced_dlg.colorpicker_palette_title}</legend> |
| + | <div id="webcolors"> |
| + | <!-- Gets filled with web safe colors--> |
| + | </div> |
| + | |
| + | <br style="clear: both" /> |
| + | </fieldset> |
| + | </div> |
| + | |
| + | <div id="named_panel" class="panel"> |
| + | <fieldset> |
| + | <legend>{#advanced_dlg.colorpicker_named_title}</legend> |
| + | <div id="namedcolors"> |
| + | <!-- Gets filled with named colors--> |
| + | </div> |
| + | |
| + | <br style="clear: both" /> |
| + | |
| + | <div id="colornamecontainer"> |
| + | {#advanced_dlg.colorpicker_name} <span id="colorname"></span> |
| + | </div> |
| + | </fieldset> |
| + | </div> |
| + | </div> |
| + | |
| + | <div class="mceActionPanel"> |
| + | <input type="submit" id="insert" name="insert" value="{#apply}" /> |
| + | |
| + | <div id="preview"></div> |
| + | |
| + | <div id="previewblock"> |
| + | <label for="color">{#advanced_dlg.colorpicker_color}</label> <input id="color" type="text" size="8" maxlength="8" class="text mceFocus" /> |
| + | </div> |
| + | </div> |
| + | </form> |
| + | </body> |
| + | </html> |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/editor_template.js
+1
-0
| @@ | @@ -0,0 +1 @@ |
| + | (function(e){var d=e.DOM,b=e.dom.Event,h=e.extend,f=e.each,a=e.util.Cookie,g,c=e.explode;e.ThemeManager.requireLangPack("advanced");e.create("tinymce.themes.AdvancedTheme",{sizes:[8,10,12,14,18,24,36],controls:{bold:["bold_desc","Bold"],italic:["italic_desc","Italic"],underline:["underline_desc","Underline"],strikethrough:["striketrough_desc","Strikethrough"],justifyleft:["justifyleft_desc","JustifyLeft"],justifycenter:["justifycenter_desc","JustifyCenter"],justifyright:["justifyright_desc","JustifyRight"],justifyfull:["justifyfull_desc","JustifyFull"],bullist:["bullist_desc","InsertUnorderedList"],numlist:["numlist_desc","InsertOrderedList"],outdent:["outdent_desc","Outdent"],indent:["indent_desc","Indent"],cut:["cut_desc","Cut"],copy:["copy_desc","Copy"],paste:["paste_desc","Paste"],undo:["undo_desc","Undo"],redo:["redo_desc","Redo"],link:["link_desc","mceLink"],unlink:["unlink_desc","unlink"],image:["image_desc","mceImage"],cleanup:["cleanup_desc","mceCleanup"],help:["help_desc","mceHelp"],code:["code_desc","mceCodeEditor"],hr:["hr_desc","InsertHorizontalRule"],removeformat:["removeformat_desc","RemoveFormat"],sub:["sub_desc","subscript"],sup:["sup_desc","superscript"],forecolor:["forecolor_desc","ForeColor"],forecolorpicker:["forecolor_desc","mceForeColor"],backcolor:["backcolor_desc","HiliteColor"],backcolorpicker:["backcolor_desc","mceBackColor"],charmap:["charmap_desc","mceCharMap"],visualaid:["visualaid_desc","mceToggleVisualAid"],anchor:["anchor_desc","mceInsertAnchor"],newdocument:["newdocument_desc","mceNewDocument"],blockquote:["blockquote_desc","mceBlockQuote"]},stateControls:["bold","italic","underline","strikethrough","bullist","numlist","justifyleft","justifycenter","justifyright","justifyfull","sub","sup","blockquote"],init:function(j,k){var l=this,m,i,n;l.editor=j;l.url=k;l.onResolveName=new e.util.Dispatcher(this);l.settings=m=h({theme_advanced_path:true,theme_advanced_toolbar_location:"bottom",theme_advanced_buttons1:"bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,|,sub,sup,|,charmap",theme_advanced_blockformats:"p,address,pre,h1,h2,h3,h4,h5,h6",theme_advanced_toolbar_align:"center",theme_advanced_fonts:"Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",theme_advanced_more_colors:1,theme_advanced_row_height:23,theme_advanced_resize_horizontal:1,theme_advanced_resizing_use_cookie:1,theme_advanced_font_sizes:"1,2,3,4,5,6,7",readonly:j.settings.readonly},j.settings);if(!m.font_size_style_values){m.font_size_style_values="8pt,10pt,12pt,14pt,18pt,24pt,36pt"}if(e.is(m.theme_advanced_font_sizes,"string")){m.font_size_style_values=e.explode(m.font_size_style_values);m.font_size_classes=e.explode(m.font_size_classes||"");n={};j.settings.theme_advanced_font_sizes=m.theme_advanced_font_sizes;f(j.getParam("theme_advanced_font_sizes","","hash"),function(q,p){var o;if(p==q&&q>=1&&q<=7){p=q+" ("+l.sizes[q-1]+"pt)";o=m.font_size_classes[q-1];q=m.font_size_style_values[q-1]||(l.sizes[q-1]+"pt")}if(/^\s*\./.test(q)){o=q.replace(/\./g,"")}n[p]=o?{"class":o}:{fontSize:q}});m.theme_advanced_font_sizes=n}if((i=m.theme_advanced_path_location)&&i!="none"){m.theme_advanced_statusbar_location=m.theme_advanced_path_location}if(m.theme_advanced_statusbar_location=="none"){m.theme_advanced_statusbar_location=0}j.onInit.add(function(){if(!j.settings.readonly){j.onNodeChange.add(l._nodeChanged,l)}if(j.settings.content_css!==false){j.dom.loadCSS(j.baseURI.toAbsolute("themes/advanced/skins/"+j.settings.skin+"/content.css"))}});j.onSetProgressState.add(function(q,o,r){var s,t=q.id,p;if(o){l.progressTimer=setTimeout(function(){s=q.getContainer();s=s.insertBefore(d.create("DIV",{style:"position:relative"}),s.firstChild);p=d.get(q.id+"_tbl");d.add(s,"div",{id:t+"_blocker","class":"mceBlocker",style:{width:p.clientWidth+2,height:p.clientHeight+2}});d.add(s,"div",{id:t+"_progress","class":"mceProgress",style:{left:p.clientWidth/2,top:p.clientHeight/2}})},r||0)}else{d.remove(t+"_blocker");d.remove(t+"_progress");clearTimeout(l.progressTimer)}});d.loadCSS(m.editor_css?j.documentBaseURI.toAbsolute(m.editor_css):k+"/skins/"+j.settings.skin+"/ui.css");if(m.skin_variant){d.loadCSS(k+"/skins/"+j.settings.skin+"/ui_"+m.skin_variant+".css")}},createControl:function(l,i){var j,k;if(k=i.createControl(l)){return k}switch(l){case"styleselect":return this._createStyleSelect();case"formatselect":return this._createBlockFormats();case"fontselect":return this._createFontSelect();case"fontsizeselect":return this._createFontSizeSelect();case"forecolor":return this._createForeColorMenu();case"backcolor":return this._createBackColorMenu()}if((j=this.controls[l])){return i.createButton(l,{title:"advanced."+j[0],cmd:j[1],ui:j[2],value:j[3]})}},execCommand:function(k,j,l){var i=this["_"+k];if(i){i.call(this,j,l);return true}return false},_importClasses:function(k){var i=this.editor,j=i.controlManager.get("styleselect");if(j.getLength()==0){f(i.dom.getClasses(),function(n,l){var m="style_"+l;i.formatter.register(m,{inline:"span",attributes:{"class":n["class"]},selector:"*"});j.add(n["class"],m)})}},_createStyleSelect:function(m){var k=this,i=k.editor,j=i.controlManager,l;l=j.createListBox("styleselect",{title:"advanced.style_select",onselect:function(o){var p,n=[];f(l.items,function(q){n.push(q.value)});i.focus();i.undoManager.add();p=i.formatter.matchAll(n);if(!o||p[0]==o){i.formatter.remove(p[0])}else{i.formatter.apply(o)}i.undoManager.add();i.nodeChanged();return false}});i.onInit.add(function(){var o=0,n=i.getParam("style_formats");if(n){f(n,function(p){var q,r=0;f(p,function(){r++});if(r>1){q=p.name=p.name||"style_"+(o++);i.formatter.register(q,p);l.add(p.title,q)}else{l.add(p.title)}})}else{f(i.getParam("theme_advanced_styles","","hash"),function(r,q){var p;if(r){p="style_"+(o++);i.formatter.register(p,{inline:"span",classes:r,selector:"*"});l.add(k.editor.translate(q),p)}})}});if(l.getLength()==0){l.onPostRender.add(function(o,p){if(!l.NativeListBox){b.add(p.id+"_text","focus",k._importClasses,k);b.add(p.id+"_text","mousedown",k._importClasses,k);b.add(p.id+"_open","focus",k._importClasses,k);b.add(p.id+"_open","mousedown",k._importClasses,k)}else{b.add(p.id,"focus",k._importClasses,k)}})}return l},_createFontSelect:function(){var k,j=this,i=j.editor;k=i.controlManager.createListBox("fontselect",{title:"advanced.fontdefault",onselect:function(l){var m=k.items[k.selectedIndex];if(!l&&m){i.execCommand("FontName",false,m.value);return}i.execCommand("FontName",false,l);k.select(function(n){return l==n});return false}});if(k){f(i.getParam("theme_advanced_fonts",j.settings.theme_advanced_fonts,"hash"),function(m,l){k.add(i.translate(l),m,{style:m.indexOf("dings")==-1?"font-family:"+m:""})})}return k},_createFontSizeSelect:function(){var m=this,k=m.editor,n,l=0,j=[];n=k.controlManager.createListBox("fontsizeselect",{title:"advanced.font_size",onselect:function(i){var o=n.items[n.selectedIndex];if(!i&&o){o=o.value;if(o["class"]){k.formatter.toggle("fontsize_class",{value:o["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,o.fontSize)}return}if(i["class"]){k.focus();k.undoManager.add();k.formatter.toggle("fontsize_class",{value:i["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,i.fontSize)}n.select(function(p){return i==p});return false}});if(n){f(m.settings.theme_advanced_font_sizes,function(o,i){var p=o.fontSize;if(p>=1&&p<=7){p=m.sizes[parseInt(p)-1]+"pt"}n.add(i,o,{style:"font-size:"+p,"class":"mceFontSize"+(l++)+(" "+(o["class"]||""))})})}return n},_createBlockFormats:function(){var k,i={p:"advanced.paragraph",address:"advanced.address",pre:"advanced.pre",h1:"advanced.h1",h2:"advanced.h2",h3:"advanced.h3",h4:"advanced.h4",h5:"advanced.h5",h6:"advanced.h6",div:"advanced.div",blockquote:"advanced.blockquote",code:"advanced.code",dt:"advanced.dt",dd:"advanced.dd",samp:"advanced.samp"},j=this;k=j.editor.controlManager.createListBox("formatselect",{title:"advanced.block",cmd:"FormatBlock"});if(k){f(j.editor.getParam("theme_advanced_blockformats",j.settings.theme_advanced_blockformats,"hash"),function(m,l){k.add(j.editor.translate(l!=m?l:i[m]),m,{"class":"mce_formatPreview mce_"+m})})}return k},_createForeColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_text_colors){l.colors=i}if(k.theme_advanced_default_foreground_color){l.default_color=k.theme_advanced_default_foreground_color}l.title="advanced.forecolor_desc";l.cmd="ForeColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("forecolor",l);return m},_createBackColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_background_colors){l.colors=i}if(k.theme_advanced_default_background_color){l.default_color=k.theme_advanced_default_background_color}l.title="advanced.backcolor_desc";l.cmd="HiliteColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("backcolor",l);return m},renderUI:function(k){var m,l,q,v=this,r=v.editor,w=v.settings,u,j,i;m=j=d.create("span",{id:r.id+"_parent","class":"mceEditor "+r.settings.skin+"Skin"+(w.skin_variant?" "+r.settings.skin+"Skin"+v._ufirst(w.skin_variant):"")});if(!d.boxModel){m=d.add(m,"div",{"class":"mceOldBoxModel"})}m=u=d.add(m,"table",{id:r.id+"_tbl","class":"mceLayout",cellSpacing:0,cellPadding:0});m=q=d.add(m,"tbody");switch((w.theme_advanced_layout_manager||"").toLowerCase()){case"rowlayout":l=v._rowLayout(w,q,k);break;case"customlayout":l=r.execCallback("theme_advanced_custom_layout",w,q,k,j);break;default:l=v._simpleLayout(w,q,k,j)}m=k.targetNode;i=d.stdMode?u.getElementsByTagName("tr"):u.rows;d.addClass(i[0],"mceFirst");d.addClass(i[i.length-1],"mceLast");f(d.select("tr",q),function(o){d.addClass(o.firstChild,"mceFirst");d.addClass(o.childNodes[o.childNodes.length-1],"mceLast")});if(d.get(w.theme_advanced_toolbar_container)){d.get(w.theme_advanced_toolbar_container).appendChild(j)}else{d.insertAfter(j,m)}b.add(r.id+"_path_row","click",function(n){n=n.target;if(n.nodeName=="A"){v._sel(n.className.replace(/^.*mcePath_([0-9]+).*$/,"$1"));return b.cancel(n)}});if(!r.getParam("accessibility_focus")){b.add(d.add(j,"a",{href:"#"},"<!-- IE -->"),"focus",function(){tinyMCE.get(r.id).focus()})}if(w.theme_advanced_toolbar_location=="external"){k.deltaHeight=0}v.deltaHeight=k.deltaHeight;k.targetNode=null;return{iframeContainer:l,editorContainer:r.id+"_parent",sizeContainer:u,deltaHeight:k.deltaHeight}},getInfo:function(){return{longname:"Advanced theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:e.majorVersion+"."+e.minorVersion}},resizeBy:function(i,j){var k=d.get(this.editor.id+"_tbl");this.resizeTo(k.clientWidth+i,k.clientHeight+j)},resizeTo:function(i,l){var j=this.editor,k=this.settings,m=d.get(j.id+"_tbl"),n=d.get(j.id+"_ifr");i=Math.max(k.theme_advanced_resizing_min_width||100,i);l=Math.max(k.theme_advanced_resizing_min_height||100,l);i=Math.min(k.theme_advanced_resizing_max_width||65535,i);l=Math.min(k.theme_advanced_resizing_max_height||65535,l);d.setStyle(m,"height","");d.setStyle(n,"height",l);if(k.theme_advanced_resize_horizontal){d.setStyle(m,"width","");d.setStyle(n,"width",i);if(i<m.clientWidth){d.setStyle(n,"width",m.clientWidth)}}},destroy:function(){var i=this.editor.id;b.clear(i+"_resize");b.clear(i+"_path_row");b.clear(i+"_external_close")},_simpleLayout:function(y,r,k,i){var x=this,u=x.editor,v=y.theme_advanced_toolbar_location,m=y.theme_advanced_statusbar_location,l,j,q,w;if(y.readonly){l=d.add(r,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"});return j}if(v=="top"){x._addToolbars(r,k)}if(v=="external"){l=w=d.create("div",{style:"position:relative"});l=d.add(l,"div",{id:u.id+"_external","class":"mceExternalToolbar"});d.add(l,"a",{id:u.id+"_external_close",href:"javascript:;","class":"mceExternalClose"});l=d.add(l,"table",{id:u.id+"_tblext",cellSpacing:0,cellPadding:0});q=d.add(l,"tbody");if(i.firstChild.className=="mceOldBoxModel"){i.firstChild.appendChild(w)}else{i.insertBefore(w,i.firstChild)}x._addToolbars(q,k);u.onMouseUp.add(function(){var o=d.get(u.id+"_external");d.show(o);d.hide(g);var n=b.add(u.id+"_external_close","click",function(){d.hide(u.id+"_external");b.remove(u.id+"_external_close","click",n)});d.show(o);d.setStyle(o,"top",0-d.getRect(u.id+"_tblext").h-1);d.hide(o);d.show(o);o.style.filter="";g=u.id+"_external";o=null})}if(m=="top"){x._addStatusBar(r,k)}if(!y.theme_advanced_toolbar_container){l=d.add(r,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"})}if(v=="bottom"){x._addToolbars(r,k)}if(m=="bottom"){x._addStatusBar(r,k)}return j},_rowLayout:function(w,m,k){var v=this,p=v.editor,u,x,i=p.controlManager,l,j,r,q;u=w.theme_advanced_containers_default_class||"";x=w.theme_advanced_containers_default_align||"center";f(c(w.theme_advanced_containers||""),function(s,o){var n=w["theme_advanced_container_"+s]||"";switch(n.toLowerCase()){case"mceeditor":l=d.add(m,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"});break;case"mceelementpath":v._addStatusBar(m,k);break;default:q=(w["theme_advanced_container_"+s+"_align"]||x).toLowerCase();q="mce"+v._ufirst(q);l=d.add(d.add(m,"tr"),"td",{"class":"mceToolbar "+(w["theme_advanced_container_"+s+"_class"]||u)+" "+q||x});r=i.createToolbar("toolbar"+o);v._addControls(n,r);d.setHTML(l,r.renderHTML());k.deltaHeight-=w.theme_advanced_row_height}});return j},_addControls:function(j,i){var k=this,l=k.settings,m,n=k.editor.controlManager;if(l.theme_advanced_disable&&!k._disabled){m={};f(c(l.theme_advanced_disable),function(o){m[o]=1});k._disabled=m}else{m=k._disabled}f(c(j),function(p){var o;if(m&&m[p]){return}if(p=="tablecontrols"){f(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"],function(q){q=k.createControl(q,n);if(q){i.add(q)}});return}o=k.createControl(p,n);if(o){i.add(o)}})},_addToolbars:function(w,k){var z=this,p,m,r=z.editor,A=z.settings,y,j=r.controlManager,u,l,q=[],x;x=A.theme_advanced_toolbar_align.toLowerCase();x="mce"+z._ufirst(x);l=d.add(d.add(w,"tr"),"td",{"class":"mceToolbar "+x});if(!r.getParam("accessibility_focus")){q.push(d.createHTML("a",{href:"#",onfocus:"tinyMCE.get('"+r.id+"').focus();"},"<!-- IE -->"))}q.push(d.createHTML("a",{href:"#",accesskey:"q",title:r.getLang("advanced.toolbar_focus")},"<!-- IE -->"));for(p=1;(y=A["theme_advanced_buttons"+p]);p++){m=j.createToolbar("toolbar"+p,{"class":"mceToolbarRow"+p});if(A["theme_advanced_buttons"+p+"_add"]){y+=","+A["theme_advanced_buttons"+p+"_add"]}if(A["theme_advanced_buttons"+p+"_add_before"]){y=A["theme_advanced_buttons"+p+"_add_before"]+","+y}z._addControls(y,m);q.push(m.renderHTML());k.deltaHeight-=A.theme_advanced_row_height}q.push(d.createHTML("a",{href:"#",accesskey:"z",title:r.getLang("advanced.toolbar_focus"),onfocus:"tinyMCE.getInstanceById('"+r.id+"').focus();"},"<!-- IE -->"));d.setHTML(l,q.join(""))},_addStatusBar:function(m,j){var k,v=this,p=v.editor,w=v.settings,i,q,u,l;k=d.add(m,"tr");k=l=d.add(k,"td",{"class":"mceStatusbar"});k=d.add(k,"div",{id:p.id+"_path_row"},w.theme_advanced_path?p.translate("advanced.path")+": ":" ");d.add(k,"a",{href:"#",accesskey:"x"});if(w.theme_advanced_resizing){d.add(l,"a",{id:p.id+"_resize",href:"javascript:;",onclick:"return false;","class":"mceResize"});if(w.theme_advanced_resizing_use_cookie){p.onPostRender.add(function(){var n=a.getHash("TinyMCE_"+p.id+"_size"),r=d.get(p.id+"_tbl");if(!n){return}v.resizeTo(n.cw,n.ch)})}p.onPostRender.add(function(){b.add(p.id+"_resize","mousedown",function(D){var t,r,s,o,C,z,A,F,n,E,x;function y(G){n=A+(G.screenX-C);E=F+(G.screenY-z);v.resizeTo(n,E)}function B(G){b.remove(d.doc,"mousemove",t);b.remove(p.getDoc(),"mousemove",r);b.remove(d.doc,"mouseup",s);b.remove(p.getDoc(),"mouseup",o);if(w.theme_advanced_resizing_use_cookie){a.setHash("TinyMCE_"+p.id+"_size",{cw:n,ch:E})}}D.preventDefault();C=D.screenX;z=D.screenY;x=d.get(v.editor.id+"_ifr");A=n=x.clientWidth;F=E=x.clientHeight;t=b.add(d.doc,"mousemove",y);r=b.add(p.getDoc(),"mousemove",y);s=b.add(d.doc,"mouseup",B);o=b.add(p.getDoc(),"mouseup",B)})})}j.deltaHeight-=21;k=m=null},_nodeChanged:function(r,z,l,x,j){var C=this,i,y=0,B,u,D=C.settings,A,k,w,m,q;e.each(C.stateControls,function(n){z.setActive(n,r.queryCommandState(C.controls[n][1]))});function o(p){var s,n=j.parents,t=p;if(typeof(p)=="string"){t=function(v){return v.nodeName==p}}for(s=0;s<n.length;s++){if(t(n[s])){return n[s]}}}z.setActive("visualaid",r.hasVisual);z.setDisabled("undo",!r.undoManager.hasUndo()&&!r.typing);z.setDisabled("redo",!r.undoManager.hasRedo());z.setDisabled("outdent",!r.queryCommandState("Outdent"));i=o("A");if(u=z.get("link")){if(!i||!i.name){u.setDisabled(!i&&x);u.setActive(!!i)}}if(u=z.get("unlink")){u.setDisabled(!i&&x);u.setActive(!!i&&!i.name)}if(u=z.get("anchor")){u.setActive(!!i&&i.name)}i=o("IMG");if(u=z.get("image")){u.setActive(!!i&&l.className.indexOf("mceItem")==-1)}if(u=z.get("styleselect")){C._importClasses();m=[];f(u.items,function(n){m.push(n.value)});q=r.formatter.matchAll(m);u.select(q[0])}if(u=z.get("formatselect")){i=o(d.isBlock);if(i){u.select(i.nodeName.toLowerCase())}}o(function(p){if(p.nodeName==="SPAN"){if(!A&&p.className){A=p.className}if(!k&&p.style.fontSize){k=p.style.fontSize}if(!w&&p.style.fontFamily){w=p.style.fontFamily.replace(/[\"\']+/g,"").replace(/^([^,]+).*/,"$1").toLowerCase()}}return false});if(u=z.get("fontselect")){u.select(function(n){return n.replace(/^([^,]+).*/,"$1").toLowerCase()==w})}if(u=z.get("fontsizeselect")){if(D.theme_advanced_runtime_fontsize&&!k&&!A){k=r.dom.getStyle(l,"fontSize",true)}u.select(function(n){if(n.fontSize&&n.fontSize===k){return true}if(n["class"]&&n["class"]===A){return true}})}if(D.theme_advanced_path&&D.theme_advanced_statusbar_location){i=d.get(r.id+"_path")||d.add(r.id+"_path_row","span",{id:r.id+"_path"});d.setHTML(i,"");o(function(E){var p=E.nodeName.toLowerCase(),s,v,t="";if(E.nodeType!=1||E.nodeName==="BR"||(d.hasClass(E,"mceItemHidden")||d.hasClass(E,"mceItemRemoved"))){return}if(B=d.getAttrib(E,"mce_name")){p=B}if(e.isIE&&E.scopeName!=="HTML"){p=E.scopeName+":"+p}p=p.replace(/mce\:/g,"");switch(p){case"b":p="strong";break;case"i":p="em";break;case"img":if(B=d.getAttrib(E,"src")){t+="src: "+B+" "}break;case"a":if(B=d.getAttrib(E,"name")){t+="name: "+B+" ";p+="#"+B}if(B=d.getAttrib(E,"href")){t+="href: "+B+" "}break;case"font":if(B=d.getAttrib(E,"face")){t+="font: "+B+" "}if(B=d.getAttrib(E,"size")){t+="size: "+B+" "}if(B=d.getAttrib(E,"color")){t+="color: "+B+" "}break;case"span":if(B=d.getAttrib(E,"style")){t+="style: "+B+" "}break}if(B=d.getAttrib(E,"id")){t+="id: "+B+" "}if(B=E.className){B=B.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g,"");if(B){t+="class: "+B+" ";if(d.isBlock(E)||p=="img"||p=="span"){p+="."+B}}}p=p.replace(/(html:)/g,"");p={name:p,node:E,title:t};C.onResolveName.dispatch(C,p);t=p.title;p=p.name;v=d.create("a",{href:"javascript:;",onmousedown:"return false;",title:t,"class":"mcePath_"+(y++)},p);if(i.hasChildNodes()){i.insertBefore(d.doc.createTextNode(" \u00bb "),i.firstChild);i.insertBefore(v,i.firstChild)}else{i.appendChild(v)}},r.getBody())}},_sel:function(i){this.editor.execCommand("mceSelectNodeDepth",false,i)},_mceInsertAnchor:function(k,j){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/anchor.htm",width:320+parseInt(i.getLang("advanced.anchor_delta_width",0)),height:90+parseInt(i.getLang("advanced.anchor_delta_height",0)),inline:true},{theme_url:this.url})},_mceCharMap:function(){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/charmap.htm",width:550+parseInt(i.getLang("advanced.charmap_delta_width",0)),height:250+parseInt(i.getLang("advanced.charmap_delta_height",0)),inline:true},{theme_url:this.url})},_mceHelp:function(){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/about.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceColorPicker:function(k,j){var i=this.editor;j=j||{};i.windowManager.open({url:e.baseURL+"/themes/advanced/color_picker.htm",width:375+parseInt(i.getLang("advanced.colorpicker_delta_width",0)),height:250+parseInt(i.getLang("advanced.colorpicker_delta_height",0)),close_previous:false,inline:true},{input_color:j.color,func:j.func,theme_url:this.url})},_mceCodeEditor:function(j,k){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/source_editor.htm",width:parseInt(i.getParam("theme_advanced_source_editor_width",720)),height:parseInt(i.getParam("theme_advanced_source_editor_height",580)),inline:true,resizable:true,maximizable:true},{theme_url:this.url})},_mceImage:function(j,k){var i=this.editor;if(i.dom.getAttrib(i.selection.getNode(),"class").indexOf("mceItem")!=-1){return}i.windowManager.open({url:e.baseURL+"/themes/advanced/image.htm",width:355+parseInt(i.getLang("advanced.image_delta_width",0)),height:275+parseInt(i.getLang("advanced.image_delta_height",0)),inline:true},{theme_url:this.url})},_mceLink:function(j,k){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/link.htm",width:310+parseInt(i.getLang("advanced.link_delta_width",0)),height:200+parseInt(i.getLang("advanced.link_delta_height",0)),inline:true},{theme_url:this.url})},_mceNewDocument:function(){var i=this.editor;i.windowManager.confirm("advanced.newdocument",function(j){if(j){i.execCommand("mceSetContent",false,"")}})},_mceForeColor:function(){var i=this;this._mceColorPicker(0,{color:i.fgColor,func:function(j){i.fgColor=j;i.editor.execCommand("ForeColor",false,j)}})},_mceBackColor:function(){var i=this;this._mceColorPicker(0,{color:i.bgColor,func:function(j){i.bgColor=j;i.editor.execCommand("HiliteColor",false,j)}})},_ufirst:function(i){return i.substring(0,1).toUpperCase()+i.substring(1)}});e.ThemeManager.add("advanced",e.themes.AdvancedTheme)}(tinymce)); |
| \ No newline at end of file | |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/editor_template_src.js
+1217
-0
| @@ | @@ -0,0 +1,1217 @@ |
| + | /** |
| + | * editor_template_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) { |
| + | var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, each = tinymce.each, Cookie = tinymce.util.Cookie, lastExtID, explode = tinymce.explode; |
| + | |
| + | // Tell it to load theme specific language pack(s) |
| + | tinymce.ThemeManager.requireLangPack('advanced'); |
| + | |
| + | tinymce.create('tinymce.themes.AdvancedTheme', { |
| + | sizes : [8, 10, 12, 14, 18, 24, 36], |
| + | |
| + | // Control name lookup, format: title, command |
| + | controls : { |
| + | bold : ['bold_desc', 'Bold'], |
| + | italic : ['italic_desc', 'Italic'], |
| + | underline : ['underline_desc', 'Underline'], |
| + | strikethrough : ['striketrough_desc', 'Strikethrough'], |
| + | justifyleft : ['justifyleft_desc', 'JustifyLeft'], |
| + | justifycenter : ['justifycenter_desc', 'JustifyCenter'], |
| + | justifyright : ['justifyright_desc', 'JustifyRight'], |
| + | justifyfull : ['justifyfull_desc', 'JustifyFull'], |
| + | bullist : ['bullist_desc', 'InsertUnorderedList'], |
| + | numlist : ['numlist_desc', 'InsertOrderedList'], |
| + | outdent : ['outdent_desc', 'Outdent'], |
| + | indent : ['indent_desc', 'Indent'], |
| + | cut : ['cut_desc', 'Cut'], |
| + | copy : ['copy_desc', 'Copy'], |
| + | paste : ['paste_desc', 'Paste'], |
| + | undo : ['undo_desc', 'Undo'], |
| + | redo : ['redo_desc', 'Redo'], |
| + | link : ['link_desc', 'mceLink'], |
| + | unlink : ['unlink_desc', 'unlink'], |
| + | image : ['image_desc', 'mceImage'], |
| + | cleanup : ['cleanup_desc', 'mceCleanup'], |
| + | help : ['help_desc', 'mceHelp'], |
| + | code : ['code_desc', 'mceCodeEditor'], |
| + | hr : ['hr_desc', 'InsertHorizontalRule'], |
| + | removeformat : ['removeformat_desc', 'RemoveFormat'], |
| + | sub : ['sub_desc', 'subscript'], |
| + | sup : ['sup_desc', 'superscript'], |
| + | forecolor : ['forecolor_desc', 'ForeColor'], |
| + | forecolorpicker : ['forecolor_desc', 'mceForeColor'], |
| + | backcolor : ['backcolor_desc', 'HiliteColor'], |
| + | backcolorpicker : ['backcolor_desc', 'mceBackColor'], |
| + | charmap : ['charmap_desc', 'mceCharMap'], |
| + | visualaid : ['visualaid_desc', 'mceToggleVisualAid'], |
| + | anchor : ['anchor_desc', 'mceInsertAnchor'], |
| + | newdocument : ['newdocument_desc', 'mceNewDocument'], |
| + | blockquote : ['blockquote_desc', 'mceBlockQuote'] |
| + | }, |
| + | |
| + | stateControls : ['bold', 'italic', 'underline', 'strikethrough', 'bullist', 'numlist', 'justifyleft', 'justifycenter', 'justifyright', 'justifyfull', 'sub', 'sup', 'blockquote'], |
| + | |
| + | init : function(ed, url) { |
| + | var t = this, s, v, o; |
| + | |
| + | t.editor = ed; |
| + | t.url = url; |
| + | t.onResolveName = new tinymce.util.Dispatcher(this); |
| + | |
| + | // Default settings |
| + | t.settings = s = extend({ |
| + | theme_advanced_path : true, |
| + | theme_advanced_toolbar_location : 'bottom', |
| + | theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect", |
| + | theme_advanced_buttons2 : "bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code", |
| + | theme_advanced_buttons3 : "hr,removeformat,visualaid,|,sub,sup,|,charmap", |
| + | theme_advanced_blockformats : "p,address,pre,h1,h2,h3,h4,h5,h6", |
| + | theme_advanced_toolbar_align : "center", |
| + | theme_advanced_fonts : "Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats", |
| + | theme_advanced_more_colors : 1, |
| + | theme_advanced_row_height : 23, |
| + | theme_advanced_resize_horizontal : 1, |
| + | theme_advanced_resizing_use_cookie : 1, |
| + | theme_advanced_font_sizes : "1,2,3,4,5,6,7", |
| + | readonly : ed.settings.readonly |
| + | }, ed.settings); |
| + | |
| + | // Setup default font_size_style_values |
| + | if (!s.font_size_style_values) |
| + | s.font_size_style_values = "8pt,10pt,12pt,14pt,18pt,24pt,36pt"; |
| + | |
| + | if (tinymce.is(s.theme_advanced_font_sizes, 'string')) { |
| + | s.font_size_style_values = tinymce.explode(s.font_size_style_values); |
| + | s.font_size_classes = tinymce.explode(s.font_size_classes || ''); |
| + | |
| + | // Parse string value |
| + | o = {}; |
| + | ed.settings.theme_advanced_font_sizes = s.theme_advanced_font_sizes; |
| + | each(ed.getParam('theme_advanced_font_sizes', '', 'hash'), function(v, k) { |
| + | var cl; |
| + | |
| + | if (k == v && v >= 1 && v <= 7) { |
| + | k = v + ' (' + t.sizes[v - 1] + 'pt)'; |
| + | cl = s.font_size_classes[v - 1]; |
| + | v = s.font_size_style_values[v - 1] || (t.sizes[v - 1] + 'pt'); |
| + | } |
| + | |
| + | if (/^\s*\./.test(v)) |
| + | cl = v.replace(/\./g, ''); |
| + | |
| + | o[k] = cl ? {'class' : cl} : {fontSize : v}; |
| + | }); |
| + | |
| + | s.theme_advanced_font_sizes = o; |
| + | } |
| + | |
| + | if ((v = s.theme_advanced_path_location) && v != 'none') |
| + | s.theme_advanced_statusbar_location = s.theme_advanced_path_location; |
| + | |
| + | if (s.theme_advanced_statusbar_location == 'none') |
| + | s.theme_advanced_statusbar_location = 0; |
| + | |
| + | // Init editor |
| + | ed.onInit.add(function() { |
| + | if (!ed.settings.readonly) |
| + | ed.onNodeChange.add(t._nodeChanged, t); |
| + | |
| + | if (ed.settings.content_css !== false) |
| + | ed.dom.loadCSS(ed.baseURI.toAbsolute("themes/advanced/skins/" + ed.settings.skin + "/content.css")); |
| + | }); |
| + | |
| + | ed.onSetProgressState.add(function(ed, b, ti) { |
| + | var co, id = ed.id, tb; |
| + | |
| + | if (b) { |
| + | t.progressTimer = setTimeout(function() { |
| + | co = ed.getContainer(); |
| + | co = co.insertBefore(DOM.create('DIV', {style : 'position:relative'}), co.firstChild); |
| + | tb = DOM.get(ed.id + '_tbl'); |
| + | |
| + | DOM.add(co, 'div', {id : id + '_blocker', 'class' : 'mceBlocker', style : {width : tb.clientWidth + 2, height : tb.clientHeight + 2}}); |
| + | DOM.add(co, 'div', {id : id + '_progress', 'class' : 'mceProgress', style : {left : tb.clientWidth / 2, top : tb.clientHeight / 2}}); |
| + | }, ti || 0); |
| + | } else { |
| + | DOM.remove(id + '_blocker'); |
| + | DOM.remove(id + '_progress'); |
| + | clearTimeout(t.progressTimer); |
| + | } |
| + | }); |
| + | |
| + | DOM.loadCSS(s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : url + "/skins/" + ed.settings.skin + "/ui.css"); |
| + | |
| + | if (s.skin_variant) |
| + | DOM.loadCSS(url + "/skins/" + ed.settings.skin + "/ui_" + s.skin_variant + ".css"); |
| + | }, |
| + | |
| + | createControl : function(n, cf) { |
| + | var cd, c; |
| + | |
| + | if (c = cf.createControl(n)) |
| + | return c; |
| + | |
| + | switch (n) { |
| + | case "styleselect": |
| + | return this._createStyleSelect(); |
| + | |
| + | case "formatselect": |
| + | return this._createBlockFormats(); |
| + | |
| + | case "fontselect": |
| + | return this._createFontSelect(); |
| + | |
| + | case "fontsizeselect": |
| + | return this._createFontSizeSelect(); |
| + | |
| + | case "forecolor": |
| + | return this._createForeColorMenu(); |
| + | |
| + | case "backcolor": |
| + | return this._createBackColorMenu(); |
| + | } |
| + | |
| + | if ((cd = this.controls[n])) |
| + | return cf.createButton(n, {title : "advanced." + cd[0], cmd : cd[1], ui : cd[2], value : cd[3]}); |
| + | }, |
| + | |
| + | execCommand : function(cmd, ui, val) { |
| + | var f = this['_' + cmd]; |
| + | |
| + | if (f) { |
| + | f.call(this, ui, val); |
| + | return true; |
| + | } |
| + | |
| + | return false; |
| + | }, |
| + | |
| + | _importClasses : function(e) { |
| + | var ed = this.editor, ctrl = ed.controlManager.get('styleselect'); |
| + | |
| + | if (ctrl.getLength() == 0) { |
| + | each(ed.dom.getClasses(), function(o, idx) { |
| + | var name = 'style_' + idx; |
| + | |
| + | ed.formatter.register(name, { |
| + | inline : 'span', |
| + | attributes : {'class' : o['class']}, |
| + | selector : '*' |
| + | }); |
| + | |
| + | ctrl.add(o['class'], name); |
| + | }); |
| + | } |
| + | }, |
| + | |
| + | _createStyleSelect : function(n) { |
| + | var t = this, ed = t.editor, ctrlMan = ed.controlManager, ctrl; |
| + | |
| + | // Setup style select box |
| + | ctrl = ctrlMan.createListBox('styleselect', { |
| + | title : 'advanced.style_select', |
| + | onselect : function(name) { |
| + | var matches, formatNames = []; |
| + | |
| + | each(ctrl.items, function(item) { |
| + | formatNames.push(item.value); |
| + | }); |
| + | |
| + | ed.focus(); |
| + | ed.undoManager.add(); |
| + | |
| + | // Toggle off the current format |
| + | matches = ed.formatter.matchAll(formatNames); |
| + | if (!name || matches[0] == name) |
| + | ed.formatter.remove(matches[0]); |
| + | else |
| + | ed.formatter.apply(name); |
| + | |
| + | ed.undoManager.add(); |
| + | ed.nodeChanged(); |
| + | |
| + | return false; // No auto select |
| + | } |
| + | }); |
| + | |
| + | // Handle specified format |
| + | ed.onInit.add(function() { |
| + | var counter = 0, formats = ed.getParam('style_formats'); |
| + | |
| + | if (formats) { |
| + | each(formats, function(fmt) { |
| + | var name, keys = 0; |
| + | |
| + | each(fmt, function() {keys++;}); |
| + | |
| + | if (keys > 1) { |
| + | name = fmt.name = fmt.name || 'style_' + (counter++); |
| + | ed.formatter.register(name, fmt); |
| + | ctrl.add(fmt.title, name); |
| + | } else |
| + | ctrl.add(fmt.title); |
| + | }); |
| + | } else { |
| + | each(ed.getParam('theme_advanced_styles', '', 'hash'), function(val, key) { |
| + | var name; |
| + | |
| + | if (val) { |
| + | name = 'style_' + (counter++); |
| + | |
| + | ed.formatter.register(name, { |
| + | inline : 'span', |
| + | classes : val, |
| + | selector : '*' |
| + | }); |
| + | |
| + | ctrl.add(t.editor.translate(key), name); |
| + | } |
| + | }); |
| + | } |
| + | }); |
| + | |
| + | // Auto import classes if the ctrl box is empty |
| + | if (ctrl.getLength() == 0) { |
| + | ctrl.onPostRender.add(function(ed, n) { |
| + | if (!ctrl.NativeListBox) { |
| + | Event.add(n.id + '_text', 'focus', t._importClasses, t); |
| + | Event.add(n.id + '_text', 'mousedown', t._importClasses, t); |
| + | Event.add(n.id + '_open', 'focus', t._importClasses, t); |
| + | Event.add(n.id + '_open', 'mousedown', t._importClasses, t); |
| + | } else |
| + | Event.add(n.id, 'focus', t._importClasses, t); |
| + | }); |
| + | } |
| + | |
| + | return ctrl; |
| + | }, |
| + | |
| + | _createFontSelect : function() { |
| + | var c, t = this, ed = t.editor; |
| + | |
| + | c = ed.controlManager.createListBox('fontselect', { |
| + | title : 'advanced.fontdefault', |
| + | onselect : function(v) { |
| + | var cur = c.items[c.selectedIndex]; |
| + | |
| + | if (!v && cur) { |
| + | ed.execCommand('FontName', false, cur.value); |
| + | return; |
| + | } |
| + | |
| + | ed.execCommand('FontName', false, v); |
| + | |
| + | // Fake selection, execCommand will fire a nodeChange and update the selection |
| + | c.select(function(sv) { |
| + | return v == sv; |
| + | }); |
| + | |
| + | return false; // No auto select |
| + | } |
| + | }); |
| + | |
| + | if (c) { |
| + | each(ed.getParam('theme_advanced_fonts', t.settings.theme_advanced_fonts, 'hash'), function(v, k) { |
| + | c.add(ed.translate(k), v, {style : v.indexOf('dings') == -1 ? 'font-family:' + v : ''}); |
| + | }); |
| + | } |
| + | |
| + | return c; |
| + | }, |
| + | |
| + | _createFontSizeSelect : function() { |
| + | var t = this, ed = t.editor, c, i = 0, cl = []; |
| + | |
| + | c = ed.controlManager.createListBox('fontsizeselect', {title : 'advanced.font_size', onselect : function(v) { |
| + | var cur = c.items[c.selectedIndex]; |
| + | |
| + | if (!v && cur) { |
| + | cur = cur.value; |
| + | |
| + | if (cur['class']) { |
| + | ed.formatter.toggle('fontsize_class', {value : cur['class']}); |
| + | ed.undoManager.add(); |
| + | ed.nodeChanged(); |
| + | } else { |
| + | ed.execCommand('FontSize', false, cur.fontSize); |
| + | } |
| + | |
| + | return; |
| + | } |
| + | |
| + | if (v['class']) { |
| + | ed.focus(); |
| + | ed.undoManager.add(); |
| + | ed.formatter.toggle('fontsize_class', {value : v['class']}); |
| + | ed.undoManager.add(); |
| + | ed.nodeChanged(); |
| + | } else |
| + | ed.execCommand('FontSize', false, v.fontSize); |
| + | |
| + | // Fake selection, execCommand will fire a nodeChange and update the selection |
| + | c.select(function(sv) { |
| + | return v == sv; |
| + | }); |
| + | |
| + | return false; // No auto select |
| + | }}); |
| + | |
| + | if (c) { |
| + | each(t.settings.theme_advanced_font_sizes, function(v, k) { |
| + | var fz = v.fontSize; |
| + | |
| + | if (fz >= 1 && fz <= 7) |
| + | fz = t.sizes[parseInt(fz) - 1] + 'pt'; |
| + | |
| + | c.add(k, v, {'style' : 'font-size:' + fz, 'class' : 'mceFontSize' + (i++) + (' ' + (v['class'] || ''))}); |
| + | }); |
| + | } |
| + | |
| + | return c; |
| + | }, |
| + | |
| + | _createBlockFormats : function() { |
| + | var c, fmts = { |
| + | p : 'advanced.paragraph', |
| + | address : 'advanced.address', |
| + | pre : 'advanced.pre', |
| + | h1 : 'advanced.h1', |
| + | h2 : 'advanced.h2', |
| + | h3 : 'advanced.h3', |
| + | h4 : 'advanced.h4', |
| + | h5 : 'advanced.h5', |
| + | h6 : 'advanced.h6', |
| + | div : 'advanced.div', |
| + | blockquote : 'advanced.blockquote', |
| + | code : 'advanced.code', |
| + | dt : 'advanced.dt', |
| + | dd : 'advanced.dd', |
| + | samp : 'advanced.samp' |
| + | }, t = this; |
| + | |
| + | c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', cmd : 'FormatBlock'}); |
| + | if (c) { |
| + | each(t.editor.getParam('theme_advanced_blockformats', t.settings.theme_advanced_blockformats, 'hash'), function(v, k) { |
| + | c.add(t.editor.translate(k != v ? k : fmts[v]), v, {'class' : 'mce_formatPreview mce_' + v}); |
| + | }); |
| + | } |
| + | |
| + | return c; |
| + | }, |
| + | |
| + | _createForeColorMenu : function() { |
| + | var c, t = this, s = t.settings, o = {}, v; |
| + | |
| + | if (s.theme_advanced_more_colors) { |
| + | o.more_colors_func = function() { |
| + | t._mceColorPicker(0, { |
| + | color : c.value, |
| + | func : function(co) { |
| + | c.setColor(co); |
| + | } |
| + | }); |
| + | }; |
| + | } |
| + | |
| + | if (v = s.theme_advanced_text_colors) |
| + | o.colors = v; |
| + | |
| + | if (s.theme_advanced_default_foreground_color) |
| + | o.default_color = s.theme_advanced_default_foreground_color; |
| + | |
| + | o.title = 'advanced.forecolor_desc'; |
| + | o.cmd = 'ForeColor'; |
| + | o.scope = this; |
| + | |
| + | c = t.editor.controlManager.createColorSplitButton('forecolor', o); |
| + | |
| + | return c; |
| + | }, |
| + | |
| + | _createBackColorMenu : function() { |
| + | var c, t = this, s = t.settings, o = {}, v; |
| + | |
| + | if (s.theme_advanced_more_colors) { |
| + | o.more_colors_func = function() { |
| + | t._mceColorPicker(0, { |
| + | color : c.value, |
| + | func : function(co) { |
| + | c.setColor(co); |
| + | } |
| + | }); |
| + | }; |
| + | } |
| + | |
| + | if (v = s.theme_advanced_background_colors) |
| + | o.colors = v; |
| + | |
| + | if (s.theme_advanced_default_background_color) |
| + | o.default_color = s.theme_advanced_default_background_color; |
| + | |
| + | o.title = 'advanced.backcolor_desc'; |
| + | o.cmd = 'HiliteColor'; |
| + | o.scope = this; |
| + | |
| + | c = t.editor.controlManager.createColorSplitButton('backcolor', o); |
| + | |
| + | return c; |
| + | }, |
| + | |
| + | renderUI : function(o) { |
| + | var n, ic, tb, t = this, ed = t.editor, s = t.settings, sc, p, nl; |
| + | |
| + | n = p = DOM.create('span', {id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '')}); |
| + | |
| + | if (!DOM.boxModel) |
| + | n = DOM.add(n, 'div', {'class' : 'mceOldBoxModel'}); |
| + | |
| + | n = sc = DOM.add(n, 'table', {id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0}); |
| + | n = tb = DOM.add(n, 'tbody'); |
| + | |
| + | switch ((s.theme_advanced_layout_manager || '').toLowerCase()) { |
| + | case "rowlayout": |
| + | ic = t._rowLayout(s, tb, o); |
| + | break; |
| + | |
| + | case "customlayout": |
| + | ic = ed.execCallback("theme_advanced_custom_layout", s, tb, o, p); |
| + | break; |
| + | |
| + | default: |
| + | ic = t._simpleLayout(s, tb, o, p); |
| + | } |
| + | |
| + | n = o.targetNode; |
| + | |
| + | // Add classes to first and last TRs |
| + | nl = DOM.stdMode ? sc.getElementsByTagName('tr') : sc.rows; // Quick fix for IE 8 |
| + | DOM.addClass(nl[0], 'mceFirst'); |
| + | DOM.addClass(nl[nl.length - 1], 'mceLast'); |
| + | |
| + | // Add classes to first and last TDs |
| + | each(DOM.select('tr', tb), function(n) { |
| + | DOM.addClass(n.firstChild, 'mceFirst'); |
| + | DOM.addClass(n.childNodes[n.childNodes.length - 1], 'mceLast'); |
| + | }); |
| + | |
| + | if (DOM.get(s.theme_advanced_toolbar_container)) |
| + | DOM.get(s.theme_advanced_toolbar_container).appendChild(p); |
| + | else |
| + | DOM.insertAfter(p, n); |
| + | |
| + | Event.add(ed.id + '_path_row', 'click', function(e) { |
| + | e = e.target; |
| + | |
| + | if (e.nodeName == 'A') { |
| + | t._sel(e.className.replace(/^.*mcePath_([0-9]+).*$/, '$1')); |
| + | |
| + | return Event.cancel(e); |
| + | } |
| + | }); |
| + | /* |
| + | if (DOM.get(ed.id + '_path_row')) { |
| + | Event.add(ed.id + '_tbl', 'mouseover', function(e) { |
| + | var re; |
| + | |
| + | e = e.target; |
| + | |
| + | if (e.nodeName == 'SPAN' && DOM.hasClass(e.parentNode, 'mceButton')) { |
| + | re = DOM.get(ed.id + '_path_row'); |
| + | t.lastPath = re.innerHTML; |
| + | DOM.setHTML(re, e.parentNode.title); |
| + | } |
| + | }); |
| + | |
| + | Event.add(ed.id + '_tbl', 'mouseout', function(e) { |
| + | if (t.lastPath) { |
| + | DOM.setHTML(ed.id + '_path_row', t.lastPath); |
| + | t.lastPath = 0; |
| + | } |
| + | }); |
| + | } |
| + | */ |
| + | |
| + | if (!ed.getParam('accessibility_focus')) |
| + | Event.add(DOM.add(p, 'a', {href : '#'}, '<!-- IE -->'), 'focus', function() {tinyMCE.get(ed.id).focus();}); |
| + | |
| + | if (s.theme_advanced_toolbar_location == 'external') |
| + | o.deltaHeight = 0; |
| + | |
| + | t.deltaHeight = o.deltaHeight; |
| + | o.targetNode = null; |
| + | |
| + | return { |
| + | iframeContainer : ic, |
| + | editorContainer : ed.id + '_parent', |
| + | sizeContainer : sc, |
| + | deltaHeight : o.deltaHeight |
| + | }; |
| + | }, |
| + | |
| + | getInfo : function() { |
| + | return { |
| + | longname : 'Advanced theme', |
| + | author : 'Moxiecode Systems AB', |
| + | authorurl : 'http://tinymce.moxiecode.com', |
| + | version : tinymce.majorVersion + "." + tinymce.minorVersion |
| + | } |
| + | }, |
| + | |
| + | resizeBy : function(dw, dh) { |
| + | var e = DOM.get(this.editor.id + '_tbl'); |
| + | |
| + | this.resizeTo(e.clientWidth + dw, e.clientHeight + dh); |
| + | }, |
| + | |
| + | resizeTo : function(w, h) { |
| + | var ed = this.editor, s = this.settings, e = DOM.get(ed.id + '_tbl'), ifr = DOM.get(ed.id + '_ifr'); |
| + | |
| + | // Boundery fix box |
| + | w = Math.max(s.theme_advanced_resizing_min_width || 100, w); |
| + | h = Math.max(s.theme_advanced_resizing_min_height || 100, h); |
| + | w = Math.min(s.theme_advanced_resizing_max_width || 0xFFFF, w); |
| + | h = Math.min(s.theme_advanced_resizing_max_height || 0xFFFF, h); |
| + | |
| + | // Resize iframe and container |
| + | DOM.setStyle(e, 'height', ''); |
| + | DOM.setStyle(ifr, 'height', h); |
| + | |
| + | if (s.theme_advanced_resize_horizontal) { |
| + | DOM.setStyle(e, 'width', ''); |
| + | DOM.setStyle(ifr, 'width', w); |
| + | |
| + | // Make sure that the size is never smaller than the over all ui |
| + | if (w < e.clientWidth) |
| + | DOM.setStyle(ifr, 'width', e.clientWidth); |
| + | } |
| + | }, |
| + | |
| + | destroy : function() { |
| + | var id = this.editor.id; |
| + | |
| + | Event.clear(id + '_resize'); |
| + | Event.clear(id + '_path_row'); |
| + | Event.clear(id + '_external_close'); |
| + | }, |
| + | |
| + | // Internal functions |
| + | |
| + | _simpleLayout : function(s, tb, o, p) { |
| + | var t = this, ed = t.editor, lo = s.theme_advanced_toolbar_location, sl = s.theme_advanced_statusbar_location, n, ic, etb, c; |
| + | |
| + | if (s.readonly) { |
| + | n = DOM.add(tb, 'tr'); |
| + | n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); |
| + | return ic; |
| + | } |
| + | |
| + | // Create toolbar container at top |
| + | if (lo == 'top') |
| + | t._addToolbars(tb, o); |
| + | |
| + | // Create external toolbar |
| + | if (lo == 'external') { |
| + | n = c = DOM.create('div', {style : 'position:relative'}); |
| + | n = DOM.add(n, 'div', {id : ed.id + '_external', 'class' : 'mceExternalToolbar'}); |
| + | DOM.add(n, 'a', {id : ed.id + '_external_close', href : 'javascript:;', 'class' : 'mceExternalClose'}); |
| + | n = DOM.add(n, 'table', {id : ed.id + '_tblext', cellSpacing : 0, cellPadding : 0}); |
| + | etb = DOM.add(n, 'tbody'); |
| + | |
| + | if (p.firstChild.className == 'mceOldBoxModel') |
| + | p.firstChild.appendChild(c); |
| + | else |
| + | p.insertBefore(c, p.firstChild); |
| + | |
| + | t._addToolbars(etb, o); |
| + | |
| + | ed.onMouseUp.add(function() { |
| + | var e = DOM.get(ed.id + '_external'); |
| + | DOM.show(e); |
| + | |
| + | DOM.hide(lastExtID); |
| + | |
| + | var f = Event.add(ed.id + '_external_close', 'click', function() { |
| + | DOM.hide(ed.id + '_external'); |
| + | Event.remove(ed.id + '_external_close', 'click', f); |
| + | }); |
| + | |
| + | DOM.show(e); |
| + | DOM.setStyle(e, 'top', 0 - DOM.getRect(ed.id + '_tblext').h - 1); |
| + | |
| + | // Fixes IE rendering bug |
| + | DOM.hide(e); |
| + | DOM.show(e); |
| + | e.style.filter = ''; |
| + | |
| + | lastExtID = ed.id + '_external'; |
| + | |
| + | e = null; |
| + | }); |
| + | } |
| + | |
| + | if (sl == 'top') |
| + | t._addStatusBar(tb, o); |
| + | |
| + | // Create iframe container |
| + | if (!s.theme_advanced_toolbar_container) { |
| + | n = DOM.add(tb, 'tr'); |
| + | n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); |
| + | } |
| + | |
| + | // Create toolbar container at bottom |
| + | if (lo == 'bottom') |
| + | t._addToolbars(tb, o); |
| + | |
| + | if (sl == 'bottom') |
| + | t._addStatusBar(tb, o); |
| + | |
| + | return ic; |
| + | }, |
| + | |
| + | _rowLayout : function(s, tb, o) { |
| + | var t = this, ed = t.editor, dc, da, cf = ed.controlManager, n, ic, to, a; |
| + | |
| + | dc = s.theme_advanced_containers_default_class || ''; |
| + | da = s.theme_advanced_containers_default_align || 'center'; |
| + | |
| + | each(explode(s.theme_advanced_containers || ''), function(c, i) { |
| + | var v = s['theme_advanced_container_' + c] || ''; |
| + | |
| + | switch (v.toLowerCase()) { |
| + | case 'mceeditor': |
| + | n = DOM.add(tb, 'tr'); |
| + | n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); |
| + | break; |
| + | |
| + | case 'mceelementpath': |
| + | t._addStatusBar(tb, o); |
| + | break; |
| + | |
| + | default: |
| + | a = (s['theme_advanced_container_' + c + '_align'] || da).toLowerCase(); |
| + | a = 'mce' + t._ufirst(a); |
| + | |
| + | n = DOM.add(DOM.add(tb, 'tr'), 'td', { |
| + | 'class' : 'mceToolbar ' + (s['theme_advanced_container_' + c + '_class'] || dc) + ' ' + a || da |
| + | }); |
| + | |
| + | to = cf.createToolbar("toolbar" + i); |
| + | t._addControls(v, to); |
| + | DOM.setHTML(n, to.renderHTML()); |
| + | o.deltaHeight -= s.theme_advanced_row_height; |
| + | } |
| + | }); |
| + | |
| + | return ic; |
| + | }, |
| + | |
| + | _addControls : function(v, tb) { |
| + | var t = this, s = t.settings, di, cf = t.editor.controlManager; |
| + | |
| + | if (s.theme_advanced_disable && !t._disabled) { |
| + | di = {}; |
| + | |
| + | each(explode(s.theme_advanced_disable), function(v) { |
| + | di[v] = 1; |
| + | }); |
| + | |
| + | t._disabled = di; |
| + | } else |
| + | di = t._disabled; |
| + | |
| + | each(explode(v), function(n) { |
| + | var c; |
| + | |
| + | if (di && di[n]) |
| + | return; |
| + | |
| + | // Compatiblity with 2.x |
| + | if (n == 'tablecontrols') { |
| + | each(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"], function(n) { |
| + | n = t.createControl(n, cf); |
| + | |
| + | if (n) |
| + | tb.add(n); |
| + | }); |
| + | |
| + | return; |
| + | } |
| + | |
| + | c = t.createControl(n, cf); |
| + | |
| + | if (c) |
| + | tb.add(c); |
| + | }); |
| + | }, |
| + | |
| + | _addToolbars : function(c, o) { |
| + | var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a; |
| + | |
| + | a = s.theme_advanced_toolbar_align.toLowerCase(); |
| + | a = 'mce' + t._ufirst(a); |
| + | |
| + | n = DOM.add(DOM.add(c, 'tr'), 'td', {'class' : 'mceToolbar ' + a}); |
| + | |
| + | if (!ed.getParam('accessibility_focus')) |
| + | h.push(DOM.createHTML('a', {href : '#', onfocus : 'tinyMCE.get(\'' + ed.id + '\').focus();'}, '<!-- IE -->')); |
| + | |
| + | h.push(DOM.createHTML('a', {href : '#', accesskey : 'q', title : ed.getLang("advanced.toolbar_focus")}, '<!-- IE -->')); |
| + | |
| + | // Create toolbar and add the controls |
| + | for (i=1; (v = s['theme_advanced_buttons' + i]); i++) { |
| + | tb = cf.createToolbar("toolbar" + i, {'class' : 'mceToolbarRow' + i}); |
| + | |
| + | if (s['theme_advanced_buttons' + i + '_add']) |
| + | v += ',' + s['theme_advanced_buttons' + i + '_add']; |
| + | |
| + | if (s['theme_advanced_buttons' + i + '_add_before']) |
| + | v = s['theme_advanced_buttons' + i + '_add_before'] + ',' + v; |
| + | |
| + | t._addControls(v, tb); |
| + | |
| + | //n.appendChild(n = tb.render()); |
| + | h.push(tb.renderHTML()); |
| + | |
| + | o.deltaHeight -= s.theme_advanced_row_height; |
| + | } |
| + | |
| + | h.push(DOM.createHTML('a', {href : '#', accesskey : 'z', title : ed.getLang("advanced.toolbar_focus"), onfocus : 'tinyMCE.getInstanceById(\'' + ed.id + '\').focus();'}, '<!-- IE -->')); |
| + | DOM.setHTML(n, h.join('')); |
| + | }, |
| + | |
| + | _addStatusBar : function(tb, o) { |
| + | var n, t = this, ed = t.editor, s = t.settings, r, mf, me, td; |
| + | |
| + | n = DOM.add(tb, 'tr'); |
| + | n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'}); |
| + | n = DOM.add(n, 'div', {id : ed.id + '_path_row'}, s.theme_advanced_path ? ed.translate('advanced.path') + ': ' : ' '); |
| + | DOM.add(n, 'a', {href : '#', accesskey : 'x'}); |
| + | |
| + | if (s.theme_advanced_resizing) { |
| + | DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize'}); |
| + | |
| + | if (s.theme_advanced_resizing_use_cookie) { |
| + | ed.onPostRender.add(function() { |
| + | var o = Cookie.getHash("TinyMCE_" + ed.id + "_size"), c = DOM.get(ed.id + '_tbl'); |
| + | |
| + | if (!o) |
| + | return; |
| + | |
| + | t.resizeTo(o.cw, o.ch); |
| + | }); |
| + | } |
| + | |
| + | ed.onPostRender.add(function() { |
| + | Event.add(ed.id + '_resize', 'mousedown', function(e) { |
| + | var mouseMoveHandler1, mouseMoveHandler2, |
| + | mouseUpHandler1, mouseUpHandler2, |
| + | startX, startY, startWidth, startHeight, width, height, ifrElm; |
| + | |
| + | function resizeOnMove(e) { |
| + | width = startWidth + (e.screenX - startX); |
| + | height = startHeight + (e.screenY - startY); |
| + | |
| + | t.resizeTo(width, height); |
| + | }; |
| + | |
| + | function endResize(e) { |
| + | // Stop listening |
| + | Event.remove(DOM.doc, 'mousemove', mouseMoveHandler1); |
| + | Event.remove(ed.getDoc(), 'mousemove', mouseMoveHandler2); |
| + | Event.remove(DOM.doc, 'mouseup', mouseUpHandler1); |
| + | Event.remove(ed.getDoc(), 'mouseup', mouseUpHandler2); |
| + | |
| + | // Store away the size |
| + | if (s.theme_advanced_resizing_use_cookie) { |
| + | Cookie.setHash("TinyMCE_" + ed.id + "_size", { |
| + | cw : width, |
| + | ch : height |
| + | }); |
| + | } |
| + | }; |
| + | |
| + | e.preventDefault(); |
| + | |
| + | // Get the current rect size |
| + | startX = e.screenX; |
| + | startY = e.screenY; |
| + | ifrElm = DOM.get(t.editor.id + '_ifr'); |
| + | startWidth = width = ifrElm.clientWidth; |
| + | startHeight = height = ifrElm.clientHeight; |
| + | |
| + | // Register envent handlers |
| + | mouseMoveHandler1 = Event.add(DOM.doc, 'mousemove', resizeOnMove); |
| + | mouseMoveHandler2 = Event.add(ed.getDoc(), 'mousemove', resizeOnMove); |
| + | mouseUpHandler1 = Event.add(DOM.doc, 'mouseup', endResize); |
| + | mouseUpHandler2 = Event.add(ed.getDoc(), 'mouseup', endResize); |
| + | }); |
| + | }); |
| + | } |
| + | |
| + | o.deltaHeight -= 21; |
| + | n = tb = null; |
| + | }, |
| + | |
| + | _nodeChanged : function(ed, cm, n, co, ob) { |
| + | var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn, formatNames, matches; |
| + | |
| + | tinymce.each(t.stateControls, function(c) { |
| + | cm.setActive(c, ed.queryCommandState(t.controls[c][1])); |
| + | }); |
| + | |
| + | function getParent(name) { |
| + | var i, parents = ob.parents, func = name; |
| + | |
| + | if (typeof(name) == 'string') { |
| + | func = function(node) { |
| + | return node.nodeName == name; |
| + | }; |
| + | } |
| + | |
| + | for (i = 0; i < parents.length; i++) { |
| + | if (func(parents[i])) |
| + | return parents[i]; |
| + | } |
| + | }; |
| + | |
| + | cm.setActive('visualaid', ed.hasVisual); |
| + | cm.setDisabled('undo', !ed.undoManager.hasUndo() && !ed.typing); |
| + | cm.setDisabled('redo', !ed.undoManager.hasRedo()); |
| + | cm.setDisabled('outdent', !ed.queryCommandState('Outdent')); |
| + | |
| + | p = getParent('A'); |
| + | if (c = cm.get('link')) { |
| + | if (!p || !p.name) { |
| + | c.setDisabled(!p && co); |
| + | c.setActive(!!p); |
| + | } |
| + | } |
| + | |
| + | if (c = cm.get('unlink')) { |
| + | c.setDisabled(!p && co); |
| + | c.setActive(!!p && !p.name); |
| + | } |
| + | |
| + | if (c = cm.get('anchor')) { |
| + | c.setActive(!!p && p.name); |
| + | } |
| + | |
| + | p = getParent('IMG'); |
| + | if (c = cm.get('image')) |
| + | c.setActive(!!p && n.className.indexOf('mceItem') == -1); |
| + | |
| + | if (c = cm.get('styleselect')) { |
| + | t._importClasses(); |
| + | |
| + | formatNames = []; |
| + | each(c.items, function(item) { |
| + | formatNames.push(item.value); |
| + | }); |
| + | |
| + | matches = ed.formatter.matchAll(formatNames); |
| + | c.select(matches[0]); |
| + | } |
| + | |
| + | if (c = cm.get('formatselect')) { |
| + | p = getParent(DOM.isBlock); |
| + | |
| + | if (p) |
| + | c.select(p.nodeName.toLowerCase()); |
| + | } |
| + | |
| + | // Find out current fontSize, fontFamily and fontClass |
| + | getParent(function(n) { |
| + | if (n.nodeName === 'SPAN') { |
| + | if (!cl && n.className) |
| + | cl = n.className; |
| + | |
| + | if (!fz && n.style.fontSize) |
| + | fz = n.style.fontSize; |
| + | |
| + | if (!fn && n.style.fontFamily) |
| + | fn = n.style.fontFamily.replace(/[\"\']+/g, '').replace(/^([^,]+).*/, '$1').toLowerCase(); |
| + | } |
| + | |
| + | return false; |
| + | }); |
| + | |
| + | if (c = cm.get('fontselect')) { |
| + | c.select(function(v) { |
| + | return v.replace(/^([^,]+).*/, '$1').toLowerCase() == fn; |
| + | }); |
| + | } |
| + | |
| + | // Select font size |
| + | if (c = cm.get('fontsizeselect')) { |
| + | // Use computed style |
| + | if (s.theme_advanced_runtime_fontsize && !fz && !cl) |
| + | fz = ed.dom.getStyle(n, 'fontSize', true); |
| + | |
| + | c.select(function(v) { |
| + | if (v.fontSize && v.fontSize === fz) |
| + | return true; |
| + | |
| + | if (v['class'] && v['class'] === cl) |
| + | return true; |
| + | }); |
| + | } |
| + | |
| + | if (s.theme_advanced_path && s.theme_advanced_statusbar_location) { |
| + | p = DOM.get(ed.id + '_path') || DOM.add(ed.id + '_path_row', 'span', {id : ed.id + '_path'}); |
| + | DOM.setHTML(p, ''); |
| + | |
| + | getParent(function(n) { |
| + | var na = n.nodeName.toLowerCase(), u, pi, ti = ''; |
| + | |
| + | /*if (n.getAttribute('_mce_bogus')) |
| + | return; |
| + | */ |
| + | // Ignore non element and hidden elements |
| + | if (n.nodeType != 1 || n.nodeName === 'BR' || (DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved'))) |
| + | return; |
| + | |
| + | // Fake name |
| + | if (v = DOM.getAttrib(n, 'mce_name')) |
| + | na = v; |
| + | |
| + | // Handle prefix |
| + | if (tinymce.isIE && n.scopeName !== 'HTML') |
| + | na = n.scopeName + ':' + na; |
| + | |
| + | // Remove internal prefix |
| + | na = na.replace(/mce\:/g, ''); |
| + | |
| + | // Handle node name |
| + | switch (na) { |
| + | case 'b': |
| + | na = 'strong'; |
| + | break; |
| + | |
| + | case 'i': |
| + | na = 'em'; |
| + | break; |
| + | |
| + | case 'img': |
| + | if (v = DOM.getAttrib(n, 'src')) |
| + | ti += 'src: ' + v + ' '; |
| + | |
| + | break; |
| + | |
| + | case 'a': |
| + | if (v = DOM.getAttrib(n, 'name')) { |
| + | ti += 'name: ' + v + ' '; |
| + | na += '#' + v; |
| + | } |
| + | |
| + | if (v = DOM.getAttrib(n, 'href')) |
| + | ti += 'href: ' + v + ' '; |
| + | |
| + | break; |
| + | |
| + | case 'font': |
| + | if (v = DOM.getAttrib(n, 'face')) |
| + | ti += 'font: ' + v + ' '; |
| + | |
| + | if (v = DOM.getAttrib(n, 'size')) |
| + | ti += 'size: ' + v + ' '; |
| + | |
| + | if (v = DOM.getAttrib(n, 'color')) |
| + | ti += 'color: ' + v + ' '; |
| + | |
| + | break; |
| + | |
| + | case 'span': |
| + | if (v = DOM.getAttrib(n, 'style')) |
| + | ti += 'style: ' + v + ' '; |
| + | |
| + | break; |
| + | } |
| + | |
| + | if (v = DOM.getAttrib(n, 'id')) |
| + | ti += 'id: ' + v + ' '; |
| + | |
| + | if (v = n.className) { |
| + | v = v.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g, '') |
| + | |
| + | if (v) { |
| + | ti += 'class: ' + v + ' '; |
| + | |
| + | if (DOM.isBlock(n) || na == 'img' || na == 'span') |
| + | na += '.' + v; |
| + | } |
| + | } |
| + | |
| + | na = na.replace(/(html:)/g, ''); |
| + | na = {name : na, node : n, title : ti}; |
| + | t.onResolveName.dispatch(t, na); |
| + | ti = na.title; |
| + | na = na.name; |
| + | |
| + | //u = "javascript:tinymce.EditorManager.get('" + ed.id + "').theme._sel('" + (de++) + "');"; |
| + | pi = DOM.create('a', {'href' : "javascript:;", onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na); |
| + | |
| + | if (p.hasChildNodes()) { |
| + | p.insertBefore(DOM.doc.createTextNode(' \u00bb '), p.firstChild); |
| + | p.insertBefore(pi, p.firstChild); |
| + | } else |
| + | p.appendChild(pi); |
| + | }, ed.getBody()); |
| + | } |
| + | }, |
| + | |
| + | // Commands gets called by execCommand |
| + | |
| + | _sel : function(v) { |
| + | this.editor.execCommand('mceSelectNodeDepth', false, v); |
| + | }, |
| + | |
| + | _mceInsertAnchor : function(ui, v) { |
| + | var ed = this.editor; |
| + | |
| + | ed.windowManager.open({ |
| + | url : tinymce.baseURL + '/themes/advanced/anchor.htm', |
| + | width : 320 + parseInt(ed.getLang('advanced.anchor_delta_width', 0)), |
| + | height : 90 + parseInt(ed.getLang('advanced.anchor_delta_height', 0)), |
| + | inline : true |
| + | }, { |
| + | theme_url : this.url |
| + | }); |
| + | }, |
| + | |
| + | _mceCharMap : function() { |
| + | var ed = this.editor; |
| + | |
| + | ed.windowManager.open({ |
| + | url : tinymce.baseURL + '/themes/advanced/charmap.htm', |
| + | width : 550 + parseInt(ed.getLang('advanced.charmap_delta_width', 0)), |
| + | height : 250 + parseInt(ed.getLang('advanced.charmap_delta_height', 0)), |
| + | inline : true |
| + | }, { |
| + | theme_url : this.url |
| + | }); |
| + | }, |
| + | |
| + | _mceHelp : function() { |
| + | var ed = this.editor; |
| + | |
| + | ed.windowManager.open({ |
| + | url : tinymce.baseURL + '/themes/advanced/about.htm', |
| + | width : 480, |
| + | height : 380, |
| + | inline : true |
| + | }, { |
| + | theme_url : this.url |
| + | }); |
| + | }, |
| + | |
| + | _mceColorPicker : function(u, v) { |
| + | var ed = this.editor; |
| + | |
| + | v = v || {}; |
| + | |
| + | ed.windowManager.open({ |
| + | url : tinymce.baseURL + '/themes/advanced/color_picker.htm', |
| + | width : 375 + parseInt(ed.getLang('advanced.colorpicker_delta_width', 0)), |
| + | height : 250 + parseInt(ed.getLang('advanced.colorpicker_delta_height', 0)), |
| + | close_previous : false, |
| + | inline : true |
| + | }, { |
| + | input_color : v.color, |
| + | func : v.func, |
| + | theme_url : this.url |
| + | }); |
| + | }, |
| + | |
| + | _mceCodeEditor : function(ui, val) { |
| + | var ed = this.editor; |
| + | |
| + | ed.windowManager.open({ |
| + | url : tinymce.baseURL + '/themes/advanced/source_editor.htm', |
| + | width : parseInt(ed.getParam("theme_advanced_source_editor_width", 720)), |
| + | height : parseInt(ed.getParam("theme_advanced_source_editor_height", 580)), |
| + | inline : true, |
| + | resizable : true, |
| + | maximizable : true |
| + | }, { |
| + | theme_url : this.url |
| + | }); |
| + | }, |
| + | |
| + | _mceImage : function(ui, val) { |
| + | var ed = this.editor; |
| + | |
| + | // Internal image object like a flash placeholder |
| + | if (ed.dom.getAttrib(ed.selection.getNode(), 'class').indexOf('mceItem') != -1) |
| + | return; |
| + | |
| + | ed.windowManager.open({ |
| + | url : tinymce.baseURL + '/themes/advanced/image.htm', |
| + | width : 355 + parseInt(ed.getLang('advanced.image_delta_width', 0)), |
| + | height : 275 + parseInt(ed.getLang('advanced.image_delta_height', 0)), |
| + | inline : true |
| + | }, { |
| + | theme_url : this.url |
| + | }); |
| + | }, |
| + | |
| + | _mceLink : function(ui, val) { |
| + | var ed = this.editor; |
| + | |
| + | ed.windowManager.open({ |
| + | url : tinymce.baseURL + '/themes/advanced/link.htm', |
| + | width : 310 + parseInt(ed.getLang('advanced.link_delta_width', 0)), |
| + | height : 200 + parseInt(ed.getLang('advanced.link_delta_height', 0)), |
| + | inline : true |
| + | }, { |
| + | theme_url : this.url |
| + | }); |
| + | }, |
| + | |
| + | _mceNewDocument : function() { |
| + | var ed = this.editor; |
| + | |
| + | ed.windowManager.confirm('advanced.newdocument', function(s) { |
| + | if (s) |
| + | ed.execCommand('mceSetContent', false, ''); |
| + | }); |
| + | }, |
| + | |
| + | _mceForeColor : function() { |
| + | var t = this; |
| + | |
| + | this._mceColorPicker(0, { |
| + | color: t.fgColor, |
| + | func : function(co) { |
| + | t.fgColor = co; |
| + | t.editor.execCommand('ForeColor', false, co); |
| + | } |
| + | }); |
| + | }, |
| + | |
| + | _mceBackColor : function() { |
| + | var t = this; |
| + | |
| + | this._mceColorPicker(0, { |
| + | color: t.bgColor, |
| + | func : function(co) { |
| + | t.bgColor = co; |
| + | t.editor.execCommand('HiliteColor', false, co); |
| + | } |
| + | }); |
| + | }, |
| + | |
| + | _ufirst : function(s) { |
| + | return s.substring(0, 1).toUpperCase() + s.substring(1); |
| + | } |
| + | }); |
| + | |
| + | tinymce.ThemeManager.add('advanced', tinymce.themes.AdvancedTheme); |
| + | }(tinymce)); |
| \ No newline at end of file | |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/image.htm
+80
-0
| @@ | @@ -0,0 +1,80 @@ |
| + | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
| + | <html xmlns="http://www.w3.org/1999/xhtml"> |
| + | <head> |
| + | <title>{#advanced_dlg.image_title}</title> |
| + | <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/form_utils.js"></script> |
| + | <script type="text/javascript" src="js/image.js"></script> |
| + | </head> |
| + | <body id="image" style="display: none"> |
| + | <form onsubmit="ImageDialog.update();return false;" action="#"> |
| + | <div class="tabs"> |
| + | <ul> |
| + | <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advanced_dlg.image_title}</a></span></li> |
| + | </ul> |
| + | </div> |
| + | |
| + | <div class="panel_wrapper"> |
| + | <div id="general_panel" class="panel current"> |
| + | <table border="0" cellpadding="4" cellspacing="0"> |
| + | <tr> |
| + | <td class="nowrap"><label for="src">{#advanced_dlg.image_src}</label></td> |
| + | <td><table border="0" cellspacing="0" cellpadding="0"> |
| + | <tr> |
| + | <td><input id="src" name="src" type="text" class="mceFocus" value="" style="width: 200px" onchange="ImageDialog.getImageData();" /></td> |
| + | <td id="srcbrowsercontainer"> </td> |
| + | </tr> |
| + | </table></td> |
| + | </tr> |
| + | <tr> |
| + | <td><label for="image_list">{#advanced_dlg.image_list}</label></td> |
| + | <td><select id="image_list" name="image_list" onchange="document.getElementById('src').value=this.options[this.selectedIndex].value;document.getElementById('alt').value=this.options[this.selectedIndex].text;"></select></td> |
| + | </tr> |
| + | <tr> |
| + | <td class="nowrap"><label for="alt">{#advanced_dlg.image_alt}</label></td> |
| + | <td><input id="alt" name="alt" type="text" value="" style="width: 200px" /></td> |
| + | </tr> |
| + | <tr> |
| + | <td class="nowrap"><label for="align">{#advanced_dlg.image_align}</label></td> |
| + | <td><select id="align" name="align" onchange="ImageDialog.updateStyle();"> |
| + | <option value="">{#not_set}</option> |
| + | <option value="baseline">{#advanced_dlg.image_align_baseline}</option> |
| + | <option value="top">{#advanced_dlg.image_align_top}</option> |
| + | <option value="middle">{#advanced_dlg.image_align_middle}</option> |
| + | <option value="bottom">{#advanced_dlg.image_align_bottom}</option> |
| + | <option value="text-top">{#advanced_dlg.image_align_texttop}</option> |
| + | <option value="text-bottom">{#advanced_dlg.image_align_textbottom}</option> |
| + | <option value="left">{#advanced_dlg.image_align_left}</option> |
| + | <option value="right">{#advanced_dlg.image_align_right}</option> |
| + | </select></td> |
| + | </tr> |
| + | <tr> |
| + | <td class="nowrap"><label for="width">{#advanced_dlg.image_dimensions}</label></td> |
| + | <td><input id="width" name="width" type="text" value="" size="3" maxlength="5" /> |
| + | x |
| + | <input id="height" name="height" type="text" value="" size="3" maxlength="5" /></td> |
| + | </tr> |
| + | <tr> |
| + | <td class="nowrap"><label for="border">{#advanced_dlg.image_border}</label></td> |
| + | <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" onchange="ImageDialog.updateStyle();" /></td> |
| + | </tr> |
| + | <tr> |
| + | <td class="nowrap"><label for="vspace">{#advanced_dlg.image_vspace}</label></td> |
| + | <td><input id="vspace" name="vspace" type="text" value="" size="3" maxlength="3" onchange="ImageDialog.updateStyle();" /></td> |
| + | </tr> |
| + | <tr> |
| + | <td class="nowrap"><label for="hspace">{#advanced_dlg.image_hspace}</label></td> |
| + | <td><input id="hspace" name="hspace" type="text" value="" size="3" maxlength="3" onchange="ImageDialog.updateStyle();" /></td> |
| + | </tr> |
| + | </table> |
| + | </div> |
| + | </div> |
| + | |
| + | <div class="mceActionPanel"> |
| + | <input type="submit" id="insert" name="insert" value="{#insert}" /> |
| + | <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> |
| + | </div> |
| + | </form> |
| + | </body> |
| + | </html> |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/img/colorpicker.jpg
+0
-0
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/img/icons.gif
+0
-0
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/js/about.js
+72
-0
| @@ | @@ -0,0 +1,72 @@ |
| + | tinyMCEPopup.requireLangPack(); |
| + | |
| + | function init() { |
| + | var ed, tcont; |
| + | |
| + | tinyMCEPopup.resizeToInnerSize(); |
| + | ed = tinyMCEPopup.editor; |
| + | |
| + | // Give FF some time |
| + | window.setTimeout(insertHelpIFrame, 10); |
| + | |
| + | tcont = document.getElementById('plugintablecontainer'); |
| + | document.getElementById('plugins_tab').style.display = 'none'; |
| + | |
| + | var html = ""; |
| + | html += '<table id="plugintable">'; |
| + | html += '<thead>'; |
| + | html += '<tr>'; |
| + | html += '<td>' + ed.getLang('advanced_dlg.about_plugin') + '</td>'; |
| + | html += '<td>' + ed.getLang('advanced_dlg.about_author') + '</td>'; |
| + | html += '<td>' + ed.getLang('advanced_dlg.about_version') + '</td>'; |
| + | html += '</tr>'; |
| + | html += '</thead>'; |
| + | html += '<tbody>'; |
| + | |
| + | tinymce.each(ed.plugins, function(p, n) { |
| + | var info; |
| + | |
| + | if (!p.getInfo) |
| + | return; |
| + | |
| + | html += '<tr>'; |
| + | |
| + | info = p.getInfo(); |
| + | |
| + | if (info.infourl != null && info.infourl != '') |
| + | html += '<td width="50%" title="' + n + '"><a href="' + info.infourl + '" target="_blank">' + info.longname + '</a></td>'; |
| + | else |
| + | html += '<td width="50%" title="' + n + '">' + info.longname + '</td>'; |
| + | |
| + | if (info.authorurl != null && info.authorurl != '') |
| + | html += '<td width="35%"><a href="' + info.authorurl + '" target="_blank">' + info.author + '</a></td>'; |
| + | else |
| + | html += '<td width="35%">' + info.author + '</td>'; |
| + | |
| + | html += '<td width="15%">' + info.version + '</td>'; |
| + | html += '</tr>'; |
| + | |
| + | document.getElementById('plugins_tab').style.display = ''; |
| + | |
| + | }); |
| + | |
| + | html += '</tbody>'; |
| + | html += '</table>'; |
| + | |
| + | tcont.innerHTML = html; |
| + | |
| + | tinyMCEPopup.dom.get('version').innerHTML = tinymce.majorVersion + "." + tinymce.minorVersion; |
| + | tinyMCEPopup.dom.get('date').innerHTML = tinymce.releaseDate; |
| + | } |
| + | |
| + | function insertHelpIFrame() { |
| + | var html; |
| + | |
| + | if (tinyMCEPopup.getParam('docs_url')) { |
| + | html = '<iframe width="100%" height="300" src="' + tinyMCEPopup.editor.baseURI.toAbsolute(tinyMCEPopup.getParam('docs_url')) + '"></iframe>'; |
| + | document.getElementById('iframecontainer').innerHTML = html; |
| + | document.getElementById('help_tab').style.display = 'block'; |
| + | } |
| + | } |
| + | |
| + | tinyMCEPopup.onInit.add(init); |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/js/anchor.js
+37
-0
| @@ | @@ -0,0 +1,37 @@ |
| + | tinyMCEPopup.requireLangPack(); |
| + | |
| + | var AnchorDialog = { |
| + | init : function(ed) { |
| + | var action, elm, f = document.forms[0]; |
| + | |
| + | this.editor = ed; |
| + | elm = ed.dom.getParent(ed.selection.getNode(), 'A'); |
| + | v = ed.dom.getAttrib(elm, 'name'); |
| + | |
| + | if (v) { |
| + | this.action = 'update'; |
| + | f.anchorName.value = v; |
| + | } |
| + | |
| + | f.insert.value = ed.getLang(elm ? 'update' : 'insert'); |
| + | }, |
| + | |
| + | update : function() { |
| + | var ed = this.editor, elm, name = document.forms[0].anchorName.value; |
| + | |
| + | tinyMCEPopup.restoreSelection(); |
| + | |
| + | if (this.action != 'update') |
| + | ed.selection.collapse(1); |
| + | |
| + | elm = ed.dom.getParent(ed.selection.getNode(), 'A'); |
| + | if (elm) |
| + | elm.name = name; |
| + | else |
| + | ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('a', {name : name, 'class' : 'mceItemAnchor'}, '')); |
| + | |
| + | tinyMCEPopup.close(); |
| + | } |
| + | }; |
| + | |
| + | tinyMCEPopup.onInit.add(AnchorDialog.init, AnchorDialog); |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/js/charmap.js
+335
-0
| @@ | @@ -0,0 +1,335 @@ |
| + | /** |
| + | * charmap.js |
| + | * |
| + | * Copyright 2009, Moxiecode Systems AB |
| + | * Released under LGPL License. |
| + | * |
| + | * License: http://tinymce.moxiecode.com/license |
| + | * Contributing: http://tinymce.moxiecode.com/contributing |
| + | */ |
| + | |
| + | tinyMCEPopup.requireLangPack(); |
| + | |
| + | var charmap = [ |
| + | [' ', ' ', true, 'no-break space'], |
| + | ['&', '&', true, 'ampersand'], |
| + | ['"', '"', true, 'quotation mark'], |
| + | // finance |
| + | ['¢', '¢', true, 'cent sign'], |
| + | ['€', '€', true, 'euro sign'], |
| + | ['£', '£', true, 'pound sign'], |
| + | ['¥', '¥', true, 'yen sign'], |
| + | // signs |
| + | ['©', '©', true, 'copyright sign'], |
| + | ['®', '®', true, 'registered sign'], |
| + | ['™', '™', true, 'trade mark sign'], |
| + | ['‰', '‰', true, 'per mille sign'], |
| + | ['µ', 'µ', true, 'micro sign'], |
| + | ['·', '·', true, 'middle dot'], |
| + | ['•', '•', true, 'bullet'], |
| + | ['…', '…', true, 'three dot leader'], |
| + | ['′', '′', true, 'minutes / feet'], |
| + | ['″', '″', true, 'seconds / inches'], |
| + | ['§', '§', true, 'section sign'], |
| + | ['¶', '¶', true, 'paragraph sign'], |
| + | ['ß', 'ß', true, 'sharp s / ess-zed'], |
| + | // quotations |
| + | ['‹', '‹', true, 'single left-pointing angle quotation mark'], |
| + | ['›', '›', true, 'single right-pointing angle quotation mark'], |
| + | ['«', '«', true, 'left pointing guillemet'], |
| + | ['»', '»', true, 'right pointing guillemet'], |
| + | ['‘', '‘', true, 'left single quotation mark'], |
| + | ['’', '’', true, 'right single quotation mark'], |
| + | ['“', '“', true, 'left double quotation mark'], |
| + | ['”', '”', true, 'right double quotation mark'], |
| + | ['‚', '‚', true, 'single low-9 quotation mark'], |
| + | ['„', '„', true, 'double low-9 quotation mark'], |
| + | ['<', '<', true, 'less-than sign'], |
| + | ['>', '>', true, 'greater-than sign'], |
| + | ['≤', '≤', true, 'less-than or equal to'], |
| + | ['≥', '≥', true, 'greater-than or equal to'], |
| + | ['–', '–', true, 'en dash'], |
| + | ['—', '—', true, 'em dash'], |
| + | ['¯', '¯', true, 'macron'], |
| + | ['‾', '‾', true, 'overline'], |
| + | ['¤', '¤', true, 'currency sign'], |
| + | ['¦', '¦', true, 'broken bar'], |
| + | ['¨', '¨', true, 'diaeresis'], |
| + | ['¡', '¡', true, 'inverted exclamation mark'], |
| + | ['¿', '¿', true, 'turned question mark'], |
| + | ['ˆ', 'ˆ', true, 'circumflex accent'], |
| + | ['˜', '˜', true, 'small tilde'], |
| + | ['°', '°', true, 'degree sign'], |
| + | ['−', '−', true, 'minus sign'], |
| + | ['±', '±', true, 'plus-minus sign'], |
| + | ['÷', '÷', true, 'division sign'], |
| + | ['⁄', '⁄', true, 'fraction slash'], |
| + | ['×', '×', true, 'multiplication sign'], |
| + | ['¹', '¹', true, 'superscript one'], |
| + | ['²', '²', true, 'superscript two'], |
| + | ['³', '³', true, 'superscript three'], |
| + | ['¼', '¼', true, 'fraction one quarter'], |
| + | ['½', '½', true, 'fraction one half'], |
| + | ['¾', '¾', true, 'fraction three quarters'], |
| + | // math / logical |
| + | ['ƒ', 'ƒ', true, 'function / florin'], |
| + | ['∫', '∫', true, 'integral'], |
| + | ['∑', '∑', true, 'n-ary sumation'], |
| + | ['∞', '∞', true, 'infinity'], |
| + | ['√', '√', true, 'square root'], |
| + | ['∼', '∼', false,'similar to'], |
| + | ['≅', '≅', false,'approximately equal to'], |
| + | ['≈', '≈', true, 'almost equal to'], |
| + | ['≠', '≠', true, 'not equal to'], |
| + | ['≡', '≡', true, 'identical to'], |
| + | ['∈', '∈', false,'element of'], |
| + | ['∉', '∉', false,'not an element of'], |
| + | ['∋', '∋', false,'contains as member'], |
| + | ['∏', '∏', true, 'n-ary product'], |
| + | ['∧', '∧', false,'logical and'], |
| + | ['∨', '∨', false,'logical or'], |
| + | ['¬', '¬', true, 'not sign'], |
| + | ['∩', '∩', true, 'intersection'], |
| + | ['∪', '∪', false,'union'], |
| + | ['∂', '∂', true, 'partial differential'], |
| + | ['∀', '∀', false,'for all'], |
| + | ['∃', '∃', false,'there exists'], |
| + | ['∅', '∅', false,'diameter'], |
| + | ['∇', '∇', false,'backward difference'], |
| + | ['∗', '∗', false,'asterisk operator'], |
| + | ['∝', '∝', false,'proportional to'], |
| + | ['∠', '∠', false,'angle'], |
| + | // undefined |
| + | ['´', '´', true, 'acute accent'], |
| + | ['¸', '¸', true, 'cedilla'], |
| + | ['ª', 'ª', true, 'feminine ordinal indicator'], |
| + | ['º', 'º', true, 'masculine ordinal indicator'], |
| + | ['†', '†', true, 'dagger'], |
| + | ['‡', '‡', true, 'double dagger'], |
| + | // alphabetical special chars |
| + | ['À', 'À', true, 'A - grave'], |
| + | ['Á', 'Á', true, 'A - acute'], |
| + | ['Â', 'Â', true, 'A - circumflex'], |
| + | ['Ã', 'Ã', true, 'A - tilde'], |
| + | ['Ä', 'Ä', true, 'A - diaeresis'], |
| + | ['Å', 'Å', true, 'A - ring above'], |
| + | ['Æ', 'Æ', true, 'ligature AE'], |
| + | ['Ç', 'Ç', true, 'C - cedilla'], |
| + | ['È', 'È', true, 'E - grave'], |
| + | ['É', 'É', true, 'E - acute'], |
| + | ['Ê', 'Ê', true, 'E - circumflex'], |
| + | ['Ë', 'Ë', true, 'E - diaeresis'], |
| + | ['Ì', 'Ì', true, 'I - grave'], |
| + | ['Í', 'Í', true, 'I - acute'], |
| + | ['Î', 'Î', true, 'I - circumflex'], |
| + | ['Ï', 'Ï', true, 'I - diaeresis'], |
| + | ['Ð', 'Ð', true, 'ETH'], |
| + | ['Ñ', 'Ñ', true, 'N - tilde'], |
| + | ['Ò', 'Ò', true, 'O - grave'], |
| + | ['Ó', 'Ó', true, 'O - acute'], |
| + | ['Ô', 'Ô', true, 'O - circumflex'], |
| + | ['Õ', 'Õ', true, 'O - tilde'], |
| + | ['Ö', 'Ö', true, 'O - diaeresis'], |
| + | ['Ø', 'Ø', true, 'O - slash'], |
| + | ['Œ', 'Œ', true, 'ligature OE'], |
| + | ['Š', 'Š', true, 'S - caron'], |
| + | ['Ù', 'Ù', true, 'U - grave'], |
| + | ['Ú', 'Ú', true, 'U - acute'], |
| + | ['Û', 'Û', true, 'U - circumflex'], |
| + | ['Ü', 'Ü', true, 'U - diaeresis'], |
| + | ['Ý', 'Ý', true, 'Y - acute'], |
| + | ['Ÿ', 'Ÿ', true, 'Y - diaeresis'], |
| + | ['Þ', 'Þ', true, 'THORN'], |
| + | ['à', 'à', true, 'a - grave'], |
| + | ['á', 'á', true, 'a - acute'], |
| + | ['â', 'â', true, 'a - circumflex'], |
| + | ['ã', 'ã', true, 'a - tilde'], |
| + | ['ä', 'ä', true, 'a - diaeresis'], |
| + | ['å', 'å', true, 'a - ring above'], |
| + | ['æ', 'æ', true, 'ligature ae'], |
| + | ['ç', 'ç', true, 'c - cedilla'], |
| + | ['è', 'è', true, 'e - grave'], |
| + | ['é', 'é', true, 'e - acute'], |
| + | ['ê', 'ê', true, 'e - circumflex'], |
| + | ['ë', 'ë', true, 'e - diaeresis'], |
| + | ['ì', 'ì', true, 'i - grave'], |
| + | ['í', 'í', true, 'i - acute'], |
| + | ['î', 'î', true, 'i - circumflex'], |
| + | ['ï', 'ï', true, 'i - diaeresis'], |
| + | ['ð', 'ð', true, 'eth'], |
| + | ['ñ', 'ñ', true, 'n - tilde'], |
| + | ['ò', 'ò', true, 'o - grave'], |
| + | ['ó', 'ó', true, 'o - acute'], |
| + | ['ô', 'ô', true, 'o - circumflex'], |
| + | ['õ', 'õ', true, 'o - tilde'], |
| + | ['ö', 'ö', true, 'o - diaeresis'], |
| + | ['ø', 'ø', true, 'o slash'], |
| + | ['œ', 'œ', true, 'ligature oe'], |
| + | ['š', 'š', true, 's - caron'], |
| + | ['ù', 'ù', true, 'u - grave'], |
| + | ['ú', 'ú', true, 'u - acute'], |
| + | ['û', 'û', true, 'u - circumflex'], |
| + | ['ü', 'ü', true, 'u - diaeresis'], |
| + | ['ý', 'ý', true, 'y - acute'], |
| + | ['þ', 'þ', true, 'thorn'], |
| + | ['ÿ', 'ÿ', true, 'y - diaeresis'], |
| + | ['Α', 'Α', true, 'Alpha'], |
| + | ['Β', 'Β', true, 'Beta'], |
| + | ['Γ', 'Γ', true, 'Gamma'], |
| + | ['Δ', 'Δ', true, 'Delta'], |
| + | ['Ε', 'Ε', true, 'Epsilon'], |
| + | ['Ζ', 'Ζ', true, 'Zeta'], |
| + | ['Η', 'Η', true, 'Eta'], |
| + | ['Θ', 'Θ', true, 'Theta'], |
| + | ['Ι', 'Ι', true, 'Iota'], |
| + | ['Κ', 'Κ', true, 'Kappa'], |
| + | ['Λ', 'Λ', true, 'Lambda'], |
| + | ['Μ', 'Μ', true, 'Mu'], |
| + | ['Ν', 'Ν', true, 'Nu'], |
| + | ['Ξ', 'Ξ', true, 'Xi'], |
| + | ['Ο', 'Ο', true, 'Omicron'], |
| + | ['Π', 'Π', true, 'Pi'], |
| + | ['Ρ', 'Ρ', true, 'Rho'], |
| + | ['Σ', 'Σ', true, 'Sigma'], |
| + | ['Τ', 'Τ', true, 'Tau'], |
| + | ['Υ', 'Υ', true, 'Upsilon'], |
| + | ['Φ', 'Φ', true, 'Phi'], |
| + | ['Χ', 'Χ', true, 'Chi'], |
| + | ['Ψ', 'Ψ', true, 'Psi'], |
| + | ['Ω', 'Ω', true, 'Omega'], |
| + | ['α', 'α', true, 'alpha'], |
| + | ['β', 'β', true, 'beta'], |
| + | ['γ', 'γ', true, 'gamma'], |
| + | ['δ', 'δ', true, 'delta'], |
| + | ['ε', 'ε', true, 'epsilon'], |
| + | ['ζ', 'ζ', true, 'zeta'], |
| + | ['η', 'η', true, 'eta'], |
| + | ['θ', 'θ', true, 'theta'], |
| + | ['ι', 'ι', true, 'iota'], |
| + | ['κ', 'κ', true, 'kappa'], |
| + | ['λ', 'λ', true, 'lambda'], |
| + | ['μ', 'μ', true, 'mu'], |
| + | ['ν', 'ν', true, 'nu'], |
| + | ['ξ', 'ξ', true, 'xi'], |
| + | ['ο', 'ο', true, 'omicron'], |
| + | ['π', 'π', true, 'pi'], |
| + | ['ρ', 'ρ', true, 'rho'], |
| + | ['ς', 'ς', true, 'final sigma'], |
| + | ['σ', 'σ', true, 'sigma'], |
| + | ['τ', 'τ', true, 'tau'], |
| + | ['υ', 'υ', true, 'upsilon'], |
| + | ['φ', 'φ', true, 'phi'], |
| + | ['χ', 'χ', true, 'chi'], |
| + | ['ψ', 'ψ', true, 'psi'], |
| + | ['ω', 'ω', true, 'omega'], |
| + | // symbols |
| + | ['ℵ', 'ℵ', false,'alef symbol'], |
| + | ['ϖ', 'ϖ', false,'pi symbol'], |
| + | ['ℜ', 'ℜ', false,'real part symbol'], |
| + | ['ϑ','ϑ', false,'theta symbol'], |
| + | ['ϒ', 'ϒ', false,'upsilon - hook symbol'], |
| + | ['℘', '℘', false,'Weierstrass p'], |
| + | ['ℑ', 'ℑ', false,'imaginary part'], |
| + | // arrows |
| + | ['←', '←', true, 'leftwards arrow'], |
| + | ['↑', '↑', true, 'upwards arrow'], |
| + | ['→', '→', true, 'rightwards arrow'], |
| + | ['↓', '↓', true, 'downwards arrow'], |
| + | ['↔', '↔', true, 'left right arrow'], |
| + | ['↵', '↵', false,'carriage return'], |
| + | ['⇐', '⇐', false,'leftwards double arrow'], |
| + | ['⇑', '⇑', false,'upwards double arrow'], |
| + | ['⇒', '⇒', false,'rightwards double arrow'], |
| + | ['⇓', '⇓', false,'downwards double arrow'], |
| + | ['⇔', '⇔', false,'left right double arrow'], |
| + | ['∴', '∴', false,'therefore'], |
| + | ['⊂', '⊂', false,'subset of'], |
| + | ['⊃', '⊃', false,'superset of'], |
| + | ['⊄', '⊄', false,'not a subset of'], |
| + | ['⊆', '⊆', false,'subset of or equal to'], |
| + | ['⊇', '⊇', false,'superset of or equal to'], |
| + | ['⊕', '⊕', false,'circled plus'], |
| + | ['⊗', '⊗', false,'circled times'], |
| + | ['⊥', '⊥', false,'perpendicular'], |
| + | ['⋅', '⋅', false,'dot operator'], |
| + | ['⌈', '⌈', false,'left ceiling'], |
| + | ['⌉', '⌉', false,'right ceiling'], |
| + | ['⌊', '⌊', false,'left floor'], |
| + | ['⌋', '⌋', false,'right floor'], |
| + | ['⟨', '〈', false,'left-pointing angle bracket'], |
| + | ['⟩', '〉', false,'right-pointing angle bracket'], |
| + | ['◊', '◊', true,'lozenge'], |
| + | ['♠', '♠', false,'black spade suit'], |
| + | ['♣', '♣', true, 'black club suit'], |
| + | ['♥', '♥', true, 'black heart suit'], |
| + | ['♦', '♦', true, 'black diamond suit'], |
| + | [' ', ' ', false,'en space'], |
| + | [' ', ' ', false,'em space'], |
| + | [' ', ' ', false,'thin space'], |
| + | ['‌', '‌', false,'zero width non-joiner'], |
| + | ['‍', '‍', false,'zero width joiner'], |
| + | ['‎', '‎', false,'left-to-right mark'], |
| + | ['‏', '‏', false,'right-to-left mark'], |
| + | ['­', '­', false,'soft hyphen'] |
| + | ]; |
| + | |
| + | tinyMCEPopup.onInit.add(function() { |
| + | tinyMCEPopup.dom.setHTML('charmapView', renderCharMapHTML()); |
| + | }); |
| + | |
| + | function renderCharMapHTML() { |
| + | var charsPerRow = 20, tdWidth=20, tdHeight=20, i; |
| + | var html = '<table border="0" cellspacing="1" cellpadding="0" width="' + (tdWidth*charsPerRow) + '"><tr height="' + tdHeight + '">'; |
| + | var cols=-1; |
| + | |
| + | for (i=0; i<charmap.length; i++) { |
| + | if (charmap[i][2]==true) { |
| + | cols++; |
| + | html += '' |
| + | + '<td class="charmap">' |
| + | + '<a onmouseover="previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');" onfocus="previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');" href="javascript:void(0)" onclick="insertChar(\'' + charmap[i][1].substring(2,charmap[i][1].length-1) + '\');" onclick="return false;" onmousedown="return false;" title="' + charmap[i][3] + '">' |
| + | + charmap[i][1] |
| + | + '</a></td>'; |
| + | if ((cols+1) % charsPerRow == 0) |
| + | html += '</tr><tr height="' + tdHeight + '">'; |
| + | } |
| + | } |
| + | |
| + | if (cols % charsPerRow > 0) { |
| + | var padd = charsPerRow - (cols % charsPerRow); |
| + | for (var i=0; i<padd-1; i++) |
| + | html += '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap"> </td>'; |
| + | } |
| + | |
| + | html += '</tr></table>'; |
| + | |
| + | return html; |
| + | } |
| + | |
| + | function insertChar(chr) { |
| + | tinyMCEPopup.execCommand('mceInsertContent', false, '&#' + chr + ';'); |
| + | |
| + | // Refocus in window |
| + | if (tinyMCEPopup.isWindow) |
| + | window.focus(); |
| + | |
| + | tinyMCEPopup.editor.focus(); |
| + | tinyMCEPopup.close(); |
| + | } |
| + | |
| + | function previewChar(codeA, codeB, codeN) { |
| + | var elmA = document.getElementById('codeA'); |
| + | var elmB = document.getElementById('codeB'); |
| + | var elmV = document.getElementById('codeV'); |
| + | var elmN = document.getElementById('codeN'); |
| + | |
| + | if (codeA=='#160;') { |
| + | elmV.innerHTML = '__'; |
| + | } else { |
| + | elmV.innerHTML = '&' + codeA; |
| + | } |
| + | |
| + | elmB.innerHTML = '&' + codeA; |
| + | elmA.innerHTML = '&' + codeB; |
| + | elmN.innerHTML = codeN; |
| + | } |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/js/color_picker.js
+253
-0
| @@ | @@ -0,0 +1,253 @@ |
| + | tinyMCEPopup.requireLangPack(); |
| + | |
| + | var detail = 50, strhex = "0123456789abcdef", i, isMouseDown = false, isMouseOver = false; |
| + | |
| + | var colors = [ |
| + | "#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033", |
| + | "#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099", |
| + | "#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff", |
| + | "#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033", |
| + | "#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399", |
| + | "#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff", |
| + | "#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333", |
| + | "#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399", |
| + | "#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff", |
| + | "#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633", |
| + | "#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699", |
| + | "#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff", |
| + | "#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633", |
| + | "#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999", |
| + | "#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff", |
| + | "#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933", |
| + | "#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999", |
| + | "#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff", |
| + | "#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33", |
| + | "#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99", |
| + | "#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff", |
| + | "#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33", |
| + | "#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99", |
| + | "#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff", |
| + | "#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33", |
| + | "#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99", |
| + | "#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff" |
| + | ]; |
| + | |
| + | var named = { |
| + | '#F0F8FF':'AliceBlue','#FAEBD7':'AntiqueWhite','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige', |
| + | '#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'BlanchedAlmond','#0000FF':'Blue','#8A2BE2':'BlueViolet','#A52A2A':'Brown', |
| + | '#DEB887':'BurlyWood','#5F9EA0':'CadetBlue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'CornflowerBlue', |
| + | '#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'DarkBlue','#008B8B':'DarkCyan','#B8860B':'DarkGoldenRod', |
| + | '#A9A9A9':'DarkGray','#A9A9A9':'DarkGrey','#006400':'DarkGreen','#BDB76B':'DarkKhaki','#8B008B':'DarkMagenta','#556B2F':'DarkOliveGreen', |
| + | '#FF8C00':'Darkorange','#9932CC':'DarkOrchid','#8B0000':'DarkRed','#E9967A':'DarkSalmon','#8FBC8F':'DarkSeaGreen','#483D8B':'DarkSlateBlue', |
| + | '#2F4F4F':'DarkSlateGray','#2F4F4F':'DarkSlateGrey','#00CED1':'DarkTurquoise','#9400D3':'DarkViolet','#FF1493':'DeepPink','#00BFFF':'DeepSkyBlue', |
| + | '#696969':'DimGray','#696969':'DimGrey','#1E90FF':'DodgerBlue','#B22222':'FireBrick','#FFFAF0':'FloralWhite','#228B22':'ForestGreen', |
| + | '#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'GhostWhite','#FFD700':'Gold','#DAA520':'GoldenRod','#808080':'Gray','#808080':'Grey', |
| + | '#008000':'Green','#ADFF2F':'GreenYellow','#F0FFF0':'HoneyDew','#FF69B4':'HotPink','#CD5C5C':'IndianRed','#4B0082':'Indigo','#FFFFF0':'Ivory', |
| + | '#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'LavenderBlush','#7CFC00':'LawnGreen','#FFFACD':'LemonChiffon','#ADD8E6':'LightBlue', |
| + | '#F08080':'LightCoral','#E0FFFF':'LightCyan','#FAFAD2':'LightGoldenRodYellow','#D3D3D3':'LightGray','#D3D3D3':'LightGrey','#90EE90':'LightGreen', |
| + | '#FFB6C1':'LightPink','#FFA07A':'LightSalmon','#20B2AA':'LightSeaGreen','#87CEFA':'LightSkyBlue','#778899':'LightSlateGray','#778899':'LightSlateGrey', |
| + | '#B0C4DE':'LightSteelBlue','#FFFFE0':'LightYellow','#00FF00':'Lime','#32CD32':'LimeGreen','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon', |
| + | '#66CDAA':'MediumAquaMarine','#0000CD':'MediumBlue','#BA55D3':'MediumOrchid','#9370D8':'MediumPurple','#3CB371':'MediumSeaGreen','#7B68EE':'MediumSlateBlue', |
| + | '#00FA9A':'MediumSpringGreen','#48D1CC':'MediumTurquoise','#C71585':'MediumVioletRed','#191970':'MidnightBlue','#F5FFFA':'MintCream','#FFE4E1':'MistyRose','#FFE4B5':'Moccasin', |
| + | '#FFDEAD':'NavajoWhite','#000080':'Navy','#FDF5E6':'OldLace','#808000':'Olive','#6B8E23':'OliveDrab','#FFA500':'Orange','#FF4500':'OrangeRed','#DA70D6':'Orchid', |
| + | '#EEE8AA':'PaleGoldenRod','#98FB98':'PaleGreen','#AFEEEE':'PaleTurquoise','#D87093':'PaleVioletRed','#FFEFD5':'PapayaWhip','#FFDAB9':'PeachPuff', |
| + | '#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'PowderBlue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'RosyBrown','#4169E1':'RoyalBlue', |
| + | '#8B4513':'SaddleBrown','#FA8072':'Salmon','#F4A460':'SandyBrown','#2E8B57':'SeaGreen','#FFF5EE':'SeaShell','#A0522D':'Sienna','#C0C0C0':'Silver', |
| + | '#87CEEB':'SkyBlue','#6A5ACD':'SlateBlue','#708090':'SlateGray','#708090':'SlateGrey','#FFFAFA':'Snow','#00FF7F':'SpringGreen', |
| + | '#4682B4':'SteelBlue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet', |
| + | '#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'WhiteSmoke','#FFFF00':'Yellow','#9ACD32':'YellowGreen' |
| + | }; |
| + | |
| + | function init() { |
| + | var inputColor = convertRGBToHex(tinyMCEPopup.getWindowArg('input_color')); |
| + | |
| + | tinyMCEPopup.resizeToInnerSize(); |
| + | |
| + | generatePicker(); |
| + | |
| + | if (inputColor) { |
| + | changeFinalColor(inputColor); |
| + | |
| + | col = convertHexToRGB(inputColor); |
| + | |
| + | if (col) |
| + | updateLight(col.r, col.g, col.b); |
| + | } |
| + | } |
| + | |
| + | function insertAction() { |
| + | var color = document.getElementById("color").value, f = tinyMCEPopup.getWindowArg('func'); |
| + | |
| + | tinyMCEPopup.restoreSelection(); |
| + | |
| + | if (f) |
| + | f(color); |
| + | |
| + | tinyMCEPopup.close(); |
| + | } |
| + | |
| + | function showColor(color, name) { |
| + | if (name) |
| + | document.getElementById("colorname").innerHTML = name; |
| + | |
| + | document.getElementById("preview").style.backgroundColor = color; |
| + | document.getElementById("color").value = color.toLowerCase(); |
| + | } |
| + | |
| + | function convertRGBToHex(col) { |
| + | var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi"); |
| + | |
| + | if (!col) |
| + | return col; |
| + | |
| + | var rgb = col.replace(re, "$1,$2,$3").split(','); |
| + | if (rgb.length == 3) { |
| + | r = parseInt(rgb[0]).toString(16); |
| + | g = parseInt(rgb[1]).toString(16); |
| + | b = parseInt(rgb[2]).toString(16); |
| + | |
| + | r = r.length == 1 ? '0' + r : r; |
| + | g = g.length == 1 ? '0' + g : g; |
| + | b = b.length == 1 ? '0' + b : b; |
| + | |
| + | return "#" + r + g + b; |
| + | } |
| + | |
| + | return col; |
| + | } |
| + | |
| + | function convertHexToRGB(col) { |
| + | if (col.indexOf('#') != -1) { |
| + | col = col.replace(new RegExp('[^0-9A-F]', 'gi'), ''); |
| + | |
| + | r = parseInt(col.substring(0, 2), 16); |
| + | g = parseInt(col.substring(2, 4), 16); |
| + | b = parseInt(col.substring(4, 6), 16); |
| + | |
| + | return {r : r, g : g, b : b}; |
| + | } |
| + | |
| + | return null; |
| + | } |
| + | |
| + | function generatePicker() { |
| + | var el = document.getElementById('light'), h = '', i; |
| + | |
| + | for (i = 0; i < detail; i++){ |
| + | h += '<div id="gs'+i+'" style="background-color:#000000; width:15px; height:3px; border-style:none; border-width:0px;"' |
| + | + ' onclick="changeFinalColor(this.style.backgroundColor)"' |
| + | + ' onmousedown="isMouseDown = true; return false;"' |
| + | + ' onmouseup="isMouseDown = false;"' |
| + | + ' onmousemove="if (isMouseDown && isMouseOver) changeFinalColor(this.style.backgroundColor); return false;"' |
| + | + ' onmouseover="isMouseOver = true;"' |
| + | + ' onmouseout="isMouseOver = false;"' |
| + | + '></div>'; |
| + | } |
| + | |
| + | el.innerHTML = h; |
| + | } |
| + | |
| + | function generateWebColors() { |
| + | var el = document.getElementById('webcolors'), h = '', i; |
| + | |
| + | if (el.className == 'generated') |
| + | return; |
| + | |
| + | h += '<table border="0" cellspacing="1" cellpadding="0">' |
| + | + '<tr>'; |
| + | |
| + | for (i=0; i<colors.length; i++) { |
| + | h += '<td bgcolor="' + colors[i] + '" width="10" height="10">' |
| + | + '<a href="javascript:insertAction();" onfocus="showColor(\'' + colors[i] + '\');" onmouseover="showColor(\'' + colors[i] + '\');" style="display:block;width:10px;height:10px;overflow:hidden;">' |
| + | + '</a></td>'; |
| + | if ((i+1) % 18 == 0) |
| + | h += '</tr><tr>'; |
| + | } |
| + | |
| + | h += '</table>'; |
| + | |
| + | el.innerHTML = h; |
| + | el.className = 'generated'; |
| + | } |
| + | |
| + | function generateNamedColors() { |
| + | var el = document.getElementById('namedcolors'), h = '', n, v, i = 0; |
| + | |
| + | if (el.className == 'generated') |
| + | return; |
| + | |
| + | for (n in named) { |
| + | v = named[n]; |
| + | h += '<a href="javascript:insertAction();" onmouseover="showColor(\'' + n + '\',\'' + v + '\');" style="background-color: ' + n + '"><!-- IE --></a>' |
| + | } |
| + | |
| + | el.innerHTML = h; |
| + | el.className = 'generated'; |
| + | } |
| + | |
| + | function dechex(n) { |
| + | return strhex.charAt(Math.floor(n / 16)) + strhex.charAt(n % 16); |
| + | } |
| + | |
| + | function computeColor(e) { |
| + | var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB; |
| + | |
| + | x = e.offsetX ? e.offsetX : (e.target ? e.clientX - e.target.x : 0); |
| + | y = e.offsetY ? e.offsetY : (e.target ? e.clientY - e.target.y : 0); |
| + | |
| + | partWidth = document.getElementById('colors').width / 6; |
| + | partDetail = detail / 2; |
| + | imHeight = document.getElementById('colors').height; |
| + | |
| + | r = (x >= 0)*(x < partWidth)*255 + (x >= partWidth)*(x < 2*partWidth)*(2*255 - x * 255 / partWidth) + (x >= 4*partWidth)*(x < 5*partWidth)*(-4*255 + x * 255 / partWidth) + (x >= 5*partWidth)*(x < 6*partWidth)*255; |
| + | g = (x >= 0)*(x < partWidth)*(x * 255 / partWidth) + (x >= partWidth)*(x < 3*partWidth)*255 + (x >= 3*partWidth)*(x < 4*partWidth)*(4*255 - x * 255 / partWidth); |
| + | b = (x >= 2*partWidth)*(x < 3*partWidth)*(-2*255 + x * 255 / partWidth) + (x >= 3*partWidth)*(x < 5*partWidth)*255 + (x >= 5*partWidth)*(x < 6*partWidth)*(6*255 - x * 255 / partWidth); |
| + | |
| + | coef = (imHeight - y) / imHeight; |
| + | r = 128 + (r - 128) * coef; |
| + | g = 128 + (g - 128) * coef; |
| + | b = 128 + (b - 128) * coef; |
| + | |
| + | changeFinalColor('#' + dechex(r) + dechex(g) + dechex(b)); |
| + | updateLight(r, g, b); |
| + | } |
| + | |
| + | function updateLight(r, g, b) { |
| + | var i, partDetail = detail / 2, finalCoef, finalR, finalG, finalB, color; |
| + | |
| + | for (i=0; i<detail; i++) { |
| + | if ((i>=0) && (i<partDetail)) { |
| + | finalCoef = i / partDetail; |
| + | finalR = dechex(255 - (255 - r) * finalCoef); |
| + | finalG = dechex(255 - (255 - g) * finalCoef); |
| + | finalB = dechex(255 - (255 - b) * finalCoef); |
| + | } else { |
| + | finalCoef = 2 - i / partDetail; |
| + | finalR = dechex(r * finalCoef); |
| + | finalG = dechex(g * finalCoef); |
| + | finalB = dechex(b * finalCoef); |
| + | } |
| + | |
| + | color = finalR + finalG + finalB; |
| + | |
| + | setCol('gs' + i, '#'+color); |
| + | } |
| + | } |
| + | |
| + | function changeFinalColor(color) { |
| + | if (color.indexOf('#') == -1) |
| + | color = convertRGBToHex(color); |
| + | |
| + | setCol('preview', color); |
| + | document.getElementById('color').value = color; |
| + | } |
| + | |
| + | function setCol(e, c) { |
| + | try { |
| + | document.getElementById(e).style.backgroundColor = c; |
| + | } catch (ex) { |
| + | // Ignore IE warning |
| + | } |
| + | } |
| + | |
| + | tinyMCEPopup.onInit.add(init); |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/js/image.js
+245
-0
| @@ | @@ -0,0 +1,245 @@ |
| + | var ImageDialog = { |
| + | preInit : function() { |
| + | var url; |
| + | |
| + | tinyMCEPopup.requireLangPack(); |
| + | |
| + | if (url = tinyMCEPopup.getParam("external_image_list_url")) |
| + | document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>'); |
| + | }, |
| + | |
| + | init : function() { |
| + | var f = document.forms[0], ed = tinyMCEPopup.editor; |
| + | |
| + | // Setup browse button |
| + | document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image'); |
| + | if (isVisible('srcbrowser')) |
| + | document.getElementById('src').style.width = '180px'; |
| + | |
| + | e = ed.selection.getNode(); |
| + | |
| + | this.fillFileList('image_list', 'tinyMCEImageList'); |
| + | |
| + | if (e.nodeName == 'IMG') { |
| + | f.src.value = ed.dom.getAttrib(e, 'src'); |
| + | f.alt.value = ed.dom.getAttrib(e, 'alt'); |
| + | f.border.value = this.getAttrib(e, 'border'); |
| + | f.vspace.value = this.getAttrib(e, 'vspace'); |
| + | f.hspace.value = this.getAttrib(e, 'hspace'); |
| + | f.width.value = ed.dom.getAttrib(e, 'width'); |
| + | f.height.value = ed.dom.getAttrib(e, 'height'); |
| + | f.insert.value = ed.getLang('update'); |
| + | this.styleVal = ed.dom.getAttrib(e, 'style'); |
| + | selectByValue(f, 'image_list', f.src.value); |
| + | selectByValue(f, 'align', this.getAttrib(e, 'align')); |
| + | this.updateStyle(); |
| + | } |
| + | }, |
| + | |
| + | fillFileList : function(id, l) { |
| + | var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; |
| + | |
| + | l = window[l]; |
| + | |
| + | if (l && l.length > 0) { |
| + | lst.options[lst.options.length] = new Option('', ''); |
| + | |
| + | tinymce.each(l, function(o) { |
| + | lst.options[lst.options.length] = new Option(o[0], o[1]); |
| + | }); |
| + | } else |
| + | dom.remove(dom.getParent(id, 'tr')); |
| + | }, |
| + | |
| + | update : function() { |
| + | var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, args = {}, el; |
| + | |
| + | tinyMCEPopup.restoreSelection(); |
| + | |
| + | if (f.src.value === '') { |
| + | if (ed.selection.getNode().nodeName == 'IMG') { |
| + | ed.dom.remove(ed.selection.getNode()); |
| + | ed.execCommand('mceRepaint'); |
| + | } |
| + | |
| + | tinyMCEPopup.close(); |
| + | return; |
| + | } |
| + | |
| + | if (!ed.settings.inline_styles) { |
| + | args = tinymce.extend(args, { |
| + | vspace : nl.vspace.value, |
| + | hspace : nl.hspace.value, |
| + | border : nl.border.value, |
| + | align : getSelectValue(f, 'align') |
| + | }); |
| + | } else |
| + | args.style = this.styleVal; |
| + | |
| + | tinymce.extend(args, { |
| + | src : f.src.value, |
| + | alt : f.alt.value, |
| + | width : f.width.value, |
| + | height : f.height.value |
| + | }); |
| + | |
| + | el = ed.selection.getNode(); |
| + | |
| + | if (el && el.nodeName == 'IMG') { |
| + | ed.dom.setAttribs(el, args); |
| + | } else { |
| + | ed.execCommand('mceInsertContent', false, '<img id="__mce_tmp" />', {skip_undo : 1}); |
| + | ed.dom.setAttribs('__mce_tmp', args); |
| + | ed.dom.setAttrib('__mce_tmp', 'id', ''); |
| + | ed.undoManager.add(); |
| + | } |
| + | |
| + | tinyMCEPopup.close(); |
| + | }, |
| + | |
| + | updateStyle : function() { |
| + | var dom = tinyMCEPopup.dom, st, v, f = document.forms[0]; |
| + | |
| + | if (tinyMCEPopup.editor.settings.inline_styles) { |
| + | st = tinyMCEPopup.dom.parseStyle(this.styleVal); |
| + | |
| + | // Handle align |
| + | v = getSelectValue(f, 'align'); |
| + | if (v) { |
| + | if (v == 'left' || v == 'right') { |
| + | st['float'] = v; |
| + | delete st['vertical-align']; |
| + | } else { |
| + | st['vertical-align'] = v; |
| + | delete st['float']; |
| + | } |
| + | } else { |
| + | delete st['float']; |
| + | delete st['vertical-align']; |
| + | } |
| + | |
| + | // Handle border |
| + | v = f.border.value; |
| + | if (v || v == '0') { |
| + | if (v == '0') |
| + | st['border'] = '0'; |
| + | else |
| + | st['border'] = v + 'px solid black'; |
| + | } else |
| + | delete st['border']; |
| + | |
| + | // Handle hspace |
| + | v = f.hspace.value; |
| + | if (v) { |
| + | delete st['margin']; |
| + | st['margin-left'] = v + 'px'; |
| + | st['margin-right'] = v + 'px'; |
| + | } else { |
| + | delete st['margin-left']; |
| + | delete st['margin-right']; |
| + | } |
| + | |
| + | // Handle vspace |
| + | v = f.vspace.value; |
| + | if (v) { |
| + | delete st['margin']; |
| + | st['margin-top'] = v + 'px'; |
| + | st['margin-bottom'] = v + 'px'; |
| + | } else { |
| + | delete st['margin-top']; |
| + | delete st['margin-bottom']; |
| + | } |
| + | |
| + | // Merge |
| + | st = tinyMCEPopup.dom.parseStyle(dom.serializeStyle(st), 'img'); |
| + | this.styleVal = dom.serializeStyle(st, 'img'); |
| + | } |
| + | }, |
| + | |
| + | getAttrib : function(e, at) { |
| + | var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2; |
| + | |
| + | if (ed.settings.inline_styles) { |
| + | switch (at) { |
| + | case 'align': |
| + | if (v = dom.getStyle(e, 'float')) |
| + | return v; |
| + | |
| + | if (v = dom.getStyle(e, 'vertical-align')) |
| + | return v; |
| + | |
| + | break; |
| + | |
| + | case 'hspace': |
| + | v = dom.getStyle(e, 'margin-left') |
| + | v2 = dom.getStyle(e, 'margin-right'); |
| + | if (v && v == v2) |
| + | return parseInt(v.replace(/[^0-9]/g, '')); |
| + | |
| + | break; |
| + | |
| + | case 'vspace': |
| + | v = dom.getStyle(e, 'margin-top') |
| + | v2 = dom.getStyle(e, 'margin-bottom'); |
| + | if (v && v == v2) |
| + | return parseInt(v.replace(/[^0-9]/g, '')); |
| + | |
| + | break; |
| + | |
| + | case 'border': |
| + | v = 0; |
| + | |
| + | tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) { |
| + | sv = dom.getStyle(e, 'border-' + sv + '-width'); |
| + | |
| + | // False or not the same as prev |
| + | if (!sv || (sv != v && v !== 0)) { |
| + | v = 0; |
| + | return false; |
| + | } |
| + | |
| + | if (sv) |
| + | v = sv; |
| + | }); |
| + | |
| + | if (v) |
| + | return parseInt(v.replace(/[^0-9]/g, '')); |
| + | |
| + | break; |
| + | } |
| + | } |
| + | |
| + | if (v = dom.getAttrib(e, at)) |
| + | return v; |
| + | |
| + | return ''; |
| + | }, |
| + | |
| + | resetImageData : function() { |
| + | var f = document.forms[0]; |
| + | |
| + | f.width.value = f.height.value = ""; |
| + | }, |
| + | |
| + | updateImageData : function() { |
| + | var f = document.forms[0], t = ImageDialog; |
| + | |
| + | if (f.width.value == "") |
| + | f.width.value = t.preloadImg.width; |
| + | |
| + | if (f.height.value == "") |
| + | f.height.value = t.preloadImg.height; |
| + | }, |
| + | |
| + | getImageData : function() { |
| + | var f = document.forms[0]; |
| + | |
| + | this.preloadImg = new Image(); |
| + | this.preloadImg.onload = this.updateImageData; |
| + | this.preloadImg.onerror = this.resetImageData; |
| + | this.preloadImg.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(f.src.value); |
| + | } |
| + | }; |
| + | |
| + | ImageDialog.preInit(); |
| + | tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog); |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/js/link.js
+156
-0
| @@ | @@ -0,0 +1,156 @@ |
| + | tinyMCEPopup.requireLangPack(); |
| + | |
| + | var LinkDialog = { |
| + | preInit : function() { |
| + | var url; |
| + | |
| + | if (url = tinyMCEPopup.getParam("external_link_list_url")) |
| + | document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>'); |
| + | }, |
| + | |
| + | init : function() { |
| + | var f = document.forms[0], ed = tinyMCEPopup.editor; |
| + | |
| + | // Setup browse button |
| + | document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser', 'href', 'file', 'theme_advanced_link'); |
| + | if (isVisible('hrefbrowser')) |
| + | document.getElementById('href').style.width = '180px'; |
| + | |
| + | this.fillClassList('class_list'); |
| + | this.fillFileList('link_list', 'tinyMCELinkList'); |
| + | this.fillTargetList('target_list'); |
| + | |
| + | if (e = ed.dom.getParent(ed.selection.getNode(), 'A')) { |
| + | f.href.value = ed.dom.getAttrib(e, 'href'); |
| + | f.linktitle.value = ed.dom.getAttrib(e, 'title'); |
| + | f.insert.value = ed.getLang('update'); |
| + | selectByValue(f, 'link_list', f.href.value); |
| + | selectByValue(f, 'target_list', ed.dom.getAttrib(e, 'target')); |
| + | selectByValue(f, 'class_list', ed.dom.getAttrib(e, 'class')); |
| + | } |
| + | }, |
| + | |
| + | update : function() { |
| + | var f = document.forms[0], ed = tinyMCEPopup.editor, e, b; |
| + | |
| + | tinyMCEPopup.restoreSelection(); |
| + | e = ed.dom.getParent(ed.selection.getNode(), 'A'); |
| + | |
| + | // Remove element if there is no href |
| + | if (!f.href.value) { |
| + | if (e) { |
| + | tinyMCEPopup.execCommand("mceBeginUndoLevel"); |
| + | b = ed.selection.getBookmark(); |
| + | ed.dom.remove(e, 1); |
| + | ed.selection.moveToBookmark(b); |
| + | tinyMCEPopup.execCommand("mceEndUndoLevel"); |
| + | tinyMCEPopup.close(); |
| + | return; |
| + | } |
| + | } |
| + | |
| + | tinyMCEPopup.execCommand("mceBeginUndoLevel"); |
| + | |
| + | // Create new anchor elements |
| + | if (e == null) { |
| + | ed.getDoc().execCommand("unlink", false, null); |
| + | tinyMCEPopup.execCommand("CreateLink", false, "#mce_temp_url#", {skip_undo : 1}); |
| + | |
| + | tinymce.each(ed.dom.select("a"), function(n) { |
| + | if (ed.dom.getAttrib(n, 'href') == '#mce_temp_url#') { |
| + | e = n; |
| + | |
| + | ed.dom.setAttribs(e, { |
| + | href : f.href.value, |
| + | title : f.linktitle.value, |
| + | target : f.target_list ? getSelectValue(f, "target_list") : null, |
| + | 'class' : f.class_list ? getSelectValue(f, "class_list") : null |
| + | }); |
| + | } |
| + | }); |
| + | } else { |
| + | ed.dom.setAttribs(e, { |
| + | href : f.href.value, |
| + | title : f.linktitle.value, |
| + | target : f.target_list ? getSelectValue(f, "target_list") : null, |
| + | 'class' : f.class_list ? getSelectValue(f, "class_list") : null |
| + | }); |
| + | } |
| + | |
| + | // Don't move caret if selection was image |
| + | if (e.childNodes.length != 1 || e.firstChild.nodeName != 'IMG') { |
| + | ed.focus(); |
| + | ed.selection.select(e); |
| + | ed.selection.collapse(0); |
| + | tinyMCEPopup.storeSelection(); |
| + | } |
| + | |
| + | tinyMCEPopup.execCommand("mceEndUndoLevel"); |
| + | tinyMCEPopup.close(); |
| + | }, |
| + | |
| + | checkPrefix : function(n) { |
| + | if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_email'))) |
| + | n.value = 'mailto:' + n.value; |
| + | |
| + | if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_external'))) |
| + | n.value = 'http://' + n.value; |
| + | }, |
| + | |
| + | fillFileList : function(id, l) { |
| + | var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; |
| + | |
| + | l = window[l]; |
| + | |
| + | if (l && l.length > 0) { |
| + | lst.options[lst.options.length] = new Option('', ''); |
| + | |
| + | tinymce.each(l, function(o) { |
| + | lst.options[lst.options.length] = new Option(o[0], o[1]); |
| + | }); |
| + | } else |
| + | dom.remove(dom.getParent(id, 'tr')); |
| + | }, |
| + | |
| + | fillClassList : function(id) { |
| + | var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; |
| + | |
| + | if (v = tinyMCEPopup.getParam('theme_advanced_styles')) { |
| + | cl = []; |
| + | |
| + | tinymce.each(v.split(';'), function(v) { |
| + | var p = v.split('='); |
| + | |
| + | cl.push({'title' : p[0], 'class' : p[1]}); |
| + | }); |
| + | } else |
| + | cl = tinyMCEPopup.editor.dom.getClasses(); |
| + | |
| + | if (cl.length > 0) { |
| + | lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); |
| + | |
| + | tinymce.each(cl, function(o) { |
| + | lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']); |
| + | }); |
| + | } else |
| + | dom.remove(dom.getParent(id, 'tr')); |
| + | }, |
| + | |
| + | fillTargetList : function(id) { |
| + | var dom = tinyMCEPopup.dom, lst = dom.get(id), v; |
| + | |
| + | lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); |
| + | lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_same'), '_self'); |
| + | lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_blank'), '_blank'); |
| + | |
| + | if (v = tinyMCEPopup.getParam('theme_advanced_link_targets')) { |
| + | tinymce.each(v.split(','), function(v) { |
| + | v = v.split('='); |
| + | lst.options[lst.options.length] = new Option(v[0], v[1]); |
| + | }); |
| + | } |
| + | } |
| + | }; |
| + | |
| + | LinkDialog.preInit(); |
| + | tinyMCEPopup.onInit.add(LinkDialog.init, LinkDialog); |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/js/source_editor.js
+62
-0
| @@ | @@ -0,0 +1,62 @@ |
| + | tinyMCEPopup.requireLangPack(); |
| + | tinyMCEPopup.onInit.add(onLoadInit); |
| + | |
| + | function saveContent() { |
| + | tinyMCEPopup.editor.setContent(document.getElementById('htmlSource').value, {source_view : true}); |
| + | tinyMCEPopup.close(); |
| + | } |
| + | |
| + | function onLoadInit() { |
| + | tinyMCEPopup.resizeToInnerSize(); |
| + | |
| + | // Remove Gecko spellchecking |
| + | if (tinymce.isGecko) |
| + | document.body.spellcheck = tinyMCEPopup.editor.getParam("gecko_spellcheck"); |
| + | |
| + | document.getElementById('htmlSource').value = tinyMCEPopup.editor.getContent({source_view : true}); |
| + | |
| + | if (tinyMCEPopup.editor.getParam("theme_advanced_source_editor_wrap", true)) { |
| + | setWrap('soft'); |
| + | document.getElementById('wraped').checked = true; |
| + | } |
| + | |
| + | resizeInputs(); |
| + | } |
| + | |
| + | function setWrap(val) { |
| + | var v, n, s = document.getElementById('htmlSource'); |
| + | |
| + | s.wrap = val; |
| + | |
| + | if (!tinymce.isIE) { |
| + | v = s.value; |
| + | n = s.cloneNode(false); |
| + | n.setAttribute("wrap", val); |
| + | s.parentNode.replaceChild(n, s); |
| + | n.value = v; |
| + | } |
| + | } |
| + | |
| + | function toggleWordWrap(elm) { |
| + | if (elm.checked) |
| + | setWrap('soft'); |
| + | else |
| + | setWrap('off'); |
| + | } |
| + | |
| + | var wHeight=0, wWidth=0, owHeight=0, owWidth=0; |
| + | |
| + | function resizeInputs() { |
| + | var el = document.getElementById('htmlSource'); |
| + | |
| + | if (!tinymce.isIE) { |
| + | wHeight = self.innerHeight - 65; |
| + | wWidth = self.innerWidth - 16; |
| + | } else { |
| + | wHeight = document.body.clientHeight - 70; |
| + | wWidth = document.body.clientWidth - 16; |
| + | } |
| + | |
| + | el.style.height = Math.abs(wHeight) + 'px'; |
| + | el.style.width = Math.abs(wWidth) + 'px'; |
| + | } |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/langs/en.js
+62
-0
| @@ | @@ -0,0 +1,62 @@ |
| + | tinyMCE.addI18n('en.advanced',{ |
| + | style_select:"Styles", |
| + | font_size:"Font size", |
| + | fontdefault:"Font family", |
| + | block:"Format", |
| + | paragraph:"Paragraph", |
| + | div:"Div", |
| + | address:"Address", |
| + | pre:"Preformatted", |
| + | h1:"Heading 1", |
| + | h2:"Heading 2", |
| + | h3:"Heading 3", |
| + | h4:"Heading 4", |
| + | h5:"Heading 5", |
| + | h6:"Heading 6", |
| + | blockquote:"Blockquote", |
| + | code:"Code", |
| + | samp:"Code sample", |
| + | dt:"Definition term ", |
| + | dd:"Definition description", |
| + | bold_desc:"Bold (Ctrl+B)", |
| + | italic_desc:"Italic (Ctrl+I)", |
| + | underline_desc:"Underline (Ctrl+U)", |
| + | striketrough_desc:"Strikethrough", |
| + | justifyleft_desc:"Align left", |
| + | justifycenter_desc:"Align center", |
| + | justifyright_desc:"Align right", |
| + | justifyfull_desc:"Align full", |
| + | bullist_desc:"Unordered list", |
| + | numlist_desc:"Ordered list", |
| + | outdent_desc:"Outdent", |
| + | indent_desc:"Indent", |
| + | undo_desc:"Undo (Ctrl+Z)", |
| + | redo_desc:"Redo (Ctrl+Y)", |
| + | link_desc:"Insert/edit link", |
| + | unlink_desc:"Unlink", |
| + | image_desc:"Insert/edit image", |
| + | cleanup_desc:"Cleanup messy code", |
| + | code_desc:"Edit HTML Source", |
| + | sub_desc:"Subscript", |
| + | sup_desc:"Superscript", |
| + | hr_desc:"Insert horizontal ruler", |
| + | removeformat_desc:"Remove formatting", |
| + | custom1_desc:"Your custom description here", |
| + | forecolor_desc:"Select text color", |
| + | backcolor_desc:"Select background color", |
| + | charmap_desc:"Insert custom character", |
| + | visualaid_desc:"Toggle guidelines/invisible elements", |
| + | anchor_desc:"Insert/edit anchor", |
| + | cut_desc:"Cut", |
| + | copy_desc:"Copy", |
| + | paste_desc:"Paste", |
| + | image_props_desc:"Image properties", |
| + | newdocument_desc:"New document", |
| + | help_desc:"Help", |
| + | blockquote_desc:"Blockquote", |
| + | clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\r\nDo you want more information about this issue?", |
| + | path:"Path", |
| + | newdocument:"Are you sure you want clear all contents?", |
| + | toolbar_focus:"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X", |
| + | more_colors:"More colors" |
| + | }); |
| \ No newline at end of file | |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/langs/en_dlg.js
+51
-0
| @@ | @@ -0,0 +1,51 @@ |
| + | tinyMCE.addI18n('en.advanced_dlg',{ |
| + | about_title:"About TinyMCE", |
| + | about_general:"About", |
| + | about_help:"Help", |
| + | about_license:"License", |
| + | about_plugins:"Plugins", |
| + | about_plugin:"Plugin", |
| + | about_author:"Author", |
| + | about_version:"Version", |
| + | about_loaded:"Loaded plugins", |
| + | anchor_title:"Insert/edit anchor", |
| + | anchor_name:"Anchor name", |
| + | code_title:"HTML Source Editor", |
| + | code_wordwrap:"Word wrap", |
| + | colorpicker_title:"Select a color", |
| + | colorpicker_picker_tab:"Picker", |
| + | colorpicker_picker_title:"Color picker", |
| + | colorpicker_palette_tab:"Palette", |
| + | colorpicker_palette_title:"Palette colors", |
| + | colorpicker_named_tab:"Named", |
| + | colorpicker_named_title:"Named colors", |
| + | colorpicker_color:"Color:", |
| + | colorpicker_name:"Name:", |
| + | charmap_title:"Select custom character", |
| + | image_title:"Insert/edit image", |
| + | image_src:"Image URL", |
| + | image_alt:"Image description", |
| + | image_list:"Image list", |
| + | image_border:"Border", |
| + | image_dimensions:"Dimensions", |
| + | image_vspace:"Vertical space", |
| + | image_hspace:"Horizontal space", |
| + | image_align:"Alignment", |
| + | image_align_baseline:"Baseline", |
| + | image_align_top:"Top", |
| + | image_align_middle:"Middle", |
| + | image_align_bottom:"Bottom", |
| + | image_align_texttop:"Text top", |
| + | image_align_textbottom:"Text bottom", |
| + | image_align_left:"Left", |
| + | image_align_right:"Right", |
| + | link_title:"Insert/edit link", |
| + | link_url:"Link URL", |
| + | link_target:"Target", |
| + | link_target_same:"Open link in the same window", |
| + | link_target_blank:"Open link in a new window", |
| + | link_titlefield:"Title", |
| + | link_is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?", |
| + | link_is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?", |
| + | link_list:"Link list" |
| + | }); |
| \ No newline at end of file | |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/link.htm
+58
-0
| @@ | @@ -0,0 +1,58 @@ |
| + | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
| + | <html xmlns="http://www.w3.org/1999/xhtml"> |
| + | <head> |
| + | <title>{#advanced_dlg.link_title}</title> |
| + | <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/form_utils.js"></script> |
| + | <script type="text/javascript" src="../../utils/validate.js"></script> |
| + | <script type="text/javascript" src="js/link.js"></script> |
| + | </head> |
| + | <body id="link" style="display: none"> |
| + | <form onsubmit="LinkDialog.update();return false;" action="#"> |
| + | <div class="tabs"> |
| + | <ul> |
| + | <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advanced_dlg.link_title}</a></span></li> |
| + | </ul> |
| + | </div> |
| + | |
| + | <div class="panel_wrapper"> |
| + | <div id="general_panel" class="panel current"> |
| + | |
| + | <table border="0" cellpadding="4" cellspacing="0"> |
| + | <tr> |
| + | <td class="nowrap"><label for="href">{#advanced_dlg.link_url}</label></td> |
| + | <td><table border="0" cellspacing="0" cellpadding="0"> |
| + | <tr> |
| + | <td><input id="href" name="href" type="text" class="mceFocus" value="" style="width: 200px" onchange="LinkDialog.checkPrefix(this);" /></td> |
| + | <td id="hrefbrowsercontainer"> </td> |
| + | </tr> |
| + | </table></td> |
| + | </tr> |
| + | <tr> |
| + | <td><label for="link_list">{#advanced_dlg.link_list}</label></td> |
| + | <td><select id="link_list" name="link_list" onchange="document.getElementById('href').value=this.options[this.selectedIndex].value;"></select></td> |
| + | </tr> |
| + | <tr> |
| + | <td><label id="targetlistlabel" for="targetlist">{#advanced_dlg.link_target}</label></td> |
| + | <td><select id="target_list" name="target_list"></select></td> |
| + | </tr> |
| + | <tr> |
| + | <td class="nowrap"><label for="linktitle">{#advanced_dlg.link_titlefield}</label></td> |
| + | <td><input id="linktitle" name="linktitle" type="text" value="" style="width: 200px" /></td> |
| + | </tr> |
| + | <tr> |
| + | <td><label for="class_list">{#class_name}</label></td> |
| + | <td><select id="class_list" name="class_list"></select></td> |
| + | </tr> |
| + | </table> |
| + | </div> |
| + | </div> |
| + | |
| + | <div class="mceActionPanel"> |
| + | <input type="submit" id="insert" name="insert" value="{#insert}" /> |
| + | <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> |
| + | </div> |
| + | </form> |
| + | </body> |
| + | </html> |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/skins/default/content.css
+36
-0
| @@ | @@ -0,0 +1,36 @@ |
| + | body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} |
| + | body {background:#FFF;} |
| + | body.mceForceColors {background:#FFF; color:#000;} |
| + | h1 {font-size: 2em} |
| + | h2 {font-size: 1.5em} |
| + | h3 {font-size: 1.17em} |
| + | h4 {font-size: 1em} |
| + | h5 {font-size: .83em} |
| + | h6 {font-size: .75em} |
| + | .mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} |
| + | a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(img/items.gif) no-repeat 0 0;} |
| + | span.mceItemNbsp {background: #DDD} |
| + | td.mceSelected, th.mceSelected {background-color:#3399ff !important} |
| + | img {border:0;} |
| + | table {cursor:default} |
| + | table td, table th {cursor:text} |
| + | ins {border-bottom:1px solid green; text-decoration: none; color:green} |
| + | del {color:red; text-decoration:line-through} |
| + | cite {border-bottom:1px dashed blue} |
| + | acronym {border-bottom:1px dotted #CCC; cursor:help} |
| + | abbr {border-bottom:1px dashed #CCC; cursor:help} |
| + | |
| + | /* IE */ |
| + | * html body { |
| + | scrollbar-3dlight-color:#F0F0EE; |
| + | scrollbar-arrow-color:#676662; |
| + | scrollbar-base-color:#F0F0EE; |
| + | scrollbar-darkshadow-color:#DDD; |
| + | scrollbar-face-color:#E0E0DD; |
| + | scrollbar-highlight-color:#F0F0EE; |
| + | scrollbar-shadow-color:#F0F0EE; |
| + | scrollbar-track-color:#F5F5F5; |
| + | } |
| + | |
| + | img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} |
| + | font[face=mceinline] {font-family:inherit !important} |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/skins/default/dialog.css
+117
-0
| @@ | @@ -0,0 +1,117 @@ |
| + | /* Generic */ |
| + | body { |
| + | font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; |
| + | scrollbar-3dlight-color:#F0F0EE; |
| + | scrollbar-arrow-color:#676662; |
| + | scrollbar-base-color:#F0F0EE; |
| + | scrollbar-darkshadow-color:#DDDDDD; |
| + | scrollbar-face-color:#E0E0DD; |
| + | scrollbar-highlight-color:#F0F0EE; |
| + | scrollbar-shadow-color:#F0F0EE; |
| + | scrollbar-track-color:#F5F5F5; |
| + | background:#F0F0EE; |
| + | padding:0; |
| + | margin:8px 8px 0 8px; |
| + | } |
| + | |
| + | html {background:#F0F0EE;} |
| + | td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} |
| + | textarea {resize:none;outline:none;} |
| + | a:link, a:visited {color:black;} |
| + | a:hover {color:#2B6FB6;} |
| + | .nowrap {white-space: nowrap} |
| + | |
| + | /* Forms */ |
| + | fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} |
| + | legend {color:#2B6FB6; font-weight:bold;} |
| + | label.msg {display:none;} |
| + | label.invalid {color:#EE0000; display:inline;} |
| + | input.invalid {border:1px solid #EE0000;} |
| + | input {background:#FFF; border:1px solid #CCC;} |
| + | input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} |
| + | input, select, textarea {border:1px solid #808080;} |
| + | input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} |
| + | input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} |
| + | .input_noborder {border:0;} |
| + | |
| + | /* Buttons */ |
| + | #insert, #cancel, input.button, .updateButton { |
| + | border:0; margin:0; padding:0; |
| + | font-weight:bold; |
| + | width:94px; height:26px; |
| + | background:url(img/buttons.png) 0 -26px; |
| + | cursor:pointer; |
| + | padding-bottom:2px; |
| + | float:left; |
| + | } |
| + | |
| + | #insert {background:url(img/buttons.png) 0 -52px} |
| + | #cancel {background:url(img/buttons.png) 0 0; float:right} |
| + | |
| + | /* Browse */ |
| + | a.pickcolor, a.browse {text-decoration:none} |
| + | a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} |
| + | .mceOldBoxModel a.browse span {width:22px; height:20px;} |
| + | a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} |
| + | a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} |
| + | a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} |
| + | a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} |
| + | .mceOldBoxModel a.pickcolor span {width:21px; height:17px;} |
| + | a.pickcolor:hover span {background-color:#B2BBD0;} |
| + | a.pickcolor:hover span.disabled {} |
| + | |
| + | /* Charmap */ |
| + | table.charmap {border:1px solid #AAA; text-align:center} |
| + | td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} |
| + | #charmap a {display:block; color:#000; text-decoration:none; border:0} |
| + | #charmap a:hover {background:#CCC;color:#2B6FB6} |
| + | #charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} |
| + | #charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} |
| + | |
| + | /* Source */ |
| + | .wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} |
| + | .mceActionPanel {margin-top:5px;} |
| + | |
| + | /* Tabs classes */ |
| + | .tabs {width:100%; height:18px; line-height:normal; background:url(img/tabs.gif) repeat-x 0 -72px;} |
| + | .tabs ul {margin:0; padding:0; list-style:none;} |
| + | .tabs li {float:left; background:url(img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} |
| + | .tabs li.current {background:url(img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} |
| + | .tabs span {float:left; display:block; background:url(img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} |
| + | .tabs .current span {background:url(img/tabs.gif) no-repeat right -54px;} |
| + | .tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} |
| + | .tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} |
| + | |
| + | /* Panels */ |
| + | .panel_wrapper div.panel {display:none;} |
| + | .panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} |
| + | .panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;} |
| + | |
| + | /* Columns */ |
| + | .column {float:left;} |
| + | .properties {width:100%;} |
| + | .properties .column1 {} |
| + | .properties .column2 {text-align:left;} |
| + | |
| + | /* Titles */ |
| + | h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} |
| + | h3 {font-size:14px;} |
| + | .title {font-size:12px; font-weight:bold; color:#2B6FB6;} |
| + | |
| + | /* Dialog specific */ |
| + | #link .panel_wrapper, #link div.current {height:125px;} |
| + | #image .panel_wrapper, #image div.current {height:200px;} |
| + | #plugintable thead {font-weight:bold; background:#DDD;} |
| + | #plugintable, #about #plugintable td {border:1px solid #919B9C;} |
| + | #plugintable {width:96%; margin-top:10px;} |
| + | #pluginscontainer {height:290px; overflow:auto;} |
| + | #colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;} |
| + | #colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} |
| + | #colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} |
| + | #colorpicker #light div {overflow:hidden;} |
| + | #colorpicker #previewblock {float:right; padding-left:10px; height:20px;} |
| + | #colorpicker .panel_wrapper div.current {height:175px;} |
| + | #colorpicker #namedcolors {width:150px;} |
| + | #colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} |
| + | #colorpicker #colornamecontainer {margin-top:5px;} |
| + | #colorpicker #picker_panel fieldset {margin:auto;width:325px;} |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/skins/default/img/buttons.png
+0
-0
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/skins/default/img/items.gif
+0
-0
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif
+0
-0
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/skins/default/img/menu_check.gif
+0
-0
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/skins/default/img/progress.gif
+0
-0
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/skins/default/img/tabs.gif
+0
-0
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/skins/default/ui.css
+213
-0
| @@ | @@ -0,0 +1,213 @@ |
| + | /* Reset */ |
| + | .defaultSkin table, .defaultSkin tbody, .defaultSkin a, .defaultSkin img, .defaultSkin tr, .defaultSkin div, .defaultSkin td, .defaultSkin iframe, .defaultSkin span, .defaultSkin *, .defaultSkin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left} |
| + | .defaultSkin a:hover, .defaultSkin a:link, .defaultSkin a:visited, .defaultSkin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000} |
| + | .defaultSkin table td {vertical-align:middle} |
| + | |
| + | /* Containers */ |
| + | .defaultSkin table {direction:ltr; background:#F0F0EE} |
| + | .defaultSkin iframe {display:block; background:#FFF} |
| + | .defaultSkin .mceToolbar {height:26px} |
| + | .defaultSkin .mceLeft {text-align:left} |
| + | .defaultSkin .mceRight {text-align:right} |
| + | |
| + | /* External */ |
| + | .defaultSkin .mceExternalToolbar {position:absolute; border:1px solid #CCC; border-bottom:0; display:none;} |
| + | .defaultSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;} |
| + | .defaultSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0} |
| + | |
| + | /* Layout */ |
| + | .defaultSkin table.mceLayout {border:0; border-left:1px solid #CCC; border-right:1px solid #CCC} |
| + | .defaultSkin table.mceLayout tr.mceFirst td {border-top:1px solid #CCC} |
| + | .defaultSkin table.mceLayout tr.mceLast td {border-bottom:1px solid #CCC} |
| + | .defaultSkin table.mceToolbar, .defaultSkin tr.mceFirst .mceToolbar tr td, .defaultSkin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0;} |
| + | .defaultSkin td.mceToolbar {padding-top:1px; vertical-align:top} |
| + | .defaultSkin .mceIframeContainer {border-top:1px solid #CCC; border-bottom:1px solid #CCC} |
| + | .defaultSkin .mceStatusbar {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; display:block; height:20px} |
| + | .defaultSkin .mceStatusbar div {float:left; margin:2px} |
| + | .defaultSkin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0} |
| + | .defaultSkin .mceStatusbar a:hover {text-decoration:underline} |
| + | .defaultSkin table.mceToolbar {margin-left:3px} |
| + | .defaultSkin span.mceIcon, .defaultSkin img.mceIcon {display:block; width:20px; height:20px} |
| + | .defaultSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} |
| + | .defaultSkin td.mceCenter {text-align:center;} |
| + | .defaultSkin td.mceCenter table {margin:0 auto; text-align:left;} |
| + | .defaultSkin td.mceRight table {margin:0 0 0 auto;} |
| + | |
| + | /* Button */ |
| + | .defaultSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px; margin-right:1px} |
| + | .defaultSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0} |
| + | .defaultSkin a.mceButtonActive, .defaultSkin a.mceButtonSelected {border:1px solid #0A246A; background-color:#C2CBE0} |
| + | .defaultSkin .mceButtonDisabled .mceIcon {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} |
| + | .defaultSkin .mceButtonLabeled {width:auto} |
| + | .defaultSkin .mceButtonLabeled span.mceIcon {float:left} |
| + | .defaultSkin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica} |
| + | .defaultSkin .mceButtonDisabled .mceButtonLabel {color:#888} |
| + | |
| + | /* Separator */ |
| + | .defaultSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:2px 2px 0 4px} |
| + | |
| + | /* ListBox */ |
| + | .defaultSkin .mceListBox, .defaultSkin .mceListBox a {display:block} |
| + | .defaultSkin .mceListBox .mceText {padding-left:4px; width:70px; text-align:left; border:1px solid #CCC; border-right:0; background:#FFF; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden} |
| + | .defaultSkin .mceListBox .mceOpen {width:9px; height:20px; background:url(../../img/icons.gif) -741px 0; margin-right:2px; border:1px solid #CCC;} |
| + | .defaultSkin table.mceListBoxEnabled:hover .mceText, .defaultSkin .mceListBoxHover .mceText, .defaultSkin .mceListBoxSelected .mceText {border:1px solid #A2ABC0; border-right:0; background:#FFF} |
| + | .defaultSkin table.mceListBoxEnabled:hover .mceOpen, .defaultSkin .mceListBoxHover .mceOpen, .defaultSkin .mceListBoxSelected .mceOpen {background-color:#FFF; border:1px solid #A2ABC0} |
| + | .defaultSkin .mceListBoxDisabled a.mceText {color:gray; background-color:transparent;} |
| + | .defaultSkin .mceListBoxMenu {overflow:auto; overflow-x:hidden} |
| + | .defaultSkin .mceOldBoxModel .mceListBox .mceText {height:22px} |
| + | .defaultSkin .mceOldBoxModel .mceListBox .mceOpen {width:11px; height:22px;} |
| + | .defaultSkin select.mceNativeListBox {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:7pt; background:#F0F0EE; border:1px solid gray; margin-right:2px;} |
| + | |
| + | /* SplitButton */ |
| + | .defaultSkin .mceSplitButton {width:32px; height:20px; direction:ltr} |
| + | .defaultSkin .mceSplitButton a, .defaultSkin .mceSplitButton span {height:20px; display:block} |
| + | .defaultSkin .mceSplitButton a.mceAction {width:20px; border:1px solid #F0F0EE; border-right:0;} |
| + | .defaultSkin .mceSplitButton span.mceAction {width:20px; background-image:url(../../img/icons.gif);} |
| + | .defaultSkin .mceSplitButton a.mceOpen {width:9px; background:url(../../img/icons.gif) -741px 0; border:1px solid #F0F0EE;} |
| + | .defaultSkin .mceSplitButton span.mceOpen {display:none} |
| + | .defaultSkin table.mceSplitButtonEnabled:hover a.mceAction, .defaultSkin .mceSplitButtonHover a.mceAction, .defaultSkin .mceSplitButtonSelected a.mceAction {border:1px solid #0A246A; border-right:0; background-color:#B2BBD0} |
| + | .defaultSkin table.mceSplitButtonEnabled:hover a.mceOpen, .defaultSkin .mceSplitButtonHover a.mceOpen, .defaultSkin .mceSplitButtonSelected a.mceOpen {background-color:#B2BBD0; border:1px solid #0A246A;} |
| + | .defaultSkin .mceSplitButtonDisabled .mceAction, .defaultSkin .mceSplitButtonDisabled a.mceOpen {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} |
| + | .defaultSkin .mceSplitButtonActive a.mceAction {border:1px solid #0A246A; background-color:#C2CBE0} |
| + | .defaultSkin .mceSplitButtonActive a.mceOpen {border-left:0;} |
| + | |
| + | /* ColorSplitButton */ |
| + | .defaultSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray} |
| + | .defaultSkin .mceColorSplitMenu td {padding:2px} |
| + | .defaultSkin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080} |
| + | .defaultSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} |
| + | .defaultSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF} |
| + | .defaultSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2} |
| + | .defaultSkin a.mceMoreColors:hover {border:1px solid #0A246A} |
| + | .defaultSkin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a} |
| + | .defaultSkin .mce_forecolor span.mceAction, .defaultSkin .mce_backcolor span.mceAction {overflow:hidden; height:16px} |
| + | |
| + | /* Menu */ |
| + | .defaultSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #D4D0C8} |
| + | .defaultSkin .mceNoIcons span.mceIcon {width:0;} |
| + | .defaultSkin .mceNoIcons a .mceText {padding-left:10px} |
| + | .defaultSkin .mceMenu table {background:#FFF} |
| + | .defaultSkin .mceMenu a, .defaultSkin .mceMenu span, .defaultSkin .mceMenu {display:block} |
| + | .defaultSkin .mceMenu td {height:20px} |
| + | .defaultSkin .mceMenu a {position:relative;padding:3px 0 4px 0} |
| + | .defaultSkin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block} |
| + | .defaultSkin .mceMenu span.mceText, .defaultSkin .mceMenu .mcePreview {font-size:11px} |
| + | .defaultSkin .mceMenu pre.mceText {font-family:Monospace} |
| + | .defaultSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;} |
| + | .defaultSkin .mceMenu .mceMenuItemEnabled a:hover, .defaultSkin .mceMenu .mceMenuItemActive {background-color:#dbecf3} |
| + | .defaultSkin td.mceMenuItemSeparator {background:#DDD; height:1px} |
| + | .defaultSkin .mceMenuItemTitle a {border:0; background:#EEE; border-bottom:1px solid #DDD} |
| + | .defaultSkin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px} |
| + | .defaultSkin .mceMenuItemDisabled .mceText {color:#888} |
| + | .defaultSkin .mceMenuItemSelected .mceIcon {background:url(img/menu_check.gif)} |
| + | .defaultSkin .mceNoIcons .mceMenuItemSelected a {background:url(img/menu_arrow.gif) no-repeat -6px center} |
| + | .defaultSkin .mceMenu span.mceMenuLine {display:none} |
| + | .defaultSkin .mceMenuItemSub a {background:url(img/menu_arrow.gif) no-repeat top right;} |
| + | |
| + | /* Progress,Resize */ |
| + | .defaultSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50); background:#FFF} |
| + | .defaultSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} |
| + | |
| + | /* Formats */ |
| + | .defaultSkin .mce_formatPreview a {font-size:10px} |
| + | .defaultSkin .mce_p span.mceText {} |
| + | .defaultSkin .mce_address span.mceText {font-style:italic} |
| + | .defaultSkin .mce_pre span.mceText {font-family:monospace} |
| + | .defaultSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} |
| + | .defaultSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} |
| + | .defaultSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} |
| + | .defaultSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} |
| + | .defaultSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} |
| + | .defaultSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} |
| + | |
| + | /* Theme */ |
| + | .defaultSkin span.mce_bold {background-position:0 0} |
| + | .defaultSkin span.mce_italic {background-position:-60px 0} |
| + | .defaultSkin span.mce_underline {background-position:-140px 0} |
| + | .defaultSkin span.mce_strikethrough {background-position:-120px 0} |
| + | .defaultSkin span.mce_undo {background-position:-160px 0} |
| + | .defaultSkin span.mce_redo {background-position:-100px 0} |
| + | .defaultSkin span.mce_cleanup {background-position:-40px 0} |
| + | .defaultSkin span.mce_bullist {background-position:-20px 0} |
| + | .defaultSkin span.mce_numlist {background-position:-80px 0} |
| + | .defaultSkin span.mce_justifyleft {background-position:-460px 0} |
| + | .defaultSkin span.mce_justifyright {background-position:-480px 0} |
| + | .defaultSkin span.mce_justifycenter {background-position:-420px 0} |
| + | .defaultSkin span.mce_justifyfull {background-position:-440px 0} |
| + | .defaultSkin span.mce_anchor {background-position:-200px 0} |
| + | .defaultSkin span.mce_indent {background-position:-400px 0} |
| + | .defaultSkin span.mce_outdent {background-position:-540px 0} |
| + | .defaultSkin span.mce_link {background-position:-500px 0} |
| + | .defaultSkin span.mce_unlink {background-position:-640px 0} |
| + | .defaultSkin span.mce_sub {background-position:-600px 0} |
| + | .defaultSkin span.mce_sup {background-position:-620px 0} |
| + | .defaultSkin span.mce_removeformat {background-position:-580px 0} |
| + | .defaultSkin span.mce_newdocument {background-position:-520px 0} |
| + | .defaultSkin span.mce_image {background-position:-380px 0} |
| + | .defaultSkin span.mce_help {background-position:-340px 0} |
| + | .defaultSkin span.mce_code {background-position:-260px 0} |
| + | .defaultSkin span.mce_hr {background-position:-360px 0} |
| + | .defaultSkin span.mce_visualaid {background-position:-660px 0} |
| + | .defaultSkin span.mce_charmap {background-position:-240px 0} |
| + | .defaultSkin span.mce_paste {background-position:-560px 0} |
| + | .defaultSkin span.mce_copy {background-position:-700px 0} |
| + | .defaultSkin span.mce_cut {background-position:-680px 0} |
| + | .defaultSkin span.mce_blockquote {background-position:-220px 0} |
| + | .defaultSkin .mce_forecolor span.mceAction {background-position:-720px 0} |
| + | .defaultSkin .mce_backcolor span.mceAction {background-position:-760px 0} |
| + | .defaultSkin span.mce_forecolorpicker {background-position:-720px 0} |
| + | .defaultSkin span.mce_backcolorpicker {background-position:-760px 0} |
| + | |
| + | /* Plugins */ |
| + | .defaultSkin span.mce_advhr {background-position:-0px -20px} |
| + | .defaultSkin span.mce_ltr {background-position:-20px -20px} |
| + | .defaultSkin span.mce_rtl {background-position:-40px -20px} |
| + | .defaultSkin span.mce_emotions {background-position:-60px -20px} |
| + | .defaultSkin span.mce_fullpage {background-position:-80px -20px} |
| + | .defaultSkin span.mce_fullscreen {background-position:-100px -20px} |
| + | .defaultSkin span.mce_iespell {background-position:-120px -20px} |
| + | .defaultSkin span.mce_insertdate {background-position:-140px -20px} |
| + | .defaultSkin span.mce_inserttime {background-position:-160px -20px} |
| + | .defaultSkin span.mce_absolute {background-position:-180px -20px} |
| + | .defaultSkin span.mce_backward {background-position:-200px -20px} |
| + | .defaultSkin span.mce_forward {background-position:-220px -20px} |
| + | .defaultSkin span.mce_insert_layer {background-position:-240px -20px} |
| + | .defaultSkin span.mce_insertlayer {background-position:-260px -20px} |
| + | .defaultSkin span.mce_movebackward {background-position:-280px -20px} |
| + | .defaultSkin span.mce_moveforward {background-position:-300px -20px} |
| + | .defaultSkin span.mce_media {background-position:-320px -20px} |
| + | .defaultSkin span.mce_nonbreaking {background-position:-340px -20px} |
| + | .defaultSkin span.mce_pastetext {background-position:-360px -20px} |
| + | .defaultSkin span.mce_pasteword {background-position:-380px -20px} |
| + | .defaultSkin span.mce_selectall {background-position:-400px -20px} |
| + | .defaultSkin span.mce_preview {background-position:-420px -20px} |
| + | .defaultSkin span.mce_print {background-position:-440px -20px} |
| + | .defaultSkin span.mce_cancel {background-position:-460px -20px} |
| + | .defaultSkin span.mce_save {background-position:-480px -20px} |
| + | .defaultSkin span.mce_replace {background-position:-500px -20px} |
| + | .defaultSkin span.mce_search {background-position:-520px -20px} |
| + | .defaultSkin span.mce_styleprops {background-position:-560px -20px} |
| + | .defaultSkin span.mce_table {background-position:-580px -20px} |
| + | .defaultSkin span.mce_cell_props {background-position:-600px -20px} |
| + | .defaultSkin span.mce_delete_table {background-position:-620px -20px} |
| + | .defaultSkin span.mce_delete_col {background-position:-640px -20px} |
| + | .defaultSkin span.mce_delete_row {background-position:-660px -20px} |
| + | .defaultSkin span.mce_col_after {background-position:-680px -20px} |
| + | .defaultSkin span.mce_col_before {background-position:-700px -20px} |
| + | .defaultSkin span.mce_row_after {background-position:-720px -20px} |
| + | .defaultSkin span.mce_row_before {background-position:-740px -20px} |
| + | .defaultSkin span.mce_merge_cells {background-position:-760px -20px} |
| + | .defaultSkin span.mce_table_props {background-position:-980px -20px} |
| + | .defaultSkin span.mce_row_props {background-position:-780px -20px} |
| + | .defaultSkin span.mce_split_cells {background-position:-800px -20px} |
| + | .defaultSkin span.mce_template {background-position:-820px -20px} |
| + | .defaultSkin span.mce_visualchars {background-position:-840px -20px} |
| + | .defaultSkin span.mce_abbr {background-position:-860px -20px} |
| + | .defaultSkin span.mce_acronym {background-position:-880px -20px} |
| + | .defaultSkin span.mce_attribs {background-position:-900px -20px} |
| + | .defaultSkin span.mce_cite {background-position:-920px -20px} |
| + | .defaultSkin span.mce_del {background-position:-940px -20px} |
| + | .defaultSkin span.mce_ins {background-position:-960px -20px} |
| + | .defaultSkin span.mce_pagebreak {background-position:0 -40px} |
| + | .defaultSkin span.mce_restoredraft {background-position:-20px -40px} |
| + | .defaultSkin span.mce_spellchecker {background-position:-540px -20px} |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/skins/o2k7/content.css
+36
-0
| @@ | @@ -0,0 +1,36 @@ |
| + | body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} |
| + | body {background:#FFF;} |
| + | body.mceForceColors {background:#FFF; color:#000;} |
| + | h1 {font-size: 2em} |
| + | h2 {font-size: 1.5em} |
| + | h3 {font-size: 1.17em} |
| + | h4 {font-size: 1em} |
| + | h5 {font-size: .83em} |
| + | h6 {font-size: .75em} |
| + | .mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} |
| + | a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(../default/img/items.gif) no-repeat 0 0;} |
| + | span.mceItemNbsp {background: #DDD} |
| + | td.mceSelected, th.mceSelected {background-color:#3399ff !important} |
| + | img {border:0;} |
| + | table {cursor:default} |
| + | table td, table th {cursor:text} |
| + | ins {border-bottom:1px solid green; text-decoration: none; color:green} |
| + | del {color:red; text-decoration:line-through} |
| + | cite {border-bottom:1px dashed blue} |
| + | acronym {border-bottom:1px dotted #CCC; cursor:help} |
| + | abbr {border-bottom:1px dashed #CCC; cursor:help} |
| + | |
| + | /* IE */ |
| + | * html body { |
| + | scrollbar-3dlight-color:#F0F0EE; |
| + | scrollbar-arrow-color:#676662; |
| + | scrollbar-base-color:#F0F0EE; |
| + | scrollbar-darkshadow-color:#DDD; |
| + | scrollbar-face-color:#E0E0DD; |
| + | scrollbar-highlight-color:#F0F0EE; |
| + | scrollbar-shadow-color:#F0F0EE; |
| + | scrollbar-track-color:#F5F5F5; |
| + | } |
| + | |
| + | img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} |
| + | font[face=mceinline] {font-family:inherit !important} |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/skins/o2k7/dialog.css
+116
-0
| @@ | @@ -0,0 +1,116 @@ |
| + | /* Generic */ |
| + | body { |
| + | font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; |
| + | scrollbar-3dlight-color:#F0F0EE; |
| + | scrollbar-arrow-color:#676662; |
| + | scrollbar-base-color:#F0F0EE; |
| + | scrollbar-darkshadow-color:#DDDDDD; |
| + | scrollbar-face-color:#E0E0DD; |
| + | scrollbar-highlight-color:#F0F0EE; |
| + | scrollbar-shadow-color:#F0F0EE; |
| + | scrollbar-track-color:#F5F5F5; |
| + | background:#F0F0EE; |
| + | padding:0; |
| + | margin:8px 8px 0 8px; |
| + | } |
| + | |
| + | html {background:#F0F0EE;} |
| + | td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} |
| + | textarea {resize:none;outline:none;} |
| + | a:link, a:visited {color:black;} |
| + | a:hover {color:#2B6FB6;} |
| + | .nowrap {white-space: nowrap} |
| + | |
| + | /* Forms */ |
| + | fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} |
| + | legend {color:#2B6FB6; font-weight:bold;} |
| + | label.msg {display:none;} |
| + | label.invalid {color:#EE0000; display:inline;} |
| + | input.invalid {border:1px solid #EE0000;} |
| + | input {background:#FFF; border:1px solid #CCC;} |
| + | input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} |
| + | input, select, textarea {border:1px solid #808080;} |
| + | input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} |
| + | input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} |
| + | .input_noborder {border:0;} |
| + | |
| + | /* Buttons */ |
| + | #insert, #cancel, input.button, .updateButton { |
| + | border:0; margin:0; padding:0; |
| + | font-weight:bold; |
| + | width:94px; height:26px; |
| + | background:url(../default/img/buttons.png) 0 -26px; |
| + | cursor:pointer; |
| + | padding-bottom:2px; |
| + | float:left; |
| + | } |
| + | |
| + | #insert {background:url(../default/img/buttons.png) 0 -52px} |
| + | #cancel {background:url(../default/img/buttons.png) 0 0; float:right} |
| + | |
| + | /* Browse */ |
| + | a.pickcolor, a.browse {text-decoration:none} |
| + | a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} |
| + | .mceOldBoxModel a.browse span {width:22px; height:20px;} |
| + | a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} |
| + | a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} |
| + | a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} |
| + | a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} |
| + | .mceOldBoxModel a.pickcolor span {width:21px; height:17px;} |
| + | a.pickcolor:hover span {background-color:#B2BBD0;} |
| + | a.pickcolor:hover span.disabled {} |
| + | |
| + | /* Charmap */ |
| + | table.charmap {border:1px solid #AAA; text-align:center} |
| + | td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} |
| + | #charmap a {display:block; color:#000; text-decoration:none; border:0} |
| + | #charmap a:hover {background:#CCC;color:#2B6FB6} |
| + | #charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} |
| + | #charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} |
| + | |
| + | /* Source */ |
| + | .wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} |
| + | .mceActionPanel {margin-top:5px;} |
| + | |
| + | /* Tabs classes */ |
| + | .tabs {width:100%; height:18px; line-height:normal; background:url(../default/img/tabs.gif) repeat-x 0 -72px;} |
| + | .tabs ul {margin:0; padding:0; list-style:none;} |
| + | .tabs li {float:left; background:url(../default/img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} |
| + | .tabs li.current {background:url(../default/img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} |
| + | .tabs span {float:left; display:block; background:url(../default/img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} |
| + | .tabs .current span {background:url(../default/img/tabs.gif) no-repeat right -54px;} |
| + | .tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} |
| + | .tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} |
| + | |
| + | /* Panels */ |
| + | .panel_wrapper div.panel {display:none;} |
| + | .panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} |
| + | .panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;} |
| + | |
| + | /* Columns */ |
| + | .column {float:left;} |
| + | .properties {width:100%;} |
| + | .properties .column1 {} |
| + | .properties .column2 {text-align:left;} |
| + | |
| + | /* Titles */ |
| + | h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} |
| + | h3 {font-size:14px;} |
| + | .title {font-size:12px; font-weight:bold; color:#2B6FB6;} |
| + | |
| + | /* Dialog specific */ |
| + | #link .panel_wrapper, #link div.current {height:125px;} |
| + | #image .panel_wrapper, #image div.current {height:200px;} |
| + | #plugintable thead {font-weight:bold; background:#DDD;} |
| + | #plugintable, #about #plugintable td {border:1px solid #919B9C;} |
| + | #plugintable {width:96%; margin-top:10px;} |
| + | #pluginscontainer {height:290px; overflow:auto;} |
| + | #colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;} |
| + | #colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} |
| + | #colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} |
| + | #colorpicker #light div {overflow:hidden;} |
| + | #colorpicker #previewblock {float:right; padding-left:10px; height:20px;} |
| + | #colorpicker .panel_wrapper div.current {height:175px;} |
| + | #colorpicker #namedcolors {width:150px;} |
| + | #colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} |
| + | #colorpicker #colornamecontainer {margin-top:5px;} |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png
+0
-0
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png
+0
-0
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png
+0
-0
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/skins/o2k7/ui.css
+215
-0
| @@ | @@ -0,0 +1,215 @@ |
| + | /* Reset */ |
| + | .o2k7Skin table, .o2k7Skin tbody, .o2k7Skin a, .o2k7Skin img, .o2k7Skin tr, .o2k7Skin div, .o2k7Skin td, .o2k7Skin iframe, .o2k7Skin span, .o2k7Skin *, .o2k7Skin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left} |
| + | .o2k7Skin a:hover, .o2k7Skin a:link, .o2k7Skin a:visited, .o2k7Skin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000} |
| + | .o2k7Skin table td {vertical-align:middle} |
| + | |
| + | /* Containers */ |
| + | .o2k7Skin table {background:#E5EFFD} |
| + | .o2k7Skin iframe {display:block; background:#FFF} |
| + | .o2k7Skin .mceToolbar {height:26px} |
| + | |
| + | /* External */ |
| + | .o2k7Skin .mceExternalToolbar {position:absolute; border:1px solid #ABC6DD; border-bottom:0; display:none} |
| + | .o2k7Skin .mceExternalToolbar td.mceToolbar {padding-right:13px;} |
| + | .o2k7Skin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0} |
| + | |
| + | /* Layout */ |
| + | .o2k7Skin table.mceLayout {border:0; border-left:1px solid #ABC6DD; border-right:1px solid #ABC6DD} |
| + | .o2k7Skin table.mceLayout tr.mceFirst td {border-top:1px solid #ABC6DD} |
| + | .o2k7Skin table.mceLayout tr.mceLast td {border-bottom:1px solid #ABC6DD} |
| + | .o2k7Skin table.mceToolbar, .o2k7Skin tr.mceFirst .mceToolbar tr td, .o2k7Skin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0} |
| + | .o2k7Skin .mceIframeContainer {border-top:1px solid #ABC6DD; border-bottom:1px solid #ABC6DD} |
| + | .o2k7Skin .mceStatusbar {display:block; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; height:20px} |
| + | .o2k7Skin .mceStatusbar div {float:left; padding:2px} |
| + | .o2k7Skin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0} |
| + | .o2k7Skin .mceStatusbar a:hover {text-decoration:underline} |
| + | .o2k7Skin table.mceToolbar {margin-left:3px} |
| + | .o2k7Skin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; margin-left:3px;} |
| + | .o2k7Skin .mceToolbar td.mceFirst span {margin:0} |
| + | .o2k7Skin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px} |
| + | .o2k7Skin .mceToolbar .mceToolbarEndListBox span, .o2k7Skin .mceToolbar .mceToolbarStartListBox span {display:none} |
| + | .o2k7Skin span.mceIcon, .o2k7Skin img.mceIcon {display:block; width:20px; height:20px} |
| + | .o2k7Skin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} |
| + | .o2k7Skin td.mceCenter {text-align:center;} |
| + | .o2k7Skin td.mceCenter table {margin:0 auto; text-align:left;} |
| + | .o2k7Skin td.mceRight table {margin:0 0 0 auto;} |
| + | |
| + | /* Button */ |
| + | .o2k7Skin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px} |
| + | .o2k7Skin a.mceButton span, .o2k7Skin a.mceButton img {margin-left:1px} |
| + | .o2k7Skin .mceOldBoxModel a.mceButton span, .o2k7Skin .mceOldBoxModel a.mceButton img {margin:0 0 0 1px} |
| + | .o2k7Skin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px} |
| + | .o2k7Skin a.mceButtonActive, .o2k7Skin a.mceButtonSelected {background-position:0 -44px} |
| + | .o2k7Skin .mceButtonDisabled .mceIcon {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} |
| + | .o2k7Skin .mceButtonLabeled {width:auto} |
| + | .o2k7Skin .mceButtonLabeled span.mceIcon {float:left} |
| + | .o2k7Skin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica} |
| + | .o2k7Skin .mceButtonDisabled .mceButtonLabel {color:#888} |
| + | |
| + | /* Separator */ |
| + | .o2k7Skin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px} |
| + | |
| + | /* ListBox */ |
| + | .o2k7Skin .mceListBox {margin-left:3px} |
| + | .o2k7Skin .mceListBox, .o2k7Skin .mceListBox a {display:block} |
| + | .o2k7Skin .mceListBox .mceText {padding-left:4px; text-align:left; width:70px; border:1px solid #b3c7e1; border-right:0; background:#eaf2fb; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden} |
| + | .o2k7Skin .mceListBox .mceOpen {width:14px; height:22px; background:url(img/button_bg.png) -66px 0} |
| + | .o2k7Skin table.mceListBoxEnabled:hover .mceText, .o2k7Skin .mceListBoxHover .mceText, .o2k7Skin .mceListBoxSelected .mceText {background:#FFF} |
| + | .o2k7Skin table.mceListBoxEnabled:hover .mceOpen, .o2k7Skin .mceListBoxHover .mceOpen, .o2k7Skin .mceListBoxSelected .mceOpen {background-position:-66px -22px} |
| + | .o2k7Skin .mceListBoxDisabled .mceText {color:gray} |
| + | .o2k7Skin .mceListBoxMenu {overflow:auto; overflow-x:hidden} |
| + | .o2k7Skin .mceOldBoxModel .mceListBox .mceText {height:22px} |
| + | .o2k7Skin select.mceListBox {font-family:Tahoma,Verdana,Arial,Helvetica; font-size:12px; border:1px solid #b3c7e1; background:#FFF;} |
| + | |
| + | /* SplitButton */ |
| + | .o2k7Skin .mceSplitButton, .o2k7Skin .mceSplitButton a, .o2k7Skin .mceSplitButton span {display:block; height:22px} |
| + | .o2k7Skin .mceSplitButton {background:url(img/button_bg.png)} |
| + | .o2k7Skin .mceSplitButton a.mceAction {width:22px} |
| + | .o2k7Skin .mceSplitButton span.mceAction {width:22px; background-image:url(../../img/icons.gif)} |
| + | .o2k7Skin .mceSplitButton a.mceOpen {width:10px; background:url(img/button_bg.png) -44px 0} |
| + | .o2k7Skin .mceSplitButton span.mceOpen {display:none} |
| + | .o2k7Skin table.mceSplitButtonEnabled:hover a.mceAction, .o2k7Skin .mceSplitButtonHover a.mceAction, .o2k7Skin .mceSplitButtonSelected {background:url(img/button_bg.png) 0 -22px} |
| + | .o2k7Skin table.mceSplitButtonEnabled:hover a.mceOpen, .o2k7Skin .mceSplitButtonHover a.mceOpen, .o2k7Skin .mceSplitButtonSelected a.mceOpen {background-position:-44px -44px} |
| + | .o2k7Skin .mceSplitButtonDisabled .mceAction {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} |
| + | .o2k7Skin .mceSplitButtonActive {background-position:0 -44px} |
| + | |
| + | /* ColorSplitButton */ |
| + | .o2k7Skin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray} |
| + | .o2k7Skin .mceColorSplitMenu td {padding:2px} |
| + | .o2k7Skin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080} |
| + | .o2k7Skin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} |
| + | .o2k7Skin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF} |
| + | .o2k7Skin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2} |
| + | .o2k7Skin a.mceMoreColors:hover {border:1px solid #0A246A} |
| + | .o2k7Skin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a;overflow:hidden} |
| + | .o2k7Skin .mce_forecolor span.mceAction, .o2k7Skin .mce_backcolor span.mceAction {height:15px;overflow:hidden} |
| + | |
| + | /* Menu */ |
| + | .o2k7Skin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #ABC6DD} |
| + | .o2k7Skin .mceNoIcons span.mceIcon {width:0;} |
| + | .o2k7Skin .mceNoIcons a .mceText {padding-left:10px} |
| + | .o2k7Skin .mceMenu table {background:#FFF} |
| + | .o2k7Skin .mceMenu a, .o2k7Skin .mceMenu span, .o2k7Skin .mceMenu {display:block} |
| + | .o2k7Skin .mceMenu td {height:20px} |
| + | .o2k7Skin .mceMenu a {position:relative;padding:3px 0 4px 0} |
| + | .o2k7Skin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block} |
| + | .o2k7Skin .mceMenu span.mceText, .o2k7Skin .mceMenu .mcePreview {font-size:11px} |
| + | .o2k7Skin .mceMenu pre.mceText {font-family:Monospace} |
| + | .o2k7Skin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;} |
| + | .o2k7Skin .mceMenu .mceMenuItemEnabled a:hover, .o2k7Skin .mceMenu .mceMenuItemActive {background-color:#dbecf3} |
| + | .o2k7Skin td.mceMenuItemSeparator {background:#DDD; height:1px} |
| + | .o2k7Skin .mceMenuItemTitle a {border:0; background:#E5EFFD; border-bottom:1px solid #ABC6DD} |
| + | .o2k7Skin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px} |
| + | .o2k7Skin .mceMenuItemDisabled .mceText {color:#888} |
| + | .o2k7Skin .mceMenuItemSelected .mceIcon {background:url(../default/img/menu_check.gif)} |
| + | .o2k7Skin .mceNoIcons .mceMenuItemSelected a {background:url(../default/img/menu_arrow.gif) no-repeat -6px center} |
| + | .o2k7Skin .mceMenu span.mceMenuLine {display:none} |
| + | .o2k7Skin .mceMenuItemSub a {background:url(../default/img/menu_arrow.gif) no-repeat top right;} |
| + | |
| + | /* Progress,Resize */ |
| + | .o2k7Skin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=50); background:#FFF} |
| + | .o2k7Skin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(../default/img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} |
| + | |
| + | /* Formats */ |
| + | .o2k7Skin .mce_formatPreview a {font-size:10px} |
| + | .o2k7Skin .mce_p span.mceText {} |
| + | .o2k7Skin .mce_address span.mceText {font-style:italic} |
| + | .o2k7Skin .mce_pre span.mceText {font-family:monospace} |
| + | .o2k7Skin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} |
| + | .o2k7Skin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} |
| + | .o2k7Skin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} |
| + | .o2k7Skin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} |
| + | .o2k7Skin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} |
| + | .o2k7Skin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} |
| + | |
| + | /* Theme */ |
| + | .o2k7Skin span.mce_bold {background-position:0 0} |
| + | .o2k7Skin span.mce_italic {background-position:-60px 0} |
| + | .o2k7Skin span.mce_underline {background-position:-140px 0} |
| + | .o2k7Skin span.mce_strikethrough {background-position:-120px 0} |
| + | .o2k7Skin span.mce_undo {background-position:-160px 0} |
| + | .o2k7Skin span.mce_redo {background-position:-100px 0} |
| + | .o2k7Skin span.mce_cleanup {background-position:-40px 0} |
| + | .o2k7Skin span.mce_bullist {background-position:-20px 0} |
| + | .o2k7Skin span.mce_numlist {background-position:-80px 0} |
| + | .o2k7Skin span.mce_justifyleft {background-position:-460px 0} |
| + | .o2k7Skin span.mce_justifyright {background-position:-480px 0} |
| + | .o2k7Skin span.mce_justifycenter {background-position:-420px 0} |
| + | .o2k7Skin span.mce_justifyfull {background-position:-440px 0} |
| + | .o2k7Skin span.mce_anchor {background-position:-200px 0} |
| + | .o2k7Skin span.mce_indent {background-position:-400px 0} |
| + | .o2k7Skin span.mce_outdent {background-position:-540px 0} |
| + | .o2k7Skin span.mce_link {background-position:-500px 0} |
| + | .o2k7Skin span.mce_unlink {background-position:-640px 0} |
| + | .o2k7Skin span.mce_sub {background-position:-600px 0} |
| + | .o2k7Skin span.mce_sup {background-position:-620px 0} |
| + | .o2k7Skin span.mce_removeformat {background-position:-580px 0} |
| + | .o2k7Skin span.mce_newdocument {background-position:-520px 0} |
| + | .o2k7Skin span.mce_image {background-position:-380px 0} |
| + | .o2k7Skin span.mce_help {background-position:-340px 0} |
| + | .o2k7Skin span.mce_code {background-position:-260px 0} |
| + | .o2k7Skin span.mce_hr {background-position:-360px 0} |
| + | .o2k7Skin span.mce_visualaid {background-position:-660px 0} |
| + | .o2k7Skin span.mce_charmap {background-position:-240px 0} |
| + | .o2k7Skin span.mce_paste {background-position:-560px 0} |
| + | .o2k7Skin span.mce_copy {background-position:-700px 0} |
| + | .o2k7Skin span.mce_cut {background-position:-680px 0} |
| + | .o2k7Skin span.mce_blockquote {background-position:-220px 0} |
| + | .o2k7Skin .mce_forecolor span.mceAction {background-position:-720px 0} |
| + | .o2k7Skin .mce_backcolor span.mceAction {background-position:-760px 0} |
| + | .o2k7Skin span.mce_forecolorpicker {background-position:-720px 0} |
| + | .o2k7Skin span.mce_backcolorpicker {background-position:-760px 0} |
| + | |
| + | /* Plugins */ |
| + | .o2k7Skin span.mce_advhr {background-position:-0px -20px} |
| + | .o2k7Skin span.mce_ltr {background-position:-20px -20px} |
| + | .o2k7Skin span.mce_rtl {background-position:-40px -20px} |
| + | .o2k7Skin span.mce_emotions {background-position:-60px -20px} |
| + | .o2k7Skin span.mce_fullpage {background-position:-80px -20px} |
| + | .o2k7Skin span.mce_fullscreen {background-position:-100px -20px} |
| + | .o2k7Skin span.mce_iespell {background-position:-120px -20px} |
| + | .o2k7Skin span.mce_insertdate {background-position:-140px -20px} |
| + | .o2k7Skin span.mce_inserttime {background-position:-160px -20px} |
| + | .o2k7Skin span.mce_absolute {background-position:-180px -20px} |
| + | .o2k7Skin span.mce_backward {background-position:-200px -20px} |
| + | .o2k7Skin span.mce_forward {background-position:-220px -20px} |
| + | .o2k7Skin span.mce_insert_layer {background-position:-240px -20px} |
| + | .o2k7Skin span.mce_insertlayer {background-position:-260px -20px} |
| + | .o2k7Skin span.mce_movebackward {background-position:-280px -20px} |
| + | .o2k7Skin span.mce_moveforward {background-position:-300px -20px} |
| + | .o2k7Skin span.mce_media {background-position:-320px -20px} |
| + | .o2k7Skin span.mce_nonbreaking {background-position:-340px -20px} |
| + | .o2k7Skin span.mce_pastetext {background-position:-360px -20px} |
| + | .o2k7Skin span.mce_pasteword {background-position:-380px -20px} |
| + | .o2k7Skin span.mce_selectall {background-position:-400px -20px} |
| + | .o2k7Skin span.mce_preview {background-position:-420px -20px} |
| + | .o2k7Skin span.mce_print {background-position:-440px -20px} |
| + | .o2k7Skin span.mce_cancel {background-position:-460px -20px} |
| + | .o2k7Skin span.mce_save {background-position:-480px -20px} |
| + | .o2k7Skin span.mce_replace {background-position:-500px -20px} |
| + | .o2k7Skin span.mce_search {background-position:-520px -20px} |
| + | .o2k7Skin span.mce_styleprops {background-position:-560px -20px} |
| + | .o2k7Skin span.mce_table {background-position:-580px -20px} |
| + | .o2k7Skin span.mce_cell_props {background-position:-600px -20px} |
| + | .o2k7Skin span.mce_delete_table {background-position:-620px -20px} |
| + | .o2k7Skin span.mce_delete_col {background-position:-640px -20px} |
| + | .o2k7Skin span.mce_delete_row {background-position:-660px -20px} |
| + | .o2k7Skin span.mce_col_after {background-position:-680px -20px} |
| + | .o2k7Skin span.mce_col_before {background-position:-700px -20px} |
| + | .o2k7Skin span.mce_row_after {background-position:-720px -20px} |
| + | .o2k7Skin span.mce_row_before {background-position:-740px -20px} |
| + | .o2k7Skin span.mce_merge_cells {background-position:-760px -20px} |
| + | .o2k7Skin span.mce_table_props {background-position:-980px -20px} |
| + | .o2k7Skin span.mce_row_props {background-position:-780px -20px} |
| + | .o2k7Skin span.mce_split_cells {background-position:-800px -20px} |
| + | .o2k7Skin span.mce_template {background-position:-820px -20px} |
| + | .o2k7Skin span.mce_visualchars {background-position:-840px -20px} |
| + | .o2k7Skin span.mce_abbr {background-position:-860px -20px} |
| + | .o2k7Skin span.mce_acronym {background-position:-880px -20px} |
| + | .o2k7Skin span.mce_attribs {background-position:-900px -20px} |
| + | .o2k7Skin span.mce_cite {background-position:-920px -20px} |
| + | .o2k7Skin span.mce_del {background-position:-940px -20px} |
| + | .o2k7Skin span.mce_ins {background-position:-960px -20px} |
| + | .o2k7Skin span.mce_pagebreak {background-position:0 -40px} |
| + | .o2k7Skin span.mce_restoredraft {background-position:-20px -40px} |
| + | .o2k7Skin span.mce_spellchecker {background-position:-540px -20px} |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/skins/o2k7/ui_black.css
+8
-0
| @@ | @@ -0,0 +1,8 @@ |
| + | /* Black */ |
| + | .o2k7SkinBlack .mceToolbar .mceToolbarStart span, .o2k7SkinBlack .mceToolbar .mceToolbarEnd span, .o2k7SkinBlack .mceButton, .o2k7SkinBlack .mceSplitButton, .o2k7SkinBlack .mceSeparator, .o2k7SkinBlack .mceSplitButton a.mceOpen, .o2k7SkinBlack .mceListBox a.mceOpen {background-image:url(img/button_bg_black.png)} |
| + | .o2k7SkinBlack table, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack .mceMenuItemTitle span.mceText, .o2k7SkinBlack .mceStatusbar div, .o2k7SkinBlack .mceStatusbar span, .o2k7SkinBlack .mceStatusbar a {background:#535353; color:#FFF} |
| + | .o2k7SkinBlack table.mceListBoxEnabled .mceText, o2k7SkinBlack .mceListBox .mceText {background:#FFF; border:1px solid #CBCFD4; border-bottom-color:#989FA9; border-right:0} |
| + | .o2k7SkinBlack table.mceListBoxEnabled:hover .mceText, .o2k7SkinBlack .mceListBoxHover .mceText, .o2k7SkinBlack .mceListBoxSelected .mceText {background:#FFF; border:1px solid #FFBD69; border-right:0} |
| + | .o2k7SkinBlack .mceExternalToolbar, .o2k7SkinBlack .mceListBox .mceText, .o2k7SkinBlack div.mceMenu, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceFirst td, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceLast td, .o2k7SkinBlack .mceIframeContainer {border-color: #535353;} |
| + | .o2k7SkinBlack table.mceSplitButtonEnabled:hover a.mceAction, .o2k7SkinBlack .mceSplitButtonHover a.mceAction, .o2k7SkinBlack .mceSplitButtonSelected {background-image:url(img/button_bg_black.png)} |
| + | .o2k7SkinBlack .mceMenu .mceMenuItemEnabled a:hover, .o2k7SkinBlack .mceMenu .mceMenuItemActive {background-color:#FFE7A1} |
| \ No newline at end of file | |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css
+5
-0
| @@ | @@ -0,0 +1,5 @@ |
| + | /* Silver */ |
| + | .o2k7SkinSilver .mceToolbar .mceToolbarStart span, .o2k7SkinSilver .mceButton, .o2k7SkinSilver .mceSplitButton, .o2k7SkinSilver .mceSeparator, .o2k7SkinSilver .mceSplitButton a.mceOpen, .o2k7SkinSilver .mceListBox a.mceOpen {background-image:url(img/button_bg_silver.png)} |
| + | .o2k7SkinSilver table, .o2k7SkinSilver .mceMenuItemTitle a {background:#eee} |
| + | .o2k7SkinSilver .mceListBox .mceText {background:#FFF} |
| + | .o2k7SkinSilver .mceExternalToolbar, .o2k7SkinSilver .mceListBox .mceText, .o2k7SkinSilver div.mceMenu, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceFirst td, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceLast td, .o2k7SkinSilver .mceIframeContainer {border-color: #bbb} |
public/javascripts/cms/3rdparty/tiny_mce/themes/advanced/source_editor.htm
+25
-0
| @@ | @@ -0,0 +1,25 @@ |
| + | <html xmlns="http://www.w3.org/1999/xhtml"> |
| + | <head> |
| + | <title>{#advanced_dlg.code_title}</title> |
| + | <script type="text/javascript" src="../../tiny_mce_popup.js"></script> |
| + | <script type="text/javascript" src="js/source_editor.js"></script> |
| + | </head> |
| + | <body onresize="resizeInputs();" style="display:none; overflow:hidden;"> |
| + | <form name="source" onsubmit="saveContent();return false;" action="#"> |
| + | <div style="float: left" class="title">{#advanced_dlg.code_title}</div> |
| + | |
| + | <div id="wrapline" style="float: right"> |
| + | <input type="checkbox" name="wraped" id="wraped" onclick="toggleWordWrap(this);" class="wordWrapCode" /><label for="wraped">{#advanced_dlg.code_wordwrap}</label> |
| + | </div> |
| + | |
| + | <br style="clear: both" /> |
| + | |
| + | <textarea name="htmlSource" id="htmlSource" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,monospace; font-size: 12px;" dir="ltr" wrap="off" class="mceFocus"></textarea> |
| + | |
| + | <div class="mceActionPanel"> |
| + | <input type="submit" name="insert" value="{#update}" id="insert" /> |
| + | <input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" /> |
| + | </div> |
| + | </form> |
| + | </body> |
| + | </html> |
public/javascripts/cms/3rdparty/tiny_mce/themes/simple/editor_template.js
+1
-0
| @@ | @@ -0,0 +1 @@ |
| + | (function(){var a=tinymce.DOM;tinymce.ThemeManager.requireLangPack("simple");tinymce.create("tinymce.themes.SimpleTheme",{init:function(c,d){var e=this,b=["Bold","Italic","Underline","Strikethrough","InsertUnorderedList","InsertOrderedList"],f=c.settings;e.editor=c;c.onInit.add(function(){c.onNodeChange.add(function(h,g){tinymce.each(b,function(i){g.get(i.toLowerCase()).setActive(h.queryCommandState(i))})});c.dom.loadCSS(d+"/skins/"+f.skin+"/content.css")});a.loadCSS((f.editor_css?c.documentBaseURI.toAbsolute(f.editor_css):"")||d+"/skins/"+f.skin+"/ui.css")},renderUI:function(h){var e=this,i=h.targetNode,b,c,d=e.editor,f=d.controlManager,g;i=a.insertAfter(a.create("span",{id:d.id+"_container","class":"mceEditor "+d.settings.skin+"SimpleSkin"}),i);i=g=a.add(i,"table",{cellPadding:0,cellSpacing:0,"class":"mceLayout"});i=c=a.add(i,"tbody");i=a.add(c,"tr");i=b=a.add(a.add(i,"td"),"div",{"class":"mceIframeContainer"});i=a.add(a.add(c,"tr",{"class":"last"}),"td",{"class":"mceToolbar mceLast",align:"center"});c=e.toolbar=f.createToolbar("tools1");c.add(f.createButton("bold",{title:"simple.bold_desc",cmd:"Bold"}));c.add(f.createButton("italic",{title:"simple.italic_desc",cmd:"Italic"}));c.add(f.createButton("underline",{title:"simple.underline_desc",cmd:"Underline"}));c.add(f.createButton("strikethrough",{title:"simple.striketrough_desc",cmd:"Strikethrough"}));c.add(f.createSeparator());c.add(f.createButton("undo",{title:"simple.undo_desc",cmd:"Undo"}));c.add(f.createButton("redo",{title:"simple.redo_desc",cmd:"Redo"}));c.add(f.createSeparator());c.add(f.createButton("cleanup",{title:"simple.cleanup_desc",cmd:"mceCleanup"}));c.add(f.createSeparator());c.add(f.createButton("insertunorderedlist",{title:"simple.bullist_desc",cmd:"InsertUnorderedList"}));c.add(f.createButton("insertorderedlist",{title:"simple.numlist_desc",cmd:"InsertOrderedList"}));c.renderTo(i);return{iframeContainer:b,editorContainer:d.id+"_container",sizeContainer:g,deltaHeight:-20}},getInfo:function(){return{longname:"Simple theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.ThemeManager.add("simple",tinymce.themes.SimpleTheme)})(); |
| \ No newline at end of file | |
public/javascripts/cms/3rdparty/tiny_mce/themes/simple/editor_template_src.js
+85
-0
| @@ | @@ -0,0 +1,85 @@ |
| + | /** |
| + | * editor_template_src.js |
| + | * |
| + | * Copyright 2009, Moxiecode Systems AB |
| + | * Released under LGPL License. |
| + | * |
| + | * License: http://tinymce.moxiecode.com/license |
| + | * Contributing: http://tinymce.moxiecode.com/contributing |
| + | */ |
| + | |
| + | (function() { |
| + | var DOM = tinymce.DOM; |
| + | |
| + | // Tell it to load theme specific language pack(s) |
| + | tinymce.ThemeManager.requireLangPack('simple'); |
| + | |
| + | tinymce.create('tinymce.themes.SimpleTheme', { |
| + | init : function(ed, url) { |
| + | var t = this, states = ['Bold', 'Italic', 'Underline', 'Strikethrough', 'InsertUnorderedList', 'InsertOrderedList'], s = ed.settings; |
| + | |
| + | t.editor = ed; |
| + | |
| + | ed.onInit.add(function() { |
| + | ed.onNodeChange.add(function(ed, cm) { |
| + | tinymce.each(states, function(c) { |
| + | cm.get(c.toLowerCase()).setActive(ed.queryCommandState(c)); |
| + | }); |
| + | }); |
| + | |
| + | ed.dom.loadCSS(url + "/skins/" + s.skin + "/content.css"); |
| + | }); |
| + | |
| + | DOM.loadCSS((s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : '') || url + "/skins/" + s.skin + "/ui.css"); |
| + | }, |
| + | |
| + | renderUI : function(o) { |
| + | var t = this, n = o.targetNode, ic, tb, ed = t.editor, cf = ed.controlManager, sc; |
| + | |
| + | n = DOM.insertAfter(DOM.create('span', {id : ed.id + '_container', 'class' : 'mceEditor ' + ed.settings.skin + 'SimpleSkin'}), n); |
| + | n = sc = DOM.add(n, 'table', {cellPadding : 0, cellSpacing : 0, 'class' : 'mceLayout'}); |
| + | n = tb = DOM.add(n, 'tbody'); |
| + | |
| + | // Create iframe container |
| + | n = DOM.add(tb, 'tr'); |
| + | n = ic = DOM.add(DOM.add(n, 'td'), 'div', {'class' : 'mceIframeContainer'}); |
| + | |
| + | // Create toolbar container |
| + | n = DOM.add(DOM.add(tb, 'tr', {'class' : 'last'}), 'td', {'class' : 'mceToolbar mceLast', align : 'center'}); |
| + | |
| + | // Create toolbar |
| + | tb = t.toolbar = cf.createToolbar("tools1"); |
| + | tb.add(cf.createButton('bold', {title : 'simple.bold_desc', cmd : 'Bold'})); |
| + | tb.add(cf.createButton('italic', {title : 'simple.italic_desc', cmd : 'Italic'})); |
| + | tb.add(cf.createButton('underline', {title : 'simple.underline_desc', cmd : 'Underline'})); |
| + | tb.add(cf.createButton('strikethrough', {title : 'simple.striketrough_desc', cmd : 'Strikethrough'})); |
| + | tb.add(cf.createSeparator()); |
| + | tb.add(cf.createButton('undo', {title : 'simple.undo_desc', cmd : 'Undo'})); |
| + | tb.add(cf.createButton('redo', {title : 'simple.redo_desc', cmd : 'Redo'})); |
| + | tb.add(cf.createSeparator()); |
| + | tb.add(cf.createButton('cleanup', {title : 'simple.cleanup_desc', cmd : 'mceCleanup'})); |
| + | tb.add(cf.createSeparator()); |
| + | tb.add(cf.createButton('insertunorderedlist', {title : 'simple.bullist_desc', cmd : 'InsertUnorderedList'})); |
| + | tb.add(cf.createButton('insertorderedlist', {title : 'simple.numlist_desc', cmd : 'InsertOrderedList'})); |
| + | tb.renderTo(n); |
| + | |
| + | return { |
| + | iframeContainer : ic, |
| + | editorContainer : ed.id + '_container', |
| + | sizeContainer : sc, |
| + | deltaHeight : -20 |
| + | }; |
| + | }, |
| + | |
| + | getInfo : function() { |
| + | return { |
| + | longname : 'Simple theme', |
| + | author : 'Moxiecode Systems AB', |
| + | authorurl : 'http://tinymce.moxiecode.com', |
| + | version : tinymce.majorVersion + "." + tinymce.minorVersion |
| + | } |
| + | } |
| + | }); |
| + | |
| + | tinymce.ThemeManager.add('simple', tinymce.themes.SimpleTheme); |
| + | })(); |
| \ No newline at end of file | |
public/javascripts/cms/3rdparty/tiny_mce/themes/simple/img/icons.gif
+0
-0
public/javascripts/cms/3rdparty/tiny_mce/themes/simple/langs/en.js
+11
-0
| @@ | @@ -0,0 +1,11 @@ |
| + | tinyMCE.addI18n('en.simple',{ |
| + | bold_desc:"Bold (Ctrl+B)", |
| + | italic_desc:"Italic (Ctrl+I)", |
| + | underline_desc:"Underline (Ctrl+U)", |
| + | striketrough_desc:"Strikethrough", |
| + | bullist_desc:"Unordered list", |
| + | numlist_desc:"Ordered list", |
| + | undo_desc:"Undo (Ctrl+Z)", |
| + | redo_desc:"Redo (Ctrl+Y)", |
| + | cleanup_desc:"Cleanup messy code" |
| + | }); |
| \ No newline at end of file | |
public/javascripts/cms/3rdparty/tiny_mce/themes/simple/skins/default/content.css
+25
-0
| @@ | @@ -0,0 +1,25 @@ |
| + | body, td, pre { |
| + | font-family: Verdana, Arial, Helvetica, sans-serif; |
| + | font-size: 10px; |
| + | } |
| + | |
| + | body { |
| + | background-color: #FFFFFF; |
| + | } |
| + | |
| + | .mceVisualAid { |
| + | border: 1px dashed #BBBBBB; |
| + | } |
| + | |
| + | /* MSIE specific */ |
| + | |
| + | * html body { |
| + | scrollbar-3dlight-color: #F0F0EE; |
| + | scrollbar-arrow-color: #676662; |
| + | scrollbar-base-color: #F0F0EE; |
| + | scrollbar-darkshadow-color: #DDDDDD; |
| + | scrollbar-face-color: #E0E0DD; |
| + | scrollbar-highlight-color: #F0F0EE; |
| + | scrollbar-shadow-color: #F0F0EE; |
| + | scrollbar-track-color: #F5F5F5; |
| + | } |
public/javascripts/cms/3rdparty/tiny_mce/themes/simple/skins/default/ui.css
+32
-0
| @@ | @@ -0,0 +1,32 @@ |
| + | /* Reset */ |
| + | .defaultSimpleSkin table, .defaultSimpleSkin tbody, .defaultSimpleSkin a, .defaultSimpleSkin img, .defaultSimpleSkin tr, .defaultSimpleSkin div, .defaultSimpleSkin td, .defaultSimpleSkin iframe, .defaultSimpleSkin span, .defaultSimpleSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000} |
| + | |
| + | /* Containers */ |
| + | .defaultSimpleSkin {position:relative} |
| + | .defaultSimpleSkin table.mceLayout {background:#F0F0EE; border:1px solid #CCC;} |
| + | .defaultSimpleSkin iframe {display:block; background:#FFF; border-bottom:1px solid #CCC;} |
| + | .defaultSimpleSkin .mceToolbar {height:24px;} |
| + | |
| + | /* Layout */ |
| + | .defaultSimpleSkin span.mceIcon, .defaultSimpleSkin img.mceIcon {display:block; width:20px; height:20px} |
| + | .defaultSimpleSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} |
| + | |
| + | /* Button */ |
| + | .defaultSimpleSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px} |
| + | .defaultSimpleSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0} |
| + | .defaultSimpleSkin a.mceButtonActive {border:1px solid #0A246A; background-color:#C2CBE0} |
| + | .defaultSimpleSkin .mceButtonDisabled span {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} |
| + | |
| + | /* Separator */ |
| + | .defaultSimpleSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:0 2px 0 4px} |
| + | |
| + | /* Theme */ |
| + | .defaultSimpleSkin span.mce_bold {background-position:0 0} |
| + | .defaultSimpleSkin span.mce_italic {background-position:-60px 0} |
| + | .defaultSimpleSkin span.mce_underline {background-position:-140px 0} |
| + | .defaultSimpleSkin span.mce_strikethrough {background-position:-120px 0} |
| + | .defaultSimpleSkin span.mce_undo {background-position:-160px 0} |
| + | .defaultSimpleSkin span.mce_redo {background-position:-100px 0} |
| + | .defaultSimpleSkin span.mce_cleanup {background-position:-40px 0} |
| + | .defaultSimpleSkin span.mce_insertunorderedlist {background-position:-20px 0} |
| + | .defaultSimpleSkin span.mce_insertorderedlist {background-position:-80px 0} |
public/javascripts/cms/3rdparty/tiny_mce/themes/simple/skins/o2k7/content.css
+17
-0
| @@ | @@ -0,0 +1,17 @@ |
| + | body, td, pre {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} |
| + | |
| + | body {background: #FFF;} |
| + | .mceVisualAid {border: 1px dashed #BBB;} |
| + | |
| + | /* IE */ |
| + | |
| + | * html body { |
| + | scrollbar-3dlight-color: #F0F0EE; |
| + | scrollbar-arrow-color: #676662; |
| + | scrollbar-base-color: #F0F0EE; |
| + | scrollbar-darkshadow-color: #DDDDDD; |
| + | scrollbar-face-color: #E0E0DD; |
| + | scrollbar-highlight-color: #F0F0EE; |
| + | scrollbar-shadow-color: #F0F0EE; |
| + | scrollbar-track-color: #F5F5F5; |
| + | } |
public/javascripts/cms/3rdparty/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png
+0
-0
public/javascripts/cms/3rdparty/tiny_mce/themes/simple/skins/o2k7/ui.css
+35
-0
| @@ | @@ -0,0 +1,35 @@ |
| + | /* Reset */ |
| + | .o2k7SimpleSkin table, .o2k7SimpleSkin tbody, .o2k7SimpleSkin a, .o2k7SimpleSkin img, .o2k7SimpleSkin tr, .o2k7SimpleSkin div, .o2k7SimpleSkin td, .o2k7SimpleSkin iframe, .o2k7SimpleSkin span, .o2k7SimpleSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000} |
| + | |
| + | /* Containers */ |
| + | .o2k7SimpleSkin {position:relative} |
| + | .o2k7SimpleSkin table.mceLayout {background:#E5EFFD; border:1px solid #ABC6DD;} |
| + | .o2k7SimpleSkin iframe {display:block; background:#FFF; border-bottom:1px solid #ABC6DD;} |
| + | .o2k7SimpleSkin .mceToolbar {height:26px;} |
| + | |
| + | /* Layout */ |
| + | .o2k7SimpleSkin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; } |
| + | .o2k7SimpleSkin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px} |
| + | .o2k7SimpleSkin span.mceIcon, .o2k7SimpleSkin img.mceIcon {display:block; width:20px; height:20px} |
| + | .o2k7SimpleSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} |
| + | |
| + | /* Button */ |
| + | .o2k7SimpleSkin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px} |
| + | .o2k7SimpleSkin a.mceButton span, .o2k7SimpleSkin a.mceButton img {margin:1px 0 0 1px} |
| + | .o2k7SimpleSkin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px} |
| + | .o2k7SimpleSkin a.mceButtonActive {background-position:0 -44px} |
| + | .o2k7SimpleSkin .mceButtonDisabled span {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} |
| + | |
| + | /* Separator */ |
| + | .o2k7SimpleSkin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px} |
| + | |
| + | /* Theme */ |
| + | .o2k7SimpleSkin span.mce_bold {background-position:0 0} |
| + | .o2k7SimpleSkin span.mce_italic {background-position:-60px 0} |
| + | .o2k7SimpleSkin span.mce_underline {background-position:-140px 0} |
| + | .o2k7SimpleSkin span.mce_strikethrough {background-position:-120px 0} |
| + | .o2k7SimpleSkin span.mce_undo {background-position:-160px 0} |
| + | .o2k7SimpleSkin span.mce_redo {background-position:-100px 0} |
| + | .o2k7SimpleSkin span.mce_cleanup {background-position:-40px 0} |
| + | .o2k7SimpleSkin span.mce_insertunorderedlist {background-position:-20px 0} |
| + | .o2k7SimpleSkin span.mce_insertorderedlist {background-position:-80px 0} |
public/javascripts/cms/3rdparty/tiny_mce/tiny_mce.js
+1
-0
| @@ | @@ -0,0 +1 @@ |
| + | (function(c){var a=/^\s*|\s*$/g,d;var b={majorVersion:"3",minorVersion:"3.8",releaseDate:"2010-06-30",_init:function(){var r=this,o=document,m=navigator,f=m.userAgent,l,e,k,j,h,q;r.isOpera=c.opera&&opera.buildNumber;r.isWebKit=/WebKit/.test(f);r.isIE=!r.isWebKit&&!r.isOpera&&(/MSIE/gi).test(f)&&(/Explorer/gi).test(m.appName);r.isIE6=r.isIE&&/MSIE [56]/.test(f);r.isGecko=!r.isWebKit&&/Gecko/.test(f);r.isMac=f.indexOf("Mac")!=-1;r.isAir=/adobeair/i.test(f);r.isIDevice=/(iPad|iPhone)/.test(f);if(c.tinyMCEPreInit){r.suffix=tinyMCEPreInit.suffix;r.baseURL=tinyMCEPreInit.base;r.query=tinyMCEPreInit.query;return}r.suffix="";e=o.getElementsByTagName("base");for(l=0;l<e.length;l++){if(q=e[l].href){if(/^https?:\/\/[^\/]+$/.test(q)){q+="/"}j=q?q.match(/.*\//)[0]:""}}function g(i){if(i.src&&/tiny_mce(|_gzip|_jquery|_prototype)(_dev|_src)?.js/.test(i.src)){if(/_(src|dev)\.js/g.test(i.src)){r.suffix="_src"}if((h=i.src.indexOf("?"))!=-1){r.query=i.src.substring(h+1)}r.baseURL=i.src.substring(0,i.src.lastIndexOf("/"));if(j&&r.baseURL.indexOf("://")==-1&&r.baseURL.indexOf("/")!==0){r.baseURL=j+r.baseURL}return r.baseURL}return null}e=o.getElementsByTagName("script");for(l=0;l<e.length;l++){if(g(e[l])){return}}k=o.getElementsByTagName("head")[0];if(k){e=k.getElementsByTagName("script");for(l=0;l<e.length;l++){if(g(e[l])){return}}}return},is:function(f,e){if(!e){return f!==d}if(e=="array"&&(f.hasOwnProperty&&f instanceof Array)){return true}return typeof(f)==e},each:function(h,e,g){var i,f;if(!h){return 0}g=g||h;if(h.length!==d){for(i=0,f=h.length;i<f;i++){if(e.call(g,h[i],i,h)===false){return 0}}}else{for(i in h){if(h.hasOwnProperty(i)){if(e.call(g,h[i],i,h)===false){return 0}}}}return 1},trim:function(e){return(e?""+e:"").replace(a,"")},create:function(m,e){var l=this,f,h,i,j,g,k=0;m=/^((static) )?([\w.]+)(:([\w.]+))?/.exec(m);i=m[3].match(/(^|\.)(\w+)$/i)[2];h=l.createNS(m[3].replace(/\.\w+$/,""));if(h[i]){return}if(m[2]=="static"){h[i]=e;if(this.onCreate){this.onCreate(m[2],m[3],h[i])}return}if(!e[i]){e[i]=function(){};k=1}h[i]=e[i];l.extend(h[i].prototype,e);if(m[5]){f=l.resolve(m[5]).prototype;j=m[5].match(/\.(\w+)$/i)[1];g=h[i];if(k){h[i]=function(){return f[j].apply(this,arguments)}}else{h[i]=function(){this.parent=f[j];return g.apply(this,arguments)}}h[i].prototype[i]=h[i];l.each(f,function(o,p){h[i].prototype[p]=f[p]});l.each(e,function(o,p){if(f[p]){h[i].prototype[p]=function(){this.parent=f[p];return o.apply(this,arguments)}}else{if(p!=i){h[i].prototype[p]=o}}})}l.each(e["static"],function(o,p){h[i][p]=o});if(this.onCreate){this.onCreate(m[2],m[3],h[i].prototype)}},walk:function(h,g,i,e){e=e||this;if(h){if(i){h=h[i]}b.each(h,function(j,f){if(g.call(e,j,f,i)===false){return false}b.walk(j,g,i,e)})}},createNS:function(h,g){var f,e;g=g||c;h=h.split(".");for(f=0;f<h.length;f++){e=h[f];if(!g[e]){g[e]={}}g=g[e]}return g},resolve:function(h,g){var f,e;g=g||c;h=h.split(".");for(f=0,e=h.length;f<e;f++){g=g[h[f]];if(!g){break}}return g},addUnload:function(i,h){var g=this;i={func:i,scope:h||this};if(!g.unloads){function e(){var f=g.unloads,k,l;if(f){for(l in f){k=f[l];if(k&&k.func){k.func.call(k.scope,1)}}if(c.detachEvent){c.detachEvent("onbeforeunload",j);c.detachEvent("onunload",e)}else{if(c.removeEventListener){c.removeEventListener("unload",e,false)}}g.unloads=k=f=w=e=0;if(c.CollectGarbage){CollectGarbage()}}}function j(){var k=document;if(k.readyState=="interactive"){function f(){k.detachEvent("onstop",f);if(e){e()}k=0}if(k){k.attachEvent("onstop",f)}c.setTimeout(function(){if(k){k.detachEvent("onstop",f)}},0)}}if(c.attachEvent){c.attachEvent("onunload",e);c.attachEvent("onbeforeunload",j)}else{if(c.addEventListener){c.addEventListener("unload",e,false)}}g.unloads=[i]}else{g.unloads.push(i)}return i},removeUnload:function(h){var e=this.unloads,g=null;b.each(e,function(j,f){if(j&&j.func==h){e.splice(f,1);g=h;return false}});return g},explode:function(e,f){return e?b.map(e.split(f||","),b.trim):e},_addVer:function(f){var e;if(!this.query){return f}e=(f.indexOf("?")==-1?"?":"&")+this.query;if(f.indexOf("#")==-1){return f+e}return f.replace("#",e+"#")}};b._init();c.tinymce=c.tinyMCE=b})(window);(function(e,d){var c=d.is,b=/^(href|src|style)$/i,f;if(!e){return alert("Load jQuery first!")}d.$=e;d.adapter={patchEditor:function(j){var i=e.fn;function h(n,o){var m=this;if(o){m.removeAttr("_mce_style")}return i.css.apply(m,arguments)}function g(n,o){var m=this;if(b.test(n)){if(o!==f){m.each(function(p,q){j.dom.setAttrib(q,n,o)});return m}else{return m.attr("_mce_"+n)}}return i.attr.apply(m,arguments)}function k(m){return function(n){if(n){n=j.dom.processHTML(n)}return m.call(this,n)}}function l(m){if(m.css!==h){m.css=h;m.attr=g;m.html=k(i.html);m.append=k(i.append);m.prepend=k(i.prepend);m.after=k(i.after);m.before=k(i.before);m.replaceWith=k(i.replaceWith);m.tinymce=j;m.pushStack=function(){return l(i.pushStack.apply(this,arguments))}}return m}j.$=function(m,n){var o=j.getDoc();return l(e(m||o,o||n))}}};d.extend=e.extend;d.extend(d,{map:e.map,grep:function(g,h){return e.grep(g,h||function(){return 1})},inArray:function(g,h){return e.inArray(h,g||[])}});var a={"tinymce.dom.DOMUtils":{select:function(i,h){var g=this;return e.find(i,g.get(h)||g.get(g.settings.root_element)||g.doc,[])},is:function(h,g){return e(this.get(h)).is(g)}}};d.onCreate=function(g,i,h){d.extend(h,a[i])}})(window.jQuery,tinymce);tinymce.create("tinymce.util.Dispatcher",{scope:null,listeners:null,Dispatcher:function(a){this.scope=a||this;this.listeners=[]},add:function(a,b){this.listeners.push({cb:a,scope:b||this.scope});return a},addToTop:function(a,b){this.listeners.unshift({cb:a,scope:b||this.scope});return a},remove:function(a){var b=this.listeners,c=null;tinymce.each(b,function(e,d){if(a==e.cb){c=a;b.splice(d,1);return false}});return c},dispatch:function(){var f,d=arguments,e,b=this.listeners,g;for(e=0;e<b.length;e++){g=b[e];f=g.cb.apply(g.scope,d);if(f===false){break}}return f}});(function(){var a=tinymce.each;tinymce.create("tinymce.util.URI",{URI:function(e,g){var f=this,h,d,c;e=tinymce.trim(e);g=f.settings=g||{};if(/^(mailto|tel|news|javascript|about|data):/i.test(e)||/^\s*#/.test(e)){f.source=e;return}if(e.indexOf("/")===0&&e.indexOf("//")!==0){e=(g.base_uri?g.base_uri.protocol||"http":"http")+"://mce_host"+e}if(!/^\w*:?\/\//.test(e)){e=(g.base_uri.protocol||"http")+"://mce_host"+f.toAbsPath(g.base_uri.path,e)}e=e.replace(/@@/g,"(mce_at)");e=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(e);a(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],function(b,j){var k=e[j];if(k){k=k.replace(/\(mce_at\)/g,"@@")}f[b]=k});if(c=g.base_uri){if(!f.protocol){f.protocol=c.protocol}if(!f.userInfo){f.userInfo=c.userInfo}if(!f.port&&f.host=="mce_host"){f.port=c.port}if(!f.host||f.host=="mce_host"){f.host=c.host}f.source=""}},setPath:function(c){var b=this;c=/^(.*?)\/?(\w+)?$/.exec(c);b.path=c[0];b.directory=c[1];b.file=c[2];b.source="";b.getURI()},toRelative:function(b){var c=this,d;if(b==="./"){return b}b=new tinymce.util.URI(b,{base_uri:c});if((b.host!="mce_host"&&c.host!=b.host&&b.host)||c.port!=b.port||c.protocol!=b.protocol){return b.getURI()}d=c.toRelPath(c.path,b.path);if(b.query){d+="?"+b.query}if(b.anchor){d+="#"+b.anchor}return d},toAbsolute:function(b,c){var b=new tinymce.util.URI(b,{base_uri:this});return b.getURI(this.host==b.host&&this.protocol==b.protocol?c:0)},toRelPath:function(g,h){var c,f=0,d="",e,b;g=g.substring(0,g.lastIndexOf("/"));g=g.split("/");c=h.split("/");if(g.length>=c.length){for(e=0,b=g.length;e<b;e++){if(e>=c.length||g[e]!=c[e]){f=e+1;break}}}if(g.length<c.length){for(e=0,b=c.length;e<b;e++){if(e>=g.length||g[e]!=c[e]){f=e+1;break}}}if(f==1){return h}for(e=0,b=g.length-(f-1);e<b;e++){d+="../"}for(e=f-1,b=c.length;e<b;e++){if(e!=f-1){d+="/"+c[e]}else{d+=c[e]}}return d},toAbsPath:function(e,f){var c,b=0,h=[],d,g;d=/\/$/.test(f)?"/":"";e=e.split("/");f=f.split("/");a(e,function(i){if(i){h.push(i)}});e=h;for(c=f.length-1,h=[];c>=0;c--){if(f[c].length==0||f[c]=="."){continue}if(f[c]==".."){b++;continue}if(b>0){b--;continue}h.push(f[c])}c=e.length-b;if(c<=0){g=h.reverse().join("/")}else{g=e.slice(0,c).join("/")+"/"+h.reverse().join("/")}if(g.indexOf("/")!==0){g="/"+g}if(d&&g.lastIndexOf("/")!==g.length-1){g+=d}return g},getURI:function(d){var c,b=this;if(!b.source||d){c="";if(!d){if(b.protocol){c+=b.protocol+"://"}if(b.userInfo){c+=b.userInfo+"@"}if(b.host){c+=b.host}if(b.port){c+=":"+b.port}}if(b.path){c+=b.path}if(b.query){c+="?"+b.query}if(b.anchor){c+="#"+b.anchor}b.source=c}return b.source}})})();(function(){var a=tinymce.each;tinymce.create("static tinymce.util.Cookie",{getHash:function(d){var b=this.get(d),c;if(b){a(b.split("&"),function(e){e=e.split("=");c=c||{};c[unescape(e[0])]=unescape(e[1])})}return c},setHash:function(j,b,g,f,i,c){var h="";a(b,function(e,d){h+=(!h?"":"&")+escape(d)+"="+escape(e)});this.set(j,h,g,f,i,c)},get:function(i){var h=document.cookie,g,f=i+"=",d;if(!h){return}d=h.indexOf("; "+f);if(d==-1){d=h.indexOf(f);if(d!=0){return null}}else{d+=2}g=h.indexOf(";",d);if(g==-1){g=h.length}return unescape(h.substring(d+f.length,g))},set:function(i,b,g,f,h,c){document.cookie=i+"="+escape(b)+((g)?"; expires="+g.toGMTString():"")+((f)?"; path="+escape(f):"")+((h)?"; domain="+h:"")+((c)?"; secure":"")},remove:function(e,b){var c=new Date();c.setTime(c.getTime()-1000);this.set(e,"",c,b,c)}})})();tinymce.create("static tinymce.util.JSON",{serialize:function(e){var c,a,d=tinymce.util.JSON.serialize,b;if(e==null){return"null"}b=typeof e;if(b=="string"){a="\bb\tt\nn\ff\rr\"\"''\\\\";return'"'+e.replace(/([\u0080-\uFFFF\x00-\x1f\"])/g,function(g,f){c=a.indexOf(f);if(c+1){return"\\"+a.charAt(c+1)}g=f.charCodeAt().toString(16);return"\\u"+"0000".substring(g.length)+g})+'"'}if(b=="object"){if(e.hasOwnProperty&&e instanceof Array){for(c=0,a="[";c<e.length;c++){a+=(c>0?",":"")+d(e[c])}return a+"]"}a="{";for(c in e){a+=typeof e[c]!="function"?(a.length>1?',"':'"')+c+'":'+d(e[c]):""}return a+"}"}return""+e},parse:function(s){try{return eval("("+s+")")}catch(ex){}}});tinymce.create("static tinymce.util.XHR",{send:function(g){var a,e,b=window,h=0;g.scope=g.scope||this;g.success_scope=g.success_scope||g.scope;g.error_scope=g.error_scope||g.scope;g.async=g.async===false?false:true;g.data=g.data||"";function d(i){a=0;try{a=new ActiveXObject(i)}catch(c){}return a}a=b.XMLHttpRequest?new XMLHttpRequest():d("Microsoft.XMLHTTP")||d("Msxml2.XMLHTTP");if(a){if(a.overrideMimeType){a.overrideMimeType(g.content_type)}a.open(g.type||(g.data?"POST":"GET"),g.url,g.async);if(g.content_type){a.setRequestHeader("Content-Type",g.content_type)}a.setRequestHeader("X-Requested-With","XMLHttpRequest");a.send(g.data);function f(){if(!g.async||a.readyState==4||h++>10000){if(g.success&&h<10000&&a.status==200){g.success.call(g.success_scope,""+a.responseText,a,g)}else{if(g.error){g.error.call(g.error_scope,h>10000?"TIMED_OUT":"GENERAL",a,g)}}a=null}else{b.setTimeout(f,10)}}if(!g.async){return f()}e=b.setTimeout(f,10)}}});(function(){var c=tinymce.extend,b=tinymce.util.JSON,a=tinymce.util.XHR;tinymce.create("tinymce.util.JSONRequest",{JSONRequest:function(d){this.settings=c({},d);this.count=0},send:function(f){var e=f.error,d=f.success;f=c(this.settings,f);f.success=function(h,g){h=b.parse(h);if(typeof(h)=="undefined"){h={error:"JSON Parse error."}}if(h.error){e.call(f.error_scope||f.scope,h.error,g)}else{d.call(f.success_scope||f.scope,h.result)}};f.error=function(h,g){e.call(f.error_scope||f.scope,h,g)};f.data=b.serialize({id:f.id||"c"+(this.count++),method:f.method,params:f.params});f.content_type="application/json";a.send(f)},"static":{sendRPC:function(d){return new tinymce.util.JSONRequest().send(d)}}})}());(function(m){var k=m.each,j=m.is,i=m.isWebKit,d=m.isIE,a=/^(H[1-6R]|P|DIV|ADDRESS|PRE|FORM|T(ABLE|BODY|HEAD|FOOT|H|R|D)|LI|OL|UL|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|NOSCRIPT|MENU|ISINDEX|SAMP)$/,e=g("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"),f=g("src,href,style,coords,shape"),c={"&":"&",'"':""","<":"<",">":">"},n=/[<>&\"]/g,b=/^([a-z0-9],?)+$/i,h=/<(\w+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)(\s*\/?)>/g,l=/(\w+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;function g(q){var p={},o;q=q.split(",");for(o=q.length;o>=0;o--){p[q[o]]=1}return p}m.create("tinymce.dom.DOMUtils",{doc:null,root:null,files:null,pixelStyles:/^(top|left|bottom|right|width|height|borderWidth)$/,props:{"for":"htmlFor","class":"className",className:"className",checked:"checked",disabled:"disabled",maxlength:"maxLength",readonly:"readOnly",selected:"selected",value:"value",id:"id",name:"name",type:"type"},DOMUtils:function(u,q){var p=this,o;p.doc=u;p.win=window;p.files={};p.cssFlicker=false;p.counter=0;p.boxModel=!m.isIE||u.compatMode=="CSS1Compat";p.stdMode=u.documentMode===8;p.settings=q=m.extend({keep_values:false,hex_colors:1,process_html:1},q);if(m.isIE6){try{u.execCommand("BackgroundImageCache",false,true)}catch(r){p.cssFlicker=true}}if(q.valid_styles){p._styles={};k(q.valid_styles,function(t,s){p._styles[s]=m.explode(t)})}m.addUnload(p.destroy,p)},getRoot:function(){var o=this,p=o.settings;return(p&&o.get(p.root_element))||o.doc.body},getViewPort:function(p){var q,o;p=!p?this.win:p;q=p.document;o=this.boxModel?q.documentElement:q.body;return{x:p.pageXOffset||o.scrollLeft,y:p.pageYOffset||o.scrollTop,w:p.innerWidth||o.clientWidth,h:p.innerHeight||o.clientHeight}},getRect:function(s){var r,o=this,q;s=o.get(s);r=o.getPos(s);q=o.getSize(s);return{x:r.x,y:r.y,w:q.w,h:q.h}},getSize:function(r){var p=this,o,q;r=p.get(r);o=p.getStyle(r,"width");q=p.getStyle(r,"height");if(o.indexOf("px")===-1){o=0}if(q.indexOf("px")===-1){q=0}return{w:parseInt(o)||r.offsetWidth||r.clientWidth,h:parseInt(q)||r.offsetHeight||r.clientHeight}},getParent:function(q,p,o){return this.getParents(q,p,o,false)},getParents:function(z,v,s,y){var q=this,p,u=q.settings,x=[];z=q.get(z);y=y===undefined;if(u.strict_root){s=s||q.getRoot()}if(j(v,"string")){p=v;if(v==="*"){v=function(o){return o.nodeType==1}}else{v=function(o){return q.is(o,p)}}}while(z){if(z==s||!z.nodeType||z.nodeType===9){break}if(!v||v(z)){if(y){x.push(z)}else{return z}}z=z.parentNode}return y?x:null},get:function(o){var p;if(o&&this.doc&&typeof(o)=="string"){p=o;o=this.doc.getElementById(o);if(o&&o.id!==p){return this.doc.getElementsByName(p)[1]}}return o},getNext:function(p,o){return this._findSib(p,o,"nextSibling")},getPrev:function(p,o){return this._findSib(p,o,"previousSibling")},add:function(s,v,o,r,u){var q=this;return this.run(s,function(y){var x,t;x=j(v,"string")?q.doc.createElement(v):v;q.setAttribs(x,o);if(r){if(r.nodeType){x.appendChild(r)}else{q.setHTML(x,r)}}return !u?y.appendChild(x):x})},create:function(q,o,p){return this.add(this.doc.createElement(q),q,o,p,1)},createHTML:function(v,p,s){var u="",r=this,q;u+="<"+v;for(q in p){if(p.hasOwnProperty(q)){u+=" "+q+'="'+r.encode(p[q])+'"'}}if(m.is(s)){return u+">"+s+"</"+v+">"}return u+" />"},remove:function(o,p){return this.run(o,function(r){var q,s;q=r.parentNode;if(!q){return null}if(p){while(s=r.firstChild){if(!m.isIE||s.nodeType!==3||s.nodeValue){q.insertBefore(s,r)}else{r.removeChild(s)}}}return q.removeChild(r)})},setStyle:function(r,o,p){var q=this;return q.run(r,function(v){var u,t;u=v.style;o=o.replace(/-(\D)/g,function(x,s){return s.toUpperCase()});if(q.pixelStyles.test(o)&&(m.is(p,"number")||/^[\-0-9\.]+$/.test(p))){p+="px"}switch(o){case"opacity":if(d){u.filter=p===""?"":"alpha(opacity="+(p*100)+")";if(!r.currentStyle||!r.currentStyle.hasLayout){u.display="inline-block"}}u[o]=u["-moz-opacity"]=u["-khtml-opacity"]=p||"";break;case"float":d?u.styleFloat=p:u.cssFloat=p;break;default:u[o]=p||""}if(q.settings.update_styles){q.setAttrib(v,"_mce_style")}})},getStyle:function(r,o,q){r=this.get(r);if(!r){return false}if(this.doc.defaultView&&q){o=o.replace(/[A-Z]/g,function(s){return"-"+s});try{return this.doc.defaultView.getComputedStyle(r,null).getPropertyValue(o)}catch(p){return null}}o=o.replace(/-(\D)/g,function(t,s){return s.toUpperCase()});if(o=="float"){o=d?"styleFloat":"cssFloat"}if(r.currentStyle&&q){return r.currentStyle[o]}return r.style[o]},setStyles:function(u,v){var q=this,r=q.settings,p;p=r.update_styles;r.update_styles=0;k(v,function(o,s){q.setStyle(u,s,o)});r.update_styles=p;if(r.update_styles){q.setAttrib(u,r.cssText)}},setAttrib:function(q,r,o){var p=this;if(!q||!r){return}if(p.settings.strict){r=r.toLowerCase()}return this.run(q,function(u){var t=p.settings;switch(r){case"style":if(!j(o,"string")){k(o,function(s,x){p.setStyle(u,x,s)});return}if(t.keep_values){if(o&&!p._isRes(o)){u.setAttribute("_mce_style",o,2)}else{u.removeAttribute("_mce_style",2)}}u.style.cssText=o;break;case"class":u.className=o||"";break;case"src":case"href":if(t.keep_values){if(t.url_converter){o=t.url_converter.call(t.url_converter_scope||p,o,r,u)}p.setAttrib(u,"_mce_"+r,o,2)}break;case"shape":u.setAttribute("_mce_style",o);break}if(j(o)&&o!==null&&o.length!==0){u.setAttribute(r,""+o,2)}else{u.removeAttribute(r,2)}})},setAttribs:function(q,r){var p=this;return this.run(q,function(o){k(r,function(s,t){p.setAttrib(o,t,s)})})},getAttrib:function(r,s,q){var o,p=this;r=p.get(r);if(!r||r.nodeType!==1){return false}if(!j(q)){q=""}if(/^(src|href|style|coords|shape)$/.test(s)){o=r.getAttribute("_mce_"+s);if(o){return o}}if(d&&p.props[s]){o=r[p.props[s]];o=o&&o.nodeValue?o.nodeValue:o}if(!o){o=r.getAttribute(s,2)}if(/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(s)){if(r[p.props[s]]===true&&o===""){return s}return o?s:""}if(r.nodeName==="FORM"&&r.getAttributeNode(s)){return r.getAttributeNode(s).nodeValue}if(s==="style"){o=o||r.style.cssText;if(o){o=p.serializeStyle(p.parseStyle(o),r.nodeName);if(p.settings.keep_values&&!p._isRes(o)){r.setAttribute("_mce_style",o)}}}if(i&&s==="class"&&o){o=o.replace(/(apple|webkit)\-[a-z\-]+/gi,"")}if(d){switch(s){case"rowspan":case"colspan":if(o===1){o=""}break;case"size":if(o==="+0"||o===20||o===0){o=""}break;case"width":case"height":case"vspace":case"checked":case"disabled":case"readonly":if(o===0){o=""}break;case"hspace":if(o===-1){o=""}break;case"maxlength":case"tabindex":if(o===32768||o===2147483647||o==="32768"){o=""}break;case"multiple":case"compact":case"noshade":case"nowrap":if(o===65535){return s}return q;case"shape":o=o.toLowerCase();break;default:if(s.indexOf("on")===0&&o){o=(""+o).replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/,"$1")}}}return(o!==undefined&&o!==null&&o!=="")?""+o:q},getPos:function(A,s){var p=this,o=0,z=0,u,v=p.doc,q;A=p.get(A);s=s||v.body;if(A){if(d&&!p.stdMode){A=A.getBoundingClientRect();u=p.boxModel?v.documentElement:v.body;o=p.getStyle(p.select("html")[0],"borderWidth");o=(o=="medium"||p.boxModel&&!p.isIE6)&&2||o;return{x:A.left+u.scrollLeft-o,y:A.top+u.scrollTop-o}}q=A;while(q&&q!=s&&q.nodeType){o+=q.offsetLeft||0;z+=q.offsetTop||0;q=q.offsetParent}q=A.parentNode;while(q&&q!=s&&q.nodeType){o-=q.scrollLeft||0;z-=q.scrollTop||0;q=q.parentNode}}return{x:o,y:z}},parseStyle:function(r){var u=this,v=u.settings,x={};if(!r){return x}function p(D,A,C){var z,B,o,y;z=x[D+"-top"+A];if(!z){return}B=x[D+"-right"+A];if(z!=B){return}o=x[D+"-bottom"+A];if(B!=o){return}y=x[D+"-left"+A];if(o!=y){return}x[C]=y;delete x[D+"-top"+A];delete x[D+"-right"+A];delete x[D+"-bottom"+A];delete x[D+"-left"+A]}function q(y,s,o,A){var z;z=x[s];if(!z){return}z=x[o];if(!z){return}z=x[A];if(!z){return}x[y]=x[s]+" "+x[o]+" "+x[A];delete x[s];delete x[o];delete x[A]}r=r.replace(/&(#?[a-z0-9]+);/g,"&$1_MCE_SEMI_");k(r.split(";"),function(s){var o,t=[];if(s){s=s.replace(/_MCE_SEMI_/g,";");s=s.replace(/url\([^\)]+\)/g,function(y){t.push(y);return"url("+t.length+")"});s=s.split(":");o=m.trim(s[1]);o=o.replace(/url\(([^\)]+)\)/g,function(z,y){return t[parseInt(y)-1]});o=o.replace(/rgb\([^\)]+\)/g,function(y){return u.toHex(y)});if(v.url_converter){o=o.replace(/url\([\'\"]?([^\)\'\"]+)[\'\"]?\)/g,function(y,z){return"url("+v.url_converter.call(v.url_converter_scope||u,u.decode(z),"style",null)+")"})}x[m.trim(s[0]).toLowerCase()]=o}});p("border","","border");p("border","-width","border-width");p("border","-color","border-color");p("border","-style","border-style");p("padding","","padding");p("margin","","margin");q("border","border-width","border-style","border-color");if(d){if(x.border=="medium none"){x.border=""}}return x},serializeStyle:function(v,p){var q=this,r="";function u(s,o){if(o&&s){if(o.indexOf("-")===0){return}switch(o){case"font-weight":if(s==700){s="bold"}break;case"color":case"background-color":s=s.toLowerCase();break}r+=(r?" ":"")+o+": "+s+";"}}if(p&&q._styles){k(q._styles["*"],function(o){u(v[o],o)});k(q._styles[p.toLowerCase()],function(o){u(v[o],o)})}else{k(v,u)}return r},loadCSS:function(o){var q=this,r=q.doc,p;if(!o){o=""}p=q.select("head")[0];k(o.split(","),function(s){var t;if(q.files[s]){return}q.files[s]=true;t=q.create("link",{rel:"stylesheet",href:m._addVer(s)});if(d&&r.documentMode){t.onload=function(){r.recalc();t.onload=null}}p.appendChild(t)})},addClass:function(o,p){return this.run(o,function(q){var r;if(!p){return 0}if(this.hasClass(q,p)){return q.className}r=this.removeClass(q,p);return q.className=(r!=""?(r+" "):"")+p})},removeClass:function(q,r){var o=this,p;return o.run(q,function(t){var s;if(o.hasClass(t,r)){if(!p){p=new RegExp("(^|\\s+)"+r+"(\\s+|$)","g")}s=t.className.replace(p," ");s=m.trim(s!=" "?s:"");t.className=s;if(!s){t.removeAttribute("class");t.removeAttribute("className")}return s}return t.className})},hasClass:function(p,o){p=this.get(p);if(!p||!o){return false}return(" "+p.className+" ").indexOf(" "+o+" ")!==-1},show:function(o){return this.setStyle(o,"display","block")},hide:function(o){return this.setStyle(o,"display","none")},isHidden:function(o){o=this.get(o);return !o||o.style.display=="none"||this.getStyle(o,"display")=="none"},uniqueId:function(o){return(!o?"mce_":o)+(this.counter++)},setHTML:function(q,p){var o=this;return this.run(q,function(v){var r,t,s,z,u,r;p=o.processHTML(p);if(d){function y(){while(v.firstChild){v.firstChild.removeNode()}try{v.innerHTML="<br />"+p;v.removeChild(v.firstChild)}catch(x){r=o.create("div");r.innerHTML="<br />"+p;k(r.childNodes,function(B,A){if(A){v.appendChild(B)}})}}if(o.settings.fix_ie_paragraphs){p=p.replace(/<p><\/p>|<p([^>]+)><\/p>|<p[^\/+]\/>/gi,'<p$1 _mce_keep="true"> </p>')}y();if(o.settings.fix_ie_paragraphs){s=v.getElementsByTagName("p");for(t=s.length-1,r=0;t>=0;t--){z=s[t];if(!z.hasChildNodes()){if(!z._mce_keep){r=1;break}z.removeAttribute("_mce_keep")}}}if(r){p=p.replace(/<p ([^>]+)>|<p>/ig,'<div $1 _mce_tmp="1">');p=p.replace(/<\/p>/gi,"</div>");y();if(o.settings.fix_ie_paragraphs){s=v.getElementsByTagName("DIV");for(t=s.length-1;t>=0;t--){z=s[t];if(z._mce_tmp){u=o.doc.createElement("p");z.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi,function(A,x){var B;if(x!=="_mce_tmp"){B=z.getAttribute(x);if(!B&&x==="class"){B=z.className}u.setAttribute(x,B)}});for(r=0;r<z.childNodes.length;r++){u.appendChild(z.childNodes[r].cloneNode(true))}z.swapNode(u)}}}}}else{v.innerHTML=p}return p})},processHTML:function(r){var p=this,q=p.settings,v=[];if(!q.process_html){return r}if(d){r=r.replace(/'/g,"'");r=r.replace(/\s+(disabled|checked|readonly|selected)\s*=\s*[\"\']?(false|0)[\"\']?/gi,"")}r=r.replace(/<a( )([^>]+)\/>|<a\/>/gi,"<a$1$2></a>");if(q.keep_values){if(/<script|noscript|style/i.test(r)){function o(t){t=t.replace(/(<!--\[CDATA\[|\]\]-->)/g,"\n");t=t.replace(/^[\r\n]*|[\r\n]*$/g,"");t=t.replace(/^\s*(\/\/\s*<!--|\/\/\s*<!\[CDATA\[|<!--|<!\[CDATA\[)[\r\n]*/g,"");t=t.replace(/\s*(\/\/\s*\]\]>|\/\/\s*-->|\]\]>|-->|\]\]-->)\s*$/g,"");return t}r=r.replace(/<script([^>]+|)>([\s\S]*?)<\/script>/gi,function(s,x,t){if(!x){x=' type="text/javascript"'}x=x.replace(/src=\"([^\"]+)\"?/i,function(y,z){if(q.url_converter){z=p.encode(q.url_converter.call(q.url_converter_scope||p,p.decode(z),"src","script"))}return'_mce_src="'+z+'"'});if(m.trim(t)){v.push(o(t));t="<!--\nMCE_SCRIPT:"+(v.length-1)+"\n// -->"}return"<mce:script"+x+">"+t+"</mce:script>"});r=r.replace(/<style([^>]+|)>([\s\S]*?)<\/style>/gi,function(s,x,t){if(t){v.push(o(t));t="<!--\nMCE_SCRIPT:"+(v.length-1)+"\n-->"}return"<mce:style"+x+">"+t+"</mce:style><style "+x+' _mce_bogus="1">'+t+"</style>"});r=r.replace(/<noscript([^>]+|)>([\s\S]*?)<\/noscript>/g,function(s,x,t){return"<mce:noscript"+x+"><!--"+p.encode(t).replace(/--/g,"--")+"--></mce:noscript>"})}r=r.replace(/<!\[CDATA\[([\s\S]+)\]\]>/g,"<!--[CDATA[$1]]-->");function u(s){return s.replace(h,function(y,z,x,t){return"<"+z+x.replace(l,function(B,A,E,D,C){var F;A=A.toLowerCase();E=E||D||C||"";if(e[A]){if(E==="false"||E==="0"){return}return A+'="'+A+'"'}if(f[A]&&x.indexOf("_mce_"+A)==-1){F=p.decode(E);if(q.url_converter&&(A=="src"||A=="href")){F=q.url_converter.call(q.url_converter_scope||p,F,A,z)}if(A=="style"){F=p.serializeStyle(p.parseStyle(F),A)}return A+'="'+E+'" _mce_'+A+'="'+p.encode(F)+'"'}return B})+t+">"})}r=u(r);r=r.replace(/MCE_SCRIPT:([0-9]+)/g,function(t,s){return v[s]})}return r},getOuterHTML:function(o){var p;o=this.get(o);if(!o){return null}if(o.outerHTML!==undefined){return o.outerHTML}p=(o.ownerDocument||this.doc).createElement("body");p.appendChild(o.cloneNode(true));return p.innerHTML},setOuterHTML:function(r,p,s){var o=this;function q(u,t,x){var y,v;v=x.createElement("body");v.innerHTML=t;y=v.lastChild;while(y){o.insertAfter(y.cloneNode(true),u);y=y.previousSibling}o.remove(u)}return this.run(r,function(u){u=o.get(u);if(u.nodeType==1){s=s||u.ownerDocument||o.doc;if(d){try{if(d&&u.nodeType==1){u.outerHTML=p}else{q(u,p,s)}}catch(t){q(u,p,s)}}else{q(u,p,s)}}})},decode:function(p){var q,r,o;if(/&[\w#]+;/.test(p)){q=this.doc.createElement("div");q.innerHTML=p;r=q.firstChild;o="";if(r){do{o+=r.nodeValue}while(r=r.nextSibling)}return o||p}return p},encode:function(o){return(""+o).replace(n,function(p){return c[p]})},insertAfter:function(o,p){p=this.get(p);return this.run(o,function(r){var q,s;q=p.parentNode;s=p.nextSibling;if(s){q.insertBefore(r,s)}else{q.appendChild(r)}return r})},isBlock:function(o){if(o.nodeType&&o.nodeType!==1){return false}o=o.nodeName||o;return a.test(o)},replace:function(s,r,p){var q=this;if(j(r,"array")){s=s.cloneNode(true)}return q.run(r,function(t){if(p){k(m.grep(t.childNodes),function(o){s.appendChild(o)})}return t.parentNode.replaceChild(s,t)})},rename:function(r,o){var q=this,p;if(r.nodeName!=o.toUpperCase()){p=q.create(o);k(q.getAttribs(r),function(s){q.setAttrib(p,s.nodeName,q.getAttrib(r,s.nodeName))});q.replace(p,r,1)}return p||r},findCommonAncestor:function(q,o){var r=q,p;while(r){p=o;while(p&&r!=p){p=p.parentNode}if(r==p){break}r=r.parentNode}if(!r&&q.ownerDocument){return q.ownerDocument.documentElement}return r},toHex:function(o){var q=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(o);function p(r){r=parseInt(r).toString(16);return r.length>1?r:"0"+r}if(q){o="#"+p(q[1])+p(q[2])+p(q[3]);return o}return o},getClasses:function(){var s=this,o=[],r,u={},v=s.settings.class_filter,q;if(s.classes){return s.classes}function x(t){k(t.imports,function(y){x(y)});k(t.cssRules||t.rules,function(y){switch(y.type||1){case 1:if(y.selectorText){k(y.selectorText.split(","),function(z){z=z.replace(/^\s*|\s*$|^\s\./g,"");if(/\.mce/.test(z)||!/\.[\w\-]+$/.test(z)){return}q=z;z=z.replace(/.*\.([a-z0-9_\-]+).*/i,"$1");if(v&&!(z=v(z,q))){return}if(!u[z]){o.push({"class":z});u[z]=1}})}break;case 3:x(y.styleSheet);break}})}try{k(s.doc.styleSheets,x)}catch(p){}if(o.length>0){s.classes=o}return o},run:function(u,r,q){var p=this,v;if(p.doc&&typeof(u)==="string"){u=p.get(u)}if(!u){return false}q=q||this;if(!u.nodeType&&(u.length||u.length===0)){v=[];k(u,function(s,o){if(s){if(typeof(s)=="string"){s=p.doc.getElementById(s)}v.push(r.call(q,s,o))}});return v}return r.call(q,u)},getAttribs:function(q){var p;q=this.get(q);if(!q){return[]}if(d){p=[];if(q.nodeName=="OBJECT"){return q.attributes}if(q.nodeName==="OPTION"&&this.getAttrib(q,"selected")){p.push({specified:1,nodeName:"selected"})}q.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi,"").replace(/[\w:\-]+/gi,function(o){p.push({specified:1,nodeName:o})});return p}return q.attributes},destroy:function(p){var o=this;if(o.events){o.events.destroy()}o.win=o.doc=o.root=o.events=null;if(!p){m.removeUnload(o.destroy)}},createRng:function(){var o=this.doc;return o.createRange?o.createRange():new m.dom.Range(this)},nodeIndex:function(s,t){var o=0,q,r,p;if(s){for(q=s.nodeType,s=s.previousSibling,r=s;s;s=s.previousSibling){p=s.nodeType;if(t&&p==3){if(p==q||!s.nodeValue.length){continue}}o++;q=p}}return o},split:function(u,s,y){var z=this,o=z.createRng(),v,q,x;function p(A){var t,r=A.childNodes;if(A.nodeType==1&&A.getAttribute("_mce_type")=="bookmark"){return}for(t=r.length-1;t>=0;t--){p(r[t])}if(A.nodeType!=9){if(A.nodeType==3&&A.nodeValue.length>0){return}if(A.nodeType==1){r=A.childNodes;if(r.length==1&&r[0]&&r[0].nodeType==1&&r[0].getAttribute("_mce_type")=="bookmark"){A.parentNode.insertBefore(r[0],A)}if(r.length||/^(br|hr|input|img)$/i.test(A.nodeName)){return}}z.remove(A)}return A}if(u&&s){o.setStart(u.parentNode,z.nodeIndex(u));o.setEnd(s.parentNode,z.nodeIndex(s));v=o.extractContents();o=z.createRng();o.setStart(s.parentNode,z.nodeIndex(s)+1);o.setEnd(u.parentNode,z.nodeIndex(u)+1);q=o.extractContents();x=u.parentNode;x.insertBefore(p(v),u);if(y){x.replaceChild(y,s)}else{x.insertBefore(s,u)}x.insertBefore(p(q),u);z.remove(u);return y||s}},bind:function(s,o,r,q){var p=this;if(!p.events){p.events=new m.dom.EventUtils()}return p.events.add(s,o,r,q||this)},unbind:function(r,o,q){var p=this;if(!p.events){p.events=new m.dom.EventUtils()}return p.events.remove(r,o,q)},_findSib:function(r,o,p){var q=this,s=o;if(r){if(j(s,"string")){s=function(t){return q.is(t,o)}}for(r=r[p];r;r=r[p]){if(s(r)){return r}}}return null},_isRes:function(o){return/^(top|left|bottom|right|width|height)/i.test(o)||/;\s*(top|left|bottom|right|width|height)/i.test(o)}});m.DOM=new m.dom.DOMUtils(document,{process_html:0})})(tinymce);(function(a){function b(c){var N=this,e=c.doc,S=0,E=1,j=2,D=true,R=false,U="startOffset",h="startContainer",P="endContainer",z="endOffset",k=tinymce.extend,n=c.nodeIndex;k(N,{startContainer:e,startOffset:0,endContainer:e,endOffset:0,collapsed:D,commonAncestorContainer:e,START_TO_START:0,START_TO_END:1,END_TO_END:2,END_TO_START:3,setStart:q,setEnd:s,setStartBefore:g,setStartAfter:I,setEndBefore:J,setEndAfter:u,collapse:A,selectNode:x,selectNodeContents:F,compareBoundaryPoints:v,deleteContents:p,extractContents:H,cloneContents:d,insertNode:C,surroundContents:M,cloneRange:K});function q(V,t){B(D,V,t)}function s(V,t){B(R,V,t)}function g(t){q(t.parentNode,n(t))}function I(t){q(t.parentNode,n(t)+1)}function J(t){s(t.parentNode,n(t))}function u(t){s(t.parentNode,n(t)+1)}function A(t){if(t){N[P]=N[h];N[z]=N[U]}else{N[h]=N[P];N[U]=N[z]}N.collapsed=D}function x(t){g(t);u(t)}function F(t){q(t,0);s(t,t.nodeType===1?t.childNodes.length:t.nodeValue.length)}function v(W,X){var Z=N[h],Y=N[U],V=N[P],t=N[z];if(W===0){return G(Z,Y,Z,Y)}if(W===1){return G(Z,Y,V,t)}if(W===2){return G(V,t,V,t)}if(W===3){return G(V,t,Z,Y)}}function p(){m(j)}function H(){return m(S)}function d(){return m(E)}function C(Y){var V=this[h],t=this[U],X,W;if((V.nodeType===3||V.nodeType===4)&&V.nodeValue){if(!t){V.parentNode.insertBefore(Y,V)}else{if(t>=V.nodeValue.length){c.insertAfter(Y,V)}else{X=V.splitText(t);V.parentNode.insertBefore(Y,X)}}}else{if(V.childNodes.length>0){W=V.childNodes[t]}if(W){V.insertBefore(Y,W)}else{V.appendChild(Y)}}}function M(V){var t=N.extractContents();N.insertNode(V);V.appendChild(t);N.selectNode(V)}function K(){return k(new b(c),{startContainer:N[h],startOffset:N[U],endContainer:N[P],endOffset:N[z],collapsed:N.collapsed,commonAncestorContainer:N.commonAncestorContainer})}function O(t,V){var W;if(t.nodeType==3){return t}if(V<0){return t}W=t.firstChild;while(W&&V>0){--V;W=W.nextSibling}if(W){return W}return t}function l(){return(N[h]==N[P]&&N[U]==N[z])}function G(X,Z,V,Y){var aa,W,t,ab,ad,ac;if(X==V){if(Z==Y){return 0}if(Z<Y){return -1}return 1}aa=V;while(aa&&aa.parentNode!=X){aa=aa.parentNode}if(aa){W=0;t=X.firstChild;while(t!=aa&&W<Z){W++;t=t.nextSibling}if(Z<=W){return -1}return 1}aa=X;while(aa&&aa.parentNode!=V){aa=aa.parentNode}if(aa){W=0;t=V.firstChild;while(t!=aa&&W<Y){W++;t=t.nextSibling}if(W<Y){return -1}return 1}ab=c.findCommonAncestor(X,V);ad=X;while(ad&&ad.parentNode!=ab){ad=ad.parentNode}if(!ad){ad=ab}ac=V;while(ac&&ac.parentNode!=ab){ac=ac.parentNode}if(!ac){ac=ab}if(ad==ac){return 0}t=ab.firstChild;while(t){if(t==ad){return -1}if(t==ac){return 1}t=t.nextSibling}}function B(V,Y,X){var t,W;if(V){N[h]=Y;N[U]=X}else{N[P]=Y;N[z]=X}t=N[P];while(t.parentNode){t=t.parentNode}W=N[h];while(W.parentNode){W=W.parentNode}if(W==t){if(G(N[h],N[U],N[P],N[z])>0){N.collapse(V)}}else{N.collapse(V)}N.collapsed=l();N.commonAncestorContainer=c.findCommonAncestor(N[h],N[P])}function m(ab){var aa,X=0,ad=0,V,Z,W,Y,t,ac;if(N[h]==N[P]){return f(ab)}for(aa=N[P],V=aa.parentNode;V;aa=V,V=V.parentNode){if(V==N[h]){return r(aa,ab)}++X}for(aa=N[h],V=aa.parentNode;V;aa=V,V=V.parentNode){if(V==N[P]){return T(aa,ab)}++ad}Z=ad-X;W=N[h];while(Z>0){W=W.parentNode;Z--}Y=N[P];while(Z<0){Y=Y.parentNode;Z++}for(t=W.parentNode,ac=Y.parentNode;t!=ac;t=t.parentNode,ac=ac.parentNode){W=t;Y=ac}return o(W,Y,ab)}function f(Z){var ab,Y,X,aa,t,W,V;if(Z!=j){ab=e.createDocumentFragment()}if(N[U]==N[z]){return ab}if(N[h].nodeType==3){Y=N[h].nodeValue;X=Y.substring(N[U],N[z]);if(Z!=E){N[h].deleteData(N[U],N[z]-N[U]);N.collapse(D)}if(Z==j){return}ab.appendChild(e.createTextNode(X));return ab}aa=O(N[h],N[U]);t=N[z]-N[U];while(t>0){W=aa.nextSibling;V=y(aa,Z);if(ab){ab.appendChild(V)}--t;aa=W}if(Z!=E){N.collapse(D)}return ab}function r(ab,Y){var aa,Z,V,t,X,W;if(Y!=j){aa=e.createDocumentFragment()}Z=i(ab,Y);if(aa){aa.appendChild(Z)}V=n(ab);t=V-N[U];if(t<=0){if(Y!=E){N.setEndBefore(ab);N.collapse(R)}return aa}Z=ab.previousSibling;while(t>0){X=Z.previousSibling;W=y(Z,Y);if(aa){aa.insertBefore(W,aa.firstChild)}--t;Z=X}if(Y!=E){N.setEndBefore(ab);N.collapse(R)}return aa}function T(Z,Y){var ab,V,aa,t,X,W;if(Y!=j){ab=e.createDocumentFragment()}aa=Q(Z,Y);if(ab){ab.appendChild(aa)}V=n(Z);++V;t=N[z]-V;aa=Z.nextSibling;while(t>0){X=aa.nextSibling;W=y(aa,Y);if(ab){ab.appendChild(W)}--t;aa=X}if(Y!=E){N.setStartAfter(Z);N.collapse(D)}return ab}function o(Z,t,ac){var W,ae,Y,aa,ab,V,ad,X;if(ac!=j){ae=e.createDocumentFragment()}W=Q(Z,ac);if(ae){ae.appendChild(W)}Y=Z.parentNode;aa=n(Z);ab=n(t);++aa;V=ab-aa;ad=Z.nextSibling;while(V>0){X=ad.nextSibling;W=y(ad,ac);if(ae){ae.appendChild(W)}ad=X;--V}W=i(t,ac);if(ae){ae.appendChild(W)}if(ac!=E){N.setStartAfter(Z);N.collapse(D)}return ae}function i(aa,ab){var W=O(N[P],N[z]-1),ac,Z,Y,t,V,X=W!=N[P];if(W==aa){return L(W,X,R,ab)}ac=W.parentNode;Z=L(ac,R,R,ab);while(ac){while(W){Y=W.previousSibling;t=L(W,X,R,ab);if(ab!=j){Z.insertBefore(t,Z.firstChild)}X=D;W=Y}if(ac==aa){return Z}W=ac.previousSibling;ac=ac.parentNode;V=L(ac,R,R,ab);if(ab!=j){V.appendChild(Z)}Z=V}}function Q(aa,ab){var X=O(N[h],N[U]),Y=X!=N[h],ac,Z,W,t,V;if(X==aa){return L(X,Y,D,ab)}ac=X.parentNode;Z=L(ac,R,D,ab);while(ac){while(X){W=X.nextSibling;t=L(X,Y,D,ab);if(ab!=j){Z.appendChild(t)}Y=D;X=W}if(ac==aa){return Z}X=ac.nextSibling;ac=ac.parentNode;V=L(ac,R,D,ab);if(ab!=j){V.appendChild(Z)}Z=V}}function L(t,Y,ab,ac){var X,W,Z,V,aa;if(Y){return y(t,ac)}if(t.nodeType==3){X=t.nodeValue;if(ab){V=N[U];W=X.substring(V);Z=X.substring(0,V)}else{V=N[z];W=X.substring(0,V);Z=X.substring(V)}if(ac!=E){t.nodeValue=Z}if(ac==j){return}aa=t.cloneNode(R);aa.nodeValue=W;return aa}if(ac==j){return}return t.cloneNode(R)}function y(V,t){if(t!=j){return t==E?V.cloneNode(D):V}V.parentNode.removeChild(V)}}a.Range=b})(tinymce.dom);(function(){function a(g){var i=this,j="\uFEFF",e,h,d=g.dom,c=true,f=false;function b(){var n=g.getRng(),k=d.createRng(),m,o;m=n.item?n.item(0):n.parentElement();if(m.ownerDocument!=d.doc){return k}if(n.item||!m.hasChildNodes()){k.setStart(m.parentNode,d.nodeIndex(m));k.setEnd(k.startContainer,k.startOffset+1);return k}o=g.isCollapsed();function l(s){var u,q,t,p,A=0,x,y,z,r,v;r=n.duplicate();r.collapse(s);u=d.create("a");z=r.parentElement();if(!z.hasChildNodes()){k[s?"setStart":"setEnd"](z,0);return}z.appendChild(u);r.moveToElementText(u);v=n.compareEndPoints(s?"StartToStart":"EndToEnd",r);if(v>0){k[s?"setStartAfter":"setEndAfter"](z);d.remove(u);return}p=tinymce.grep(z.childNodes);x=p.length-1;while(A<=x){y=Math.floor((A+x)/2);z.insertBefore(u,p[y]);r.moveToElementText(u);v=n.compareEndPoints(s?"StartToStart":"EndToEnd",r);if(v>0){A=y+1}else{if(v<0){x=y-1}else{found=true;break}}}q=v>0||y==0?u.nextSibling:u.previousSibling;if(q.nodeType==1){d.remove(u);t=d.nodeIndex(q);q=q.parentNode;if(!s||y>0){t++}}else{if(v>0||y==0){r.setEndPoint(s?"StartToStart":"EndToEnd",n);t=r.text.length}else{r.setEndPoint(s?"StartToStart":"EndToEnd",n);t=q.nodeValue.length-r.text.length}d.remove(u)}k[s?"setStart":"setEnd"](q,t)}l(true);if(!o){l()}return k}this.addRange=function(k){var p,n,m,r,u,s,t=g.dom.doc,o=t.body;function l(B){var x,A,v,z,y;v=d.create("a");x=B?m:u;A=B?r:s;z=p.duplicate();if(x==t){x=o;A=0}if(x.nodeType==3){x.parentNode.insertBefore(v,x);z.moveToElementText(v);z.moveStart("character",A);d.remove(v);p.setEndPoint(B?"StartToStart":"EndToEnd",z)}else{y=x.childNodes;if(y.length){if(A>=y.length){d.insertAfter(v,y[y.length-1])}else{x.insertBefore(v,y[A])}z.moveToElementText(v)}else{v=t.createTextNode(j);x.appendChild(v);z.moveToElementText(v.parentNode);z.collapse(c)}p.setEndPoint(B?"StartToStart":"EndToEnd",z);d.remove(v)}}this.destroy();m=k.startContainer;r=k.startOffset;u=k.endContainer;s=k.endOffset;p=o.createTextRange();if(m==u&&m.nodeType==1&&r==s-1){if(r==s-1){try{n=o.createControlRange();n.addElement(m.childNodes[r]);n.select();n.scrollIntoView();return}catch(q){}}}l(true);l();p.select();p.scrollIntoView()};this.getRangeAt=function(){if(!e||!tinymce.dom.RangeUtils.compareRanges(h,g.getRng())){e=b();h=g.getRng()}try{e.startContainer.nextSibling}catch(k){e=b();h=null}return e};this.destroy=function(){h=e=null};if(g.dom.boxModel){(function(){var q=d.doc,l=q.body,n,o;q.documentElement.unselectable=c;function p(r,u){var s=l.createTextRange();try{s.moveToPoint(r,u)}catch(t){s=null}return s}function m(s){var r;if(s.button){r=p(s.x,s.y);if(r){if(r.compareEndPoints("StartToStart",o)>0){r.setEndPoint("StartToStart",o)}else{r.setEndPoint("EndToEnd",o)}r.select()}}else{k()}}function k(){d.unbind(q,"mouseup",k);d.unbind(q,"mousemove",m);n=0}d.bind(q,"mousedown",function(r){if(r.target.nodeName==="HTML"){if(n){k()}n=1;o=p(r.x,r.y);if(o){d.bind(q,"mouseup",k);d.bind(q,"mousemove",m);o.select()}}})})()}}tinymce.dom.TridentSelection=a})();(function(d){var f=d.each,c=d.DOM,b=d.isIE,e=d.isWebKit,a;d.create("tinymce.dom.EventUtils",{EventUtils:function(){this.inits=[];this.events=[]},add:function(m,p,l,j){var g,h=this,i=h.events,k;if(p instanceof Array){k=[];f(p,function(o){k.push(h.add(m,o,l,j))});return k}if(m&&m.hasOwnProperty&&m instanceof Array){k=[];f(m,function(n){n=c.get(n);k.push(h.add(n,p,l,j))});return k}m=c.get(m);if(!m){return}g=function(n){if(h.disabled){return}n=n||window.event;if(n&&b){if(!n.target){n.target=n.srcElement}d.extend(n,h._stoppers)}if(!j){return l(n)}return l.call(j,n)};if(p=="unload"){d.unloads.unshift({func:g});return g}if(p=="init"){if(h.domLoaded){g()}else{h.inits.push(g)}return g}i.push({obj:m,name:p,func:l,cfunc:g,scope:j});h._add(m,p,g);return l},remove:function(l,m,k){var h=this,g=h.events,i=false,j;if(l&&l.hasOwnProperty&&l instanceof Array){j=[];f(l,function(n){n=c.get(n);j.push(h.remove(n,m,k))});return j}l=c.get(l);f(g,function(o,n){if(o.obj==l&&o.name==m&&(!k||(o.func==k||o.cfunc==k))){g.splice(n,1);h._remove(l,m,o.cfunc);i=true;return false}});return i},clear:function(l){var j=this,g=j.events,h,k;if(l){l=c.get(l);for(h=g.length-1;h>=0;h--){k=g[h];if(k.obj===l){j._remove(k.obj,k.name,k.cfunc);k.obj=k.cfunc=null;g.splice(h,1)}}}},cancel:function(g){if(!g){return false}this.stop(g);return this.prevent(g)},stop:function(g){if(g.stopPropagation){g.stopPropagation()}else{g.cancelBubble=true}return false},prevent:function(g){if(g.preventDefault){g.preventDefault()}else{g.returnValue=false}return false},destroy:function(){var g=this;f(g.events,function(j,h){g._remove(j.obj,j.name,j.cfunc);j.obj=j.cfunc=null});g.events=[];g=null},_add:function(h,i,g){if(h.attachEvent){h.attachEvent("on"+i,g)}else{if(h.addEventListener){h.addEventListener(i,g,false)}else{h["on"+i]=g}}},_remove:function(i,j,h){if(i){try{if(i.detachEvent){i.detachEvent("on"+j,h)}else{if(i.removeEventListener){i.removeEventListener(j,h,false)}else{i["on"+j]=null}}}catch(g){}}},_pageInit:function(h){var g=this;if(g.domLoaded){return}g.domLoaded=true;f(g.inits,function(i){i()});g.inits=[]},_wait:function(i){var g=this,h=i.document;if(i.tinyMCE_GZ&&tinyMCE_GZ.loaded){g.domLoaded=1;return}if(h.attachEvent){h.attachEvent("onreadystatechange",function(){if(h.readyState==="complete"){h.detachEvent("onreadystatechange",arguments.callee);g._pageInit(i)}});if(h.documentElement.doScroll&&i==i.top){(function(){if(g.domLoaded){return}try{h.documentElement.doScroll("left")}catch(j){setTimeout(arguments.callee,0);return}g._pageInit(i)})()}}else{if(h.addEventListener){g._add(i,"DOMContentLoaded",function(){g._pageInit(i)})}}g._add(i,"load",function(){g._pageInit(i)})},_stoppers:{preventDefault:function(){this.returnValue=false},stopPropagation:function(){this.cancelBubble=true}}});a=d.dom.Event=new d.dom.EventUtils();a._wait(window);d.addUnload(function(){a.destroy()})})(tinymce);(function(a){a.dom.Element=function(f,d){var b=this,e,c;b.settings=d=d||{};b.id=f;b.dom=e=d.dom||a.DOM;if(!a.isIE){c=e.get(b.id)}a.each(("getPos,getRect,getParent,add,setStyle,getStyle,setStyles,setAttrib,setAttribs,getAttrib,addClass,removeClass,hasClass,getOuterHTML,setOuterHTML,remove,show,hide,isHidden,setHTML,get").split(/,/),function(g){b[g]=function(){var h=[f],j;for(j=0;j<arguments.length;j++){h.push(arguments[j])}h=e[g].apply(e,h);b.update(g);return h}});a.extend(b,{on:function(i,h,g){return a.dom.Event.add(b.id,i,h,g)},getXY:function(){return{x:parseInt(b.getStyle("left")),y:parseInt(b.getStyle("top"))}},getSize:function(){var g=e.get(b.id);return{w:parseInt(b.getStyle("width")||g.clientWidth),h:parseInt(b.getStyle("height")||g.clientHeight)}},moveTo:function(g,h){b.setStyles({left:g,top:h})},moveBy:function(g,i){var h=b.getXY();b.moveTo(h.x+g,h.y+i)},resizeTo:function(g,i){b.setStyles({width:g,height:i})},resizeBy:function(g,j){var i=b.getSize();b.resizeTo(i.w+g,i.h+j)},update:function(h){var g;if(a.isIE6&&d.blocker){h=h||"";if(h.indexOf("get")===0||h.indexOf("has")===0||h.indexOf("is")===0){return}if(h=="remove"){e.remove(b.blocker);return}if(!b.blocker){b.blocker=e.uniqueId();g=e.add(d.container||e.getRoot(),"iframe",{id:b.blocker,style:"position:absolute;",frameBorder:0,src:'javascript:""'});e.setStyle(g,"opacity",0)}else{g=e.get(b.blocker)}e.setStyles(g,{left:b.getStyle("left",1),top:b.getStyle("top",1),width:b.getStyle("width",1),height:b.getStyle("height",1),display:b.getStyle("display",1),zIndex:parseInt(b.getStyle("zIndex",1)||0)-1})}}})}})(tinymce);(function(c){function e(f){return f.replace(/[\n\r]+/g,"")}var b=c.is,a=c.isIE,d=c.each;c.create("tinymce.dom.Selection",{Selection:function(i,h,g){var f=this;f.dom=i;f.win=h;f.serializer=g;d(["onBeforeSetContent","onBeforeGetContent","onSetContent","onGetContent"],function(j){f[j]=new c.util.Dispatcher(f)});if(!f.win.getSelection){f.tridentSel=new c.dom.TridentSelection(f)}c.addUnload(f.destroy,f)},getContent:function(g){var f=this,h=f.getRng(),l=f.dom.create("body"),j=f.getSel(),i,k,m;g=g||{};i=k="";g.get=true;g.format=g.format||"html";f.onBeforeGetContent.dispatch(f,g);if(g.format=="text"){return f.isCollapsed()?"":(h.text||(j.toString?j.toString():""))}if(h.cloneContents){m=h.cloneContents();if(m){l.appendChild(m)}}else{if(b(h.item)||b(h.htmlText)){l.innerHTML=h.item?h.item(0).outerHTML:h.htmlText}else{l.innerHTML=h.toString()}}if(/^\s/.test(l.innerHTML)){i=" "}if(/\s+$/.test(l.innerHTML)){k=" "}g.getInner=true;g.content=f.isCollapsed()?"":i+f.serializer.serialize(l,g)+k;f.onGetContent.dispatch(f,g);return g.content},setContent:function(i,g){var f=this,j=f.getRng(),l,k=f.win.document;g=g||{format:"html"};g.set=true;i=g.content=f.dom.processHTML(i);f.onBeforeSetContent.dispatch(f,g);i=g.content;if(j.insertNode){i+='<span id="__caret">_</span>';if(j.startContainer==k&&j.endContainer==k){k.body.innerHTML=i}else{j.deleteContents();if(k.body.childNodes.length==0){k.body.innerHTML=i}else{j.insertNode(j.createContextualFragment(i))}}l=f.dom.get("__caret");j=k.createRange();j.setStartBefore(l);j.setEndBefore(l);f.setRng(j);f.dom.remove("__caret")}else{if(j.item){k.execCommand("Delete",false,null);j=f.getRng()}j.pasteHTML(i)}f.onSetContent.dispatch(f,g)},getStart:function(){var g=this.getRng(),h,f,j,i;if(g.duplicate||g.item){if(g.item){return g.item(0)}j=g.duplicate();j.collapse(1);h=j.parentElement();f=i=g.parentElement();while(i=i.parentNode){if(i==h){h=f;break}}if(h&&h.nodeName=="BODY"){return h.firstChild||h}return h}else{h=g.startContainer;if(h.nodeType==1&&h.hasChildNodes()){h=h.childNodes[Math.min(h.childNodes.length-1,g.startOffset)]}if(h&&h.nodeType==3){return h.parentNode}return h}},getEnd:function(){var g=this,h=g.getRng(),i,f;if(h.duplicate||h.item){if(h.item){return h.item(0)}h=h.duplicate();h.collapse(0);i=h.parentElement();if(i&&i.nodeName=="BODY"){return i.lastChild||i}return i}else{i=h.endContainer;f=h.endOffset;if(i.nodeType==1&&i.hasChildNodes()){i=i.childNodes[f>0?f-1:f]}if(i&&i.nodeType==3){return i.parentNode}return i}},getBookmark:function(q,r){var u=this,m=u.dom,g,j,i,n,h,o,p,l="\uFEFF",s;function f(v,x){var t=0;d(m.select(v),function(z,y){if(z==x){t=y}});return t}if(q==2){function k(){var v=u.getRng(true),t=m.getRoot(),x={};function y(B,G){var A=B[G?"startContainer":"endContainer"],F=B[G?"startOffset":"endOffset"],z=[],C,E,D=0;if(A.nodeType==3){if(r){for(C=A.previousSibling;C&&C.nodeType==3;C=C.previousSibling){F+=C.nodeValue.length}}z.push(F)}else{E=A.childNodes;if(F>=E.length&&E.length){D=1;F=Math.max(0,E.length-1)}z.push(u.dom.nodeIndex(E[F],r)+D)}for(;A&&A!=t;A=A.parentNode){z.push(u.dom.nodeIndex(A,r))}return z}x.start=y(v,true);if(!u.isCollapsed()){x.end=y(v)}return x}return k()}if(q){return{rng:u.getRng()}}g=u.getRng();i=m.uniqueId();n=tinyMCE.activeEditor.selection.isCollapsed();s="overflow:hidden;line-height:0px";if(g.duplicate||g.item){if(!g.item){j=g.duplicate();g.collapse();g.pasteHTML('<span _mce_type="bookmark" id="'+i+'_start" style="'+s+'">'+l+"</span>");if(!n){j.collapse(false);j.pasteHTML('<span _mce_type="bookmark" id="'+i+'_end" style="'+s+'">'+l+"</span>")}}else{o=g.item(0);h=o.nodeName;return{name:h,index:f(h,o)}}}else{o=u.getNode();h=o.nodeName;if(h=="IMG"){return{name:h,index:f(h,o)}}j=g.cloneRange();if(!n){j.collapse(false);j.insertNode(m.create("span",{_mce_type:"bookmark",id:i+"_end",style:s},l))}g.collapse(true);g.insertNode(m.create("span",{_mce_type:"bookmark",id:i+"_start",style:s},l))}u.moveToBookmark({id:i,keep:1});return{id:i}},moveToBookmark:function(n){var r=this,l=r.dom,i,h,f,q,j,s,o,p;if(r.tridentSel){r.tridentSel.destroy()}if(n){if(n.start){f=l.createRng();q=l.getRoot();function g(z){var t=n[z?"start":"end"],v,x,y,u;if(t){for(x=q,v=t.length-1;v>=1;v--){u=x.childNodes;if(u.length){x=u[t[v]]}}if(z){f.setStart(x,t[0])}else{f.setEnd(x,t[0])}}}g(true);g();r.setRng(f)}else{if(n.id){function k(A){var u=l.get(n.id+"_"+A),z,t,x,y,v=n.keep;if(u){z=u.parentNode;if(A=="start"){if(!v){t=l.nodeIndex(u)}else{z=u.firstChild;t=1}j=s=z;o=p=t}else{if(!v){t=l.nodeIndex(u)}else{z=u.firstChild;t=1}s=z;p=t}if(!v){y=u.previousSibling;x=u.nextSibling;d(c.grep(u.childNodes),function(B){if(B.nodeType==3){B.nodeValue=B.nodeValue.replace(/\uFEFF/g,"")}});while(u=l.get(n.id+"_"+A)){l.remove(u,1)}if(y&&x&&y.nodeType==x.nodeType&&y.nodeType==3){t=y.nodeValue.length;y.appendData(x.nodeValue);l.remove(x);if(A=="start"){j=s=y;o=p=t}else{s=y;p=t}}}}}function m(t){if(!a&&l.isBlock(t)&&!t.innerHTML){t.innerHTML='<br _mce_bogus="1" />'}return t}k("start");k("end");f=l.createRng();f.setStart(m(j),o);f.setEnd(m(s),p);r.setRng(f)}else{if(n.name){r.select(l.select(n.name)[n.index])}else{if(n.rng){r.setRng(n.rng)}}}}}},select:function(k,j){var i=this,l=i.dom,g=l.createRng(),f;f=l.nodeIndex(k);g.setStart(k.parentNode,f);g.setEnd(k.parentNode,f+1);if(j){function h(m,o){var n=new c.dom.TreeWalker(m,m);do{if(m.nodeType==3&&c.trim(m.nodeValue).length!=0){if(o){g.setStart(m,0)}else{g.setEnd(m,m.nodeValue.length)}return}if(m.nodeName=="BR"){if(o){g.setStartBefore(m)}else{g.setEndBefore(m)}return}}while(m=(o?n.next():n.prev()))}h(k,1);h(k)}i.setRng(g);return k},isCollapsed:function(){var f=this,h=f.getRng(),g=f.getSel();if(!h||h.item){return false}if(h.compareEndPoints){return h.compareEndPoints("StartToEnd",h)===0}return !g||h.collapsed},collapse:function(f){var g=this,h=g.getRng(),i;if(h.item){i=h.item(0);h=this.win.document.body.createTextRange();h.moveToElementText(i)}h.collapse(!!f);g.setRng(h)},getSel:function(){var g=this,f=this.win;return f.getSelection?f.getSelection():f.document.selection},getRng:function(j){var g=this,h,i;if(j&&g.tridentSel){return g.tridentSel.getRangeAt(0)}try{if(h=g.getSel()){i=h.rangeCount>0?h.getRangeAt(0):(h.createRange?h.createRange():g.win.document.createRange())}}catch(f){}if(!i){i=g.win.document.createRange?g.win.document.createRange():g.win.document.body.createTextRange()}if(g.selectedRange&&g.explicitRange){if(i.compareBoundaryPoints(i.START_TO_START,g.selectedRange)===0&&i.compareBoundaryPoints(i.END_TO_END,g.selectedRange)===0){i=g.explicitRange}else{g.selectedRange=null;g.explicitRange=null}}return i},setRng:function(i){var h,g=this;if(!g.tridentSel){h=g.getSel();if(h){g.explicitRange=i;h.removeAllRanges();h.addRange(i);g.selectedRange=h.getRangeAt(0)}}else{if(i.cloneRange){g.tridentSel.addRange(i);return}try{i.select()}catch(f){}}},setNode:function(g){var f=this;f.setContent(f.dom.getOuterHTML(g));return g},getNode:function(){var g=this,f=g.getRng(),h=g.getSel(),i;if(f.setStart){if(!f){return g.dom.getRoot()}i=f.commonAncestorContainer;if(!f.collapsed){if(f.startContainer==f.endContainer){if(f.startOffset-f.endOffset<2){if(f.startContainer.hasChildNodes()){i=f.startContainer.childNodes[f.startOffset]}}}if(c.isWebKit&&h.anchorNode&&h.anchorNode.nodeType==1){return h.anchorNode.childNodes[h.anchorOffset]}}if(i&&i.nodeType==3){return i.parentNode}return i}return f.item?f.item(0):f.parentElement()},getSelectedBlocks:function(g,f){var i=this,j=i.dom,m,h,l,k=[];m=j.getParent(g||i.getStart(),j.isBlock);h=j.getParent(f||i.getEnd(),j.isBlock);if(m){k.push(m)}if(m&&h&&m!=h){l=m;while((l=l.nextSibling)&&l!=h){if(j.isBlock(l)){k.push(l)}}}if(h&&m!=h){k.push(h)}return k},destroy:function(g){var f=this;f.win=null;if(f.tridentSel){f.tridentSel.destroy()}if(!g){c.removeUnload(f.destroy)}}})})(tinymce);(function(a){a.create("tinymce.dom.XMLWriter",{node:null,XMLWriter:function(c){function b(){var e=document.implementation;if(!e||!e.createDocument){try{return new ActiveXObject("MSXML2.DOMDocument")}catch(d){}try{return new ActiveXObject("Microsoft.XmlDom")}catch(d){}}else{return e.createDocument("","",null)}}this.doc=b();this.valid=a.isOpera||a.isWebKit;this.reset()},reset:function(){var b=this,c=b.doc;if(c.firstChild){c.removeChild(c.firstChild)}b.node=c.appendChild(c.createElement("html"))},writeStartElement:function(c){var b=this;b.node=b.node.appendChild(b.doc.createElement(c))},writeAttribute:function(c,b){if(this.valid){b=b.replace(/>/g,"%MCGT%")}this.node.setAttribute(c,b)},writeEndElement:function(){this.node=this.node.parentNode},writeFullEndElement:function(){var b=this,c=b.node;c.appendChild(b.doc.createTextNode(""));b.node=c.parentNode},writeText:function(b){if(this.valid){b=b.replace(/>/g,"%MCGT%")}this.node.appendChild(this.doc.createTextNode(b))},writeCDATA:function(b){this.node.appendChild(this.doc.createCDATASection(b))},writeComment:function(b){if(a.isIE){b=b.replace(/^\-|\-$/g," ")}this.node.appendChild(this.doc.createComment(b.replace(/\-\-/g," ")))},getContent:function(){var b;b=this.doc.xml||new XMLSerializer().serializeToString(this.doc);b=b.replace(/<\?[^?]+\?>|<html>|<\/html>|<html\/>|<!DOCTYPE[^>]+>/g,"");b=b.replace(/ ?\/>/g," />");if(this.valid){b=b.replace(/\%MCGT%/g,">")}return b}})})(tinymce);(function(a){a.create("tinymce.dom.StringWriter",{str:null,tags:null,count:0,settings:null,indent:null,StringWriter:function(b){this.settings=a.extend({indent_char:" ",indentation:0},b);this.reset()},reset:function(){this.indent="";this.str="";this.tags=[];this.count=0},writeStartElement:function(b){this._writeAttributesEnd();this.writeRaw("<"+b);this.tags.push(b);this.inAttr=true;this.count++;this.elementCount=this.count},writeAttribute:function(d,b){var c=this;c.writeRaw(" "+c.encode(d)+'="'+c.encode(b)+'"')},writeEndElement:function(){var b;if(this.tags.length>0){b=this.tags.pop();if(this._writeAttributesEnd(1)){this.writeRaw("</"+b+">")}if(this.settings.indentation>0){this.writeRaw("\n")}}},writeFullEndElement:function(){if(this.tags.length>0){this._writeAttributesEnd();this.writeRaw("</"+this.tags.pop()+">");if(this.settings.indentation>0){this.writeRaw("\n")}}},writeText:function(b){this._writeAttributesEnd();this.writeRaw(this.encode(b));this.count++},writeCDATA:function(b){this._writeAttributesEnd();this.writeRaw("<![CDATA["+b+"]]>");this.count++},writeComment:function(b){this._writeAttributesEnd();this.writeRaw("<!-- "+b+"-->");this.count++},writeRaw:function(b){this.str+=b},encode:function(b){return b.replace(/[<>&"]/g,function(c){switch(c){case"<":return"<";case">":return">";case"&":return"&";case'"':return"""}return c})},getContent:function(){return this.str},_writeAttributesEnd:function(b){if(!this.inAttr){return}this.inAttr=false;if(b&&this.elementCount==this.count){this.writeRaw(" />");return false}this.writeRaw(">");return true}})})(tinymce);(function(e){var g=e.extend,f=e.each,b=e.util.Dispatcher,d=e.isIE,a=e.isGecko;function c(h){return h.replace(/([?+*])/g,".$1")}e.create("tinymce.dom.Serializer",{Serializer:function(j){var i=this;i.key=0;i.onPreProcess=new b(i);i.onPostProcess=new b(i);try{i.writer=new e.dom.XMLWriter()}catch(h){i.writer=new e.dom.StringWriter()}i.settings=j=g({dom:e.DOM,valid_nodes:0,node_filter:0,attr_filter:0,invalid_attrs:/^(_mce_|_moz_|sizset|sizcache)/,closed:/^(br|hr|input|meta|img|link|param|area)$/,entity_encoding:"named",entities:"160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro",valid_elements:"*[*]",extended_valid_elements:0,invalid_elements:0,fix_table_elements:1,fix_list_elements:true,fix_content_duplication:true,convert_fonts_to_spans:false,font_size_classes:0,apply_source_formatting:0,indent_mode:"simple",indent_char:"\t",indent_levels:1,remove_linebreaks:1,remove_redundant_brs:1,element_format:"xhtml"},j);i.dom=j.dom;i.schema=j.schema;if(j.entity_encoding=="named"&&!j.entities){j.entity_encoding="raw"}if(j.remove_redundant_brs){i.onPostProcess.add(function(k,l){l.content=l.content.replace(/(<br \/>\s*)+<\/(p|h[1-6]|div|li)>/gi,function(n,m,o){if(/^<br \/>\s*<\//.test(n)){return"</"+o+">"}return n})})}if(j.element_format=="html"){i.onPostProcess.add(function(k,l){l.content=l.content.replace(/<([^>]+) \/>/g,"<$1>")})}if(j.fix_list_elements){i.onPreProcess.add(function(v,s){var l,z,y=["ol","ul"],u,t,q,k=/^(OL|UL)$/,A;function m(r,x){var o=x.split(","),p;while((r=r.previousSibling)!=null){for(p=0;p<o.length;p++){if(r.nodeName==o[p]){return r}}}return null}for(z=0;z<y.length;z++){l=i.dom.select(y[z],s.node);for(u=0;u<l.length;u++){t=l[u];q=t.parentNode;if(k.test(q.nodeName)){A=m(t,"LI");if(!A){A=i.dom.create("li");A.innerHTML=" ";A.appendChild(t);q.insertBefore(A,q.firstChild)}else{A.appendChild(t)}}}}})}if(j.fix_table_elements){i.onPreProcess.add(function(k,l){if(!e.isOpera||opera.buildNumber()>=1767){f(i.dom.select("p table",l.node).reverse(),function(p){var o=i.dom.getParent(p.parentNode,"table,p");if(o.nodeName!="TABLE"){try{i.dom.split(o,p)}catch(m){}}})}})}},setEntities:function(o){var n=this,j,m,h={},k;if(n.entityLookup){return}j=o.split(",");for(m=0;m<j.length;m+=2){k=j[m];if(k==34||k==38||k==60||k==62){continue}h[String.fromCharCode(j[m])]=j[m+1];k=parseInt(j[m]).toString(16)}n.entityLookup=h},setRules:function(i){var h=this;h._setup();h.rules={};h.wildRules=[];h.validElements={};return h.addRules(i)},addRules:function(i){var h=this,j;if(!i){return}h._setup();f(i.split(","),function(m){var q=m.split(/\[|\]/),l=q[0].split("/"),r,k,o,n=[];if(j){k=e.extend([],j.attribs)}if(q.length>1){f(q[1].split("|"),function(u){var p={},t;k=k||[];u=u.replace(/::/g,"~");u=/^([!\-])?([\w*.?~_\-]+|)([=:<])?(.+)?$/.exec(u);u[2]=u[2].replace(/~/g,":");if(u[1]=="!"){r=r||[];r.push(u[2])}if(u[1]=="-"){for(t=0;t<k.length;t++){if(k[t].name==u[2]){k.splice(t,1);return}}}switch(u[3]){case"=":p.defaultVal=u[4]||"";break;case":":p.forcedVal=u[4];break;case"<":p.validVals=u[4].split("?");break}if(/[*.?]/.test(u[2])){o=o||[];p.nameRE=new RegExp("^"+c(u[2])+"$");o.push(p)}else{p.name=u[2];k.push(p)}n.push(u[2])})}f(l,function(v,u){var y=v.charAt(0),t=1,p={};if(j){if(j.noEmpty){p.noEmpty=j.noEmpty}if(j.fullEnd){p.fullEnd=j.fullEnd}if(j.padd){p.padd=j.padd}}switch(y){case"-":p.noEmpty=true;break;case"+":p.fullEnd=true;break;case"#":p.padd=true;break;default:t=0}l[u]=v=v.substring(t);h.validElements[v]=1;if(/[*.?]/.test(l[0])){p.nameRE=new RegExp("^"+c(l[0])+"$");h.wildRules=h.wildRules||{};h.wildRules.push(p)}else{p.name=l[0];if(l[0]=="@"){j=p}h.rules[v]=p}p.attribs=k;if(r){p.requiredAttribs=r}if(o){v="";f(n,function(s){if(v){v+="|"}v+="("+c(s)+")"});p.validAttribsRE=new RegExp("^"+v.toLowerCase()+"$");p.wildAttribs=o}})});i="";f(h.validElements,function(m,l){if(i){i+="|"}if(l!="@"){i+=l}});h.validElementsRE=new RegExp("^("+c(i.toLowerCase())+")$")},findRule:function(m){var j=this,l=j.rules,h,k;j._setup();k=l[m];if(k){return k}l=j.wildRules;for(h=0;h<l.length;h++){if(l[h].nameRE.test(m)){return l[h]}}return null},findAttribRule:function(h,l){var j,k=h.wildAttribs;for(j=0;j<k.length;j++){if(k[j].nameRE.test(l)){return k[j]}}return null},serialize:function(r,q){var m,k=this,p,i,j,l;k._setup();q=q||{};q.format=q.format||"html";k.processObj=q;if(d){l=[];f(r.getElementsByTagName("option"),function(o){var h=k.dom.getAttrib(o,"selected");l.push(h?h:null)})}r=r.cloneNode(true);if(d){f(r.getElementsByTagName("option"),function(o,h){k.dom.setAttrib(o,"selected",l[h])})}j=r.ownerDocument.implementation;if(j.createHTMLDocument&&(e.isOpera&&opera.buildNumber()>=1767)){p=j.createHTMLDocument("");f(r.nodeName=="BODY"?r.childNodes:[r],function(h){p.body.appendChild(p.importNode(h,true))});if(r.nodeName!="BODY"){r=p.body.firstChild}else{r=p.body}i=k.dom.doc;k.dom.doc=p}k.key=""+(parseInt(k.key)+1);if(!q.no_events){q.node=r;k.onPreProcess.dispatch(k,q)}k.writer.reset();k._info=q;k._serializeNode(r,q.getInner);q.content=k.writer.getContent();if(i){k.dom.doc=i}if(!q.no_events){k.onPostProcess.dispatch(k,q)}k._postProcess(q);q.node=null;return e.trim(q.content)},_postProcess:function(n){var i=this,k=i.settings,j=n.content,m=[],l;if(n.format=="html"){l=i._protect({content:j,patterns:[{pattern:/(<script[^>]*>)(.*?)(<\/script>)/g},{pattern:/(<noscript[^>]*>)(.*?)(<\/noscript>)/g},{pattern:/(<style[^>]*>)(.*?)(<\/style>)/g},{pattern:/(<pre[^>]*>)(.*?)(<\/pre>)/g,encode:1},{pattern:/(<!--\[CDATA\[)(.*?)(\]\]-->)/g}]});j=l.content;if(k.entity_encoding!=="raw"){j=i._encode(j)}if(!n.set){j=j.replace(/<p>\s+<\/p>|<p([^>]+)>\s+<\/p>/g,k.entity_encoding=="numeric"?"<p$1> </p>":"<p$1> </p>");if(k.remove_linebreaks){j=j.replace(/\r?\n|\r/g," ");j=j.replace(/(<[^>]+>)\s+/g,"$1 ");j=j.replace(/\s+(<\/[^>]+>)/g," $1");j=j.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object) ([^>]+)>\s+/g,"<$1 $2>");j=j.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>\s+/g,"<$1>");j=j.replace(/\s+<\/(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>/g,"</$1>")}if(k.apply_source_formatting&&k.indent_mode=="simple"){j=j.replace(/<(\/?)(ul|hr|table|meta|link|tbody|tr|object|body|head|html|map)(|[^>]+)>\s*/g,"\n<$1$2$3>\n");j=j.replace(/\s*<(p|h[1-6]|blockquote|div|title|style|pre|script|td|li|area)(|[^>]+)>/g,"\n<$1$2>");j=j.replace(/<\/(p|h[1-6]|blockquote|div|title|style|pre|script|td|li)>\s*/g,"</$1>\n");j=j.replace(/\n\n/g,"\n")}}j=i._unprotect(j,l);j=j.replace(/<!--\[CDATA\[([\s\S]+)\]\]-->/g,"<![CDATA[$1]]>");if(k.entity_encoding=="raw"){j=j.replace(/<p> <\/p>|<p([^>]+)> <\/p>/g,"<p$1>\u00a0</p>")}j=j.replace(/<noscript([^>]+|)>([\s\S]*?)<\/noscript>/g,function(h,p,o){return"<noscript"+p+">"+i.dom.decode(o.replace(/<!--|-->/g,""))+"</noscript>"})}n.content=j},_serializeNode:function(E,J){var A=this,B=A.settings,y=A.writer,q,j,u,G,F,I,C,h,z,k,r,D,p,m,H,o,x;if(!B.node_filter||B.node_filter(E)){switch(E.nodeType){case 1:if(E.hasAttribute?E.hasAttribute("_mce_bogus"):E.getAttribute("_mce_bogus")){return}p=H=false;q=E.hasChildNodes();k=E.getAttribute("_mce_name")||E.nodeName.toLowerCase();o=E.getAttribute("_mce_type");if(o){if(!A._info.cleanup){p=true;return}else{H=1}}if(d){x=E.scopeName;if(x&&x!=="HTML"&&x!=="html"){k=x+":"+k}}if(k.indexOf("mce:")===0){k=k.substring(4)}if(!H){if(!A.validElementsRE||!A.validElementsRE.test(k)||(A.invalidElementsRE&&A.invalidElementsRE.test(k))||J){p=true;break}}if(d){if(B.fix_content_duplication){if(E._mce_serialized==A.key){return}E._mce_serialized=A.key}if(k.charAt(0)=="/"){k=k.substring(1)}}else{if(a){if(E.nodeName==="BR"&&E.getAttribute("type")=="_moz"){return}}}if(B.validate_children){if(A.elementName&&!A.schema.isValid(A.elementName,k)){p=true;break}A.elementName=k}r=A.findRule(k);if(!r){p=true;break}k=r.name||k;m=B.closed.test(k);if((!q&&r.noEmpty)||(d&&!k)){p=true;break}if(r.requiredAttribs){I=r.requiredAttribs;for(G=I.length-1;G>=0;G--){if(this.dom.getAttrib(E,I[G])!==""){break}}if(G==-1){p=true;break}}y.writeStartElement(k);if(r.attribs){for(G=0,C=r.attribs,F=C.length;G<F;G++){I=C[G];z=A._getAttrib(E,I);if(z!==null){y.writeAttribute(I.name,z)}}}if(r.validAttribsRE){C=A.dom.getAttribs(E);for(G=C.length-1;G>-1;G--){h=C[G];if(h.specified){I=h.nodeName.toLowerCase();if(B.invalid_attrs.test(I)||!r.validAttribsRE.test(I)){continue}D=A.findAttribRule(r,I);z=A._getAttrib(E,D,I);if(z!==null){y.writeAttribute(I,z)}}}}if(o&&H){y.writeAttribute("_mce_type",o)}if(k==="script"&&e.trim(E.innerHTML)){y.writeText("// ");y.writeCDATA(E.innerHTML.replace(/<!--|-->|<\[CDATA\[|\]\]>/g,""));q=false;break}if(r.padd){if(q&&(u=E.firstChild)&&u.nodeType===1&&E.childNodes.length===1){if(u.hasAttribute?u.hasAttribute("_mce_bogus"):u.getAttribute("_mce_bogus")){y.writeText("\u00a0")}}else{if(!q){y.writeText("\u00a0")}}}break;case 3:if(B.validate_children&&A.elementName&&!A.schema.isValid(A.elementName,"#text")){return}return y.writeText(E.nodeValue);case 4:return y.writeCDATA(E.nodeValue);case 8:return y.writeComment(E.nodeValue)}}else{if(E.nodeType==1){q=E.hasChildNodes()}}if(q&&!m){u=E.firstChild;while(u){A._serializeNode(u);A.elementName=k;u=u.nextSibling}}if(!p){if(!m){y.writeFullEndElement()}else{y.writeEndElement()}}},_protect:function(j){var i=this;j.items=j.items||[];function h(l){return l.replace(/[\r\n\\]/g,function(m){if(m==="\n"){return"\\n"}else{if(m==="\\"){return"\\\\"}}return"\\r"})}function k(l){return l.replace(/\\[\\rn]/g,function(m){if(m==="\\n"){return"\n"}else{if(m==="\\\\"){return"\\"}}return"\r"})}f(j.patterns,function(l){j.content=k(h(j.content).replace(l.pattern,function(n,o,m,p){m=k(m);if(l.encode){m=i._encode(m)}j.items.push(m);return o+"<!--mce:"+(j.items.length-1)+"-->"+p}))});return j},_unprotect:function(i,j){i=i.replace(/\<!--mce:([0-9]+)--\>/g,function(k,h){return j.items[parseInt(h)]});j.items=[];return i},_encode:function(m){var j=this,k=j.settings,i;if(k.entity_encoding!=="raw"){if(k.entity_encoding.indexOf("named")!=-1){j.setEntities(k.entities);i=j.entityLookup;m=m.replace(/[\u007E-\uFFFF]/g,function(h){var l;if(l=i[h]){h="&"+l+";"}return h})}if(k.entity_encoding.indexOf("numeric")!=-1){m=m.replace(/[\u007E-\uFFFF]/g,function(h){return"&#"+h.charCodeAt(0)+";"})}}return m},_setup:function(){var h=this,i=this.settings;if(h.done){return}h.done=1;h.setRules(i.valid_elements);h.addRules(i.extended_valid_elements);if(i.invalid_elements){h.invalidElementsRE=new RegExp("^("+c(i.invalid_elements.replace(/,/g,"|").toLowerCase())+")$")}if(i.attrib_value_filter){h.attribValueFilter=i.attribValueFilter}},_getAttrib:function(m,j,h){var l,k;h=h||j.name;if(j.forcedVal&&(k=j.forcedVal)){if(k==="{$uid}"){return this.dom.uniqueId()}return k}k=this.dom.getAttrib(m,h);switch(h){case"rowspan":case"colspan":if(k=="1"){k=""}break}if(this.attribValueFilter){k=this.attribValueFilter(h,k,m)}if(j.validVals){for(l=j.validVals.length-1;l>=0;l--){if(k==j.validVals[l]){break}}if(l==-1){return null}}if(k===""&&typeof(j.defaultVal)!="undefined"){k=j.defaultVal;if(k==="{$uid}"){return this.dom.uniqueId()}return k}else{if(h=="class"&&this.processObj.get){k=k.replace(/\s?mceItem\w+\s?/g,"")}}if(k===""){return null}return k}})})(tinymce);(function(a){a.dom.ScriptLoader=function(h){var c=0,k=1,i=2,l={},j=[],f={},d=[],g=0,e;function b(m,u){var v=this,q=a.DOM,s,o,r,n;function p(){q.remove(n);if(s){s.onreadystatechange=s.onload=s=null}u()}n=q.uniqueId();if(a.isIE6){o=new a.util.URI(m);r=location;if(o.host==r.hostname&&o.port==r.port&&(o.protocol+":")==r.protocol){a.util.XHR.send({url:a._addVer(o.getURI()),success:function(x){var t=q.create("script",{type:"text/javascript"});t.text=x;document.getElementsByTagName("head")[0].appendChild(t);q.remove(t);p()}});return}}s=q.create("script",{id:n,type:"text/javascript",src:a._addVer(m)});s.onload=p;s.onreadystatechange=function(){var t=s.readyState;if(t=="complete"||t=="loaded"){p()}};(document.getElementsByTagName("head")[0]||document.body).appendChild(s)}this.isDone=function(m){return l[m]==i};this.markDone=function(m){l[m]=i};this.add=this.load=function(m,q,n){var o,p=l[m];if(p==e){j.push(m);l[m]=c}if(q){if(!f[m]){f[m]=[]}f[m].push({func:q,scope:n||this})}};this.loadQueue=function(n,m){this.loadScripts(j,n,m)};this.loadScripts=function(m,q,p){var o;function n(r){a.each(f[r],function(s){s.func.call(s.scope)});f[r]=e}d.push({func:q,scope:p||this});o=function(){var r=a.grep(m);m.length=0;a.each(r,function(s){if(l[s]==i){n(s);return}if(l[s]!=k){l[s]=k;g++;b(s,function(){l[s]=i;g--;n(s);o()})}});if(!g){a.each(d,function(s){s.func.call(s.scope)});d.length=0}};o()}};a.ScriptLoader=new a.dom.ScriptLoader()})(tinymce);tinymce.dom.TreeWalker=function(a,c){var b=a;function d(i,f,e,j){var h,g;if(i){if(!j&&i[f]){return i[f]}if(i!=c){h=i[e];if(h){return h}for(g=i.parentNode;g&&g!=c;g=g.parentNode){h=g[e];if(h){return h}}}}}this.current=function(){return b};this.next=function(e){return(b=d(b,"firstChild","nextSibling",e))};this.prev=function(e){return(b=d(b,"lastChild","lastSibling",e))}};(function(){var a={};function b(f,e){var d;function c(g){return g.replace(/[A-Z]+/g,function(h){return c(f[h])})}for(d in f){if(f.hasOwnProperty(d)){f[d]=c(f[d])}}c(e).replace(/#/g,"#text").replace(/(\w+)\[([^\]]+)\]/g,function(l,g,j){var h,k={};j=j.split(/\|/);for(h=j.length-1;h>=0;h--){k[j[h]]=1}a[g]=k})}b({Z:"#|H|K|N|O|P",Y:"#|X|form|R|Q",X:"p|T|div|U|W|isindex|fieldset|table",W:"pre|hr|blockquote|address|center|noframes",U:"ul|ol|dl|menu|dir",ZC:"#|p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q",T:"h1|h2|h3|h4|h5|h6",ZB:"#|X|S|Q",S:"R|P",ZA:"#|a|G|J|M|O|P",R:"#|a|H|K|N|O",Q:"noscript|P",P:"ins|del|script",O:"input|select|textarea|label|button",N:"M|L",M:"em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym",L:"sub|sup",K:"J|I",J:"tt|i|b|u|s|strike",I:"big|small|font|basefont",H:"G|F",G:"br|span|bdo",F:"object|applet|img|map|iframe"},"script[]style[]object[#|param|X|form|a|H|K|N|O|Q]param[]p[S]a[Z]br[]span[S]bdo[S]applet[#|param|X|form|a|H|K|N|O|Q]h1[S]img[]map[X|form|Q|area]h2[S]iframe[#|X|form|a|H|K|N|O|Q]h3[S]tt[S]i[S]b[S]u[S]s[S]strike[S]big[S]small[S]font[S]basefont[]em[S]strong[S]dfn[S]code[S]q[S]samp[S]kbd[S]var[S]cite[S]abbr[S]acronym[S]sub[S]sup[S]input[]select[optgroup|option]optgroup[option]option[]textarea[]label[S]button[#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]h4[S]ins[#|X|form|a|H|K|N|O|Q]h5[S]del[#|X|form|a|H|K|N|O|Q]h6[S]div[#|X|form|a|H|K|N|O|Q]ul[li]li[#|X|form|a|H|K|N|O|Q]ol[li]dl[dt|dd]dt[S]dd[#|X|form|a|H|K|N|O|Q]menu[li]dir[li]pre[ZA]hr[]blockquote[#|X|form|a|H|K|N|O|Q]address[S|p]center[#|X|form|a|H|K|N|O|Q]noframes[#|X|form|a|H|K|N|O|Q]isindex[]fieldset[#|legend|X|form|a|H|K|N|O|Q]legend[S]table[caption|col|colgroup|thead|tfoot|tbody|tr]caption[S]col[]colgroup[col]thead[tr]tr[th|td]th[#|X|form|a|H|K|N|O|Q]form[#|X|a|H|K|N|O|Q]noscript[#|X|form|a|H|K|N|O|Q]td[#|X|form|a|H|K|N|O|Q]tfoot[tr]tbody[tr]area[]base[]body[#|X|form|a|H|K|N|O|Q]");tinymce.dom.Schema=function(){var c=this,d=a;c.isValid=function(f,e){var g=d[f];return !!(g&&(!e||g[e]))}}})();(function(a){a.dom.RangeUtils=function(c){var b="\uFEFF";this.walk=function(d,r){var h=d.startContainer,k=d.startOffset,s=d.endContainer,l=d.endOffset,i,f,n,g,q,p,e;e=c.select("td.mceSelected,th.mceSelected");if(e.length>0){a.each(e,function(t){r([t])});return}function o(v,u,t){var x=[];for(;v&&v!=t;v=v[u]){x.push(v)}return x}function m(u,t){do{if(u.parentNode==t){return u}u=u.parentNode}while(u)}function j(v,u,x){var t=x?"nextSibling":"previousSibling";for(g=v,q=g.parentNode;g&&g!=u;g=q){q=g.parentNode;p=o(g==v?g:g[t],t);if(p.length){if(!x){p.reverse()}r(p)}}}if(h.nodeType==1&&h.hasChildNodes()){h=h.childNodes[k]}if(s.nodeType==1&&s.hasChildNodes()){s=s.childNodes[Math.min(k==l?l:l-1,s.childNodes.length-1)]}i=c.findCommonAncestor(h,s);if(h==s){return r([h])}for(g=h;g;g=g.parentNode){if(g==s){return j(h,i,true)}if(g==i){break}}for(g=s;g;g=g.parentNode){if(g==h){return j(s,i)}if(g==i){break}}f=m(h,i)||h;n=m(s,i)||s;j(h,f,true);p=o(f==h?f:f.nextSibling,"nextSibling",n==s?n.nextSibling:n);if(p.length){r(p)}j(s,n)}};a.dom.RangeUtils.compareRanges=function(c,b){if(c&&b){if(c.item||c.duplicate){if(c.item&&b.item&&c.item(0)===b.item(0)){return true}if(c.isEqual&&b.isEqual&&b.isEqual(c)){return true}}else{return c.startContainer==b.startContainer&&c.startOffset==b.startOffset}}return false}})(tinymce);(function(c){var b=c.DOM,a=c.is;c.create("tinymce.ui.Control",{Control:function(e,d){this.id=e;this.settings=d=d||{};this.rendered=false;this.onRender=new c.util.Dispatcher(this);this.classPrefix="";this.scope=d.scope||this;this.disabled=0;this.active=0},setDisabled:function(d){var f;if(d!=this.disabled){f=b.get(this.id);if(f&&this.settings.unavailable_prefix){if(d){this.prevTitle=f.title;f.title=this.settings.unavailable_prefix+": "+f.title}else{f.title=this.prevTitle}}this.setState("Disabled",d);this.setState("Enabled",!d);this.disabled=d}},isDisabled:function(){return this.disabled},setActive:function(d){if(d!=this.active){this.setState("Active",d);this.active=d}},isActive:function(){return this.active},setState:function(f,d){var e=b.get(this.id);f=this.classPrefix+f;if(d){b.addClass(e,f)}else{b.removeClass(e,f)}},isRendered:function(){return this.rendered},renderHTML:function(){},renderTo:function(d){b.setHTML(d,this.renderHTML())},postRender:function(){var e=this,d;if(a(e.disabled)){d=e.disabled;e.disabled=-1;e.setDisabled(d)}if(a(e.active)){d=e.active;e.active=-1;e.setActive(d)}},remove:function(){b.remove(this.id);this.destroy()},destroy:function(){c.dom.Event.clear(this.id)}})})(tinymce);tinymce.create("tinymce.ui.Container:tinymce.ui.Control",{Container:function(b,a){this.parent(b,a);this.controls=[];this.lookup={}},add:function(a){this.lookup[a.id]=a;this.controls.push(a);return a},get:function(a){return this.lookup[a]}});tinymce.create("tinymce.ui.Separator:tinymce.ui.Control",{Separator:function(b,a){this.parent(b,a);this.classPrefix="mceSeparator"},renderHTML:function(){return tinymce.DOM.createHTML("span",{"class":this.classPrefix})}});(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.MenuItem:tinymce.ui.Control",{MenuItem:function(g,f){this.parent(g,f);this.classPrefix="mceMenuItem"},setSelected:function(f){this.setState("Selected",f);this.selected=f},isSelected:function(){return this.selected},postRender:function(){var f=this;f.parent();if(c(f.selected)){f.setSelected(f.selected)}}})})(tinymce);(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.Menu:tinymce.ui.MenuItem",{Menu:function(h,g){var f=this;f.parent(h,g);f.items={};f.collapsed=false;f.menuCount=0;f.onAddItem=new d.util.Dispatcher(this)},expand:function(g){var f=this;if(g){a(f,function(h){if(h.expand){h.expand()}},"items",f)}f.collapsed=false},collapse:function(g){var f=this;if(g){a(f,function(h){if(h.collapse){h.collapse()}},"items",f)}f.collapsed=true},isCollapsed:function(){return this.collapsed},add:function(f){if(!f.settings){f=new d.ui.MenuItem(f.id||b.uniqueId(),f)}this.onAddItem.dispatch(this,f);return this.items[f.id]=f},addSeparator:function(){return this.add({separator:true})},addMenu:function(f){if(!f.collapse){f=this.createMenu(f)}this.menuCount++;return this.add(f)},hasMenus:function(){return this.menuCount!==0},remove:function(f){delete this.items[f.id]},removeAll:function(){var f=this;a(f,function(g){if(g.removeAll){g.removeAll()}else{g.remove()}g.destroy()},"items",f);f.items={}},createMenu:function(g){var f=new d.ui.Menu(g.id||b.uniqueId(),g);f.onAddItem.add(this.onAddItem.dispatch,this.onAddItem);return f}})})(tinymce);(function(e){var d=e.is,c=e.DOM,f=e.each,a=e.dom.Event,b=e.dom.Element;e.create("tinymce.ui.DropMenu:tinymce.ui.Menu",{DropMenu:function(h,g){g=g||{};g.container=g.container||c.doc.body;g.offset_x=g.offset_x||0;g.offset_y=g.offset_y||0;g.vp_offset_x=g.vp_offset_x||0;g.vp_offset_y=g.vp_offset_y||0;if(d(g.icons)&&!g.icons){g["class"]+=" mceNoIcons"}this.parent(h,g);this.onShowMenu=new e.util.Dispatcher(this);this.onHideMenu=new e.util.Dispatcher(this);this.classPrefix="mceMenu"},createMenu:function(j){var h=this,i=h.settings,g;j.container=j.container||i.container;j.parent=h;j.constrain=j.constrain||i.constrain;j["class"]=j["class"]||i["class"];j.vp_offset_x=j.vp_offset_x||i.vp_offset_x;j.vp_offset_y=j.vp_offset_y||i.vp_offset_y;g=new e.ui.DropMenu(j.id||c.uniqueId(),j);g.onAddItem.add(h.onAddItem.dispatch,h.onAddItem);return g},update:function(){var i=this,j=i.settings,g=c.get("menu_"+i.id+"_tbl"),l=c.get("menu_"+i.id+"_co"),h,k;h=j.max_width?Math.min(g.clientWidth,j.max_width):g.clientWidth;k=j.max_height?Math.min(g.clientHeight,j.max_height):g.clientHeight;if(!c.boxModel){i.element.setStyles({width:h+2,height:k+2})}else{i.element.setStyles({width:h,height:k})}if(j.max_width){c.setStyle(l,"width",h)}if(j.max_height){c.setStyle(l,"height",k);if(g.clientHeight<j.max_height){c.setStyle(l,"overflow","hidden")}}},showMenu:function(p,n,r){var z=this,A=z.settings,o,g=c.getViewPort(),u,l,v,q,i=2,k,j,m=z.classPrefix;z.collapse(1);if(z.isMenuVisible){return}if(!z.rendered){o=c.add(z.settings.container,z.renderNode());f(z.items,function(h){h.postRender()});z.element=new b("menu_"+z.id,{blocker:1,container:A.container})}else{o=c.get("menu_"+z.id)}if(!e.isOpera){c.setStyles(o,{left:-65535,top:-65535})}c.show(o);z.update();p+=A.offset_x||0;n+=A.offset_y||0;g.w-=4;g.h-=4;if(A.constrain){u=o.clientWidth-i;l=o.clientHeight-i;v=g.x+g.w;q=g.y+g.h;if((p+A.vp_offset_x+u)>v){p=r?r-u:Math.max(0,(v-A.vp_offset_x)-u)}if((n+A.vp_offset_y+l)>q){n=Math.max(0,(q-A.vp_offset_y)-l)}}c.setStyles(o,{left:p,top:n});z.element.update();z.isMenuVisible=1;z.mouseClickFunc=a.add(o,"click",function(s){var h;s=s.target;if(s&&(s=c.getParent(s,"tr"))&&!c.hasClass(s,m+"ItemSub")){h=z.items[s.id];if(h.isDisabled()){return}k=z;while(k){if(k.hideMenu){k.hideMenu()}k=k.settings.parent}if(h.settings.onclick){h.settings.onclick(s)}return a.cancel(s)}});if(z.hasMenus()){z.mouseOverFunc=a.add(o,"mouseover",function(x){var h,t,s;x=x.target;if(x&&(x=c.getParent(x,"tr"))){h=z.items[x.id];if(z.lastMenu){z.lastMenu.collapse(1)}if(h.isDisabled()){return}if(x&&c.hasClass(x,m+"ItemSub")){t=c.getRect(x);h.showMenu((t.x+t.w-i),t.y-i,t.x);z.lastMenu=h;c.addClass(c.get(h.id).firstChild,m+"ItemActive")}}})}z.onShowMenu.dispatch(z);if(A.keyboard_focus){a.add(o,"keydown",z._keyHandler,z);c.select("a","menu_"+z.id)[0].focus();z._focusIdx=0}},hideMenu:function(j){var g=this,i=c.get("menu_"+g.id),h;if(!g.isMenuVisible){return}a.remove(i,"mouseover",g.mouseOverFunc);a.remove(i,"click",g.mouseClickFunc);a.remove(i,"keydown",g._keyHandler);c.hide(i);g.isMenuVisible=0;if(!j){g.collapse(1)}if(g.element){g.element.hide()}if(h=c.get(g.id)){c.removeClass(h.firstChild,g.classPrefix+"ItemActive")}g.onHideMenu.dispatch(g)},add:function(i){var g=this,h;i=g.parent(i);if(g.isRendered&&(h=c.get("menu_"+g.id))){g._add(c.select("tbody",h)[0],i)}return i},collapse:function(g){this.parent(g);this.hideMenu(1)},remove:function(g){c.remove(g.id);this.destroy();return this.parent(g)},destroy:function(){var g=this,h=c.get("menu_"+g.id);a.remove(h,"mouseover",g.mouseOverFunc);a.remove(h,"click",g.mouseClickFunc);if(g.element){g.element.remove()}c.remove(h)},renderNode:function(){var i=this,j=i.settings,l,h,k,g;g=c.create("div",{id:"menu_"+i.id,"class":j["class"],style:"position:absolute;left:0;top:0;z-index:200000"});k=c.add(g,"div",{id:"menu_"+i.id+"_co","class":i.classPrefix+(j["class"]?" "+j["class"]:"")});i.element=new b("menu_"+i.id,{blocker:1,container:j.container});if(j.menu_line){c.add(k,"span",{"class":i.classPrefix+"Line"})}l=c.add(k,"table",{id:"menu_"+i.id+"_tbl",border:0,cellPadding:0,cellSpacing:0});h=c.add(l,"tbody");f(i.items,function(m){i._add(h,m)});i.rendered=true;return g},_keyHandler:function(j){var i=this,h=j.keyCode;function g(m){var k=i._focusIdx+m,l=c.select("a","menu_"+i.id)[k];if(l){i._focusIdx=k;l.focus()}}switch(h){case 38:g(-1);return;case 40:g(1);return;case 13:return;case 27:return this.hideMenu()}},_add:function(j,h){var i,q=h.settings,p,l,k,m=this.classPrefix,g;if(q.separator){l=c.add(j,"tr",{id:h.id,"class":m+"ItemSeparator"});c.add(l,"td",{"class":m+"ItemSeparator"});if(i=l.previousSibling){c.addClass(i,"mceLast")}return}i=l=c.add(j,"tr",{id:h.id,"class":m+"Item "+m+"ItemEnabled"});i=k=c.add(i,"td");i=p=c.add(i,"a",{href:"javascript:;",onclick:"return false;",onmousedown:"return false;"});c.addClass(k,q["class"]);g=c.add(i,"span",{"class":"mceIcon"+(q.icon?" mce_"+q.icon:"")});if(q.icon_src){c.add(g,"img",{src:q.icon_src})}i=c.add(i,q.element||"span",{"class":"mceText",title:h.settings.title},h.settings.title);if(h.settings.style){c.setAttrib(i,"style",h.settings.style)}if(j.childNodes.length==1){c.addClass(l,"mceFirst")}if((i=l.previousSibling)&&c.hasClass(i,m+"ItemSeparator")){c.addClass(l,"mceFirst")}if(h.collapse){c.addClass(l,m+"ItemSub")}if(i=l.previousSibling){c.removeClass(i,"mceLast")}c.addClass(l,"mceLast")}})})(tinymce);(function(b){var a=b.DOM;b.create("tinymce.ui.Button:tinymce.ui.Control",{Button:function(d,c){this.parent(d,c);this.classPrefix="mceButton"},renderHTML:function(){var f=this.classPrefix,e=this.settings,d,c;c=a.encode(e.label||"");d='<a id="'+this.id+'" href="javascript:;" class="'+f+" "+f+"Enabled "+e["class"]+(c?" "+f+"Labeled":"")+'" onmousedown="return false;" onclick="return false;" title="'+a.encode(e.title)+'">';if(e.image){d+='<img class="mceIcon" src="'+e.image+'" />'+c+"</a>"}else{d+='<span class="mceIcon '+e["class"]+'"></span>'+(c?'<span class="'+f+'Label">'+c+"</span>":"")+"</a>"}return d},postRender:function(){var c=this,d=c.settings;b.dom.Event.add(c.id,"click",function(f){if(!c.isDisabled()){return d.onclick.call(d.scope,f)}})}})})(tinymce);(function(d){var c=d.DOM,b=d.dom.Event,e=d.each,a=d.util.Dispatcher;d.create("tinymce.ui.ListBox:tinymce.ui.Control",{ListBox:function(h,g){var f=this;f.parent(h,g);f.items=[];f.onChange=new a(f);f.onPostRender=new a(f);f.onAdd=new a(f);f.onRenderMenu=new d.util.Dispatcher(this);f.classPrefix="mceListBox"},select:function(h){var g=this,j,i;if(h==undefined){return g.selectByIndex(-1)}if(h&&h.call){i=h}else{i=function(f){return f==h}}if(h!=g.selectedValue){e(g.items,function(k,f){if(i(k.value)){j=1;g.selectByIndex(f);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(f){var g=this,h,i;if(f!=g.selectedIndex){h=c.get(g.id+"_text");i=g.items[f];if(i){g.selectedValue=i.value;g.selectedIndex=f;c.setHTML(h,c.encode(i.title));c.removeClass(h,"mceTitle")}else{c.setHTML(h,c.encode(g.settings.title));c.addClass(h,"mceTitle");g.selectedValue=g.selectedIndex=null}h=0}},add:function(i,f,h){var g=this;h=h||{};h=d.extend(h,{title:i,value:f});g.items.push(h);g.onAdd.dispatch(g,h)},getLength:function(){return this.items.length},renderHTML:function(){var i="",f=this,g=f.settings,j=f.classPrefix;i='<table id="'+f.id+'" cellpadding="0" cellspacing="0" class="'+j+" "+j+"Enabled"+(g["class"]?(" "+g["class"]):"")+'"><tbody><tr>';i+="<td>"+c.createHTML("a",{id:f.id+"_text",href:"javascript:;","class":"mceText",onclick:"return false;",onmousedown:"return false;"},c.encode(f.settings.title))+"</td>";i+="<td>"+c.createHTML("a",{id:f.id+"_open",tabindex:-1,href:"javascript:;","class":"mceOpen",onclick:"return false;",onmousedown:"return false;"},"<span></span>")+"</td>";i+="</tr></tbody></table>";return i},showMenu:function(){var g=this,j,i,h=c.get(this.id),f;if(g.isDisabled()||g.items.length==0){return}if(g.menu&&g.menu.isMenuVisible){return g.hideMenu()}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}j=c.getPos(this.settings.menu_container);i=c.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.keyboard_focus=!d.isOpera;if(g.oldID){f.items[g.oldID].setSelected(0)}e(g.items,function(k){if(k.value===g.selectedValue){f.items[k.id].setSelected(1);g.oldID=k.id}});f.showMenu(0,h.clientHeight);b.add(c.doc,"mousedown",g.hideMenu,g);c.addClass(g.id,g.classPrefix+"Selected")},hideMenu:function(g){var f=this;if(f.menu&&f.menu.isMenuVisible){if(g&&g.type=="mousedown"&&(g.target.id==f.id+"_text"||g.target.id==f.id+"_open")){return}if(!g||!c.getParent(g.target,".mceMenu")){c.removeClass(f.id,f.classPrefix+"Selected");b.remove(c.doc,"mousedown",f.hideMenu,f);f.menu.hideMenu()}}},renderMenu:function(){var g=this,f;f=g.settings.control_manager.createDropMenu(g.id+"_menu",{menu_line:1,"class":g.classPrefix+"Menu mceNoIcons",max_width:150,max_height:150});f.onHideMenu.add(g.hideMenu,g);f.add({title:g.settings.title,"class":"mceMenuItemTitle",onclick:function(){if(g.settings.onselect("")!==false){g.select("")}}});e(g.items,function(h){if(h.value===undefined){f.add({title:h.title,"class":"mceMenuItemTitle",onclick:function(){if(g.settings.onselect("")!==false){g.select("")}}})}else{h.id=c.uniqueId();h.onclick=function(){if(g.settings.onselect(h.value)!==false){g.select(h.value)}};f.add(h)}});g.onRenderMenu.dispatch(g,f);g.menu=f},postRender:function(){var f=this,g=f.classPrefix;b.add(f.id,"click",f.showMenu,f);b.add(f.id+"_text","focus",function(){if(!f._focused){f.keyDownHandler=b.add(f.id+"_text","keydown",function(k){var h=-1,i,j=k.keyCode;e(f.items,function(l,m){if(f.selectedValue==l.value){h=m}});if(j==38){i=f.items[h-1]}else{if(j==40){i=f.items[h+1]}else{if(j==13){i=f.selectedValue;f.selectedValue=null;f.settings.onselect(i);return b.cancel(k)}}}if(i){f.hideMenu();f.select(i.value)}})}f._focused=1});b.add(f.id+"_text","blur",function(){b.remove(f.id+"_text","keydown",f.keyDownHandler);f._focused=0});if(d.isIE6||!c.boxModel){b.add(f.id,"mouseover",function(){if(!c.hasClass(f.id,g+"Disabled")){c.addClass(f.id,g+"Hover")}});b.add(f.id,"mouseout",function(){if(!c.hasClass(f.id,g+"Disabled")){c.removeClass(f.id,g+"Hover")}})}f.onPostRender.dispatch(f,c.get(f.id))},destroy:function(){this.parent();b.clear(this.id+"_text");b.clear(this.id+"_open")}})})(tinymce);(function(d){var c=d.DOM,b=d.dom.Event,e=d.each,a=d.util.Dispatcher;d.create("tinymce.ui.NativeListBox:tinymce.ui.ListBox",{NativeListBox:function(g,f){this.parent(g,f);this.classPrefix="mceNativeListBox"},setDisabled:function(f){c.get(this.id).disabled=f},isDisabled:function(){return c.get(this.id).disabled},select:function(h){var g=this,j,i;if(h==undefined){return g.selectByIndex(-1)}if(h&&h.call){i=h}else{i=function(f){return f==h}}if(h!=g.selectedValue){e(g.items,function(k,f){if(i(k.value)){j=1;g.selectByIndex(f);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(f){c.get(this.id).selectedIndex=f+1;this.selectedValue=this.items[f]?this.items[f].value:null},add:function(j,g,f){var i,h=this;f=f||{};f.value=g;if(h.isRendered()){c.add(c.get(this.id),"option",f,j)}i={title:j,value:g,attribs:f};h.items.push(i);h.onAdd.dispatch(h,i)},getLength:function(){return this.items.length},renderHTML:function(){var g,f=this;g=c.createHTML("option",{value:""},"-- "+f.settings.title+" --");e(f.items,function(h){g+=c.createHTML("option",{value:h.value},h.title)});g=c.createHTML("select",{id:f.id,"class":"mceNativeListBox"},g);return g},postRender:function(){var g=this,h;g.rendered=true;function f(j){var i=g.items[j.target.selectedIndex-1];if(i&&(i=i.value)){g.onChange.dispatch(g,i);if(g.settings.onselect){g.settings.onselect(i)}}}b.add(g.id,"change",f);b.add(g.id,"keydown",function(j){var i;b.remove(g.id,"change",h);i=b.add(g.id,"blur",function(){b.add(g.id,"change",f);b.remove(g.id,"blur",i)});if(j.keyCode==13||j.keyCode==32){f(j);return b.cancel(j)}});g.onPostRender.dispatch(g,c.get(g.id))}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.MenuButton:tinymce.ui.Button",{MenuButton:function(f,e){this.parent(f,e);this.onRenderMenu=new c.util.Dispatcher(this);e.menu_container=e.menu_container||b.doc.body},showMenu:function(){var g=this,j,i,h=b.get(g.id),f;if(g.isDisabled()){return}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}if(g.isMenuVisible){return g.hideMenu()}j=b.getPos(g.settings.menu_container);i=b.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.vp_offset_x=i.x;f.settings.vp_offset_y=i.y;f.settings.keyboard_focus=g._focused;f.showMenu(0,h.clientHeight);a.add(b.doc,"mousedown",g.hideMenu,g);g.setState("Selected",1);g.isMenuVisible=1},renderMenu:function(){var f=this,e;e=f.settings.control_manager.createDropMenu(f.id+"_menu",{menu_line:1,"class":this.classPrefix+"Menu",icons:f.settings.icons});e.onHideMenu.add(f.hideMenu,f);f.onRenderMenu.dispatch(f,e);f.menu=e},hideMenu:function(g){var f=this;if(g&&g.type=="mousedown"&&b.getParent(g.target,function(h){return h.id===f.id||h.id===f.id+"_open"})){return}if(!g||!b.getParent(g.target,".mceMenu")){f.setState("Selected",0);a.remove(b.doc,"mousedown",f.hideMenu,f);if(f.menu){f.menu.hideMenu()}}f.isMenuVisible=0},postRender:function(){var e=this,f=e.settings;a.add(e.id,"click",function(){if(!e.isDisabled()){if(f.onclick){f.onclick(e.value)}e.showMenu()}})}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.SplitButton:tinymce.ui.MenuButton",{SplitButton:function(f,e){this.parent(f,e);this.classPrefix="mceSplitButton"},renderHTML:function(){var i,f=this,g=f.settings,e;i="<tbody><tr>";if(g.image){e=b.createHTML("img ",{src:g.image,"class":"mceAction "+g["class"]})}else{e=b.createHTML("span",{"class":"mceAction "+g["class"]},"")}i+="<td>"+b.createHTML("a",{id:f.id+"_action",href:"javascript:;","class":"mceAction "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"</td>";e=b.createHTML("span",{"class":"mceOpen "+g["class"]});i+="<td>"+b.createHTML("a",{id:f.id+"_open",href:"javascript:;","class":"mceOpen "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"</td>";i+="</tr></tbody>";return b.createHTML("table",{id:f.id,"class":"mceSplitButton mceSplitButtonEnabled "+g["class"],cellpadding:"0",cellspacing:"0",onmousedown:"return false;",title:g.title},i)},postRender:function(){var e=this,f=e.settings;if(f.onclick){a.add(e.id+"_action","click",function(){if(!e.isDisabled()){f.onclick(e.value)}})}a.add(e.id+"_open","click",e.showMenu,e);a.add(e.id+"_open","focus",function(){e._focused=1});a.add(e.id+"_open","blur",function(){e._focused=0});if(c.isIE6||!b.boxModel){a.add(e.id,"mouseover",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.addClass(e.id,"mceSplitButtonHover")}});a.add(e.id,"mouseout",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.removeClass(e.id,"mceSplitButtonHover")}})}},destroy:function(){this.parent();a.clear(this.id+"_action");a.clear(this.id+"_open")}})})(tinymce);(function(d){var c=d.DOM,a=d.dom.Event,b=d.is,e=d.each;d.create("tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton",{ColorSplitButton:function(h,g){var f=this;f.parent(h,g);f.settings=g=d.extend({colors:"000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF",grid_width:8,default_color:"#888888"},f.settings);f.onShowMenu=new d.util.Dispatcher(f);f.onHideMenu=new d.util.Dispatcher(f);f.value=g.default_color},showMenu:function(){var f=this,g,j,i,h;if(f.isDisabled()){return}if(!f.isMenuRendered){f.renderMenu();f.isMenuRendered=true}if(f.isMenuVisible){return f.hideMenu()}i=c.get(f.id);c.show(f.id+"_menu");c.addClass(i,"mceSplitButtonSelected");h=c.getPos(i);c.setStyles(f.id+"_menu",{left:h.x,top:h.y+i.clientHeight,zIndex:200000});i=0;a.add(c.doc,"mousedown",f.hideMenu,f);f.onShowMenu.dispatch(f);if(f._focused){f._keyHandler=a.add(f.id+"_menu","keydown",function(k){if(k.keyCode==27){f.hideMenu()}});c.select("a",f.id+"_menu")[0].focus()}f.isMenuVisible=1},hideMenu:function(g){var f=this;if(g&&g.type=="mousedown"&&c.getParent(g.target,function(h){return h.id===f.id+"_open"})){return}if(!g||!c.getParent(g.target,".mceSplitButtonMenu")){c.removeClass(f.id,"mceSplitButtonSelected");a.remove(c.doc,"mousedown",f.hideMenu,f);a.remove(f.id+"_menu","keydown",f._keyHandler);c.hide(f.id+"_menu")}f.onHideMenu.dispatch(f);f.isMenuVisible=0},renderMenu:function(){var k=this,f,j=0,l=k.settings,p,h,o,g;g=c.add(l.menu_container,"div",{id:k.id+"_menu","class":l.menu_class+" "+l["class"],style:"position:absolute;left:0;top:-1000px;"});f=c.add(g,"div",{"class":l["class"]+" mceSplitButtonMenu"});c.add(f,"span",{"class":"mceMenuLine"});p=c.add(f,"table",{"class":"mceColorSplitMenu"});h=c.add(p,"tbody");j=0;e(b(l.colors,"array")?l.colors:l.colors.split(","),function(i){i=i.replace(/^#/,"");if(!j--){o=c.add(h,"tr");j=l.grid_width-1}p=c.add(o,"td");p=c.add(p,"a",{href:"javascript:;",style:{backgroundColor:"#"+i},_mce_color:"#"+i})});if(l.more_colors_func){p=c.add(h,"tr");p=c.add(p,"td",{colspan:l.grid_width,"class":"mceMoreColors"});p=c.add(p,"a",{id:k.id+"_more",href:"javascript:;",onclick:"return false;","class":"mceMoreColors"},l.more_colors_title);a.add(p,"click",function(i){l.more_colors_func.call(l.more_colors_scope||this);return a.cancel(i)})}c.addClass(f,"mceColorSplitMenu");a.add(k.id+"_menu","click",function(i){var m;i=i.target;if(i.nodeName=="A"&&(m=i.getAttribute("_mce_color"))){k.setColor(m)}return a.cancel(i)});return g},setColor:function(g){var f=this;c.setStyle(f.id+"_preview","backgroundColor",g);f.value=g;f.hideMenu();f.settings.onselect(g)},postRender:function(){var f=this,g=f.id;f.parent();c.add(g+"_action","div",{id:g+"_preview","class":"mceColorPreview"});c.setStyle(f.id+"_preview","backgroundColor",f.value)},destroy:function(){this.parent();a.clear(this.id+"_menu");a.clear(this.id+"_more");c.remove(this.id+"_menu")}})})(tinymce);tinymce.create("tinymce.ui.Toolbar:tinymce.ui.Container",{renderHTML:function(){var l=this,e="",g,j,b=tinymce.DOM,m=l.settings,d,a,f,k;k=l.controls;for(d=0;d<k.length;d++){j=k[d];a=k[d-1];f=k[d+1];if(d===0){g="mceToolbarStart";if(j.Button){g+=" mceToolbarStartButton"}else{if(j.SplitButton){g+=" mceToolbarStartSplitButton"}else{if(j.ListBox){g+=" mceToolbarStartListBox"}}}e+=b.createHTML("td",{"class":g},b.createHTML("span",null,"<!-- IE -->"))}if(a&&j.ListBox){if(a.Button||a.SplitButton){e+=b.createHTML("td",{"class":"mceToolbarEnd"},b.createHTML("span",null,"<!-- IE -->"))}}if(b.stdMode){e+='<td style="position: relative">'+j.renderHTML()+"</td>"}else{e+="<td>"+j.renderHTML()+"</td>"}if(f&&j.ListBox){if(f.Button||f.SplitButton){e+=b.createHTML("td",{"class":"mceToolbarStart"},b.createHTML("span",null,"<!-- IE -->"))}}}g="mceToolbarEnd";if(j.Button){g+=" mceToolbarEndButton"}else{if(j.SplitButton){g+=" mceToolbarEndSplitButton"}else{if(j.ListBox){g+=" mceToolbarEndListBox"}}}e+=b.createHTML("td",{"class":g},b.createHTML("span",null,"<!-- IE -->"));return b.createHTML("table",{id:l.id,"class":"mceToolbar"+(m["class"]?" "+m["class"]:""),cellpadding:"0",cellspacing:"0",align:l.settings.align||""},"<tbody><tr>"+e+"</tr></tbody>")}});(function(b){var a=b.util.Dispatcher,c=b.each;b.create("tinymce.AddOnManager",{items:[],urls:{},lookup:{},onAdd:new a(this),get:function(d){return this.lookup[d]},requireLangPack:function(e){var d=b.settings;if(d&&d.language){b.ScriptLoader.add(this.urls[e]+"/langs/"+d.language+".js")}},add:function(e,d){this.items.push(d);this.lookup[e]=d;this.onAdd.dispatch(this,e,d);return d},load:function(h,e,d,g){var f=this;if(f.urls[h]){return}if(e.indexOf("/")!=0&&e.indexOf("://")==-1){e=b.baseURL+"/"+e}f.urls[h]=e.substring(0,e.lastIndexOf("/"));b.ScriptLoader.add(e,d,g)}});b.PluginManager=new b.AddOnManager();b.ThemeManager=new b.AddOnManager()}(tinymce));(function(j){var g=j.each,d=j.extend,k=j.DOM,i=j.dom.Event,f=j.ThemeManager,b=j.PluginManager,e=j.explode,h=j.util.Dispatcher,a,c=0;j.documentBaseURL=window.location.href.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,"");if(!/[\/\\]$/.test(j.documentBaseURL)){j.documentBaseURL+="/"}j.baseURL=new j.util.URI(j.documentBaseURL).toAbsolute(j.baseURL);j.baseURI=new j.util.URI(j.baseURL);j.onBeforeUnload=new h(j);i.add(window,"beforeunload",function(l){j.onBeforeUnload.dispatch(j,l)});j.onAddEditor=new h(j);j.onRemoveEditor=new h(j);j.EditorManager=d(j,{editors:[],i18n:{},activeEditor:null,init:function(q){var n=this,p,l=j.ScriptLoader,u,o=[],m;function r(x,y,t){var v=x[y];if(!v){return}if(j.is(v,"string")){t=v.replace(/\.\w+$/,"");t=t?j.resolve(t):0;v=j.resolve(v)}return v.apply(t||this,Array.prototype.slice.call(arguments,2))}q=d({theme:"simple",language:"en"},q);n.settings=q;i.add(document,"init",function(){var s,v;r(q,"onpageload");switch(q.mode){case"exact":s=q.elements||"";if(s.length>0){g(e(s),function(x){if(k.get(x)){m=new j.Editor(x,q);o.push(m);m.render(1)}else{g(document.forms,function(y){g(y.elements,function(z){if(z.name===x){x="mce_editor_"+c++;k.setAttrib(z,"id",x);m=new j.Editor(x,q);o.push(m);m.render(1)}})})}})}break;case"textareas":case"specific_textareas":function t(y,x){return x.constructor===RegExp?x.test(y.className):k.hasClass(y,x)}g(k.select("textarea"),function(x){if(q.editor_deselector&&t(x,q.editor_deselector)){return}if(!q.editor_selector||t(x,q.editor_selector)){u=k.get(x.name);if(!x.id&&!u){x.id=x.name}if(!x.id||n.get(x.id)){x.id=k.uniqueId()}m=new j.Editor(x.id,q);o.push(m);m.render(1)}});break}if(q.oninit){s=v=0;g(o,function(x){v++;if(!x.initialized){x.onInit.add(function(){s++;if(s==v){r(q,"oninit")}})}else{s++}if(s==v){r(q,"oninit")}})}})},get:function(l){if(l===a){return this.editors}return this.editors[l]},getInstanceById:function(l){return this.get(l)},add:function(m){var l=this,n=l.editors;n[m.id]=m;n.push(m);l._setActive(m);l.onAddEditor.dispatch(l,m);if(j.adapter){j.adapter.patchEditor(m)}return m},remove:function(n){var m=this,l,o=m.editors;if(!o[n.id]){return null}delete o[n.id];for(l=0;l<o.length;l++){if(o[l]==n){o.splice(l,1);break}}if(m.activeEditor==n){m._setActive(o[0])}n.destroy();m.onRemoveEditor.dispatch(m,n);return n},execCommand:function(r,p,o){var q=this,n=q.get(o),l;switch(r){case"mceFocus":n.focus();return true;case"mceAddEditor":case"mceAddControl":if(!q.get(o)){new j.Editor(o,q.settings).render()}return true;case"mceAddFrameControl":l=o.window;l.tinyMCE=tinyMCE;l.tinymce=j;j.DOM.doc=l.document;j.DOM.win=l;n=new j.Editor(o.element_id,o);n.render();if(j.isIE){function m(){n.destroy();l.detachEvent("onunload",m);l=l.tinyMCE=l.tinymce=null}l.attachEvent("onunload",m)}o.page_window=null;return true;case"mceRemoveEditor":case"mceRemoveControl":if(n){n.remove()}return true;case"mceToggleEditor":if(!n){q.execCommand("mceAddControl",0,o);return true}if(n.isHidden()){n.show()}else{n.hide()}return true}if(q.activeEditor){return q.activeEditor.execCommand(r,p,o)}return false},execInstanceCommand:function(p,o,n,m){var l=this.get(p);if(l){return l.execCommand(o,n,m)}return false},triggerSave:function(){g(this.editors,function(l){l.save()})},addI18n:function(n,q){var l,m=this.i18n;if(!j.is(n,"string")){g(n,function(r,p){g(r,function(t,s){g(t,function(v,u){if(s==="common"){m[p+"."+u]=v}else{m[p+"."+s+"."+u]=v}})})})}else{g(q,function(r,p){m[n+"."+p]=r})}},_setActive:function(l){this.selectedInstance=this.activeEditor=l}})})(tinymce);(function(m){var n=m.DOM,j=m.dom.Event,f=m.extend,k=m.util.Dispatcher,i=m.each,a=m.isGecko,b=m.isIE,e=m.isWebKit,d=m.is,h=m.ThemeManager,c=m.PluginManager,o=m.inArray,l=m.grep,g=m.explode;m.create("tinymce.Editor",{Editor:function(r,q){var p=this;p.id=p.editorId=r;p.execCommands={};p.queryStateCommands={};p.queryValueCommands={};p.isNotDirty=false;p.plugins={};i(["onPreInit","onBeforeRenderUI","onPostRender","onInit","onRemove","onActivate","onDeactivate","onClick","onEvent","onMouseUp","onMouseDown","onDblClick","onKeyDown","onKeyUp","onKeyPress","onContextMenu","onSubmit","onReset","onPaste","onPreProcess","onPostProcess","onBeforeSetContent","onBeforeGetContent","onSetContent","onGetContent","onLoadContent","onSaveContent","onNodeChange","onChange","onBeforeExecCommand","onExecCommand","onUndo","onRedo","onVisualAid","onSetProgressState"],function(s){p[s]=new k(p)});p.settings=q=f({id:r,language:"en",docs_language:"en",theme:"simple",skin:"default",delta_width:0,delta_height:0,popup_css:"",plugins:"",document_base_url:m.documentBaseURL,add_form_submit_trigger:1,submit_patch:1,add_unload_trigger:1,convert_urls:1,relative_urls:1,remove_script_host:1,table_inline_editing:0,object_resizing:1,cleanup:1,accessibility_focus:1,custom_shortcuts:1,custom_undo_redo_keyboard_shortcuts:1,custom_undo_redo_restore_selection:1,custom_undo_redo:1,doctype:m.isIE6?'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">':"<!DOCTYPE>",visual_table_class:"mceItemTable",visual:1,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",apply_source_formatting:1,directionality:"ltr",forced_root_block:"p",valid_elements:"@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u,#p,-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|src|border|alt=|title|hspace|vspace|width|height|align],-sub,-sup,-blockquote[cite],-table[border|cellspacing|cellpadding|width|frame|rules|height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot,#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div,-span,-code,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite],object[classid|width|height|codebase|*],param[name|value],embed[type|width|height|src|*],script[src|type],map[name],area[shape|coords|href|alt|target],bdo,button,col[align|char|charoff|span|valign|width],colgroup[align|char|charoff|span|valign|width],dfn,fieldset,form[action|accept|accept-charset|enctype|method],input[accept|alt|checked|disabled|maxlength|name|readonly|size|src|type|value|tabindex|accesskey],kbd,label[for],legend,noscript,optgroup[label|disabled],option[disabled|label|selected|value],q[cite],samp,select[disabled|multiple|name|size],small,textarea[cols|rows|disabled|name|readonly],tt,var,big",hidden_input:1,padd_empty_editor:1,render_ui:1,init_theme:1,force_p_newlines:1,indentation:"30px",keep_styles:1,fix_table_elements:1,inline_styles:1,convert_fonts_to_spans:true},q);p.documentBaseURI=new m.util.URI(q.document_base_url||m.documentBaseURL,{base_uri:tinyMCE.baseURI});p.baseURI=m.baseURI;p.execCallback("setup",p)},render:function(r){var u=this,v=u.settings,x=u.id,p=m.ScriptLoader;if(!j.domLoaded){j.add(document,"init",function(){u.render()});return}tinyMCE.settings=v;if(!u.getElement()){return}if(m.isIDevice){return}if(!/TEXTAREA|INPUT/i.test(u.getElement().nodeName)&&v.hidden_input&&n.getParent(x,"form")){n.insertAfter(n.create("input",{type:"hidden",name:x}),x)}if(m.WindowManager){u.windowManager=new m.WindowManager(u)}if(v.encoding=="xml"){u.onGetContent.add(function(s,t){if(t.save){t.content=n.encode(t.content)}})}if(v.add_form_submit_trigger){u.onSubmit.addToTop(function(){if(u.initialized){u.save();u.isNotDirty=1}})}if(v.add_unload_trigger){u._beforeUnload=tinyMCE.onBeforeUnload.add(function(){if(u.initialized&&!u.destroyed&&!u.isHidden()){u.save({format:"raw",no_events:true})}})}m.addUnload(u.destroy,u);if(v.submit_patch){u.onBeforeRenderUI.add(function(){var s=u.getElement().form;if(!s){return}if(s._mceOldSubmit){return}if(!s.submit.nodeType&&!s.submit.length){u.formElement=s;s._mceOldSubmit=s.submit;s.submit=function(){m.triggerSave();u.isNotDirty=1;return u.formElement._mceOldSubmit(u.formElement)}}s=null})}function q(){if(v.language){p.add(m.baseURL+"/langs/"+v.language+".js")}if(v.theme&&v.theme.charAt(0)!="-"&&!h.urls[v.theme]){h.load(v.theme,"themes/"+v.theme+"/editor_template"+m.suffix+".js")}i(g(v.plugins),function(s){if(s&&s.charAt(0)!="-"&&!c.urls[s]){if(s=="safari"){return}c.load(s,"plugins/"+s+"/editor_plugin"+m.suffix+".js")}});p.loadQueue(function(){if(!u.removed){u.init()}})}q()},init:function(){var r,E=this,F=E.settings,B,y,A=E.getElement(),q,p,C,x,z,D;m.add(E);if(F.theme){F.theme=F.theme.replace(/-/,"");q=h.get(F.theme);E.theme=new q();if(E.theme.init&&F.init_theme){E.theme.init(E,h.urls[F.theme]||m.documentBaseURL.replace(/\/$/,""))}}i(g(F.plugins.replace(/\-/g,"")),function(G){var H=c.get(G),t=c.urls[G]||m.documentBaseURL.replace(/\/$/,""),s;if(H){s=new H(E,t);E.plugins[G]=s;if(s.init){s.init(E,t)}}});if(F.popup_css!==false){if(F.popup_css){F.popup_css=E.documentBaseURI.toAbsolute(F.popup_css)}else{F.popup_css=E.baseURI.toAbsolute("themes/"+F.theme+"/skins/"+F.skin+"/dialog.css")}}if(F.popup_css_add){F.popup_css+=","+E.documentBaseURI.toAbsolute(F.popup_css_add)}E.controlManager=new m.ControlManager(E);if(F.custom_undo_redo){E.onBeforeExecCommand.add(function(t,G,u,H,s){if(G!="Undo"&&G!="Redo"&&G!="mceRepaint"&&(!s||!s.skip_undo)){if(!E.undoManager.hasUndo()){E.undoManager.add()}}});E.onExecCommand.add(function(t,G,u,H,s){if(G!="Undo"&&G!="Redo"&&G!="mceRepaint"&&(!s||!s.skip_undo)){E.undoManager.add()}})}E.onExecCommand.add(function(s,t){if(!/^(FontName|FontSize)$/.test(t)){E.nodeChanged()}});if(a){function v(s,t){if(!t||!t.initial){E.execCommand("mceRepaint")}}E.onUndo.add(v);E.onRedo.add(v);E.onSetContent.add(v)}E.onBeforeRenderUI.dispatch(E,E.controlManager);if(F.render_ui){B=F.width||A.style.width||A.offsetWidth;y=F.height||A.style.height||A.offsetHeight;E.orgDisplay=A.style.display;D=/^[0-9\.]+(|px)$/i;if(D.test(""+B)){B=Math.max(parseInt(B)+(q.deltaWidth||0),100)}if(D.test(""+y)){y=Math.max(parseInt(y)+(q.deltaHeight||0),100)}q=E.theme.renderUI({targetNode:A,width:B,height:y,deltaWidth:F.delta_width,deltaHeight:F.delta_height});E.editorContainer=q.editorContainer}if(document.domain&&location.hostname!=document.domain){m.relaxedDomain=document.domain}n.setStyles(q.sizeContainer||q.editorContainer,{width:B,height:y});y=(q.iframeHeight||y)+(typeof(y)=="number"?(q.deltaHeight||0):"");if(y<100){y=100}E.iframeHTML=F.doctype+'<html><head xmlns="http://www.w3.org/1999/xhtml">';if(F.document_base_url!=m.documentBaseURL){E.iframeHTML+='<base href="'+E.documentBaseURI.getURI()+'" />'}E.iframeHTML+='<meta http-equiv="X-UA-Compatible" content="IE=7" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';if(m.relaxedDomain){E.iframeHTML+='<script type="text/javascript">document.domain = "'+m.relaxedDomain+'";<\/script>'}x=F.body_id||"tinymce";if(x.indexOf("=")!=-1){x=E.getParam("body_id","","hash");x=x[E.id]||x}z=F.body_class||"";if(z.indexOf("=")!=-1){z=E.getParam("body_class","","hash");z=z[E.id]||""}E.iframeHTML+='</head><body id="'+x+'" class="mceContentBody '+z+'"></body></html>';if(m.relaxedDomain){if(b||(m.isOpera&&parseFloat(opera.version())>=9.5)){C='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinyMCE.get("'+E.id+'");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()'}else{if(m.isOpera){C='javascript:(function(){document.open();document.domain="'+document.domain+'";document.close();ed.setupIframe();})()'}}}r=n.add(q.iframeContainer,"iframe",{id:E.id+"_ifr",src:C||'javascript:""',frameBorder:"0",style:{width:"100%",height:y}});E.contentAreaContainer=q.iframeContainer;n.get(q.editorContainer).style.display=E.orgDisplay;n.get(E.id).style.display="none";if(!b||!m.relaxedDomain){E.setupIframe()}A=r=q=null},setupIframe:function(){var z=this,A=z.settings,r=n.get(z.id),u=z.getDoc(),q,x;if(!b||!m.relaxedDomain){u.open();u.write(z.iframeHTML);u.close()}if(!b){try{if(!A.readonly){u.designMode="On"}}catch(v){}}if(b){x=z.getBody();n.hide(x);if(!A.readonly){x.contentEditable=true}n.show(x)}z.dom=new m.dom.DOMUtils(z.getDoc(),{keep_values:true,url_converter:z.convertURL,url_converter_scope:z,hex_colors:A.force_hex_style_colors,class_filter:A.class_filter,update_styles:1,fix_ie_paragraphs:1,valid_styles:A.valid_styles});z.schema=new m.dom.Schema();z.serializer=new m.dom.Serializer(f(A,{valid_elements:A.verify_html===false?"*[*]":A.valid_elements,dom:z.dom,schema:z.schema}));z.selection=new m.dom.Selection(z.dom,z.getWin(),z.serializer);z.formatter=new m.Formatter(this);z.formatter.register({alignleft:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"left"}},{selector:"img,table",styles:{"float":"left"}}],aligncenter:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"center"}},{selector:"img",styles:{display:"block",marginLeft:"auto",marginRight:"auto"}},{selector:"table",styles:{marginLeft:"auto",marginRight:"auto"}}],alignright:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"right"}},{selector:"img,table",styles:{"float":"right"}}],alignfull:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"justify"}}],bold:[{inline:"strong"},{inline:"span",styles:{fontWeight:"bold"}},{inline:"b"}],italic:[{inline:"em"},{inline:"span",styles:{fontStyle:"italic"}},{inline:"i"}],underline:[{inline:"span",styles:{textDecoration:"underline"},exact:true},{inline:"u"}],strikethrough:[{inline:"span",styles:{textDecoration:"line-through"},exact:true},{inline:"u"}],forecolor:{inline:"span",styles:{color:"%value"}},hilitecolor:{inline:"span",styles:{backgroundColor:"%value"}},fontname:{inline:"span",styles:{fontFamily:"%value"}},fontsize:{inline:"span",styles:{fontSize:"%value"}},fontsize_class:{inline:"span",attributes:{"class":"%value"}},blockquote:{block:"blockquote",wrapper:1,remove:"all"},removeformat:[{selector:"b,strong,em,i,font,u,strike",remove:"all",split:true,expand:false,block_expand:true,deep:true},{selector:"span",attributes:["style","class"],remove:"empty",split:true,expand:false,deep:true},{selector:"*",attributes:["style","class"],split:false,expand:false,deep:true}]});i("p h1 h2 h3 h4 h5 h6 div address pre div code dt dd samp".split(/\s/),function(s){z.formatter.register(s,{block:s,remove:"all"})});z.formatter.register(z.settings.formats);z.undoManager=new m.UndoManager(z);z.undoManager.onAdd.add(function(t,s){if(!s.initial){return z.onChange.dispatch(z,s,t)}});z.undoManager.onUndo.add(function(t,s){return z.onUndo.dispatch(z,s,t)});z.undoManager.onRedo.add(function(t,s){return z.onRedo.dispatch(z,s,t)});z.forceBlocks=new m.ForceBlocks(z,{forced_root_block:A.forced_root_block});z.editorCommands=new m.EditorCommands(z);z.serializer.onPreProcess.add(function(s,t){return z.onPreProcess.dispatch(z,t,s)});z.serializer.onPostProcess.add(function(s,t){return z.onPostProcess.dispatch(z,t,s)});z.onPreInit.dispatch(z);if(!A.gecko_spellcheck){z.getBody().spellcheck=0}if(!A.readonly){z._addEvents()}z.controlManager.onPostRender.dispatch(z,z.controlManager);z.onPostRender.dispatch(z);if(A.directionality){z.getBody().dir=A.directionality}if(A.nowrap){z.getBody().style.whiteSpace="nowrap"}if(A.custom_elements){function y(s,t){i(g(A.custom_elements),function(B){var C;if(B.indexOf("~")===0){B=B.substring(1);C="span"}else{C="div"}t.content=t.content.replace(new RegExp("<("+B+")([^>]*)>","g"),"<"+C+' _mce_name="$1"$2>');t.content=t.content.replace(new RegExp("</("+B+")>","g"),"</"+C+">")})}z.onBeforeSetContent.add(y);z.onPostProcess.add(function(s,t){if(t.set){y(s,t)}})}if(A.handle_node_change_callback){z.onNodeChange.add(function(t,s,B){z.execCallback("handle_node_change_callback",z.id,B,-1,-1,true,z.selection.isCollapsed())})}if(A.save_callback){z.onSaveContent.add(function(s,B){var t=z.execCallback("save_callback",z.id,B.content,z.getBody());if(t){B.content=t}})}if(A.onchange_callback){z.onChange.add(function(t,s){z.execCallback("onchange_callback",z,s)})}if(A.convert_newlines_to_brs){z.onBeforeSetContent.add(function(s,t){if(t.initial){t.content=t.content.replace(/\r?\n/g,"<br />")}})}if(A.fix_nesting&&b){z.onBeforeSetContent.add(function(s,t){t.content=z._fixNesting(t.content)})}if(A.preformatted){z.onPostProcess.add(function(s,t){t.content=t.content.replace(/^\s*<pre.*?>/,"");t.content=t.content.replace(/<\/pre>\s*$/,"");if(t.set){t.content='<pre class="mceItemHidden">'+t.content+"</pre>"}})}if(A.verify_css_classes){z.serializer.attribValueFilter=function(D,B){var C,t;if(D=="class"){if(!z.classesRE){t=z.dom.getClasses();if(t.length>0){C="";i(t,function(s){C+=(C?"|":"")+s["class"]});z.classesRE=new RegExp("("+C+")","gi")}}return !z.classesRE||/(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(B)||z.classesRE.test(B)?B:""}return B}}if(A.cleanup_callback){z.onBeforeSetContent.add(function(s,t){t.content=z.execCallback("cleanup_callback","insert_to_editor",t.content,t)});z.onPreProcess.add(function(s,t){if(t.set){z.execCallback("cleanup_callback","insert_to_editor_dom",t.node,t)}if(t.get){z.execCallback("cleanup_callback","get_from_editor_dom",t.node,t)}});z.onPostProcess.add(function(s,t){if(t.set){t.content=z.execCallback("cleanup_callback","insert_to_editor",t.content,t)}if(t.get){t.content=z.execCallback("cleanup_callback","get_from_editor",t.content,t)}})}if(A.save_callback){z.onGetContent.add(function(s,t){if(t.save){t.content=z.execCallback("save_callback",z.id,t.content,z.getBody())}})}if(A.handle_event_callback){z.onEvent.add(function(s,t,B){if(z.execCallback("handle_event_callback",t,s,B)===false){j.cancel(t)}})}z.onSetContent.add(function(){z.addVisual(z.getBody())});if(A.padd_empty_editor){z.onPostProcess.add(function(s,t){t.content=t.content.replace(/^(<p[^>]*>( | |\s|\u00a0|)<\/p>[\r\n]*|<br \/>[\r\n]*)$/,"")})}if(a){function p(s,t){i(s.dom.select("a"),function(C){var B=C.parentNode;if(s.dom.isBlock(B)&&B.lastChild===C){s.dom.add(B,"br",{_mce_bogus:1})}})}z.onExecCommand.add(function(s,t){if(t==="CreateLink"){p(s)}});z.onSetContent.add(z.selection.onSetContent.add(p));if(!A.readonly){try{u.designMode="Off";u.designMode="On"}catch(v){}}}setTimeout(function(){if(z.removed){return}z.load({initial:true,format:(A.cleanup_on_startup?"html":"raw")});z.startContent=z.getContent({format:"raw"});z.initialized=true;z.onInit.dispatch(z);z.execCallback("setupcontent_callback",z.id,z.getBody(),z.getDoc());z.execCallback("init_instance_callback",z);z.focus(true);z.nodeChanged({initial:1});if(A.content_css){m.each(g(A.content_css),function(s){z.dom.loadCSS(z.documentBaseURI.toAbsolute(s))})}if(A.auto_focus){setTimeout(function(){var s=m.get(A.auto_focus);s.selection.select(s.getBody(),1);s.selection.collapse(1);s.getWin().focus()},100)}},1);r=null},focus:function(s){var x,q=this,v=q.settings.content_editable,r,p,u=q.getDoc();if(!s){r=q.selection.getRng();if(r.item){p=r.item(0)}if(!v){q.getWin().focus()}if(p&&p.ownerDocument==u){r=u.body.createControlRange();r.addElement(p);r.select()}}if(m.activeEditor!=q){if((x=m.activeEditor)!=null){x.onDeactivate.dispatch(x,q)}q.onActivate.dispatch(q,x)}m._setActive(q)},execCallback:function(u){var p=this,r=p.settings[u],q;if(!r){return}if(p.callbackLookup&&(q=p.callbackLookup[u])){r=q.func;q=q.scope}if(d(r,"string")){q=r.replace(/\.\w+$/,"");q=q?m.resolve(q):0;r=m.resolve(r);p.callbackLookup=p.callbackLookup||{};p.callbackLookup[u]={func:r,scope:q}}return r.apply(q||p,Array.prototype.slice.call(arguments,1))},translate:function(p){var r=this.settings.language||"en",q=m.i18n;if(!p){return""}return q[r+"."+p]||p.replace(/{\#([^}]+)\}/g,function(t,s){return q[r+"."+s]||"{#"+s+"}"})},getLang:function(q,p){return m.i18n[(this.settings.language||"en")+"."+q]||(d(p)?p:"{#"+q+"}")},getParam:function(u,r,p){var s=m.trim,q=d(this.settings[u])?this.settings[u]:r,t;if(p==="hash"){t={};if(d(q,"string")){i(q.indexOf("=")>0?q.split(/[;,](?![^=;,]*(?:[;,]|$))/):q.split(","),function(x){x=x.split("=");if(x.length>1){t[s(x[0])]=s(x[1])}else{t[s(x[0])]=s(x)}})}else{t=q}return t}return q},nodeChanged:function(r){var p=this,q=p.selection,u=(b?q.getNode():q.getStart())||p.getBody();if(p.initialized){r=r||{};u=b&&u.ownerDocument!=p.getDoc()?p.getBody():u;r.parents=[];p.dom.getParent(u,function(s){if(s.nodeName=="BODY"){return true}r.parents.push(s)});p.onNodeChange.dispatch(p,r?r.controlManager||p.controlManager:p.controlManager,u,q.isCollapsed(),r)}},addButton:function(r,q){var p=this;p.buttons=p.buttons||{};p.buttons[r]=q},addCommand:function(r,q,p){this.execCommands[r]={func:q,scope:p||this}},addQueryStateHandler:function(r,q,p){this.queryStateCommands[r]={func:q,scope:p||this}},addQueryValueHandler:function(r,q,p){this.queryValueCommands[r]={func:q,scope:p||this}},addShortcut:function(r,u,p,s){var q=this,v;if(!q.settings.custom_shortcuts){return false}q.shortcuts=q.shortcuts||{};if(d(p,"string")){v=p;p=function(){q.execCommand(v,false,null)}}if(d(p,"object")){v=p;p=function(){q.execCommand(v[0],v[1],v[2])}}i(g(r),function(t){var x={func:p,scope:s||this,desc:u,alt:false,ctrl:false,shift:false};i(g(t,"+"),function(y){switch(y){case"alt":case"ctrl":case"shift":x[y]=true;break;default:x.charCode=y.charCodeAt(0);x.keyCode=y.toUpperCase().charCodeAt(0)}});q.shortcuts[(x.ctrl?"ctrl":"")+","+(x.alt?"alt":"")+","+(x.shift?"shift":"")+","+x.keyCode]=x});return true},execCommand:function(x,v,z,p){var r=this,u=0,y,q;if(!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(x)&&(!p||!p.skip_focus)){r.focus()}y={};r.onBeforeExecCommand.dispatch(r,x,v,z,y);if(y.terminate){return false}if(r.execCallback("execcommand_callback",r.id,r.selection.getNode(),x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}if(y=r.execCommands[x]){q=y.func.call(y.scope,v,z);if(q!==true){r.onExecCommand.dispatch(r,x,v,z,p);return q}}i(r.plugins,function(s){if(s.execCommand&&s.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);u=1;return false}});if(u){return true}if(r.theme&&r.theme.execCommand&&r.theme.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}if(m.GlobalCommands.execCommand(r,x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}if(r.editorCommands.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}r.getDoc().execCommand(x,v,z);r.onExecCommand.dispatch(r,x,v,z,p)},queryCommandState:function(u){var q=this,v,r;if(q._isHidden()){return}if(v=q.queryStateCommands[u]){r=v.func.call(v.scope);if(r!==true){return r}}v=q.editorCommands.queryCommandState(u);if(v!==-1){return v}try{return this.getDoc().queryCommandState(u)}catch(p){}},queryCommandValue:function(v){var q=this,u,r;if(q._isHidden()){return}if(u=q.queryValueCommands[v]){r=u.func.call(u.scope);if(r!==true){return r}}u=q.editorCommands.queryCommandValue(v);if(d(u)){return u}try{return this.getDoc().queryCommandValue(v)}catch(p){}},show:function(){var p=this;n.show(p.getContainer());n.hide(p.id);p.load()},hide:function(){var p=this,q=p.getDoc();if(b&&q){q.execCommand("SelectAll")}p.save();n.hide(p.getContainer());n.setStyle(p.id,"display",p.orgDisplay)},isHidden:function(){return !n.isHidden(this.id)},setProgressState:function(p,q,r){this.onSetProgressState.dispatch(this,p,q,r);return p},load:function(s){var p=this,r=p.getElement(),q;if(r){s=s||{};s.load=true;q=p.setContent(d(r.value)?r.value:r.innerHTML,s);s.element=r;if(!s.no_events){p.onLoadContent.dispatch(p,s)}s.element=r=null;return q}},save:function(u){var p=this,s=p.getElement(),q,r;if(!s||!p.initialized){return}u=u||{};u.save=true;if(!u.no_events){p.undoManager.typing=0;p.undoManager.add()}u.element=s;q=u.content=p.getContent(u);if(!u.no_events){p.onSaveContent.dispatch(p,u)}q=u.content;if(!/TEXTAREA|INPUT/i.test(s.nodeName)){s.innerHTML=q;if(r=n.getParent(p.id,"form")){i(r.elements,function(t){if(t.name==p.id){t.value=q;return false}})}}else{s.value=q}u.element=s=null;return q},setContent:function(q,r){var p=this;r=r||{};r.format=r.format||"html";r.set=true;r.content=q;if(!r.no_events){p.onBeforeSetContent.dispatch(p,r)}if(!m.isIE&&(q.length===0||/^\s+$/.test(q))){r.content=p.dom.setHTML(p.getBody(),'<br _mce_bogus="1" />');r.format="raw"}r.content=p.dom.setHTML(p.getBody(),m.trim(r.content));if(r.format!="raw"&&p.settings.cleanup){r.getInner=true;r.content=p.dom.setHTML(p.getBody(),p.serializer.serialize(p.getBody(),r))}if(!r.no_events){p.onSetContent.dispatch(p,r)}return r.content},getContent:function(r){var p=this,q;r=r||{};r.format=r.format||"html";r.get=true;if(!r.no_events){p.onBeforeGetContent.dispatch(p,r)}if(r.format!="raw"&&p.settings.cleanup){r.getInner=true;q=p.serializer.serialize(p.getBody(),r)}else{q=p.getBody().innerHTML}q=q.replace(/^\s*|\s*$/g,"");r.content=q;if(!r.no_events){p.onGetContent.dispatch(p,r)}return r.content},isDirty:function(){var p=this;return m.trim(p.startContent)!=m.trim(p.getContent({format:"raw",no_events:1}))&&!p.isNotDirty},getContainer:function(){var p=this;if(!p.container){p.container=n.get(p.editorContainer||p.id+"_parent")}return p.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return n.get(this.settings.content_element||this.id)},getWin:function(){var p=this,q;if(!p.contentWindow){q=n.get(p.id+"_ifr");if(q){p.contentWindow=q.contentWindow}}return p.contentWindow},getDoc:function(){var q=this,p;if(!q.contentDocument){p=q.getWin();if(p){q.contentDocument=p.document}}return q.contentDocument},getBody:function(){return this.bodyElement||this.getDoc().body},convertURL:function(p,x,v){var q=this,r=q.settings;if(r.urlconverter_callback){return q.execCallback("urlconverter_callback",p,v,true,x)}if(!r.convert_urls||(v&&v.nodeName=="LINK")||p.indexOf("file:")===0){return p}if(r.relative_urls){return q.documentBaseURI.toRelative(p)}p=q.documentBaseURI.toAbsolute(p,r.remove_script_host);return p},addVisual:function(r){var p=this,q=p.settings;r=r||p.getBody();if(!d(p.hasVisual)){p.hasVisual=q.visual}i(p.dom.select("table,a",r),function(t){var s;switch(t.nodeName){case"TABLE":s=p.dom.getAttrib(t,"border");if(!s||s=="0"){if(p.hasVisual){p.dom.addClass(t,q.visual_table_class)}else{p.dom.removeClass(t,q.visual_table_class)}}return;case"A":s=p.dom.getAttrib(t,"name");if(s){if(p.hasVisual){p.dom.addClass(t,"mceItemAnchor")}else{p.dom.removeClass(t,"mceItemAnchor")}}return}});p.onVisualAid.dispatch(p,r,p.hasVisual)},remove:function(){var p=this,q=p.getContainer();p.removed=1;p.hide();p.execCallback("remove_instance_callback",p);p.onRemove.dispatch(p);p.onExecCommand.listeners=[];m.remove(p);n.remove(q)},destroy:function(q){var p=this;if(p.destroyed){return}if(!q){m.removeUnload(p.destroy);tinyMCE.onBeforeUnload.remove(p._beforeUnload);if(p.theme&&p.theme.destroy){p.theme.destroy()}p.controlManager.destroy();p.selection.destroy();p.dom.destroy();if(!p.settings.content_editable){j.clear(p.getWin());j.clear(p.getDoc())}j.clear(p.getBody());j.clear(p.formElement)}if(p.formElement){p.formElement.submit=p.formElement._mceOldSubmit;p.formElement._mceOldSubmit=null}p.contentAreaContainer=p.formElement=p.container=p.settings.content_element=p.bodyElement=p.contentDocument=p.contentWindow=null;if(p.selection){p.selection=p.selection.win=p.selection.dom=p.selection.dom.doc=null}p.destroyed=1},_addEvents:function(){var v=this,u,y=v.settings,x={mouseup:"onMouseUp",mousedown:"onMouseDown",click:"onClick",keyup:"onKeyUp",keydown:"onKeyDown",keypress:"onKeyPress",submit:"onSubmit",reset:"onReset",contextmenu:"onContextMenu",dblclick:"onDblClick",paste:"onPaste"};function r(t,A){var s=t.type;if(v.removed){return}if(v.onEvent.dispatch(v,t,A)!==false){v[x[t.fakeType||t.type]].dispatch(v,t,A)}}i(x,function(t,s){switch(s){case"contextmenu":if(m.isOpera){v.dom.bind(v.getBody(),"mousedown",function(A){if(A.ctrlKey){A.fakeType="contextmenu";r(A)}})}else{v.dom.bind(v.getBody(),s,r)}break;case"paste":v.dom.bind(v.getBody(),s,function(A){r(A)});break;case"submit":case"reset":v.dom.bind(v.getElement().form||n.getParent(v.id,"form"),s,r);break;default:v.dom.bind(y.content_editable?v.getBody():v.getDoc(),s,r)}});v.dom.bind(y.content_editable?v.getBody():(a?v.getDoc():v.getWin()),"focus",function(s){v.focus(true)});if(m.isGecko){v.dom.bind(v.getDoc(),"DOMNodeInserted",function(t){var s;t=t.target;if(t.nodeType===1&&t.nodeName==="IMG"&&(s=t.getAttribute("_mce_src"))){t.src=v.documentBaseURI.toAbsolute(s)}})}if(a){function p(){var B=this,D=B.getDoc(),C=B.settings;if(a&&!C.readonly){if(B._isHidden()){try{if(!C.content_editable){D.designMode="On"}}catch(A){}}try{D.execCommand("styleWithCSS",0,false)}catch(A){if(!B._isHidden()){try{D.execCommand("useCSS",0,true)}catch(A){}}}if(!C.table_inline_editing){try{D.execCommand("enableInlineTableEditing",false,false)}catch(A){}}if(!C.object_resizing){try{D.execCommand("enableObjectResizing",false,false)}catch(A){}}}}v.onBeforeExecCommand.add(p);v.onMouseDown.add(p)}if(m.isWebKit){v.onClick.add(function(s,t){t=t.target;if(t.nodeName=="IMG"||(t.nodeName=="A"&&v.dom.hasClass(t,"mceItemAnchor"))){v.selection.getSel().setBaseAndExtent(t,0,t,1)}})}v.onMouseUp.add(v.nodeChanged);v.onKeyUp.add(function(s,t){var A=t.keyCode;if((A>=33&&A<=36)||(A>=37&&A<=40)||A==13||A==45||A==46||A==8||(m.isMac&&(A==91||A==93))||t.ctrlKey){v.nodeChanged()}});v.onReset.add(function(){v.setContent(v.startContent,{format:"raw"})});if(y.custom_shortcuts){if(y.custom_undo_redo_keyboard_shortcuts){v.addShortcut("ctrl+z",v.getLang("undo_desc"),"Undo");v.addShortcut("ctrl+y",v.getLang("redo_desc"),"Redo")}v.addShortcut("ctrl+b",v.getLang("bold_desc"),"Bold");v.addShortcut("ctrl+i",v.getLang("italic_desc"),"Italic");v.addShortcut("ctrl+u",v.getLang("underline_desc"),"Underline");for(u=1;u<=6;u++){v.addShortcut("ctrl+"+u,"",["FormatBlock",false,"h"+u])}v.addShortcut("ctrl+7","",["FormatBlock",false,"<p>"]);v.addShortcut("ctrl+8","",["FormatBlock",false,"<div>"]);v.addShortcut("ctrl+9","",["FormatBlock",false,"<address>"]);function z(t){var s=null;if(!t.altKey&&!t.ctrlKey&&!t.metaKey){return s}i(v.shortcuts,function(A){if(m.isMac&&A.ctrl!=t.metaKey){return}else{if(!m.isMac&&A.ctrl!=t.ctrlKey){return}}if(A.alt!=t.altKey){return}if(A.shift!=t.shiftKey){return}if(t.keyCode==A.keyCode||(t.charCode&&t.charCode==A.charCode)){s=A;return false}});return s}v.onKeyUp.add(function(s,t){var A=z(t);if(A){return j.cancel(t)}});v.onKeyPress.add(function(s,t){var A=z(t);if(A){return j.cancel(t)}});v.onKeyDown.add(function(s,t){var A=z(t);if(A){A.func.call(A.scope);return j.cancel(t)}})}if(m.isIE){v.dom.bind(v.getDoc(),"controlselect",function(A){var t=v.resizeInfo,s;A=A.target;if(A.nodeName!=="IMG"){return}if(t){v.dom.unbind(t.node,t.ev,t.cb)}if(!v.dom.hasClass(A,"mceItemNoResize")){ev="resizeend";s=v.dom.bind(A,ev,function(C){var B;C=C.target;if(B=v.dom.getStyle(C,"width")){v.dom.setAttrib(C,"width",B.replace(/[^0-9%]+/g,""));v.dom.setStyle(C,"width","")}if(B=v.dom.getStyle(C,"height")){v.dom.setAttrib(C,"height",B.replace(/[^0-9%]+/g,""));v.dom.setStyle(C,"height","")}})}else{ev="resizestart";s=v.dom.bind(A,"resizestart",j.cancel,j)}t=v.resizeInfo={node:A,ev:ev,cb:s}});v.onKeyDown.add(function(s,t){switch(t.keyCode){case 8:if(v.selection.getRng().item){s.dom.remove(v.selection.getRng().item(0));return j.cancel(t)}}})}if(m.isOpera){v.onClick.add(function(s,t){j.prevent(t)})}if(y.custom_undo_redo){function q(){v.undoManager.typing=0;v.undoManager.add()}v.dom.bind(v.getDoc(),"focusout",function(s){if(!v.removed&&v.undoManager.typing){q()}});v.onKeyUp.add(function(s,t){if((t.keyCode>=33&&t.keyCode<=36)||(t.keyCode>=37&&t.keyCode<=40)||t.keyCode==13||t.keyCode==45||t.ctrlKey){q()}});v.onKeyDown.add(function(t,D){var s,C,B;if(b&&D.keyCode==46){s=v.selection.getRng();if(s.parentElement){C=s.parentElement();if(D.ctrlKey){s.moveEnd("word",1);s.select()}v.selection.getSel().clear();if(s.parentElement()==C){B=v.selection.getBookmark();try{C.innerHTML=C.innerHTML}catch(A){}v.selection.moveToBookmark(B)}D.preventDefault();return}}if((D.keyCode>=33&&D.keyCode<=36)||(D.keyCode>=37&&D.keyCode<=40)||D.keyCode==13||D.keyCode==45){if(v.undoManager.typing){q()}return}if(!v.undoManager.typing){v.undoManager.add();v.undoManager.typing=1}});v.onMouseDown.add(function(){if(v.undoManager.typing){q()}})}},_isHidden:function(){var p;if(!a){return 0}p=this.selection.getSel();return(!p||!p.rangeCount||p.rangeCount==0)},_fixNesting:function(q){var r=[],p;q=q.replace(/<(\/)?([^\s>]+)[^>]*?>/g,function(t,s,v){var u;if(s==="/"){if(!r.length){return""}if(v!==r[r.length-1].tag){for(p=r.length-1;p>=0;p--){if(r[p].tag===v){r[p].close=1;break}}return""}else{r.pop();if(r.length&&r[r.length-1].close){t=t+"</"+r[r.length-1].tag+">";r.pop()}}}else{if(/^(br|hr|input|meta|img|link|param)$/i.test(v)){return t}if(/\/>$/.test(t)){return t}r.push({tag:v})}return t});for(p=r.length-1;p>=0;p--){q+="</"+r[p].tag+">"}return q}})})(tinymce);(function(c){var d=c.each,e,a=true,b=false;c.EditorCommands=function(n){var l=n.dom,p=n.selection,j={state:{},exec:{},value:{}},k=n.settings,o;function q(y,x,v){var u;y=y.toLowerCase();if(u=j.exec[y]){u(y,x,v);return a}return b}function m(v){var u;v=v.toLowerCase();if(u=j.state[v]){return u(v)}return -1}function h(v){var u;v=v.toLowerCase();if(u=j.value[v]){return u(v)}return b}function t(u,v){v=v||"exec";d(u,function(y,x){d(x.toLowerCase().split(","),function(z){j[v][z]=y})})}c.extend(this,{execCommand:q,queryCommandState:m,queryCommandValue:h,addCommands:t});function f(x,v,u){if(v===e){v=b}if(u===e){u=null}return n.getDoc().execCommand(x,v,u)}function s(u){return n.formatter.match(u)}function r(u,v){n.formatter.toggle(u,v?{value:v}:e)}function i(u){o=p.getBookmark(u)}function g(){p.moveToBookmark(o)}t({"mceResetDesignMode,mceBeginUndoLevel":function(){},"mceEndUndoLevel,mceAddUndoLevel":function(){n.undoManager.add()},"Cut,Copy,Paste":function(y){var x=n.getDoc(),u;try{f(y)}catch(v){u=a}if(u||!x.queryCommandSupported(y)){if(c.isGecko){n.windowManager.confirm(n.getLang("clipboard_msg"),function(z){if(z){open("http://www.mozilla.org/editor/midasdemo/securityprefs.html","_blank")}})}else{n.windowManager.alert(n.getLang("clipboard_no_support"))}}},unlink:function(u){if(p.isCollapsed()){p.select(p.getNode())}f(u);p.collapse(b)},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(u){var v=u.substring(7);d("left,center,right,full".split(","),function(x){if(v!=x){n.formatter.remove("align"+x)}});r("align"+v)},"InsertUnorderedList,InsertOrderedList":function(x){var u,v;f(x);u=l.getParent(p.getNode(),"ol,ul");if(u){v=u.parentNode;if(/^(H[1-6]|P|ADDRESS|PRE)$/.test(v.nodeName)){i();l.split(v,u);g()}}},"Bold,Italic,Underline,Strikethrough":function(u){r(u)},"ForeColor,HiliteColor,FontName":function(x,v,u){r(x,u)},FontSize:function(y,x,v){var u,z;if(v>=1&&v<=7){z=c.explode(k.font_size_style_values);u=c.explode(k.font_size_classes);if(u){v=u[v-1]||v}else{v=z[v-1]||v}}r(y,v)},RemoveFormat:function(u){n.formatter.remove(u)},mceBlockQuote:function(u){r("blockquote")},FormatBlock:function(x,v,u){return r(u||"p")},mceCleanup:function(){var u=p.getBookmark();n.setContent(n.getContent({cleanup:a}),{cleanup:a});p.moveToBookmark(u)},mceRemoveNode:function(y,x,v){var u=v||p.getNode();if(u!=n.getBody()){i();n.dom.remove(u,a);g()}},mceSelectNodeDepth:function(y,x,v){var u=0;l.getParent(p.getNode(),function(z){if(z.nodeType==1&&u++==v){p.select(z);return b}},n.getBody())},mceSelectNode:function(x,v,u){p.select(u)},mceInsertContent:function(x,v,u){p.setContent(u)},mceInsertRawHTML:function(x,v,u){p.setContent("tiny_mce_marker");n.setContent(n.getContent().replace(/tiny_mce_marker/g,u))},mceSetContent:function(x,v,u){n.setContent(u)},"Indent,Outdent":function(y){var v,u,x;v=k.indentation;u=/[a-z%]+$/i.exec(v);v=parseInt(v);if(!m("InsertUnorderedList")&&!m("InsertOrderedList")){d(p.getSelectedBlocks(),function(z){if(y=="outdent"){x=Math.max(0,parseInt(z.style.paddingLeft||0)-v);l.setStyle(z,"paddingLeft",x?x+u:"")}else{l.setStyle(z,"paddingLeft",(parseInt(z.style.paddingLeft||0)+v)+u)}})}else{f(y)}},mceRepaint:function(){var v;if(c.isGecko){try{i(a);if(p.getSel()){p.getSel().selectAllChildren(n.getBody())}p.collapse(a);g()}catch(u){}}},mceToggleFormat:function(x,v,u){n.formatter.toggle(u)},InsertHorizontalRule:function(){p.setContent("<hr />")},mceToggleVisualAid:function(){n.hasVisual=!n.hasVisual;n.addVisual()},mceReplaceContent:function(x,v,u){p.setContent(u.replace(/\{\$selection\}/g,p.getContent({format:"text"})))},mceInsertLink:function(y,x,v){var u=l.getParent(p.getNode(),"a");if(c.is(v,"string")){v={href:v}}if(!u){f("CreateLink",b,"javascript:mctmp(0);");d(l.select("a[href=javascript:mctmp(0);]"),function(z){l.setAttribs(z,v)})}else{if(v.href){l.setAttribs(u,v)}else{n.dom.remove(u,a)}}},selectAll:function(){var v=l.getRoot(),u=l.createRng();u.setStart(v,0);u.setEnd(v,v.childNodes.length);n.selection.setRng(u)}});t({"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(u){return s("align"+u.substring(7))},"Bold,Italic,Underline,Strikethrough":function(u){return s(u)},mceBlockQuote:function(){return s("blockquote")},Outdent:function(){var u;if(k.inline_styles){if((u=l.getParent(p.getStart(),l.isBlock))&&parseInt(u.style.paddingLeft)>0){return a}if((u=l.getParent(p.getEnd(),l.isBlock))&&parseInt(u.style.paddingLeft)>0){return a}}return m("InsertUnorderedList")||m("InsertOrderedList")||(!k.inline_styles&&!!l.getParent(p.getNode(),"BLOCKQUOTE"))},"InsertUnorderedList,InsertOrderedList":function(u){return l.getParent(p.getNode(),u=="insertunorderedlist"?"UL":"OL")}},"state");t({"FontSize,FontName":function(x){var v=0,u;if(u=l.getParent(p.getNode(),"span")){if(x=="fontsize"){v=u.style.fontSize}else{v=u.style.fontFamily.replace(/, /g,",").replace(/[\'\"]/g,"").toLowerCase()}}return v}},"value");if(k.custom_undo_redo){t({Undo:function(){n.undoManager.undo()},Redo:function(){n.undoManager.redo()}})}}})(tinymce);(function(b){var a=b.util.Dispatcher;b.UndoManager=function(e){var c,d=0,g=[];function f(){return b.trim(e.getContent({format:"raw",no_events:1}))}return c={typing:0,onAdd:new a(c),onUndo:new a(c),onRedo:new a(c),add:function(l){var h,j=e.settings,k;l=l||{};l.content=f();k=g[d];if(k&&k.content==l.content){if(d>0||g.length==1){return null}}if(j.custom_undo_redo_levels){if(g.length>j.custom_undo_redo_levels){for(h=0;h<g.length-1;h++){g[h]=g[h+1]}g.length--;d=g.length}}l.bookmark=e.selection.getBookmark(2,true);if(d<g.length-1){if(d==0){g=[]}else{g.length=d+1}}g.push(l);d=g.length-1;c.onAdd.dispatch(c,l);e.isNotDirty=0;return l},undo:function(){var j,h;if(c.typing){c.add();c.typing=0}if(d>0){j=g[--d];e.setContent(j.content,{format:"raw"});e.selection.moveToBookmark(j.bookmark);c.onUndo.dispatch(c,j)}return j},redo:function(){var h;if(d<g.length-1){h=g[++d];e.setContent(h.content,{format:"raw"});e.selection.moveToBookmark(h.bookmark);c.onRedo.dispatch(c,h)}return h},clear:function(){g=[];d=c.typing=0},hasUndo:function(){return d>0||c.typing},hasRedo:function(){return d<g.length-1}}}})(tinymce);(function(m){var k=m.dom.Event,c=m.isIE,a=m.isGecko,b=m.isOpera,j=m.each,i=m.extend,d=true,h=false;function l(p){var q,o,n;do{if(/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(p.nodeName)){if(q){o=p.cloneNode(false);o.appendChild(q);q=o}else{q=n=p.cloneNode(false)}q.removeAttribute("id")}}while(p=p.parentNode);if(q){return{wrapper:q,inner:n}}}function g(o,p){var n=p.ownerDocument.createRange();n.setStart(o.endContainer,o.endOffset);n.setEndAfter(p);return n.cloneContents().textContent.length==0}function f(o){o=o.innerHTML;o=o.replace(/<(img|hr|table|input|select|textarea)[ \>]/gi,"-");o=o.replace(/<[^>]+>/g,"");return o.replace(/[ \u00a0\t\r\n]+/g,"")==""}function e(p,r,n){var o,q;if(f(n)){o=r.getParent(n,"ul,ol");if(!r.getParent(o.parentNode,"ul,ol")){r.split(o,n);q=r.create("p",0,'<br _mce_bogus="1" />');r.replace(q,n);p.select(q,1)}return h}return d}m.create("tinymce.ForceBlocks",{ForceBlocks:function(o){var p=this,q=o.settings,r;p.editor=o;p.dom=o.dom;r=(q.forced_root_block||"p").toLowerCase();q.element=r.toUpperCase();o.onPreInit.add(p.setup,p);p.reOpera=new RegExp("(\\u00a0| | )</"+r+">","gi");p.rePadd=new RegExp("<p( )([^>]+)><\\/p>|<p( )([^>]+)\\/>|<p( )([^>]+)>\\s+<\\/p>|<p><\\/p>|<p\\/>|<p>\\s+<\\/p>".replace(/p/g,r),"gi");p.reNbsp2BR1=new RegExp("<p( )([^>]+)>[\\s\\u00a0]+<\\/p>|<p>[\\s\\u00a0]+<\\/p>".replace(/p/g,r),"gi");p.reNbsp2BR2=new RegExp("<%p()([^>]+)>( | )<\\/%p>|<%p>( | )<\\/%p>".replace(/%p/g,r),"gi");p.reBR2Nbsp=new RegExp("<p( )([^>]+)>\\s*<br \\/>\\s*<\\/p>|<p>\\s*<br \\/>\\s*<\\/p>".replace(/p/g,r),"gi");function n(s,t){if(b){t.content=t.content.replace(p.reOpera,"</"+r+">")}t.content=t.content.replace(p.rePadd,"<"+r+"$1$2$3$4$5$6>\u00a0</"+r+">");if(!c&&!b&&t.set){t.content=t.content.replace(p.reNbsp2BR1,"<"+r+"$1$2><br /></"+r+">");t.content=t.content.replace(p.reNbsp2BR2,"<"+r+"$1$2><br /></"+r+">")}else{t.content=t.content.replace(p.reBR2Nbsp,"<"+r+"$1$2>\u00a0</"+r+">")}}o.onBeforeSetContent.add(n);o.onPostProcess.add(n);if(q.forced_root_block){o.onInit.add(p.forceRoots,p);o.onSetContent.add(p.forceRoots,p);o.onBeforeGetContent.add(p.forceRoots,p)}},setup:function(){var o=this,n=o.editor,q=n.settings,u=n.dom,p=n.selection;if(q.forced_root_block){n.onBeforeExecCommand.add(o.forceRoots,o);n.onKeyUp.add(o.forceRoots,o);n.onPreProcess.add(o.forceRoots,o)}if(q.force_br_newlines){if(c){n.onKeyPress.add(function(s,t){var v;if(t.keyCode==13&&p.getNode().nodeName!="LI"){p.setContent('<br id="__" /> ',{format:"raw"});v=u.get("__");v.removeAttribute("id");p.select(v);p.collapse();return k.cancel(t)}})}}if(q.force_p_newlines){if(!c){n.onKeyPress.add(function(s,t){if(t.keyCode==13&&!t.shiftKey&&!o.insertPara(t)){k.cancel(t)}})}else{m.addUnload(function(){o._previousFormats=0});n.onKeyPress.add(function(s,t){o._previousFormats=0;if(t.keyCode==13&&!t.shiftKey&&s.selection.isCollapsed()&&q.keep_styles){o._previousFormats=l(s.selection.getStart())}});n.onKeyUp.add(function(t,x){if(x.keyCode==13&&!x.shiftKey){var v=t.selection.getStart(),s=o._previousFormats;if(!v.hasChildNodes()){v=u.getParent(v,u.isBlock);if(v){v.innerHTML="";if(o._previousFormats){v.appendChild(s.wrapper);s.inner.innerHTML="\uFEFF"}else{v.innerHTML="\uFEFF"}p.select(v,1);t.getDoc().execCommand("Delete",false,null)}}}})}if(a){n.onKeyDown.add(function(s,t){if((t.keyCode==8||t.keyCode==46)&&!t.shiftKey){o.backspaceDelete(t,t.keyCode==8)}})}}if(m.isWebKit){function r(t){var s=p.getRng(),v,z=u.create("div",null," "),y,x=u.getViewPort(t.getWin()).h;s.insertNode(v=u.create("br"));s.setStartAfter(v);s.setEndAfter(v);p.setRng(s);if(p.getSel().focusNode==v.previousSibling){p.select(u.insertAfter(u.doc.createTextNode("\u00a0"),v));p.collapse(d)}u.insertAfter(z,v);y=u.getPos(z).y;u.remove(z);if(y>x){t.getWin().scrollTo(0,y)}}n.onKeyPress.add(function(s,t){if(t.keyCode==13&&(t.shiftKey||(q.force_br_newlines&&!u.getParent(p.getNode(),"h1,h2,h3,h4,h5,h6,ol,ul")))){r(s);k.cancel(t)}})}n.onPreProcess.add(function(s,t){j(u.select("p,h1,h2,h3,h4,h5,h6,div",t.node),function(v){if(f(v)){j(u.select("span,em,strong,b,i",t.node),function(x){if(!x.hasChildNodes()){x.appendChild(s.getDoc().createTextNode("\u00a0"));return h}})}})});if(c){if(q.element!="P"){n.onKeyPress.add(function(s,t){o.lastElm=p.getNode().nodeName});n.onKeyUp.add(function(t,v){var y,x=p.getNode(),s=t.getBody();if(s.childNodes.length===1&&x.nodeName=="P"){x=u.rename(x,q.element);p.select(x);p.collapse();t.nodeChanged()}else{if(v.keyCode==13&&!v.shiftKey&&o.lastElm!="P"){y=u.getParent(x,"p");if(y){u.rename(y,q.element);t.nodeChanged()}}}})}}},find:function(v,q,r){var p=this.editor,o=p.getDoc().createTreeWalker(v,4,null,h),u=-1;while(v=o.nextNode()){u++;if(q==0&&v==r){return u}if(q==1&&u==r){return v}}return -1},forceRoots:function(x,I){var z=this,x=z.editor,M=x.getBody(),J=x.getDoc(),P=x.selection,A=P.getSel(),B=P.getRng(),N=-2,v,G,o,p,K=-16777215;var L,q,O,F,C,u=M.childNodes,E,D,y;for(E=u.length-1;E>=0;E--){L=u[E];if(L.nodeType===1&&L.getAttribute("_mce_type")){q=null;continue}if(L.nodeType===3||(!z.dom.isBlock(L)&&L.nodeType!==8&&!/^(script|mce:script|style|mce:style)$/i.test(L.nodeName))){if(!q){if(L.nodeType!=3||/[^\s]/g.test(L.nodeValue)){if(N==-2&&B){if(!c){if(B.startContainer.nodeType==1&&(D=B.startContainer.childNodes[B.startOffset])&&D.nodeType==1){y=D.getAttribute("id");D.setAttribute("id","__mce")}else{if(x.dom.getParent(B.startContainer,function(n){return n===M})){G=B.startOffset;o=B.endOffset;N=z.find(M,0,B.startContainer);v=z.find(M,0,B.endContainer)}}}else{if(B.item){p=J.body.createTextRange();p.moveToElementText(B.item(0));B=p}p=J.body.createTextRange();p.moveToElementText(M);p.collapse(1);O=p.move("character",K)*-1;p=B.duplicate();p.collapse(1);F=p.move("character",K)*-1;p=B.duplicate();p.collapse(0);C=(p.move("character",K)*-1)-F;N=F-O;v=C}}q=x.dom.create(x.settings.forced_root_block);L.parentNode.replaceChild(q,L);q.appendChild(L)}}else{if(q.hasChildNodes()){q.insertBefore(L,q.firstChild)}else{q.appendChild(L)}}}else{q=null}}if(N!=-2){if(!c){q=M.getElementsByTagName(x.settings.element)[0];B=J.createRange();if(N!=-1){B.setStart(z.find(M,1,N),G)}else{B.setStart(q,0)}if(v!=-1){B.setEnd(z.find(M,1,v),o)}else{B.setEnd(q,0)}if(A){A.removeAllRanges();A.addRange(B)}}else{try{B=A.createRange();B.moveToElementText(M);B.collapse(1);B.moveStart("character",N);B.moveEnd("character",v);B.select()}catch(H){}}}else{if(!c&&(D=x.dom.get("__mce"))){if(y){D.setAttribute("id",y)}else{D.removeAttribute("id")}B=J.createRange();B.setStartBefore(D);B.setEndBefore(D);P.setRng(B)}}},getParentBlock:function(p){var o=this.dom;return o.getParent(p,o.isBlock)},insertPara:function(S){var G=this,x=G.editor,O=x.dom,T=x.getDoc(),X=x.settings,H=x.selection.getSel(),I=H.getRangeAt(0),W=T.body;var L,M,J,Q,P,u,p,v,A,o,E,V,q,z,K,N=O.getViewPort(x.getWin()),D,F,C;L=T.createRange();L.setStart(H.anchorNode,H.anchorOffset);L.collapse(d);M=T.createRange();M.setStart(H.focusNode,H.focusOffset);M.collapse(d);J=L.compareBoundaryPoints(L.START_TO_END,M)<0;Q=J?H.anchorNode:H.focusNode;P=J?H.anchorOffset:H.focusOffset;u=J?H.focusNode:H.anchorNode;p=J?H.focusOffset:H.anchorOffset;if(Q===u&&/^(TD|TH)$/.test(Q.nodeName)){if(Q.firstChild.nodeName=="BR"){O.remove(Q.firstChild)}if(Q.childNodes.length==0){x.dom.add(Q,X.element,null,"<br />");V=x.dom.add(Q,X.element,null,"<br />")}else{K=Q.innerHTML;Q.innerHTML="";x.dom.add(Q,X.element,null,K);V=x.dom.add(Q,X.element,null,"<br />")}I=T.createRange();I.selectNodeContents(V);I.collapse(1);x.selection.setRng(I);return h}if(Q==W&&u==W&&W.firstChild&&x.dom.isBlock(W.firstChild)){Q=u=Q.firstChild;P=p=0;L=T.createRange();L.setStart(Q,0);M=T.createRange();M.setStart(u,0)}Q=Q.nodeName=="HTML"?T.body:Q;Q=Q.nodeName=="BODY"?Q.firstChild:Q;u=u.nodeName=="HTML"?T.body:u;u=u.nodeName=="BODY"?u.firstChild:u;v=G.getParentBlock(Q);A=G.getParentBlock(u);o=v?v.nodeName:X.element;if(K=G.dom.getParent(v,"li,pre")){if(K.nodeName=="LI"){return e(x.selection,G.dom,K)}return d}if(v&&(v.nodeName=="CAPTION"||/absolute|relative|fixed/gi.test(O.getStyle(v,"position",1)))){o=X.element;v=null}if(A&&(A.nodeName=="CAPTION"||/absolute|relative|fixed/gi.test(O.getStyle(v,"position",1)))){o=X.element;A=null}if(/(TD|TABLE|TH|CAPTION)/.test(o)||(v&&o=="DIV"&&/left|right/gi.test(O.getStyle(v,"float",1)))){o=X.element;v=A=null}E=(v&&v.nodeName==o)?v.cloneNode(0):x.dom.create(o);V=(A&&A.nodeName==o)?A.cloneNode(0):x.dom.create(o);V.removeAttribute("id");if(/^(H[1-6])$/.test(o)&&g(I,v)){V=x.dom.create(X.element)}K=q=Q;do{if(K==W||K.nodeType==9||G.dom.isBlock(K)||/(TD|TABLE|TH|CAPTION)/.test(K.nodeName)){break}q=K}while((K=K.previousSibling?K.previousSibling:K.parentNode));K=z=u;do{if(K==W||K.nodeType==9||G.dom.isBlock(K)||/(TD|TABLE|TH|CAPTION)/.test(K.nodeName)){break}z=K}while((K=K.nextSibling?K.nextSibling:K.parentNode));if(q.nodeName==o){L.setStart(q,0)}else{L.setStartBefore(q)}L.setEnd(Q,P);E.appendChild(L.cloneContents()||T.createTextNode(""));try{M.setEndAfter(z)}catch(R){}M.setStart(u,p);V.appendChild(M.cloneContents()||T.createTextNode(""));I=T.createRange();if(!q.previousSibling&&q.parentNode.nodeName==o){I.setStartBefore(q.parentNode)}else{if(L.startContainer.nodeName==o&&L.startOffset==0){I.setStartBefore(L.startContainer)}else{I.setStart(L.startContainer,L.startOffset)}}if(!z.nextSibling&&z.parentNode.nodeName==o){I.setEndAfter(z.parentNode)}else{I.setEnd(M.endContainer,M.endOffset)}I.deleteContents();if(b){x.getWin().scrollTo(0,N.y)}if(E.firstChild&&E.firstChild.nodeName==o){E.innerHTML=E.firstChild.innerHTML}if(V.firstChild&&V.firstChild.nodeName==o){V.innerHTML=V.firstChild.innerHTML}if(f(E)){E.innerHTML="<br />"}function U(y,s){var r=[],Z,Y,t;y.innerHTML="";if(X.keep_styles){Y=s;do{if(/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(Y.nodeName)){Z=Y.cloneNode(h);O.setAttrib(Z,"id","");r.push(Z)}}while(Y=Y.parentNode)}if(r.length>0){for(t=r.length-1,Z=y;t>=0;t--){Z=Z.appendChild(r[t])}r[0].innerHTML=b?" ":"<br />";return r[0]}else{y.innerHTML=b?" ":"<br />"}}if(f(V)){C=U(V,u)}if(b&&parseFloat(opera.version())<9.5){I.insertNode(E);I.insertNode(V)}else{I.insertNode(V);I.insertNode(E)}V.normalize();E.normalize();function B(r){return T.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,h).nextNode()||r}I=T.createRange();I.selectNodeContents(a?B(C||V):C||V);I.collapse(1);H.removeAllRanges();H.addRange(I);D=x.dom.getPos(V).y;F=V.clientHeight;if(D<N.y||D+F>N.y+N.h){x.getWin().scrollTo(0,D<N.y?D:D-N.h+25)}return h},backspaceDelete:function(v,C){var D=this,u=D.editor,z=u.getBody(),s=u.dom,q,x=u.selection,p=x.getRng(),y=p.startContainer,q,A,B,o;if(!C&&p.collapsed&&y.nodeType==1&&p.startOffset==y.childNodes.length){o=new m.dom.TreeWalker(y.lastChild,y);for(q=y.lastChild;q;q=o.prev()){if(q.nodeType==3){p.setStart(q,q.nodeValue.length);p.collapse(true);x.setRng(p);return}}}if(y&&u.dom.isBlock(y)&&!/^(TD|TH)$/.test(y.nodeName)&&C){if(y.childNodes.length==0||(y.childNodes.length==1&&y.firstChild.nodeName=="BR")){q=y;while((q=q.previousSibling)&&!u.dom.isBlock(q)){}if(q){if(y!=z.firstChild){A=u.dom.doc.createTreeWalker(q,NodeFilter.SHOW_TEXT,null,h);while(B=A.nextNode()){q=B}p=u.getDoc().createRange();p.setStart(q,q.nodeValue?q.nodeValue.length:0);p.setEnd(q,q.nodeValue?q.nodeValue.length:0);x.setRng(p);u.dom.remove(y)}return k.cancel(v)}}}}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each,e=c.extend;c.create("tinymce.ControlManager",{ControlManager:function(f,j){var h=this,g;j=j||{};h.editor=f;h.controls={};h.onAdd=new c.util.Dispatcher(h);h.onPostRender=new c.util.Dispatcher(h);h.prefix=j.prefix||f.id+"_";h._cls={};h.onPostRender.add(function(){d(h.controls,function(i){i.postRender()})})},get:function(f){return this.controls[this.prefix+f]||this.controls[f]},setActive:function(h,f){var g=null;if(g=this.get(h)){g.setActive(f)}return g},setDisabled:function(h,f){var g=null;if(g=this.get(h)){g.setDisabled(f)}return g},add:function(g){var f=this;if(g){f.controls[g.id]=g;f.onAdd.dispatch(g,f)}return g},createControl:function(i){var h,g=this,f=g.editor;d(f.plugins,function(j){if(j.createControl){h=j.createControl(i,g);if(h){return false}}});switch(i){case"|":case"separator":return g.createSeparator()}if(!h&&f.buttons&&(h=f.buttons[i])){return g.createButton(i,h)}return g.add(h)},createDropMenu:function(f,n,h){var m=this,i=m.editor,j,g,k,l;n=e({"class":"mceDropDown",constrain:i.settings.constrain_menus},n);n["class"]=n["class"]+" "+i.getParam("skin")+"Skin";if(k=i.getParam("skin_variant")){n["class"]+=" "+i.getParam("skin")+"Skin"+k.substring(0,1).toUpperCase()+k.substring(1)}f=m.prefix+f;l=h||m._cls.dropmenu||c.ui.DropMenu;j=m.controls[f]=new l(f,n);j.onAddItem.add(function(r,q){var p=q.settings;p.title=i.getLang(p.title,p.title);if(!p.onclick){p.onclick=function(o){if(p.cmd){i.execCommand(p.cmd,p.ui||false,p.value)}}}});i.onRemove.add(function(){j.destroy()});if(c.isIE){j.onShowMenu.add(function(){i.focus();g=i.selection.getBookmark(1)});j.onHideMenu.add(function(){if(g){i.selection.moveToBookmark(g);g=0}})}return m.add(j)},createListBox:function(m,i,l){var h=this,g=h.editor,j,k,f;if(h.get(m)){return null}i.title=g.translate(i.title);i.scope=i.scope||g;if(!i.onselect){i.onselect=function(n){g.execCommand(i.cmd,i.ui||false,n||i.value)}}i=e({title:i.title,"class":"mce_"+m,scope:i.scope,control_manager:h},i);m=h.prefix+m;if(g.settings.use_native_selects){k=new c.ui.NativeListBox(m,i)}else{f=l||h._cls.listbox||c.ui.ListBox;k=new f(m,i)}h.controls[m]=k;if(c.isWebKit){k.onPostRender.add(function(p,o){a.add(o,"mousedown",function(){g.bookmark=g.selection.getBookmark(1)});a.add(o,"focus",function(){g.selection.moveToBookmark(g.bookmark);g.bookmark=null})})}if(k.hideMenu){g.onMouseDown.add(k.hideMenu,k)}return h.add(k)},createButton:function(m,i,l){var h=this,g=h.editor,j,k,f;if(h.get(m)){return null}i.title=g.translate(i.title);i.label=g.translate(i.label);i.scope=i.scope||g;if(!i.onclick&&!i.menu_button){i.onclick=function(){g.execCommand(i.cmd,i.ui||false,i.value)}}i=e({title:i.title,"class":"mce_"+m,unavailable_prefix:g.getLang("unavailable",""),scope:i.scope,control_manager:h},i);m=h.prefix+m;if(i.menu_button){f=l||h._cls.menubutton||c.ui.MenuButton;k=new f(m,i);g.onMouseDown.add(k.hideMenu,k)}else{f=h._cls.button||c.ui.Button;k=new f(m,i)}return h.add(k)},createMenuButton:function(h,f,g){f=f||{};f.menu_button=1;return this.createButton(h,f,g)},createSplitButton:function(m,i,l){var h=this,g=h.editor,j,k,f;if(h.get(m)){return null}i.title=g.translate(i.title);i.scope=i.scope||g;if(!i.onclick){i.onclick=function(n){g.execCommand(i.cmd,i.ui||false,n||i.value)}}if(!i.onselect){i.onselect=function(n){g.execCommand(i.cmd,i.ui||false,n||i.value)}}i=e({title:i.title,"class":"mce_"+m,scope:i.scope,control_manager:h},i);m=h.prefix+m;f=l||h._cls.splitbutton||c.ui.SplitButton;k=h.add(new f(m,i));g.onMouseDown.add(k.hideMenu,k);return k},createColorSplitButton:function(f,n,h){var l=this,j=l.editor,i,k,m,g;if(l.get(f)){return null}n.title=j.translate(n.title);n.scope=n.scope||j;if(!n.onclick){n.onclick=function(o){if(c.isIE){g=j.selection.getBookmark(1)}j.execCommand(n.cmd,n.ui||false,o||n.value)}}if(!n.onselect){n.onselect=function(o){j.execCommand(n.cmd,n.ui||false,o||n.value)}}n=e({title:n.title,"class":"mce_"+f,menu_class:j.getParam("skin")+"Skin",scope:n.scope,more_colors_title:j.getLang("more_colors")},n);f=l.prefix+f;m=h||l._cls.colorsplitbutton||c.ui.ColorSplitButton;k=new m(f,n);j.onMouseDown.add(k.hideMenu,k);j.onRemove.add(function(){k.destroy()});if(c.isIE){k.onShowMenu.add(function(){j.focus();g=j.selection.getBookmark(1)});k.onHideMenu.add(function(){if(g){j.selection.moveToBookmark(g);g=0}})}return l.add(k)},createToolbar:function(k,h,j){var i,g=this,f;k=g.prefix+k;f=j||g._cls.toolbar||c.ui.Toolbar;i=new f(k,h);if(g.get(k)){return null}return g.add(i)},createSeparator:function(g){var f=g||this._cls.separator||c.ui.Separator;return new f()},setControlType:function(g,f){return this._cls[g.toLowerCase()]=f},destroy:function(){d(this.controls,function(f){f.destroy()});this.controls=null}})})(tinymce);(function(d){var a=d.util.Dispatcher,e=d.each,c=d.isIE,b=d.isOpera;d.create("tinymce.WindowManager",{WindowManager:function(f){var g=this;g.editor=f;g.onOpen=new a(g);g.onClose=new a(g);g.params={};g.features={}},open:function(z,h){var v=this,k="",n,m,i=v.editor.settings.dialog_type=="modal",q,o,j,g=d.DOM.getViewPort(),r;z=z||{};h=h||{};o=b?g.w:screen.width;j=b?g.h:screen.height;z.name=z.name||"mc_"+new Date().getTime();z.width=parseInt(z.width||320);z.height=parseInt(z.height||240);z.resizable=true;z.left=z.left||parseInt(o/2)-(z.width/2);z.top=z.top||parseInt(j/2)-(z.height/2);h.inline=false;h.mce_width=z.width;h.mce_height=z.height;h.mce_auto_focus=z.auto_focus;if(i){if(c){z.center=true;z.help=false;z.dialogWidth=z.width+"px";z.dialogHeight=z.height+"px";z.scroll=z.scrollbars||false}}e(z,function(p,f){if(d.is(p,"boolean")){p=p?"yes":"no"}if(!/^(name|url)$/.test(f)){if(c&&i){k+=(k?";":"")+f+":"+p}else{k+=(k?",":"")+f+"="+p}}});v.features=z;v.params=h;v.onOpen.dispatch(v,z,h);r=z.url||z.file;r=d._addVer(r);try{if(c&&i){q=1;window.showModalDialog(r,window,k)}else{q=window.open(r,z.name,k)}}catch(l){}if(!q){alert(v.editor.getLang("popup_blocked"))}},close:function(f){f.close();this.onClose.dispatch(this)},createInstance:function(i,h,g,m,l,k){var j=d.resolve(i);return new j(h,g,m,l,k)},confirm:function(h,f,i,g){g=g||window;f.call(i||this,g.confirm(this._decode(this.editor.getLang(h,h))))},alert:function(h,f,j,g){var i=this;g=g||window;g.alert(i._decode(i.editor.getLang(h,h)));if(f){f.call(j||i)}},resizeBy:function(f,g,h){h.resizeBy(f,g)},_decode:function(f){return d.DOM.decode(f).replace(/\\n/g,"\n")}})}(tinymce));(function(a){function b(){var d={},c={},e={};function f(j,i,h,g){if(typeof(i)=="string"){i=[i]}a.each(i,function(k){j[k.toLowerCase()]={func:h,scope:g}})}a.extend(this,{add:function(i,h,g){f(d,i,h,g)},addQueryStateHandler:function(i,h,g){f(c,i,h,g)},addQueryValueHandler:function(i,h,g){f(e,i,h,g)},execCommand:function(h,k,j,i,g){if(k=d[k.toLowerCase()]){if(k.func.call(h||k.scope,j,i,g)!==false){return true}}},queryCommandValue:function(){if(cmd=e[cmd.toLowerCase()]){return cmd.func.call(scope||cmd.scope,ui,value,args)}},queryCommandState:function(){if(cmd=c[cmd.toLowerCase()]){return cmd.func.call(scope||cmd.scope,ui,value,args)}}})}a.GlobalCommands=new b()})(tinymce);(function(a){a.Formatter=function(T){var K={},M=a.each,c=T.dom,p=T.selection,s=a.dom.TreeWalker,I=new a.dom.RangeUtils(c),d=T.schema.isValid,E=c.isBlock,k=T.settings.forced_root_block,r=c.nodeIndex,D="\uFEFF",e=/^(src|href|style)$/,Q=false,A=true,o,N={apply:[],remove:[]};function y(U){return U instanceof Array}function l(V,U){return c.getParents(V,U,c.getRoot())}function b(U){return U.nodeType===1&&(U.face==="mceinline"||U.style.fontFamily==="mceinline")}function P(U){return U?K[U]:K}function j(U,V){if(U){if(typeof(U)!=="string"){M(U,function(X,W){j(W,X)})}else{V=V.length?V:[V];M(V,function(W){if(W.deep===o){W.deep=!W.selector}if(W.split===o){W.split=!W.selector||W.inline}if(W.remove===o&&W.selector&&!W.inline){W.remove="none"}if(W.selector&&W.inline){W.mixed=true;W.block_expand=true}if(typeof(W.classes)==="string"){W.classes=W.classes.split(/\s+/)}});K[U]=V}}}function R(W,ac,Y){var Z=P(W),ad=Z[0],ab,V,aa;function X(ag){var af=ag.startContainer,aj=ag.startOffset,ai,ah;if(af.nodeType==1||af.nodeValue===""){af=af.nodeType==1?af.childNodes[aj]:af;if(af){ai=new s(af,af.parentNode);for(ah=ai.current();ah;ah=ai.next()){if(ah.nodeType==3&&!f(ah)){ag.setStart(ah,0);break}}}}return ag}function U(ag,af){af=af||ad;if(ag){M(af.styles,function(ai,ah){c.setStyle(ag,ah,q(ai,ac))});M(af.attributes,function(ai,ah){c.setAttrib(ag,ah,q(ai,ac))});M(af.classes,function(ah){ah=q(ah,ac);if(!c.hasClass(ag,ah)){c.addClass(ag,ah)}})}}function ae(ag){var af=[],ai,ah;ai=ad.inline||ad.block;ah=c.create(ai);U(ah);I.walk(ag,function(aj){var ak;function al(am){var ap=am.nodeName.toLowerCase(),ao=am.parentNode.nodeName.toLowerCase(),an;if(g(ap,"br")){ak=0;if(ad.block){c.remove(am)}return}if(ad.wrapper&&v(am,W,ac)){ak=0;return}if(ad.block&&!ad.wrapper&&F(ap)){am=c.rename(am,ai);U(am);af.push(am);ak=0;return}if(ad.selector){M(Z,function(aq){if(c.is(am,aq.selector)&&!b(am)){U(am,aq);an=true}});if(!ad.inline||an){ak=0;return}}if(d(ai,ap)&&d(ao,ai)){if(!ak){ak=ah.cloneNode(Q);am.parentNode.insertBefore(ak,am);af.push(ak)}ak.appendChild(am)}else{ak=0;M(a.grep(am.childNodes),al);ak=0}}M(aj,al)});M(af,function(al){var aj;function am(ao){var an=0;M(ao.childNodes,function(ap){if(!f(ap)&&!G(ap)){an++}});return an}function ak(an){var ap,ao;M(an.childNodes,function(aq){if(aq.nodeType==1&&!G(aq)&&!b(aq)){ap=aq;return Q}});if(ap&&h(ap,ad)){ao=ap.cloneNode(Q);U(ao);c.replace(ao,an,A);c.remove(ap,1)}return ao||an}aj=am(al);if(aj===0){c.remove(al,1);return}if(ad.inline||ad.wrapper){if(!ad.exact&&aj===1){al=ak(al)}M(Z,function(an){M(c.select(an.inline,al),function(ao){S(an,ac,ao,an.exact?ao:null)})});if(v(al.parentNode,W,ac)){c.remove(al,1);al=0;return A}if(ad.merge_with_parents){c.getParent(al.parentNode,function(an){if(v(an,W,ac)){c.remove(al,1);al=0;return A}})}if(al){al=t(B(al),al);al=t(al,B(al,A))}}})}if(ad){if(Y){V=c.createRng();V.setStartBefore(Y);V.setEndAfter(Y);ae(n(V,Z))}else{if(!p.isCollapsed()||!ad.inline){ab=p.getBookmark();ae(n(p.getRng(A),Z));p.moveToBookmark(ab);p.setRng(X(p.getRng(A)));T.nodeChanged()}else{O("apply",W,ac)}}}}function z(W,af,Z){var aa=P(W),ah=aa[0],ae,ad,V;function Y(ak){var aj=ak.startContainer,ap=ak.startOffset,ao,an,al,am;if(aj.nodeType==3&&ap>=aj.nodeValue.length-1){aj=aj.parentNode;ap=r(aj)+1}if(aj.nodeType==1){al=aj.childNodes;aj=al[Math.min(ap,al.length-1)];ao=new s(aj);if(ap>al.length-1){ao.next()}for(an=ao.current();an;an=ao.next()){if(an.nodeType==3&&!f(an)){am=c.create("a",null,D);an.parentNode.insertBefore(am,an);ak.setStart(an,0);p.setRng(ak);c.remove(am);return}}}}function X(am){var al,ak,aj;al=a.grep(am.childNodes);for(ak=0,aj=aa.length;ak<aj;ak++){if(S(aa[ak],af,am,am)){break}}if(ah.deep){for(ak=0,aj=al.length;ak<aj;ak++){X(al[ak])}}}function ab(aj){var ak;M(l(aj.parentNode).reverse(),function(al){var am;if(!ak&&al.id!="_start"&&al.id!="_end"){am=v(al,W,af);if(am&&am.split!==false){ak=al}}});return ak}function U(am,aj,ao,ar){var at,aq,ap,al,an,ak;if(am){ak=am.parentNode;for(at=aj.parentNode;at&&at!=ak;at=at.parentNode){aq=at.cloneNode(Q);for(an=0;an<aa.length;an++){if(S(aa[an],af,aq,aq)){aq=0;break}}if(aq){if(ap){aq.appendChild(ap)}if(!al){al=aq}ap=aq}}if(ar&&(!ah.mixed||!E(am))){aj=c.split(am,aj)}if(ap){ao.parentNode.insertBefore(ap,ao);al.appendChild(ao)}}return aj}function ag(aj){return U(ab(aj),aj,aj,true)}function ac(al){var ak=c.get(al?"_start":"_end"),aj=ak[al?"firstChild":"lastChild"];if(G(aj)){aj=aj[al?"firstChild":"lastChild"]}c.remove(ak,true);return aj}function ai(aj){var ak,al;aj=n(aj,aa,A);if(ah.split){ak=H(aj,A);al=H(aj);if(ak!=al){ak=L(ak,"span",{id:"_start",_mce_type:"bookmark"});al=L(al,"span",{id:"_end",_mce_type:"bookmark"});ag(ak);ag(al);ak=ac(A);al=ac()}else{ak=al=ag(ak)}aj.startContainer=ak.parentNode;aj.startOffset=r(ak);aj.endContainer=al.parentNode;aj.endOffset=r(al)+1}I.walk(aj,function(am){M(am,function(an){X(an)})})}if(Z){V=c.createRng();V.setStartBefore(Z);V.setEndAfter(Z);ai(V);return}if(!p.isCollapsed()||!ah.inline){ae=p.getBookmark();ai(p.getRng(A));p.moveToBookmark(ae);if(i(W,af,p.getStart())){Y(p.getRng(true))}T.nodeChanged()}else{O("remove",W,af)}}function C(U,W,V){if(i(U,W,V)){z(U,W,V)}else{R(U,W,V)}}function v(V,U,aa,Y){var W=P(U),ab,Z,X;function ac(ag,ai,aj){var af,ah,ad=ai[aj],ae;if(ad){if(ad.length===o){for(af in ad){if(ad.hasOwnProperty(af)){if(aj==="attributes"){ah=c.getAttrib(ag,af)}else{ah=J(ag,af)}if(Y&&!ah&&!ai.exact){return}if((!Y||ai.exact)&&!g(ah,q(ad[af],aa))){return}}}}else{for(ae=0;ae<ad.length;ae++){if(aj==="attributes"?c.getAttrib(ag,ad[ae]):J(ag,ad[ae])){return ai}}}}return ai}if(W&&V){for(Z=0;Z<W.length;Z++){ab=W[Z];if(h(V,ab)&&ac(V,ab,"attributes")&&ac(V,ab,"styles")){if(X=ab.classes){for(Z=0;Z<X.length;Z++){if(!c.hasClass(V,X[Z])){return}}}return ab}}}}function i(W,Z,Y){var V,X;function U(aa){aa=c.getParent(aa,function(ab){return !!v(ab,W,Z,true)});return v(aa,W,Z)}if(Y){return U(Y)}if(p.isCollapsed()){for(X=N.apply.length-1;X>=0;X--){if(N.apply[X].name==W){return true}}for(X=N.remove.length-1;X>=0;X--){if(N.remove[X].name==W){return false}}return U(p.getNode())}Y=p.getNode();if(U(Y)){return A}V=p.getStart();if(V!=Y){if(U(V)){return A}}return Q}function u(ab,aa){var Y,Z=[],X={},W,V,U;if(p.isCollapsed()){for(V=0;V<ab.length;V++){for(W=N.remove.length-1;W>=0;W--){U=ab[V];if(N.remove[W].name==U){X[U]=true;break}}}for(W=N.apply.length-1;W>=0;W--){for(V=0;V<ab.length;V++){U=ab[V];if(!X[U]&&N.apply[W].name==U){X[U]=true;Z.push(U)}}}}Y=p.getStart();c.getParent(Y,function(ae){var ad,ac;for(ad=0;ad<ab.length;ad++){ac=ab[ad];if(!X[ac]&&v(ae,ac,aa)){X[ac]=true;Z.push(ac)}}});return Z}function x(Y){var aa=P(Y),X,W,Z,V,U;if(aa){X=p.getStart();W=l(X);for(V=aa.length-1;V>=0;V--){U=aa[V].selector;if(!U){return A}for(Z=W.length-1;Z>=0;Z--){if(c.is(W[Z],U)){return A}}}}return Q}a.extend(this,{get:P,register:j,apply:R,remove:z,toggle:C,match:i,matchAll:u,matchNode:v,canApply:x});function h(U,V){if(g(U,V.inline)){return A}if(g(U,V.block)){return A}if(V.selector){return c.is(U,V.selector)}}function g(V,U){V=V||"";U=U||"";V=""+(V.nodeName||V);U=""+(U.nodeName||U);return V.toLowerCase()==U.toLowerCase()}function J(V,U){var W=c.getStyle(V,U);if(U=="color"||U=="backgroundColor"){W=c.toHex(W)}if(U=="fontWeight"&&W==700){W="bold"}return""+W}function q(U,V){if(typeof(U)!="string"){U=U(V)}else{if(V){U=U.replace(/%(\w+)/g,function(X,W){return V[W]||X})}}return U}function f(U){return U&&U.nodeType===3&&/^([\s\r\n]+|)$/.test(U.nodeValue)}function L(W,V,U){var X=c.create(V,U);W.parentNode.insertBefore(X,W);X.appendChild(W);return X}function n(U,ac,X){var W=U.startContainer,Z=U.startOffset,af=U.endContainer,aa=U.endOffset,ae,ab;function ad(ai,aj,ag,ah){var ak,al;ah=ah||c.getRoot();for(;;){ak=ai.parentNode;if(ak==ah||(!ac[0].block_expand&&E(ak))){return ai}for(ae=ak[aj];ae&&ae!=ai;ae=ae[ag]){if(ae.nodeType==1&&!G(ae)){return ai}if(ae.nodeType==3&&!f(ae)){return ai}}ai=ai.parentNode}return ai}if(W.nodeType==1&&W.hasChildNodes()){ab=W.childNodes.length-1;W=W.childNodes[Z>ab?ab:Z];if(W.nodeType==3){Z=0}}if(af.nodeType==1&&af.hasChildNodes()){ab=af.childNodes.length-1;af=af.childNodes[aa>ab?ab:aa-1];if(af.nodeType==3){aa=af.nodeValue.length}}if(G(W.parentNode)){W=W.parentNode}if(G(W)){W=W.nextSibling||W}if(G(af.parentNode)){af=af.parentNode}if(G(af)){af=af.previousSibling||af}if(ac[0].inline||ac[0].block_expand){W=ad(W,"firstChild","nextSibling");af=ad(af,"lastChild","previousSibling")}if(ac[0].selector&&ac[0].expand!==Q&&!ac[0].inline){function Y(ah,ag){var ai,aj,ak;if(ah.nodeType==3&&ah.nodeValue.length==0&&ah[ag]){ah=ah[ag]}ai=l(ah);for(aj=0;aj<ai.length;aj++){for(ak=0;ak<ac.length;ak++){if(c.is(ai[aj],ac[ak].selector)){return ai[aj]}}}return ah}W=Y(W,"previousSibling");af=Y(af,"nextSibling")}if(ac[0].block||ac[0].selector){function V(ah,ag,aj){var ai;if(!ac[0].wrapper){ai=c.getParent(ah,ac[0].block)}if(!ai){ai=c.getParent(ah.nodeType==3?ah.parentNode:ah,E)}if(ai&&ac[0].wrapper){ai=l(ai,"ul,ol").reverse()[0]||ai}if(!ai){ai=ah;while(ai[ag]&&!E(ai[ag])){ai=ai[ag];if(g(ai,"br")){break}}}return ai||ah}W=V(W,"previousSibling");af=V(af,"nextSibling");if(ac[0].block){if(!E(W)){W=ad(W,"firstChild","nextSibling")}if(!E(af)){af=ad(af,"lastChild","previousSibling")}}}if(W.nodeType==1){Z=r(W);W=W.parentNode}if(af.nodeType==1){aa=r(af)+1;af=af.parentNode}return{startContainer:W,startOffset:Z,endContainer:af,endOffset:aa}}function S(aa,Z,X,U){var W,V,Y;if(!h(X,aa)){return Q}if(aa.remove!="all"){M(aa.styles,function(ac,ab){ac=q(ac,Z);if(typeof(ab)==="number"){ab=ac;U=0}if(!U||g(J(U,ab),ac)){c.setStyle(X,ab,"")}Y=1});if(Y&&c.getAttrib(X,"style")==""){X.removeAttribute("style");X.removeAttribute("_mce_style")}M(aa.attributes,function(ad,ab){var ac;ad=q(ad,Z);if(typeof(ab)==="number"){ab=ad;U=0}if(!U||g(c.getAttrib(U,ab),ad)){if(ab=="class"){ad=c.getAttrib(X,ab);if(ad){ac="";M(ad.split(/\s+/),function(ae){if(/mce\w+/.test(ae)){ac+=(ac?" ":"")+ae}});if(ac){c.setAttrib(X,ab,ac);return}}}if(ab=="class"){X.removeAttribute("className")}if(e.test(ab)){X.removeAttribute("_mce_"+ab)}X.removeAttribute(ab)}});M(aa.classes,function(ab){ab=q(ab,Z);if(!U||c.hasClass(U,ab)){c.removeClass(X,ab)}});V=c.getAttribs(X);for(W=0;W<V.length;W++){if(V[W].nodeName.indexOf("_")!==0){return Q}}}if(aa.remove!="none"){m(X,aa);return A}}function m(W,X){var U=W.parentNode,V;if(X.block){if(!k){function Y(aa,Z,ab){aa=B(aa,Z,ab);return !aa||(aa.nodeName=="BR"||E(aa))}if(E(W)&&!E(U)){if(!Y(W,Q)&&!Y(W.firstChild,A,1)){W.insertBefore(c.create("br"),W.firstChild)}if(!Y(W,A)&&!Y(W.lastChild,Q,1)){W.appendChild(c.create("br"))}}}else{if(U==c.getRoot()){if(!X.list_block||!g(W,X.list_block)){M(a.grep(W.childNodes),function(Z){if(d(k,Z.nodeName.toLowerCase())){if(!V){V=L(Z,k)}else{V.appendChild(Z)}}else{V=0}})}}}}if(X.selector&&X.inline&&!g(X.inline,W)){return}c.remove(W,1)}function B(V,U,W){if(V){U=U?"nextSibling":"previousSibling";for(V=W?V:V[U];V;V=V[U]){if(V.nodeType==1||!f(V)){return V}}}}function G(U){return U&&U.nodeType==1&&U.getAttribute("_mce_type")=="bookmark"}function t(Y,X){var U,W,V;function aa(ad,ac){if(ad.nodeName!=ac.nodeName){return Q}function ab(af){var ag={};M(c.getAttribs(af),function(ah){var ai=ah.nodeName.toLowerCase();if(ai.indexOf("_")!==0&&ai!=="style"){ag[ai]=c.getAttrib(af,ai)}});return ag}function ae(ai,ah){var ag,af;for(af in ai){if(ai.hasOwnProperty(af)){ag=ah[af];if(ag===o){return Q}if(ai[af]!=ag){return Q}delete ah[af]}}for(af in ah){if(ah.hasOwnProperty(af)){return Q}}return A}if(!ae(ab(ad),ab(ac))){return Q}if(!ae(c.parseStyle(c.getAttrib(ad,"style")),c.parseStyle(c.getAttrib(ac,"style")))){return Q}return A}if(Y&&X){function Z(ac,ab){for(W=ac;W;W=W[ab]){if(W.nodeType==3&&!f(W)){return ac}if(W.nodeType==1&&!G(W)){return W}}return ac}Y=Z(Y,"previousSibling");X=Z(X,"nextSibling");if(aa(Y,X)){for(W=Y.nextSibling;W&&W!=X;){V=W;W=W.nextSibling;Y.appendChild(V)}c.remove(X);M(a.grep(X.childNodes),function(ab){Y.appendChild(ab)});return Y}}return X}function F(U){return/^(h[1-6]|p|div|pre|address|dl|dt|dd)$/.test(U)}function H(V,Y){var U,X,W;U=V[Y?"startContainer":"endContainer"];X=V[Y?"startOffset":"endOffset"];if(U.nodeType==1){W=U.childNodes.length-1;if(!Y&&X){X--}U=U.childNodes[X>W?W:X]}return U}function O(Z,V,Y){var W,U=N[Z],aa=N[Z=="apply"?"remove":"apply"];function ab(){return N.apply.length||N.remove.length}function X(){N.apply=[];N.remove=[]}function ac(ad){M(N.apply.reverse(),function(ae){R(ae.name,ae.vars,ad)});M(N.remove.reverse(),function(ae){z(ae.name,ae.vars,ad)});c.remove(ad,1);X()}for(W=U.length-1;W>=0;W--){if(U[W].name==V){return}}U.push({name:V,vars:Y});for(W=aa.length-1;W>=0;W--){if(aa[W].name==V){aa.splice(W,1)}}if(ab()){T.getDoc().execCommand("FontName",false,"mceinline");N.lastRng=p.getRng();M(c.select("font,span"),function(ae){var ad;if(b(ae)){ad=p.getBookmark();ac(ae);p.moveToBookmark(ad);T.nodeChanged()}});if(!N.isListening&&ab()){N.isListening=true;M("onKeyDown,onKeyUp,onKeyPress,onMouseUp".split(","),function(ad){T[ad].addToTop(function(ae,af){if(ab()&&!a.dom.RangeUtils.compareRanges(N.lastRng,p.getRng())){M(c.select("font,span"),function(ah){var ai,ag;if(b(ah)){ai=ah.firstChild;if(ai){ac(ah);ag=c.createRng();ag.setStart(ai,ai.nodeValue.length);ag.setEnd(ai,ai.nodeValue.length);p.setRng(ag);ae.nodeChanged()}else{c.remove(ah)}}});if(af.type=="keyup"||af.type=="mouseup"){X()}}})})}}}}})(tinymce);tinymce.onAddEditor.add(function(e,a){var d,h,g,c=a.settings;if(c.inline_styles){h=e.explode(c.font_size_style_values);function b(j,i){g.replace(g.create("span",{style:i}),j,1)}d={font:function(j,i){b(i,{backgroundColor:i.style.backgroundColor,color:i.color,fontFamily:i.face,fontSize:h[parseInt(i.size)-1]})},u:function(j,i){b(i,{textDecoration:"underline"})},strike:function(j,i){b(i,{textDecoration:"line-through"})}};function f(i,j){g=i.dom;if(c.convert_fonts_to_spans){e.each(g.select("font,u,strike",j.node),function(k){d[k.nodeName.toLowerCase()](a.dom,k)})}}a.onPreProcess.add(f);a.onInit.add(function(){a.selection.onSetContent.add(f)})}}); |
| \ No newline at end of file | |
public/javascripts/cms/3rdparty/tiny_mce/tiny_mce_popup.js
+5
-0
| @@ | @@ -0,0 +1,5 @@ |
| + | |
| + | // Uncomment and change this document.domain value if you are loading the script cross subdomains |
| + | // document.domain = 'moxiecode.com'; |
| + | |
| + | var tinymce=null,tinyMCEPopup,tinyMCE;tinyMCEPopup={init:function(){var b=this,a,c;a=b.getWin();tinymce=a.tinymce;tinyMCE=a.tinyMCE;b.editor=tinymce.EditorManager.activeEditor;b.params=b.editor.windowManager.params;b.features=b.editor.windowManager.features;b.dom=b.editor.windowManager.createInstance("tinymce.dom.DOMUtils",document);if(b.features.popup_css!==false){b.dom.loadCSS(b.features.popup_css||b.editor.settings.popup_css)}b.listeners=[];b.onInit={add:function(e,d){b.listeners.push({func:e,scope:d})}};b.isWindow=!b.getWindowArg("mce_inline");b.id=b.getWindowArg("mce_window_id");b.editor.windowManager.onOpen.dispatch(b.editor.windowManager,window)},getWin:function(){return(!window.frameElement&&window.dialogArguments)||opener||parent||top},getWindowArg:function(c,b){var a=this.params[c];return tinymce.is(a)?a:b},getParam:function(b,a){return this.editor.getParam(b,a)},getLang:function(b,a){return this.editor.getLang(b,a)},execCommand:function(d,c,e,b){b=b||{};b.skip_focus=1;this.restoreSelection();return this.editor.execCommand(d,c,e,b)},resizeToInnerSize:function(){var a=this;setTimeout(function(){var b=a.dom.getViewPort(window);a.editor.windowManager.resizeBy(a.getWindowArg("mce_width")-b.w,a.getWindowArg("mce_height")-b.h,a.id||window)},0)},executeOnLoad:function(s){this.onInit.add(function(){eval(s)})},storeSelection:function(){this.editor.windowManager.bookmark=tinyMCEPopup.editor.selection.getBookmark(1)},restoreSelection:function(){var a=tinyMCEPopup;if(!a.isWindow&&tinymce.isIE){a.editor.selection.moveToBookmark(a.editor.windowManager.bookmark)}},requireLangPack:function(){var b=this,a=b.getWindowArg("plugin_url")||b.getWindowArg("theme_url");if(a&&b.editor.settings.language&&b.features.translate_i18n!==false){a+="/langs/"+b.editor.settings.language+"_dlg.js";if(!tinymce.ScriptLoader.isDone(a)){document.write('<script type="text/javascript" src="'+tinymce._addVer(a)+'"><\/script>');tinymce.ScriptLoader.markDone(a)}}},pickColor:function(b,a){this.execCommand("mceColorPicker",true,{color:document.getElementById(a).value,func:function(e){document.getElementById(a).value=e;try{document.getElementById(a).onchange()}catch(d){}}})},openBrowser:function(a,c,b){tinyMCEPopup.restoreSelection();this.editor.execCallback("file_browser_callback",a,document.getElementById(a).value,c,window)},confirm:function(b,a,c){this.editor.windowManager.confirm(b,a,c,window)},alert:function(b,a,c){this.editor.windowManager.alert(b,a,c,window)},close:function(){var a=this;function b(){a.editor.windowManager.close(window);tinymce=tinyMCE=a.editor=a.params=a.dom=a.dom.doc=null}if(tinymce.isOpera){a.getWin().setTimeout(b,0)}else{b()}},_restoreSelection:function(){var a=window.event.srcElement;if(a.nodeName=="INPUT"&&(a.type=="submit"||a.type=="button")){tinyMCEPopup.restoreSelection()}},_onDOMLoaded:function(){var b=tinyMCEPopup,d=document.title,e,c,a;if(b.domLoaded){return}b.domLoaded=1;if(b.features.translate_i18n!==false){c=document.body.innerHTML;if(tinymce.isIE){c=c.replace(/ (value|title|alt)=([^"][^\s>]+)/gi,' $1="$2"')}document.dir=b.editor.getParam("directionality","");if((a=b.editor.translate(c))&&a!=c){document.body.innerHTML=a}if((a=b.editor.translate(d))&&a!=d){document.title=d=a}}document.body.style.display="";if(tinymce.isIE){document.attachEvent("onmouseup",tinyMCEPopup._restoreSelection);b.dom.add(b.dom.select("head")[0],"base",{target:"_self"})}b.restoreSelection();b.resizeToInnerSize();if(!b.isWindow){b.editor.windowManager.setTitle(window,d)}else{window.focus()}if(!tinymce.isIE&&!b.isWindow){tinymce.dom.Event._add(document,"focus",function(){b.editor.windowManager.focus(b.id)})}tinymce.each(b.dom.select("select"),function(f){f.onkeydown=tinyMCEPopup._accessHandler});tinymce.each(b.listeners,function(f){f.func.call(f.scope,b.editor)});if(b.getWindowArg("mce_auto_focus",true)){window.focus();tinymce.each(document.forms,function(g){tinymce.each(g.elements,function(f){if(b.dom.hasClass(f,"mceFocus")&&!f.disabled){f.focus();return false}})})}document.onkeyup=tinyMCEPopup._closeWinKeyHandler},_accessHandler:function(a){a=a||window.event;if(a.keyCode==13||a.keyCode==32){a=a.target||a.srcElement;if(a.onchange){a.onchange()}return tinymce.dom.Event.cancel(a)}},_closeWinKeyHandler:function(a){a=a||window.event;if(a.keyCode==27){tinyMCEPopup.close()}},_wait:function(){if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);tinyMCEPopup._onDOMLoaded()}});if(document.documentElement.doScroll&&window==window.top){(function(){if(tinyMCEPopup.domLoaded){return}try{document.documentElement.doScroll("left")}catch(a){setTimeout(arguments.callee,0);return}tinyMCEPopup._onDOMLoaded()})()}document.attachEvent("onload",tinyMCEPopup._onDOMLoaded)}else{if(document.addEventListener){window.addEventListener("DOMContentLoaded",tinyMCEPopup._onDOMLoaded,false);window.addEventListener("load",tinyMCEPopup._onDOMLoaded,false)}}}};tinyMCEPopup.init();tinyMCEPopup._wait(); |
| \ No newline at end of file | |
public/javascripts/cms/3rdparty/tiny_mce/tiny_mce_src.js
+13346
-0
| @@ | @@ -0,0 +1,13346 @@ |
| + | (function(win) { |
| + | var whiteSpaceRe = /^\s*|\s*$/g, |
| + | undefined; |
| + | |
| + | var tinymce = { |
| + | majorVersion : '3', |
| + | |
| + | minorVersion : '3.8', |
| + | |
| + | releaseDate : '2010-06-30', |
| + | |
| + | _init : function() { |
| + | var t = this, d = document, na = navigator, ua = na.userAgent, i, nl, n, base, p, v; |
| + | |
| + | t.isOpera = win.opera && opera.buildNumber; |
| + | |
| + | t.isWebKit = /WebKit/.test(ua); |
| + | |
| + | t.isIE = !t.isWebKit && !t.isOpera && (/MSIE/gi).test(ua) && (/Explorer/gi).test(na.appName); |
| + | |
| + | t.isIE6 = t.isIE && /MSIE [56]/.test(ua); |
| + | |
| + | t.isGecko = !t.isWebKit && /Gecko/.test(ua); |
| + | |
| + | t.isMac = ua.indexOf('Mac') != -1; |
| + | |
| + | t.isAir = /adobeair/i.test(ua); |
| + | |
| + | t.isIDevice = /(iPad|iPhone)/.test(ua); |
| + | |
| + | // TinyMCE .NET webcontrol might be setting the values for TinyMCE |
| + | if (win.tinyMCEPreInit) { |
| + | t.suffix = tinyMCEPreInit.suffix; |
| + | t.baseURL = tinyMCEPreInit.base; |
| + | t.query = tinyMCEPreInit.query; |
| + | return; |
| + | } |
| + | |
| + | // Get suffix and base |
| + | t.suffix = ''; |
| + | |
| + | // If base element found, add that infront of baseURL |
| + | nl = d.getElementsByTagName('base'); |
| + | for (i=0; i<nl.length; i++) { |
| + | if (v = nl[i].href) { |
| + | // Host only value like http://site.com or http://site.com:8008 |
| + | if (/^https?:\/\/[^\/]+$/.test(v)) |
| + | v += '/'; |
| + | |
| + | base = v ? v.match(/.*\//)[0] : ''; // Get only directory |
| + | } |
| + | } |
| + | |
| + | function getBase(n) { |
| + | if (n.src && /tiny_mce(|_gzip|_jquery|_prototype)(_dev|_src)?.js/.test(n.src)) { |
| + | if (/_(src|dev)\.js/g.test(n.src)) |
| + | t.suffix = '_src'; |
| + | |
| + | if ((p = n.src.indexOf('?')) != -1) |
| + | t.query = n.src.substring(p + 1); |
| + | |
| + | t.baseURL = n.src.substring(0, n.src.lastIndexOf('/')); |
| + | |
| + | // If path to script is relative and a base href was found add that one infront |
| + | // the src property will always be an absolute one on non IE browsers and IE 8 |
| + | // so this logic will basically only be executed on older IE versions |
| + | if (base && t.baseURL.indexOf('://') == -1 && t.baseURL.indexOf('/') !== 0) |
| + | t.baseURL = base + t.baseURL; |
| + | |
| + | return t.baseURL; |
| + | } |
| + | |
| + | return null; |
| + | }; |
| + | |
| + | // Check document |
| + | nl = d.getElementsByTagName('script'); |
| + | for (i=0; i<nl.length; i++) { |
| + | if (getBase(nl[i])) |
| + | return; |
| + | } |
| + | |
| + | // Check head |
| + | n = d.getElementsByTagName('head')[0]; |
| + | if (n) { |
| + | nl = n.getElementsByTagName('script'); |
| + | for (i=0; i<nl.length; i++) { |
| + | if (getBase(nl[i])) |
| + | return; |
| + | } |
| + | } |
| + | |
| + | return; |
| + | }, |
| + | |
| + | is : function(o, t) { |
| + | if (!t) |
| + | return o !== undefined; |
| + | |
| + | if (t == 'array' && (o.hasOwnProperty && o instanceof Array)) |
| + | return true; |
| + | |
| + | return typeof(o) == t; |
| + | }, |
| + | |
| + | each : function(o, cb, s) { |
| + | var n, l; |
| + | |
| + | if (!o) |
| + | return 0; |
| + | |
| + | s = s || o; |
| + | |
| + | if (o.length !== undefined) { |
| + | // Indexed arrays, needed for Safari |
| + | for (n=0, l = o.length; n < l; n++) { |
| + | if (cb.call(s, o[n], n, o) === false) |
| + | return 0; |
| + | } |
| + | } else { |
| + | // Hashtables |
| + | for (n in o) { |
| + | if (o.hasOwnProperty(n)) { |
| + | if (cb.call(s, o[n], n, o) === false) |
| + | return 0; |
| + | } |
| + | } |
| + | } |
| + | |
| + | return 1; |
| + | }, |
| + | |
| + | |
| + | trim : function(s) { |
| + | return (s ? '' + s : '').replace(whiteSpaceRe, ''); |
| + | }, |
| + | |
| + | create : function(s, p) { |
| + | var t = this, sp, ns, cn, scn, c, de = 0; |
| + | |
| + | // Parse : <prefix> <class>:<super class> |
| + | s = /^((static) )?([\w.]+)(:([\w.]+))?/.exec(s); |
| + | cn = s[3].match(/(^|\.)(\w+)$/i)[2]; // Class name |
| + | |
| + | // Create namespace for new class |
| + | ns = t.createNS(s[3].replace(/\.\w+$/, '')); |
| + | |
| + | // Class already exists |
| + | if (ns[cn]) |
| + | return; |
| + | |
| + | // Make pure static class |
| + | if (s[2] == 'static') { |
| + | ns[cn] = p; |
| + | |
| + | if (this.onCreate) |
| + | this.onCreate(s[2], s[3], ns[cn]); |
| + | |
| + | return; |
| + | } |
| + | |
| + | // Create default constructor |
| + | if (!p[cn]) { |
| + | p[cn] = function() {}; |
| + | de = 1; |
| + | } |
| + | |
| + | // Add constructor and methods |
| + | ns[cn] = p[cn]; |
| + | t.extend(ns[cn].prototype, p); |
| + | |
| + | // Extend |
| + | if (s[5]) { |
| + | sp = t.resolve(s[5]).prototype; |
| + | scn = s[5].match(/\.(\w+)$/i)[1]; // Class name |
| + | |
| + | // Extend constructor |
| + | c = ns[cn]; |
| + | if (de) { |
| + | // Add passthrough constructor |
| + | ns[cn] = function() { |
| + | return sp[scn].apply(this, arguments); |
| + | }; |
| + | } else { |
| + | // Add inherit constructor |
| + | ns[cn] = function() { |
| + | this.parent = sp[scn]; |
| + | return c.apply(this, arguments); |
| + | }; |
| + | } |
| + | ns[cn].prototype[cn] = ns[cn]; |
| + | |
| + | // Add super methods |
| + | t.each(sp, function(f, n) { |
| + | ns[cn].prototype[n] = sp[n]; |
| + | }); |
| + | |
| + | // Add overridden methods |
| + | t.each(p, function(f, n) { |
| + | // Extend methods if needed |
| + | if (sp[n]) { |
| + | ns[cn].prototype[n] = function() { |
| + | this.parent = sp[n]; |
| + | return f.apply(this, arguments); |
| + | }; |
| + | } else { |
| + | if (n != cn) |
| + | ns[cn].prototype[n] = f; |
| + | } |
| + | }); |
| + | } |
| + | |
| + | // Add static methods |
| + | t.each(p['static'], function(f, n) { |
| + | ns[cn][n] = f; |
| + | }); |
| + | |
| + | if (this.onCreate) |
| + | this.onCreate(s[2], s[3], ns[cn].prototype); |
| + | }, |
| + | |
| + | walk : function(o, f, n, s) { |
| + | s = s || this; |
| + | |
| + | if (o) { |
| + | if (n) |
| + | o = o[n]; |
| + | |
| + | tinymce.each(o, function(o, i) { |
| + | if (f.call(s, o, i, n) === false) |
| + | return false; |
| + | |
| + | tinymce.walk(o, f, n, s); |
| + | }); |
| + | } |
| + | }, |
| + | |
| + | createNS : function(n, o) { |
| + | var i, v; |
| + | |
| + | o = o || win; |
| + | |
| + | n = n.split('.'); |
| + | for (i=0; i<n.length; i++) { |
| + | v = n[i]; |
| + | |
| + | if (!o[v]) |
| + | o[v] = {}; |
| + | |
| + | o = o[v]; |
| + | } |
| + | |
| + | return o; |
| + | }, |
| + | |
| + | resolve : function(n, o) { |
| + | var i, l; |
| + | |
| + | o = o || win; |
| + | |
| + | n = n.split('.'); |
| + | for (i = 0, l = n.length; i < l; i++) { |
| + | o = o[n[i]]; |
| + | |
| + | if (!o) |
| + | break; |
| + | } |
| + | |
| + | return o; |
| + | }, |
| + | |
| + | addUnload : function(f, s) { |
| + | var t = this; |
| + | |
| + | f = {func : f, scope : s || this}; |
| + | |
| + | if (!t.unloads) { |
| + | function unload() { |
| + | var li = t.unloads, o, n; |
| + | |
| + | if (li) { |
| + | // Call unload handlers |
| + | for (n in li) { |
| + | o = li[n]; |
| + | |
| + | if (o && o.func) |
| + | o.func.call(o.scope, 1); // Send in one arg to distinct unload and user destroy |
| + | } |
| + | |
| + | // Detach unload function |
| + | if (win.detachEvent) { |
| + | win.detachEvent('onbeforeunload', fakeUnload); |
| + | win.detachEvent('onunload', unload); |
| + | } else if (win.removeEventListener) |
| + | win.removeEventListener('unload', unload, false); |
| + | |
| + | // Destroy references |
| + | t.unloads = o = li = w = unload = 0; |
| + | |
| + | // Run garbarge collector on IE |
| + | if (win.CollectGarbage) |
| + | CollectGarbage(); |
| + | } |
| + | }; |
| + | |
| + | function fakeUnload() { |
| + | var d = document; |
| + | |
| + | // Is there things still loading, then do some magic |
| + | if (d.readyState == 'interactive') { |
| + | function stop() { |
| + | // Prevent memory leak |
| + | d.detachEvent('onstop', stop); |
| + | |
| + | // Call unload handler |
| + | if (unload) |
| + | unload(); |
| + | |
| + | d = 0; |
| + | }; |
| + | |
| + | // Fire unload when the currently loading page is stopped |
| + | if (d) |
| + | d.attachEvent('onstop', stop); |
| + | |
| + | // Remove onstop listener after a while to prevent the unload function |
| + | // to execute if the user presses cancel in an onbeforeunload |
| + | // confirm dialog and then presses the browser stop button |
| + | win.setTimeout(function() { |
| + | if (d) |
| + | d.detachEvent('onstop', stop); |
| + | }, 0); |
| + | } |
| + | }; |
| + | |
| + | // Attach unload handler |
| + | if (win.attachEvent) { |
| + | win.attachEvent('onunload', unload); |
| + | win.attachEvent('onbeforeunload', fakeUnload); |
| + | } else if (win.addEventListener) |
| + | win.addEventListener('unload', unload, false); |
| + | |
| + | // Setup initial unload handler array |
| + | t.unloads = [f]; |
| + | } else |
| + | t.unloads.push(f); |
| + | |
| + | return f; |
| + | }, |
| + | |
| + | removeUnload : function(f) { |
| + | var u = this.unloads, r = null; |
| + | |
| + | tinymce.each(u, function(o, i) { |
| + | if (o && o.func == f) { |
| + | u.splice(i, 1); |
| + | r = f; |
| + | return false; |
| + | } |
| + | }); |
| + | |
| + | return r; |
| + | }, |
| + | |
| + | explode : function(s, d) { |
| + | return s ? tinymce.map(s.split(d || ','), tinymce.trim) : s; |
| + | }, |
| + | |
| + | _addVer : function(u) { |
| + | var v; |
| + | |
| + | if (!this.query) |
| + | return u; |
| + | |
| + | v = (u.indexOf('?') == -1 ? '?' : '&') + this.query; |
| + | |
| + | if (u.indexOf('#') == -1) |
| + | return u + v; |
| + | |
| + | return u.replace('#', v + '#'); |
| + | } |
| + | |
| + | }; |
| + | |
| + | // Initialize the API |
| + | tinymce._init(); |
| + | |
| + | // Expose tinymce namespace to the global namespace (window) |
| + | win.tinymce = win.tinyMCE = tinymce; |
| + | })(window); |
| + | |
| + | (function($, tinymce) { |
| + | var is = tinymce.is, attrRegExp = /^(href|src|style)$/i, undefined; |
| + | |
| + | // jQuery is undefined |
| + | if (!$) |
| + | return alert("Load jQuery first!"); |
| + | |
| + | // Stick jQuery into the tinymce namespace |
| + | tinymce.$ = $; |
| + | |
| + | // Setup adapter |
| + | tinymce.adapter = { |
| + | patchEditor : function(editor) { |
| + | var fn = $.fn; |
| + | |
| + | // Adapt the css function to make sure that the _mce_style |
| + | // attribute gets updated with the new style information |
| + | function css(name, value) { |
| + | var self = this; |
| + | |
| + | // Remove _mce_style when set operation occurs |
| + | if (value) |
| + | self.removeAttr('_mce_style'); |
| + | |
| + | return fn.css.apply(self, arguments); |
| + | }; |
| + | |
| + | // Apapt the attr function to make sure that it uses the _mce_ prefixed variants |
| + | function attr(name, value) { |
| + | var self = this; |
| + | |
| + | // Update/retrive _mce_ attribute variants |
| + | if (attrRegExp.test(name)) { |
| + | if (value !== undefined) { |
| + | // Use TinyMCE behavior when setting the specifc attributes |
| + | self.each(function(i, node) { |
| + | editor.dom.setAttrib(node, name, value); |
| + | }); |
| + | |
| + | return self; |
| + | } else |
| + | return self.attr('_mce_' + name); |
| + | } |
| + | |
| + | // Default behavior |
| + | return fn.attr.apply(self, arguments); |
| + | }; |
| + | |
| + | function htmlPatchFunc(func) { |
| + | // Returns a modified function that processes |
| + | // the HTML before executing the action this makes sure |
| + | // that href/src etc gets moved into the _mce_ variants |
| + | return function(content) { |
| + | if (content) |
| + | content = editor.dom.processHTML(content); |
| + | |
| + | return func.call(this, content); |
| + | }; |
| + | }; |
| + | |
| + | // Patch various jQuery functions to handle tinymce specific attribute and content behavior |
| + | // we don't patch the jQuery.fn directly since it will most likely break compatibility |
| + | // with other jQuery logic on the page. Only instances created by TinyMCE should be patched. |
| + | function patch(jq) { |
| + | // Patch some functions, only patch the object once |
| + | if (jq.css !== css) { |
| + | // Patch css/attr to use the _mce_ prefixed attribute variants |
| + | jq.css = css; |
| + | jq.attr = attr; |
| + | |
| + | // Patch HTML functions to use the DOMUtils.processHTML filter logic |
| + | jq.html = htmlPatchFunc(fn.html); |
| + | jq.append = htmlPatchFunc(fn.append); |
| + | jq.prepend = htmlPatchFunc(fn.prepend); |
| + | jq.after = htmlPatchFunc(fn.after); |
| + | jq.before = htmlPatchFunc(fn.before); |
| + | jq.replaceWith = htmlPatchFunc(fn.replaceWith); |
| + | jq.tinymce = editor; |
| + | |
| + | // Each pushed jQuery instance needs to be patched |
| + | // as well for example when traversing the DOM |
| + | jq.pushStack = function() { |
| + | return patch(fn.pushStack.apply(this, arguments)); |
| + | }; |
| + | } |
| + | |
| + | return jq; |
| + | }; |
| + | |
| + | // Add a $ function on each editor instance this one is scoped for the editor document object |
| + | // this way you can do chaining like this tinymce.get(0).$('p').append('text').css('color', 'red'); |
| + | editor.$ = function(selector, scope) { |
| + | var doc = editor.getDoc(); |
| + | |
| + | return patch($(selector || doc, doc || scope)); |
| + | }; |
| + | } |
| + | }; |
| + | |
| + | // Patch in core NS functions |
| + | tinymce.extend = $.extend; |
| + | tinymce.extend(tinymce, { |
| + | map : $.map, |
| + | grep : function(a, f) {return $.grep(a, f || function(){return 1;});}, |
| + | inArray : function(a, v) {return $.inArray(v, a || []);} |
| + | |
| + | /* Didn't iterate stylesheets |
| + | each : function(o, cb, s) { |
| + | if (!o) |
| + | return 0; |
| + | |
| + | var r = 1; |
| + | |
| + | $.each(o, function(nr, el){ |
| + | if (cb.call(s, el, nr, o) === false) { |
| + | r = 0; |
| + | return false; |
| + | } |
| + | }); |
| + | |
| + | return r; |
| + | }*/ |
| + | }); |
| + | |
| + | // Patch in functions in various clases |
| + | // Add a "#ifndefjquery" statement around each core API function you add below |
| + | var patches = { |
| + | 'tinymce.dom.DOMUtils' : { |
| + | /* |
| + | addClass : function(e, c) { |
| + | if (is(e, 'array') && is(e[0], 'string')) |
| + | e = e.join(',#'); |
| + | return (e && $(is(e, 'string') ? '#' + e : e) |
| + | .addClass(c) |
| + | .attr('class')) || false; |
| + | }, |
| + | |
| + | hasClass : function(n, c) { |
| + | return $(is(n, 'string') ? '#' + n : n).hasClass(c); |
| + | }, |
| + | |
| + | removeClass : function(e, c) { |
| + | if (!e) |
| + | return false; |
| + | |
| + | var r = []; |
| + | |
| + | $(is(e, 'string') ? '#' + e : e) |
| + | .removeClass(c) |
| + | .each(function(){ |
| + | r.push(this.className); |
| + | }); |
| + | |
| + | return r.length == 1 ? r[0] : r; |
| + | }, |
| + | */ |
| + | |
| + | select : function(pattern, scope) { |
| + | var t = this; |
| + | |
| + | return $.find(pattern, t.get(scope) || t.get(t.settings.root_element) || t.doc, []); |
| + | }, |
| + | |
| + | is : function(n, patt) { |
| + | return $(this.get(n)).is(patt); |
| + | } |
| + | |
| + | /* |
| + | show : function(e) { |
| + | if (is(e, 'array') && is(e[0], 'string')) |
| + | e = e.join(',#'); |
| + | |
| + | $(is(e, 'string') ? '#' + e : e).css('display', 'block'); |
| + | }, |
| + | |
| + | hide : function(e) { |
| + | if (is(e, 'array') && is(e[0], 'string')) |
| + | e = e.join(',#'); |
| + | |
| + | $(is(e, 'string') ? '#' + e : e).css('display', 'none'); |
| + | }, |
| + | |
| + | isHidden : function(e) { |
| + | return $(is(e, 'string') ? '#' + e : e).is(':hidden'); |
| + | }, |
| + | |
| + | insertAfter : function(n, e) { |
| + | return $(is(e, 'string') ? '#' + e : e).after(n); |
| + | }, |
| + | |
| + | replace : function(o, n, k) { |
| + | n = $(is(n, 'string') ? '#' + n : n); |
| + | |
| + | if (k) |
| + | n.children().appendTo(o); |
| + | |
| + | n.replaceWith(o); |
| + | }, |
| + | |
| + | setStyle : function(n, na, v) { |
| + | if (is(n, 'array') && is(n[0], 'string')) |
| + | n = n.join(',#'); |
| + | |
| + | $(is(n, 'string') ? '#' + n : n).css(na, v); |
| + | }, |
| + | |
| + | getStyle : function(n, na, c) { |
| + | return $(is(n, 'string') ? '#' + n : n).css(na); |
| + | }, |
| + | |
| + | setStyles : function(e, o) { |
| + | if (is(e, 'array') && is(e[0], 'string')) |
| + | e = e.join(',#'); |
| + | $(is(e, 'string') ? '#' + e : e).css(o); |
| + | }, |
| + | |
| + | setAttrib : function(e, n, v) { |
| + | var t = this, s = t.settings; |
| + | |
| + | if (is(e, 'array') && is(e[0], 'string')) |
| + | e = e.join(',#'); |
| + | |
| + | e = $(is(e, 'string') ? '#' + e : e); |
| + | |
| + | switch (n) { |
| + | case "style": |
| + | e.each(function(i, v){ |
| + | if (s.keep_values) |
| + | $(v).attr('_mce_style', v); |
| + | |
| + | v.style.cssText = v; |
| + | }); |
| + | break; |
| + | |
| + | case "class": |
| + | e.each(function(){ |
| + | this.className = v; |
| + | }); |
| + | break; |
| + | |
| + | case "src": |
| + | case "href": |
| + | e.each(function(i, v){ |
| + | if (s.keep_values) { |
| + | if (s.url_converter) |
| + | v = s.url_converter.call(s.url_converter_scope || t, v, n, v); |
| + | |
| + | t.setAttrib(v, '_mce_' + n, v); |
| + | } |
| + | }); |
| + | |
| + | break; |
| + | } |
| + | |
| + | if (v !== null && v.length !== 0) |
| + | e.attr(n, '' + v); |
| + | else |
| + | e.removeAttr(n); |
| + | }, |
| + | |
| + | setAttribs : function(e, o) { |
| + | var t = this; |
| + | |
| + | $.each(o, function(n, v){ |
| + | t.setAttrib(e,n,v); |
| + | }); |
| + | } |
| + | */ |
| + | } |
| + | |
| + | /* |
| + | 'tinymce.dom.Event' : { |
| + | add : function (o, n, f, s) { |
| + | var lo, cb; |
| + | |
| + | cb = function(e) { |
| + | e.target = e.target || this; |
| + | f.call(s || this, e); |
| + | }; |
| + | |
| + | if (is(o, 'array') && is(o[0], 'string')) |
| + | o = o.join(',#'); |
| + | o = $(is(o, 'string') ? '#' + o : o); |
| + | if (n == 'init') { |
| + | o.ready(cb, s); |
| + | } else { |
| + | if (s) { |
| + | o.bind(n, s, cb); |
| + | } else { |
| + | o.bind(n, cb); |
| + | } |
| + | } |
| + | |
| + | lo = this._jqLookup || (this._jqLookup = []); |
| + | lo.push({func : f, cfunc : cb}); |
| + | |
| + | return cb; |
| + | }, |
| + | |
| + | remove : function(o, n, f) { |
| + | // Find cfunc |
| + | $(this._jqLookup).each(function() { |
| + | if (this.func === f) |
| + | f = this.cfunc; |
| + | }); |
| + | |
| + | if (is(o, 'array') && is(o[0], 'string')) |
| + | o = o.join(',#'); |
| + | |
| + | $(is(o, 'string') ? '#' + o : o).unbind(n,f); |
| + | |
| + | return true; |
| + | } |
| + | } |
| + | */ |
| + | }; |
| + | |
| + | // Patch functions after a class is created |
| + | tinymce.onCreate = function(ty, c, p) { |
| + | tinymce.extend(p, patches[c]); |
| + | }; |
| + | })(window.jQuery, tinymce); |
| + | |
| + | |
| + | |
| + | tinymce.create('tinymce.util.Dispatcher', { |
| + | scope : null, |
| + | listeners : null, |
| + | |
| + | Dispatcher : function(s) { |
| + | this.scope = s || this; |
| + | this.listeners = []; |
| + | }, |
| + | |
| + | add : function(cb, s) { |
| + | this.listeners.push({cb : cb, scope : s || this.scope}); |
| + | |
| + | return cb; |
| + | }, |
| + | |
| + | addToTop : function(cb, s) { |
| + | this.listeners.unshift({cb : cb, scope : s || this.scope}); |
| + | |
| + | return cb; |
| + | }, |
| + | |
| + | remove : function(cb) { |
| + | var l = this.listeners, o = null; |
| + | |
| + | tinymce.each(l, function(c, i) { |
| + | if (cb == c.cb) { |
| + | o = cb; |
| + | l.splice(i, 1); |
| + | return false; |
| + | } |
| + | }); |
| + | |
| + | return o; |
| + | }, |
| + | |
| + | dispatch : function() { |
| + | var s, a = arguments, i, li = this.listeners, c; |
| + | |
| + | // Needs to be a real loop since the listener count might change while looping |
| + | // And this is also more efficient |
| + | for (i = 0; i<li.length; i++) { |
| + | c = li[i]; |
| + | s = c.cb.apply(c.scope, a); |
| + | |
| + | if (s === false) |
| + | break; |
| + | } |
| + | |
| + | return s; |
| + | } |
| + | |
| + | }); |
| + | |
| + | (function() { |
| + | var each = tinymce.each; |
| + | |
| + | tinymce.create('tinymce.util.URI', { |
| + | URI : function(u, s) { |
| + | var t = this, o, a, b; |
| + | |
| + | // Trim whitespace |
| + | u = tinymce.trim(u); |
| + | |
| + | // Default settings |
| + | s = t.settings = s || {}; |
| + | |
| + | // Strange app protocol or local anchor |
| + | if (/^(mailto|tel|news|javascript|about|data):/i.test(u) || /^\s*#/.test(u)) { |
| + | t.source = u; |
| + | return; |
| + | } |
| + | |
| + | // Absolute path with no host, fake host and protocol |
| + | if (u.indexOf('/') === 0 && u.indexOf('//') !== 0) |
| + | u = (s.base_uri ? s.base_uri.protocol || 'http' : 'http') + '://mce_host' + u; |
| + | |
| + | // Relative path http:// or protocol relative //path |
| + | if (!/^\w*:?\/\//.test(u)) |
| + | u = (s.base_uri.protocol || 'http') + '://mce_host' + t.toAbsPath(s.base_uri.path, u); |
| + | |
| + | // Parse URL (Credits goes to Steave, http://blog.stevenlevithan.com/archives/parseuri) |
| + | u = u.replace(/@@/g, '(mce_at)'); // Zope 3 workaround, they use @@something |
| + | u = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(u); |
| + | each(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], function(v, i) { |
| + | var s = u[i]; |
| + | |
| + | // Zope 3 workaround, they use @@something |
| + | if (s) |
| + | s = s.replace(/\(mce_at\)/g, '@@'); |
| + | |
| + | t[v] = s; |
| + | }); |
| + | |
| + | if (b = s.base_uri) { |
| + | if (!t.protocol) |
| + | t.protocol = b.protocol; |
| + | |
| + | if (!t.userInfo) |
| + | t.userInfo = b.userInfo; |
| + | |
| + | if (!t.port && t.host == 'mce_host') |
| + | t.port = b.port; |
| + | |
| + | if (!t.host || t.host == 'mce_host') |
| + | t.host = b.host; |
| + | |
| + | t.source = ''; |
| + | } |
| + | |
| + | //t.path = t.path || '/'; |
| + | }, |
| + | |
| + | setPath : function(p) { |
| + | var t = this; |
| + | |
| + | p = /^(.*?)\/?(\w+)?$/.exec(p); |
| + | |
| + | // Update path parts |
| + | t.path = p[0]; |
| + | t.directory = p[1]; |
| + | t.file = p[2]; |
| + | |
| + | // Rebuild source |
| + | t.source = ''; |
| + | t.getURI(); |
| + | }, |
| + | |
| + | toRelative : function(u) { |
| + | var t = this, o; |
| + | |
| + | if (u === "./") |
| + | return u; |
| + | |
| + | u = new tinymce.util.URI(u, {base_uri : t}); |
| + | |
| + | // Not on same domain/port or protocol |
| + | if ((u.host != 'mce_host' && t.host != u.host && u.host) || t.port != u.port || t.protocol != u.protocol) |
| + | return u.getURI(); |
| + | |
| + | o = t.toRelPath(t.path, u.path); |
| + | |
| + | // Add query |
| + | if (u.query) |
| + | o += '?' + u.query; |
| + | |
| + | // Add anchor |
| + | if (u.anchor) |
| + | o += '#' + u.anchor; |
| + | |
| + | return o; |
| + | }, |
| + | |
| + | toAbsolute : function(u, nh) { |
| + | var u = new tinymce.util.URI(u, {base_uri : this}); |
| + | |
| + | return u.getURI(this.host == u.host && this.protocol == u.protocol ? nh : 0); |
| + | }, |
| + | |
| + | toRelPath : function(base, path) { |
| + | var items, bp = 0, out = '', i, l; |
| + | |
| + | // Split the paths |
| + | base = base.substring(0, base.lastIndexOf('/')); |
| + | base = base.split('/'); |
| + | items = path.split('/'); |
| + | |
| + | if (base.length >= items.length) { |
| + | for (i = 0, l = base.length; i < l; i++) { |
| + | if (i >= items.length || base[i] != items[i]) { |
| + | bp = i + 1; |
| + | break; |
| + | } |
| + | } |
| + | } |
| + | |
| + | if (base.length < items.length) { |
| + | for (i = 0, l = items.length; i < l; i++) { |
| + | if (i >= base.length || base[i] != items[i]) { |
| + | bp = i + 1; |
| + | break; |
| + | } |
| + | } |
| + | } |
| + | |
| + | if (bp == 1) |
| + | return path; |
| + | |
| + | for (i = 0, l = base.length - (bp - 1); i < l; i++) |
| + | out += "../"; |
| + | |
| + | for (i = bp - 1, l = items.length; i < l; i++) { |
| + | if (i != bp - 1) |
| + | out += "/" + items[i]; |
| + | else |
| + | out += items[i]; |
| + | } |
| + | |
| + | return out; |
| + | }, |
| + | |
| + | toAbsPath : function(base, path) { |
| + | var i, nb = 0, o = [], tr, outPath; |
| + | |
| + | // Split paths |
| + | tr = /\/$/.test(path) ? '/' : ''; |
| + | base = base.split('/'); |
| + | path = path.split('/'); |
| + | |
| + | // Remove empty chunks |
| + | each(base, function(k) { |
| + | if (k) |
| + | o.push(k); |
| + | }); |
| + | |
| + | base = o; |
| + | |
| + | // Merge relURLParts chunks |
| + | for (i = path.length - 1, o = []; i >= 0; i--) { |
| + | // Ignore empty or . |
| + | if (path[i].length == 0 || path[i] == ".") |
| + | continue; |
| + | |
| + | // Is parent |
| + | if (path[i] == '..') { |
| + | nb++; |
| + | continue; |
| + | } |
| + | |
| + | // Move up |
| + | if (nb > 0) { |
| + | nb--; |
| + | continue; |
| + | } |
| + | |
| + | o.push(path[i]); |
| + | } |
| + | |
| + | i = base.length - nb; |
| + | |
| + | // If /a/b/c or / |
| + | if (i <= 0) |
| + | outPath = o.reverse().join('/'); |
| + | else |
| + | outPath = base.slice(0, i).join('/') + '/' + o.reverse().join('/'); |
| + | |
| + | // Add front / if it's needed |
| + | if (outPath.indexOf('/') !== 0) |
| + | outPath = '/' + outPath; |
| + | |
| + | // Add traling / if it's needed |
| + | if (tr && outPath.lastIndexOf('/') !== outPath.length - 1) |
| + | outPath += tr; |
| + | |
| + | return outPath; |
| + | }, |
| + | |
| + | getURI : function(nh) { |
| + | var s, t = this; |
| + | |
| + | // Rebuild source |
| + | if (!t.source || nh) { |
| + | s = ''; |
| + | |
| + | if (!nh) { |
| + | if (t.protocol) |
| + | s += t.protocol + '://'; |
| + | |
| + | if (t.userInfo) |
| + | s += t.userInfo + '@'; |
| + | |
| + | if (t.host) |
| + | s += t.host; |
| + | |
| + | if (t.port) |
| + | s += ':' + t.port; |
| + | } |
| + | |
| + | if (t.path) |
| + | s += t.path; |
| + | |
| + | if (t.query) |
| + | s += '?' + t.query; |
| + | |
| + | if (t.anchor) |
| + | s += '#' + t.anchor; |
| + | |
| + | t.source = s; |
| + | } |
| + | |
| + | return t.source; |
| + | } |
| + | }); |
| + | })(); |
| + | |
| + | (function() { |
| + | var each = tinymce.each; |
| + | |
| + | tinymce.create('static tinymce.util.Cookie', { |
| + | getHash : function(n) { |
| + | var v = this.get(n), h; |
| + | |
| + | if (v) { |
| + | each(v.split('&'), function(v) { |
| + | v = v.split('='); |
| + | h = h || {}; |
| + | h[unescape(v[0])] = unescape(v[1]); |
| + | }); |
| + | } |
| + | |
| + | return h; |
| + | }, |
| + | |
| + | setHash : function(n, v, e, p, d, s) { |
| + | var o = ''; |
| + | |
| + | each(v, function(v, k) { |
| + | o += (!o ? '' : '&') + escape(k) + '=' + escape(v); |
| + | }); |
| + | |
| + | this.set(n, o, e, p, d, s); |
| + | }, |
| + | |
| + | get : function(n) { |
| + | var c = document.cookie, e, p = n + "=", b; |
| + | |
| + | // Strict mode |
| + | if (!c) |
| + | return; |
| + | |
| + | b = c.indexOf("; " + p); |
| + | |
| + | if (b == -1) { |
| + | b = c.indexOf(p); |
| + | |
| + | if (b != 0) |
| + | return null; |
| + | } else |
| + | b += 2; |
| + | |
| + | e = c.indexOf(";", b); |
| + | |
| + | if (e == -1) |
| + | e = c.length; |
| + | |
| + | return unescape(c.substring(b + p.length, e)); |
| + | }, |
| + | |
| + | set : function(n, v, e, p, d, s) { |
| + | document.cookie = n + "=" + escape(v) + |
| + | ((e) ? "; expires=" + e.toGMTString() : "") + |
| + | ((p) ? "; path=" + escape(p) : "") + |
| + | ((d) ? "; domain=" + d : "") + |
| + | ((s) ? "; secure" : ""); |
| + | }, |
| + | |
| + | remove : function(n, p) { |
| + | var d = new Date(); |
| + | |
| + | d.setTime(d.getTime() - 1000); |
| + | |
| + | this.set(n, '', d, p, d); |
| + | } |
| + | }); |
| + | })(); |
| + | |
| + | tinymce.create('static tinymce.util.JSON', { |
| + | serialize : function(o) { |
| + | var i, v, s = tinymce.util.JSON.serialize, t; |
| + | |
| + | if (o == null) |
| + | return 'null'; |
| + | |
| + | t = typeof o; |
| + | |
| + | if (t == 'string') { |
| + | v = '\bb\tt\nn\ff\rr\""\'\'\\\\'; |
| + | |
| + | return '"' + o.replace(/([\u0080-\uFFFF\x00-\x1f\"])/g, function(a, b) { |
| + | i = v.indexOf(b); |
| + | |
| + | if (i + 1) |
| + | return '\\' + v.charAt(i + 1); |
| + | |
| + | a = b.charCodeAt().toString(16); |
| + | |
| + | return '\\u' + '0000'.substring(a.length) + a; |
| + | }) + '"'; |
| + | } |
| + | |
| + | if (t == 'object') { |
| + | if (o.hasOwnProperty && o instanceof Array) { |
| + | for (i=0, v = '['; i<o.length; i++) |
| + | v += (i > 0 ? ',' : '') + s(o[i]); |
| + | |
| + | return v + ']'; |
| + | } |
| + | |
| + | v = '{'; |
| + | |
| + | for (i in o) |
| + | v += typeof o[i] != 'function' ? (v.length > 1 ? ',"' : '"') + i + '":' + s(o[i]) : ''; |
| + | |
| + | return v + '}'; |
| + | } |
| + | |
| + | return '' + o; |
| + | }, |
| + | |
| + | parse : function(s) { |
| + | try { |
| + | return eval('(' + s + ')'); |
| + | } catch (ex) { |
| + | // Ignore |
| + | } |
| + | } |
| + | |
| + | }); |
| + | |
| + | tinymce.create('static tinymce.util.XHR', { |
| + | send : function(o) { |
| + | var x, t, w = window, c = 0; |
| + | |
| + | // Default settings |
| + | o.scope = o.scope || this; |
| + | o.success_scope = o.success_scope || o.scope; |
| + | o.error_scope = o.error_scope || o.scope; |
| + | o.async = o.async === false ? false : true; |
| + | o.data = o.data || ''; |
| + | |
| + | function get(s) { |
| + | x = 0; |
| + | |
| + | try { |
| + | x = new ActiveXObject(s); |
| + | } catch (ex) { |
| + | } |
| + | |
| + | return x; |
| + | }; |
| + | |
| + | x = w.XMLHttpRequest ? new XMLHttpRequest() : get('Microsoft.XMLHTTP') || get('Msxml2.XMLHTTP'); |
| + | |
| + | if (x) { |
| + | if (x.overrideMimeType) |
| + | x.overrideMimeType(o.content_type); |
| + | |
| + | x.open(o.type || (o.data ? 'POST' : 'GET'), o.url, o.async); |
| + | |
| + | if (o.content_type) |
| + | x.setRequestHeader('Content-Type', o.content_type); |
| + | |
| + | x.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); |
| + | |
| + | x.send(o.data); |
| + | |
| + | function ready() { |
| + | if (!o.async || x.readyState == 4 || c++ > 10000) { |
| + | if (o.success && c < 10000 && x.status == 200) |
| + | o.success.call(o.success_scope, '' + x.responseText, x, o); |
| + | else if (o.error) |
| + | o.error.call(o.error_scope, c > 10000 ? 'TIMED_OUT' : 'GENERAL', x, o); |
| + | |
| + | x = null; |
| + | } else |
| + | w.setTimeout(ready, 10); |
| + | }; |
| + | |
| + | // Syncronous request |
| + | if (!o.async) |
| + | return ready(); |
| + | |
| + | // Wait for response, onReadyStateChange can not be used since it leaks memory in IE |
| + | t = w.setTimeout(ready, 10); |
| + | } |
| + | } |
| + | }); |
| + | |
| + | (function() { |
| + | var extend = tinymce.extend, JSON = tinymce.util.JSON, XHR = tinymce.util.XHR; |
| + | |
| + | tinymce.create('tinymce.util.JSONRequest', { |
| + | JSONRequest : function(s) { |
| + | this.settings = extend({ |
| + | }, s); |
| + | this.count = 0; |
| + | }, |
| + | |
| + | send : function(o) { |
| + | var ecb = o.error, scb = o.success; |
| + | |
| + | o = extend(this.settings, o); |
| + | |
| + | o.success = function(c, x) { |
| + | c = JSON.parse(c); |
| + | |
| + | if (typeof(c) == 'undefined') { |
| + | c = { |
| + | error : 'JSON Parse error.' |
| + | }; |
| + | } |
| + | |
| + | if (c.error) |
| + | ecb.call(o.error_scope || o.scope, c.error, x); |
| + | else |
| + | scb.call(o.success_scope || o.scope, c.result); |
| + | }; |
| + | |
| + | o.error = function(ty, x) { |
| + | ecb.call(o.error_scope || o.scope, ty, x); |
| + | }; |
| + | |
| + | o.data = JSON.serialize({ |
| + | id : o.id || 'c' + (this.count++), |
| + | method : o.method, |
| + | params : o.params |
| + | }); |
| + | |
| + | // JSON content type for Ruby on rails. Bug: #1883287 |
| + | o.content_type = 'application/json'; |
| + | |
| + | XHR.send(o); |
| + | }, |
| + | |
| + | 'static' : { |
| + | sendRPC : function(o) { |
| + | return new tinymce.util.JSONRequest().send(o); |
| + | } |
| + | } |
| + | }); |
| + | }()); |
| + | (function(tinymce) { |
| + | // Shorten names |
| + | var each = tinymce.each, |
| + | is = tinymce.is, |
| + | isWebKit = tinymce.isWebKit, |
| + | isIE = tinymce.isIE, |
| + | blockRe = /^(H[1-6R]|P|DIV|ADDRESS|PRE|FORM|T(ABLE|BODY|HEAD|FOOT|H|R|D)|LI|OL|UL|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|NOSCRIPT|MENU|ISINDEX|SAMP)$/, |
| + | boolAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'), |
| + | mceAttribs = makeMap('src,href,style,coords,shape'), |
| + | encodedChars = {'&' : '&', '"' : '"', '<' : '<', '>' : '>'}, |
| + | encodeCharsRe = /[<>&\"]/g, |
| + | simpleSelectorRe = /^([a-z0-9],?)+$/i, |
| + | tagRegExp = /<(\w+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)(\s*\/?)>/g, |
| + | attrRegExp = /(\w+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; |
| + | |
| + | function makeMap(str) { |
| + | var map = {}, i; |
| + | |
| + | str = str.split(','); |
| + | for (i = str.length; i >= 0; i--) |
| + | map[str[i]] = 1; |
| + | |
| + | return map; |
| + | }; |
| + | |
| + | tinymce.create('tinymce.dom.DOMUtils', { |
| + | doc : null, |
| + | root : null, |
| + | files : null, |
| + | pixelStyles : /^(top|left|bottom|right|width|height|borderWidth)$/, |
| + | props : { |
| + | "for" : "htmlFor", |
| + | "class" : "className", |
| + | className : "className", |
| + | checked : "checked", |
| + | disabled : "disabled", |
| + | maxlength : "maxLength", |
| + | readonly : "readOnly", |
| + | selected : "selected", |
| + | value : "value", |
| + | id : "id", |
| + | name : "name", |
| + | type : "type" |
| + | }, |
| + | |
| + | DOMUtils : function(d, s) { |
| + | var t = this, globalStyle; |
| + | |
| + | t.doc = d; |
| + | t.win = window; |
| + | t.files = {}; |
| + | t.cssFlicker = false; |
| + | t.counter = 0; |
| + | t.boxModel = !tinymce.isIE || d.compatMode == "CSS1Compat"; |
| + | t.stdMode = d.documentMode === 8; |
| + | |
| + | t.settings = s = tinymce.extend({ |
| + | keep_values : false, |
| + | hex_colors : 1, |
| + | process_html : 1 |
| + | }, s); |
| + | |
| + | // Fix IE6SP2 flicker and check it failed for pre SP2 |
| + | if (tinymce.isIE6) { |
| + | try { |
| + | d.execCommand('BackgroundImageCache', false, true); |
| + | } catch (e) { |
| + | t.cssFlicker = true; |
| + | } |
| + | } |
| + | |
| + | // Build styles list |
| + | if (s.valid_styles) { |
| + | t._styles = {}; |
| + | |
| + | // Convert styles into a rule list |
| + | each(s.valid_styles, function(value, key) { |
| + | t._styles[key] = tinymce.explode(value); |
| + | }); |
| + | } |
| + | |
| + | tinymce.addUnload(t.destroy, t); |
| + | }, |
| + | |
| + | getRoot : function() { |
| + | var t = this, s = t.settings; |
| + | |
| + | return (s && t.get(s.root_element)) || t.doc.body; |
| + | }, |
| + | |
| + | getViewPort : function(w) { |
| + | var d, b; |
| + | |
| + | w = !w ? this.win : w; |
| + | d = w.document; |
| + | b = this.boxModel ? d.documentElement : d.body; |
| + | |
| + | // Returns viewport size excluding scrollbars |
| + | return { |
| + | x : w.pageXOffset || b.scrollLeft, |
| + | y : w.pageYOffset || b.scrollTop, |
| + | w : w.innerWidth || b.clientWidth, |
| + | h : w.innerHeight || b.clientHeight |
| + | }; |
| + | }, |
| + | |
| + | getRect : function(e) { |
| + | var p, t = this, sr; |
| + | |
| + | e = t.get(e); |
| + | p = t.getPos(e); |
| + | sr = t.getSize(e); |
| + | |
| + | return { |
| + | x : p.x, |
| + | y : p.y, |
| + | w : sr.w, |
| + | h : sr.h |
| + | }; |
| + | }, |
| + | |
| + | getSize : function(e) { |
| + | var t = this, w, h; |
| + | |
| + | e = t.get(e); |
| + | w = t.getStyle(e, 'width'); |
| + | h = t.getStyle(e, 'height'); |
| + | |
| + | // Non pixel value, then force offset/clientWidth |
| + | if (w.indexOf('px') === -1) |
| + | w = 0; |
| + | |
| + | // Non pixel value, then force offset/clientWidth |
| + | if (h.indexOf('px') === -1) |
| + | h = 0; |
| + | |
| + | return { |
| + | w : parseInt(w) || e.offsetWidth || e.clientWidth, |
| + | h : parseInt(h) || e.offsetHeight || e.clientHeight |
| + | }; |
| + | }, |
| + | |
| + | getParent : function(n, f, r) { |
| + | return this.getParents(n, f, r, false); |
| + | }, |
| + | |
| + | getParents : function(n, f, r, c) { |
| + | var t = this, na, se = t.settings, o = []; |
| + | |
| + | n = t.get(n); |
| + | c = c === undefined; |
| + | |
| + | if (se.strict_root) |
| + | r = r || t.getRoot(); |
| + | |
| + | // Wrap node name as func |
| + | if (is(f, 'string')) { |
| + | na = f; |
| + | |
| + | if (f === '*') { |
| + | f = function(n) {return n.nodeType == 1;}; |
| + | } else { |
| + | f = function(n) { |
| + | return t.is(n, na); |
| + | }; |
| + | } |
| + | } |
| + | |
| + | while (n) { |
| + | if (n == r || !n.nodeType || n.nodeType === 9) |
| + | break; |
| + | |
| + | if (!f || f(n)) { |
| + | if (c) |
| + | o.push(n); |
| + | else |
| + | return n; |
| + | } |
| + | |
| + | n = n.parentNode; |
| + | } |
| + | |
| + | return c ? o : null; |
| + | }, |
| + | |
| + | get : function(e) { |
| + | var n; |
| + | |
| + | if (e && this.doc && typeof(e) == 'string') { |
| + | n = e; |
| + | e = this.doc.getElementById(e); |
| + | |
| + | // IE and Opera returns meta elements when they match the specified input ID, but getElementsByName seems to do the trick |
| + | if (e && e.id !== n) |
| + | return this.doc.getElementsByName(n)[1]; |
| + | } |
| + | |
| + | return e; |
| + | }, |
| + | |
| + | getNext : function(node, selector) { |
| + | return this._findSib(node, selector, 'nextSibling'); |
| + | }, |
| + | |
| + | getPrev : function(node, selector) { |
| + | return this._findSib(node, selector, 'previousSibling'); |
| + | }, |
| + | |
| + | |
| + | add : function(p, n, a, h, c) { |
| + | var t = this; |
| + | |
| + | return this.run(p, function(p) { |
| + | var e, k; |
| + | |
| + | e = is(n, 'string') ? t.doc.createElement(n) : n; |
| + | t.setAttribs(e, a); |
| + | |
| + | if (h) { |
| + | if (h.nodeType) |
| + | e.appendChild(h); |
| + | else |
| + | t.setHTML(e, h); |
| + | } |
| + | |
| + | return !c ? p.appendChild(e) : e; |
| + | }); |
| + | }, |
| + | |
| + | create : function(n, a, h) { |
| + | return this.add(this.doc.createElement(n), n, a, h, 1); |
| + | }, |
| + | |
| + | createHTML : function(n, a, h) { |
| + | var o = '', t = this, k; |
| + | |
| + | o += '<' + n; |
| + | |
| + | for (k in a) { |
| + | if (a.hasOwnProperty(k)) |
| + | o += ' ' + k + '="' + t.encode(a[k]) + '"'; |
| + | } |
| + | |
| + | if (tinymce.is(h)) |
| + | return o + '>' + h + '</' + n + '>'; |
| + | |
| + | return o + ' />'; |
| + | }, |
| + | |
| + | remove : function(node, keep_children) { |
| + | return this.run(node, function(node) { |
| + | var parent, child; |
| + | |
| + | parent = node.parentNode; |
| + | |
| + | if (!parent) |
| + | return null; |
| + | |
| + | if (keep_children) { |
| + | while (child = node.firstChild) { |
| + | // IE 8 will crash if you don't remove completely empty text nodes |
| + | if (!tinymce.isIE || child.nodeType !== 3 || child.nodeValue) |
| + | parent.insertBefore(child, node); |
| + | else |
| + | node.removeChild(child); |
| + | } |
| + | } |
| + | |
| + | return parent.removeChild(node); |
| + | }); |
| + | }, |
| + | |
| + | setStyle : function(n, na, v) { |
| + | var t = this; |
| + | |
| + | return t.run(n, function(e) { |
| + | var s, i; |
| + | |
| + | s = e.style; |
| + | |
| + | // Camelcase it, if needed |
| + | na = na.replace(/-(\D)/g, function(a, b){ |
| + | return b.toUpperCase(); |
| + | }); |
| + | |
| + | // Default px suffix on these |
| + | if (t.pixelStyles.test(na) && (tinymce.is(v, 'number') || /^[\-0-9\.]+$/.test(v))) |
| + | v += 'px'; |
| + | |
| + | switch (na) { |
| + | case 'opacity': |
| + | // IE specific opacity |
| + | if (isIE) { |
| + | s.filter = v === '' ? '' : "alpha(opacity=" + (v * 100) + ")"; |
| + | |
| + | if (!n.currentStyle || !n.currentStyle.hasLayout) |
| + | s.display = 'inline-block'; |
| + | } |
| + | |
| + | // Fix for older browsers |
| + | s[na] = s['-moz-opacity'] = s['-khtml-opacity'] = v || ''; |
| + | break; |
| + | |
| + | case 'float': |
| + | isIE ? s.styleFloat = v : s.cssFloat = v; |
| + | break; |
| + | |
| + | default: |
| + | s[na] = v || ''; |
| + | } |
| + | |
| + | // Force update of the style data |
| + | if (t.settings.update_styles) |
| + | t.setAttrib(e, '_mce_style'); |
| + | }); |
| + | }, |
| + | |
| + | getStyle : function(n, na, c) { |
| + | n = this.get(n); |
| + | |
| + | if (!n) |
| + | return false; |
| + | |
| + | // Gecko |
| + | if (this.doc.defaultView && c) { |
| + | // Remove camelcase |
| + | na = na.replace(/[A-Z]/g, function(a){ |
| + | return '-' + a; |
| + | }); |
| + | |
| + | try { |
| + | return this.doc.defaultView.getComputedStyle(n, null).getPropertyValue(na); |
| + | } catch (ex) { |
| + | // Old safari might fail |
| + | return null; |
| + | } |
| + | } |
| + | |
| + | // Camelcase it, if needed |
| + | na = na.replace(/-(\D)/g, function(a, b){ |
| + | return b.toUpperCase(); |
| + | }); |
| + | |
| + | if (na == 'float') |
| + | na = isIE ? 'styleFloat' : 'cssFloat'; |
| + | |
| + | // IE & Opera |
| + | if (n.currentStyle && c) |
| + | return n.currentStyle[na]; |
| + | |
| + | return n.style[na]; |
| + | }, |
| + | |
| + | setStyles : function(e, o) { |
| + | var t = this, s = t.settings, ol; |
| + | |
| + | ol = s.update_styles; |
| + | s.update_styles = 0; |
| + | |
| + | each(o, function(v, n) { |
| + | t.setStyle(e, n, v); |
| + | }); |
| + | |
| + | // Update style info |
| + | s.update_styles = ol; |
| + | if (s.update_styles) |
| + | t.setAttrib(e, s.cssText); |
| + | }, |
| + | |
| + | setAttrib : function(e, n, v) { |
| + | var t = this; |
| + | |
| + | // Whats the point |
| + | if (!e || !n) |
| + | return; |
| + | |
| + | // Strict XML mode |
| + | if (t.settings.strict) |
| + | n = n.toLowerCase(); |
| + | |
| + | return this.run(e, function(e) { |
| + | var s = t.settings; |
| + | |
| + | switch (n) { |
| + | case "style": |
| + | if (!is(v, 'string')) { |
| + | each(v, function(v, n) { |
| + | t.setStyle(e, n, v); |
| + | }); |
| + | |
| + | return; |
| + | } |
| + | |
| + | // No mce_style for elements with these since they might get resized by the user |
| + | if (s.keep_values) { |
| + | if (v && !t._isRes(v)) |
| + | e.setAttribute('_mce_style', v, 2); |
| + | else |
| + | e.removeAttribute('_mce_style', 2); |
| + | } |
| + | |
| + | e.style.cssText = v; |
| + | break; |
| + | |
| + | case "class": |
| + | e.className = v || ''; // Fix IE null bug |
| + | break; |
| + | |
| + | case "src": |
| + | case "href": |
| + | if (s.keep_values) { |
| + | if (s.url_converter) |
| + | v = s.url_converter.call(s.url_converter_scope || t, v, n, e); |
| + | |
| + | t.setAttrib(e, '_mce_' + n, v, 2); |
| + | } |
| + | |
| + | break; |
| + | |
| + | case "shape": |
| + | e.setAttribute('_mce_style', v); |
| + | break; |
| + | } |
| + | |
| + | if (is(v) && v !== null && v.length !== 0) |
| + | e.setAttribute(n, '' + v, 2); |
| + | else |
| + | e.removeAttribute(n, 2); |
| + | }); |
| + | }, |
| + | |
| + | setAttribs : function(e, o) { |
| + | var t = this; |
| + | |
| + | return this.run(e, function(e) { |
| + | each(o, function(v, n) { |
| + | t.setAttrib(e, n, v); |
| + | }); |
| + | }); |
| + | }, |
| + | |
| + | getAttrib : function(e, n, dv) { |
| + | var v, t = this; |
| + | |
| + | e = t.get(e); |
| + | |
| + | if (!e || e.nodeType !== 1) |
| + | return false; |
| + | |
| + | if (!is(dv)) |
| + | dv = ''; |
| + | |
| + | // Try the mce variant for these |
| + | if (/^(src|href|style|coords|shape)$/.test(n)) { |
| + | v = e.getAttribute("_mce_" + n); |
| + | |
| + | if (v) |
| + | return v; |
| + | } |
| + | |
| + | if (isIE && t.props[n]) { |
| + | v = e[t.props[n]]; |
| + | v = v && v.nodeValue ? v.nodeValue : v; |
| + | } |
| + | |
| + | if (!v) |
| + | v = e.getAttribute(n, 2); |
| + | |
| + | // Check boolean attribs |
| + | if (/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(n)) { |
| + | if (e[t.props[n]] === true && v === '') |
| + | return n; |
| + | |
| + | return v ? n : ''; |
| + | } |
| + | |
| + | // Inner input elements will override attributes on form elements |
| + | if (e.nodeName === "FORM" && e.getAttributeNode(n)) |
| + | return e.getAttributeNode(n).nodeValue; |
| + | |
| + | if (n === 'style') { |
| + | v = v || e.style.cssText; |
| + | |
| + | if (v) { |
| + | v = t.serializeStyle(t.parseStyle(v), e.nodeName); |
| + | |
| + | if (t.settings.keep_values && !t._isRes(v)) |
| + | e.setAttribute('_mce_style', v); |
| + | } |
| + | } |
| + | |
| + | // Remove Apple and WebKit stuff |
| + | if (isWebKit && n === "class" && v) |
| + | v = v.replace(/(apple|webkit)\-[a-z\-]+/gi, ''); |
| + | |
| + | // Handle IE issues |
| + | if (isIE) { |
| + | switch (n) { |
| + | case 'rowspan': |
| + | case 'colspan': |
| + | // IE returns 1 as default value |
| + | if (v === 1) |
| + | v = ''; |
| + | |
| + | break; |
| + | |
| + | case 'size': |
| + | // IE returns +0 as default value for size |
| + | if (v === '+0' || v === 20 || v === 0) |
| + | v = ''; |
| + | |
| + | break; |
| + | |
| + | case 'width': |
| + | case 'height': |
| + | case 'vspace': |
| + | case 'checked': |
| + | case 'disabled': |
| + | case 'readonly': |
| + | if (v === 0) |
| + | v = ''; |
| + | |
| + | break; |
| + | |
| + | case 'hspace': |
| + | // IE returns -1 as default value |
| + | if (v === -1) |
| + | v = ''; |
| + | |
| + | break; |
| + | |
| + | case 'maxlength': |
| + | case 'tabindex': |
| + | // IE returns default value |
| + | if (v === 32768 || v === 2147483647 || v === '32768') |
| + | v = ''; |
| + | |
| + | break; |
| + | |
| + | case 'multiple': |
| + | case 'compact': |
| + | case 'noshade': |
| + | case 'nowrap': |
| + | if (v === 65535) |
| + | return n; |
| + | |
| + | return dv; |
| + | |
| + | case 'shape': |
| + | v = v.toLowerCase(); |
| + | break; |
| + | |
| + | default: |
| + | // IE has odd anonymous function for event attributes |
| + | if (n.indexOf('on') === 0 && v) |
| + | v = ('' + v).replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/, '$1'); |
| + | } |
| + | } |
| + | |
| + | return (v !== undefined && v !== null && v !== '') ? '' + v : dv; |
| + | }, |
| + | |
| + | getPos : function(n, ro) { |
| + | var t = this, x = 0, y = 0, e, d = t.doc, r; |
| + | |
| + | n = t.get(n); |
| + | ro = ro || d.body; |
| + | |
| + | if (n) { |
| + | // Use getBoundingClientRect on IE, Opera has it but it's not perfect |
| + | if (isIE && !t.stdMode) { |
| + | n = n.getBoundingClientRect(); |
| + | e = t.boxModel ? d.documentElement : d.body; |
| + | x = t.getStyle(t.select('html')[0], 'borderWidth'); // Remove border |
| + | x = (x == 'medium' || t.boxModel && !t.isIE6) && 2 || x; |
| + | |
| + | return {x : n.left + e.scrollLeft - x, y : n.top + e.scrollTop - x}; |
| + | } |
| + | |
| + | r = n; |
| + | while (r && r != ro && r.nodeType) { |
| + | x += r.offsetLeft || 0; |
| + | y += r.offsetTop || 0; |
| + | r = r.offsetParent; |
| + | } |
| + | |
| + | r = n.parentNode; |
| + | while (r && r != ro && r.nodeType) { |
| + | x -= r.scrollLeft || 0; |
| + | y -= r.scrollTop || 0; |
| + | r = r.parentNode; |
| + | } |
| + | } |
| + | |
| + | return {x : x, y : y}; |
| + | }, |
| + | |
| + | parseStyle : function(st) { |
| + | var t = this, s = t.settings, o = {}; |
| + | |
| + | if (!st) |
| + | return o; |
| + | |
| + | function compress(p, s, ot) { |
| + | var t, r, b, l; |
| + | |
| + | // Get values and check it it needs compressing |
| + | t = o[p + '-top' + s]; |
| + | if (!t) |
| + | return; |
| + | |
| + | r = o[p + '-right' + s]; |
| + | if (t != r) |
| + | return; |
| + | |
| + | b = o[p + '-bottom' + s]; |
| + | if (r != b) |
| + | return; |
| + | |
| + | l = o[p + '-left' + s]; |
| + | if (b != l) |
| + | return; |
| + | |
| + | // Compress |
| + | o[ot] = l; |
| + | delete o[p + '-top' + s]; |
| + | delete o[p + '-right' + s]; |
| + | delete o[p + '-bottom' + s]; |
| + | delete o[p + '-left' + s]; |
| + | }; |
| + | |
| + | function compress2(ta, a, b, c) { |
| + | var t; |
| + | |
| + | t = o[a]; |
| + | if (!t) |
| + | return; |
| + | |
| + | t = o[b]; |
| + | if (!t) |
| + | return; |
| + | |
| + | t = o[c]; |
| + | if (!t) |
| + | return; |
| + | |
| + | // Compress |
| + | o[ta] = o[a] + ' ' + o[b] + ' ' + o[c]; |
| + | delete o[a]; |
| + | delete o[b]; |
| + | delete o[c]; |
| + | }; |
| + | |
| + | st = st.replace(/&(#?[a-z0-9]+);/g, '&$1_MCE_SEMI_'); // Protect entities |
| + | |
| + | each(st.split(';'), function(v) { |
| + | var sv, ur = []; |
| + | |
| + | if (v) { |
| + | v = v.replace(/_MCE_SEMI_/g, ';'); // Restore entities |
| + | v = v.replace(/url\([^\)]+\)/g, function(v) {ur.push(v);return 'url(' + ur.length + ')';}); |
| + | v = v.split(':'); |
| + | sv = tinymce.trim(v[1]); |
| + | sv = sv.replace(/url\(([^\)]+)\)/g, function(a, b) {return ur[parseInt(b) - 1];}); |
| + | |
| + | sv = sv.replace(/rgb\([^\)]+\)/g, function(v) { |
| + | return t.toHex(v); |
| + | }); |
| + | |
| + | if (s.url_converter) { |
| + | sv = sv.replace(/url\([\'\"]?([^\)\'\"]+)[\'\"]?\)/g, function(x, c) { |
| + | return 'url(' + s.url_converter.call(s.url_converter_scope || t, t.decode(c), 'style', null) + ')'; |
| + | }); |
| + | } |
| + | |
| + | o[tinymce.trim(v[0]).toLowerCase()] = sv; |
| + | } |
| + | }); |
| + | |
| + | compress("border", "", "border"); |
| + | compress("border", "-width", "border-width"); |
| + | compress("border", "-color", "border-color"); |
| + | compress("border", "-style", "border-style"); |
| + | compress("padding", "", "padding"); |
| + | compress("margin", "", "margin"); |
| + | compress2('border', 'border-width', 'border-style', 'border-color'); |
| + | |
| + | if (isIE) { |
| + | // Remove pointless border |
| + | if (o.border == 'medium none') |
| + | o.border = ''; |
| + | } |
| + | |
| + | return o; |
| + | }, |
| + | |
| + | serializeStyle : function(o, name) { |
| + | var t = this, s = ''; |
| + | |
| + | function add(v, k) { |
| + | if (k && v) { |
| + | // Remove browser specific styles like -moz- or -webkit- |
| + | if (k.indexOf('-') === 0) |
| + | return; |
| + | |
| + | switch (k) { |
| + | case 'font-weight': |
| + | // Opera will output bold as 700 |
| + | if (v == 700) |
| + | v = 'bold'; |
| + | |
| + | break; |
| + | |
| + | case 'color': |
| + | case 'background-color': |
| + | v = v.toLowerCase(); |
| + | break; |
| + | } |
| + | |
| + | s += (s ? ' ' : '') + k + ': ' + v + ';'; |
| + | } |
| + | }; |
| + | |
| + | // Validate style output |
| + | if (name && t._styles) { |
| + | each(t._styles['*'], function(name) { |
| + | add(o[name], name); |
| + | }); |
| + | |
| + | each(t._styles[name.toLowerCase()], function(name) { |
| + | add(o[name], name); |
| + | }); |
| + | } else |
| + | each(o, add); |
| + | |
| + | return s; |
| + | }, |
| + | |
| + | loadCSS : function(u) { |
| + | var t = this, d = t.doc, head; |
| + | |
| + | if (!u) |
| + | u = ''; |
| + | |
| + | head = t.select('head')[0]; |
| + | |
| + | each(u.split(','), function(u) { |
| + | var link; |
| + | |
| + | if (t.files[u]) |
| + | return; |
| + | |
| + | t.files[u] = true; |
| + | link = t.create('link', {rel : 'stylesheet', href : tinymce._addVer(u)}); |
| + | |
| + | // IE 8 has a bug where dynamically loading stylesheets would produce a 1 item remaining bug |
| + | // This fix seems to resolve that issue by realcing the document ones a stylesheet finishes loading |
| + | // It's ugly but it seems to work fine. |
| + | if (isIE && d.documentMode) { |
| + | link.onload = function() { |
| + | d.recalc(); |
| + | link.onload = null; |
| + | }; |
| + | } |
| + | |
| + | head.appendChild(link); |
| + | }); |
| + | }, |
| + | |
| + | addClass : function(e, c) { |
| + | return this.run(e, function(e) { |
| + | var o; |
| + | |
| + | if (!c) |
| + | return 0; |
| + | |
| + | if (this.hasClass(e, c)) |
| + | return e.className; |
| + | |
| + | o = this.removeClass(e, c); |
| + | |
| + | return e.className = (o != '' ? (o + ' ') : '') + c; |
| + | }); |
| + | }, |
| + | |
| + | removeClass : function(e, c) { |
| + | var t = this, re; |
| + | |
| + | return t.run(e, function(e) { |
| + | var v; |
| + | |
| + | if (t.hasClass(e, c)) { |
| + | if (!re) |
| + | re = new RegExp("(^|\\s+)" + c + "(\\s+|$)", "g"); |
| + | |
| + | v = e.className.replace(re, ' '); |
| + | v = tinymce.trim(v != ' ' ? v : ''); |
| + | |
| + | e.className = v; |
| + | |
| + | // Empty class attr |
| + | if (!v) { |
| + | e.removeAttribute('class'); |
| + | e.removeAttribute('className'); |
| + | } |
| + | |
| + | return v; |
| + | } |
| + | |
| + | return e.className; |
| + | }); |
| + | }, |
| + | |
| + | hasClass : function(n, c) { |
| + | n = this.get(n); |
| + | |
| + | if (!n || !c) |
| + | return false; |
| + | |
| + | return (' ' + n.className + ' ').indexOf(' ' + c + ' ') !== -1; |
| + | }, |
| + | |
| + | show : function(e) { |
| + | return this.setStyle(e, 'display', 'block'); |
| + | }, |
| + | |
| + | hide : function(e) { |
| + | return this.setStyle(e, 'display', 'none'); |
| + | }, |
| + | |
| + | isHidden : function(e) { |
| + | e = this.get(e); |
| + | |
| + | return !e || e.style.display == 'none' || this.getStyle(e, 'display') == 'none'; |
| + | }, |
| + | |
| + | uniqueId : function(p) { |
| + | return (!p ? 'mce_' : p) + (this.counter++); |
| + | }, |
| + | |
| + | setHTML : function(e, h) { |
| + | var t = this; |
| + | |
| + | return this.run(e, function(e) { |
| + | var x, i, nl, n, p, x; |
| + | |
| + | h = t.processHTML(h); |
| + | |
| + | if (isIE) { |
| + | function set() { |
| + | // Remove all child nodes |
| + | while (e.firstChild) |
| + | e.firstChild.removeNode(); |
| + | |
| + | try { |
| + | // IE will remove comments from the beginning |
| + | // unless you padd the contents with something |
| + | e.innerHTML = '<br />' + h; |
| + | e.removeChild(e.firstChild); |
| + | } catch (ex) { |
| + | // IE sometimes produces an unknown runtime error on innerHTML if it's an block element within a block element for example a div inside a p |
| + | // This seems to fix this problem |
| + | |
| + | // Create new div with HTML contents and a BR infront to keep comments |
| + | x = t.create('div'); |
| + | x.innerHTML = '<br />' + h; |
| + | |
| + | // Add all children from div to target |
| + | each (x.childNodes, function(n, i) { |
| + | // Skip br element |
| + | if (i) |
| + | e.appendChild(n); |
| + | }); |
| + | } |
| + | }; |
| + | |
| + | // IE has a serious bug when it comes to paragraphs it can produce an invalid |
| + | // DOM tree if contents like this <p><ul><li>Item 1</li></ul></p> is inserted |
| + | // It seems to be that IE doesn't like a root block element placed inside another root block element |
| + | if (t.settings.fix_ie_paragraphs) |
| + | h = h.replace(/<p><\/p>|<p([^>]+)><\/p>|<p[^\/+]\/>/gi, '<p$1 _mce_keep="true"> </p>'); |
| + | |
| + | set(); |
| + | |
| + | if (t.settings.fix_ie_paragraphs) { |
| + | // Check for odd paragraphs this is a sign of a broken DOM |
| + | nl = e.getElementsByTagName("p"); |
| + | for (i = nl.length - 1, x = 0; i >= 0; i--) { |
| + | n = nl[i]; |
| + | |
| + | if (!n.hasChildNodes()) { |
| + | if (!n._mce_keep) { |
| + | x = 1; // Is broken |
| + | break; |
| + | } |
| + | |
| + | n.removeAttribute('_mce_keep'); |
| + | } |
| + | } |
| + | } |
| + | |
| + | // Time to fix the madness IE left us |
| + | if (x) { |
| + | // So if we replace the p elements with divs and mark them and then replace them back to paragraphs |
| + | // after we use innerHTML we can fix the DOM tree |
| + | h = h.replace(/<p ([^>]+)>|<p>/ig, '<div $1 _mce_tmp="1">'); |
| + | h = h.replace(/<\/p>/gi, '</div>'); |
| + | |
| + | // Set the new HTML with DIVs |
| + | set(); |
| + | |
| + | // Replace all DIV elements with the _mce_tmp attibute back to paragraphs |
| + | // This is needed since IE has a annoying bug see above for details |
| + | // This is a slow process but it has to be done. :( |
| + | if (t.settings.fix_ie_paragraphs) { |
| + | nl = e.getElementsByTagName("DIV"); |
| + | for (i = nl.length - 1; i >= 0; i--) { |
| + | n = nl[i]; |
| + | |
| + | // Is it a temp div |
| + | if (n._mce_tmp) { |
| + | // Create new paragraph |
| + | p = t.doc.createElement('p'); |
| + | |
| + | // Copy all attributes |
| + | n.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi, function(a, b) { |
| + | var v; |
| + | |
| + | if (b !== '_mce_tmp') { |
| + | v = n.getAttribute(b); |
| + | |
| + | if (!v && b === 'class') |
| + | v = n.className; |
| + | |
| + | p.setAttribute(b, v); |
| + | } |
| + | }); |
| + | |
| + | // Append all children to new paragraph |
| + | for (x = 0; x<n.childNodes.length; x++) |
| + | p.appendChild(n.childNodes[x].cloneNode(true)); |
| + | |
| + | // Replace div with new paragraph |
| + | n.swapNode(p); |
| + | } |
| + | } |
| + | } |
| + | } |
| + | } else |
| + | e.innerHTML = h; |
| + | |
| + | return h; |
| + | }); |
| + | }, |
| + | |
| + | processHTML : function(h) { |
| + | var t = this, s = t.settings, codeBlocks = []; |
| + | |
| + | if (!s.process_html) |
| + | return h; |
| + | |
| + | if (isIE) { |
| + | h = h.replace(/'/g, '''); // IE can't handle apos |
| + | h = h.replace(/\s+(disabled|checked|readonly|selected)\s*=\s*[\"\']?(false|0)[\"\']?/gi, ''); // IE doesn't handle default values correct |
| + | } |
| + | |
| + | // Fix some issues |
| + | h = h.replace(/<a( )([^>]+)\/>|<a\/>/gi, '<a$1$2></a>'); // Force open |
| + | |
| + | // Store away src and href in _mce_src and mce_href since browsers mess them up |
| + | if (s.keep_values) { |
| + | // Wrap scripts and styles in comments for serialization purposes |
| + | if (/<script|noscript|style/i.test(h)) { |
| + | function trim(s) { |
| + | // Remove prefix and suffix code for element |
| + | s = s.replace(/(<!--\[CDATA\[|\]\]-->)/g, '\n'); |
| + | s = s.replace(/^[\r\n]*|[\r\n]*$/g, ''); |
| + | s = s.replace(/^\s*(\/\/\s*<!--|\/\/\s*<!\[CDATA\[|<!--|<!\[CDATA\[)[\r\n]*/g, ''); |
| + | s = s.replace(/\s*(\/\/\s*\]\]>|\/\/\s*-->|\]\]>|-->|\]\]-->)\s*$/g, ''); |
| + | |
| + | return s; |
| + | }; |
| + | |
| + | // Wrap the script contents in CDATA and keep them from executing |
| + | h = h.replace(/<script([^>]+|)>([\s\S]*?)<\/script>/gi, function(v, attribs, text) { |
| + | // Force type attribute |
| + | if (!attribs) |
| + | attribs = ' type="text/javascript"'; |
| + | |
| + | // Convert the src attribute of the scripts |
| + | attribs = attribs.replace(/src=\"([^\"]+)\"?/i, function(a, url) { |
| + | if (s.url_converter) |
| + | url = t.encode(s.url_converter.call(s.url_converter_scope || t, t.decode(url), 'src', 'script')); |
| + | |
| + | return '_mce_src="' + url + '"'; |
| + | }); |
| + | |
| + | // Wrap text contents |
| + | if (tinymce.trim(text)) { |
| + | codeBlocks.push(trim(text)); |
| + | text = '<!--\nMCE_SCRIPT:' + (codeBlocks.length - 1) + '\n// -->'; |
| + | } |
| + | |
| + | return '<mce:script' + attribs + '>' + text + '</mce:script>'; |
| + | }); |
| + | |
| + | // Wrap style elements |
| + | h = h.replace(/<style([^>]+|)>([\s\S]*?)<\/style>/gi, function(v, attribs, text) { |
| + | // Wrap text contents |
| + | if (text) { |
| + | codeBlocks.push(trim(text)); |
| + | text = '<!--\nMCE_SCRIPT:' + (codeBlocks.length - 1) + '\n-->'; |
| + | } |
| + | |
| + | return '<mce:style' + attribs + '>' + text + '</mce:style><style ' + attribs + ' _mce_bogus="1">' + text + '</style>'; |
| + | }); |
| + | |
| + | // Wrap noscript elements |
| + | h = h.replace(/<noscript([^>]+|)>([\s\S]*?)<\/noscript>/g, function(v, attribs, text) { |
| + | return '<mce:noscript' + attribs + '><!--' + t.encode(text).replace(/--/g, '--') + '--></mce:noscript>'; |
| + | }); |
| + | } |
| + | |
| + | h = h.replace(/<!\[CDATA\[([\s\S]+)\]\]>/g, '<!--[CDATA[$1]]-->'); |
| + | |
| + | // This function processes the attributes in the HTML string to force boolean |
| + | // attributes to the attr="attr" format and convert style, src and href to _mce_ versions |
| + | function processTags(html) { |
| + | return html.replace(tagRegExp, function(match, elm_name, attrs, end) { |
| + | return '<' + elm_name + attrs.replace(attrRegExp, function(match, name, value, val2, val3) { |
| + | var mceValue; |
| + | |
| + | name = name.toLowerCase(); |
| + | value = value || val2 || val3 || ""; |
| + | |
| + | // Treat boolean attributes |
| + | if (boolAttrs[name]) { |
| + | // false or 0 is treated as a missing attribute |
| + | if (value === 'false' || value === '0') |
| + | return; |
| + | |
| + | return name + '="' + name + '"'; |
| + | } |
| + | |
| + | // Is attribute one that needs special treatment |
| + | if (mceAttribs[name] && attrs.indexOf('_mce_' + name) == -1) { |
| + | mceValue = t.decode(value); |
| + | |
| + | // Convert URLs to relative/absolute ones |
| + | if (s.url_converter && (name == "src" || name == "href")) |
| + | mceValue = s.url_converter.call(s.url_converter_scope || t, mceValue, name, elm_name); |
| + | |
| + | // Process styles lowercases them and compresses them |
| + | if (name == 'style') |
| + | mceValue = t.serializeStyle(t.parseStyle(mceValue), name); |
| + | |
| + | return name + '="' + value + '"' + ' _mce_' + name + '="' + t.encode(mceValue) + '"'; |
| + | } |
| + | |
| + | return match; |
| + | }) + end + '>'; |
| + | }); |
| + | }; |
| + | |
| + | h = processTags(h); |
| + | |
| + | // Restore script blocks |
| + | h = h.replace(/MCE_SCRIPT:([0-9]+)/g, function(val, idx) { |
| + | return codeBlocks[idx]; |
| + | }); |
| + | } |
| + | |
| + | return h; |
| + | }, |
| + | |
| + | getOuterHTML : function(e) { |
| + | var d; |
| + | |
| + | e = this.get(e); |
| + | |
| + | if (!e) |
| + | return null; |
| + | |
| + | if (e.outerHTML !== undefined) |
| + | return e.outerHTML; |
| + | |
| + | d = (e.ownerDocument || this.doc).createElement("body"); |
| + | d.appendChild(e.cloneNode(true)); |
| + | |
| + | return d.innerHTML; |
| + | }, |
| + | |
| + | setOuterHTML : function(e, h, d) { |
| + | var t = this; |
| + | |
| + | function setHTML(e, h, d) { |
| + | var n, tp; |
| + | |
| + | tp = d.createElement("body"); |
| + | tp.innerHTML = h; |
| + | |
| + | n = tp.lastChild; |
| + | while (n) { |
| + | t.insertAfter(n.cloneNode(true), e); |
| + | n = n.previousSibling; |
| + | } |
| + | |
| + | t.remove(e); |
| + | }; |
| + | |
| + | return this.run(e, function(e) { |
| + | e = t.get(e); |
| + | |
| + | // Only set HTML on elements |
| + | if (e.nodeType == 1) { |
| + | d = d || e.ownerDocument || t.doc; |
| + | |
| + | if (isIE) { |
| + | try { |
| + | // Try outerHTML for IE it sometimes produces an unknown runtime error |
| + | if (isIE && e.nodeType == 1) |
| + | e.outerHTML = h; |
| + | else |
| + | setHTML(e, h, d); |
| + | } catch (ex) { |
| + | // Fix for unknown runtime error |
| + | setHTML(e, h, d); |
| + | } |
| + | } else |
| + | setHTML(e, h, d); |
| + | } |
| + | }); |
| + | }, |
| + | |
| + | decode : function(s) { |
| + | var e, n, v; |
| + | |
| + | // Look for entities to decode |
| + | if (/&[\w#]+;/.test(s)) { |
| + | // Decode the entities using a div element not super efficient but less code |
| + | e = this.doc.createElement("div"); |
| + | e.innerHTML = s; |
| + | n = e.firstChild; |
| + | v = ''; |
| + | |
| + | if (n) { |
| + | do { |
| + | v += n.nodeValue; |
| + | } while (n = n.nextSibling); |
| + | } |
| + | |
| + | return v || s; |
| + | } |
| + | |
| + | return s; |
| + | }, |
| + | |
| + | encode : function(str) { |
| + | return ('' + str).replace(encodeCharsRe, function(chr) { |
| + | return encodedChars[chr]; |
| + | }); |
| + | }, |
| + | |
| + | insertAfter : function(node, reference_node) { |
| + | reference_node = this.get(reference_node); |
| + | |
| + | return this.run(node, function(node) { |
| + | var parent, nextSibling; |
| + | |
| + | parent = reference_node.parentNode; |
| + | nextSibling = reference_node.nextSibling; |
| + | |
| + | if (nextSibling) |
| + | parent.insertBefore(node, nextSibling); |
| + | else |
| + | parent.appendChild(node); |
| + | |
| + | return node; |
| + | }); |
| + | }, |
| + | |
| + | isBlock : function(n) { |
| + | if (n.nodeType && n.nodeType !== 1) |
| + | return false; |
| + | |
| + | n = n.nodeName || n; |
| + | |
| + | return blockRe.test(n); |
| + | }, |
| + | |
| + | replace : function(n, o, k) { |
| + | var t = this; |
| + | |
| + | if (is(o, 'array')) |
| + | n = n.cloneNode(true); |
| + | |
| + | return t.run(o, function(o) { |
| + | if (k) { |
| + | each(tinymce.grep(o.childNodes), function(c) { |
| + | n.appendChild(c); |
| + | }); |
| + | } |
| + | |
| + | return o.parentNode.replaceChild(n, o); |
| + | }); |
| + | }, |
| + | |
| + | rename : function(elm, name) { |
| + | var t = this, newElm; |
| + | |
| + | if (elm.nodeName != name.toUpperCase()) { |
| + | // Rename block element |
| + | newElm = t.create(name); |
| + | |
| + | // Copy attribs to new block |
| + | each(t.getAttribs(elm), function(attr_node) { |
| + | t.setAttrib(newElm, attr_node.nodeName, t.getAttrib(elm, attr_node.nodeName)); |
| + | }); |
| + | |
| + | // Replace block |
| + | t.replace(newElm, elm, 1); |
| + | } |
| + | |
| + | return newElm || elm; |
| + | }, |
| + | |
| + | findCommonAncestor : function(a, b) { |
| + | var ps = a, pe; |
| + | |
| + | while (ps) { |
| + | pe = b; |
| + | |
| + | while (pe && ps != pe) |
| + | pe = pe.parentNode; |
| + | |
| + | if (ps == pe) |
| + | break; |
| + | |
| + | ps = ps.parentNode; |
| + | } |
| + | |
| + | if (!ps && a.ownerDocument) |
| + | return a.ownerDocument.documentElement; |
| + | |
| + | return ps; |
| + | }, |
| + | |
| + | toHex : function(s) { |
| + | var c = /^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(s); |
| + | |
| + | function hex(s) { |
| + | s = parseInt(s).toString(16); |
| + | |
| + | return s.length > 1 ? s : '0' + s; // 0 -> 00 |
| + | }; |
| + | |
| + | if (c) { |
| + | s = '#' + hex(c[1]) + hex(c[2]) + hex(c[3]); |
| + | |
| + | return s; |
| + | } |
| + | |
| + | return s; |
| + | }, |
| + | |
| + | getClasses : function() { |
| + | var t = this, cl = [], i, lo = {}, f = t.settings.class_filter, ov; |
| + | |
| + | if (t.classes) |
| + | return t.classes; |
| + | |
| + | function addClasses(s) { |
| + | // IE style imports |
| + | each(s.imports, function(r) { |
| + | addClasses(r); |
| + | }); |
| + | |
| + | each(s.cssRules || s.rules, function(r) { |
| + | // Real type or fake it on IE |
| + | switch (r.type || 1) { |
| + | // Rule |
| + | case 1: |
| + | if (r.selectorText) { |
| + | each(r.selectorText.split(','), function(v) { |
| + | v = v.replace(/^\s*|\s*$|^\s\./g, ""); |
| + | |
| + | // Is internal or it doesn't contain a class |
| + | if (/\.mce/.test(v) || !/\.[\w\-]+$/.test(v)) |
| + | return; |
| + | |
| + | // Remove everything but class name |
| + | ov = v; |
| + | v = v.replace(/.*\.([a-z0-9_\-]+).*/i, '$1'); |
| + | |
| + | // Filter classes |
| + | if (f && !(v = f(v, ov))) |
| + | return; |
| + | |
| + | if (!lo[v]) { |
| + | cl.push({'class' : v}); |
| + | lo[v] = 1; |
| + | } |
| + | }); |
| + | } |
| + | break; |
| + | |
| + | // Import |
| + | case 3: |
| + | addClasses(r.styleSheet); |
| + | break; |
| + | } |
| + | }); |
| + | }; |
| + | |
| + | try { |
| + | each(t.doc.styleSheets, addClasses); |
| + | } catch (ex) { |
| + | // Ignore |
| + | } |
| + | |
| + | if (cl.length > 0) |
| + | t.classes = cl; |
| + | |
| + | return cl; |
| + | }, |
| + | |
| + | run : function(e, f, s) { |
| + | var t = this, o; |
| + | |
| + | if (t.doc && typeof(e) === 'string') |
| + | e = t.get(e); |
| + | |
| + | if (!e) |
| + | return false; |
| + | |
| + | s = s || this; |
| + | if (!e.nodeType && (e.length || e.length === 0)) { |
| + | o = []; |
| + | |
| + | each(e, function(e, i) { |
| + | if (e) { |
| + | if (typeof(e) == 'string') |
| + | e = t.doc.getElementById(e); |
| + | |
| + | o.push(f.call(s, e, i)); |
| + | } |
| + | }); |
| + | |
| + | return o; |
| + | } |
| + | |
| + | return f.call(s, e); |
| + | }, |
| + | |
| + | getAttribs : function(n) { |
| + | var o; |
| + | |
| + | n = this.get(n); |
| + | |
| + | if (!n) |
| + | return []; |
| + | |
| + | if (isIE) { |
| + | o = []; |
| + | |
| + | // Object will throw exception in IE |
| + | if (n.nodeName == 'OBJECT') |
| + | return n.attributes; |
| + | |
| + | // IE doesn't keep the selected attribute if you clone option elements |
| + | if (n.nodeName === 'OPTION' && this.getAttrib(n, 'selected')) |
| + | o.push({specified : 1, nodeName : 'selected'}); |
| + | |
| + | // It's crazy that this is faster in IE but it's because it returns all attributes all the time |
| + | n.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi, '').replace(/[\w:\-]+/gi, function(a) { |
| + | o.push({specified : 1, nodeName : a}); |
| + | }); |
| + | |
| + | return o; |
| + | } |
| + | |
| + | return n.attributes; |
| + | }, |
| + | |
| + | destroy : function(s) { |
| + | var t = this; |
| + | |
| + | if (t.events) |
| + | t.events.destroy(); |
| + | |
| + | t.win = t.doc = t.root = t.events = null; |
| + | |
| + | // Manual destroy then remove unload handler |
| + | if (!s) |
| + | tinymce.removeUnload(t.destroy); |
| + | }, |
| + | |
| + | createRng : function() { |
| + | var d = this.doc; |
| + | |
| + | return d.createRange ? d.createRange() : new tinymce.dom.Range(this); |
| + | }, |
| + | |
| + | nodeIndex : function(node, normalized) { |
| + | var idx = 0, lastNodeType, lastNode, nodeType; |
| + | |
| + | if (node) { |
| + | for (lastNodeType = node.nodeType, node = node.previousSibling, lastNode = node; node; node = node.previousSibling) { |
| + | nodeType = node.nodeType; |
| + | |
| + | // Normalize text nodes |
| + | if (normalized && nodeType == 3) { |
| + | if (nodeType == lastNodeType || !node.nodeValue.length) |
| + | continue; |
| + | } |
| + | |
| + | idx++; |
| + | lastNodeType = nodeType; |
| + | } |
| + | } |
| + | |
| + | return idx; |
| + | }, |
| + | |
| + | split : function(pe, e, re) { |
| + | var t = this, r = t.createRng(), bef, aft, pa; |
| + | |
| + | // W3C valid browsers tend to leave empty nodes to the left/right side of the contents, this makes sense |
| + | // but we don't want that in our code since it serves no purpose for the end user |
| + | // For example if this is chopped: |
| + | // <p>text 1<span><b>CHOP</b></span>text 2</p> |
| + | // would produce: |
| + | // <p>text 1<span></span></p><b>CHOP</b><p><span></span>text 2</p> |
| + | // this function will then trim of empty edges and produce: |
| + | // <p>text 1</p><b>CHOP</b><p>text 2</p> |
| + | function trim(node) { |
| + | var i, children = node.childNodes; |
| + | |
| + | if (node.nodeType == 1 && node.getAttribute('_mce_type') == 'bookmark') |
| + | return; |
| + | |
| + | for (i = children.length - 1; i >= 0; i--) |
| + | trim(children[i]); |
| + | |
| + | if (node.nodeType != 9) { |
| + | // Keep non whitespace text nodes |
| + | if (node.nodeType == 3 && node.nodeValue.length > 0) |
| + | return; |
| + | |
| + | if (node.nodeType == 1) { |
| + | // If the only child is a bookmark then move it up |
| + | children = node.childNodes; |
| + | if (children.length == 1 && children[0] && children[0].nodeType == 1 && children[0].getAttribute('_mce_type') == 'bookmark') |
| + | node.parentNode.insertBefore(children[0], node); |
| + | |
| + | // Keep non empty elements or img, hr etc |
| + | if (children.length || /^(br|hr|input|img)$/i.test(node.nodeName)) |
| + | return; |
| + | } |
| + | |
| + | t.remove(node); |
| + | } |
| + | |
| + | return node; |
| + | }; |
| + | |
| + | if (pe && e) { |
| + | // Get before chunk |
| + | r.setStart(pe.parentNode, t.nodeIndex(pe)); |
| + | r.setEnd(e.parentNode, t.nodeIndex(e)); |
| + | bef = r.extractContents(); |
| + | |
| + | // Get after chunk |
| + | r = t.createRng(); |
| + | r.setStart(e.parentNode, t.nodeIndex(e) + 1); |
| + | r.setEnd(pe.parentNode, t.nodeIndex(pe) + 1); |
| + | aft = r.extractContents(); |
| + | |
| + | // Insert before chunk |
| + | pa = pe.parentNode; |
| + | pa.insertBefore(trim(bef), pe); |
| + | |
| + | // Insert middle chunk |
| + | if (re) |
| + | pa.replaceChild(re, e); |
| + | else |
| + | pa.insertBefore(e, pe); |
| + | |
| + | // Insert after chunk |
| + | pa.insertBefore(trim(aft), pe); |
| + | t.remove(pe); |
| + | |
| + | return re || e; |
| + | } |
| + | }, |
| + | |
| + | bind : function(target, name, func, scope) { |
| + | var t = this; |
| + | |
| + | if (!t.events) |
| + | t.events = new tinymce.dom.EventUtils(); |
| + | |
| + | return t.events.add(target, name, func, scope || this); |
| + | }, |
| + | |
| + | unbind : function(target, name, func) { |
| + | var t = this; |
| + | |
| + | if (!t.events) |
| + | t.events = new tinymce.dom.EventUtils(); |
| + | |
| + | return t.events.remove(target, name, func); |
| + | }, |
| + | |
| + | |
| + | _findSib : function(node, selector, name) { |
| + | var t = this, f = selector; |
| + | |
| + | if (node) { |
| + | // If expression make a function of it using is |
| + | if (is(f, 'string')) { |
| + | f = function(node) { |
| + | return t.is(node, selector); |
| + | }; |
| + | } |
| + | |
| + | // Loop all siblings |
| + | for (node = node[name]; node; node = node[name]) { |
| + | if (f(node)) |
| + | return node; |
| + | } |
| + | } |
| + | |
| + | return null; |
| + | }, |
| + | |
| + | _isRes : function(c) { |
| + | // Is live resizble element |
| + | return /^(top|left|bottom|right|width|height)/i.test(c) || /;\s*(top|left|bottom|right|width|height)/i.test(c); |
| + | } |
| + | |
| + | /* |
| + | walk : function(n, f, s) { |
| + | var d = this.doc, w; |
| + | |
| + | if (d.createTreeWalker) { |
| + | w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false); |
| + | |
| + | while ((n = w.nextNode()) != null) |
| + | f.call(s || this, n); |
| + | } else |
| + | tinymce.walk(n, f, 'childNodes', s); |
| + | } |
| + | */ |
| + | |
| + | /* |
| + | toRGB : function(s) { |
| + | var c = /^\s*?#([0-9A-F]{2})([0-9A-F]{1,2})([0-9A-F]{2})?\s*?$/.exec(s); |
| + | |
| + | if (c) { |
| + | // #FFF -> #FFFFFF |
| + | if (!is(c[3])) |
| + | c[3] = c[2] = c[1]; |
| + | |
| + | return "rgb(" + parseInt(c[1], 16) + "," + parseInt(c[2], 16) + "," + parseInt(c[3], 16) + ")"; |
| + | } |
| + | |
| + | return s; |
| + | } |
| + | */ |
| + | }); |
| + | |
| + | tinymce.DOM = new tinymce.dom.DOMUtils(document, {process_html : 0}); |
| + | })(tinymce); |
| + | |
| + | (function(ns) { |
| + | // Range constructor |
| + | function Range(dom) { |
| + | var t = this, |
| + | doc = dom.doc, |
| + | EXTRACT = 0, |
| + | CLONE = 1, |
| + | DELETE = 2, |
| + | TRUE = true, |
| + | FALSE = false, |
| + | START_OFFSET = 'startOffset', |
| + | START_CONTAINER = 'startContainer', |
| + | END_CONTAINER = 'endContainer', |
| + | END_OFFSET = 'endOffset', |
| + | extend = tinymce.extend, |
| + | nodeIndex = dom.nodeIndex; |
| + | |
| + | extend(t, { |
| + | // Inital states |
| + | startContainer : doc, |
| + | startOffset : 0, |
| + | endContainer : doc, |
| + | endOffset : 0, |
| + | collapsed : TRUE, |
| + | commonAncestorContainer : doc, |
| + | |
| + | // Range constants |
| + | START_TO_START : 0, |
| + | START_TO_END : 1, |
| + | END_TO_END : 2, |
| + | END_TO_START : 3, |
| + | |
| + | // Public methods |
| + | setStart : setStart, |
| + | setEnd : setEnd, |
| + | setStartBefore : setStartBefore, |
| + | setStartAfter : setStartAfter, |
| + | setEndBefore : setEndBefore, |
| + | setEndAfter : setEndAfter, |
| + | collapse : collapse, |
| + | selectNode : selectNode, |
| + | selectNodeContents : selectNodeContents, |
| + | compareBoundaryPoints : compareBoundaryPoints, |
| + | deleteContents : deleteContents, |
| + | extractContents : extractContents, |
| + | cloneContents : cloneContents, |
| + | insertNode : insertNode, |
| + | surroundContents : surroundContents, |
| + | cloneRange : cloneRange |
| + | }); |
| + | |
| + | function setStart(n, o) { |
| + | _setEndPoint(TRUE, n, o); |
| + | }; |
| + | |
| + | function setEnd(n, o) { |
| + | _setEndPoint(FALSE, n, o); |
| + | }; |
| + | |
| + | function setStartBefore(n) { |
| + | setStart(n.parentNode, nodeIndex(n)); |
| + | }; |
| + | |
| + | function setStartAfter(n) { |
| + | setStart(n.parentNode, nodeIndex(n) + 1); |
| + | }; |
| + | |
| + | function setEndBefore(n) { |
| + | setEnd(n.parentNode, nodeIndex(n)); |
| + | }; |
| + | |
| + | function setEndAfter(n) { |
| + | setEnd(n.parentNode, nodeIndex(n) + 1); |
| + | }; |
| + | |
| + | function collapse(ts) { |
| + | if (ts) { |
| + | t[END_CONTAINER] = t[START_CONTAINER]; |
| + | t[END_OFFSET] = t[START_OFFSET]; |
| + | } else { |
| + | t[START_CONTAINER] = t[END_CONTAINER]; |
| + | t[START_OFFSET] = t[END_OFFSET]; |
| + | } |
| + | |
| + | t.collapsed = TRUE; |
| + | }; |
| + | |
| + | function selectNode(n) { |
| + | setStartBefore(n); |
| + | setEndAfter(n); |
| + | }; |
| + | |
| + | function selectNodeContents(n) { |
| + | setStart(n, 0); |
| + | setEnd(n, n.nodeType === 1 ? n.childNodes.length : n.nodeValue.length); |
| + | }; |
| + | |
| + | function compareBoundaryPoints(h, r) { |
| + | var sc = t[START_CONTAINER], so = t[START_OFFSET], ec = t[END_CONTAINER], eo = t[END_OFFSET]; |
| + | |
| + | // Check START_TO_START |
| + | if (h === 0) |
| + | return _compareBoundaryPoints(sc, so, sc, so); |
| + | |
| + | // Check START_TO_END |
| + | if (h === 1) |
| + | return _compareBoundaryPoints(sc, so, ec, eo); |
| + | |
| + | // Check END_TO_END |
| + | if (h === 2) |
| + | return _compareBoundaryPoints(ec, eo, ec, eo); |
| + | |
| + | // Check END_TO_START |
| + | if (h === 3) |
| + | return _compareBoundaryPoints(ec, eo, sc, so); |
| + | }; |
| + | |
| + | function deleteContents() { |
| + | _traverse(DELETE); |
| + | }; |
| + | |
| + | function extractContents() { |
| + | return _traverse(EXTRACT); |
| + | }; |
| + | |
| + | function cloneContents() { |
| + | return _traverse(CLONE); |
| + | }; |
| + | |
| + | function insertNode(n) { |
| + | var startContainer = this[START_CONTAINER], |
| + | startOffset = this[START_OFFSET], nn, o; |
| + | |
| + | // Node is TEXT_NODE or CDATA |
| + | if ((startContainer.nodeType === 3 || startContainer.nodeType === 4) && startContainer.nodeValue) { |
| + | if (!startOffset) { |
| + | // At the start of text |
| + | startContainer.parentNode.insertBefore(n, startContainer); |
| + | } else if (startOffset >= startContainer.nodeValue.length) { |
| + | // At the end of text |
| + | dom.insertAfter(n, startContainer); |
| + | } else { |
| + | // Middle, need to split |
| + | nn = startContainer.splitText(startOffset); |
| + | startContainer.parentNode.insertBefore(n, nn); |
| + | } |
| + | } else { |
| + | // Insert element node |
| + | if (startContainer.childNodes.length > 0) |
| + | o = startContainer.childNodes[startOffset]; |
| + | |
| + | if (o) |
| + | startContainer.insertBefore(n, o); |
| + | else |
| + | startContainer.appendChild(n); |
| + | } |
| + | }; |
| + | |
| + | function surroundContents(n) { |
| + | var f = t.extractContents(); |
| + | |
| + | t.insertNode(n); |
| + | n.appendChild(f); |
| + | t.selectNode(n); |
| + | }; |
| + | |
| + | function cloneRange() { |
| + | return extend(new Range(dom), { |
| + | startContainer : t[START_CONTAINER], |
| + | startOffset : t[START_OFFSET], |
| + | endContainer : t[END_CONTAINER], |
| + | endOffset : t[END_OFFSET], |
| + | collapsed : t.collapsed, |
| + | commonAncestorContainer : t.commonAncestorContainer |
| + | }); |
| + | }; |
| + | |
| + | // Private methods |
| + | |
| + | function _getSelectedNode(container, offset) { |
| + | var child; |
| + | |
| + | if (container.nodeType == 3 /* TEXT_NODE */) |
| + | return container; |
| + | |
| + | if (offset < 0) |
| + | return container; |
| + | |
| + | child = container.firstChild; |
| + | while (child && offset > 0) { |
| + | --offset; |
| + | child = child.nextSibling; |
| + | } |
| + | |
| + | if (child) |
| + | return child; |
| + | |
| + | return container; |
| + | }; |
| + | |
| + | function _isCollapsed() { |
| + | return (t[START_CONTAINER] == t[END_CONTAINER] && t[START_OFFSET] == t[END_OFFSET]); |
| + | }; |
| + | |
| + | function _compareBoundaryPoints(containerA, offsetA, containerB, offsetB) { |
| + | var c, offsetC, n, cmnRoot, childA, childB; |
| + | |
| + | // In the first case the boundary-points have the same container. A is before B |
| + | // if its offset is less than the offset of B, A is equal to B if its offset is |
| + | // equal to the offset of B, and A is after B if its offset is greater than the |
| + | // offset of B. |
| + | if (containerA == containerB) { |
| + | if (offsetA == offsetB) |
| + | return 0; // equal |
| + | |
| + | if (offsetA < offsetB) |
| + | return -1; // before |
| + | |
| + | return 1; // after |
| + | } |
| + | |
| + | // In the second case a child node C of the container of A is an ancestor |
| + | // container of B. In this case, A is before B if the offset of A is less than or |
| + | // equal to the index of the child node C and A is after B otherwise. |
| + | c = containerB; |
| + | while (c && c.parentNode != containerA) |
| + | c = c.parentNode; |
| + | |
| + | if (c) { |
| + | offsetC = 0; |
| + | n = containerA.firstChild; |
| + | |
| + | while (n != c && offsetC < offsetA) { |
| + | offsetC++; |
| + | n = n.nextSibling; |
| + | } |
| + | |
| + | if (offsetA <= offsetC) |
| + | return -1; // before |
| + | |
| + | return 1; // after |
| + | } |
| + | |
| + | // In the third case a child node C of the container of B is an ancestor container |
| + | // of A. In this case, A is before B if the index of the child node C is less than |
| + | // the offset of B and A is after B otherwise. |
| + | c = containerA; |
| + | while (c && c.parentNode != containerB) { |
| + | c = c.parentNode; |
| + | } |
| + | |
| + | if (c) { |
| + | offsetC = 0; |
| + | n = containerB.firstChild; |
| + | |
| + | while (n != c && offsetC < offsetB) { |
| + | offsetC++; |
| + | n = n.nextSibling; |
| + | } |
| + | |
| + | if (offsetC < offsetB) |
| + | return -1; // before |
| + | |
| + | return 1; // after |
| + | } |
| + | |
| + | // In the fourth case, none of three other cases hold: the containers of A and B |
| + | // are siblings or descendants of sibling nodes. In this case, A is before B if |
| + | // the container of A is before the container of B in a pre-order traversal of the |
| + | // Ranges' context tree and A is after B otherwise. |
| + | cmnRoot = dom.findCommonAncestor(containerA, containerB); |
| + | childA = containerA; |
| + | |
| + | while (childA && childA.parentNode != cmnRoot) |
| + | childA = childA.parentNode; |
| + | |
| + | if (!childA) |
| + | childA = cmnRoot; |
| + | |
| + | childB = containerB; |
| + | while (childB && childB.parentNode != cmnRoot) |
| + | childB = childB.parentNode; |
| + | |
| + | if (!childB) |
| + | childB = cmnRoot; |
| + | |
| + | if (childA == childB) |
| + | return 0; // equal |
| + | |
| + | n = cmnRoot.firstChild; |
| + | while (n) { |
| + | if (n == childA) |
| + | return -1; // before |
| + | |
| + | if (n == childB) |
| + | return 1; // after |
| + | |
| + | n = n.nextSibling; |
| + | } |
| + | }; |
| + | |
| + | function _setEndPoint(st, n, o) { |
| + | var ec, sc; |
| + | |
| + | if (st) { |
| + | t[START_CONTAINER] = n; |
| + | t[START_OFFSET] = o; |
| + | } else { |
| + | t[END_CONTAINER] = n; |
| + | t[END_OFFSET] = o; |
| + | } |
| + | |
| + | // If one boundary-point of a Range is set to have a root container |
| + | // other than the current one for the Range, the Range is collapsed to |
| + | // the new position. This enforces the restriction that both boundary- |
| + | // points of a Range must have the same root container. |
| + | ec = t[END_CONTAINER]; |
| + | while (ec.parentNode) |
| + | ec = ec.parentNode; |
| + | |
| + | sc = t[START_CONTAINER]; |
| + | while (sc.parentNode) |
| + | sc = sc.parentNode; |
| + | |
| + | if (sc == ec) { |
| + | // The start position of a Range is guaranteed to never be after the |
| + | // end position. To enforce this restriction, if the start is set to |
| + | // be at a position after the end, the Range is collapsed to that |
| + | // position. |
| + | if (_compareBoundaryPoints(t[START_CONTAINER], t[START_OFFSET], t[END_CONTAINER], t[END_OFFSET]) > 0) |
| + | t.collapse(st); |
| + | } else |
| + | t.collapse(st); |
| + | |
| + | t.collapsed = _isCollapsed(); |
| + | t.commonAncestorContainer = dom.findCommonAncestor(t[START_CONTAINER], t[END_CONTAINER]); |
| + | }; |
| + | |
| + | function _traverse(how) { |
| + | var c, endContainerDepth = 0, startContainerDepth = 0, p, depthDiff, startNode, endNode, sp, ep; |
| + | |
| + | if (t[START_CONTAINER] == t[END_CONTAINER]) |
| + | return _traverseSameContainer(how); |
| + | |
| + | for (c = t[END_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) { |
| + | if (p == t[START_CONTAINER]) |
| + | return _traverseCommonStartContainer(c, how); |
| + | |
| + | ++endContainerDepth; |
| + | } |
| + | |
| + | for (c = t[START_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) { |
| + | if (p == t[END_CONTAINER]) |
| + | return _traverseCommonEndContainer(c, how); |
| + | |
| + | ++startContainerDepth; |
| + | } |
| + | |
| + | depthDiff = startContainerDepth - endContainerDepth; |
| + | |
| + | startNode = t[START_CONTAINER]; |
| + | while (depthDiff > 0) { |
| + | startNode = startNode.parentNode; |
| + | depthDiff--; |
| + | } |
| + | |
| + | endNode = t[END_CONTAINER]; |
| + | while (depthDiff < 0) { |
| + | endNode = endNode.parentNode; |
| + | depthDiff++; |
| + | } |
| + | |
| + | // ascend the ancestor hierarchy until we have a common parent. |
| + | for (sp = startNode.parentNode, ep = endNode.parentNode; sp != ep; sp = sp.parentNode, ep = ep.parentNode) { |
| + | startNode = sp; |
| + | endNode = ep; |
| + | } |
| + | |
| + | return _traverseCommonAncestors(startNode, endNode, how); |
| + | }; |
| + | |
| + | function _traverseSameContainer(how) { |
| + | var frag, s, sub, n, cnt, sibling, xferNode; |
| + | |
| + | if (how != DELETE) |
| + | frag = doc.createDocumentFragment(); |
| + | |
| + | // If selection is empty, just return the fragment |
| + | if (t[START_OFFSET] == t[END_OFFSET]) |
| + | return frag; |
| + | |
| + | // Text node needs special case handling |
| + | if (t[START_CONTAINER].nodeType == 3 /* TEXT_NODE */) { |
| + | // get the substring |
| + | s = t[START_CONTAINER].nodeValue; |
| + | sub = s.substring(t[START_OFFSET], t[END_OFFSET]); |
| + | |
| + | // set the original text node to its new value |
| + | if (how != CLONE) { |
| + | t[START_CONTAINER].deleteData(t[START_OFFSET], t[END_OFFSET] - t[START_OFFSET]); |
| + | |
| + | // Nothing is partially selected, so collapse to start point |
| + | t.collapse(TRUE); |
| + | } |
| + | |
| + | if (how == DELETE) |
| + | return; |
| + | |
| + | frag.appendChild(doc.createTextNode(sub)); |
| + | return frag; |
| + | } |
| + | |
| + | // Copy nodes between the start/end offsets. |
| + | n = _getSelectedNode(t[START_CONTAINER], t[START_OFFSET]); |
| + | cnt = t[END_OFFSET] - t[START_OFFSET]; |
| + | |
| + | while (cnt > 0) { |
| + | sibling = n.nextSibling; |
| + | xferNode = _traverseFullySelected(n, how); |
| + | |
| + | if (frag) |
| + | frag.appendChild( xferNode ); |
| + | |
| + | --cnt; |
| + | n = sibling; |
| + | } |
| + | |
| + | // Nothing is partially selected, so collapse to start point |
| + | if (how != CLONE) |
| + | t.collapse(TRUE); |
| + | |
| + | return frag; |
| + | }; |
| + | |
| + | function _traverseCommonStartContainer(endAncestor, how) { |
| + | var frag, n, endIdx, cnt, sibling, xferNode; |
| + | |
| + | if (how != DELETE) |
| + | frag = doc.createDocumentFragment(); |
| + | |
| + | n = _traverseRightBoundary(endAncestor, how); |
| + | |
| + | if (frag) |
| + | frag.appendChild(n); |
| + | |
| + | endIdx = nodeIndex(endAncestor); |
| + | cnt = endIdx - t[START_OFFSET]; |
| + | |
| + | if (cnt <= 0) { |
| + | // Collapse to just before the endAncestor, which |
| + | // is partially selected. |
| + | if (how != CLONE) { |
| + | t.setEndBefore(endAncestor); |
| + | t.collapse(FALSE); |
| + | } |
| + | |
| + | return frag; |
| + | } |
| + | |
| + | n = endAncestor.previousSibling; |
| + | while (cnt > 0) { |
| + | sibling = n.previousSibling; |
| + | xferNode = _traverseFullySelected(n, how); |
| + | |
| + | if (frag) |
| + | frag.insertBefore(xferNode, frag.firstChild); |
| + | |
| + | --cnt; |
| + | n = sibling; |
| + | } |
| + | |
| + | // Collapse to just before the endAncestor, which |
| + | // is partially selected. |
| + | if (how != CLONE) { |
| + | t.setEndBefore(endAncestor); |
| + | t.collapse(FALSE); |
| + | } |
| + | |
| + | return frag; |
| + | }; |
| + | |
| + | function _traverseCommonEndContainer(startAncestor, how) { |
| + | var frag, startIdx, n, cnt, sibling, xferNode; |
| + | |
| + | if (how != DELETE) |
| + | frag = doc.createDocumentFragment(); |
| + | |
| + | n = _traverseLeftBoundary(startAncestor, how); |
| + | if (frag) |
| + | frag.appendChild(n); |
| + | |
| + | startIdx = nodeIndex(startAncestor); |
| + | ++startIdx; // Because we already traversed it.... |
| + | |
| + | cnt = t[END_OFFSET] - startIdx; |
| + | n = startAncestor.nextSibling; |
| + | while (cnt > 0) { |
| + | sibling = n.nextSibling; |
| + | xferNode = _traverseFullySelected(n, how); |
| + | |
| + | if (frag) |
| + | frag.appendChild(xferNode); |
| + | |
| + | --cnt; |
| + | n = sibling; |
| + | } |
| + | |
| + | if (how != CLONE) { |
| + | t.setStartAfter(startAncestor); |
| + | t.collapse(TRUE); |
| + | } |
| + | |
| + | return frag; |
| + | }; |
| + | |
| + | function _traverseCommonAncestors(startAncestor, endAncestor, how) { |
| + | var n, frag, commonParent, startOffset, endOffset, cnt, sibling, nextSibling; |
| + | |
| + | if (how != DELETE) |
| + | frag = doc.createDocumentFragment(); |
| + | |
| + | n = _traverseLeftBoundary(startAncestor, how); |
| + | if (frag) |
| + | frag.appendChild(n); |
| + | |
| + | commonParent = startAncestor.parentNode; |
| + | startOffset = nodeIndex(startAncestor); |
| + | endOffset = nodeIndex(endAncestor); |
| + | ++startOffset; |
| + | |
| + | cnt = endOffset - startOffset; |
| + | sibling = startAncestor.nextSibling; |
| + | |
| + | while (cnt > 0) { |
| + | nextSibling = sibling.nextSibling; |
| + | n = _traverseFullySelected(sibling, how); |
| + | |
| + | if (frag) |
| + | frag.appendChild(n); |
| + | |
| + | sibling = nextSibling; |
| + | --cnt; |
| + | } |
| + | |
| + | n = _traverseRightBoundary(endAncestor, how); |
| + | |
| + | if (frag) |
| + | frag.appendChild(n); |
| + | |
| + | if (how != CLONE) { |
| + | t.setStartAfter(startAncestor); |
| + | t.collapse(TRUE); |
| + | } |
| + | |
| + | return frag; |
| + | }; |
| + | |
| + | function _traverseRightBoundary(root, how) { |
| + | var next = _getSelectedNode(t[END_CONTAINER], t[END_OFFSET] - 1), parent, clonedParent, prevSibling, clonedChild, clonedGrandParent, isFullySelected = next != t[END_CONTAINER]; |
| + | |
| + | if (next == root) |
| + | return _traverseNode(next, isFullySelected, FALSE, how); |
| + | |
| + | parent = next.parentNode; |
| + | clonedParent = _traverseNode(parent, FALSE, FALSE, how); |
| + | |
| + | while (parent) { |
| + | while (next) { |
| + | prevSibling = next.previousSibling; |
| + | clonedChild = _traverseNode(next, isFullySelected, FALSE, how); |
| + | |
| + | if (how != DELETE) |
| + | clonedParent.insertBefore(clonedChild, clonedParent.firstChild); |
| + | |
| + | isFullySelected = TRUE; |
| + | next = prevSibling; |
| + | } |
| + | |
| + | if (parent == root) |
| + | return clonedParent; |
| + | |
| + | next = parent.previousSibling; |
| + | parent = parent.parentNode; |
| + | |
| + | clonedGrandParent = _traverseNode(parent, FALSE, FALSE, how); |
| + | |
| + | if (how != DELETE) |
| + | clonedGrandParent.appendChild(clonedParent); |
| + | |
| + | clonedParent = clonedGrandParent; |
| + | } |
| + | }; |
| + | |
| + | function _traverseLeftBoundary(root, how) { |
| + | var next = _getSelectedNode(t[START_CONTAINER], t[START_OFFSET]), isFullySelected = next != t[START_CONTAINER], parent, clonedParent, nextSibling, clonedChild, clonedGrandParent; |
| + | |
| + | if (next == root) |
| + | return _traverseNode(next, isFullySelected, TRUE, how); |
| + | |
| + | parent = next.parentNode; |
| + | clonedParent = _traverseNode(parent, FALSE, TRUE, how); |
| + | |
| + | while (parent) { |
| + | while (next) { |
| + | nextSibling = next.nextSibling; |
| + | clonedChild = _traverseNode(next, isFullySelected, TRUE, how); |
| + | |
| + | if (how != DELETE) |
| + | clonedParent.appendChild(clonedChild); |
| + | |
| + | isFullySelected = TRUE; |
| + | next = nextSibling; |
| + | } |
| + | |
| + | if (parent == root) |
| + | return clonedParent; |
| + | |
| + | next = parent.nextSibling; |
| + | parent = parent.parentNode; |
| + | |
| + | clonedGrandParent = _traverseNode(parent, FALSE, TRUE, how); |
| + | |
| + | if (how != DELETE) |
| + | clonedGrandParent.appendChild(clonedParent); |
| + | |
| + | clonedParent = clonedGrandParent; |
| + | } |
| + | }; |
| + | |
| + | function _traverseNode(n, isFullySelected, isLeft, how) { |
| + | var txtValue, newNodeValue, oldNodeValue, offset, newNode; |
| + | |
| + | if (isFullySelected) |
| + | return _traverseFullySelected(n, how); |
| + | |
| + | if (n.nodeType == 3 /* TEXT_NODE */) { |
| + | txtValue = n.nodeValue; |
| + | |
| + | if (isLeft) { |
| + | offset = t[START_OFFSET]; |
| + | newNodeValue = txtValue.substring(offset); |
| + | oldNodeValue = txtValue.substring(0, offset); |
| + | } else { |
| + | offset = t[END_OFFSET]; |
| + | newNodeValue = txtValue.substring(0, offset); |
| + | oldNodeValue = txtValue.substring(offset); |
| + | } |
| + | |
| + | if (how != CLONE) |
| + | n.nodeValue = oldNodeValue; |
| + | |
| + | if (how == DELETE) |
| + | return; |
| + | |
| + | newNode = n.cloneNode(FALSE); |
| + | newNode.nodeValue = newNodeValue; |
| + | |
| + | return newNode; |
| + | } |
| + | |
| + | if (how == DELETE) |
| + | return; |
| + | |
| + | return n.cloneNode(FALSE); |
| + | }; |
| + | |
| + | function _traverseFullySelected(n, how) { |
| + | if (how != DELETE) |
| + | return how == CLONE ? n.cloneNode(TRUE) : n; |
| + | |
| + | n.parentNode.removeChild(n); |
| + | }; |
| + | }; |
| + | |
| + | ns.Range = Range; |
| + | })(tinymce.dom); |
| + | |
| + | (function() { |
| + | function Selection(selection) { |
| + | var t = this, invisibleChar = '\uFEFF', range, lastIERng, dom = selection.dom, TRUE = true, FALSE = false; |
| + | |
| + | // Returns a W3C DOM compatible range object by using the IE Range API |
| + | function getRange() { |
| + | var ieRange = selection.getRng(), domRange = dom.createRng(), element, collapsed; |
| + | |
| + | // If selection is outside the current document just return an empty range |
| + | element = ieRange.item ? ieRange.item(0) : ieRange.parentElement(); |
| + | if (element.ownerDocument != dom.doc) |
| + | return domRange; |
| + | |
| + | // Handle control selection or text selection of a image |
| + | if (ieRange.item || !element.hasChildNodes()) { |
| + | domRange.setStart(element.parentNode, dom.nodeIndex(element)); |
| + | domRange.setEnd(domRange.startContainer, domRange.startOffset + 1); |
| + | |
| + | return domRange; |
| + | } |
| + | |
| + | collapsed = selection.isCollapsed(); |
| + | |
| + | function findEndPoint(start) { |
| + | var marker, container, offset, nodes, startIndex = 0, endIndex, index, parent, checkRng, position; |
| + | |
| + | // Setup temp range and collapse it |
| + | checkRng = ieRange.duplicate(); |
| + | checkRng.collapse(start); |
| + | |
| + | // Create marker and insert it at the end of the endpoints parent |
| + | marker = dom.create('a'); |
| + | parent = checkRng.parentElement(); |
| + | |
| + | // If parent doesn't have any children then set the container to that parent and the index to 0 |
| + | if (!parent.hasChildNodes()) { |
| + | domRange[start ? 'setStart' : 'setEnd'](parent, 0); |
| + | return; |
| + | } |
| + | |
| + | parent.appendChild(marker); |
| + | checkRng.moveToElementText(marker); |
| + | position = ieRange.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', checkRng); |
| + | if (position > 0) { |
| + | // The position is after the end of the parent element. |
| + | // This is the case where IE puts the caret to the left edge of a table. |
| + | domRange[start ? 'setStartAfter' : 'setEndAfter'](parent); |
| + | dom.remove(marker); |
| + | return; |
| + | } |
| + | |
| + | // Setup node list and endIndex |
| + | nodes = tinymce.grep(parent.childNodes); |
| + | endIndex = nodes.length - 1; |
| + | // Perform a binary search for the position |
| + | while (startIndex <= endIndex) { |
| + | index = Math.floor((startIndex + endIndex) / 2); |
| + | |
| + | // Insert marker and check it's position relative to the selection |
| + | parent.insertBefore(marker, nodes[index]); |
| + | checkRng.moveToElementText(marker); |
| + | position = ieRange.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', checkRng); |
| + | if (position > 0) { |
| + | // Marker is to the right |
| + | startIndex = index + 1; |
| + | } else if (position < 0) { |
| + | // Marker is to the left |
| + | endIndex = index - 1; |
| + | } else { |
| + | // Maker is where we are |
| + | found = true; |
| + | break; |
| + | } |
| + | } |
| + | |
| + | // Setup container |
| + | container = position > 0 || index == 0 ? marker.nextSibling : marker.previousSibling; |
| + | |
| + | // Handle element selection |
| + | if (container.nodeType == 1) { |
| + | dom.remove(marker); |
| + | |
| + | // Find offset and container |
| + | offset = dom.nodeIndex(container); |
| + | container = container.parentNode; |
| + | |
| + | // Move the offset if we are setting the end or the position is after an element |
| + | if (!start || index > 0) |
| + | offset++; |
| + | } else { |
| + | // Calculate offset within text node |
| + | if (position > 0 || index == 0) { |
| + | checkRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', ieRange); |
| + | offset = checkRng.text.length; |
| + | } else { |
| + | checkRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', ieRange); |
| + | offset = container.nodeValue.length - checkRng.text.length; |
| + | } |
| + | |
| + | dom.remove(marker); |
| + | } |
| + | |
| + | domRange[start ? 'setStart' : 'setEnd'](container, offset); |
| + | }; |
| + | |
| + | // Find start point |
| + | findEndPoint(true); |
| + | |
| + | // Find end point if needed |
| + | if (!collapsed) |
| + | findEndPoint(); |
| + | |
| + | return domRange; |
| + | }; |
| + | |
| + | this.addRange = function(rng) { |
| + | var ieRng, ctrlRng, startContainer, startOffset, endContainer, endOffset, doc = selection.dom.doc, body = doc.body; |
| + | |
| + | function setEndPoint(start) { |
| + | var container, offset, marker, tmpRng, nodes; |
| + | |
| + | marker = dom.create('a'); |
| + | container = start ? startContainer : endContainer; |
| + | offset = start ? startOffset : endOffset; |
| + | tmpRng = ieRng.duplicate(); |
| + | |
| + | if (container == doc) { |
| + | container = body; |
| + | offset = 0; |
| + | } |
| + | |
| + | if (container.nodeType == 3) { |
| + | container.parentNode.insertBefore(marker, container); |
| + | tmpRng.moveToElementText(marker); |
| + | tmpRng.moveStart('character', offset); |
| + | dom.remove(marker); |
| + | ieRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', tmpRng); |
| + | } else { |
| + | nodes = container.childNodes; |
| + | |
| + | if (nodes.length) { |
| + | if (offset >= nodes.length) { |
| + | dom.insertAfter(marker, nodes[nodes.length - 1]); |
| + | } else { |
| + | container.insertBefore(marker, nodes[offset]); |
| + | } |
| + | |
| + | tmpRng.moveToElementText(marker); |
| + | } else { |
| + | // Empty node selection for example <div>|</div> |
| + | marker = doc.createTextNode(invisibleChar); |
| + | container.appendChild(marker); |
| + | tmpRng.moveToElementText(marker.parentNode); |
| + | tmpRng.collapse(TRUE); |
| + | } |
| + | |
| + | ieRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', tmpRng); |
| + | dom.remove(marker); |
| + | } |
| + | } |
| + | |
| + | // Destroy cached range |
| + | this.destroy(); |
| + | |
| + | // Setup some shorter versions |
| + | startContainer = rng.startContainer; |
| + | startOffset = rng.startOffset; |
| + | endContainer = rng.endContainer; |
| + | endOffset = rng.endOffset; |
| + | ieRng = body.createTextRange(); |
| + | |
| + | // If single element selection then try making a control selection out of it |
| + | if (startContainer == endContainer && startContainer.nodeType == 1 && startOffset == endOffset - 1) { |
| + | if (startOffset == endOffset - 1) { |
| + | try { |
| + | ctrlRng = body.createControlRange(); |
| + | ctrlRng.addElement(startContainer.childNodes[startOffset]); |
| + | ctrlRng.select(); |
| + | ctrlRng.scrollIntoView(); |
| + | return; |
| + | } catch (ex) { |
| + | // Ignore |
| + | } |
| + | } |
| + | } |
| + | |
| + | // Set start/end point of selection |
| + | setEndPoint(true); |
| + | setEndPoint(); |
| + | |
| + | // Select the new range and scroll it into view |
| + | ieRng.select(); |
| + | ieRng.scrollIntoView(); |
| + | }; |
| + | |
| + | this.getRangeAt = function() { |
| + | // Setup new range if the cache is empty |
| + | if (!range || !tinymce.dom.RangeUtils.compareRanges(lastIERng, selection.getRng())) { |
| + | range = getRange(); |
| + | |
| + | // Store away text range for next call |
| + | lastIERng = selection.getRng(); |
| + | } |
| + | |
| + | // IE will say that the range is equal then produce an invalid argument exception |
| + | // if you perform specific operations in a keyup event. For example Ctrl+Del. |
| + | // This hack will invalidate the range cache if the exception occurs |
| + | try { |
| + | range.startContainer.nextSibling; |
| + | } catch (ex) { |
| + | range = getRange(); |
| + | lastIERng = null; |
| + | } |
| + | |
| + | // Return cached range |
| + | return range; |
| + | }; |
| + | |
| + | this.destroy = function() { |
| + | // Destroy cached range and last IE range to avoid memory leaks |
| + | lastIERng = range = null; |
| + | }; |
| + | |
| + | // IE has an issue where you can't select/move the caret by clicking outside the body if the document is in standards mode |
| + | if (selection.dom.boxModel) { |
| + | (function() { |
| + | var doc = dom.doc, body = doc.body, started, startRng; |
| + | |
| + | // Make HTML element unselectable since we are going to handle selection by hand |
| + | doc.documentElement.unselectable = TRUE; |
| + | |
| + | // Return range from point or null if it failed |
| + | function rngFromPoint(x, y) { |
| + | var rng = body.createTextRange(); |
| + | |
| + | try { |
| + | rng.moveToPoint(x, y); |
| + | } catch (ex) { |
| + | // IE sometimes throws and exception, so lets just ignore it |
| + | rng = null; |
| + | } |
| + | |
| + | return rng; |
| + | }; |
| + | |
| + | // Fires while the selection is changing |
| + | function selectionChange(e) { |
| + | var pointRng; |
| + | |
| + | // Check if the button is down or not |
| + | if (e.button) { |
| + | // Create range from mouse position |
| + | pointRng = rngFromPoint(e.x, e.y); |
| + | |
| + | if (pointRng) { |
| + | // Check if pointRange is before/after selection then change the endPoint |
| + | if (pointRng.compareEndPoints('StartToStart', startRng) > 0) |
| + | pointRng.setEndPoint('StartToStart', startRng); |
| + | else |
| + | pointRng.setEndPoint('EndToEnd', startRng); |
| + | |
| + | pointRng.select(); |
| + | } |
| + | } else |
| + | endSelection(); |
| + | } |
| + | |
| + | // Removes listeners |
| + | function endSelection() { |
| + | dom.unbind(doc, 'mouseup', endSelection); |
| + | dom.unbind(doc, 'mousemove', selectionChange); |
| + | started = 0; |
| + | }; |
| + | |
| + | // Detect when user selects outside BODY |
| + | dom.bind(doc, 'mousedown', function(e) { |
| + | if (e.target.nodeName === 'HTML') { |
| + | if (started) |
| + | endSelection(); |
| + | |
| + | started = 1; |
| + | |
| + | // Setup start position |
| + | startRng = rngFromPoint(e.x, e.y); |
| + | if (startRng) { |
| + | // Listen for selection change events |
| + | dom.bind(doc, 'mouseup', endSelection); |
| + | dom.bind(doc, 'mousemove', selectionChange); |
| + | |
| + | startRng.select(); |
| + | } |
| + | } |
| + | }); |
| + | })(); |
| + | } |
| + | }; |
| + | |
| + | // Expose the selection object |
| + | tinymce.dom.TridentSelection = Selection; |
| + | })(); |
| + | |
| + | |
| + | (function(tinymce) { |
| + | // Shorten names |
| + | var each = tinymce.each, DOM = tinymce.DOM, isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, Event; |
| + | |
| + | tinymce.create('tinymce.dom.EventUtils', { |
| + | EventUtils : function() { |
| + | this.inits = []; |
| + | this.events = []; |
| + | }, |
| + | |
| + | add : function(o, n, f, s) { |
| + | var cb, t = this, el = t.events, r; |
| + | |
| + | if (n instanceof Array) { |
| + | r = []; |
| + | |
| + | each(n, function(n) { |
| + | r.push(t.add(o, n, f, s)); |
| + | }); |
| + | |
| + | return r; |
| + | } |
| + | |
| + | // Handle array |
| + | if (o && o.hasOwnProperty && o instanceof Array) { |
| + | r = []; |
| + | |
| + | each(o, function(o) { |
| + | o = DOM.get(o); |
| + | r.push(t.add(o, n, f, s)); |
| + | }); |
| + | |
| + | return r; |
| + | } |
| + | |
| + | o = DOM.get(o); |
| + | |
| + | if (!o) |
| + | return; |
| + | |
| + | // Setup event callback |
| + | cb = function(e) { |
| + | // Is all events disabled |
| + | if (t.disabled) |
| + | return; |
| + | |
| + | e = e || window.event; |
| + | |
| + | // Patch in target, preventDefault and stopPropagation in IE it's W3C valid |
| + | if (e && isIE) { |
| + | if (!e.target) |
| + | e.target = e.srcElement; |
| + | |
| + | // Patch in preventDefault, stopPropagation methods for W3C compatibility |
| + | tinymce.extend(e, t._stoppers); |
| + | } |
| + | |
| + | if (!s) |
| + | return f(e); |
| + | |
| + | return f.call(s, e); |
| + | }; |
| + | |
| + | if (n == 'unload') { |
| + | tinymce.unloads.unshift({func : cb}); |
| + | return cb; |
| + | } |
| + | |
| + | if (n == 'init') { |
| + | if (t.domLoaded) |
| + | cb(); |
| + | else |
| + | t.inits.push(cb); |
| + | |
| + | return cb; |
| + | } |
| + | |
| + | // Store away listener reference |
| + | el.push({ |
| + | obj : o, |
| + | name : n, |
| + | func : f, |
| + | cfunc : cb, |
| + | scope : s |
| + | }); |
| + | |
| + | t._add(o, n, cb); |
| + | |
| + | return f; |
| + | }, |
| + | |
| + | remove : function(o, n, f) { |
| + | var t = this, a = t.events, s = false, r; |
| + | |
| + | // Handle array |
| + | if (o && o.hasOwnProperty && o instanceof Array) { |
| + | r = []; |
| + | |
| + | each(o, function(o) { |
| + | o = DOM.get(o); |
| + | r.push(t.remove(o, n, f)); |
| + | }); |
| + | |
| + | return r; |
| + | } |
| + | |
| + | o = DOM.get(o); |
| + | |
| + | each(a, function(e, i) { |
| + | if (e.obj == o && e.name == n && (!f || (e.func == f || e.cfunc == f))) { |
| + | a.splice(i, 1); |
| + | t._remove(o, n, e.cfunc); |
| + | s = true; |
| + | return false; |
| + | } |
| + | }); |
| + | |
| + | return s; |
| + | }, |
| + | |
| + | clear : function(o) { |
| + | var t = this, a = t.events, i, e; |
| + | |
| + | if (o) { |
| + | o = DOM.get(o); |
| + | |
| + | for (i = a.length - 1; i >= 0; i--) { |
| + | e = a[i]; |
| + | |
| + | if (e.obj === o) { |
| + | t._remove(e.obj, e.name, e.cfunc); |
| + | e.obj = e.cfunc = null; |
| + | a.splice(i, 1); |
| + | } |
| + | } |
| + | } |
| + | }, |
| + | |
| + | cancel : function(e) { |
| + | if (!e) |
| + | return false; |
| + | |
| + | this.stop(e); |
| + | |
| + | return this.prevent(e); |
| + | }, |
| + | |
| + | stop : function(e) { |
| + | if (e.stopPropagation) |
| + | e.stopPropagation(); |
| + | else |
| + | e.cancelBubble = true; |
| + | |
| + | return false; |
| + | }, |
| + | |
| + | prevent : function(e) { |
| + | if (e.preventDefault) |
| + | e.preventDefault(); |
| + | else |
| + | e.returnValue = false; |
| + | |
| + | return false; |
| + | }, |
| + | |
| + | destroy : function() { |
| + | var t = this; |
| + | |
| + | each(t.events, function(e, i) { |
| + | t._remove(e.obj, e.name, e.cfunc); |
| + | e.obj = e.cfunc = null; |
| + | }); |
| + | |
| + | t.events = []; |
| + | t = null; |
| + | }, |
| + | |
| + | _add : function(o, n, f) { |
| + | if (o.attachEvent) |
| + | o.attachEvent('on' + n, f); |
| + | else if (o.addEventListener) |
| + | o.addEventListener(n, f, false); |
| + | else |
| + | o['on' + n] = f; |
| + | }, |
| + | |
| + | _remove : function(o, n, f) { |
| + | if (o) { |
| + | try { |
| + | if (o.detachEvent) |
| + | o.detachEvent('on' + n, f); |
| + | else if (o.removeEventListener) |
| + | o.removeEventListener(n, f, false); |
| + | else |
| + | o['on' + n] = null; |
| + | } catch (ex) { |
| + | // Might fail with permission denined on IE so we just ignore that |
| + | } |
| + | } |
| + | }, |
| + | |
| + | _pageInit : function(win) { |
| + | var t = this; |
| + | |
| + | // Keep it from running more than once |
| + | if (t.domLoaded) |
| + | return; |
| + | |
| + | t.domLoaded = true; |
| + | |
| + | each(t.inits, function(c) { |
| + | c(); |
| + | }); |
| + | |
| + | t.inits = []; |
| + | }, |
| + | |
| + | _wait : function(win) { |
| + | var t = this, doc = win.document; |
| + | |
| + | // No need since the document is already loaded |
| + | if (win.tinyMCE_GZ && tinyMCE_GZ.loaded) { |
| + | t.domLoaded = 1; |
| + | return; |
| + | } |
| + | |
| + | // Use IE method |
| + | if (doc.attachEvent) { |
| + | doc.attachEvent("onreadystatechange", function() { |
| + | if (doc.readyState === "complete") { |
| + | doc.detachEvent("onreadystatechange", arguments.callee); |
| + | t._pageInit(win); |
| + | } |
| + | }); |
| + | |
| + | if (doc.documentElement.doScroll && win == win.top) { |
| + | (function() { |
| + | if (t.domLoaded) |
| + | return; |
| + | |
| + | try { |
| + | // If IE is used, use the trick by Diego Perini |
| + | // http://javascript.nwbox.com/IEContentLoaded/ |
| + | doc.documentElement.doScroll("left"); |
| + | } catch (ex) { |
| + | setTimeout(arguments.callee, 0); |
| + | return; |
| + | } |
| + | |
| + | t._pageInit(win); |
| + | })(); |
| + | } |
| + | } else if (doc.addEventListener) { |
| + | t._add(win, 'DOMContentLoaded', function() { |
| + | t._pageInit(win); |
| + | }); |
| + | } |
| + | |
| + | t._add(win, 'load', function() { |
| + | t._pageInit(win); |
| + | }); |
| + | }, |
| + | |
| + | _stoppers : { |
| + | preventDefault : function() { |
| + | this.returnValue = false; |
| + | }, |
| + | |
| + | stopPropagation : function() { |
| + | this.cancelBubble = true; |
| + | } |
| + | } |
| + | }); |
| + | |
| + | Event = tinymce.dom.Event = new tinymce.dom.EventUtils(); |
| + | |
| + | // Dispatch DOM content loaded event for IE and Safari |
| + | Event._wait(window); |
| + | |
| + | tinymce.addUnload(function() { |
| + | Event.destroy(); |
| + | }); |
| + | })(tinymce); |
| + | |
| + | (function(tinymce) { |
| + | tinymce.dom.Element = function(id, settings) { |
| + | var t = this, dom, el; |
| + | |
| + | t.settings = settings = settings || {}; |
| + | t.id = id; |
| + | t.dom = dom = settings.dom || tinymce.DOM; |
| + | |
| + | // Only IE leaks DOM references, this is a lot faster |
| + | if (!tinymce.isIE) |
| + | el = dom.get(t.id); |
| + | |
| + | tinymce.each( |
| + | ('getPos,getRect,getParent,add,setStyle,getStyle,setStyles,' + |
| + | 'setAttrib,setAttribs,getAttrib,addClass,removeClass,' + |
| + | 'hasClass,getOuterHTML,setOuterHTML,remove,show,hide,' + |
| + | 'isHidden,setHTML,get').split(/,/) |
| + | , function(k) { |
| + | t[k] = function() { |
| + | var a = [id], i; |
| + | |
| + | for (i = 0; i < arguments.length; i++) |
| + | a.push(arguments[i]); |
| + | |
| + | a = dom[k].apply(dom, a); |
| + | t.update(k); |
| + | |
| + | return a; |
| + | }; |
| + | }); |
| + | |
| + | tinymce.extend(t, { |
| + | on : function(n, f, s) { |
| + | return tinymce.dom.Event.add(t.id, n, f, s); |
| + | }, |
| + | |
| + | getXY : function() { |
| + | return { |
| + | x : parseInt(t.getStyle('left')), |
| + | y : parseInt(t.getStyle('top')) |
| + | }; |
| + | }, |
| + | |
| + | getSize : function() { |
| + | var n = dom.get(t.id); |
| + | |
| + | return { |
| + | w : parseInt(t.getStyle('width') || n.clientWidth), |
| + | h : parseInt(t.getStyle('height') || n.clientHeight) |
| + | }; |
| + | }, |
| + | |
| + | moveTo : function(x, y) { |
| + | t.setStyles({left : x, top : y}); |
| + | }, |
| + | |
| + | moveBy : function(x, y) { |
| + | var p = t.getXY(); |
| + | |
| + | t.moveTo(p.x + x, p.y + y); |
| + | }, |
| + | |
| + | resizeTo : function(w, h) { |
| + | t.setStyles({width : w, height : h}); |
| + | }, |
| + | |
| + | resizeBy : function(w, h) { |
| + | var s = t.getSize(); |
| + | |
| + | t.resizeTo(s.w + w, s.h + h); |
| + | }, |
| + | |
| + | update : function(k) { |
| + | var b; |
| + | |
| + | if (tinymce.isIE6 && settings.blocker) { |
| + | k = k || ''; |
| + | |
| + | // Ignore getters |
| + | if (k.indexOf('get') === 0 || k.indexOf('has') === 0 || k.indexOf('is') === 0) |
| + | return; |
| + | |
| + | // Remove blocker on remove |
| + | if (k == 'remove') { |
| + | dom.remove(t.blocker); |
| + | return; |
| + | } |
| + | |
| + | if (!t.blocker) { |
| + | t.blocker = dom.uniqueId(); |
| + | b = dom.add(settings.container || dom.getRoot(), 'iframe', {id : t.blocker, style : 'position:absolute;', frameBorder : 0, src : 'javascript:""'}); |
| + | dom.setStyle(b, 'opacity', 0); |
| + | } else |
| + | b = dom.get(t.blocker); |
| + | |
| + | dom.setStyles(b, { |
| + | left : t.getStyle('left', 1), |
| + | top : t.getStyle('top', 1), |
| + | width : t.getStyle('width', 1), |
| + | height : t.getStyle('height', 1), |
| + | display : t.getStyle('display', 1), |
| + | zIndex : parseInt(t.getStyle('zIndex', 1) || 0) - 1 |
| + | }); |
| + | } |
| + | } |
| + | }); |
| + | }; |
| + | })(tinymce); |
| + | |
| + | (function(tinymce) { |
| + | function trimNl(s) { |
| + | return s.replace(/[\n\r]+/g, ''); |
| + | }; |
| + | |
| + | // Shorten names |
| + | var is = tinymce.is, isIE = tinymce.isIE, each = tinymce.each; |
| + | |
| + | tinymce.create('tinymce.dom.Selection', { |
| + | Selection : function(dom, win, serializer) { |
| + | var t = this; |
| + | |
| + | t.dom = dom; |
| + | t.win = win; |
| + | t.serializer = serializer; |
| + | |
| + | // Add events |
| + | each([ |
| + | 'onBeforeSetContent', |
| + | 'onBeforeGetContent', |
| + | 'onSetContent', |
| + | 'onGetContent' |
| + | ], function(e) { |
| + | t[e] = new tinymce.util.Dispatcher(t); |
| + | }); |
| + | |
| + | // No W3C Range support |
| + | if (!t.win.getSelection) |
| + | t.tridentSel = new tinymce.dom.TridentSelection(t); |
| + | |
| + | // Prevent leaks |
| + | tinymce.addUnload(t.destroy, t); |
| + | }, |
| + | |
| + | getContent : function(s) { |
| + | var t = this, r = t.getRng(), e = t.dom.create("body"), se = t.getSel(), wb, wa, n; |
| + | |
| + | s = s || {}; |
| + | wb = wa = ''; |
| + | s.get = true; |
| + | s.format = s.format || 'html'; |
| + | t.onBeforeGetContent.dispatch(t, s); |
| + | |
| + | if (s.format == 'text') |
| + | return t.isCollapsed() ? '' : (r.text || (se.toString ? se.toString() : '')); |
| + | |
| + | if (r.cloneContents) { |
| + | n = r.cloneContents(); |
| + | |
| + | if (n) |
| + | e.appendChild(n); |
| + | } else if (is(r.item) || is(r.htmlText)) |
| + | e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText; |
| + | else |
| + | e.innerHTML = r.toString(); |
| + | |
| + | // Keep whitespace before and after |
| + | if (/^\s/.test(e.innerHTML)) |
| + | wb = ' '; |
| + | |
| + | if (/\s+$/.test(e.innerHTML)) |
| + | wa = ' '; |
| + | |
| + | s.getInner = true; |
| + | |
| + | s.content = t.isCollapsed() ? '' : wb + t.serializer.serialize(e, s) + wa; |
| + | t.onGetContent.dispatch(t, s); |
| + | |
| + | return s.content; |
| + | }, |
| + | |
| + | setContent : function(h, s) { |
| + | var t = this, r = t.getRng(), c, d = t.win.document; |
| + | |
| + | s = s || {format : 'html'}; |
| + | s.set = true; |
| + | h = s.content = t.dom.processHTML(h); |
| + | |
| + | // Dispatch before set content event |
| + | t.onBeforeSetContent.dispatch(t, s); |
| + | h = s.content; |
| + | |
| + | if (r.insertNode) { |
| + | // Make caret marker since insertNode places the caret in the beginning of text after insert |
| + | h += '<span id="__caret">_</span>'; |
| + | |
| + | // Delete and insert new node |
| + | |
| + | if (r.startContainer == d && r.endContainer == d) { |
| + | // WebKit will fail if the body is empty since the range is then invalid and it can't insert contents |
| + | d.body.innerHTML = h; |
| + | } else { |
| + | r.deleteContents(); |
| + | if (d.body.childNodes.length == 0) { |
| + | d.body.innerHTML = h; |
| + | } else { |
| + | r.insertNode(r.createContextualFragment(h)); |
| + | } |
| + | } |
| + | |
| + | // Move to caret marker |
| + | c = t.dom.get('__caret'); |
| + | // Make sure we wrap it compleatly, Opera fails with a simple select call |
| + | r = d.createRange(); |
| + | r.setStartBefore(c); |
| + | r.setEndBefore(c); |
| + | t.setRng(r); |
| + | |
| + | // Remove the caret position |
| + | t.dom.remove('__caret'); |
| + | } else { |
| + | if (r.item) { |
| + | // Delete content and get caret text selection |
| + | d.execCommand('Delete', false, null); |
| + | r = t.getRng(); |
| + | } |
| + | |
| + | r.pasteHTML(h); |
| + | } |
| + | |
| + | // Dispatch set content event |
| + | t.onSetContent.dispatch(t, s); |
| + | }, |
| + | |
| + | getStart : function() { |
| + | var rng = this.getRng(), startElement, parentElement, checkRng, node; |
| + | |
| + | if (rng.duplicate || rng.item) { |
| + | // Control selection, return first item |
| + | if (rng.item) |
| + | return rng.item(0); |
| + | |
| + | // Get start element |
| + | checkRng = rng.duplicate(); |
| + | checkRng.collapse(1); |
| + | startElement = checkRng.parentElement(); |
| + | |
| + | // Check if range parent is inside the start element, then return the inner parent element |
| + | // This will fix issues when a single element is selected, IE would otherwise return the wrong start element |
| + | parentElement = node = rng.parentElement(); |
| + | while (node = node.parentNode) { |
| + | if (node == startElement) { |
| + | startElement = parentElement; |
| + | break; |
| + | } |
| + | } |
| + | |
| + | // If start element is body element try to move to the first child if it exists |
| + | if (startElement && startElement.nodeName == 'BODY') |
| + | return startElement.firstChild || startElement; |
| + | |
| + | return startElement; |
| + | } else { |
| + | startElement = rng.startContainer; |
| + | |
| + | if (startElement.nodeType == 1 && startElement.hasChildNodes()) |
| + | startElement = startElement.childNodes[Math.min(startElement.childNodes.length - 1, rng.startOffset)]; |
| + | |
| + | if (startElement && startElement.nodeType == 3) |
| + | return startElement.parentNode; |
| + | |
| + | return startElement; |
| + | } |
| + | }, |
| + | |
| + | getEnd : function() { |
| + | var t = this, r = t.getRng(), e, eo; |
| + | |
| + | if (r.duplicate || r.item) { |
| + | if (r.item) |
| + | return r.item(0); |
| + | |
| + | r = r.duplicate(); |
| + | r.collapse(0); |
| + | e = r.parentElement(); |
| + | |
| + | if (e && e.nodeName == 'BODY') |
| + | return e.lastChild || e; |
| + | |
| + | return e; |
| + | } else { |
| + | e = r.endContainer; |
| + | eo = r.endOffset; |
| + | |
| + | if (e.nodeType == 1 && e.hasChildNodes()) |
| + | e = e.childNodes[eo > 0 ? eo - 1 : eo]; |
| + | |
| + | if (e && e.nodeType == 3) |
| + | return e.parentNode; |
| + | |
| + | return e; |
| + | } |
| + | }, |
| + | |
| + | getBookmark : function(type, normalized) { |
| + | var t = this, dom = t.dom, rng, rng2, id, collapsed, name, element, index, chr = '\uFEFF', styles; |
| + | |
| + | function findIndex(name, element) { |
| + | var index = 0; |
| + | |
| + | each(dom.select(name), function(node, i) { |
| + | if (node == element) |
| + | index = i; |
| + | }); |
| + | |
| + | return index; |
| + | }; |
| + | |
| + | if (type == 2) { |
| + | function getLocation() { |
| + | var rng = t.getRng(true), root = dom.getRoot(), bookmark = {}; |
| + | |
| + | function getPoint(rng, start) { |
| + | var container = rng[start ? 'startContainer' : 'endContainer'], |
| + | offset = rng[start ? 'startOffset' : 'endOffset'], point = [], node, childNodes, after = 0; |
| + | |
| + | if (container.nodeType == 3) { |
| + | if (normalized) { |
| + | for (node = container.previousSibling; node && node.nodeType == 3; node = node.previousSibling) |
| + | offset += node.nodeValue.length; |
| + | } |
| + | |
| + | point.push(offset); |
| + | } else { |
| + | childNodes = container.childNodes; |
| + | |
| + | if (offset >= childNodes.length && childNodes.length) { |
| + | after = 1; |
| + | offset = Math.max(0, childNodes.length - 1); |
| + | } |
| + | |
| + | point.push(t.dom.nodeIndex(childNodes[offset], normalized) + after); |
| + | } |
| + | |
| + | for (; container && container != root; container = container.parentNode) |
| + | point.push(t.dom.nodeIndex(container, normalized)); |
| + | |
| + | return point; |
| + | }; |
| + | |
| + | bookmark.start = getPoint(rng, true); |
| + | |
| + | if (!t.isCollapsed()) |
| + | bookmark.end = getPoint(rng); |
| + | |
| + | return bookmark; |
| + | }; |
| + | |
| + | return getLocation(); |
| + | } |
| + | |
| + | // Handle simple range |
| + | if (type) |
| + | return {rng : t.getRng()}; |
| + | |
| + | rng = t.getRng(); |
| + | id = dom.uniqueId(); |
| + | collapsed = tinyMCE.activeEditor.selection.isCollapsed(); |
| + | styles = 'overflow:hidden;line-height:0px'; |
| + | |
| + | // Explorer method |
| + | if (rng.duplicate || rng.item) { |
| + | // Text selection |
| + | if (!rng.item) { |
| + | rng2 = rng.duplicate(); |
| + | |
| + | // Insert start marker |
| + | rng.collapse(); |
| + | rng.pasteHTML('<span _mce_type="bookmark" id="' + id + '_start" style="' + styles + '">' + chr + '</span>'); |
| + | |
| + | // Insert end marker |
| + | if (!collapsed) { |
| + | rng2.collapse(false); |
| + | rng2.pasteHTML('<span _mce_type="bookmark" id="' + id + '_end" style="' + styles + '">' + chr + '</span>'); |
| + | } |
| + | } else { |
| + | // Control selection |
| + | element = rng.item(0); |
| + | name = element.nodeName; |
| + | |
| + | return {name : name, index : findIndex(name, element)}; |
| + | } |
| + | } else { |
| + | element = t.getNode(); |
| + | name = element.nodeName; |
| + | if (name == 'IMG') |
| + | return {name : name, index : findIndex(name, element)}; |
| + | |
| + | // W3C method |
| + | rng2 = rng.cloneRange(); |
| + | |
| + | // Insert end marker |
| + | if (!collapsed) { |
| + | rng2.collapse(false); |
| + | rng2.insertNode(dom.create('span', {_mce_type : "bookmark", id : id + '_end', style : styles}, chr)); |
| + | } |
| + | |
| + | rng.collapse(true); |
| + | rng.insertNode(dom.create('span', {_mce_type : "bookmark", id : id + '_start', style : styles}, chr)); |
| + | } |
| + | |
| + | t.moveToBookmark({id : id, keep : 1}); |
| + | |
| + | return {id : id}; |
| + | }, |
| + | |
| + | moveToBookmark : function(bookmark) { |
| + | var t = this, dom = t.dom, marker1, marker2, rng, root, startContainer, endContainer, startOffset, endOffset; |
| + | |
| + | // Clear selection cache |
| + | if (t.tridentSel) |
| + | t.tridentSel.destroy(); |
| + | |
| + | if (bookmark) { |
| + | if (bookmark.start) { |
| + | rng = dom.createRng(); |
| + | root = dom.getRoot(); |
| + | |
| + | function setEndPoint(start) { |
| + | var point = bookmark[start ? 'start' : 'end'], i, node, offset, children; |
| + | |
| + | if (point) { |
| + | // Find container node |
| + | for (node = root, i = point.length - 1; i >= 1; i--) { |
| + | children = node.childNodes; |
| + | |
| + | if (children.length) |
| + | node = children[point[i]]; |
| + | } |
| + | |
| + | // Set offset within container node |
| + | if (start) |
| + | rng.setStart(node, point[0]); |
| + | else |
| + | rng.setEnd(node, point[0]); |
| + | } |
| + | }; |
| + | |
| + | setEndPoint(true); |
| + | setEndPoint(); |
| + | |
| + | t.setRng(rng); |
| + | } else if (bookmark.id) { |
| + | function restoreEndPoint(suffix) { |
| + | var marker = dom.get(bookmark.id + '_' + suffix), node, idx, next, prev, keep = bookmark.keep; |
| + | |
| + | if (marker) { |
| + | node = marker.parentNode; |
| + | |
| + | if (suffix == 'start') { |
| + | if (!keep) { |
| + | idx = dom.nodeIndex(marker); |
| + | } else { |
| + | node = marker.firstChild; |
| + | idx = 1; |
| + | } |
| + | |
| + | startContainer = endContainer = node; |
| + | startOffset = endOffset = idx; |
| + | } else { |
| + | if (!keep) { |
| + | idx = dom.nodeIndex(marker); |
| + | } else { |
| + | node = marker.firstChild; |
| + | idx = 1; |
| + | } |
| + | |
| + | endContainer = node; |
| + | endOffset = idx; |
| + | } |
| + | |
| + | if (!keep) { |
| + | prev = marker.previousSibling; |
| + | next = marker.nextSibling; |
| + | |
| + | // Remove all marker text nodes |
| + | each(tinymce.grep(marker.childNodes), function(node) { |
| + | if (node.nodeType == 3) |
| + | node.nodeValue = node.nodeValue.replace(/\uFEFF/g, ''); |
| + | }); |
| + | |
| + | // Remove marker but keep children if for example contents where inserted into the marker |
| + | // Also remove duplicated instances of the marker for example by a split operation or by WebKit auto split on paste feature |
| + | while (marker = dom.get(bookmark.id + '_' + suffix)) |
| + | dom.remove(marker, 1); |
| + | |
| + | // If siblings are text nodes then merge them |
| + | if (prev && next && prev.nodeType == next.nodeType && prev.nodeType == 3) { |
| + | idx = prev.nodeValue.length; |
| + | prev.appendData(next.nodeValue); |
| + | dom.remove(next); |
| + | |
| + | if (suffix == 'start') { |
| + | startContainer = endContainer = prev; |
| + | startOffset = endOffset = idx; |
| + | } else { |
| + | endContainer = prev; |
| + | endOffset = idx; |
| + | } |
| + | } |
| + | } |
| + | } |
| + | }; |
| + | |
| + | function addBogus(node) { |
| + | // Adds a bogus BR element for empty block elements |
| + | // on non IE browsers just to have a place to put the caret |
| + | if (!isIE && dom.isBlock(node) && !node.innerHTML) |
| + | node.innerHTML = '<br _mce_bogus="1" />'; |
| + | |
| + | return node; |
| + | }; |
| + | |
| + | // Restore start/end points |
| + | restoreEndPoint('start'); |
| + | restoreEndPoint('end'); |
| + | |
| + | rng = dom.createRng(); |
| + | rng.setStart(addBogus(startContainer), startOffset); |
| + | rng.setEnd(addBogus(endContainer), endOffset); |
| + | t.setRng(rng); |
| + | } else if (bookmark.name) { |
| + | t.select(dom.select(bookmark.name)[bookmark.index]); |
| + | } else if (bookmark.rng) |
| + | t.setRng(bookmark.rng); |
| + | } |
| + | }, |
| + | |
| + | select : function(node, content) { |
| + | var t = this, dom = t.dom, rng = dom.createRng(), idx; |
| + | |
| + | idx = dom.nodeIndex(node); |
| + | rng.setStart(node.parentNode, idx); |
| + | rng.setEnd(node.parentNode, idx + 1); |
| + | |
| + | // Find first/last text node or BR element |
| + | if (content) { |
| + | function setPoint(node, start) { |
| + | var walker = new tinymce.dom.TreeWalker(node, node); |
| + | |
| + | do { |
| + | // Text node |
| + | if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) { |
| + | if (start) |
| + | rng.setStart(node, 0); |
| + | else |
| + | rng.setEnd(node, node.nodeValue.length); |
| + | |
| + | return; |
| + | } |
| + | |
| + | // BR element |
| + | if (node.nodeName == 'BR') { |
| + | if (start) |
| + | rng.setStartBefore(node); |
| + | else |
| + | rng.setEndBefore(node); |
| + | |
| + | return; |
| + | } |
| + | } while (node = (start ? walker.next() : walker.prev())); |
| + | }; |
| + | |
| + | setPoint(node, 1); |
| + | setPoint(node); |
| + | } |
| + | |
| + | t.setRng(rng); |
| + | |
| + | return node; |
| + | }, |
| + | |
| + | isCollapsed : function() { |
| + | var t = this, r = t.getRng(), s = t.getSel(); |
| + | |
| + | if (!r || r.item) |
| + | return false; |
| + | |
| + | if (r.compareEndPoints) |
| + | return r.compareEndPoints('StartToEnd', r) === 0; |
| + | |
| + | return !s || r.collapsed; |
| + | }, |
| + | |
| + | collapse : function(b) { |
| + | var t = this, r = t.getRng(), n; |
| + | |
| + | // Control range on IE |
| + | if (r.item) { |
| + | n = r.item(0); |
| + | r = this.win.document.body.createTextRange(); |
| + | r.moveToElementText(n); |
| + | } |
| + | |
| + | r.collapse(!!b); |
| + | t.setRng(r); |
| + | }, |
| + | |
| + | getSel : function() { |
| + | var t = this, w = this.win; |
| + | |
| + | return w.getSelection ? w.getSelection() : w.document.selection; |
| + | }, |
| + | |
| + | getRng : function(w3c) { |
| + | var t = this, s, r; |
| + | |
| + | // Found tridentSel object then we need to use that one |
| + | if (w3c && t.tridentSel) |
| + | return t.tridentSel.getRangeAt(0); |
| + | |
| + | try { |
| + | if (s = t.getSel()) |
| + | r = s.rangeCount > 0 ? s.getRangeAt(0) : (s.createRange ? s.createRange() : t.win.document.createRange()); |
| + | } catch (ex) { |
| + | // IE throws unspecified error here if TinyMCE is placed in a frame/iframe |
| + | } |
| + | |
| + | // No range found then create an empty one |
| + | // This can occur when the editor is placed in a hidden container element on Gecko |
| + | // Or on IE when there was an exception |
| + | if (!r) |
| + | r = t.win.document.createRange ? t.win.document.createRange() : t.win.document.body.createTextRange(); |
| + | |
| + | if (t.selectedRange && t.explicitRange) { |
| + | if (r.compareBoundaryPoints(r.START_TO_START, t.selectedRange) === 0 && r.compareBoundaryPoints(r.END_TO_END, t.selectedRange) === 0) { |
| + | // Safari, Opera and Chrome only ever select text which causes the range to change. |
| + | // This lets us use the originally set range if the selection hasn't been changed by the user. |
| + | r = t.explicitRange; |
| + | } else { |
| + | t.selectedRange = null; |
| + | t.explicitRange = null; |
| + | } |
| + | } |
| + | return r; |
| + | }, |
| + | |
| + | setRng : function(r) { |
| + | var s, t = this; |
| + | |
| + | if (!t.tridentSel) { |
| + | s = t.getSel(); |
| + | |
| + | if (s) { |
| + | t.explicitRange = r; |
| + | s.removeAllRanges(); |
| + | s.addRange(r); |
| + | t.selectedRange = s.getRangeAt(0); |
| + | } |
| + | } else { |
| + | // Is W3C Range |
| + | if (r.cloneRange) { |
| + | t.tridentSel.addRange(r); |
| + | return; |
| + | } |
| + | |
| + | // Is IE specific range |
| + | try { |
| + | r.select(); |
| + | } catch (ex) { |
| + | // Needed for some odd IE bug #1843306 |
| + | } |
| + | } |
| + | }, |
| + | |
| + | setNode : function(n) { |
| + | var t = this; |
| + | |
| + | t.setContent(t.dom.getOuterHTML(n)); |
| + | |
| + | return n; |
| + | }, |
| + | |
| + | getNode : function() { |
| + | var t = this, rng = t.getRng(), sel = t.getSel(), elm; |
| + | |
| + | if (rng.setStart) { |
| + | // Range maybe lost after the editor is made visible again |
| + | if (!rng) |
| + | return t.dom.getRoot(); |
| + | |
| + | elm = rng.commonAncestorContainer; |
| + | |
| + | // Handle selection a image or other control like element such as anchors |
| + | if (!rng.collapsed) { |
| + | if (rng.startContainer == rng.endContainer) { |
| + | if (rng.startOffset - rng.endOffset < 2) { |
| + | if (rng.startContainer.hasChildNodes()) |
| + | elm = rng.startContainer.childNodes[rng.startOffset]; |
| + | } |
| + | } |
| + | |
| + | // If the anchor node is a element instead of a text node then return this element |
| + | if (tinymce.isWebKit && sel.anchorNode && sel.anchorNode.nodeType == 1) |
| + | return sel.anchorNode.childNodes[sel.anchorOffset]; |
| + | } |
| + | |
| + | if (elm && elm.nodeType == 3) |
| + | return elm.parentNode; |
| + | |
| + | return elm; |
| + | } |
| + | |
| + | return rng.item ? rng.item(0) : rng.parentElement(); |
| + | }, |
| + | |
| + | getSelectedBlocks : function(st, en) { |
| + | var t = this, dom = t.dom, sb, eb, n, bl = []; |
| + | |
| + | sb = dom.getParent(st || t.getStart(), dom.isBlock); |
| + | eb = dom.getParent(en || t.getEnd(), dom.isBlock); |
| + | |
| + | if (sb) |
| + | bl.push(sb); |
| + | |
| + | if (sb && eb && sb != eb) { |
| + | n = sb; |
| + | |
| + | while ((n = n.nextSibling) && n != eb) { |
| + | if (dom.isBlock(n)) |
| + | bl.push(n); |
| + | } |
| + | } |
| + | |
| + | if (eb && sb != eb) |
| + | bl.push(eb); |
| + | |
| + | return bl; |
| + | }, |
| + | |
| + | destroy : function(s) { |
| + | var t = this; |
| + | |
| + | t.win = null; |
| + | |
| + | if (t.tridentSel) |
| + | t.tridentSel.destroy(); |
| + | |
| + | // Manual destroy then remove unload handler |
| + | if (!s) |
| + | tinymce.removeUnload(t.destroy); |
| + | } |
| + | }); |
| + | })(tinymce); |
| + | |
| + | (function(tinymce) { |
| + | tinymce.create('tinymce.dom.XMLWriter', { |
| + | node : null, |
| + | |
| + | XMLWriter : function(s) { |
| + | // Get XML document |
| + | function getXML() { |
| + | var i = document.implementation; |
| + | |
| + | if (!i || !i.createDocument) { |
| + | // Try IE objects |
| + | try {return new ActiveXObject('MSXML2.DOMDocument');} catch (ex) {} |
| + | try {return new ActiveXObject('Microsoft.XmlDom');} catch (ex) {} |
| + | } else |
| + | return i.createDocument('', '', null); |
| + | }; |
| + | |
| + | this.doc = getXML(); |
| + | |
| + | // Since Opera and WebKit doesn't escape > into > we need to do it our self to normalize the output for all browsers |
| + | this.valid = tinymce.isOpera || tinymce.isWebKit; |
| + | |
| + | this.reset(); |
| + | }, |
| + | |
| + | reset : function() { |
| + | var t = this, d = t.doc; |
| + | |
| + | if (d.firstChild) |
| + | d.removeChild(d.firstChild); |
| + | |
| + | t.node = d.appendChild(d.createElement("html")); |
| + | }, |
| + | |
| + | writeStartElement : function(n) { |
| + | var t = this; |
| + | |
| + | t.node = t.node.appendChild(t.doc.createElement(n)); |
| + | }, |
| + | |
| + | writeAttribute : function(n, v) { |
| + | if (this.valid) |
| + | v = v.replace(/>/g, '%MCGT%'); |
| + | |
| + | this.node.setAttribute(n, v); |
| + | }, |
| + | |
| + | writeEndElement : function() { |
| + | this.node = this.node.parentNode; |
| + | }, |
| + | |
| + | writeFullEndElement : function() { |
| + | var t = this, n = t.node; |
| + | |
| + | n.appendChild(t.doc.createTextNode("")); |
| + | t.node = n.parentNode; |
| + | }, |
| + | |
| + | writeText : function(v) { |
| + | if (this.valid) |
| + | v = v.replace(/>/g, '%MCGT%'); |
| + | |
| + | this.node.appendChild(this.doc.createTextNode(v)); |
| + | }, |
| + | |
| + | writeCDATA : function(v) { |
| + | this.node.appendChild(this.doc.createCDATASection(v)); |
| + | }, |
| + | |
| + | writeComment : function(v) { |
| + | // Fix for bug #2035694 |
| + | if (tinymce.isIE) |
| + | v = v.replace(/^\-|\-$/g, ' '); |
| + | |
| + | this.node.appendChild(this.doc.createComment(v.replace(/\-\-/g, ' '))); |
| + | }, |
| + | |
| + | getContent : function() { |
| + | var h; |
| + | |
| + | h = this.doc.xml || new XMLSerializer().serializeToString(this.doc); |
| + | h = h.replace(/<\?[^?]+\?>|<html>|<\/html>|<html\/>|<!DOCTYPE[^>]+>/g, ''); |
| + | h = h.replace(/ ?\/>/g, ' />'); |
| + | |
| + | if (this.valid) |
| + | h = h.replace(/\%MCGT%/g, '>'); |
| + | |
| + | return h; |
| + | } |
| + | }); |
| + | })(tinymce); |
| + | |
| + | (function(tinymce) { |
| + | tinymce.create('tinymce.dom.StringWriter', { |
| + | str : null, |
| + | tags : null, |
| + | count : 0, |
| + | settings : null, |
| + | indent : null, |
| + | |
| + | StringWriter : function(s) { |
| + | this.settings = tinymce.extend({ |
| + | indent_char : ' ', |
| + | indentation : 0 |
| + | }, s); |
| + | |
| + | this.reset(); |
| + | }, |
| + | |
| + | reset : function() { |
| + | this.indent = ''; |
| + | this.str = ""; |
| + | this.tags = []; |
| + | this.count = 0; |
| + | }, |
| + | |
| + | writeStartElement : function(n) { |
| + | this._writeAttributesEnd(); |
| + | this.writeRaw('<' + n); |
| + | this.tags.push(n); |
| + | this.inAttr = true; |
| + | this.count++; |
| + | this.elementCount = this.count; |
| + | }, |
| + | |
| + | writeAttribute : function(n, v) { |
| + | var t = this; |
| + | |
| + | t.writeRaw(" " + t.encode(n) + '="' + t.encode(v) + '"'); |
| + | }, |
| + | |
| + | writeEndElement : function() { |
| + | var n; |
| + | |
| + | if (this.tags.length > 0) { |
| + | n = this.tags.pop(); |
| + | |
| + | if (this._writeAttributesEnd(1)) |
| + | this.writeRaw('</' + n + '>'); |
| + | |
| + | if (this.settings.indentation > 0) |
| + | this.writeRaw('\n'); |
| + | } |
| + | }, |
| + | |
| + | writeFullEndElement : function() { |
| + | if (this.tags.length > 0) { |
| + | this._writeAttributesEnd(); |
| + | this.writeRaw('</' + this.tags.pop() + '>'); |
| + | |
| + | if (this.settings.indentation > 0) |
| + | this.writeRaw('\n'); |
| + | } |
| + | }, |
| + | |
| + | writeText : function(v) { |
| + | this._writeAttributesEnd(); |
| + | this.writeRaw(this.encode(v)); |
| + | this.count++; |
| + | }, |
| + | |
| + | writeCDATA : function(v) { |
| + | this._writeAttributesEnd(); |
| + | this.writeRaw('<![CDATA[' + v + ']]>'); |
| + | this.count++; |
| + | }, |
| + | |
| + | writeComment : function(v) { |
| + | this._writeAttributesEnd(); |
| + | this.writeRaw('<!-- ' + v + '-->'); |
| + | this.count++; |
| + | }, |
| + | |
| + | writeRaw : function(v) { |
| + | this.str += v; |
| + | }, |
| + | |
| + | encode : function(s) { |
| + | return s.replace(/[<>&"]/g, function(v) { |
| + | switch (v) { |
| + | case '<': |
| + | return '<'; |
| + | |
| + | case '>': |
| + | return '>'; |
| + | |
| + | case '&': |
| + | return '&'; |
| + | |
| + | case '"': |
| + | return '"'; |
| + | } |
| + | |
| + | return v; |
| + | }); |
| + | }, |
| + | |
| + | getContent : function() { |
| + | return this.str; |
| + | }, |
| + | |
| + | _writeAttributesEnd : function(s) { |
| + | if (!this.inAttr) |
| + | return; |
| + | |
| + | this.inAttr = false; |
| + | |
| + | if (s && this.elementCount == this.count) { |
| + | this.writeRaw(' />'); |
| + | return false; |
| + | } |
| + | |
| + | this.writeRaw('>'); |
| + | |
| + | return true; |
| + | } |
| + | }); |
| + | })(tinymce); |
| + | |
| + | (function(tinymce) { |
| + | // Shorten names |
| + | var extend = tinymce.extend, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher, isIE = tinymce.isIE, isGecko = tinymce.isGecko; |
| + | |
| + | function wildcardToRE(s) { |
| + | return s.replace(/([?+*])/g, '.$1'); |
| + | }; |
| + | |
| + | tinymce.create('tinymce.dom.Serializer', { |
| + | Serializer : function(s) { |
| + | var t = this; |
| + | |
| + | t.key = 0; |
| + | t.onPreProcess = new Dispatcher(t); |
| + | t.onPostProcess = new Dispatcher(t); |
| + | |
| + | try { |
| + | t.writer = new tinymce.dom.XMLWriter(); |
| + | } catch (ex) { |
| + | // IE might throw exception if ActiveX is disabled so we then switch to the slightly slower StringWriter |
| + | t.writer = new tinymce.dom.StringWriter(); |
| + | } |
| + | |
| + | // Default settings |
| + | t.settings = s = extend({ |
| + | dom : tinymce.DOM, |
| + | valid_nodes : 0, |
| + | node_filter : 0, |
| + | attr_filter : 0, |
| + | invalid_attrs : /^(_mce_|_moz_|sizset|sizcache)/, |
| + | closed : /^(br|hr|input|meta|img|link|param|area)$/, |
| + | entity_encoding : 'named', |
| + | entities : '160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro', |
| + | valid_elements : '*[*]', |
| + | extended_valid_elements : 0, |
| + | invalid_elements : 0, |
| + | fix_table_elements : 1, |
| + | fix_list_elements : true, |
| + | fix_content_duplication : true, |
| + | convert_fonts_to_spans : false, |
| + | font_size_classes : 0, |
| + | apply_source_formatting : 0, |
| + | indent_mode : 'simple', |
| + | indent_char : '\t', |
| + | indent_levels : 1, |
| + | remove_linebreaks : 1, |
| + | remove_redundant_brs : 1, |
| + | element_format : 'xhtml' |
| + | }, s); |
| + | |
| + | t.dom = s.dom; |
| + | t.schema = s.schema; |
| + | |
| + | // Use raw entities if no entities are defined |
| + | if (s.entity_encoding == 'named' && !s.entities) |
| + | s.entity_encoding = 'raw'; |
| + | |
| + | if (s.remove_redundant_brs) { |
| + | t.onPostProcess.add(function(se, o) { |
| + | // Remove single BR at end of block elements since they get rendered |
| + | o.content = o.content.replace(/(<br \/>\s*)+<\/(p|h[1-6]|div|li)>/gi, function(a, b, c) { |
| + | // Check if it's a single element |
| + | if (/^<br \/>\s*<\//.test(a)) |
| + | return '</' + c + '>'; |
| + | |
| + | return a; |
| + | }); |
| + | }); |
| + | } |
| + | |
| + | // Remove XHTML element endings i.e. produce crap :) XHTML is better |
| + | if (s.element_format == 'html') { |
| + | t.onPostProcess.add(function(se, o) { |
| + | o.content = o.content.replace(/<([^>]+) \/>/g, '<$1>'); |
| + | }); |
| + | } |
| + | |
| + | if (s.fix_list_elements) { |
| + | t.onPreProcess.add(function(se, o) { |
| + | var nl, x, a = ['ol', 'ul'], i, n, p, r = /^(OL|UL)$/, np; |
| + | |
| + | function prevNode(e, n) { |
| + | var a = n.split(','), i; |
| + | |
| + | while ((e = e.previousSibling) != null) { |
| + | for (i=0; i<a.length; i++) { |
| + | if (e.nodeName == a[i]) |
| + | return e; |
| + | } |
| + | } |
| + | |
| + | return null; |
| + | }; |
| + | |
| + | for (x=0; x<a.length; x++) { |
| + | nl = t.dom.select(a[x], o.node); |
| + | |
| + | for (i=0; i<nl.length; i++) { |
| + | n = nl[i]; |
| + | p = n.parentNode; |
| + | |
| + | if (r.test(p.nodeName)) { |
| + | np = prevNode(n, 'LI'); |
| + | |
| + | if (!np) { |
| + | np = t.dom.create('li'); |
| + | np.innerHTML = ' '; |
| + | np.appendChild(n); |
| + | p.insertBefore(np, p.firstChild); |
| + | } else |
| + | np.appendChild(n); |
| + | } |
| + | } |
| + | } |
| + | }); |
| + | } |
| + | |
| + | if (s.fix_table_elements) { |
| + | t.onPreProcess.add(function(se, o) { |
| + | // Since Opera will crash if you attach the node to a dynamic document we need to brrowser sniff a specific build |
| + | // so Opera users with an older version will have to live with less compaible output not much we can do here |
| + | if (!tinymce.isOpera || opera.buildNumber() >= 1767) { |
| + | each(t.dom.select('p table', o.node).reverse(), function(n) { |
| + | var parent = t.dom.getParent(n.parentNode, 'table,p'); |
| + | |
| + | if (parent.nodeName != 'TABLE') { |
| + | try { |
| + | t.dom.split(parent, n); |
| + | } catch (ex) { |
| + | // IE can sometimes fire an unknown runtime error so we just ignore it |
| + | } |
| + | } |
| + | }); |
| + | } |
| + | }); |
| + | } |
| + | }, |
| + | |
| + | setEntities : function(s) { |
| + | var t = this, a, i, l = {}, v; |
| + | |
| + | // No need to setup more than once |
| + | if (t.entityLookup) |
| + | return; |
| + | |
| + | // Build regex and lookup array |
| + | a = s.split(','); |
| + | for (i = 0; i < a.length; i += 2) { |
| + | v = a[i]; |
| + | |
| + | // Don't add default & " etc. |
| + | if (v == 34 || v == 38 || v == 60 || v == 62) |
| + | continue; |
| + | |
| + | l[String.fromCharCode(a[i])] = a[i + 1]; |
| + | |
| + | v = parseInt(a[i]).toString(16); |
| + | } |
| + | |
| + | t.entityLookup = l; |
| + | }, |
| + | |
| + | setRules : function(s) { |
| + | var t = this; |
| + | |
| + | t._setup(); |
| + | t.rules = {}; |
| + | t.wildRules = []; |
| + | t.validElements = {}; |
| + | |
| + | return t.addRules(s); |
| + | }, |
| + | |
| + | addRules : function(s) { |
| + | var t = this, dr; |
| + | |
| + | if (!s) |
| + | return; |
| + | |
| + | t._setup(); |
| + | |
| + | each(s.split(','), function(s) { |
| + | var p = s.split(/\[|\]/), tn = p[0].split('/'), ra, at, wat, va = []; |
| + | |
| + | // Extend with default rules |
| + | if (dr) |
| + | at = tinymce.extend([], dr.attribs); |
| + | |
| + | // Parse attributes |
| + | if (p.length > 1) { |
| + | each(p[1].split('|'), function(s) { |
| + | var ar = {}, i; |
| + | |
| + | at = at || []; |
| + | |
| + | // Parse attribute rule |
| + | s = s.replace(/::/g, '~'); |
| + | s = /^([!\-])?([\w*.?~_\-]+|)([=:<])?(.+)?$/.exec(s); |
| + | s[2] = s[2].replace(/~/g, ':'); |
| + | |
| + | // Add required attributes |
| + | if (s[1] == '!') { |
| + | ra = ra || []; |
| + | ra.push(s[2]); |
| + | } |
| + | |
| + | // Remove inherited attributes |
| + | if (s[1] == '-') { |
| + | for (i = 0; i <at.length; i++) { |
| + | if (at[i].name == s[2]) { |
| + | at.splice(i, 1); |
| + | return; |
| + | } |
| + | } |
| + | } |
| + | |
| + | switch (s[3]) { |
| + | // Add default attrib values |
| + | case '=': |
| + | ar.defaultVal = s[4] || ''; |
| + | break; |
| + | |
| + | // Add forced attrib values |
| + | case ':': |
| + | ar.forcedVal = s[4]; |
| + | break; |
| + | |
| + | // Add validation values |
| + | case '<': |
| + | ar.validVals = s[4].split('?'); |
| + | break; |
| + | } |
| + | |
| + | if (/[*.?]/.test(s[2])) { |
| + | wat = wat || []; |
| + | ar.nameRE = new RegExp('^' + wildcardToRE(s[2]) + '$'); |
| + | wat.push(ar); |
| + | } else { |
| + | ar.name = s[2]; |
| + | at.push(ar); |
| + | } |
| + | |
| + | va.push(s[2]); |
| + | }); |
| + | } |
| + | |
| + | // Handle element names |
| + | each(tn, function(s, i) { |
| + | var pr = s.charAt(0), x = 1, ru = {}; |
| + | |
| + | // Extend with default rule data |
| + | if (dr) { |
| + | if (dr.noEmpty) |
| + | ru.noEmpty = dr.noEmpty; |
| + | |
| + | if (dr.fullEnd) |
| + | ru.fullEnd = dr.fullEnd; |
| + | |
| + | if (dr.padd) |
| + | ru.padd = dr.padd; |
| + | } |
| + | |
| + | // Handle prefixes |
| + | switch (pr) { |
| + | case '-': |
| + | ru.noEmpty = true; |
| + | break; |
| + | |
| + | case '+': |
| + | ru.fullEnd = true; |
| + | break; |
| + | |
| + | case '#': |
| + | ru.padd = true; |
| + | break; |
| + | |
| + | default: |
| + | x = 0; |
| + | } |
| + | |
| + | tn[i] = s = s.substring(x); |
| + | t.validElements[s] = 1; |
| + | |
| + | // Add element name or element regex |
| + | if (/[*.?]/.test(tn[0])) { |
| + | ru.nameRE = new RegExp('^' + wildcardToRE(tn[0]) + '$'); |
| + | t.wildRules = t.wildRules || {}; |
| + | t.wildRules.push(ru); |
| + | } else { |
| + | ru.name = tn[0]; |
| + | |
| + | // Store away default rule |
| + | if (tn[0] == '@') |
| + | dr = ru; |
| + | |
| + | t.rules[s] = ru; |
| + | } |
| + | |
| + | ru.attribs = at; |
| + | |
| + | if (ra) |
| + | ru.requiredAttribs = ra; |
| + | |
| + | if (wat) { |
| + | // Build valid attributes regexp |
| + | s = ''; |
| + | each(va, function(v) { |
| + | if (s) |
| + | s += '|'; |
| + | |
| + | s += '(' + wildcardToRE(v) + ')'; |
| + | }); |
| + | ru.validAttribsRE = new RegExp('^' + s.toLowerCase() + '$'); |
| + | ru.wildAttribs = wat; |
| + | } |
| + | }); |
| + | }); |
| + | |
| + | // Build valid elements regexp |
| + | s = ''; |
| + | each(t.validElements, function(v, k) { |
| + | if (s) |
| + | s += '|'; |
| + | |
| + | if (k != '@') |
| + | s += k; |
| + | }); |
| + | t.validElementsRE = new RegExp('^(' + wildcardToRE(s.toLowerCase()) + ')$'); |
| + | |
| + | //console.debug(t.validElementsRE.toString()); |
| + | //console.dir(t.rules); |
| + | //console.dir(t.wildRules); |
| + | }, |
| + | |
| + | findRule : function(n) { |
| + | var t = this, rl = t.rules, i, r; |
| + | |
| + | t._setup(); |
| + | |
| + | // Exact match |
| + | r = rl[n]; |
| + | if (r) |
| + | return r; |
| + | |
| + | // Try wildcards |
| + | rl = t.wildRules; |
| + | for (i = 0; i < rl.length; i++) { |
| + | if (rl[i].nameRE.test(n)) |
| + | return rl[i]; |
| + | } |
| + | |
| + | return null; |
| + | }, |
| + | |
| + | findAttribRule : function(ru, n) { |
| + | var i, wa = ru.wildAttribs; |
| + | |
| + | for (i = 0; i < wa.length; i++) { |
| + | if (wa[i].nameRE.test(n)) |
| + | return wa[i]; |
| + | } |
| + | |
| + | return null; |
| + | }, |
| + | |
| + | serialize : function(n, o) { |
| + | var h, t = this, doc, oldDoc, impl, selected; |
| + | |
| + | t._setup(); |
| + | o = o || {}; |
| + | o.format = o.format || 'html'; |
| + | t.processObj = o; |
| + | |
| + | // IE looses the selected attribute on option elements so we need to store it |
| + | // See: http://support.microsoft.com/kb/829907 |
| + | if (isIE) { |
| + | selected = []; |
| + | each(n.getElementsByTagName('option'), function(n) { |
| + | var v = t.dom.getAttrib(n, 'selected'); |
| + | |
| + | selected.push(v ? v : null); |
| + | }); |
| + | } |
| + | |
| + | n = n.cloneNode(true); |
| + | |
| + | // IE looses the selected attribute on option elements so we need to restore it |
| + | if (isIE) { |
| + | each(n.getElementsByTagName('option'), function(n, i) { |
| + | t.dom.setAttrib(n, 'selected', selected[i]); |
| + | }); |
| + | } |
| + | |
| + | // Nodes needs to be attached to something in WebKit/Opera |
| + | // Older builds of Opera crashes if you attach the node to an document created dynamically |
| + | // and since we can't feature detect a crash we need to sniff the acutal build number |
| + | // This fix will make DOM ranges and make Sizzle happy! |
| + | impl = n.ownerDocument.implementation; |
| + | if (impl.createHTMLDocument && (tinymce.isOpera && opera.buildNumber() >= 1767)) { |
| + | // Create an empty HTML document |
| + | doc = impl.createHTMLDocument(""); |
| + | |
| + | // Add the element or it's children if it's a body element to the new document |
| + | each(n.nodeName == 'BODY' ? n.childNodes : [n], function(node) { |
| + | doc.body.appendChild(doc.importNode(node, true)); |
| + | }); |
| + | |
| + | // Grab first child or body element for serialization |
| + | if (n.nodeName != 'BODY') |
| + | n = doc.body.firstChild; |
| + | else |
| + | n = doc.body; |
| + | |
| + | // set the new document in DOMUtils so createElement etc works |
| + | oldDoc = t.dom.doc; |
| + | t.dom.doc = doc; |
| + | } |
| + | |
| + | t.key = '' + (parseInt(t.key) + 1); |
| + | |
| + | // Pre process |
| + | if (!o.no_events) { |
| + | o.node = n; |
| + | t.onPreProcess.dispatch(t, o); |
| + | } |
| + | |
| + | // Serialize HTML DOM into a string |
| + | t.writer.reset(); |
| + | t._info = o; |
| + | t._serializeNode(n, o.getInner); |
| + | |
| + | // Post process |
| + | o.content = t.writer.getContent(); |
| + | |
| + | // Restore the old document if it was changed |
| + | if (oldDoc) |
| + | t.dom.doc = oldDoc; |
| + | |
| + | if (!o.no_events) |
| + | t.onPostProcess.dispatch(t, o); |
| + | |
| + | t._postProcess(o); |
| + | o.node = null; |
| + | |
| + | return tinymce.trim(o.content); |
| + | }, |
| + | |
| + | // Internal functions |
| + | |
| + | _postProcess : function(o) { |
| + | var t = this, s = t.settings, h = o.content, sc = [], p; |
| + | |
| + | if (o.format == 'html') { |
| + | // Protect some elements |
| + | p = t._protect({ |
| + | content : h, |
| + | patterns : [ |
| + | {pattern : /(<script[^>]*>)(.*?)(<\/script>)/g}, |
| + | {pattern : /(<noscript[^>]*>)(.*?)(<\/noscript>)/g}, |
| + | {pattern : /(<style[^>]*>)(.*?)(<\/style>)/g}, |
| + | {pattern : /(<pre[^>]*>)(.*?)(<\/pre>)/g, encode : 1}, |
| + | {pattern : /(<!--\[CDATA\[)(.*?)(\]\]-->)/g} |
| + | ] |
| + | }); |
| + | |
| + | h = p.content; |
| + | |
| + | // Entity encode |
| + | if (s.entity_encoding !== 'raw') |
| + | h = t._encode(h); |
| + | |
| + | // Use BR instead of padded P elements inside editor and use <p> </p> outside editor |
| + | /* if (o.set) |
| + | h = h.replace(/<p>\s+( | |\u00a0|<br \/>)\s+<\/p>/g, '<p><br /></p>'); |
| + | else |
| + | h = h.replace(/<p>\s+( | |\u00a0|<br \/>)\s+<\/p>/g, '<p>$1</p>');*/ |
| + | |
| + | // Since Gecko and Safari keeps whitespace in the DOM we need to |
| + | // remove it inorder to match other browsers. But I think Gecko and Safari is right. |
| + | // This process is only done when getting contents out from the editor. |
| + | if (!o.set) { |
| + | // We need to replace paragraph whitespace with an nbsp before indentation to keep the \u00a0 char |
| + | h = h.replace(/<p>\s+<\/p>|<p([^>]+)>\s+<\/p>/g, s.entity_encoding == 'numeric' ? '<p$1> </p>' : '<p$1> </p>'); |
| + | |
| + | if (s.remove_linebreaks) { |
| + | h = h.replace(/\r?\n|\r/g, ' '); |
| + | h = h.replace(/(<[^>]+>)\s+/g, '$1 '); |
| + | h = h.replace(/\s+(<\/[^>]+>)/g, ' $1'); |
| + | h = h.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object) ([^>]+)>\s+/g, '<$1 $2>'); // Trim block start |
| + | h = h.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>\s+/g, '<$1>'); // Trim block start |
| + | h = h.replace(/\s+<\/(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>/g, '</$1>'); // Trim block end |
| + | } |
| + | |
| + | // Simple indentation |
| + | if (s.apply_source_formatting && s.indent_mode == 'simple') { |
| + | // Add line breaks before and after block elements |
| + | h = h.replace(/<(\/?)(ul|hr|table|meta|link|tbody|tr|object|body|head|html|map)(|[^>]+)>\s*/g, '\n<$1$2$3>\n'); |
| + | h = h.replace(/\s*<(p|h[1-6]|blockquote|div|title|style|pre|script|td|li|area)(|[^>]+)>/g, '\n<$1$2>'); |
| + | h = h.replace(/<\/(p|h[1-6]|blockquote|div|title|style|pre|script|td|li)>\s*/g, '</$1>\n'); |
| + | h = h.replace(/\n\n/g, '\n'); |
| + | } |
| + | } |
| + | |
| + | h = t._unprotect(h, p); |
| + | |
| + | // Restore CDATA sections |
| + | h = h.replace(/<!--\[CDATA\[([\s\S]+)\]\]-->/g, '<![CDATA[$1]]>'); |
| + | |
| + | // Restore the \u00a0 character if raw mode is enabled |
| + | if (s.entity_encoding == 'raw') |
| + | h = h.replace(/<p> <\/p>|<p([^>]+)> <\/p>/g, '<p$1>\u00a0</p>'); |
| + | |
| + | // Restore noscript elements |
| + | h = h.replace(/<noscript([^>]+|)>([\s\S]*?)<\/noscript>/g, function(v, attribs, text) { |
| + | return '<noscript' + attribs + '>' + t.dom.decode(text.replace(/<!--|-->/g, '')) + '</noscript>'; |
| + | }); |
| + | } |
| + | |
| + | o.content = h; |
| + | }, |
| + | |
| + | _serializeNode : function(n, inner) { |
| + | var t = this, s = t.settings, w = t.writer, hc, el, cn, i, l, a, at, no, v, nn, ru, ar, iv, closed, keep, type, scopeName; |
| + | |
| + | if (!s.node_filter || s.node_filter(n)) { |
| + | switch (n.nodeType) { |
| + | case 1: // Element |
| + | if (n.hasAttribute ? n.hasAttribute('_mce_bogus') : n.getAttribute('_mce_bogus')) |
| + | return; |
| + | |
| + | iv = keep = false; |
| + | hc = n.hasChildNodes(); |
| + | nn = n.getAttribute('_mce_name') || n.nodeName.toLowerCase(); |
| + | |
| + | // Get internal type |
| + | type = n.getAttribute('_mce_type'); |
| + | if (type) { |
| + | if (!t._info.cleanup) { |
| + | iv = true; |
| + | return; |
| + | } else |
| + | keep = 1; |
| + | } |
| + | |
| + | // Add correct prefix on IE |
| + | if (isIE) { |
| + | scopeName = n.scopeName; |
| + | if (scopeName && scopeName !== 'HTML' && scopeName !== 'html') |
| + | nn = scopeName + ':' + nn; |
| + | } |
| + | |
| + | // Remove mce prefix on IE needed for the abbr element |
| + | if (nn.indexOf('mce:') === 0) |
| + | nn = nn.substring(4); |
| + | |
| + | // Check if valid |
| + | if (!keep) { |
| + | if (!t.validElementsRE || !t.validElementsRE.test(nn) || (t.invalidElementsRE && t.invalidElementsRE.test(nn)) || inner) { |
| + | iv = true; |
| + | break; |
| + | } |
| + | } |
| + | |
| + | if (isIE) { |
| + | // Fix IE content duplication (DOM can have multiple copies of the same node) |
| + | if (s.fix_content_duplication) { |
| + | if (n._mce_serialized == t.key) |
| + | return; |
| + | |
| + | n._mce_serialized = t.key; |
| + | } |
| + | |
| + | // IE sometimes adds a / infront of the node name |
| + | if (nn.charAt(0) == '/') |
| + | nn = nn.substring(1); |
| + | } else if (isGecko) { |
| + | // Ignore br elements |
| + | if (n.nodeName === 'BR' && n.getAttribute('type') == '_moz') |
| + | return; |
| + | } |
| + | |
| + | // Check if valid child |
| + | if (s.validate_children) { |
| + | if (t.elementName && !t.schema.isValid(t.elementName, nn)) { |
| + | iv = true; |
| + | break; |
| + | } |
| + | |
| + | t.elementName = nn; |
| + | } |
| + | |
| + | ru = t.findRule(nn); |
| + | |
| + | // No valid rule for this element could be found then skip it |
| + | if (!ru) { |
| + | iv = true; |
| + | break; |
| + | } |
| + | |
| + | nn = ru.name || nn; |
| + | closed = s.closed.test(nn); |
| + | |
| + | // Skip empty nodes or empty node name in IE |
| + | if ((!hc && ru.noEmpty) || (isIE && !nn)) { |
| + | iv = true; |
| + | break; |
| + | } |
| + | |
| + | // Check required |
| + | if (ru.requiredAttribs) { |
| + | a = ru.requiredAttribs; |
| + | |
| + | for (i = a.length - 1; i >= 0; i--) { |
| + | if (this.dom.getAttrib(n, a[i]) !== '') |
| + | break; |
| + | } |
| + | |
| + | // None of the required was there |
| + | if (i == -1) { |
| + | iv = true; |
| + | break; |
| + | } |
| + | } |
| + | |
| + | w.writeStartElement(nn); |
| + | |
| + | // Add ordered attributes |
| + | if (ru.attribs) { |
| + | for (i=0, at = ru.attribs, l = at.length; i<l; i++) { |
| + | a = at[i]; |
| + | v = t._getAttrib(n, a); |
| + | |
| + | if (v !== null) |
| + | w.writeAttribute(a.name, v); |
| + | } |
| + | } |
| + | |
| + | // Add wild attributes |
| + | if (ru.validAttribsRE) { |
| + | at = t.dom.getAttribs(n); |
| + | for (i=at.length-1; i>-1; i--) { |
| + | no = at[i]; |
| + | |
| + | if (no.specified) { |
| + | a = no.nodeName.toLowerCase(); |
| + | |
| + | if (s.invalid_attrs.test(a) || !ru.validAttribsRE.test(a)) |
| + | continue; |
| + | |
| + | ar = t.findAttribRule(ru, a); |
| + | v = t._getAttrib(n, ar, a); |
| + | |
| + | if (v !== null) |
| + | w.writeAttribute(a, v); |
| + | } |
| + | } |
| + | } |
| + | |
| + | // Keep type attribute |
| + | if (type && keep) |
| + | w.writeAttribute('_mce_type', type); |
| + | |
| + | // Write text from script |
| + | if (nn === 'script' && tinymce.trim(n.innerHTML)) { |
| + | w.writeText('// '); // Padd it with a comment so it will parse on older browsers |
| + | w.writeCDATA(n.innerHTML.replace(/<!--|-->|<\[CDATA\[|\]\]>/g, '')); // Remove comments and cdata stuctures |
| + | hc = false; |
| + | break; |
| + | } |
| + | |
| + | // Padd empty nodes with a |
| + | if (ru.padd) { |
| + | // If it has only one bogus child, padd it anyway workaround for <td><br /></td> bug |
| + | if (hc && (cn = n.firstChild) && cn.nodeType === 1 && n.childNodes.length === 1) { |
| + | if (cn.hasAttribute ? cn.hasAttribute('_mce_bogus') : cn.getAttribute('_mce_bogus')) |
| + | w.writeText('\u00a0'); |
| + | } else if (!hc) |
| + | w.writeText('\u00a0'); // No children then padd it |
| + | } |
| + | |
| + | break; |
| + | |
| + | case 3: // Text |
| + | // Check if valid child |
| + | if (s.validate_children && t.elementName && !t.schema.isValid(t.elementName, '#text')) |
| + | return; |
| + | |
| + | return w.writeText(n.nodeValue); |
| + | |
| + | case 4: // CDATA |
| + | return w.writeCDATA(n.nodeValue); |
| + | |
| + | case 8: // Comment |
| + | return w.writeComment(n.nodeValue); |
| + | } |
| + | } else if (n.nodeType == 1) |
| + | hc = n.hasChildNodes(); |
| + | |
| + | if (hc && !closed) { |
| + | cn = n.firstChild; |
| + | |
| + | while (cn) { |
| + | t._serializeNode(cn); |
| + | t.elementName = nn; |
| + | cn = cn.nextSibling; |
| + | } |
| + | } |
| + | |
| + | // Write element end |
| + | if (!iv) { |
| + | if (!closed) |
| + | w.writeFullEndElement(); |
| + | else |
| + | w.writeEndElement(); |
| + | } |
| + | }, |
| + | |
| + | _protect : function(o) { |
| + | var t = this; |
| + | |
| + | o.items = o.items || []; |
| + | |
| + | function enc(s) { |
| + | return s.replace(/[\r\n\\]/g, function(c) { |
| + | if (c === '\n') |
| + | return '\\n'; |
| + | else if (c === '\\') |
| + | return '\\\\'; |
| + | |
| + | return '\\r'; |
| + | }); |
| + | }; |
| + | |
| + | function dec(s) { |
| + | return s.replace(/\\[\\rn]/g, function(c) { |
| + | if (c === '\\n') |
| + | return '\n'; |
| + | else if (c === '\\\\') |
| + | return '\\'; |
| + | |
| + | return '\r'; |
| + | }); |
| + | }; |
| + | |
| + | each(o.patterns, function(p) { |
| + | o.content = dec(enc(o.content).replace(p.pattern, function(x, a, b, c) { |
| + | b = dec(b); |
| + | |
| + | if (p.encode) |
| + | b = t._encode(b); |
| + | |
| + | o.items.push(b); |
| + | return a + '<!--mce:' + (o.items.length - 1) + '-->' + c; |
| + | })); |
| + | }); |
| + | |
| + | return o; |
| + | }, |
| + | |
| + | _unprotect : function(h, o) { |
| + | h = h.replace(/\<!--mce:([0-9]+)--\>/g, function(a, b) { |
| + | return o.items[parseInt(b)]; |
| + | }); |
| + | |
| + | o.items = []; |
| + | |
| + | return h; |
| + | }, |
| + | |
| + | _encode : function(h) { |
| + | var t = this, s = t.settings, l; |
| + | |
| + | // Entity encode |
| + | if (s.entity_encoding !== 'raw') { |
| + | if (s.entity_encoding.indexOf('named') != -1) { |
| + | t.setEntities(s.entities); |
| + | l = t.entityLookup; |
| + | |
| + | h = h.replace(/[\u007E-\uFFFF]/g, function(a) { |
| + | var v; |
| + | |
| + | if (v = l[a]) |
| + | a = '&' + v + ';'; |
| + | |
| + | return a; |
| + | }); |
| + | } |
| + | |
| + | if (s.entity_encoding.indexOf('numeric') != -1) { |
| + | h = h.replace(/[\u007E-\uFFFF]/g, function(a) { |
| + | return '&#' + a.charCodeAt(0) + ';'; |
| + | }); |
| + | } |
| + | } |
| + | |
| + | return h; |
| + | }, |
| + | |
| + | _setup : function() { |
| + | var t = this, s = this.settings; |
| + | |
| + | if (t.done) |
| + | return; |
| + | |
| + | t.done = 1; |
| + | |
| + | t.setRules(s.valid_elements); |
| + | t.addRules(s.extended_valid_elements); |
| + | |
| + | if (s.invalid_elements) |
| + | t.invalidElementsRE = new RegExp('^(' + wildcardToRE(s.invalid_elements.replace(/,/g, '|').toLowerCase()) + ')$'); |
| + | |
| + | if (s.attrib_value_filter) |
| + | t.attribValueFilter = s.attribValueFilter; |
| + | }, |
| + | |
| + | _getAttrib : function(n, a, na) { |
| + | var i, v; |
| + | |
| + | na = na || a.name; |
| + | |
| + | if (a.forcedVal && (v = a.forcedVal)) { |
| + | if (v === '{$uid}') |
| + | return this.dom.uniqueId(); |
| + | |
| + | return v; |
| + | } |
| + | |
| + | v = this.dom.getAttrib(n, na); |
| + | |
| + | switch (na) { |
| + | case 'rowspan': |
| + | case 'colspan': |
| + | // Whats the point? Remove usless attribute value |
| + | if (v == '1') |
| + | v = ''; |
| + | |
| + | break; |
| + | } |
| + | |
| + | if (this.attribValueFilter) |
| + | v = this.attribValueFilter(na, v, n); |
| + | |
| + | if (a.validVals) { |
| + | for (i = a.validVals.length - 1; i >= 0; i--) { |
| + | if (v == a.validVals[i]) |
| + | break; |
| + | } |
| + | |
| + | if (i == -1) |
| + | return null; |
| + | } |
| + | |
| + | if (v === '' && typeof(a.defaultVal) != 'undefined') { |
| + | v = a.defaultVal; |
| + | |
| + | if (v === '{$uid}') |
| + | return this.dom.uniqueId(); |
| + | |
| + | return v; |
| + | } else { |
| + | // Remove internal mceItemXX classes when content is extracted from editor |
| + | if (na == 'class' && this.processObj.get) |
| + | v = v.replace(/\s?mceItem\w+\s?/g, ''); |
| + | } |
| + | |
| + | if (v === '') |
| + | return null; |
| + | |
| + | |
| + | return v; |
| + | } |
| + | }); |
| + | })(tinymce); |
| + | |
| + | (function(tinymce) { |
| + | tinymce.dom.ScriptLoader = function(settings) { |
| + | var QUEUED = 0, |
| + | LOADING = 1, |
| + | LOADED = 2, |
| + | states = {}, |
| + | queue = [], |
| + | scriptLoadedCallbacks = {}, |
| + | queueLoadedCallbacks = [], |
| + | loading = 0, |
| + | undefined; |
| + | |
| + | function loadScript(url, callback) { |
| + | var t = this, dom = tinymce.DOM, elm, uri, loc, id; |
| + | |
| + | // Execute callback when script is loaded |
| + | function done() { |
| + | dom.remove(id); |
| + | |
| + | if (elm) |
| + | elm.onreadystatechange = elm.onload = elm = null; |
| + | |
| + | callback(); |
| + | }; |
| + | |
| + | id = dom.uniqueId(); |
| + | |
| + | if (tinymce.isIE6) { |
| + | uri = new tinymce.util.URI(url); |
| + | loc = location; |
| + | |
| + | // If script is from same domain and we |
| + | // use IE 6 then use XHR since it's more reliable |
| + | if (uri.host == loc.hostname && uri.port == loc.port && (uri.protocol + ':') == loc.protocol) { |
| + | tinymce.util.XHR.send({ |
| + | url : tinymce._addVer(uri.getURI()), |
| + | success : function(content) { |
| + | // Create new temp script element |
| + | var script = dom.create('script', { |
| + | type : 'text/javascript' |
| + | }); |
| + | |
| + | // Evaluate script in global scope |
| + | script.text = content; |
| + | document.getElementsByTagName('head')[0].appendChild(script); |
| + | dom.remove(script); |
| + | |
| + | done(); |
| + | } |
| + | }); |
| + | |
| + | return; |
| + | } |
| + | } |
| + | |
| + | // Create new script element |
| + | elm = dom.create('script', { |
| + | id : id, |
| + | type : 'text/javascript', |
| + | src : tinymce._addVer(url) |
| + | }); |
| + | |
| + | // Add onload and readystate listeners |
| + | elm.onload = done; |
| + | elm.onreadystatechange = function() { |
| + | var state = elm.readyState; |
| + | |
| + | // Loaded state is passed on IE 6 however there |
| + | // are known issues with this method but we can't use |
| + | // XHR in a cross domain loading |
| + | if (state == 'complete' || state == 'loaded') |
| + | done(); |
| + | }; |
| + | |
| + | // Most browsers support this feature so we report errors |
| + | // for those at least to help users track their missing plugins etc |
| + | // todo: Removed since it produced error if the document is unloaded by navigating away, re-add it as an option |
| + | /*elm.onerror = function() { |
| + | alert('Failed to load: ' + url); |
| + | };*/ |
| + | |
| + | // Add script to document |
| + | (document.getElementsByTagName('head')[0] || document.body).appendChild(elm); |
| + | }; |
| + | |
| + | this.isDone = function(url) { |
| + | return states[url] == LOADED; |
| + | }; |
| + | |
| + | this.markDone = function(url) { |
| + | states[url] = LOADED; |
| + | }; |
| + | |
| + | this.add = this.load = function(url, callback, scope) { |
| + | var item, state = states[url]; |
| + | |
| + | // Add url to load queue |
| + | if (state == undefined) { |
| + | queue.push(url); |
| + | states[url] = QUEUED; |
| + | } |
| + | |
| + | if (callback) { |
| + | // Store away callback for later execution |
| + | if (!scriptLoadedCallbacks[url]) |
| + | scriptLoadedCallbacks[url] = []; |
| + | |
| + | scriptLoadedCallbacks[url].push({ |
| + | func : callback, |
| + | scope : scope || this |
| + | }); |
| + | } |
| + | }; |
| + | |
| + | this.loadQueue = function(callback, scope) { |
| + | this.loadScripts(queue, callback, scope); |
| + | }; |
| + | |
| + | this.loadScripts = function(scripts, callback, scope) { |
| + | var loadScripts; |
| + | |
| + | function execScriptLoadedCallbacks(url) { |
| + | // Execute URL callback functions |
| + | tinymce.each(scriptLoadedCallbacks[url], function(callback) { |
| + | callback.func.call(callback.scope); |
| + | }); |
| + | |
| + | scriptLoadedCallbacks[url] = undefined; |
| + | }; |
| + | |
| + | queueLoadedCallbacks.push({ |
| + | func : callback, |
| + | scope : scope || this |
| + | }); |
| + | |
| + | loadScripts = function() { |
| + | var loadingScripts = tinymce.grep(scripts); |
| + | |
| + | // Current scripts has been handled |
| + | scripts.length = 0; |
| + | |
| + | // Load scripts that needs to be loaded |
| + | tinymce.each(loadingScripts, function(url) { |
| + | // Script is already loaded then execute script callbacks directly |
| + | if (states[url] == LOADED) { |
| + | execScriptLoadedCallbacks(url); |
| + | return; |
| + | } |
| + | |
| + | // Is script not loading then start loading it |
| + | if (states[url] != LOADING) { |
| + | states[url] = LOADING; |
| + | loading++; |
| + | |
| + | loadScript(url, function() { |
| + | states[url] = LOADED; |
| + | loading--; |
| + | |
| + | execScriptLoadedCallbacks(url); |
| + | |
| + | // Load more scripts if they where added by the recently loaded script |
| + | loadScripts(); |
| + | }); |
| + | } |
| + | }); |
| + | |
| + | // No scripts are currently loading then execute all pending queue loaded callbacks |
| + | if (!loading) { |
| + | tinymce.each(queueLoadedCallbacks, function(callback) { |
| + | callback.func.call(callback.scope); |
| + | }); |
| + | |
| + | queueLoadedCallbacks.length = 0; |
| + | } |
| + | }; |
| + | |
| + | loadScripts(); |
| + | }; |
| + | }; |
| + | |
| + | // Global script loader |
| + | tinymce.ScriptLoader = new tinymce.dom.ScriptLoader(); |
| + | })(tinymce); |
| + | |
| + | tinymce.dom.TreeWalker = function(start_node, root_node) { |
| + | var node = start_node; |
| + | |
| + | function findSibling(node, start_name, sibling_name, shallow) { |
| + | var sibling, parent; |
| + | |
| + | if (node) { |
| + | // Walk into nodes if it has a start |
| + | if (!shallow && node[start_name]) |
| + | return node[start_name]; |
| + | |
| + | // Return the sibling if it has one |
| + | if (node != root_node) { |
| + | sibling = node[sibling_name]; |
| + | if (sibling) |
| + | return sibling; |
| + | |
| + | // Walk up the parents to look for siblings |
| + | for (parent = node.parentNode; parent && parent != root_node; parent = parent.parentNode) { |
| + | sibling = parent[sibling_name]; |
| + | if (sibling) |
| + | return sibling; |
| + | } |
| + | } |
| + | } |
| + | }; |
| + | |
| + | this.current = function() { |
| + | return node; |
| + | }; |
| + | |
| + | this.next = function(shallow) { |
| + | return (node = findSibling(node, 'firstChild', 'nextSibling', shallow)); |
| + | }; |
| + | |
| + | this.prev = function(shallow) { |
| + | return (node = findSibling(node, 'lastChild', 'lastSibling', shallow)); |
| + | }; |
| + | }; |
| + | |
| + | (function() { |
| + | var transitional = {}; |
| + | |
| + | function unpack(lookup, data) { |
| + | var key; |
| + | |
| + | function replace(value) { |
| + | return value.replace(/[A-Z]+/g, function(key) { |
| + | return replace(lookup[key]); |
| + | }); |
| + | }; |
| + | |
| + | // Unpack lookup |
| + | for (key in lookup) { |
| + | if (lookup.hasOwnProperty(key)) |
| + | lookup[key] = replace(lookup[key]); |
| + | } |
| + | |
| + | // Unpack and parse data into object map |
| + | replace(data).replace(/#/g, '#text').replace(/(\w+)\[([^\]]+)\]/g, function(str, name, children) { |
| + | var i, map = {}; |
| + | |
| + | children = children.split(/\|/); |
| + | |
| + | for (i = children.length - 1; i >= 0; i--) |
| + | map[children[i]] = 1; |
| + | |
| + | transitional[name] = map; |
| + | }); |
| + | }; |
| + | |
| + | // This is the XHTML 1.0 transitional elements with it's children packed to reduce it's size |
| + | // we will later include the attributes here and use it as a default for valid elements but it |
| + | // requires us to rewrite the serializer engine |
| + | unpack({ |
| + | Z : '#|H|K|N|O|P', |
| + | Y : '#|X|form|R|Q', |
| + | X : 'p|T|div|U|W|isindex|fieldset|table', |
| + | W : 'pre|hr|blockquote|address|center|noframes', |
| + | U : 'ul|ol|dl|menu|dir', |
| + | ZC : '#|p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q', |
| + | T : 'h1|h2|h3|h4|h5|h6', |
| + | ZB : '#|X|S|Q', |
| + | S : 'R|P', |
| + | ZA : '#|a|G|J|M|O|P', |
| + | R : '#|a|H|K|N|O', |
| + | Q : 'noscript|P', |
| + | P : 'ins|del|script', |
| + | O : 'input|select|textarea|label|button', |
| + | N : 'M|L', |
| + | M : 'em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym', |
| + | L : 'sub|sup', |
| + | K : 'J|I', |
| + | J : 'tt|i|b|u|s|strike', |
| + | I : 'big|small|font|basefont', |
| + | H : 'G|F', |
| + | G : 'br|span|bdo', |
| + | F : 'object|applet|img|map|iframe' |
| + | }, 'script[]' + |
| + | 'style[]' + |
| + | 'object[#|param|X|form|a|H|K|N|O|Q]' + |
| + | 'param[]' + |
| + | 'p[S]' + |
| + | 'a[Z]' + |
| + | 'br[]' + |
| + | 'span[S]' + |
| + | 'bdo[S]' + |
| + | 'applet[#|param|X|form|a|H|K|N|O|Q]' + |
| + | 'h1[S]' + |
| + | 'img[]' + |
| + | 'map[X|form|Q|area]' + |
| + | 'h2[S]' + |
| + | 'iframe[#|X|form|a|H|K|N|O|Q]' + |
| + | 'h3[S]' + |
| + | 'tt[S]' + |
| + | 'i[S]' + |
| + | 'b[S]' + |
| + | 'u[S]' + |
| + | 's[S]' + |
| + | 'strike[S]' + |
| + | 'big[S]' + |
| + | 'small[S]' + |
| + | 'font[S]' + |
| + | 'basefont[]' + |
| + | 'em[S]' + |
| + | 'strong[S]' + |
| + | 'dfn[S]' + |
| + | 'code[S]' + |
| + | 'q[S]' + |
| + | 'samp[S]' + |
| + | 'kbd[S]' + |
| + | 'var[S]' + |
| + | 'cite[S]' + |
| + | 'abbr[S]' + |
| + | 'acronym[S]' + |
| + | 'sub[S]' + |
| + | 'sup[S]' + |
| + | 'input[]' + |
| + | 'select[optgroup|option]' + |
| + | 'optgroup[option]' + |
| + | 'option[]' + |
| + | 'textarea[]' + |
| + | 'label[S]' + |
| + | 'button[#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]' + |
| + | 'h4[S]' + |
| + | 'ins[#|X|form|a|H|K|N|O|Q]' + |
| + | 'h5[S]' + |
| + | 'del[#|X|form|a|H|K|N|O|Q]' + |
| + | 'h6[S]' + |
| + | 'div[#|X|form|a|H|K|N|O|Q]' + |
| + | 'ul[li]' + |
| + | 'li[#|X|form|a|H|K|N|O|Q]' + |
| + | 'ol[li]' + |
| + | 'dl[dt|dd]' + |
| + | 'dt[S]' + |
| + | 'dd[#|X|form|a|H|K|N|O|Q]' + |
| + | 'menu[li]' + |
| + | 'dir[li]' + |
| + | 'pre[ZA]' + |
| + | 'hr[]' + |
| + | 'blockquote[#|X|form|a|H|K|N|O|Q]' + |
| + | 'address[S|p]' + |
| + | 'center[#|X|form|a|H|K|N|O|Q]' + |
| + | 'noframes[#|X|form|a|H|K|N|O|Q]' + |
| + | 'isindex[]' + |
| + | 'fieldset[#|legend|X|form|a|H|K|N|O|Q]' + |
| + | 'legend[S]' + |
| + | 'table[caption|col|colgroup|thead|tfoot|tbody|tr]' + |
| + | 'caption[S]' + |
| + | 'col[]' + |
| + | 'colgroup[col]' + |
| + | 'thead[tr]' + |
| + | 'tr[th|td]' + |
| + | 'th[#|X|form|a|H|K|N|O|Q]' + |
| + | 'form[#|X|a|H|K|N|O|Q]' + |
| + | 'noscript[#|X|form|a|H|K|N|O|Q]' + |
| + | 'td[#|X|form|a|H|K|N|O|Q]' + |
| + | 'tfoot[tr]' + |
| + | 'tbody[tr]' + |
| + | 'area[]' + |
| + | 'base[]' + |
| + | 'body[#|X|form|a|H|K|N|O|Q]' |
| + | ); |
| + | |
| + | tinymce.dom.Schema = function() { |
| + | var t = this, elements = transitional; |
| + | |
| + | t.isValid = function(name, child_name) { |
| + | var element = elements[name]; |
| + | |
| + | return !!(element && (!child_name || element[child_name])); |
| + | }; |
| + | }; |
| + | })(); |
| + | (function(tinymce) { |
| + | tinymce.dom.RangeUtils = function(dom) { |
| + | var INVISIBLE_CHAR = '\uFEFF'; |
| + | |
| + | this.walk = function(rng, callback) { |
| + | var startContainer = rng.startContainer, |
| + | startOffset = rng.startOffset, |
| + | endContainer = rng.endContainer, |
| + | endOffset = rng.endOffset, |
| + | ancestor, startPoint, |
| + | endPoint, node, parent, siblings, nodes; |
| + | |
| + | // Handle table cell selection the table plugin enables |
| + | // you to fake select table cells and perform formatting actions on them |
| + | nodes = dom.select('td.mceSelected,th.mceSelected'); |
| + | if (nodes.length > 0) { |
| + | tinymce.each(nodes, function(node) { |
| + | callback([node]); |
| + | }); |
| + | |
| + | return; |
| + | } |
| + | |
| + | function collectSiblings(node, name, end_node) { |
| + | var siblings = []; |
| + | |
| + | for (; node && node != end_node; node = node[name]) |
| + | siblings.push(node); |
| + | |
| + | return siblings; |
| + | }; |
| + | |
| + | function findEndPoint(node, root) { |
| + | do { |
| + | if (node.parentNode == root) |
| + | return node; |
| + | |
| + | node = node.parentNode; |
| + | } while(node); |
| + | }; |
| + | |
| + | function walkBoundary(start_node, end_node, next) { |
| + | var siblingName = next ? 'nextSibling' : 'previousSibling'; |
| + | |
| + | for (node = start_node, parent = node.parentNode; node && node != end_node; node = parent) { |
| + | parent = node.parentNode; |
| + | siblings = collectSiblings(node == start_node ? node : node[siblingName], siblingName); |
| + | |
| + | if (siblings.length) { |
| + | if (!next) |
| + | siblings.reverse(); |
| + | |
| + | callback(siblings); |
| + | } |
| + | } |
| + | }; |
| + | |
| + | // If index based start position then resolve it |
| + | if (startContainer.nodeType == 1 && startContainer.hasChildNodes()) |
| + | startContainer = startContainer.childNodes[startOffset]; |
| + | |
| + | // If index based end position then resolve it |
| + | if (endContainer.nodeType == 1 && endContainer.hasChildNodes()) |
| + | endContainer = endContainer.childNodes[Math.min(startOffset == endOffset ? endOffset : endOffset - 1, endContainer.childNodes.length - 1)]; |
| + | |
| + | // Find common ancestor and end points |
| + | ancestor = dom.findCommonAncestor(startContainer, endContainer); |
| + | |
| + | // Same container |
| + | if (startContainer == endContainer) |
| + | return callback([startContainer]); |
| + | |
| + | // Process left side |
| + | for (node = startContainer; node; node = node.parentNode) { |
| + | if (node == endContainer) |
| + | return walkBoundary(startContainer, ancestor, true); |
| + | |
| + | if (node == ancestor) |
| + | break; |
| + | } |
| + | |
| + | // Process right side |
| + | for (node = endContainer; node; node = node.parentNode) { |
| + | if (node == startContainer) |
| + | return walkBoundary(endContainer, ancestor); |
| + | |
| + | if (node == ancestor) |
| + | break; |
| + | } |
| + | |
| + | // Find start/end point |
| + | startPoint = findEndPoint(startContainer, ancestor) || startContainer; |
| + | endPoint = findEndPoint(endContainer, ancestor) || endContainer; |
| + | |
| + | // Walk left leaf |
| + | walkBoundary(startContainer, startPoint, true); |
| + | |
| + | // Walk the middle from start to end point |
| + | siblings = collectSiblings( |
| + | startPoint == startContainer ? startPoint : startPoint.nextSibling, |
| + | 'nextSibling', |
| + | endPoint == endContainer ? endPoint.nextSibling : endPoint |
| + | ); |
| + | |
| + | if (siblings.length) |
| + | callback(siblings); |
| + | |
| + | // Walk right leaf |
| + | walkBoundary(endContainer, endPoint); |
| + | }; |
| + | |
| + | /* this.split = function(rng) { |
| + | var startContainer = rng.startContainer, |
| + | startOffset = rng.startOffset, |
| + | endContainer = rng.endContainer, |
| + | endOffset = rng.endOffset; |
| + | |
| + | function splitText(node, offset) { |
| + | if (offset == node.nodeValue.length) |
| + | node.appendData(INVISIBLE_CHAR); |
| + | |
| + | node = node.splitText(offset); |
| + | |
| + | if (node.nodeValue === INVISIBLE_CHAR) |
| + | node.nodeValue = ''; |
| + | |
| + | return node; |
| + | }; |
| + | |
| + | // Handle single text node |
| + | if (startContainer == endContainer) { |
| + | if (startContainer.nodeType == 3) { |
| + | if (startOffset != 0) |
| + | startContainer = endContainer = splitText(startContainer, startOffset); |
| + | |
| + | if (endOffset - startOffset != startContainer.nodeValue.length) |
| + | splitText(startContainer, endOffset - startOffset); |
| + | } |
| + | } else { |
| + | // Split startContainer text node if needed |
| + | if (startContainer.nodeType == 3 && startOffset != 0) { |
| + | startContainer = splitText(startContainer, startOffset); |
| + | startOffset = 0; |
| + | } |
| + | |
| + | // Split endContainer text node if needed |
| + | if (endContainer.nodeType == 3 && endOffset != endContainer.nodeValue.length) { |
| + | endContainer = splitText(endContainer, endOffset).previousSibling; |
| + | endOffset = endContainer.nodeValue.length; |
| + | } |
| + | } |
| + | |
| + | return { |
| + | startContainer : startContainer, |
| + | startOffset : startOffset, |
| + | endContainer : endContainer, |
| + | endOffset : endOffset |
| + | }; |
| + | }; |
| + | */ |
| + | }; |
| + | |
| + | tinymce.dom.RangeUtils.compareRanges = function(rng1, rng2) { |
| + | if (rng1 && rng2) { |
| + | // Compare native IE ranges |
| + | if (rng1.item || rng1.duplicate) { |
| + | // Both are control ranges and the selected element matches |
| + | if (rng1.item && rng2.item && rng1.item(0) === rng2.item(0)) |
| + | return true; |
| + | |
| + | // Both are text ranges and the range matches |
| + | if (rng1.isEqual && rng2.isEqual && rng2.isEqual(rng1)) |
| + | return true; |
| + | } else { |
| + | // Compare w3c ranges |
| + | return rng1.startContainer == rng2.startContainer && rng1.startOffset == rng2.startOffset; |
| + | } |
| + | } |
| + | |
| + | return false; |
| + | }; |
| + | })(tinymce); |
| + | |
| + | (function(tinymce) { |
| + | // Shorten class names |
| + | var DOM = tinymce.DOM, is = tinymce.is; |
| + | |
| + | tinymce.create('tinymce.ui.Control', { |
| + | Control : function(id, s) { |
| + | this.id = id; |
| + | this.settings = s = s || {}; |
| + | this.rendered = false; |
| + | this.onRender = new tinymce.util.Dispatcher(this); |
| + | this.classPrefix = ''; |
| + | this.scope = s.scope || this; |
| + | this.disabled = 0; |
| + | this.active = 0; |
| + | }, |
| + | |
| + | setDisabled : function(s) { |
| + | var e; |
| + | |
| + | if (s != this.disabled) { |
| + | e = DOM.get(this.id); |
| + | |
| + | // Add accessibility title for unavailable actions |
| + | if (e && this.settings.unavailable_prefix) { |
| + | if (s) { |
| + | this.prevTitle = e.title; |
| + | e.title = this.settings.unavailable_prefix + ": " + e.title; |
| + | } else |
| + | e.title = this.prevTitle; |
| + | } |
| + | |
| + | this.setState('Disabled', s); |
| + | this.setState('Enabled', !s); |
| + | this.disabled = s; |
| + | } |
| + | }, |
| + | |
| + | isDisabled : function() { |
| + | return this.disabled; |
| + | }, |
| + | |
| + | setActive : function(s) { |
| + | if (s != this.active) { |
| + | this.setState('Active', s); |
| + | this.active = s; |
| + | } |
| + | }, |
| + | |
| + | isActive : function() { |
| + | return this.active; |
| + | }, |
| + | |
| + | setState : function(c, s) { |
| + | var n = DOM.get(this.id); |
| + | |
| + | c = this.classPrefix + c; |
| + | |
| + | if (s) |
| + | DOM.addClass(n, c); |
| + | else |
| + | DOM.removeClass(n, c); |
| + | }, |
| + | |
| + | isRendered : function() { |
| + | return this.rendered; |
| + | }, |
| + | |
| + | renderHTML : function() { |
| + | }, |
| + | |
| + | renderTo : function(n) { |
| + | DOM.setHTML(n, this.renderHTML()); |
| + | }, |
| + | |
| + | postRender : function() { |
| + | var t = this, b; |
| + | |
| + | // Set pending states |
| + | if (is(t.disabled)) { |
| + | b = t.disabled; |
| + | t.disabled = -1; |
| + | t.setDisabled(b); |
| + | } |
| + | |
| + | if (is(t.active)) { |
| + | b = t.active; |
| + | t.active = -1; |
| + | t.setActive(b); |
| + | } |
| + | }, |
| + | |
| + | remove : function() { |
| + | DOM.remove(this.id); |
| + | this.destroy(); |
| + | }, |
| + | |
| + | destroy : function() { |
| + | tinymce.dom.Event.clear(this.id); |
| + | } |
| + | }); |
| + | })(tinymce); |
| + | tinymce.create('tinymce.ui.Container:tinymce.ui.Control', { |
| + | Container : function(id, s) { |
| + | this.parent(id, s); |
| + | |
| + | this.controls = []; |
| + | |
| + | this.lookup = {}; |
| + | }, |
| + | |
| + | add : function(c) { |
| + | this.lookup[c.id] = c; |
| + | this.controls.push(c); |
| + | |
| + | return c; |
| + | }, |
| + | |
| + | get : function(n) { |
| + | return this.lookup[n]; |
| + | } |
| + | }); |
| + | |
| + | |
| + | tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', { |
| + | Separator : function(id, s) { |
| + | this.parent(id, s); |
| + | this.classPrefix = 'mceSeparator'; |
| + | }, |
| + | |
| + | renderHTML : function() { |
| + | return tinymce.DOM.createHTML('span', {'class' : this.classPrefix}); |
| + | } |
| + | }); |
| + | |
| + | (function(tinymce) { |
| + | var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk = tinymce.walk; |
| + | |
| + | tinymce.create('tinymce.ui.MenuItem:tinymce.ui.Control', { |
| + | MenuItem : function(id, s) { |
| + | this.parent(id, s); |
| + | this.classPrefix = 'mceMenuItem'; |
| + | }, |
| + | |
| + | setSelected : function(s) { |
| + | this.setState('Selected', s); |
| + | this.selected = s; |
| + | }, |
| + | |
| + | isSelected : function() { |
| + | return this.selected; |
| + | }, |
| + | |
| + | postRender : function() { |
| + | var t = this; |
| + | |
| + | t.parent(); |
| + | |
| + | // Set pending state |
| + | if (is(t.selected)) |
| + | t.setSelected(t.selected); |
| + | } |
| + | }); |
| + | })(tinymce); |
| + | |
| + | (function(tinymce) { |
| + | var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk = tinymce.walk; |
| + | |
| + | tinymce.create('tinymce.ui.Menu:tinymce.ui.MenuItem', { |
| + | Menu : function(id, s) { |
| + | var t = this; |
| + | |
| + | t.parent(id, s); |
| + | t.items = {}; |
| + | t.collapsed = false; |
| + | t.menuCount = 0; |
| + | t.onAddItem = new tinymce.util.Dispatcher(this); |
| + | }, |
| + | |
| + | expand : function(d) { |
| + | var t = this; |
| + | |
| + | if (d) { |
| + | walk(t, function(o) { |
| + | if (o.expand) |
| + | o.expand(); |
| + | }, 'items', t); |
| + | } |
| + | |
| + | t.collapsed = false; |
| + | }, |
| + | |
| + | collapse : function(d) { |
| + | var t = this; |
| + | |
| + | if (d) { |
| + | walk(t, function(o) { |
| + | if (o.collapse) |
| + | o.collapse(); |
| + | }, 'items', t); |
| + | } |
| + | |
| + | t.collapsed = true; |
| + | }, |
| + | |
| + | isCollapsed : function() { |
| + | return this.collapsed; |
| + | }, |
| + | |
| + | add : function(o) { |
| + | if (!o.settings) |
| + | o = new tinymce.ui.MenuItem(o.id || DOM.uniqueId(), o); |
| + | |
| + | this.onAddItem.dispatch(this, o); |
| + | |
| + | return this.items[o.id] = o; |
| + | }, |
| + | |
| + | addSeparator : function() { |
| + | return this.add({separator : true}); |
| + | }, |
| + | |
| + | addMenu : function(o) { |
| + | if (!o.collapse) |
| + | o = this.createMenu(o); |
| + | |
| + | this.menuCount++; |
| + | |
| + | return this.add(o); |
| + | }, |
| + | |
| + | hasMenus : function() { |
| + | return this.menuCount !== 0; |
| + | }, |
| + | |
| + | remove : function(o) { |
| + | delete this.items[o.id]; |
| + | }, |
| + | |
| + | removeAll : function() { |
| + | var t = this; |
| + | |
| + | walk(t, function(o) { |
| + | if (o.removeAll) |
| + | o.removeAll(); |
| + | else |
| + | o.remove(); |
| + | |
| + | o.destroy(); |
| + | }, 'items', t); |
| + | |
| + | t.items = {}; |
| + | }, |
| + | |
| + | createMenu : function(o) { |
| + | var m = new tinymce.ui.Menu(o.id || DOM.uniqueId(), o); |
| + | |
| + | m.onAddItem.add(this.onAddItem.dispatch, this.onAddItem); |
| + | |
| + | return m; |
| + | } |
| + | }); |
| + | })(tinymce); |
| + | (function(tinymce) { |
| + | var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, Event = tinymce.dom.Event, Element = tinymce.dom.Element; |
| + | |
| + | tinymce.create('tinymce.ui.DropMenu:tinymce.ui.Menu', { |
| + | DropMenu : function(id, s) { |
| + | s = s || {}; |
| + | s.container = s.container || DOM.doc.body; |
| + | s.offset_x = s.offset_x || 0; |
| + | s.offset_y = s.offset_y || 0; |
| + | s.vp_offset_x = s.vp_offset_x || 0; |
| + | s.vp_offset_y = s.vp_offset_y || 0; |
| + | |
| + | if (is(s.icons) && !s.icons) |
| + | s['class'] += ' mceNoIcons'; |
| + | |
| + | this.parent(id, s); |
| + | this.onShowMenu = new tinymce.util.Dispatcher(this); |
| + | this.onHideMenu = new tinymce.util.Dispatcher(this); |
| + | this.classPrefix = 'mceMenu'; |
| + | }, |
| + | |
| + | createMenu : function(s) { |
| + | var t = this, cs = t.settings, m; |
| + | |
| + | s.container = s.container || cs.container; |
| + | s.parent = t; |
| + | s.constrain = s.constrain || cs.constrain; |
| + | s['class'] = s['class'] || cs['class']; |
| + | s.vp_offset_x = s.vp_offset_x || cs.vp_offset_x; |
| + | s.vp_offset_y = s.vp_offset_y || cs.vp_offset_y; |
| + | m = new tinymce.ui.DropMenu(s.id || DOM.uniqueId(), s); |
| + | |
| + | m.onAddItem.add(t.onAddItem.dispatch, t.onAddItem); |
| + | |
| + | return m; |
| + | }, |
| + | |
| + | update : function() { |
| + | var t = this, s = t.settings, tb = DOM.get('menu_' + t.id + '_tbl'), co = DOM.get('menu_' + t.id + '_co'), tw, th; |
| + | |
| + | tw = s.max_width ? Math.min(tb.clientWidth, s.max_width) : tb.clientWidth; |
| + | th = s.max_height ? Math.min(tb.clientHeight, s.max_height) : tb.clientHeight; |
| + | |
| + | if (!DOM.boxModel) |
| + | t.element.setStyles({width : tw + 2, height : th + 2}); |
| + | else |
| + | t.element.setStyles({width : tw, height : th}); |
| + | |
| + | if (s.max_width) |
| + | DOM.setStyle(co, 'width', tw); |
| + | |
| + | if (s.max_height) { |
| + | DOM.setStyle(co, 'height', th); |
| + | |
| + | if (tb.clientHeight < s.max_height) |
| + | DOM.setStyle(co, 'overflow', 'hidden'); |
| + | } |
| + | }, |
| + | |
| + | showMenu : function(x, y, px) { |
| + | var t = this, s = t.settings, co, vp = DOM.getViewPort(), w, h, mx, my, ot = 2, dm, tb, cp = t.classPrefix; |
| + | |
| + | t.collapse(1); |
| + | |
| + | if (t.isMenuVisible) |
| + | return; |
| + | |
| + | if (!t.rendered) { |
| + | co = DOM.add(t.settings.container, t.renderNode()); |
| + | |
| + | each(t.items, function(o) { |
| + | o.postRender(); |
| + | }); |
| + | |
| + | t.element = new Element('menu_' + t.id, {blocker : 1, container : s.container}); |
| + | } else |
| + | co = DOM.get('menu_' + t.id); |
| + | |
| + | // Move layer out of sight unless it's Opera since it scrolls to top of page due to an bug |
| + | if (!tinymce.isOpera) |
| + | DOM.setStyles(co, {left : -0xFFFF , top : -0xFFFF}); |
| + | |
| + | DOM.show(co); |
| + | t.update(); |
| + | |
| + | x += s.offset_x || 0; |
| + | y += s.offset_y || 0; |
| + | vp.w -= 4; |
| + | vp.h -= 4; |
| + | |
| + | // Move inside viewport if not submenu |
| + | if (s.constrain) { |
| + | w = co.clientWidth - ot; |
| + | h = co.clientHeight - ot; |
| + | mx = vp.x + vp.w; |
| + | my = vp.y + vp.h; |
| + | |
| + | if ((x + s.vp_offset_x + w) > mx) |
| + | x = px ? px - w : Math.max(0, (mx - s.vp_offset_x) - w); |
| + | |
| + | if ((y + s.vp_offset_y + h) > my) |
| + | y = Math.max(0, (my - s.vp_offset_y) - h); |
| + | } |
| + | |
| + | DOM.setStyles(co, {left : x , top : y}); |
| + | t.element.update(); |
| + | |
| + | t.isMenuVisible = 1; |
| + | t.mouseClickFunc = Event.add(co, 'click', function(e) { |
| + | var m; |
| + | |
| + | e = e.target; |
| + | |
| + | if (e && (e = DOM.getParent(e, 'tr')) && !DOM.hasClass(e, cp + 'ItemSub')) { |
| + | m = t.items[e.id]; |
| + | |
| + | if (m.isDisabled()) |
| + | return; |
| + | |
| + | dm = t; |
| + | |
| + | while (dm) { |
| + | if (dm.hideMenu) |
| + | dm.hideMenu(); |
| + | |
| + | dm = dm.settings.parent; |
| + | } |
| + | |
| + | if (m.settings.onclick) |
| + | m.settings.onclick(e); |
| + | |
| + | return Event.cancel(e); // Cancel to fix onbeforeunload problem |
| + | } |
| + | }); |
| + | |
| + | if (t.hasMenus()) { |
| + | t.mouseOverFunc = Event.add(co, 'mouseover', function(e) { |
| + | var m, r, mi; |
| + | |
| + | e = e.target; |
| + | if (e && (e = DOM.getParent(e, 'tr'))) { |
| + | m = t.items[e.id]; |
| + | |
| + | if (t.lastMenu) |
| + | t.lastMenu.collapse(1); |
| + | |
| + | if (m.isDisabled()) |
| + | return; |
| + | |
| + | if (e && DOM.hasClass(e, cp + 'ItemSub')) { |
| + | //p = DOM.getPos(s.container); |
| + | r = DOM.getRect(e); |
| + | m.showMenu((r.x + r.w - ot), r.y - ot, r.x); |
| + | t.lastMenu = m; |
| + | DOM.addClass(DOM.get(m.id).firstChild, cp + 'ItemActive'); |
| + | } |
| + | } |
| + | }); |
| + | } |
| + | |
| + | t.onShowMenu.dispatch(t); |
| + | |
| + | if (s.keyboard_focus) { |
| + | Event.add(co, 'keydown', t._keyHandler, t); |
| + | DOM.select('a', 'menu_' + t.id)[0].focus(); // Select first link |
| + | t._focusIdx = 0; |
| + | } |
| + | }, |
| + | |
| + | hideMenu : function(c) { |
| + | var t = this, co = DOM.get('menu_' + t.id), e; |
| + | |
| + | if (!t.isMenuVisible) |
| + | return; |
| + | |
| + | Event.remove(co, 'mouseover', t.mouseOverFunc); |
| + | Event.remove(co, 'click', t.mouseClickFunc); |
| + | Event.remove(co, 'keydown', t._keyHandler); |
| + | DOM.hide(co); |
| + | t.isMenuVisible = 0; |
| + | |
| + | if (!c) |
| + | t.collapse(1); |
| + | |
| + | if (t.element) |
| + | t.element.hide(); |
| + | |
| + | if (e = DOM.get(t.id)) |
| + | DOM.removeClass(e.firstChild, t.classPrefix + 'ItemActive'); |
| + | |
| + | t.onHideMenu.dispatch(t); |
| + | }, |
| + | |
| + | add : function(o) { |
| + | var t = this, co; |
| + | |
| + | o = t.parent(o); |
| + | |
| + | if (t.isRendered && (co = DOM.get('menu_' + t.id))) |
| + | t._add(DOM.select('tbody', co)[0], o); |
| + | |
| + | return o; |
| + | }, |
| + | |
| + | collapse : function(d) { |
| + | this.parent(d); |
| + | this.hideMenu(1); |
| + | }, |
| + | |
| + | remove : function(o) { |
| + | DOM.remove(o.id); |
| + | this.destroy(); |
| + | |
| + | return this.parent(o); |
| + | }, |
| + | |
| + | destroy : function() { |
| + | var t = this, co = DOM.get('menu_' + t.id); |
| + | |
| + | Event.remove(co, 'mouseover', t.mouseOverFunc); |
| + | Event.remove(co, 'click', t.mouseClickFunc); |
| + | |
| + | if (t.element) |
| + | t.element.remove(); |
| + | |
| + | DOM.remove(co); |
| + | }, |
| + | |
| + | renderNode : function() { |
| + | var t = this, s = t.settings, n, tb, co, w; |
| + | |
| + | w = DOM.create('div', {id : 'menu_' + t.id, 'class' : s['class'], 'style' : 'position:absolute;left:0;top:0;z-index:200000'}); |
| + | co = DOM.add(w, 'div', {id : 'menu_' + t.id + '_co', 'class' : t.classPrefix + (s['class'] ? ' ' + s['class'] : '')}); |
| + | t.element = new Element('menu_' + t.id, {blocker : 1, container : s.container}); |
| + | |
| + | if (s.menu_line) |
| + | DOM.add(co, 'span', {'class' : t.classPrefix + 'Line'}); |
| + | |
| + | // n = DOM.add(co, 'div', {id : 'menu_' + t.id + '_co', 'class' : 'mceMenuContainer'}); |
| + | n = DOM.add(co, 'table', {id : 'menu_' + t.id + '_tbl', border : 0, cellPadding : 0, cellSpacing : 0}); |
| + | tb = DOM.add(n, 'tbody'); |
| + | |
| + | each(t.items, function(o) { |
| + | t._add(tb, o); |
| + | }); |
| + | |
| + | t.rendered = true; |
| + | |
| + | return w; |
| + | }, |
| + | |
| + | // Internal functions |
| + | |
| + | _keyHandler : function(e) { |
| + | var t = this, kc = e.keyCode; |
| + | |
| + | function focus(d) { |
| + | var i = t._focusIdx + d, e = DOM.select('a', 'menu_' + t.id)[i]; |
| + | |
| + | if (e) { |
| + | t._focusIdx = i; |
| + | e.focus(); |
| + | } |
| + | }; |
| + | |
| + | switch (kc) { |
| + | case 38: |
| + | focus(-1); // Select first link |
| + | return; |
| + | |
| + | case 40: |
| + | focus(1); |
| + | return; |
| + | |
| + | case 13: |
| + | return; |
| + | |
| + | case 27: |
| + | return this.hideMenu(); |
| + | } |
| + | }, |
| + | |
| + | _add : function(tb, o) { |
| + | var n, s = o.settings, a, ro, it, cp = this.classPrefix, ic; |
| + | |
| + | if (s.separator) { |
| + | ro = DOM.add(tb, 'tr', {id : o.id, 'class' : cp + 'ItemSeparator'}); |
| + | DOM.add(ro, 'td', {'class' : cp + 'ItemSeparator'}); |
| + | |
| + | if (n = ro.previousSibling) |
| + | DOM.addClass(n, 'mceLast'); |
| + | |
| + | return; |
| + | } |
| + | |
| + | n = ro = DOM.add(tb, 'tr', {id : o.id, 'class' : cp + 'Item ' + cp + 'ItemEnabled'}); |
| + | n = it = DOM.add(n, 'td'); |
| + | n = a = DOM.add(n, 'a', {href : 'javascript:;', onclick : "return false;", onmousedown : 'return false;'}); |
| + | |
| + | DOM.addClass(it, s['class']); |
| + | // n = DOM.add(n, 'span', {'class' : 'item'}); |
| + | |
| + | ic = DOM.add(n, 'span', {'class' : 'mceIcon' + (s.icon ? ' mce_' + s.icon : '')}); |
| + | |
| + | if (s.icon_src) |
| + | DOM.add(ic, 'img', {src : s.icon_src}); |
| + | |
| + | n = DOM.add(n, s.element || 'span', {'class' : 'mceText', title : o.settings.title}, o.settings.title); |
| + | |
| + | if (o.settings.style) |
| + | DOM.setAttrib(n, 'style', o.settings.style); |
| + | |
| + | if (tb.childNodes.length == 1) |
| + | DOM.addClass(ro, 'mceFirst'); |
| + | |
| + | if ((n = ro.previousSibling) && DOM.hasClass(n, cp + 'ItemSeparator')) |
| + | DOM.addClass(ro, 'mceFirst'); |
| + | |
| + | if (o.collapse) |
| + | DOM.addClass(ro, cp + 'ItemSub'); |
| + | |
| + | if (n = ro.previousSibling) |
| + | DOM.removeClass(n, 'mceLast'); |
| + | |
| + | DOM.addClass(ro, 'mceLast'); |
| + | } |
| + | }); |
| + | })(tinymce); |
| + | (function(tinymce) { |
| + | var DOM = tinymce.DOM; |
| + | |
| + | tinymce.create('tinymce.ui.Button:tinymce.ui.Control', { |
| + | Button : function(id, s) { |
| + | this.parent(id, s); |
| + | this.classPrefix = 'mceButton'; |
| + | }, |
| + | |
| + | renderHTML : function() { |
| + | var cp = this.classPrefix, s = this.settings, h, l; |
| + | |
| + | l = DOM.encode(s.label || ''); |
| + | h = '<a id="' + this.id + '" href="javascript:;" class="' + cp + ' ' + cp + 'Enabled ' + s['class'] + (l ? ' ' + cp + 'Labeled' : '') +'" onmousedown="return false;" onclick="return false;" title="' + DOM.encode(s.title) + '">'; |
| + | |
| + | if (s.image) |
| + | h += '<img class="mceIcon" src="' + s.image + '" />' + l + '</a>'; |
| + | else |
| + | h += '<span class="mceIcon ' + s['class'] + '"></span>' + (l ? '<span class="' + cp + 'Label">' + l + '</span>' : '') + '</a>'; |
| + | |
| + | return h; |
| + | }, |
| + | |
| + | postRender : function() { |
| + | var t = this, s = t.settings; |
| + | |
| + | tinymce.dom.Event.add(t.id, 'click', function(e) { |
| + | if (!t.isDisabled()) |
| + | return s.onclick.call(s.scope, e); |
| + | }); |
| + | } |
| + | }); |
| + | })(tinymce); |
| + | |
| + | (function(tinymce) { |
| + | var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher; |
| + | |
| + | tinymce.create('tinymce.ui.ListBox:tinymce.ui.Control', { |
| + | ListBox : function(id, s) { |
| + | var t = this; |
| + | |
| + | t.parent(id, s); |
| + | |
| + | t.items = []; |
| + | |
| + | t.onChange = new Dispatcher(t); |
| + | |
| + | t.onPostRender = new Dispatcher(t); |
| + | |
| + | t.onAdd = new Dispatcher(t); |
| + | |
| + | t.onRenderMenu = new tinymce.util.Dispatcher(this); |
| + | |
| + | t.classPrefix = 'mceListBox'; |
| + | }, |
| + | |
| + | select : function(va) { |
| + | var t = this, fv, f; |
| + | |
| + | if (va == undefined) |
| + | return t.selectByIndex(-1); |
| + | |
| + | // Is string or number make function selector |
| + | if (va && va.call) |
| + | f = va; |
| + | else { |
| + | f = function(v) { |
| + | return v == va; |
| + | }; |
| + | } |
| + | |
| + | // Do we need to do something? |
| + | if (va != t.selectedValue) { |
| + | // Find item |
| + | each(t.items, function(o, i) { |
| + | if (f(o.value)) { |
| + | fv = 1; |
| + | t.selectByIndex(i); |
| + | return false; |
| + | } |
| + | }); |
| + | |
| + | if (!fv) |
| + | t.selectByIndex(-1); |
| + | } |
| + | }, |
| + | |
| + | selectByIndex : function(idx) { |
| + | var t = this, e, o; |
| + | |
| + | if (idx != t.selectedIndex) { |
| + | e = DOM.get(t.id + '_text'); |
| + | o = t.items[idx]; |
| + | |
| + | if (o) { |
| + | t.selectedValue = o.value; |
| + | t.selectedIndex = idx; |
| + | DOM.setHTML(e, DOM.encode(o.title)); |
| + | DOM.removeClass(e, 'mceTitle'); |
| + | } else { |
| + | DOM.setHTML(e, DOM.encode(t.settings.title)); |
| + | DOM.addClass(e, 'mceTitle'); |
| + | t.selectedValue = t.selectedIndex = null; |
| + | } |
| + | |
| + | e = 0; |
| + | } |
| + | }, |
| + | |
| + | add : function(n, v, o) { |
| + | var t = this; |
| + | |
| + | o = o || {}; |
| + | o = tinymce.extend(o, { |
| + | title : n, |
| + | value : v |
| + | }); |
| + | |
| + | t.items.push(o); |
| + | t.onAdd.dispatch(t, o); |
| + | }, |
| + | |
| + | getLength : function() { |
| + | return this.items.length; |
| + | }, |
| + | |
| + | renderHTML : function() { |
| + | var h = '', t = this, s = t.settings, cp = t.classPrefix; |
| + | |
| + | h = '<table id="' + t.id + '" cellpadding="0" cellspacing="0" class="' + cp + ' ' + cp + 'Enabled' + (s['class'] ? (' ' + s['class']) : '') + '"><tbody><tr>'; |
| + | h += '<td>' + DOM.createHTML('a', {id : t.id + '_text', href : 'javascript:;', 'class' : 'mceText', onclick : "return false;", onmousedown : 'return false;'}, DOM.encode(t.settings.title)) + '</td>'; |
| + | h += '<td>' + DOM.createHTML('a', {id : t.id + '_open', tabindex : -1, href : 'javascript:;', 'class' : 'mceOpen', onclick : "return false;", onmousedown : 'return false;'}, '<span></span>') + '</td>'; |
| + | h += '</tr></tbody></table>'; |
| + | |
| + | return h; |
| + | }, |
| + | |
| + | showMenu : function() { |
| + | var t = this, p1, p2, e = DOM.get(this.id), m; |
| + | |
| + | if (t.isDisabled() || t.items.length == 0) |
| + | return; |
| + | |
| + | if (t.menu && t.menu.isMenuVisible) |
| + | return t.hideMenu(); |
| + | |
| + | if (!t.isMenuRendered) { |
| + | t.renderMenu(); |
| + | t.isMenuRendered = true; |
| + | } |
| + | |
| + | p1 = DOM.getPos(this.settings.menu_container); |
| + | p2 = DOM.getPos(e); |
| + | |
| + | m = t.menu; |
| + | m.settings.offset_x = p2.x; |
| + | m.settings.offset_y = p2.y; |
| + | m.settings.keyboard_focus = !tinymce.isOpera; // Opera is buggy when it comes to auto focus |
| + | |
| + | // Select in menu |
| + | if (t.oldID) |
| + | m.items[t.oldID].setSelected(0); |
| + | |
| + | each(t.items, function(o) { |
| + | if (o.value === t.selectedValue) { |
| + | m.items[o.id].setSelected(1); |
| + | t.oldID = o.id; |
| + | } |
| + | }); |
| + | |
| + | m.showMenu(0, e.clientHeight); |
| + | |
| + | Event.add(DOM.doc, 'mousedown', t.hideMenu, t); |
| + | DOM.addClass(t.id, t.classPrefix + 'Selected'); |
| + | |
| + | //DOM.get(t.id + '_text').focus(); |
| + | }, |
| + | |
| + | hideMenu : function(e) { |
| + | var t = this; |
| + | |
| + | if (t.menu && t.menu.isMenuVisible) { |
| + | // Prevent double toogles by canceling the mouse click event to the button |
| + | if (e && e.type == "mousedown" && (e.target.id == t.id + '_text' || e.target.id == t.id + '_open')) |
| + | return; |
| + | |
| + | if (!e || !DOM.getParent(e.target, '.mceMenu')) { |
| + | DOM.removeClass(t.id, t.classPrefix + 'Selected'); |
| + | Event.remove(DOM.doc, 'mousedown', t.hideMenu, t); |
| + | t.menu.hideMenu(); |
| + | } |
| + | } |
| + | }, |
| + | |
| + | renderMenu : function() { |
| + | var t = this, m; |
| + | |
| + | m = t.settings.control_manager.createDropMenu(t.id + '_menu', { |
| + | menu_line : 1, |
| + | 'class' : t.classPrefix + 'Menu mceNoIcons', |
| + | max_width : 150, |
| + | max_height : 150 |
| + | }); |
| + | |
| + | m.onHideMenu.add(t.hideMenu, t); |
| + | |
| + | m.add({ |
| + | title : t.settings.title, |
| + | 'class' : 'mceMenuItemTitle', |
| + | onclick : function() { |
| + | if (t.settings.onselect('') !== false) |
| + | t.select(''); // Must be runned after |
| + | } |
| + | }); |
| + | |
| + | each(t.items, function(o) { |
| + | // No value then treat it as a title |
| + | if (o.value === undefined) { |
| + | m.add({ |
| + | title : o.title, |
| + | 'class' : 'mceMenuItemTitle', |
| + | onclick : function() { |
| + | if (t.settings.onselect('') !== false) |
| + | t.select(''); // Must be runned after |
| + | } |
| + | }); |
| + | } else { |
| + | o.id = DOM.uniqueId(); |
| + | o.onclick = function() { |
| + | if (t.settings.onselect(o.value) !== false) |
| + | t.select(o.value); // Must be runned after |
| + | }; |
| + | |
| + | m.add(o); |
| + | } |
| + | }); |
| + | |
| + | t.onRenderMenu.dispatch(t, m); |
| + | t.menu = m; |
| + | }, |
| + | |
| + | postRender : function() { |
| + | var t = this, cp = t.classPrefix; |
| + | |
| + | Event.add(t.id, 'click', t.showMenu, t); |
| + | Event.add(t.id + '_text', 'focus', function() { |
| + | if (!t._focused) { |
| + | t.keyDownHandler = Event.add(t.id + '_text', 'keydown', function(e) { |
| + | var idx = -1, v, kc = e.keyCode; |
| + | |
| + | // Find current index |
| + | each(t.items, function(v, i) { |
| + | if (t.selectedValue == v.value) |
| + | idx = i; |
| + | }); |
| + | |
| + | // Move up/down |
| + | if (kc == 38) |
| + | v = t.items[idx - 1]; |
| + | else if (kc == 40) |
| + | v = t.items[idx + 1]; |
| + | else if (kc == 13) { |
| + | // Fake select on enter |
| + | v = t.selectedValue; |
| + | t.selectedValue = null; // Needs to be null to fake change |
| + | t.settings.onselect(v); |
| + | return Event.cancel(e); |
| + | } |
| + | |
| + | if (v) { |
| + | t.hideMenu(); |
| + | t.select(v.value); |
| + | } |
| + | }); |
| + | } |
| + | |
| + | t._focused = 1; |
| + | }); |
| + | Event.add(t.id + '_text', 'blur', function() {Event.remove(t.id + '_text', 'keydown', t.keyDownHandler); t._focused = 0;}); |
| + | |
| + | // Old IE doesn't have hover on all elements |
| + | if (tinymce.isIE6 || !DOM.boxModel) { |
| + | Event.add(t.id, 'mouseover', function() { |
| + | if (!DOM.hasClass(t.id, cp + 'Disabled')) |
| + | DOM.addClass(t.id, cp + 'Hover'); |
| + | }); |
| + | |
| + | Event.add(t.id, 'mouseout', function() { |
| + | if (!DOM.hasClass(t.id, cp + 'Disabled')) |
| + | DOM.removeClass(t.id, cp + 'Hover'); |
| + | }); |
| + | } |
| + | |
| + | t.onPostRender.dispatch(t, DOM.get(t.id)); |
| + | }, |
| + | |
| + | destroy : function() { |
| + | this.parent(); |
| + | |
| + | Event.clear(this.id + '_text'); |
| + | Event.clear(this.id + '_open'); |
| + | } |
| + | }); |
| + | })(tinymce); |
| + | (function(tinymce) { |
| + | var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher; |
| + | |
| + | tinymce.create('tinymce.ui.NativeListBox:tinymce.ui.ListBox', { |
| + | NativeListBox : function(id, s) { |
| + | this.parent(id, s); |
| + | this.classPrefix = 'mceNativeListBox'; |
| + | }, |
| + | |
| + | setDisabled : function(s) { |
| + | DOM.get(this.id).disabled = s; |
| + | }, |
| + | |
| + | isDisabled : function() { |
| + | return DOM.get(this.id).disabled; |
| + | }, |
| + | |
| + | select : function(va) { |
| + | var t = this, fv, f; |
| + | |
| + | if (va == undefined) |
| + | return t.selectByIndex(-1); |
| + | |
| + | // Is string or number make function selector |
| + | if (va && va.call) |
| + | f = va; |
| + | else { |
| + | f = function(v) { |
| + | return v == va; |
| + | }; |
| + | } |
| + | |
| + | // Do we need to do something? |
| + | if (va != t.selectedValue) { |
| + | // Find item |
| + | each(t.items, function(o, i) { |
| + | if (f(o.value)) { |
| + | fv = 1; |
| + | t.selectByIndex(i); |
| + | return false; |
| + | } |
| + | }); |
| + | |
| + | if (!fv) |
| + | t.selectByIndex(-1); |
| + | } |
| + | }, |
| + | |
| + | selectByIndex : function(idx) { |
| + | DOM.get(this.id).selectedIndex = idx + 1; |
| + | this.selectedValue = this.items[idx] ? this.items[idx].value : null; |
| + | }, |
| + | |
| + | add : function(n, v, a) { |
| + | var o, t = this; |
| + | |
| + | a = a || {}; |
| + | a.value = v; |
| + | |
| + | if (t.isRendered()) |
| + | DOM.add(DOM.get(this.id), 'option', a, n); |
| + | |
| + | o = { |
| + | title : n, |
| + | value : v, |
| + | attribs : a |
| + | }; |
| + | |
| + | t.items.push(o); |
| + | t.onAdd.dispatch(t, o); |
| + | }, |
| + | |
| + | getLength : function() { |
| + | return this.items.length; |
| + | }, |
| + | |
| + | renderHTML : function() { |
| + | var h, t = this; |
| + | |
| + | h = DOM.createHTML('option', {value : ''}, '-- ' + t.settings.title + ' --'); |
| + | |
| + | each(t.items, function(it) { |
| + | h += DOM.createHTML('option', {value : it.value}, it.title); |
| + | }); |
| + | |
| + | h = DOM.createHTML('select', {id : t.id, 'class' : 'mceNativeListBox'}, h); |
| + | |
| + | return h; |
| + | }, |
| + | |
| + | postRender : function() { |
| + | var t = this, ch; |
| + | |
| + | t.rendered = true; |
| + | |
| + | function onChange(e) { |
| + | var v = t.items[e.target.selectedIndex - 1]; |
| + | |
| + | if (v && (v = v.value)) { |
| + | t.onChange.dispatch(t, v); |
| + | |
| + | if (t.settings.onselect) |
| + | t.settings.onselect(v); |
| + | } |
| + | }; |
| + | |
| + | Event.add(t.id, 'change', onChange); |
| + | |
| + | // Accessibility keyhandler |
| + | Event.add(t.id, 'keydown', function(e) { |
| + | var bf; |
| + | |
| + | Event.remove(t.id, 'change', ch); |
| + | |
| + | bf = Event.add(t.id, 'blur', function() { |
| + | Event.add(t.id, 'change', onChange); |
| + | Event.remove(t.id, 'blur', bf); |
| + | }); |
| + | |
| + | if (e.keyCode == 13 || e.keyCode == 32) { |
| + | onChange(e); |
| + | return Event.cancel(e); |
| + | } |
| + | }); |
| + | |
| + | t.onPostRender.dispatch(t, DOM.get(t.id)); |
| + | } |
| + | }); |
| + | })(tinymce); |
| + | (function(tinymce) { |
| + | var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each; |
| + | |
| + | tinymce.create('tinymce.ui.MenuButton:tinymce.ui.Button', { |
| + | MenuButton : function(id, s) { |
| + | this.parent(id, s); |
| + | |
| + | this.onRenderMenu = new tinymce.util.Dispatcher(this); |
| + | |
| + | s.menu_container = s.menu_container || DOM.doc.body; |
| + | }, |
| + | |
| + | showMenu : function() { |
| + | var t = this, p1, p2, e = DOM.get(t.id), m; |
| + | |
| + | if (t.isDisabled()) |
| + | return; |
| + | |
| + | if (!t.isMenuRendered) { |
| + | t.renderMenu(); |
| + | t.isMenuRendered = true; |
| + | } |
| + | |
| + | if (t.isMenuVisible) |
| + | return t.hideMenu(); |
| + | |
| + | p1 = DOM.getPos(t.settings.menu_container); |
| + | p2 = DOM.getPos(e); |
| + | |
| + | m = t.menu; |
| + | m.settings.offset_x = p2.x; |
| + | m.settings.offset_y = p2.y; |
| + | m.settings.vp_offset_x = p2.x; |
| + | m.settings.vp_offset_y = p2.y; |
| + | m.settings.keyboard_focus = t._focused; |
| + | m.showMenu(0, e.clientHeight); |
| + | |
| + | Event.add(DOM.doc, 'mousedown', t.hideMenu, t); |
| + | t.setState('Selected', 1); |
| + | |
| + | t.isMenuVisible = 1; |
| + | }, |
| + | |
| + | renderMenu : function() { |
| + | var t = this, m; |
| + | |
| + | m = t.settings.control_manager.createDropMenu(t.id + '_menu', { |
| + | menu_line : 1, |
| + | 'class' : this.classPrefix + 'Menu', |
| + | icons : t.settings.icons |
| + | }); |
| + | |
| + | m.onHideMenu.add(t.hideMenu, t); |
| + | |
| + | t.onRenderMenu.dispatch(t, m); |
| + | t.menu = m; |
| + | }, |
| + | |
| + | hideMenu : function(e) { |
| + | var t = this; |
| + | |
| + | // Prevent double toogles by canceling the mouse click event to the button |
| + | if (e && e.type == "mousedown" && DOM.getParent(e.target, function(e) {return e.id === t.id || e.id === t.id + '_open';})) |
| + | return; |
| + | |
| + | if (!e || !DOM.getParent(e.target, '.mceMenu')) { |
| + | t.setState('Selected', 0); |
| + | Event.remove(DOM.doc, 'mousedown', t.hideMenu, t); |
| + | if (t.menu) |
| + | t.menu.hideMenu(); |
| + | } |
| + | |
| + | t.isMenuVisible = 0; |
| + | }, |
| + | |
| + | postRender : function() { |
| + | var t = this, s = t.settings; |
| + | |
| + | Event.add(t.id, 'click', function() { |
| + | if (!t.isDisabled()) { |
| + | if (s.onclick) |
| + | s.onclick(t.value); |
| + | |
| + | t.showMenu(); |
| + | } |
| + | }); |
| + | } |
| + | }); |
| + | })(tinymce); |
| + | |
| + | (function(tinymce) { |
| + | var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each; |
| + | |
| + | tinymce.create('tinymce.ui.SplitButton:tinymce.ui.MenuButton', { |
| + | SplitButton : function(id, s) { |
| + | this.parent(id, s); |
| + | this.classPrefix = 'mceSplitButton'; |
| + | }, |
| + | |
| + | renderHTML : function() { |
| + | var h, t = this, s = t.settings, h1; |
| + | |
| + | h = '<tbody><tr>'; |
| + | |
| + | if (s.image) |
| + | h1 = DOM.createHTML('img ', {src : s.image, 'class' : 'mceAction ' + s['class']}); |
| + | else |
| + | h1 = DOM.createHTML('span', {'class' : 'mceAction ' + s['class']}, ''); |
| + | |
| + | h += '<td>' + DOM.createHTML('a', {id : t.id + '_action', href : 'javascript:;', 'class' : 'mceAction ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + '</td>'; |
| + | |
| + | h1 = DOM.createHTML('span', {'class' : 'mceOpen ' + s['class']}); |
| + | h += '<td>' + DOM.createHTML('a', {id : t.id + '_open', href : 'javascript:;', 'class' : 'mceOpen ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + '</td>'; |
| + | |
| + | h += '</tr></tbody>'; |
| + | |
| + | return DOM.createHTML('table', {id : t.id, 'class' : 'mceSplitButton mceSplitButtonEnabled ' + s['class'], cellpadding : '0', cellspacing : '0', onmousedown : 'return false;', title : s.title}, h); |
| + | }, |
| + | |
| + | postRender : function() { |
| + | var t = this, s = t.settings; |
| + | |
| + | if (s.onclick) { |
| + | Event.add(t.id + '_action', 'click', function() { |
| + | if (!t.isDisabled()) |
| + | s.onclick(t.value); |
| + | }); |
| + | } |
| + | |
| + | Event.add(t.id + '_open', 'click', t.showMenu, t); |
| + | Event.add(t.id + '_open', 'focus', function() {t._focused = 1;}); |
| + | Event.add(t.id + '_open', 'blur', function() {t._focused = 0;}); |
| + | |
| + | // Old IE doesn't have hover on all elements |
| + | if (tinymce.isIE6 || !DOM.boxModel) { |
| + | Event.add(t.id, 'mouseover', function() { |
| + | if (!DOM.hasClass(t.id, 'mceSplitButtonDisabled')) |
| + | DOM.addClass(t.id, 'mceSplitButtonHover'); |
| + | }); |
| + | |
| + | Event.add(t.id, 'mouseout', function() { |
| + | if (!DOM.hasClass(t.id, 'mceSplitButtonDisabled')) |
| + | DOM.removeClass(t.id, 'mceSplitButtonHover'); |
| + | }); |
| + | } |
| + | }, |
| + | |
| + | destroy : function() { |
| + | this.parent(); |
| + | |
| + | Event.clear(this.id + '_action'); |
| + | Event.clear(this.id + '_open'); |
| + | } |
| + | }); |
| + | })(tinymce); |
| + | |
| + | (function(tinymce) { |
| + | var DOM = tinymce.DOM, Event = tinymce.dom.Event, is = tinymce.is, each = tinymce.each; |
| + | |
| + | tinymce.create('tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton', { |
| + | ColorSplitButton : function(id, s) { |
| + | var t = this; |
| + | |
| + | t.parent(id, s); |
| + | |
| + | t.settings = s = tinymce.extend({ |
| + | colors : '000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF', |
| + | grid_width : 8, |
| + | default_color : '#888888' |
| + | }, t.settings); |
| + | |
| + | t.onShowMenu = new tinymce.util.Dispatcher(t); |
| + | |
| + | t.onHideMenu = new tinymce.util.Dispatcher(t); |
| + | |
| + | t.value = s.default_color; |
| + | }, |
| + | |
| + | showMenu : function() { |
| + | var t = this, r, p, e, p2; |
| + | |
| + | if (t.isDisabled()) |
| + | return; |
| + | |
| + | if (!t.isMenuRendered) { |
| + | t.renderMenu(); |
| + | t.isMenuRendered = true; |
| + | } |
| + | |
| + | if (t.isMenuVisible) |
| + | return t.hideMenu(); |
| + | |
| + | e = DOM.get(t.id); |
| + | DOM.show(t.id + '_menu'); |
| + | DOM.addClass(e, 'mceSplitButtonSelected'); |
| + | p2 = DOM.getPos(e); |
| + | DOM.setStyles(t.id + '_menu', { |
| + | left : p2.x, |
| + | top : p2.y + e.clientHeight, |
| + | zIndex : 200000 |
| + | }); |
| + | e = 0; |
| + | |
| + | Event.add(DOM.doc, 'mousedown', t.hideMenu, t); |
| + | t.onShowMenu.dispatch(t); |
| + | |
| + | if (t._focused) { |
| + | t._keyHandler = Event.add(t.id + '_menu', 'keydown', function(e) { |
| + | if (e.keyCode == 27) |
| + | t.hideMenu(); |
| + | }); |
| + | |
| + | DOM.select('a', t.id + '_menu')[0].focus(); // Select first link |
| + | } |
| + | |
| + | t.isMenuVisible = 1; |
| + | }, |
| + | |
| + | hideMenu : function(e) { |
| + | var t = this; |
| + | |
| + | // Prevent double toogles by canceling the mouse click event to the button |
| + | if (e && e.type == "mousedown" && DOM.getParent(e.target, function(e) {return e.id === t.id + '_open';})) |
| + | return; |
| + | |
| + | if (!e || !DOM.getParent(e.target, '.mceSplitButtonMenu')) { |
| + | DOM.removeClass(t.id, 'mceSplitButtonSelected'); |
| + | Event.remove(DOM.doc, 'mousedown', t.hideMenu, t); |
| + | Event.remove(t.id + '_menu', 'keydown', t._keyHandler); |
| + | DOM.hide(t.id + '_menu'); |
| + | } |
| + | |
| + | t.onHideMenu.dispatch(t); |
| + | |
| + | t.isMenuVisible = 0; |
| + | }, |
| + | |
| + | renderMenu : function() { |
| + | var t = this, m, i = 0, s = t.settings, n, tb, tr, w; |
| + | |
| + | w = DOM.add(s.menu_container, 'div', {id : t.id + '_menu', 'class' : s['menu_class'] + ' ' + s['class'], style : 'position:absolute;left:0;top:-1000px;'}); |
| + | m = DOM.add(w, 'div', {'class' : s['class'] + ' mceSplitButtonMenu'}); |
| + | DOM.add(m, 'span', {'class' : 'mceMenuLine'}); |
| + | |
| + | n = DOM.add(m, 'table', {'class' : 'mceColorSplitMenu'}); |
| + | tb = DOM.add(n, 'tbody'); |
| + | |
| + | // Generate color grid |
| + | i = 0; |
| + | each(is(s.colors, 'array') ? s.colors : s.colors.split(','), function(c) { |
| + | c = c.replace(/^#/, ''); |
| + | |
| + | if (!i--) { |
| + | tr = DOM.add(tb, 'tr'); |
| + | i = s.grid_width - 1; |
| + | } |
| + | |
| + | n = DOM.add(tr, 'td'); |
| + | |
| + | n = DOM.add(n, 'a', { |
| + | href : 'javascript:;', |
| + | style : { |
| + | backgroundColor : '#' + c |
| + | }, |
| + | _mce_color : '#' + c |
| + | }); |
| + | }); |
| + | |
| + | if (s.more_colors_func) { |
| + | n = DOM.add(tb, 'tr'); |
| + | n = DOM.add(n, 'td', {colspan : s.grid_width, 'class' : 'mceMoreColors'}); |
| + | n = DOM.add(n, 'a', {id : t.id + '_more', href : 'javascript:;', onclick : 'return false;', 'class' : 'mceMoreColors'}, s.more_colors_title); |
| + | |
| + | Event.add(n, 'click', function(e) { |
| + | s.more_colors_func.call(s.more_colors_scope || this); |
| + | return Event.cancel(e); // Cancel to fix onbeforeunload problem |
| + | }); |
| + | } |
| + | |
| + | DOM.addClass(m, 'mceColorSplitMenu'); |
| + | |
| + | Event.add(t.id + '_menu', 'click', function(e) { |
| + | var c; |
| + | |
| + | e = e.target; |
| + | |
| + | if (e.nodeName == 'A' && (c = e.getAttribute('_mce_color'))) |
| + | t.setColor(c); |
| + | |
| + | return Event.cancel(e); // Prevent IE auto save warning |
| + | }); |
| + | |
| + | return w; |
| + | }, |
| + | |
| + | setColor : function(c) { |
| + | var t = this; |
| + | |
| + | DOM.setStyle(t.id + '_preview', 'backgroundColor', c); |
| + | |
| + | t.value = c; |
| + | t.hideMenu(); |
| + | t.settings.onselect(c); |
| + | }, |
| + | |
| + | postRender : function() { |
| + | var t = this, id = t.id; |
| + | |
| + | t.parent(); |
| + | DOM.add(id + '_action', 'div', {id : id + '_preview', 'class' : 'mceColorPreview'}); |
| + | DOM.setStyle(t.id + '_preview', 'backgroundColor', t.value); |
| + | }, |
| + | |
| + | destroy : function() { |
| + | this.parent(); |
| + | |
| + | Event.clear(this.id + '_menu'); |
| + | Event.clear(this.id + '_more'); |
| + | DOM.remove(this.id + '_menu'); |
| + | } |
| + | }); |
| + | })(tinymce); |
| + | |
| + | tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { |
| + | renderHTML : function() { |
| + | var t = this, h = '', c, co, dom = tinymce.DOM, s = t.settings, i, pr, nx, cl; |
| + | |
| + | cl = t.controls; |
| + | for (i=0; i<cl.length; i++) { |
| + | // Get current control, prev control, next control and if the control is a list box or not |
| + | co = cl[i]; |
| + | pr = cl[i - 1]; |
| + | nx = cl[i + 1]; |
| + | |
| + | // Add toolbar start |
| + | if (i === 0) { |
| + | c = 'mceToolbarStart'; |
| + | |
| + | if (co.Button) |
| + | c += ' mceToolbarStartButton'; |
| + | else if (co.SplitButton) |
| + | c += ' mceToolbarStartSplitButton'; |
| + | else if (co.ListBox) |
| + | c += ' mceToolbarStartListBox'; |
| + | |
| + | h += dom.createHTML('td', {'class' : c}, dom.createHTML('span', null, '<!-- IE -->')); |
| + | } |
| + | |
| + | // Add toolbar end before list box and after the previous button |
| + | // This is to fix the o2k7 editor skins |
| + | if (pr && co.ListBox) { |
| + | if (pr.Button || pr.SplitButton) |
| + | h += dom.createHTML('td', {'class' : 'mceToolbarEnd'}, dom.createHTML('span', null, '<!-- IE -->')); |
| + | } |
| + | |
| + | // Render control HTML |
| + | |
| + | // IE 8 quick fix, needed to propertly generate a hit area for anchors |
| + | if (dom.stdMode) |
| + | h += '<td style="position: relative">' + co.renderHTML() + '</td>'; |
| + | else |
| + | h += '<td>' + co.renderHTML() + '</td>'; |
| + | |
| + | // Add toolbar start after list box and before the next button |
| + | // This is to fix the o2k7 editor skins |
| + | if (nx && co.ListBox) { |
| + | if (nx.Button || nx.SplitButton) |
| + | h += dom.createHTML('td', {'class' : 'mceToolbarStart'}, dom.createHTML('span', null, '<!-- IE -->')); |
| + | } |
| + | } |
| + | |
| + | c = 'mceToolbarEnd'; |
| + | |
| + | if (co.Button) |
| + | c += ' mceToolbarEndButton'; |
| + | else if (co.SplitButton) |
| + | c += ' mceToolbarEndSplitButton'; |
| + | else if (co.ListBox) |
| + | c += ' mceToolbarEndListBox'; |
| + | |
| + | h += dom.createHTML('td', {'class' : c}, dom.createHTML('span', null, '<!-- IE -->')); |
| + | |
| + | return dom.createHTML('table', {id : t.id, 'class' : 'mceToolbar' + (s['class'] ? ' ' + s['class'] : ''), cellpadding : '0', cellspacing : '0', align : t.settings.align || ''}, '<tbody><tr>' + h + '</tr></tbody>'); |
| + | } |
| + | }); |
| + | |
| + | (function(tinymce) { |
| + | var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each; |
| + | |
| + | tinymce.create('tinymce.AddOnManager', { |
| + | items : [], |
| + | urls : {}, |
| + | lookup : {}, |
| + | |
| + | onAdd : new Dispatcher(this), |
| + | |
| + | get : function(n) { |
| + | return this.lookup[n]; |
| + | }, |
| + | |
| + | requireLangPack : function(n) { |
| + | var s = tinymce.settings; |
| + | |
| + | if (s && s.language) |
| + | tinymce.ScriptLoader.add(this.urls[n] + '/langs/' + s.language + '.js'); |
| + | }, |
| + | |
| + | add : function(id, o) { |
| + | this.items.push(o); |
| + | this.lookup[id] = o; |
| + | this.onAdd.dispatch(this, id, o); |
| + | |
| + | return o; |
| + | }, |
| + | |
| + | load : function(n, u, cb, s) { |
| + | var t = this; |
| + | |
| + | if (t.urls[n]) |
| + | return; |
| + | |
| + | if (u.indexOf('/') != 0 && u.indexOf('://') == -1) |
| + | u = tinymce.baseURL + '/' + u; |
| + | |
| + | t.urls[n] = u.substring(0, u.lastIndexOf('/')); |
| + | tinymce.ScriptLoader.add(u, cb, s); |
| + | } |
| + | }); |
| + | |
| + | // Create plugin and theme managers |
| + | tinymce.PluginManager = new tinymce.AddOnManager(); |
| + | tinymce.ThemeManager = new tinymce.AddOnManager(); |
| + | }(tinymce)); |
| + | |
| + | (function(tinymce) { |
| + | // Shorten names |
| + | var each = tinymce.each, extend = tinymce.extend, |
| + | DOM = tinymce.DOM, Event = tinymce.dom.Event, |
| + | ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager, |
| + | explode = tinymce.explode, |
| + | Dispatcher = tinymce.util.Dispatcher, undefined, instanceCounter = 0; |
| + | |
| + | // Setup some URLs where the editor API is located and where the document is |
| + | tinymce.documentBaseURL = window.location.href.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, ''); |
| + | if (!/[\/\\]$/.test(tinymce.documentBaseURL)) |
| + | tinymce.documentBaseURL += '/'; |
| + | |
| + | tinymce.baseURL = new tinymce.util.URI(tinymce.documentBaseURL).toAbsolute(tinymce.baseURL); |
| + | |
| + | tinymce.baseURI = new tinymce.util.URI(tinymce.baseURL); |
| + | |
| + | // Add before unload listener |
| + | // This was required since IE was leaking memory if you added and removed beforeunload listeners |
| + | // with attachEvent/detatchEvent so this only adds one listener and instances can the attach to the onBeforeUnload event |
| + | tinymce.onBeforeUnload = new Dispatcher(tinymce); |
| + | |
| + | // Must be on window or IE will leak if the editor is placed in frame or iframe |
| + | Event.add(window, 'beforeunload', function(e) { |
| + | tinymce.onBeforeUnload.dispatch(tinymce, e); |
| + | }); |
| + | |
| + | tinymce.onAddEditor = new Dispatcher(tinymce); |
| + | |
| + | tinymce.onRemoveEditor = new Dispatcher(tinymce); |
| + | |
| + | tinymce.EditorManager = extend(tinymce, { |
| + | editors : [], |
| + | |
| + | i18n : {}, |
| + | |
| + | activeEditor : null, |
| + | |
| + | init : function(s) { |
| + | var t = this, pl, sl = tinymce.ScriptLoader, e, el = [], ed; |
| + | |
| + | function execCallback(se, n, s) { |
| + | var f = se[n]; |
| + | |
| + | if (!f) |
| + | return; |
| + | |
| + | if (tinymce.is(f, 'string')) { |
| + | s = f.replace(/\.\w+$/, ''); |
| + | s = s ? tinymce.resolve(s) : 0; |
| + | f = tinymce.resolve(f); |
| + | } |
| + | |
| + | return f.apply(s || this, Array.prototype.slice.call(arguments, 2)); |
| + | }; |
| + | |
| + | s = extend({ |
| + | theme : "simple", |
| + | language : "en" |
| + | }, s); |
| + | |
| + | t.settings = s; |
| + | |
| + | // Legacy call |
| + | Event.add(document, 'init', function() { |
| + | var l, co; |
| + | |
| + | execCallback(s, 'onpageload'); |
| + | |
| + | switch (s.mode) { |
| + | case "exact": |
| + | l = s.elements || ''; |
| + | |
| + | if(l.length > 0) { |
| + | each(explode(l), function(v) { |
| + | if (DOM.get(v)) { |
| + | ed = new tinymce.Editor(v, s); |
| + | el.push(ed); |
| + | ed.render(1); |
| + | } else { |
| + | each(document.forms, function(f) { |
| + | each(f.elements, function(e) { |
| + | if (e.name === v) { |
| + | v = 'mce_editor_' + instanceCounter++; |
| + | DOM.setAttrib(e, 'id', v); |
| + | |
| + | ed = new tinymce.Editor(v, s); |
| + | el.push(ed); |
| + | ed.render(1); |
| + | } |
| + | }); |
| + | }); |
| + | } |
| + | }); |
| + | } |
| + | break; |
| + | |
| + | case "textareas": |
| + | case "specific_textareas": |
| + | function hasClass(n, c) { |
| + | return c.constructor === RegExp ? c.test(n.className) : DOM.hasClass(n, c); |
| + | }; |
| + | |
| + | each(DOM.select('textarea'), function(v) { |
| + | if (s.editor_deselector && hasClass(v, s.editor_deselector)) |
| + | return; |
| + | |
| + | if (!s.editor_selector || hasClass(v, s.editor_selector)) { |
| + | // Can we use the name |
| + | e = DOM.get(v.name); |
| + | if (!v.id && !e) |
| + | v.id = v.name; |
| + | |
| + | // Generate unique name if missing or already exists |
| + | if (!v.id || t.get(v.id)) |
| + | v.id = DOM.uniqueId(); |
| + | |
| + | ed = new tinymce.Editor(v.id, s); |
| + | el.push(ed); |
| + | ed.render(1); |
| + | } |
| + | }); |
| + | break; |
| + | } |
| + | |
| + | // Call onInit when all editors are initialized |
| + | if (s.oninit) { |
| + | l = co = 0; |
| + | |
| + | each(el, function(ed) { |
| + | co++; |
| + | |
| + | if (!ed.initialized) { |
| + | // Wait for it |
| + | ed.onInit.add(function() { |
| + | l++; |
| + | |
| + | // All done |
| + | if (l == co) |
| + | execCallback(s, 'oninit'); |
| + | }); |
| + | } else |
| + | l++; |
| + | |
| + | // All done |
| + | if (l == co) |
| + | execCallback(s, 'oninit'); |
| + | }); |
| + | } |
| + | }); |
| + | }, |
| + | |
| + | get : function(id) { |
| + | if (id === undefined) |
| + | return this.editors; |
| + | |
| + | return this.editors[id]; |
| + | }, |
| + | |
| + | getInstanceById : function(id) { |
| + | return this.get(id); |
| + | }, |
| + | |
| + | add : function(editor) { |
| + | var self = this, editors = self.editors; |
| + | |
| + | // Add named and index editor instance |
| + | editors[editor.id] = editor; |
| + | editors.push(editor); |
| + | |
| + | self._setActive(editor); |
| + | self.onAddEditor.dispatch(self, editor); |
| + | |
| + | |
| + | // Patch the tinymce.Editor instance with jQuery adapter logic |
| + | if (tinymce.adapter) |
| + | tinymce.adapter.patchEditor(editor); |
| + | |
| + | |
| + | return editor; |
| + | }, |
| + | |
| + | remove : function(editor) { |
| + | var t = this, i, editors = t.editors; |
| + | |
| + | // Not in the collection |
| + | if (!editors[editor.id]) |
| + | return null; |
| + | |
| + | delete editors[editor.id]; |
| + | |
| + | for (i = 0; i < editors.length; i++) { |
| + | if (editors[i] == editor) { |
| + | editors.splice(i, 1); |
| + | break; |
| + | } |
| + | } |
| + | |
| + | // Select another editor since the active one was removed |
| + | if (t.activeEditor == editor) |
| + | t._setActive(editors[0]); |
| + | |
| + | editor.destroy(); |
| + | t.onRemoveEditor.dispatch(t, editor); |
| + | |
| + | return editor; |
| + | }, |
| + | |
| + | execCommand : function(c, u, v) { |
| + | var t = this, ed = t.get(v), w; |
| + | |
| + | // Manager commands |
| + | switch (c) { |
| + | case "mceFocus": |
| + | ed.focus(); |
| + | return true; |
| + | |
| + | case "mceAddEditor": |
| + | case "mceAddControl": |
| + | if (!t.get(v)) |
| + | new tinymce.Editor(v, t.settings).render(); |
| + | |
| + | return true; |
| + | |
| + | case "mceAddFrameControl": |
| + | w = v.window; |
| + | |
| + | // Add tinyMCE global instance and tinymce namespace to specified window |
| + | w.tinyMCE = tinyMCE; |
| + | w.tinymce = tinymce; |
| + | |
| + | tinymce.DOM.doc = w.document; |
| + | tinymce.DOM.win = w; |
| + | |
| + | ed = new tinymce.Editor(v.element_id, v); |
| + | ed.render(); |
| + | |
| + | // Fix IE memory leaks |
| + | if (tinymce.isIE) { |
| + | function clr() { |
| + | ed.destroy(); |
| + | w.detachEvent('onunload', clr); |
| + | w = w.tinyMCE = w.tinymce = null; // IE leak |
| + | }; |
| + | |
| + | w.attachEvent('onunload', clr); |
| + | } |
| + | |
| + | v.page_window = null; |
| + | |
| + | return true; |
| + | |
| + | case "mceRemoveEditor": |
| + | case "mceRemoveControl": |
| + | if (ed) |
| + | ed.remove(); |
| + | |
| + | return true; |
| + | |
| + | case 'mceToggleEditor': |
| + | if (!ed) { |
| + | t.execCommand('mceAddControl', 0, v); |
| + | return true; |
| + | } |
| + | |
| + | if (ed.isHidden()) |
| + | ed.show(); |
| + | else |
| + | ed.hide(); |
| + | |
| + | return true; |
| + | } |
| + | |
| + | // Run command on active editor |
| + | if (t.activeEditor) |
| + | return t.activeEditor.execCommand(c, u, v); |
| + | |
| + | return false; |
| + | }, |
| + | |
| + | execInstanceCommand : function(id, c, u, v) { |
| + | var ed = this.get(id); |
| + | |
| + | if (ed) |
| + | return ed.execCommand(c, u, v); |
| + | |
| + | return false; |
| + | }, |
| + | |
| + | triggerSave : function() { |
| + | each(this.editors, function(e) { |
| + | e.save(); |
| + | }); |
| + | }, |
| + | |
| + | addI18n : function(p, o) { |
| + | var lo, i18n = this.i18n; |
| + | |
| + | if (!tinymce.is(p, 'string')) { |
| + | each(p, function(o, lc) { |
| + | each(o, function(o, g) { |
| + | each(o, function(o, k) { |
| + | if (g === 'common') |
| + | i18n[lc + '.' + k] = o; |
| + | else |
| + | i18n[lc + '.' + g + '.' + k] = o; |
| + | }); |
| + | }); |
| + | }); |
| + | } else { |
| + | each(o, function(o, k) { |
| + | i18n[p + '.' + k] = o; |
| + | }); |
| + | } |
| + | }, |
| + | |
| + | // Private methods |
| + | |
| + | _setActive : function(editor) { |
| + | this.selectedInstance = this.activeEditor = editor; |
| + | } |
| + | }); |
| + | })(tinymce); |
| + | |
| + | (function(tinymce) { |
| + | // Shorten these names |
| + | var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, |
| + | Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isGecko = tinymce.isGecko, |
| + | isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, is = tinymce.is, |
| + | ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager, |
| + | inArray = tinymce.inArray, grep = tinymce.grep, explode = tinymce.explode; |
| + | |
| + | tinymce.create('tinymce.Editor', { |
| + | Editor : function(id, s) { |
| + | var t = this; |
| + | |
| + | t.id = t.editorId = id; |
| + | |
| + | t.execCommands = {}; |
| + | t.queryStateCommands = {}; |
| + | t.queryValueCommands = {}; |
| + | |
| + | t.isNotDirty = false; |
| + | |
| + | t.plugins = {}; |
| + | |
| + | // Add events to the editor |
| + | each([ |
| + | 'onPreInit', |
| + | |
| + | 'onBeforeRenderUI', |
| + | |
| + | 'onPostRender', |
| + | |
| + | 'onInit', |
| + | |
| + | 'onRemove', |
| + | |
| + | 'onActivate', |
| + | |
| + | 'onDeactivate', |
| + | |
| + | 'onClick', |
| + | |
| + | 'onEvent', |
| + | |
| + | 'onMouseUp', |
| + | |
| + | 'onMouseDown', |
| + | |
| + | 'onDblClick', |
| + | |
| + | 'onKeyDown', |
| + | |
| + | 'onKeyUp', |
| + | |
| + | 'onKeyPress', |
| + | |
| + | 'onContextMenu', |
| + | |
| + | 'onSubmit', |
| + | |
| + | 'onReset', |
| + | |
| + | 'onPaste', |
| + | |
| + | 'onPreProcess', |
| + | |
| + | 'onPostProcess', |
| + | |
| + | 'onBeforeSetContent', |
| + | |
| + | 'onBeforeGetContent', |
| + | |
| + | 'onSetContent', |
| + | |
| + | 'onGetContent', |
| + | |
| + | 'onLoadContent', |
| + | |
| + | 'onSaveContent', |
| + | |
| + | 'onNodeChange', |
| + | |
| + | 'onChange', |
| + | |
| + | 'onBeforeExecCommand', |
| + | |
| + | 'onExecCommand', |
| + | |
| + | 'onUndo', |
| + | |
| + | 'onRedo', |
| + | |
| + | 'onVisualAid', |
| + | |
| + | 'onSetProgressState' |
| + | ], function(e) { |
| + | t[e] = new Dispatcher(t); |
| + | }); |
| + | |
| + | t.settings = s = extend({ |
| + | id : id, |
| + | language : 'en', |
| + | docs_language : 'en', |
| + | theme : 'simple', |
| + | skin : 'default', |
| + | delta_width : 0, |
| + | delta_height : 0, |
| + | popup_css : '', |
| + | plugins : '', |
| + | document_base_url : tinymce.documentBaseURL, |
| + | add_form_submit_trigger : 1, |
| + | submit_patch : 1, |
| + | add_unload_trigger : 1, |
| + | convert_urls : 1, |
| + | relative_urls : 1, |
| + | remove_script_host : 1, |
| + | table_inline_editing : 0, |
| + | object_resizing : 1, |
| + | cleanup : 1, |
| + | accessibility_focus : 1, |
| + | custom_shortcuts : 1, |
| + | custom_undo_redo_keyboard_shortcuts : 1, |
| + | custom_undo_redo_restore_selection : 1, |
| + | custom_undo_redo : 1, |
| + | doctype : tinymce.isIE6 ? '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">' : '<!DOCTYPE>', // Use old doctype on IE 6 to avoid horizontal scroll |
| + | visual_table_class : 'mceItemTable', |
| + | visual : 1, |
| + | font_size_style_values : 'xx-small,x-small,small,medium,large,x-large,xx-large', |
| + | apply_source_formatting : 1, |
| + | directionality : 'ltr', |
| + | forced_root_block : 'p', |
| + | valid_elements : '@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u,#p,-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|src|border|alt=|title|hspace|vspace|width|height|align],-sub,-sup,-blockquote[cite],-table[border|cellspacing|cellpadding|width|frame|rules|height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot,#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div,-span,-code,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite],object[classid|width|height|codebase|*],param[name|value],embed[type|width|height|src|*],script[src|type],map[name],area[shape|coords|href|alt|target],bdo,button,col[align|char|charoff|span|valign|width],colgroup[align|char|charoff|span|valign|width],dfn,fieldset,form[action|accept|accept-charset|enctype|method],input[accept|alt|checked|disabled|maxlength|name|readonly|size|src|type|value|tabindex|accesskey],kbd,label[for],legend,noscript,optgroup[label|disabled],option[disabled|label|selected|value],q[cite],samp,select[disabled|multiple|name|size],small,textarea[cols|rows|disabled|name|readonly],tt,var,big', |
| + | hidden_input : 1, |
| + | padd_empty_editor : 1, |
| + | render_ui : 1, |
| + | init_theme : 1, |
| + | force_p_newlines : 1, |
| + | indentation : '30px', |
| + | keep_styles : 1, |
| + | fix_table_elements : 1, |
| + | inline_styles : 1, |
| + | convert_fonts_to_spans : true |
| + | }, s); |
| + | |
| + | t.documentBaseURI = new tinymce.util.URI(s.document_base_url || tinymce.documentBaseURL, { |
| + | base_uri : tinyMCE.baseURI |
| + | }); |
| + | |
| + | t.baseURI = tinymce.baseURI; |
| + | |
| + | // Call setup |
| + | t.execCallback('setup', t); |
| + | }, |
| + | |
| + | render : function(nst) { |
| + | var t = this, s = t.settings, id = t.id, sl = tinymce.ScriptLoader; |
| + | |
| + | // Page is not loaded yet, wait for it |
| + | if (!Event.domLoaded) { |
| + | Event.add(document, 'init', function() { |
| + | t.render(); |
| + | }); |
| + | return; |
| + | } |
| + | |
| + | tinyMCE.settings = s; |
| + | |
| + | // Element not found, then skip initialization |
| + | if (!t.getElement()) |
| + | return; |
| + | |
| + | // Is a iPad/iPhone, then skip initialization. We need to sniff here since the |
| + | // browser says it has contentEditable support but there is no visible caret |
| + | // We will remove this check ones Apple implements full contentEditable support |
| + | if (tinymce.isIDevice) |
| + | return; |
| + | |
| + | // Add hidden input for non input elements inside form elements |
| + | if (!/TEXTAREA|INPUT/i.test(t.getElement().nodeName) && s.hidden_input && DOM.getParent(id, 'form')) |
| + | DOM.insertAfter(DOM.create('input', {type : 'hidden', name : id}), id); |
| + | |
| + | if (tinymce.WindowManager) |
| + | t.windowManager = new tinymce.WindowManager(t); |
| + | |
| + | if (s.encoding == 'xml') { |
| + | t.onGetContent.add(function(ed, o) { |
| + | if (o.save) |
| + | o.content = DOM.encode(o.content); |
| + | }); |
| + | } |
| + | |
| + | if (s.add_form_submit_trigger) { |
| + | t.onSubmit.addToTop(function() { |
| + | if (t.initialized) { |
| + | t.save(); |
| + | t.isNotDirty = 1; |
| + | } |
| + | }); |
| + | } |
| + | |
| + | if (s.add_unload_trigger) { |
| + | t._beforeUnload = tinyMCE.onBeforeUnload.add(function() { |
| + | if (t.initialized && !t.destroyed && !t.isHidden()) |
| + | t.save({format : 'raw', no_events : true}); |
| + | }); |
| + | } |
| + | |
| + | tinymce.addUnload(t.destroy, t); |
| + | |
| + | if (s.submit_patch) { |
| + | t.onBeforeRenderUI.add(function() { |
| + | var n = t.getElement().form; |
| + | |
| + | if (!n) |
| + | return; |
| + | |
| + | // Already patched |
| + | if (n._mceOldSubmit) |
| + | return; |
| + | |
| + | // Check page uses id="submit" or name="submit" for it's submit button |
| + | if (!n.submit.nodeType && !n.submit.length) { |
| + | t.formElement = n; |
| + | n._mceOldSubmit = n.submit; |
| + | n.submit = function() { |
| + | // Save all instances |
| + | tinymce.triggerSave(); |
| + | t.isNotDirty = 1; |
| + | |
| + | return t.formElement._mceOldSubmit(t.formElement); |
| + | }; |
| + | } |
| + | |
| + | n = null; |
| + | }); |
| + | } |
| + | |
| + | // Load scripts |
| + | function loadScripts() { |
| + | if (s.language) |
| + | sl.add(tinymce.baseURL + '/langs/' + s.language + '.js'); |
| + | |
| + | if (s.theme && s.theme.charAt(0) != '-' && !ThemeManager.urls[s.theme]) |
| + | ThemeManager.load(s.theme, 'themes/' + s.theme + '/editor_template' + tinymce.suffix + '.js'); |
| + | |
| + | each(explode(s.plugins), function(p) { |
| + | if (p && p.charAt(0) != '-' && !PluginManager.urls[p]) { |
| + | // Skip safari plugin, since it is removed as of 3.3b1 |
| + | if (p == 'safari') |
| + | return; |
| + | |
| + | PluginManager.load(p, 'plugins/' + p + '/editor_plugin' + tinymce.suffix + '.js'); |
| + | } |
| + | }); |
| + | |
| + | // Init when que is loaded |
| + | sl.loadQueue(function() { |
| + | if (!t.removed) |
| + | t.init(); |
| + | }); |
| + | }; |
| + | |
| + | loadScripts(); |
| + | }, |
| + | |
| + | init : function() { |
| + | var n, t = this, s = t.settings, w, h, e = t.getElement(), o, ti, u, bi, bc, re; |
| + | |
| + | tinymce.add(t); |
| + | |
| + | if (s.theme) { |
| + | s.theme = s.theme.replace(/-/, ''); |
| + | o = ThemeManager.get(s.theme); |
| + | t.theme = new o(); |
| + | |
| + | if (t.theme.init && s.init_theme) |
| + | t.theme.init(t, ThemeManager.urls[s.theme] || tinymce.documentBaseURL.replace(/\/$/, '')); |
| + | } |
| + | |
| + | // Create all plugins |
| + | each(explode(s.plugins.replace(/\-/g, '')), function(p) { |
| + | var c = PluginManager.get(p), u = PluginManager.urls[p] || tinymce.documentBaseURL.replace(/\/$/, ''), po; |
| + | |
| + | if (c) { |
| + | po = new c(t, u); |
| + | |
| + | t.plugins[p] = po; |
| + | |
| + | if (po.init) |
| + | po.init(t, u); |
| + | } |
| + | }); |
| + | |
| + | // Setup popup CSS path(s) |
| + | if (s.popup_css !== false) { |
| + | if (s.popup_css) |
| + | s.popup_css = t.documentBaseURI.toAbsolute(s.popup_css); |
| + | else |
| + | s.popup_css = t.baseURI.toAbsolute("themes/" + s.theme + "/skins/" + s.skin + "/dialog.css"); |
| + | } |
| + | |
| + | if (s.popup_css_add) |
| + | s.popup_css += ',' + t.documentBaseURI.toAbsolute(s.popup_css_add); |
| + | |
| + | t.controlManager = new tinymce.ControlManager(t); |
| + | |
| + | if (s.custom_undo_redo) { |
| + | // Add initial undo level |
| + | t.onBeforeExecCommand.add(function(ed, cmd, ui, val, a) { |
| + | if (cmd != 'Undo' && cmd != 'Redo' && cmd != 'mceRepaint' && (!a || !a.skip_undo)) { |
| + | if (!t.undoManager.hasUndo()) |
| + | t.undoManager.add(); |
| + | } |
| + | }); |
| + | |
| + | t.onExecCommand.add(function(ed, cmd, ui, val, a) { |
| + | if (cmd != 'Undo' && cmd != 'Redo' && cmd != 'mceRepaint' && (!a || !a.skip_undo)) |
| + | t.undoManager.add(); |
| + | }); |
| + | } |
| + | |
| + | t.onExecCommand.add(function(ed, c) { |
| + | // Don't refresh the select lists until caret move |
| + | if (!/^(FontName|FontSize)$/.test(c)) |
| + | t.nodeChanged(); |
| + | }); |
| + | |
| + | // Remove ghost selections on images and tables in Gecko |
| + | if (isGecko) { |
| + | function repaint(a, o) { |
| + | if (!o || !o.initial) |
| + | t.execCommand('mceRepaint'); |
| + | }; |
| + | |
| + | t.onUndo.add(repaint); |
| + | t.onRedo.add(repaint); |
| + | t.onSetContent.add(repaint); |
| + | } |
| + | |
| + | // Enables users to override the control factory |
| + | t.onBeforeRenderUI.dispatch(t, t.controlManager); |
| + | |
| + | // Measure box |
| + | if (s.render_ui) { |
| + | w = s.width || e.style.width || e.offsetWidth; |
| + | h = s.height || e.style.height || e.offsetHeight; |
| + | t.orgDisplay = e.style.display; |
| + | re = /^[0-9\.]+(|px)$/i; |
| + | |
| + | if (re.test('' + w)) |
| + | w = Math.max(parseInt(w) + (o.deltaWidth || 0), 100); |
| + | |
| + | if (re.test('' + h)) |
| + | h = Math.max(parseInt(h) + (o.deltaHeight || 0), 100); |
| + | |
| + | // Render UI |
| + | o = t.theme.renderUI({ |
| + | targetNode : e, |
| + | width : w, |
| + | height : h, |
| + | deltaWidth : s.delta_width, |
| + | deltaHeight : s.delta_height |
| + | }); |
| + | |
| + | t.editorContainer = o.editorContainer; |
| + | } |
| + | |
| + | |
| + | // User specified a document.domain value |
| + | if (document.domain && location.hostname != document.domain) |
| + | tinymce.relaxedDomain = document.domain; |
| + | |
| + | // Resize editor |
| + | DOM.setStyles(o.sizeContainer || o.editorContainer, { |
| + | width : w, |
| + | height : h |
| + | }); |
| + | |
| + | h = (o.iframeHeight || h) + (typeof(h) == 'number' ? (o.deltaHeight || 0) : ''); |
| + | if (h < 100) |
| + | h = 100; |
| + | |
| + | t.iframeHTML = s.doctype + '<html><head xmlns="http://www.w3.org/1999/xhtml">'; |
| + | |
| + | // We only need to override paths if we have to |
| + | // IE has a bug where it remove site absolute urls to relative ones if this is specified |
| + | if (s.document_base_url != tinymce.documentBaseURL) |
| + | t.iframeHTML += '<base href="' + t.documentBaseURI.getURI() + '" />'; |
| + | |
| + | t.iframeHTML += '<meta http-equiv="X-UA-Compatible" content="IE=7" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'; |
| + | |
| + | if (tinymce.relaxedDomain) |
| + | t.iframeHTML += '<script type="text/javascript">document.domain = "' + tinymce.relaxedDomain + '";</script>'; |
| + | |
| + | bi = s.body_id || 'tinymce'; |
| + | if (bi.indexOf('=') != -1) { |
| + | bi = t.getParam('body_id', '', 'hash'); |
| + | bi = bi[t.id] || bi; |
| + | } |
| + | |
| + | bc = s.body_class || ''; |
| + | if (bc.indexOf('=') != -1) { |
| + | bc = t.getParam('body_class', '', 'hash'); |
| + | bc = bc[t.id] || ''; |
| + | } |
| + | |
| + | t.iframeHTML += '</head><body id="' + bi + '" class="mceContentBody ' + bc + '"></body></html>'; |
| + | |
| + | // Domain relaxing enabled, then set document domain |
| + | if (tinymce.relaxedDomain) { |
| + | // We need to write the contents here in IE since multiple writes messes up refresh button and back button |
| + | if (isIE || (tinymce.isOpera && parseFloat(opera.version()) >= 9.5)) |
| + | u = 'javascript:(function(){document.open();document.domain="' + document.domain + '";var ed = window.parent.tinyMCE.get("' + t.id + '");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()'; |
| + | else if (tinymce.isOpera) |
| + | u = 'javascript:(function(){document.open();document.domain="' + document.domain + '";document.close();ed.setupIframe();})()'; |
| + | } |
| + | |
| + | // Create iframe |
| + | n = DOM.add(o.iframeContainer, 'iframe', { |
| + | id : t.id + "_ifr", |
| + | src : u || 'javascript:""', // Workaround for HTTPS warning in IE6/7 |
| + | frameBorder : '0', |
| + | style : { |
| + | width : '100%', |
| + | height : h |
| + | } |
| + | }); |
| + | |
| + | t.contentAreaContainer = o.iframeContainer; |
| + | DOM.get(o.editorContainer).style.display = t.orgDisplay; |
| + | DOM.get(t.id).style.display = 'none'; |
| + | |
| + | if (!isIE || !tinymce.relaxedDomain) |
| + | t.setupIframe(); |
| + | |
| + | e = n = o = null; // Cleanup |
| + | }, |
| + | |
| + | setupIframe : function() { |
| + | var t = this, s = t.settings, e = DOM.get(t.id), d = t.getDoc(), h, b; |
| + | |
| + | // Setup iframe body |
| + | if (!isIE || !tinymce.relaxedDomain) { |
| + | d.open(); |
| + | d.write(t.iframeHTML); |
| + | d.close(); |
| + | } |
| + | |
| + | // Design mode needs to be added here Ctrl+A will fail otherwise |
| + | if (!isIE) { |
| + | try { |
| + | if (!s.readonly) |
| + | d.designMode = 'On'; |
| + | } catch (ex) { |
| + | // Will fail on Gecko if the editor is placed in an hidden container element |
| + | // The design mode will be set ones the editor is focused |
| + | } |
| + | } |
| + | |
| + | // IE needs to use contentEditable or it will display non secure items for HTTPS |
| + | if (isIE) { |
| + | // It will not steal focus if we hide it while setting contentEditable |
| + | b = t.getBody(); |
| + | DOM.hide(b); |
| + | |
| + | if (!s.readonly) |
| + | b.contentEditable = true; |
| + | |
| + | DOM.show(b); |
| + | } |
| + | |
| + | t.dom = new tinymce.dom.DOMUtils(t.getDoc(), { |
| + | keep_values : true, |
| + | url_converter : t.convertURL, |
| + | url_converter_scope : t, |
| + | hex_colors : s.force_hex_style_colors, |
| + | class_filter : s.class_filter, |
| + | update_styles : 1, |
| + | fix_ie_paragraphs : 1, |
| + | valid_styles : s.valid_styles |
| + | }); |
| + | |
| + | t.schema = new tinymce.dom.Schema(); |
| + | |
| + | t.serializer = new tinymce.dom.Serializer(extend(s, { |
| + | valid_elements : s.verify_html === false ? '*[*]' : s.valid_elements, |
| + | dom : t.dom, |
| + | schema : t.schema |
| + | })); |
| + | |
| + | t.selection = new tinymce.dom.Selection(t.dom, t.getWin(), t.serializer); |
| + | |
| + | t.formatter = new tinymce.Formatter(this); |
| + | |
| + | // Register default formats |
| + | t.formatter.register({ |
| + | alignleft : [ |
| + | {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'left'}}, |
| + | {selector : 'img,table', styles : {'float' : 'left'}} |
| + | ], |
| + | |
| + | aligncenter : [ |
| + | {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'center'}}, |
| + | {selector : 'img', styles : {display : 'block', marginLeft : 'auto', marginRight : 'auto'}}, |
| + | {selector : 'table', styles : {marginLeft : 'auto', marginRight : 'auto'}} |
| + | ], |
| + | |
| + | alignright : [ |
| + | {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'right'}}, |
| + | {selector : 'img,table', styles : {'float' : 'right'}} |
| + | ], |
| + | |
| + | alignfull : [ |
| + | {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'justify'}} |
| + | ], |
| + | |
| + | bold : [ |
| + | {inline : 'strong'}, |
| + | {inline : 'span', styles : {fontWeight : 'bold'}}, |
| + | {inline : 'b'} |
| + | ], |
| + | |
| + | italic : [ |
| + | {inline : 'em'}, |
| + | {inline : 'span', styles : {fontStyle : 'italic'}}, |
| + | {inline : 'i'} |
| + | ], |
| + | |
| + | underline : [ |
| + | {inline : 'span', styles : {textDecoration : 'underline'}, exact : true}, |
| + | {inline : 'u'} |
| + | ], |
| + | |
| + | strikethrough : [ |
| + | {inline : 'span', styles : {textDecoration : 'line-through'}, exact : true}, |
| + | {inline : 'u'} |
| + | ], |
| + | |
| + | forecolor : {inline : 'span', styles : {color : '%value'}}, |
| + | hilitecolor : {inline : 'span', styles : {backgroundColor : '%value'}}, |
| + | fontname : {inline : 'span', styles : {fontFamily : '%value'}}, |
| + | fontsize : {inline : 'span', styles : {fontSize : '%value'}}, |
| + | fontsize_class : {inline : 'span', attributes : {'class' : '%value'}}, |
| + | blockquote : {block : 'blockquote', wrapper : 1, remove : 'all'}, |
| + | |
| + | removeformat : [ |
| + | {selector : 'b,strong,em,i,font,u,strike', remove : 'all', split : true, expand : false, block_expand : true, deep : true}, |
| + | {selector : 'span', attributes : ['style', 'class'], remove : 'empty', split : true, expand : false, deep : true}, |
| + | {selector : '*', attributes : ['style', 'class'], split : false, expand : false, deep : true} |
| + | ] |
| + | }); |
| + | |
| + | // Register default block formats |
| + | each('p h1 h2 h3 h4 h5 h6 div address pre div code dt dd samp'.split(/\s/), function(name) { |
| + | t.formatter.register(name, {block : name, remove : 'all'}); |
| + | }); |
| + | |
| + | // Register user defined formats |
| + | t.formatter.register(t.settings.formats); |
| + | |
| + | t.undoManager = new tinymce.UndoManager(t); |
| + | |
| + | // Pass through |
| + | t.undoManager.onAdd.add(function(um, l) { |
| + | if (!l.initial) |
| + | return t.onChange.dispatch(t, l, um); |
| + | }); |
| + | |
| + | t.undoManager.onUndo.add(function(um, l) { |
| + | return t.onUndo.dispatch(t, l, um); |
| + | }); |
| + | |
| + | t.undoManager.onRedo.add(function(um, l) { |
| + | return t.onRedo.dispatch(t, l, um); |
| + | }); |
| + | |
| + | t.forceBlocks = new tinymce.ForceBlocks(t, { |
| + | forced_root_block : s.forced_root_block |
| + | }); |
| + | |
| + | t.editorCommands = new tinymce.EditorCommands(t); |
| + | |
| + | // Pass through |
| + | t.serializer.onPreProcess.add(function(se, o) { |
| + | return t.onPreProcess.dispatch(t, o, se); |
| + | }); |
| + | |
| + | t.serializer.onPostProcess.add(function(se, o) { |
| + | return t.onPostProcess.dispatch(t, o, se); |
| + | }); |
| + | |
| + | t.onPreInit.dispatch(t); |
| + | |
| + | if (!s.gecko_spellcheck) |
| + | t.getBody().spellcheck = 0; |
| + | |
| + | if (!s.readonly) |
| + | t._addEvents(); |
| + | |
| + | t.controlManager.onPostRender.dispatch(t, t.controlManager); |
| + | t.onPostRender.dispatch(t); |
| + | |
| + | if (s.directionality) |
| + | t.getBody().dir = s.directionality; |
| + | |
| + | if (s.nowrap) |
| + | t.getBody().style.whiteSpace = "nowrap"; |
| + | |
| + | if (s.custom_elements) { |
| + | function handleCustom(ed, o) { |
| + | each(explode(s.custom_elements), function(v) { |
| + | var n; |
| + | |
| + | if (v.indexOf('~') === 0) { |
| + | v = v.substring(1); |
| + | n = 'span'; |
| + | } else |
| + | n = 'div'; |
| + | |
| + | o.content = o.content.replace(new RegExp('<(' + v + ')([^>]*)>', 'g'), '<' + n + ' _mce_name="$1"$2>'); |
| + | o.content = o.content.replace(new RegExp('</(' + v + ')>', 'g'), '</' + n + '>'); |
| + | }); |
| + | }; |
| + | |
| + | t.onBeforeSetContent.add(handleCustom); |
| + | t.onPostProcess.add(function(ed, o) { |
| + | if (o.set) |
| + | handleCustom(ed, o); |
| + | }); |
| + | } |
| + | |
| + | if (s.handle_node_change_callback) { |
| + | t.onNodeChange.add(function(ed, cm, n) { |
| + | t.execCallback('handle_node_change_callback', t.id, n, -1, -1, true, t.selection.isCollapsed()); |
| + | }); |
| + | } |
| + | |
| + | if (s.save_callback) { |
| + | t.onSaveContent.add(function(ed, o) { |
| + | var h = t.execCallback('save_callback', t.id, o.content, t.getBody()); |
| + | |
| + | if (h) |
| + | o.content = h; |
| + | }); |
| + | } |
| + | |
| + | if (s.onchange_callback) { |
| + | t.onChange.add(function(ed, l) { |
| + | t.execCallback('onchange_callback', t, l); |
| + | }); |
| + | } |
| + | |
| + | if (s.convert_newlines_to_brs) { |
| + | t.onBeforeSetContent.add(function(ed, o) { |
| + | if (o.initial) |
| + | o.content = o.content.replace(/\r?\n/g, '<br />'); |
| + | }); |
| + | } |
| + | |
| + | if (s.fix_nesting && isIE) { |
| + | t.onBeforeSetContent.add(function(ed, o) { |
| + | o.content = t._fixNesting(o.content); |
| + | }); |
| + | } |
| + | |
| + | if (s.preformatted) { |
| + | t.onPostProcess.add(function(ed, o) { |
| + | o.content = o.content.replace(/^\s*<pre.*?>/, ''); |
| + | o.content = o.content.replace(/<\/pre>\s*$/, ''); |
| + | |
| + | if (o.set) |
| + | o.content = '<pre class="mceItemHidden">' + o.content + '</pre>'; |
| + | }); |
| + | } |
| + | |
| + | if (s.verify_css_classes) { |
| + | t.serializer.attribValueFilter = function(n, v) { |
| + | var s, cl; |
| + | |
| + | if (n == 'class') { |
| + | // Build regexp for classes |
| + | if (!t.classesRE) { |
| + | cl = t.dom.getClasses(); |
| + | |
| + | if (cl.length > 0) { |
| + | s = ''; |
| + | |
| + | each (cl, function(o) { |
| + | s += (s ? '|' : '') + o['class']; |
| + | }); |
| + | |
| + | t.classesRE = new RegExp('(' + s + ')', 'gi'); |
| + | } |
| + | } |
| + | |
| + | return !t.classesRE || /(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(v) || t.classesRE.test(v) ? v : ''; |
| + | } |
| + | |
| + | return v; |
| + | }; |
| + | } |
| + | |
| + | if (s.cleanup_callback) { |
| + | t.onBeforeSetContent.add(function(ed, o) { |
| + | o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o); |
| + | }); |
| + | |
| + | t.onPreProcess.add(function(ed, o) { |
| + | if (o.set) |
| + | t.execCallback('cleanup_callback', 'insert_to_editor_dom', o.node, o); |
| + | |
| + | if (o.get) |
| + | t.execCallback('cleanup_callback', 'get_from_editor_dom', o.node, o); |
| + | }); |
| + | |
| + | t.onPostProcess.add(function(ed, o) { |
| + | if (o.set) |
| + | o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o); |
| + | |
| + | if (o.get) |
| + | o.content = t.execCallback('cleanup_callback', 'get_from_editor', o.content, o); |
| + | }); |
| + | } |
| + | |
| + | if (s.save_callback) { |
| + | t.onGetContent.add(function(ed, o) { |
| + | if (o.save) |
| + | o.content = t.execCallback('save_callback', t.id, o.content, t.getBody()); |
| + | }); |
| + | } |
| + | |
| + | if (s.handle_event_callback) { |
| + | t.onEvent.add(function(ed, e, o) { |
| + | if (t.execCallback('handle_event_callback', e, ed, o) === false) |
| + | Event.cancel(e); |
| + | }); |
| + | } |
| + | |
| + | // Add visual aids when new contents is added |
| + | t.onSetContent.add(function() { |
| + | t.addVisual(t.getBody()); |
| + | }); |
| + | |
| + | // Remove empty contents |
| + | if (s.padd_empty_editor) { |
| + | t.onPostProcess.add(function(ed, o) { |
| + | o.content = o.content.replace(/^(<p[^>]*>( | |\s|\u00a0|)<\/p>[\r\n]*|<br \/>[\r\n]*)$/, ''); |
| + | }); |
| + | } |
| + | |
| + | if (isGecko) { |
| + | // Fix gecko link bug, when a link is placed at the end of block elements there is |
| + | // no way to move the caret behind the link. This fix adds a bogus br element after the link |
| + | function fixLinks(ed, o) { |
| + | each(ed.dom.select('a'), function(n) { |
| + | var pn = n.parentNode; |
| + | |
| + | if (ed.dom.isBlock(pn) && pn.lastChild === n) |
| + | ed.dom.add(pn, 'br', {'_mce_bogus' : 1}); |
| + | }); |
| + | }; |
| + | |
| + | t.onExecCommand.add(function(ed, cmd) { |
| + | if (cmd === 'CreateLink') |
| + | fixLinks(ed); |
| + | }); |
| + | |
| + | t.onSetContent.add(t.selection.onSetContent.add(fixLinks)); |
| + | |
| + | if (!s.readonly) { |
| + | try { |
| + | // Design mode must be set here once again to fix a bug where |
| + | // Ctrl+A/Delete/Backspace didn't work if the editor was added using mceAddControl then removed then added again |
| + | d.designMode = 'Off'; |
| + | d.designMode = 'On'; |
| + | } catch (ex) { |
| + | // Will fail on Gecko if the editor is placed in an hidden container element |
| + | // The design mode will be set ones the editor is focused |
| + | } |
| + | } |
| + | } |
| + | |
| + | // A small timeout was needed since firefox will remove. Bug: #1838304 |
| + | setTimeout(function () { |
| + | if (t.removed) |
| + | return; |
| + | |
| + | t.load({initial : true, format : (s.cleanup_on_startup ? 'html' : 'raw')}); |
| + | t.startContent = t.getContent({format : 'raw'}); |
| + | t.initialized = true; |
| + | |
| + | t.onInit.dispatch(t); |
| + | t.execCallback('setupcontent_callback', t.id, t.getBody(), t.getDoc()); |
| + | t.execCallback('init_instance_callback', t); |
| + | t.focus(true); |
| + | t.nodeChanged({initial : 1}); |
| + | |
| + | // Load specified content CSS last |
| + | if (s.content_css) { |
| + | tinymce.each(explode(s.content_css), function(u) { |
| + | t.dom.loadCSS(t.documentBaseURI.toAbsolute(u)); |
| + | }); |
| + | } |
| + | |
| + | // Handle auto focus |
| + | if (s.auto_focus) { |
| + | setTimeout(function () { |
| + | var ed = tinymce.get(s.auto_focus); |
| + | |
| + | ed.selection.select(ed.getBody(), 1); |
| + | ed.selection.collapse(1); |
| + | ed.getWin().focus(); |
| + | }, 100); |
| + | } |
| + | }, 1); |
| + | |
| + | e = null; |
| + | }, |
| + | |
| + | |
| + | focus : function(sf) { |
| + | var oed, t = this, ce = t.settings.content_editable, ieRng, controlElm, doc = t.getDoc(); |
| + | |
| + | if (!sf) { |
| + | // Get selected control element |
| + | ieRng = t.selection.getRng(); |
| + | if (ieRng.item) { |
| + | controlElm = ieRng.item(0); |
| + | } |
| + | |
| + | // Is not content editable |
| + | if (!ce) |
| + | t.getWin().focus(); |
| + | |
| + | // Restore selected control element |
| + | // This is needed when for example an image is selected within a |
| + | // layer a call to focus will then remove the control selection |
| + | if (controlElm && controlElm.ownerDocument == doc) { |
| + | ieRng = doc.body.createControlRange(); |
| + | ieRng.addElement(controlElm); |
| + | ieRng.select(); |
| + | } |
| + | |
| + | } |
| + | |
| + | if (tinymce.activeEditor != t) { |
| + | if ((oed = tinymce.activeEditor) != null) |
| + | oed.onDeactivate.dispatch(oed, t); |
| + | |
| + | t.onActivate.dispatch(t, oed); |
| + | } |
| + | |
| + | tinymce._setActive(t); |
| + | }, |
| + | |
| + | execCallback : function(n) { |
| + | var t = this, f = t.settings[n], s; |
| + | |
| + | if (!f) |
| + | return; |
| + | |
| + | // Look through lookup |
| + | if (t.callbackLookup && (s = t.callbackLookup[n])) { |
| + | f = s.func; |
| + | s = s.scope; |
| + | } |
| + | |
| + | if (is(f, 'string')) { |
| + | s = f.replace(/\.\w+$/, ''); |
| + | s = s ? tinymce.resolve(s) : 0; |
| + | f = tinymce.resolve(f); |
| + | t.callbackLookup = t.callbackLookup || {}; |
| + | t.callbackLookup[n] = {func : f, scope : s}; |
| + | } |
| + | |
| + | return f.apply(s || t, Array.prototype.slice.call(arguments, 1)); |
| + | }, |
| + | |
| + | translate : function(s) { |
| + | var c = this.settings.language || 'en', i18n = tinymce.i18n; |
| + | |
| + | if (!s) |
| + | return ''; |
| + | |
| + | return i18n[c + '.' + s] || s.replace(/{\#([^}]+)\}/g, function(a, b) { |
| + | return i18n[c + '.' + b] || '{#' + b + '}'; |
| + | }); |
| + | }, |
| + | |
| + | getLang : function(n, dv) { |
| + | return tinymce.i18n[(this.settings.language || 'en') + '.' + n] || (is(dv) ? dv : '{#' + n + '}'); |
| + | }, |
| + | |
| + | getParam : function(n, dv, ty) { |
| + | var tr = tinymce.trim, v = is(this.settings[n]) ? this.settings[n] : dv, o; |
| + | |
| + | if (ty === 'hash') { |
| + | o = {}; |
| + | |
| + | if (is(v, 'string')) { |
| + | each(v.indexOf('=') > 0 ? v.split(/[;,](?![^=;,]*(?:[;,]|$))/) : v.split(','), function(v) { |
| + | v = v.split('='); |
| + | |
| + | if (v.length > 1) |
| + | o[tr(v[0])] = tr(v[1]); |
| + | else |
| + | o[tr(v[0])] = tr(v); |
| + | }); |
| + | } else |
| + | o = v; |
| + | |
| + | return o; |
| + | } |
| + | |
| + | return v; |
| + | }, |
| + | |
| + | nodeChanged : function(o) { |
| + | var t = this, s = t.selection, n = (isIE ? s.getNode() : s.getStart()) || t.getBody(); |
| + | |
| + | // Fix for bug #1896577 it seems that this can not be fired while the editor is loading |
| + | if (t.initialized) { |
| + | o = o || {}; |
| + | n = isIE && n.ownerDocument != t.getDoc() ? t.getBody() : n; // Fix for IE initial state |
| + | |
| + | // Get parents and add them to object |
| + | o.parents = []; |
| + | t.dom.getParent(n, function(node) { |
| + | if (node.nodeName == 'BODY') |
| + | return true; |
| + | |
| + | o.parents.push(node); |
| + | }); |
| + | |
| + | t.onNodeChange.dispatch( |
| + | t, |
| + | o ? o.controlManager || t.controlManager : t.controlManager, |
| + | n, |
| + | s.isCollapsed(), |
| + | o |
| + | ); |
| + | } |
| + | }, |
| + | |
| + | addButton : function(n, s) { |
| + | var t = this; |
| + | |
| + | t.buttons = t.buttons || {}; |
| + | t.buttons[n] = s; |
| + | }, |
| + | |
| + | addCommand : function(n, f, s) { |
| + | this.execCommands[n] = {func : f, scope : s || this}; |
| + | }, |
| + | |
| + | addQueryStateHandler : function(n, f, s) { |
| + | this.queryStateCommands[n] = {func : f, scope : s || this}; |
| + | }, |
| + | |
| + | addQueryValueHandler : function(n, f, s) { |
| + | this.queryValueCommands[n] = {func : f, scope : s || this}; |
| + | }, |
| + | |
| + | addShortcut : function(pa, desc, cmd_func, sc) { |
| + | var t = this, c; |
| + | |
| + | if (!t.settings.custom_shortcuts) |
| + | return false; |
| + | |
| + | t.shortcuts = t.shortcuts || {}; |
| + | |
| + | if (is(cmd_func, 'string')) { |
| + | c = cmd_func; |
| + | |
| + | cmd_func = function() { |
| + | t.execCommand(c, false, null); |
| + | }; |
| + | } |
| + | |
| + | if (is(cmd_func, 'object')) { |
| + | c = cmd_func; |
| + | |
| + | cmd_func = function() { |
| + | t.execCommand(c[0], c[1], c[2]); |
| + | }; |
| + | } |
| + | |
| + | each(explode(pa), function(pa) { |
| + | var o = { |
| + | func : cmd_func, |
| + | scope : sc || this, |
| + | desc : desc, |
| + | alt : false, |
| + | ctrl : false, |
| + | shift : false |
| + | }; |
| + | |
| + | each(explode(pa, '+'), function(v) { |
| + | switch (v) { |
| + | case 'alt': |
| + | case 'ctrl': |
| + | case 'shift': |
| + | o[v] = true; |
| + | break; |
| + | |
| + | default: |
| + | o.charCode = v.charCodeAt(0); |
| + | o.keyCode = v.toUpperCase().charCodeAt(0); |
| + | } |
| + | }); |
| + | |
| + | t.shortcuts[(o.ctrl ? 'ctrl' : '') + ',' + (o.alt ? 'alt' : '') + ',' + (o.shift ? 'shift' : '') + ',' + o.keyCode] = o; |
| + | }); |
| + | |
| + | return true; |
| + | }, |
| + | |
| + | execCommand : function(cmd, ui, val, a) { |
| + | var t = this, s = 0, o, st; |
| + | |
| + | if (!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(cmd) && (!a || !a.skip_focus)) |
| + | t.focus(); |
| + | |
| + | o = {}; |
| + | t.onBeforeExecCommand.dispatch(t, cmd, ui, val, o); |
| + | if (o.terminate) |
| + | return false; |
| + | |
| + | // Command callback |
| + | if (t.execCallback('execcommand_callback', t.id, t.selection.getNode(), cmd, ui, val)) { |
| + | t.onExecCommand.dispatch(t, cmd, ui, val, a); |
| + | return true; |
| + | } |
| + | |
| + | // Registred commands |
| + | if (o = t.execCommands[cmd]) { |
| + | st = o.func.call(o.scope, ui, val); |
| + | |
| + | // Fall through on true |
| + | if (st !== true) { |
| + | t.onExecCommand.dispatch(t, cmd, ui, val, a); |
| + | return st; |
| + | } |
| + | } |
| + | |
| + | // Plugin commands |
| + | each(t.plugins, function(p) { |
| + | if (p.execCommand && p.execCommand(cmd, ui, val)) { |
| + | t.onExecCommand.dispatch(t, cmd, ui, val, a); |
| + | s = 1; |
| + | return false; |
| + | } |
| + | }); |
| + | |
| + | if (s) |
| + | return true; |
| + | |
| + | // Theme commands |
| + | if (t.theme && t.theme.execCommand && t.theme.execCommand(cmd, ui, val)) { |
| + | t.onExecCommand.dispatch(t, cmd, ui, val, a); |
| + | return true; |
| + | } |
| + | |
| + | // Execute global commands |
| + | if (tinymce.GlobalCommands.execCommand(t, cmd, ui, val)) { |
| + | t.onExecCommand.dispatch(t, cmd, ui, val, a); |
| + | return true; |
| + | } |
| + | |
| + | // Editor commands |
| + | if (t.editorCommands.execCommand(cmd, ui, val)) { |
| + | t.onExecCommand.dispatch(t, cmd, ui, val, a); |
| + | return true; |
| + | } |
| + | |
| + | // Browser commands |
| + | t.getDoc().execCommand(cmd, ui, val); |
| + | t.onExecCommand.dispatch(t, cmd, ui, val, a); |
| + | }, |
| + | |
| + | queryCommandState : function(cmd) { |
| + | var t = this, o, s; |
| + | |
| + | // Is hidden then return undefined |
| + | if (t._isHidden()) |
| + | return; |
| + | |
| + | // Registred commands |
| + | if (o = t.queryStateCommands[cmd]) { |
| + | s = o.func.call(o.scope); |
| + | |
| + | // Fall though on true |
| + | if (s !== true) |
| + | return s; |
| + | } |
| + | |
| + | // Registred commands |
| + | o = t.editorCommands.queryCommandState(cmd); |
| + | if (o !== -1) |
| + | return o; |
| + | |
| + | // Browser commands |
| + | try { |
| + | return this.getDoc().queryCommandState(cmd); |
| + | } catch (ex) { |
| + | // Fails sometimes see bug: 1896577 |
| + | } |
| + | }, |
| + | |
| + | queryCommandValue : function(c) { |
| + | var t = this, o, s; |
| + | |
| + | // Is hidden then return undefined |
| + | if (t._isHidden()) |
| + | return; |
| + | |
| + | // Registred commands |
| + | if (o = t.queryValueCommands[c]) { |
| + | s = o.func.call(o.scope); |
| + | |
| + | // Fall though on true |
| + | if (s !== true) |
| + | return s; |
| + | } |
| + | |
| + | // Registred commands |
| + | o = t.editorCommands.queryCommandValue(c); |
| + | if (is(o)) |
| + | return o; |
| + | |
| + | // Browser commands |
| + | try { |
| + | return this.getDoc().queryCommandValue(c); |
| + | } catch (ex) { |
| + | // Fails sometimes see bug: 1896577 |
| + | } |
| + | }, |
| + | |
| + | show : function() { |
| + | var t = this; |
| + | |
| + | DOM.show(t.getContainer()); |
| + | DOM.hide(t.id); |
| + | t.load(); |
| + | }, |
| + | |
| + | hide : function() { |
| + | var t = this, d = t.getDoc(); |
| + | |
| + | // Fixed bug where IE has a blinking cursor left from the editor |
| + | if (isIE && d) |
| + | d.execCommand('SelectAll'); |
| + | |
| + | // We must save before we hide so Safari doesn't crash |
| + | t.save(); |
| + | DOM.hide(t.getContainer()); |
| + | DOM.setStyle(t.id, 'display', t.orgDisplay); |
| + | }, |
| + | |
| + | isHidden : function() { |
| + | return !DOM.isHidden(this.id); |
| + | }, |
| + | |
| + | setProgressState : function(b, ti, o) { |
| + | this.onSetProgressState.dispatch(this, b, ti, o); |
| + | |
| + | return b; |
| + | }, |
| + | |
| + | load : function(o) { |
| + | var t = this, e = t.getElement(), h; |
| + | |
| + | if (e) { |
| + | o = o || {}; |
| + | o.load = true; |
| + | |
| + | // Double encode existing entities in the value |
| + | h = t.setContent(is(e.value) ? e.value : e.innerHTML, o); |
| + | o.element = e; |
| + | |
| + | if (!o.no_events) |
| + | t.onLoadContent.dispatch(t, o); |
| + | |
| + | o.element = e = null; |
| + | |
| + | return h; |
| + | } |
| + | }, |
| + | |
| + | save : function(o) { |
| + | var t = this, e = t.getElement(), h, f; |
| + | |
| + | if (!e || !t.initialized) |
| + | return; |
| + | |
| + | o = o || {}; |
| + | o.save = true; |
| + | |
| + | // Add undo level will trigger onchange event |
| + | if (!o.no_events) { |
| + | t.undoManager.typing = 0; |
| + | t.undoManager.add(); |
| + | } |
| + | |
| + | o.element = e; |
| + | h = o.content = t.getContent(o); |
| + | |
| + | if (!o.no_events) |
| + | t.onSaveContent.dispatch(t, o); |
| + | |
| + | h = o.content; |
| + | |
| + | if (!/TEXTAREA|INPUT/i.test(e.nodeName)) { |
| + | e.innerHTML = h; |
| + | |
| + | // Update hidden form element |
| + | if (f = DOM.getParent(t.id, 'form')) { |
| + | each(f.elements, function(e) { |
| + | if (e.name == t.id) { |
| + | e.value = h; |
| + | return false; |
| + | } |
| + | }); |
| + | } |
| + | } else |
| + | e.value = h; |
| + | |
| + | o.element = e = null; |
| + | |
| + | return h; |
| + | }, |
| + | |
| + | setContent : function(h, o) { |
| + | var t = this; |
| + | |
| + | o = o || {}; |
| + | o.format = o.format || 'html'; |
| + | o.set = true; |
| + | o.content = h; |
| + | |
| + | if (!o.no_events) |
| + | t.onBeforeSetContent.dispatch(t, o); |
| + | |
| + | // Padd empty content in Gecko and Safari. Commands will otherwise fail on the content |
| + | // It will also be impossible to place the caret in the editor unless there is a BR element present |
| + | if (!tinymce.isIE && (h.length === 0 || /^\s+$/.test(h))) { |
| + | o.content = t.dom.setHTML(t.getBody(), '<br _mce_bogus="1" />'); |
| + | o.format = 'raw'; |
| + | } |
| + | |
| + | o.content = t.dom.setHTML(t.getBody(), tinymce.trim(o.content)); |
| + | |
| + | if (o.format != 'raw' && t.settings.cleanup) { |
| + | o.getInner = true; |
| + | o.content = t.dom.setHTML(t.getBody(), t.serializer.serialize(t.getBody(), o)); |
| + | } |
| + | |
| + | if (!o.no_events) |
| + | t.onSetContent.dispatch(t, o); |
| + | |
| + | return o.content; |
| + | }, |
| + | |
| + | getContent : function(o) { |
| + | var t = this, h; |
| + | |
| + | o = o || {}; |
| + | o.format = o.format || 'html'; |
| + | o.get = true; |
| + | |
| + | if (!o.no_events) |
| + | t.onBeforeGetContent.dispatch(t, o); |
| + | |
| + | if (o.format != 'raw' && t.settings.cleanup) { |
| + | o.getInner = true; |
| + | h = t.serializer.serialize(t.getBody(), o); |
| + | } else |
| + | h = t.getBody().innerHTML; |
| + | |
| + | h = h.replace(/^\s*|\s*$/g, ''); |
| + | o.content = h; |
| + | |
| + | if (!o.no_events) |
| + | t.onGetContent.dispatch(t, o); |
| + | |
| + | return o.content; |
| + | }, |
| + | |
| + | isDirty : function() { |
| + | var t = this; |
| + | |
| + | return tinymce.trim(t.startContent) != tinymce.trim(t.getContent({format : 'raw', no_events : 1})) && !t.isNotDirty; |
| + | }, |
| + | |
| + | getContainer : function() { |
| + | var t = this; |
| + | |
| + | if (!t.container) |
| + | t.container = DOM.get(t.editorContainer || t.id + '_parent'); |
| + | |
| + | return t.container; |
| + | }, |
| + | |
| + | getContentAreaContainer : function() { |
| + | return this.contentAreaContainer; |
| + | }, |
| + | |
| + | getElement : function() { |
| + | return DOM.get(this.settings.content_element || this.id); |
| + | }, |
| + | |
| + | getWin : function() { |
| + | var t = this, e; |
| + | |
| + | if (!t.contentWindow) { |
| + | e = DOM.get(t.id + "_ifr"); |
| + | |
| + | if (e) |
| + | t.contentWindow = e.contentWindow; |
| + | } |
| + | |
| + | return t.contentWindow; |
| + | }, |
| + | |
| + | getDoc : function() { |
| + | var t = this, w; |
| + | |
| + | if (!t.contentDocument) { |
| + | w = t.getWin(); |
| + | |
| + | if (w) |
| + | t.contentDocument = w.document; |
| + | } |
| + | |
| + | return t.contentDocument; |
| + | }, |
| + | |
| + | getBody : function() { |
| + | return this.bodyElement || this.getDoc().body; |
| + | }, |
| + | |
| + | convertURL : function(u, n, e) { |
| + | var t = this, s = t.settings; |
| + | |
| + | // Use callback instead |
| + | if (s.urlconverter_callback) |
| + | return t.execCallback('urlconverter_callback', u, e, true, n); |
| + | |
| + | // Don't convert link href since thats the CSS files that gets loaded into the editor also skip local file URLs |
| + | if (!s.convert_urls || (e && e.nodeName == 'LINK') || u.indexOf('file:') === 0) |
| + | return u; |
| + | |
| + | // Convert to relative |
| + | if (s.relative_urls) |
| + | return t.documentBaseURI.toRelative(u); |
| + | |
| + | // Convert to absolute |
| + | u = t.documentBaseURI.toAbsolute(u, s.remove_script_host); |
| + | |
| + | return u; |
| + | }, |
| + | |
| + | addVisual : function(e) { |
| + | var t = this, s = t.settings; |
| + | |
| + | e = e || t.getBody(); |
| + | |
| + | if (!is(t.hasVisual)) |
| + | t.hasVisual = s.visual; |
| + | |
| + | each(t.dom.select('table,a', e), function(e) { |
| + | var v; |
| + | |
| + | switch (e.nodeName) { |
| + | case 'TABLE': |
| + | v = t.dom.getAttrib(e, 'border'); |
| + | |
| + | if (!v || v == '0') { |
| + | if (t.hasVisual) |
| + | t.dom.addClass(e, s.visual_table_class); |
| + | else |
| + | t.dom.removeClass(e, s.visual_table_class); |
| + | } |
| + | |
| + | return; |
| + | |
| + | case 'A': |
| + | v = t.dom.getAttrib(e, 'name'); |
| + | |
| + | if (v) { |
| + | if (t.hasVisual) |
| + | t.dom.addClass(e, 'mceItemAnchor'); |
| + | else |
| + | t.dom.removeClass(e, 'mceItemAnchor'); |
| + | } |
| + | |
| + | return; |
| + | } |
| + | }); |
| + | |
| + | t.onVisualAid.dispatch(t, e, t.hasVisual); |
| + | }, |
| + | |
| + | remove : function() { |
| + | var t = this, e = t.getContainer(); |
| + | |
| + | t.removed = 1; // Cancels post remove event execution |
| + | t.hide(); |
| + | |
| + | t.execCallback('remove_instance_callback', t); |
| + | t.onRemove.dispatch(t); |
| + | |
| + | // Clear all execCommand listeners this is required to avoid errors if the editor was removed inside another command |
| + | t.onExecCommand.listeners = []; |
| + | |
| + | tinymce.remove(t); |
| + | DOM.remove(e); |
| + | }, |
| + | |
| + | destroy : function(s) { |
| + | var t = this; |
| + | |
| + | // One time is enough |
| + | if (t.destroyed) |
| + | return; |
| + | |
| + | if (!s) { |
| + | tinymce.removeUnload(t.destroy); |
| + | tinyMCE.onBeforeUnload.remove(t._beforeUnload); |
| + | |
| + | // Manual destroy |
| + | if (t.theme && t.theme.destroy) |
| + | t.theme.destroy(); |
| + | |
| + | // Destroy controls, selection and dom |
| + | t.controlManager.destroy(); |
| + | t.selection.destroy(); |
| + | t.dom.destroy(); |
| + | |
| + | // Remove all events |
| + | |
| + | // Don't clear the window or document if content editable |
| + | // is enabled since other instances might still be present |
| + | if (!t.settings.content_editable) { |
| + | Event.clear(t.getWin()); |
| + | Event.clear(t.getDoc()); |
| + | } |
| + | |
| + | Event.clear(t.getBody()); |
| + | Event.clear(t.formElement); |
| + | } |
| + | |
| + | if (t.formElement) { |
| + | t.formElement.submit = t.formElement._mceOldSubmit; |
| + | t.formElement._mceOldSubmit = null; |
| + | } |
| + | |
| + | t.contentAreaContainer = t.formElement = t.container = t.settings.content_element = t.bodyElement = t.contentDocument = t.contentWindow = null; |
| + | |
| + | if (t.selection) |
| + | t.selection = t.selection.win = t.selection.dom = t.selection.dom.doc = null; |
| + | |
| + | t.destroyed = 1; |
| + | }, |
| + | |
| + | // Internal functions |
| + | |
| + | _addEvents : function() { |
| + | // 'focus', 'blur', 'dblclick', 'beforedeactivate', submit, reset |
| + | var t = this, i, s = t.settings, lo = { |
| + | mouseup : 'onMouseUp', |
| + | mousedown : 'onMouseDown', |
| + | click : 'onClick', |
| + | keyup : 'onKeyUp', |
| + | keydown : 'onKeyDown', |
| + | keypress : 'onKeyPress', |
| + | submit : 'onSubmit', |
| + | reset : 'onReset', |
| + | contextmenu : 'onContextMenu', |
| + | dblclick : 'onDblClick', |
| + | paste : 'onPaste' // Doesn't work in all browsers yet |
| + | }; |
| + | |
| + | function eventHandler(e, o) { |
| + | var ty = e.type; |
| + | |
| + | // Don't fire events when it's removed |
| + | if (t.removed) |
| + | return; |
| + | |
| + | // Generic event handler |
| + | if (t.onEvent.dispatch(t, e, o) !== false) { |
| + | // Specific event handler |
| + | t[lo[e.fakeType || e.type]].dispatch(t, e, o); |
| + | } |
| + | }; |
| + | |
| + | // Add DOM events |
| + | each(lo, function(v, k) { |
| + | switch (k) { |
| + | case 'contextmenu': |
| + | if (tinymce.isOpera) { |
| + | // Fake contextmenu on Opera |
| + | t.dom.bind(t.getBody(), 'mousedown', function(e) { |
| + | if (e.ctrlKey) { |
| + | e.fakeType = 'contextmenu'; |
| + | eventHandler(e); |
| + | } |
| + | }); |
| + | } else |
| + | t.dom.bind(t.getBody(), k, eventHandler); |
| + | break; |
| + | |
| + | case 'paste': |
| + | t.dom.bind(t.getBody(), k, function(e) { |
| + | eventHandler(e); |
| + | }); |
| + | break; |
| + | |
| + | case 'submit': |
| + | case 'reset': |
| + | t.dom.bind(t.getElement().form || DOM.getParent(t.id, 'form'), k, eventHandler); |
| + | break; |
| + | |
| + | default: |
| + | t.dom.bind(s.content_editable ? t.getBody() : t.getDoc(), k, eventHandler); |
| + | } |
| + | }); |
| + | |
| + | t.dom.bind(s.content_editable ? t.getBody() : (isGecko ? t.getDoc() : t.getWin()), 'focus', function(e) { |
| + | t.focus(true); |
| + | }); |
| + | |
| + | |
| + | // Fixes bug where a specified document_base_uri could result in broken images |
| + | // This will also fix drag drop of images in Gecko |
| + | if (tinymce.isGecko) { |
| + | // Convert all images to absolute URLs |
| + | /* t.onSetContent.add(function(ed, o) { |
| + | each(ed.dom.select('img'), function(e) { |
| + | var v; |
| + | |
| + | if (v = e.getAttribute('_mce_src')) |
| + | e.src = t.documentBaseURI.toAbsolute(v); |
| + | }) |
| + | });*/ |
| + | |
| + | t.dom.bind(t.getDoc(), 'DOMNodeInserted', function(e) { |
| + | var v; |
| + | |
| + | e = e.target; |
| + | |
| + | if (e.nodeType === 1 && e.nodeName === 'IMG' && (v = e.getAttribute('_mce_src'))) |
| + | e.src = t.documentBaseURI.toAbsolute(v); |
| + | }); |
| + | } |
| + | |
| + | // Set various midas options in Gecko |
| + | if (isGecko) { |
| + | function setOpts() { |
| + | var t = this, d = t.getDoc(), s = t.settings; |
| + | |
| + | if (isGecko && !s.readonly) { |
| + | if (t._isHidden()) { |
| + | try { |
| + | if (!s.content_editable) |
| + | d.designMode = 'On'; |
| + | } catch (ex) { |
| + | // Fails if it's hidden |
| + | } |
| + | } |
| + | |
| + | try { |
| + | // Try new Gecko method |
| + | d.execCommand("styleWithCSS", 0, false); |
| + | } catch (ex) { |
| + | // Use old method |
| + | if (!t._isHidden()) |
| + | try {d.execCommand("useCSS", 0, true);} catch (ex) {} |
| + | } |
| + | |
| + | if (!s.table_inline_editing) |
| + | try {d.execCommand('enableInlineTableEditing', false, false);} catch (ex) {} |
| + | |
| + | if (!s.object_resizing) |
| + | try {d.execCommand('enableObjectResizing', false, false);} catch (ex) {} |
| + | } |
| + | }; |
| + | |
| + | t.onBeforeExecCommand.add(setOpts); |
| + | t.onMouseDown.add(setOpts); |
| + | } |
| + | |
| + | // Workaround for bug, http://bugs.webkit.org/show_bug.cgi?id=12250 |
| + | // WebKit can't even do simple things like selecting an image |
| + | // This also fixes so it's possible to select mceItemAnchors |
| + | if (tinymce.isWebKit) { |
| + | t.onClick.add(function(ed, e) { |
| + | e = e.target; |
| + | |
| + | // Needs tobe the setBaseAndExtend or it will fail to select floated images |
| + | if (e.nodeName == 'IMG' || (e.nodeName == 'A' && t.dom.hasClass(e, 'mceItemAnchor'))) |
| + | t.selection.getSel().setBaseAndExtent(e, 0, e, 1); |
| + | }); |
| + | } |
| + | |
| + | // Add node change handlers |
| + | t.onMouseUp.add(t.nodeChanged); |
| + | //t.onClick.add(t.nodeChanged); |
| + | t.onKeyUp.add(function(ed, e) { |
| + | var c = e.keyCode; |
| + | |
| + | if ((c >= 33 && c <= 36) || (c >= 37 && c <= 40) || c == 13 || c == 45 || c == 46 || c == 8 || (tinymce.isMac && (c == 91 || c == 93)) || e.ctrlKey) |
| + | t.nodeChanged(); |
| + | }); |
| + | |
| + | // Add reset handler |
| + | t.onReset.add(function() { |
| + | t.setContent(t.startContent, {format : 'raw'}); |
| + | }); |
| + | |
| + | // Add shortcuts |
| + | if (s.custom_shortcuts) { |
| + | if (s.custom_undo_redo_keyboard_shortcuts) { |
| + | t.addShortcut('ctrl+z', t.getLang('undo_desc'), 'Undo'); |
| + | t.addShortcut('ctrl+y', t.getLang('redo_desc'), 'Redo'); |
| + | } |
| + | |
| + | // Add default shortcuts for gecko |
| + | t.addShortcut('ctrl+b', t.getLang('bold_desc'), 'Bold'); |
| + | t.addShortcut('ctrl+i', t.getLang('italic_desc'), 'Italic'); |
| + | t.addShortcut('ctrl+u', t.getLang('underline_desc'), 'Underline'); |
| + | |
| + | // BlockFormat shortcuts keys |
| + | for (i=1; i<=6; i++) |
| + | t.addShortcut('ctrl+' + i, '', ['FormatBlock', false, 'h' + i]); |
| + | |
| + | t.addShortcut('ctrl+7', '', ['FormatBlock', false, '<p>']); |
| + | t.addShortcut('ctrl+8', '', ['FormatBlock', false, '<div>']); |
| + | t.addShortcut('ctrl+9', '', ['FormatBlock', false, '<address>']); |
| + | |
| + | function find(e) { |
| + | var v = null; |
| + | |
| + | if (!e.altKey && !e.ctrlKey && !e.metaKey) |
| + | return v; |
| + | |
| + | each(t.shortcuts, function(o) { |
| + | if (tinymce.isMac && o.ctrl != e.metaKey) |
| + | return; |
| + | else if (!tinymce.isMac && o.ctrl != e.ctrlKey) |
| + | return; |
| + | |
| + | if (o.alt != e.altKey) |
| + | return; |
| + | |
| + | if (o.shift != e.shiftKey) |
| + | return; |
| + | |
| + | if (e.keyCode == o.keyCode || (e.charCode && e.charCode == o.charCode)) { |
| + | v = o; |
| + | return false; |
| + | } |
| + | }); |
| + | |
| + | return v; |
| + | }; |
| + | |
| + | t.onKeyUp.add(function(ed, e) { |
| + | var o = find(e); |
| + | |
| + | if (o) |
| + | return Event.cancel(e); |
| + | }); |
| + | |
| + | t.onKeyPress.add(function(ed, e) { |
| + | var o = find(e); |
| + | |
| + | if (o) |
| + | return Event.cancel(e); |
| + | }); |
| + | |
| + | t.onKeyDown.add(function(ed, e) { |
| + | var o = find(e); |
| + | |
| + | if (o) { |
| + | o.func.call(o.scope); |
| + | return Event.cancel(e); |
| + | } |
| + | }); |
| + | } |
| + | |
| + | if (tinymce.isIE) { |
| + | // Fix so resize will only update the width and height attributes not the styles of an image |
| + | // It will also block mceItemNoResize items |
| + | t.dom.bind(t.getDoc(), 'controlselect', function(e) { |
| + | var re = t.resizeInfo, cb; |
| + | |
| + | e = e.target; |
| + | |
| + | // Don't do this action for non image elements |
| + | if (e.nodeName !== 'IMG') |
| + | return; |
| + | |
| + | if (re) |
| + | t.dom.unbind(re.node, re.ev, re.cb); |
| + | |
| + | if (!t.dom.hasClass(e, 'mceItemNoResize')) { |
| + | ev = 'resizeend'; |
| + | cb = t.dom.bind(e, ev, function(e) { |
| + | var v; |
| + | |
| + | e = e.target; |
| + | |
| + | if (v = t.dom.getStyle(e, 'width')) { |
| + | t.dom.setAttrib(e, 'width', v.replace(/[^0-9%]+/g, '')); |
| + | t.dom.setStyle(e, 'width', ''); |
| + | } |
| + | |
| + | if (v = t.dom.getStyle(e, 'height')) { |
| + | t.dom.setAttrib(e, 'height', v.replace(/[^0-9%]+/g, '')); |
| + | t.dom.setStyle(e, 'height', ''); |
| + | } |
| + | }); |
| + | } else { |
| + | ev = 'resizestart'; |
| + | cb = t.dom.bind(e, 'resizestart', Event.cancel, Event); |
| + | } |
| + | |
| + | re = t.resizeInfo = { |
| + | node : e, |
| + | ev : ev, |
| + | cb : cb |
| + | }; |
| + | }); |
| + | |
| + | t.onKeyDown.add(function(ed, e) { |
| + | switch (e.keyCode) { |
| + | case 8: |
| + | // Fix IE control + backspace browser bug |
| + | if (t.selection.getRng().item) { |
| + | ed.dom.remove(t.selection.getRng().item(0)); |
| + | return Event.cancel(e); |
| + | } |
| + | } |
| + | }); |
| + | |
| + | /*if (t.dom.boxModel) { |
| + | t.getBody().style.height = '100%'; |
| + | |
| + | Event.add(t.getWin(), 'resize', function(e) { |
| + | var docElm = t.getDoc().documentElement; |
| + | |
| + | docElm.style.height = (docElm.offsetHeight - 10) + 'px'; |
| + | }); |
| + | }*/ |
| + | } |
| + | |
| + | if (tinymce.isOpera) { |
| + | t.onClick.add(function(ed, e) { |
| + | Event.prevent(e); |
| + | }); |
| + | } |
| + | |
| + | // Add custom undo/redo handlers |
| + | if (s.custom_undo_redo) { |
| + | function addUndo() { |
| + | t.undoManager.typing = 0; |
| + | t.undoManager.add(); |
| + | }; |
| + | |
| + | t.dom.bind(t.getDoc(), 'focusout', function(e) { |
| + | if (!t.removed && t.undoManager.typing) |
| + | addUndo(); |
| + | }); |
| + | |
| + | t.onKeyUp.add(function(ed, e) { |
| + | if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45 || e.ctrlKey) |
| + | addUndo(); |
| + | }); |
| + | |
| + | t.onKeyDown.add(function(ed, e) { |
| + | var rng, parent, bookmark; |
| + | |
| + | // IE has a really odd bug where the DOM might include an node that doesn't have |
| + | // a proper structure. If you try to access nodeValue it would throw an illegal value exception. |
| + | // This seems to only happen when you delete contents and it seems to be avoidable if you refresh the element |
| + | // after you delete contents from it. See: #3008923 |
| + | if (isIE && e.keyCode == 46) { |
| + | rng = t.selection.getRng(); |
| + | |
| + | if (rng.parentElement) { |
| + | parent = rng.parentElement(); |
| + | |
| + | // Select next word when ctrl key is used in combo with delete |
| + | if (e.ctrlKey) { |
| + | rng.moveEnd('word', 1); |
| + | rng.select(); |
| + | } |
| + | |
| + | // Delete contents |
| + | t.selection.getSel().clear(); |
| + | |
| + | // Check if we are within the same parent |
| + | if (rng.parentElement() == parent) { |
| + | bookmark = t.selection.getBookmark(); |
| + | |
| + | try { |
| + | // Update the HTML and hopefully it will remove the artifacts |
| + | parent.innerHTML = parent.innerHTML; |
| + | } catch (ex) { |
| + | // And since it's IE it can sometimes produce an unknown runtime error |
| + | } |
| + | |
| + | // Restore the caret position |
| + | t.selection.moveToBookmark(bookmark); |
| + | } |
| + | |
| + | // Block the default delete behavior since it might be broken |
| + | e.preventDefault(); |
| + | return; |
| + | } |
| + | } |
| + | |
| + | // Is caracter positon keys |
| + | if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45) { |
| + | if (t.undoManager.typing) |
| + | addUndo(); |
| + | |
| + | return; |
| + | } |
| + | |
| + | if (!t.undoManager.typing) { |
| + | t.undoManager.add(); |
| + | t.undoManager.typing = 1; |
| + | } |
| + | }); |
| + | |
| + | t.onMouseDown.add(function() { |
| + | if (t.undoManager.typing) |
| + | addUndo(); |
| + | }); |
| + | } |
| + | }, |
| + | |
| + | _isHidden : function() { |
| + | var s; |
| + | |
| + | if (!isGecko) |
| + | return 0; |
| + | |
| + | // Weird, wheres that cursor selection? |
| + | s = this.selection.getSel(); |
| + | return (!s || !s.rangeCount || s.rangeCount == 0); |
| + | }, |
| + | |
| + | // Fix for bug #1867292 |
| + | _fixNesting : function(s) { |
| + | var d = [], i; |
| + | |
| + | s = s.replace(/<(\/)?([^\s>]+)[^>]*?>/g, function(a, b, c) { |
| + | var e; |
| + | |
| + | // Handle end element |
| + | if (b === '/') { |
| + | if (!d.length) |
| + | return ''; |
| + | |
| + | if (c !== d[d.length - 1].tag) { |
| + | for (i=d.length - 1; i>=0; i--) { |
| + | if (d[i].tag === c) { |
| + | d[i].close = 1; |
| + | break; |
| + | } |
| + | } |
| + | |
| + | return ''; |
| + | } else { |
| + | d.pop(); |
| + | |
| + | if (d.length && d[d.length - 1].close) { |
| + | a = a + '</' + d[d.length - 1].tag + '>'; |
| + | d.pop(); |
| + | } |
| + | } |
| + | } else { |
| + | // Ignore these |
| + | if (/^(br|hr|input|meta|img|link|param)$/i.test(c)) |
| + | return a; |
| + | |
| + | // Ignore closed ones |
| + | if (/\/>$/.test(a)) |
| + | return a; |
| + | |
| + | d.push({tag : c}); // Push start element |
| + | } |
| + | |
| + | return a; |
| + | }); |
| + | |
| + | // End all open tags |
| + | for (i=d.length - 1; i>=0; i--) |
| + | s += '</' + d[i].tag + '>'; |
| + | |
| + | return s; |
| + | } |
| + | }); |
| + | })(tinymce); |
| + | |
| + | (function(tinymce) { |
| + | // Added for compression purposes |
| + | var each = tinymce.each, undefined, TRUE = true, FALSE = false; |
| + | |
| + | tinymce.EditorCommands = function(editor) { |
| + | var dom = editor.dom, |
| + | selection = editor.selection, |
| + | commands = {state: {}, exec : {}, value : {}}, |
| + | settings = editor.settings, |
| + | bookmark; |
| + | |
| + | function execCommand(command, ui, value) { |
| + | var func; |
| + | |
| + | command = command.toLowerCase(); |
| + | if (func = commands.exec[command]) { |
| + | func(command, ui, value); |
| + | return TRUE; |
| + | } |
| + | |
| + | return FALSE; |
| + | }; |
| + | |
| + | function queryCommandState(command) { |
| + | var func; |
| + | |
| + | command = command.toLowerCase(); |
| + | if (func = commands.state[command]) |
| + | return func(command); |
| + | |
| + | return -1; |
| + | }; |
| + | |
| + | function queryCommandValue(command) { |
| + | var func; |
| + | |
| + | command = command.toLowerCase(); |
| + | if (func = commands.value[command]) |
| + | return func(command); |
| + | |
| + | return FALSE; |
| + | }; |
| + | |
| + | function addCommands(command_list, type) { |
| + | type = type || 'exec'; |
| + | |
| + | each(command_list, function(callback, command) { |
| + | each(command.toLowerCase().split(','), function(command) { |
| + | commands[type][command] = callback; |
| + | }); |
| + | }); |
| + | }; |
| + | |
| + | // Expose public methods |
| + | tinymce.extend(this, { |
| + | execCommand : execCommand, |
| + | queryCommandState : queryCommandState, |
| + | queryCommandValue : queryCommandValue, |
| + | addCommands : addCommands |
| + | }); |
| + | |
| + | // Private methods |
| + | |
| + | function execNativeCommand(command, ui, value) { |
| + | if (ui === undefined) |
| + | ui = FALSE; |
| + | |
| + | if (value === undefined) |
| + | value = null; |
| + | |
| + | return editor.getDoc().execCommand(command, ui, value); |
| + | }; |
| + | |
| + | function isFormatMatch(name) { |
| + | return editor.formatter.match(name); |
| + | }; |
| + | |
| + | function toggleFormat(name, value) { |
| + | editor.formatter.toggle(name, value ? {value : value} : undefined); |
| + | }; |
| + | |
| + | function storeSelection(type) { |
| + | bookmark = selection.getBookmark(type); |
| + | }; |
| + | |
| + | function restoreSelection() { |
| + | selection.moveToBookmark(bookmark); |
| + | }; |
| + | |
| + | // Add execCommand overrides |
| + | addCommands({ |
| + | // Ignore these, added for compatibility |
| + | 'mceResetDesignMode,mceBeginUndoLevel' : function() {}, |
| + | |
| + | // Add undo manager logic |
| + | 'mceEndUndoLevel,mceAddUndoLevel' : function() { |
| + | editor.undoManager.add(); |
| + | }, |
| + | |
| + | 'Cut,Copy,Paste' : function(command) { |
| + | var doc = editor.getDoc(), failed; |
| + | |
| + | // Try executing the native command |
| + | try { |
| + | execNativeCommand(command); |
| + | } catch (ex) { |
| + | // Command failed |
| + | failed = TRUE; |
| + | } |
| + | |
| + | // Present alert message about clipboard access not being available |
| + | if (failed || !doc.queryCommandSupported(command)) { |
| + | if (tinymce.isGecko) { |
| + | editor.windowManager.confirm(editor.getLang('clipboard_msg'), function(state) { |
| + | if (state) |
| + | open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', '_blank'); |
| + | }); |
| + | } else |
| + | editor.windowManager.alert(editor.getLang('clipboard_no_support')); |
| + | } |
| + | }, |
| + | |
| + | // Override unlink command |
| + | unlink : function(command) { |
| + | if (selection.isCollapsed()) |
| + | selection.select(selection.getNode()); |
| + | |
| + | execNativeCommand(command); |
| + | selection.collapse(FALSE); |
| + | }, |
| + | |
| + | // Override justify commands to use the text formatter engine |
| + | 'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull' : function(command) { |
| + | var align = command.substring(7); |
| + | |
| + | // Remove all other alignments first |
| + | each('left,center,right,full'.split(','), function(name) { |
| + | if (align != name) |
| + | editor.formatter.remove('align' + name); |
| + | }); |
| + | |
| + | toggleFormat('align' + align); |
| + | }, |
| + | |
| + | // Override list commands to fix WebKit bug |
| + | 'InsertUnorderedList,InsertOrderedList' : function(command) { |
| + | var listElm, listParent; |
| + | |
| + | execNativeCommand(command); |
| + | |
| + | // WebKit produces lists within block elements so we need to split them |
| + | // we will replace the native list creation logic to custom logic later on |
| + | // TODO: Remove this when the list creation logic is removed |
| + | listElm = dom.getParent(selection.getNode(), 'ol,ul'); |
| + | if (listElm) { |
| + | listParent = listElm.parentNode; |
| + | |
| + | // If list is within a text block then split that block |
| + | if (/^(H[1-6]|P|ADDRESS|PRE)$/.test(listParent.nodeName)) { |
| + | storeSelection(); |
| + | dom.split(listParent, listElm); |
| + | restoreSelection(); |
| + | } |
| + | } |
| + | }, |
| + | |
| + | // Override commands to use the text formatter engine |
| + | 'Bold,Italic,Underline,Strikethrough' : function(command) { |
| + | toggleFormat(command); |
| + | }, |
| + | |
| + | // Override commands to use the text formatter engine |
| + | 'ForeColor,HiliteColor,FontName' : function(command, ui, value) { |
| + | toggleFormat(command, value); |
| + | }, |
| + | |
| + | FontSize : function(command, ui, value) { |
| + | var fontClasses, fontSizes; |
| + | |
| + | // Convert font size 1-7 to styles |
| + | if (value >= 1 && value <= 7) { |
| + | fontSizes = tinymce.explode(settings.font_size_style_values); |
| + | fontClasses = tinymce.explode(settings.font_size_classes); |
| + | |
| + | if (fontClasses) |
| + | value = fontClasses[value - 1] || value; |
| + | else |
| + | value = fontSizes[value - 1] || value; |
| + | } |
| + | |
| + | toggleFormat(command, value); |
| + | }, |
| + | |
| + | RemoveFormat : function(command) { |
| + | editor.formatter.remove(command); |
| + | }, |
| + | |
| + | mceBlockQuote : function(command) { |
| + | toggleFormat('blockquote'); |
| + | }, |
| + | |
| + | FormatBlock : function(command, ui, value) { |
| + | return toggleFormat(value || 'p'); |
| + | }, |
| + | |
| + | mceCleanup : function() { |
| + | var bookmark = selection.getBookmark(); |
| + | |
| + | editor.setContent(editor.getContent({cleanup : TRUE}), {cleanup : TRUE}); |
| + | |
| + | selection.moveToBookmark(bookmark); |
| + | }, |
| + | |
| + | mceRemoveNode : function(command, ui, value) { |
| + | var node = value || selection.getNode(); |
| + | |
| + | // Make sure that the body node isn't removed |
| + | if (node != editor.getBody()) { |
| + | storeSelection(); |
| + | editor.dom.remove(node, TRUE); |
| + | restoreSelection(); |
| + | } |
| + | }, |
| + | |
| + | mceSelectNodeDepth : function(command, ui, value) { |
| + | var counter = 0; |
| + | |
| + | dom.getParent(selection.getNode(), function(node) { |
| + | if (node.nodeType == 1 && counter++ == value) { |
| + | selection.select(node); |
| + | return FALSE; |
| + | } |
| + | }, editor.getBody()); |
| + | }, |
| + | |
| + | mceSelectNode : function(command, ui, value) { |
| + | selection.select(value); |
| + | }, |
| + | |
| + | mceInsertContent : function(command, ui, value) { |
| + | selection.setContent(value); |
| + | }, |
| + | |
| + | mceInsertRawHTML : function(command, ui, value) { |
| + | selection.setContent('tiny_mce_marker'); |
| + | editor.setContent(editor.getContent().replace(/tiny_mce_marker/g, value)); |
| + | }, |
| + | |
| + | mceSetContent : function(command, ui, value) { |
| + | editor.setContent(value); |
| + | }, |
| + | |
| + | 'Indent,Outdent' : function(command) { |
| + | var intentValue, indentUnit, value; |
| + | |
| + | // Setup indent level |
| + | intentValue = settings.indentation; |
| + | indentUnit = /[a-z%]+$/i.exec(intentValue); |
| + | intentValue = parseInt(intentValue); |
| + | |
| + | if (!queryCommandState('InsertUnorderedList') && !queryCommandState('InsertOrderedList')) { |
| + | each(selection.getSelectedBlocks(), function(element) { |
| + | if (command == 'outdent') { |
| + | value = Math.max(0, parseInt(element.style.paddingLeft || 0) - intentValue); |
| + | dom.setStyle(element, 'paddingLeft', value ? value + indentUnit : ''); |
| + | } else |
| + | dom.setStyle(element, 'paddingLeft', (parseInt(element.style.paddingLeft || 0) + intentValue) + indentUnit); |
| + | }); |
| + | } else |
| + | execNativeCommand(command); |
| + | }, |
| + | |
| + | mceRepaint : function() { |
| + | var bookmark; |
| + | |
| + | if (tinymce.isGecko) { |
| + | try { |
| + | storeSelection(TRUE); |
| + | |
| + | if (selection.getSel()) |
| + | selection.getSel().selectAllChildren(editor.getBody()); |
| + | |
| + | selection.collapse(TRUE); |
| + | restoreSelection(); |
| + | } catch (ex) { |
| + | // Ignore |
| + | } |
| + | } |
| + | }, |
| + | |
| + | mceToggleFormat : function(command, ui, value) { |
| + | editor.formatter.toggle(value); |
| + | }, |
| + | |
| + | InsertHorizontalRule : function() { |
| + | selection.setContent('<hr />'); |
| + | }, |
| + | |
| + | mceToggleVisualAid : function() { |
| + | editor.hasVisual = !editor.hasVisual; |
| + | editor.addVisual(); |
| + | }, |
| + | |
| + | mceReplaceContent : function(command, ui, value) { |
| + | selection.setContent(value.replace(/\{\$selection\}/g, selection.getContent({format : 'text'}))); |
| + | }, |
| + | |
| + | mceInsertLink : function(command, ui, value) { |
| + | var link = dom.getParent(selection.getNode(), 'a'); |
| + | |
| + | if (tinymce.is(value, 'string')) |
| + | value = {href : value}; |
| + | |
| + | if (!link) { |
| + | execNativeCommand('CreateLink', FALSE, 'javascript:mctmp(0);'); |
| + | each(dom.select('a[href=javascript:mctmp(0);]'), function(link) { |
| + | dom.setAttribs(link, value); |
| + | }); |
| + | } else { |
| + | if (value.href) |
| + | dom.setAttribs(link, value); |
| + | else |
| + | editor.dom.remove(link, TRUE); |
| + | } |
| + | }, |
| + | |
| + | selectAll : function() { |
| + | var root = dom.getRoot(), rng = dom.createRng(); |
| + | |
| + | rng.setStart(root, 0); |
| + | rng.setEnd(root, root.childNodes.length); |
| + | |
| + | editor.selection.setRng(rng); |
| + | } |
| + | }); |
| + | |
| + | // Add queryCommandState overrides |
| + | addCommands({ |
| + | // Override justify commands |
| + | 'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull' : function(command) { |
| + | return isFormatMatch('align' + command.substring(7)); |
| + | }, |
| + | |
| + | 'Bold,Italic,Underline,Strikethrough' : function(command) { |
| + | return isFormatMatch(command); |
| + | }, |
| + | |
| + | mceBlockQuote : function() { |
| + | return isFormatMatch('blockquote'); |
| + | }, |
| + | |
| + | Outdent : function() { |
| + | var node; |
| + | |
| + | if (settings.inline_styles) { |
| + | if ((node = dom.getParent(selection.getStart(), dom.isBlock)) && parseInt(node.style.paddingLeft) > 0) |
| + | return TRUE; |
| + | |
| + | if ((node = dom.getParent(selection.getEnd(), dom.isBlock)) && parseInt(node.style.paddingLeft) > 0) |
| + | return TRUE; |
| + | } |
| + | |
| + | return queryCommandState('InsertUnorderedList') || queryCommandState('InsertOrderedList') || (!settings.inline_styles && !!dom.getParent(selection.getNode(), 'BLOCKQUOTE')); |
| + | }, |
| + | |
| + | 'InsertUnorderedList,InsertOrderedList' : function(command) { |
| + | return dom.getParent(selection.getNode(), command == 'insertunorderedlist' ? 'UL' : 'OL'); |
| + | } |
| + | }, 'state'); |
| + | |
| + | // Add queryCommandValue overrides |
| + | addCommands({ |
| + | 'FontSize,FontName' : function(command) { |
| + | var value = 0, parent; |
| + | |
| + | if (parent = dom.getParent(selection.getNode(), 'span')) { |
| + | if (command == 'fontsize') |
| + | value = parent.style.fontSize; |
| + | else |
| + | value = parent.style.fontFamily.replace(/, /g, ',').replace(/[\'\"]/g, '').toLowerCase(); |
| + | } |
| + | |
| + | return value; |
| + | } |
| + | }, 'value'); |
| + | |
| + | // Add undo manager logic |
| + | if (settings.custom_undo_redo) { |
| + | addCommands({ |
| + | Undo : function() { |
| + | editor.undoManager.undo(); |
| + | }, |
| + | |
| + | Redo : function() { |
| + | editor.undoManager.redo(); |
| + | } |
| + | }); |
| + | } |
| + | }; |
| + | })(tinymce); |
| + | (function(tinymce) { |
| + | var Dispatcher = tinymce.util.Dispatcher; |
| + | |
| + | tinymce.UndoManager = function(editor) { |
| + | var self, index = 0, data = []; |
| + | |
| + | function getContent() { |
| + | return tinymce.trim(editor.getContent({format : 'raw', no_events : 1})); |
| + | }; |
| + | |
| + | return self = { |
| + | typing : 0, |
| + | |
| + | onAdd : new Dispatcher(self), |
| + | onUndo : new Dispatcher(self), |
| + | onRedo : new Dispatcher(self), |
| + | |
| + | add : function(level) { |
| + | var i, settings = editor.settings, lastLevel; |
| + | |
| + | level = level || {}; |
| + | level.content = getContent(); |
| + | |
| + | // Add undo level if needed |
| + | lastLevel = data[index]; |
| + | if (lastLevel && lastLevel.content == level.content) { |
| + | if (index > 0 || data.length == 1) |
| + | return null; |
| + | } |
| + | |
| + | // Time to compress |
| + | if (settings.custom_undo_redo_levels) { |
| + | if (data.length > settings.custom_undo_redo_levels) { |
| + | for (i = 0; i < data.length - 1; i++) |
| + | data[i] = data[i + 1]; |
| + | |
| + | data.length--; |
| + | index = data.length; |
| + | } |
| + | } |
| + | |
| + | // Get a non intrusive normalized bookmark |
| + | level.bookmark = editor.selection.getBookmark(2, true); |
| + | |
| + | // Crop array if needed |
| + | if (index < data.length - 1) { |
| + | // Treat first level as initial |
| + | if (index == 0) |
| + | data = []; |
| + | else |
| + | data.length = index + 1; |
| + | } |
| + | |
| + | data.push(level); |
| + | index = data.length - 1; |
| + | |
| + | self.onAdd.dispatch(self, level); |
| + | editor.isNotDirty = 0; |
| + | |
| + | return level; |
| + | }, |
| + | |
| + | undo : function() { |
| + | var level, i; |
| + | |
| + | if (self.typing) { |
| + | self.add(); |
| + | self.typing = 0; |
| + | } |
| + | |
| + | if (index > 0) { |
| + | level = data[--index]; |
| + | |
| + | editor.setContent(level.content, {format : 'raw'}); |
| + | editor.selection.moveToBookmark(level.bookmark); |
| + | |
| + | self.onUndo.dispatch(self, level); |
| + | } |
| + | |
| + | return level; |
| + | }, |
| + | |
| + | redo : function() { |
| + | var level; |
| + | |
| + | if (index < data.length - 1) { |
| + | level = data[++index]; |
| + | |
| + | editor.setContent(level.content, {format : 'raw'}); |
| + | editor.selection.moveToBookmark(level.bookmark); |
| + | |
| + | self.onRedo.dispatch(self, level); |
| + | } |
| + | |
| + | return level; |
| + | }, |
| + | |
| + | clear : function() { |
| + | data = []; |
| + | index = self.typing = 0; |
| + | }, |
| + | |
| + | hasUndo : function() { |
| + | return index > 0 || self.typing; |
| + | }, |
| + | |
| + | hasRedo : function() { |
| + | return index < data.length - 1; |
| + | } |
| + | }; |
| + | }; |
| + | })(tinymce); |
| + | |
| + | (function(tinymce) { |
| + | // Shorten names |
| + | var Event = tinymce.dom.Event, |
| + | isIE = tinymce.isIE, |
| + | isGecko = tinymce.isGecko, |
| + | isOpera = tinymce.isOpera, |
| + | each = tinymce.each, |
| + | extend = tinymce.extend, |
| + | TRUE = true, |
| + | FALSE = false; |
| + | |
| + | function cloneFormats(node) { |
| + | var clone, temp, inner; |
| + | |
| + | do { |
| + | if (/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(node.nodeName)) { |
| + | if (clone) { |
| + | temp = node.cloneNode(false); |
| + | temp.appendChild(clone); |
| + | clone = temp; |
| + | } else { |
| + | clone = inner = node.cloneNode(false); |
| + | } |
| + | |
| + | clone.removeAttribute('id'); |
| + | } |
| + | } while (node = node.parentNode); |
| + | |
| + | if (clone) |
| + | return {wrapper : clone, inner : inner}; |
| + | }; |
| + | |
| + | // Checks if the selection/caret is at the end of the specified block element |
| + | function isAtEnd(rng, par) { |
| + | var rng2 = par.ownerDocument.createRange(); |
| + | |
| + | rng2.setStart(rng.endContainer, rng.endOffset); |
| + | rng2.setEndAfter(par); |
| + | |
| + | // Get number of characters to the right of the cursor if it's zero then we are at the end and need to merge the next block element |
| + | return rng2.cloneContents().textContent.length == 0; |
| + | }; |
| + | |
| + | function isEmpty(n) { |
| + | n = n.innerHTML; |
| + | |
| + | n = n.replace(/<(img|hr|table|input|select|textarea)[ \>]/gi, '-'); // Keep these convert them to - chars |
| + | n = n.replace(/<[^>]+>/g, ''); // Remove all tags |
| + | |
| + | return n.replace(/[ \u00a0\t\r\n]+/g, '') == ''; |
| + | }; |
| + | |
| + | function splitList(selection, dom, li) { |
| + | var listBlock, block; |
| + | |
| + | if (isEmpty(li)) { |
| + | listBlock = dom.getParent(li, 'ul,ol'); |
| + | |
| + | if (!dom.getParent(listBlock.parentNode, 'ul,ol')) { |
| + | dom.split(listBlock, li); |
| + | block = dom.create('p', 0, '<br _mce_bogus="1" />'); |
| + | dom.replace(block, li); |
| + | selection.select(block, 1); |
| + | } |
| + | |
| + | return FALSE; |
| + | } |
| + | |
| + | return TRUE; |
| + | }; |
| + | |
| + | tinymce.create('tinymce.ForceBlocks', { |
| + | ForceBlocks : function(ed) { |
| + | var t = this, s = ed.settings, elm; |
| + | |
| + | t.editor = ed; |
| + | t.dom = ed.dom; |
| + | elm = (s.forced_root_block || 'p').toLowerCase(); |
| + | s.element = elm.toUpperCase(); |
| + | |
| + | ed.onPreInit.add(t.setup, t); |
| + | |
| + | t.reOpera = new RegExp('(\\u00a0| | )<\/' + elm + '>', 'gi'); |
| + | t.rePadd = new RegExp('<p( )([^>]+)><\\\/p>|<p( )([^>]+)\\\/>|<p( )([^>]+)>\\s+<\\\/p>|<p><\\\/p>|<p\\\/>|<p>\\s+<\\\/p>'.replace(/p/g, elm), 'gi'); |
| + | t.reNbsp2BR1 = new RegExp('<p( )([^>]+)>[\\s\\u00a0]+<\\\/p>|<p>[\\s\\u00a0]+<\\\/p>'.replace(/p/g, elm), 'gi'); |
| + | t.reNbsp2BR2 = new RegExp('<%p()([^>]+)>( | )<\\\/%p>|<%p>( | )<\\\/%p>'.replace(/%p/g, elm), 'gi'); |
| + | t.reBR2Nbsp = new RegExp('<p( )([^>]+)>\\s*<br \\\/>\\s*<\\\/p>|<p>\\s*<br \\\/>\\s*<\\\/p>'.replace(/p/g, elm), 'gi'); |
| + | |
| + | function padd(ed, o) { |
| + | if (isOpera) |
| + | o.content = o.content.replace(t.reOpera, '</' + elm + '>'); |
| + | |
| + | o.content = o.content.replace(t.rePadd, '<' + elm + '$1$2$3$4$5$6>\u00a0</' + elm + '>'); |
| + | |
| + | if (!isIE && !isOpera && o.set) { |
| + | // Use instead of BR in padded paragraphs |
| + | o.content = o.content.replace(t.reNbsp2BR1, '<' + elm + '$1$2><br /></' + elm + '>'); |
| + | o.content = o.content.replace(t.reNbsp2BR2, '<' + elm + '$1$2><br /></' + elm + '>'); |
| + | } else |
| + | o.content = o.content.replace(t.reBR2Nbsp, '<' + elm + '$1$2>\u00a0</' + elm + '>'); |
| + | }; |
| + | |
| + | ed.onBeforeSetContent.add(padd); |
| + | ed.onPostProcess.add(padd); |
| + | |
| + | if (s.forced_root_block) { |
| + | ed.onInit.add(t.forceRoots, t); |
| + | ed.onSetContent.add(t.forceRoots, t); |
| + | ed.onBeforeGetContent.add(t.forceRoots, t); |
| + | } |
| + | }, |
| + | |
| + | setup : function() { |
| + | var t = this, ed = t.editor, s = ed.settings, dom = ed.dom, selection = ed.selection; |
| + | |
| + | // Force root blocks when typing and when getting output |
| + | if (s.forced_root_block) { |
| + | ed.onBeforeExecCommand.add(t.forceRoots, t); |
| + | ed.onKeyUp.add(t.forceRoots, t); |
| + | ed.onPreProcess.add(t.forceRoots, t); |
| + | } |
| + | |
| + | if (s.force_br_newlines) { |
| + | // Force IE to produce BRs on enter |
| + | if (isIE) { |
| + | ed.onKeyPress.add(function(ed, e) { |
| + | var n; |
| + | |
| + | if (e.keyCode == 13 && selection.getNode().nodeName != 'LI') { |
| + | selection.setContent('<br id="__" /> ', {format : 'raw'}); |
| + | n = dom.get('__'); |
| + | n.removeAttribute('id'); |
| + | selection.select(n); |
| + | selection.collapse(); |
| + | return Event.cancel(e); |
| + | } |
| + | }); |
| + | } |
| + | } |
| + | |
| + | if (s.force_p_newlines) { |
| + | if (!isIE) { |
| + | ed.onKeyPress.add(function(ed, e) { |
| + | if (e.keyCode == 13 && !e.shiftKey && !t.insertPara(e)) |
| + | Event.cancel(e); |
| + | }); |
| + | } else { |
| + | // Ungly hack to for IE to preserve the formatting when you press |
| + | // enter at the end of a block element with formatted contents |
| + | // This logic overrides the browsers default logic with |
| + | // custom logic that enables us to control the output |
| + | tinymce.addUnload(function() { |
| + | t._previousFormats = 0; // Fix IE leak |
| + | }); |
| + | |
| + | ed.onKeyPress.add(function(ed, e) { |
| + | t._previousFormats = 0; |
| + | |
| + | // Clone the current formats, this will later be applied to the new block contents |
| + | if (e.keyCode == 13 && !e.shiftKey && ed.selection.isCollapsed() && s.keep_styles) |
| + | t._previousFormats = cloneFormats(ed.selection.getStart()); |
| + | }); |
| + | |
| + | ed.onKeyUp.add(function(ed, e) { |
| + | // Let IE break the element and the wrap the new caret location in the previous formats |
| + | if (e.keyCode == 13 && !e.shiftKey) { |
| + | var parent = ed.selection.getStart(), fmt = t._previousFormats; |
| + | |
| + | // Parent is an empty block |
| + | if (!parent.hasChildNodes()) { |
| + | parent = dom.getParent(parent, dom.isBlock); |
| + | |
| + | if (parent) { |
| + | parent.innerHTML = ''; |
| + | |
| + | if (t._previousFormats) { |
| + | parent.appendChild(fmt.wrapper); |
| + | fmt.inner.innerHTML = '\uFEFF'; |
| + | } else |
| + | parent.innerHTML = '\uFEFF'; |
| + | |
| + | selection.select(parent, 1); |
| + | ed.getDoc().execCommand('Delete', false, null); |
| + | } |
| + | } |
| + | } |
| + | }); |
| + | } |
| + | |
| + | if (isGecko) { |
| + | ed.onKeyDown.add(function(ed, e) { |
| + | if ((e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) |
| + | t.backspaceDelete(e, e.keyCode == 8); |
| + | }); |
| + | } |
| + | } |
| + | |
| + | // Workaround for missing shift+enter support, http://bugs.webkit.org/show_bug.cgi?id=16973 |
| + | if (tinymce.isWebKit) { |
| + | function insertBr(ed) { |
| + | var rng = selection.getRng(), br, div = dom.create('div', null, ' '), divYPos, vpHeight = dom.getViewPort(ed.getWin()).h; |
| + | |
| + | // Insert BR element |
| + | rng.insertNode(br = dom.create('br')); |
| + | |
| + | // Place caret after BR |
| + | rng.setStartAfter(br); |
| + | rng.setEndAfter(br); |
| + | selection.setRng(rng); |
| + | |
| + | // Could not place caret after BR then insert an nbsp entity and move the caret |
| + | if (selection.getSel().focusNode == br.previousSibling) { |
| + | selection.select(dom.insertAfter(dom.doc.createTextNode('\u00a0'), br)); |
| + | selection.collapse(TRUE); |
| + | } |
| + | |
| + | // Create a temporary DIV after the BR and get the position as it |
| + | // seems like getPos() returns 0 for text nodes and BR elements. |
| + | dom.insertAfter(div, br); |
| + | divYPos = dom.getPos(div).y; |
| + | dom.remove(div); |
| + | |
| + | // Scroll to new position, scrollIntoView can't be used due to bug: http://bugs.webkit.org/show_bug.cgi?id=16117 |
| + | if (divYPos > vpHeight) // It is not necessary to scroll if the DIV is inside the view port. |
| + | ed.getWin().scrollTo(0, divYPos); |
| + | }; |
| + | |
| + | ed.onKeyPress.add(function(ed, e) { |
| + | if (e.keyCode == 13 && (e.shiftKey || (s.force_br_newlines && !dom.getParent(selection.getNode(), 'h1,h2,h3,h4,h5,h6,ol,ul')))) { |
| + | insertBr(ed); |
| + | Event.cancel(e); |
| + | } |
| + | }); |
| + | } |
| + | |
| + | // Padd empty inline elements within block elements |
| + | // For example: <p><strong><em></em></strong></p> becomes <p><strong><em> </em></strong></p> |
| + | ed.onPreProcess.add(function(ed, o) { |
| + | each(dom.select('p,h1,h2,h3,h4,h5,h6,div', o.node), function(p) { |
| + | if (isEmpty(p)) { |
| + | each(dom.select('span,em,strong,b,i', o.node), function(n) { |
| + | if (!n.hasChildNodes()) { |
| + | n.appendChild(ed.getDoc().createTextNode('\u00a0')); |
| + | return FALSE; // Break the loop one padding is enough |
| + | } |
| + | }); |
| + | } |
| + | }); |
| + | }); |
| + | |
| + | // IE specific fixes |
| + | if (isIE) { |
| + | // Replaces IE:s auto generated paragraphs with the specified element name |
| + | if (s.element != 'P') { |
| + | ed.onKeyPress.add(function(ed, e) { |
| + | t.lastElm = selection.getNode().nodeName; |
| + | }); |
| + | |
| + | ed.onKeyUp.add(function(ed, e) { |
| + | var bl, n = selection.getNode(), b = ed.getBody(); |
| + | |
| + | if (b.childNodes.length === 1 && n.nodeName == 'P') { |
| + | n = dom.rename(n, s.element); |
| + | selection.select(n); |
| + | selection.collapse(); |
| + | ed.nodeChanged(); |
| + | } else if (e.keyCode == 13 && !e.shiftKey && t.lastElm != 'P') { |
| + | bl = dom.getParent(n, 'p'); |
| + | |
| + | if (bl) { |
| + | dom.rename(bl, s.element); |
| + | ed.nodeChanged(); |
| + | } |
| + | } |
| + | }); |
| + | } |
| + | } |
| + | }, |
| + | |
| + | find : function(n, t, s) { |
| + | var ed = this.editor, w = ed.getDoc().createTreeWalker(n, 4, null, FALSE), c = -1; |
| + | |
| + | while (n = w.nextNode()) { |
| + | c++; |
| + | |
| + | // Index by node |
| + | if (t == 0 && n == s) |
| + | return c; |
| + | |
| + | // Node by index |
| + | if (t == 1 && c == s) |
| + | return n; |
| + | } |
| + | |
| + | return -1; |
| + | }, |
| + | |
| + | forceRoots : function(ed, e) { |
| + | var t = this, ed = t.editor, b = ed.getBody(), d = ed.getDoc(), se = ed.selection, s = se.getSel(), r = se.getRng(), si = -2, ei, so, eo, tr, c = -0xFFFFFF; |
| + | var nx, bl, bp, sp, le, nl = b.childNodes, i, n, eid; |
| + | |
| + | // Fix for bug #1863847 |
| + | //if (e && e.keyCode == 13) |
| + | // return TRUE; |
| + | |
| + | // Wrap non blocks into blocks |
| + | for (i = nl.length - 1; i >= 0; i--) { |
| + | nx = nl[i]; |
| + | |
| + | // Ignore internal elements |
| + | if (nx.nodeType === 1 && nx.getAttribute('_mce_type')) { |
| + | bl = null; |
| + | continue; |
| + | } |
| + | |
| + | // Is text or non block element |
| + | if (nx.nodeType === 3 || (!t.dom.isBlock(nx) && nx.nodeType !== 8 && !/^(script|mce:script|style|mce:style)$/i.test(nx.nodeName))) { |
| + | if (!bl) { |
| + | // Create new block but ignore whitespace |
| + | if (nx.nodeType != 3 || /[^\s]/g.test(nx.nodeValue)) { |
| + | // Store selection |
| + | if (si == -2 && r) { |
| + | if (!isIE) { |
| + | // If selection is element then mark it |
| + | if (r.startContainer.nodeType == 1 && (n = r.startContainer.childNodes[r.startOffset]) && n.nodeType == 1) { |
| + | // Save the id of the selected element |
| + | eid = n.getAttribute("id"); |
| + | n.setAttribute("id", "__mce"); |
| + | } else { |
| + | // If element is inside body, might not be the case in contentEdiable mode |
| + | if (ed.dom.getParent(r.startContainer, function(e) {return e === b;})) { |
| + | so = r.startOffset; |
| + | eo = r.endOffset; |
| + | si = t.find(b, 0, r.startContainer); |
| + | ei = t.find(b, 0, r.endContainer); |
| + | } |
| + | } |
| + | } else { |
| + | // Force control range into text range |
| + | if (r.item) { |
| + | tr = d.body.createTextRange(); |
| + | tr.moveToElementText(r.item(0)); |
| + | r = tr; |
| + | } |
| + | |
| + | tr = d.body.createTextRange(); |
| + | tr.moveToElementText(b); |
| + | tr.collapse(1); |
| + | bp = tr.move('character', c) * -1; |
| + | |
| + | tr = r.duplicate(); |
| + | tr.collapse(1); |
| + | sp = tr.move('character', c) * -1; |
| + | |
| + | tr = r.duplicate(); |
| + | tr.collapse(0); |
| + | le = (tr.move('character', c) * -1) - sp; |
| + | |
| + | si = sp - bp; |
| + | ei = le; |
| + | } |
| + | } |
| + | |
| + | // Uses replaceChild instead of cloneNode since it removes selected attribute from option elements on IE |
| + | // See: http://support.microsoft.com/kb/829907 |
| + | bl = ed.dom.create(ed.settings.forced_root_block); |
| + | nx.parentNode.replaceChild(bl, nx); |
| + | bl.appendChild(nx); |
| + | } |
| + | } else { |
| + | if (bl.hasChildNodes()) |
| + | bl.insertBefore(nx, bl.firstChild); |
| + | else |
| + | bl.appendChild(nx); |
| + | } |
| + | } else |
| + | bl = null; // Time to create new block |
| + | } |
| + | |
| + | // Restore selection |
| + | if (si != -2) { |
| + | if (!isIE) { |
| + | bl = b.getElementsByTagName(ed.settings.element)[0]; |
| + | r = d.createRange(); |
| + | |
| + | // Select last location or generated block |
| + | if (si != -1) |
| + | r.setStart(t.find(b, 1, si), so); |
| + | else |
| + | r.setStart(bl, 0); |
| + | |
| + | // Select last location or generated block |
| + | if (ei != -1) |
| + | r.setEnd(t.find(b, 1, ei), eo); |
| + | else |
| + | r.setEnd(bl, 0); |
| + | |
| + | if (s) { |
| + | s.removeAllRanges(); |
| + | s.addRange(r); |
| + | } |
| + | } else { |
| + | try { |
| + | r = s.createRange(); |
| + | r.moveToElementText(b); |
| + | r.collapse(1); |
| + | r.moveStart('character', si); |
| + | r.moveEnd('character', ei); |
| + | r.select(); |
| + | } catch (ex) { |
| + | // Ignore |
| + | } |
| + | } |
| + | } else if (!isIE && (n = ed.dom.get('__mce'))) { |
| + | // Restore the id of the selected element |
| + | if (eid) |
| + | n.setAttribute('id', eid); |
| + | else |
| + | n.removeAttribute('id'); |
| + | |
| + | // Move caret before selected element |
| + | r = d.createRange(); |
| + | r.setStartBefore(n); |
| + | r.setEndBefore(n); |
| + | se.setRng(r); |
| + | } |
| + | }, |
| + | |
| + | getParentBlock : function(n) { |
| + | var d = this.dom; |
| + | |
| + | return d.getParent(n, d.isBlock); |
| + | }, |
| + | |
| + | insertPara : function(e) { |
| + | var t = this, ed = t.editor, dom = ed.dom, d = ed.getDoc(), se = ed.settings, s = ed.selection.getSel(), r = s.getRangeAt(0), b = d.body; |
| + | var rb, ra, dir, sn, so, en, eo, sb, eb, bn, bef, aft, sc, ec, n, vp = dom.getViewPort(ed.getWin()), y, ch, car; |
| + | |
| + | // If root blocks are forced then use Operas default behavior since it's really good |
| + | // Removed due to bug: #1853816 |
| + | // if (se.forced_root_block && isOpera) |
| + | // return TRUE; |
| + | |
| + | // Setup before range |
| + | rb = d.createRange(); |
| + | |
| + | // If is before the first block element and in body, then move it into first block element |
| + | rb.setStart(s.anchorNode, s.anchorOffset); |
| + | rb.collapse(TRUE); |
| + | |
| + | // Setup after range |
| + | ra = d.createRange(); |
| + | |
| + | // If is before the first block element and in body, then move it into first block element |
| + | ra.setStart(s.focusNode, s.focusOffset); |
| + | ra.collapse(TRUE); |
| + | |
| + | // Setup start/end points |
| + | dir = rb.compareBoundaryPoints(rb.START_TO_END, ra) < 0; |
| + | sn = dir ? s.anchorNode : s.focusNode; |
| + | so = dir ? s.anchorOffset : s.focusOffset; |
| + | en = dir ? s.focusNode : s.anchorNode; |
| + | eo = dir ? s.focusOffset : s.anchorOffset; |
| + | |
| + | // If selection is in empty table cell |
| + | if (sn === en && /^(TD|TH)$/.test(sn.nodeName)) { |
| + | if (sn.firstChild.nodeName == 'BR') |
| + | dom.remove(sn.firstChild); // Remove BR |
| + | |
| + | // Create two new block elements |
| + | if (sn.childNodes.length == 0) { |
| + | ed.dom.add(sn, se.element, null, '<br />'); |
| + | aft = ed.dom.add(sn, se.element, null, '<br />'); |
| + | } else { |
| + | n = sn.innerHTML; |
| + | sn.innerHTML = ''; |
| + | ed.dom.add(sn, se.element, null, n); |
| + | aft = ed.dom.add(sn, se.element, null, '<br />'); |
| + | } |
| + | |
| + | // Move caret into the last one |
| + | r = d.createRange(); |
| + | r.selectNodeContents(aft); |
| + | r.collapse(1); |
| + | ed.selection.setRng(r); |
| + | |
| + | return FALSE; |
| + | } |
| + | |
| + | // If the caret is in an invalid location in FF we need to move it into the first block |
| + | if (sn == b && en == b && b.firstChild && ed.dom.isBlock(b.firstChild)) { |
| + | sn = en = sn.firstChild; |
| + | so = eo = 0; |
| + | rb = d.createRange(); |
| + | rb.setStart(sn, 0); |
| + | ra = d.createRange(); |
| + | ra.setStart(en, 0); |
| + | } |
| + | |
| + | // Never use body as start or end node |
| + | sn = sn.nodeName == "HTML" ? d.body : sn; // Fix for Opera bug: https://bugs.opera.com/show_bug.cgi?id=273224&comments=yes |
| + | sn = sn.nodeName == "BODY" ? sn.firstChild : sn; |
| + | en = en.nodeName == "HTML" ? d.body : en; // Fix for Opera bug: https://bugs.opera.com/show_bug.cgi?id=273224&comments=yes |
| + | en = en.nodeName == "BODY" ? en.firstChild : en; |
| + | |
| + | // Get start and end blocks |
| + | sb = t.getParentBlock(sn); |
| + | eb = t.getParentBlock(en); |
| + | bn = sb ? sb.nodeName : se.element; // Get block name to create |
| + | |
| + | // Return inside list use default browser behavior |
| + | if (n = t.dom.getParent(sb, 'li,pre')) { |
| + | if (n.nodeName == 'LI') |
| + | return splitList(ed.selection, t.dom, n); |
| + | |
| + | return TRUE; |
| + | } |
| + | |
| + | // If caption or absolute layers then always generate new blocks within |
| + | if (sb && (sb.nodeName == 'CAPTION' || /absolute|relative|fixed/gi.test(dom.getStyle(sb, 'position', 1)))) { |
| + | bn = se.element; |
| + | sb = null; |
| + | } |
| + | |
| + | // If caption or absolute layers then always generate new blocks within |
| + | if (eb && (eb.nodeName == 'CAPTION' || /absolute|relative|fixed/gi.test(dom.getStyle(sb, 'position', 1)))) { |
| + | bn = se.element; |
| + | eb = null; |
| + | } |
| + | |
| + | // Use P instead |
| + | if (/(TD|TABLE|TH|CAPTION)/.test(bn) || (sb && bn == "DIV" && /left|right/gi.test(dom.getStyle(sb, 'float', 1)))) { |
| + | bn = se.element; |
| + | sb = eb = null; |
| + | } |
| + | |
| + | // Setup new before and after blocks |
| + | bef = (sb && sb.nodeName == bn) ? sb.cloneNode(0) : ed.dom.create(bn); |
| + | aft = (eb && eb.nodeName == bn) ? eb.cloneNode(0) : ed.dom.create(bn); |
| + | |
| + | // Remove id from after clone |
| + | aft.removeAttribute('id'); |
| + | |
| + | // Is header and cursor is at the end, then force paragraph under |
| + | if (/^(H[1-6])$/.test(bn) && isAtEnd(r, sb)) |
| + | aft = ed.dom.create(se.element); |
| + | |
| + | // Find start chop node |
| + | n = sc = sn; |
| + | do { |
| + | if (n == b || n.nodeType == 9 || t.dom.isBlock(n) || /(TD|TABLE|TH|CAPTION)/.test(n.nodeName)) |
| + | break; |
| + | |
| + | sc = n; |
| + | } while ((n = n.previousSibling ? n.previousSibling : n.parentNode)); |
| + | |
| + | // Find end chop node |
| + | n = ec = en; |
| + | do { |
| + | if (n == b || n.nodeType == 9 || t.dom.isBlock(n) || /(TD|TABLE|TH|CAPTION)/.test(n.nodeName)) |
| + | break; |
| + | |
| + | ec = n; |
| + | } while ((n = n.nextSibling ? n.nextSibling : n.parentNode)); |
| + | |
| + | // Place first chop part into before block element |
| + | if (sc.nodeName == bn) |
| + | rb.setStart(sc, 0); |
| + | else |
| + | rb.setStartBefore(sc); |
| + | |
| + | rb.setEnd(sn, so); |
| + | bef.appendChild(rb.cloneContents() || d.createTextNode('')); // Empty text node needed for Safari |
| + | |
| + | // Place secnd chop part within new block element |
| + | try { |
| + | ra.setEndAfter(ec); |
| + | } catch(ex) { |
| + | //console.debug(s.focusNode, s.focusOffset); |
| + | } |
| + | |
| + | ra.setStart(en, eo); |
| + | aft.appendChild(ra.cloneContents() || d.createTextNode('')); // Empty text node needed for Safari |
| + | |
| + | // Create range around everything |
| + | r = d.createRange(); |
| + | if (!sc.previousSibling && sc.parentNode.nodeName == bn) { |
| + | r.setStartBefore(sc.parentNode); |
| + | } else { |
| + | if (rb.startContainer.nodeName == bn && rb.startOffset == 0) |
| + | r.setStartBefore(rb.startContainer); |
| + | else |
| + | r.setStart(rb.startContainer, rb.startOffset); |
| + | } |
| + | |
| + | if (!ec.nextSibling && ec.parentNode.nodeName == bn) |
| + | r.setEndAfter(ec.parentNode); |
| + | else |
| + | r.setEnd(ra.endContainer, ra.endOffset); |
| + | |
| + | // Delete and replace it with new block elements |
| + | r.deleteContents(); |
| + | |
| + | if (isOpera) |
| + | ed.getWin().scrollTo(0, vp.y); |
| + | |
| + | // Never wrap blocks in blocks |
| + | if (bef.firstChild && bef.firstChild.nodeName == bn) |
| + | bef.innerHTML = bef.firstChild.innerHTML; |
| + | |
| + | if (aft.firstChild && aft.firstChild.nodeName == bn) |
| + | aft.innerHTML = aft.firstChild.innerHTML; |
| + | |
| + | // Padd empty blocks |
| + | if (isEmpty(bef)) |
| + | bef.innerHTML = '<br />'; |
| + | |
| + | function appendStyles(e, en) { |
| + | var nl = [], nn, n, i; |
| + | |
| + | e.innerHTML = ''; |
| + | |
| + | // Make clones of style elements |
| + | if (se.keep_styles) { |
| + | n = en; |
| + | do { |
| + | // We only want style specific elements |
| + | if (/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(n.nodeName)) { |
| + | nn = n.cloneNode(FALSE); |
| + | dom.setAttrib(nn, 'id', ''); // Remove ID since it needs to be unique |
| + | nl.push(nn); |
| + | } |
| + | } while (n = n.parentNode); |
| + | } |
| + | |
| + | // Append style elements to aft |
| + | if (nl.length > 0) { |
| + | for (i = nl.length - 1, nn = e; i >= 0; i--) |
| + | nn = nn.appendChild(nl[i]); |
| + | |
| + | // Padd most inner style element |
| + | nl[0].innerHTML = isOpera ? ' ' : '<br />'; // Extra space for Opera so that the caret can move there |
| + | return nl[0]; // Move caret to most inner element |
| + | } else |
| + | e.innerHTML = isOpera ? ' ' : '<br />'; // Extra space for Opera so that the caret can move there |
| + | }; |
| + | |
| + | // Fill empty afterblook with current style |
| + | if (isEmpty(aft)) |
| + | car = appendStyles(aft, en); |
| + | |
| + | // Opera needs this one backwards for older versions |
| + | if (isOpera && parseFloat(opera.version()) < 9.5) { |
| + | r.insertNode(bef); |
| + | r.insertNode(aft); |
| + | } else { |
| + | r.insertNode(aft); |
| + | r.insertNode(bef); |
| + | } |
| + | |
| + | // Normalize |
| + | aft.normalize(); |
| + | bef.normalize(); |
| + | |
| + | function first(n) { |
| + | return d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, FALSE).nextNode() || n; |
| + | }; |
| + | |
| + | // Move cursor and scroll into view |
| + | r = d.createRange(); |
| + | r.selectNodeContents(isGecko ? first(car || aft) : car || aft); |
| + | r.collapse(1); |
| + | s.removeAllRanges(); |
| + | s.addRange(r); |
| + | |
| + | // scrollIntoView seems to scroll the parent window in most browsers now including FF 3.0b4 so it's time to stop using it and do it our selfs |
| + | y = ed.dom.getPos(aft).y; |
| + | ch = aft.clientHeight; |
| + | |
| + | // Is element within viewport |
| + | if (y < vp.y || y + ch > vp.y + vp.h) { |
| + | ed.getWin().scrollTo(0, y < vp.y ? y : y - vp.h + 25); // Needs to be hardcoded to roughly one line of text if a huge text block is broken into two blocks |
| + | //console.debug('SCROLL!', 'vp.y: ' + vp.y, 'y' + y, 'vp.h' + vp.h, 'clientHeight' + aft.clientHeight, 'yyy: ' + (y < vp.y ? y : y - vp.h + aft.clientHeight)); |
| + | } |
| + | |
| + | return FALSE; |
| + | }, |
| + | |
| + | backspaceDelete : function(e, bs) { |
| + | var t = this, ed = t.editor, b = ed.getBody(), dom = ed.dom, n, se = ed.selection, r = se.getRng(), sc = r.startContainer, n, w, tn, walker; |
| + | |
| + | // Delete when caret is behind a element doesn't work correctly on Gecko see #3011651 |
| + | if (!bs && r.collapsed && sc.nodeType == 1 && r.startOffset == sc.childNodes.length) { |
| + | walker = new tinymce.dom.TreeWalker(sc.lastChild, sc); |
| + | |
| + | // Walk the dom backwards until we find a text node |
| + | for (n = sc.lastChild; n; n = walker.prev()) { |
| + | if (n.nodeType == 3) { |
| + | r.setStart(n, n.nodeValue.length); |
| + | r.collapse(true); |
| + | se.setRng(r); |
| + | return; |
| + | } |
| + | } |
| + | } |
| + | |
| + | // The caret sometimes gets stuck in Gecko if you delete empty paragraphs |
| + | // This workaround removes the element by hand and moves the caret to the previous element |
| + | if (sc && ed.dom.isBlock(sc) && !/^(TD|TH)$/.test(sc.nodeName) && bs) { |
| + | if (sc.childNodes.length == 0 || (sc.childNodes.length == 1 && sc.firstChild.nodeName == 'BR')) { |
| + | // Find previous block element |
| + | n = sc; |
| + | while ((n = n.previousSibling) && !ed.dom.isBlock(n)) ; |
| + | |
| + | if (n) { |
| + | if (sc != b.firstChild) { |
| + | // Find last text node |
| + | w = ed.dom.doc.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, FALSE); |
| + | while (tn = w.nextNode()) |
| + | n = tn; |
| + | |
| + | // Place caret at the end of last text node |
| + | r = ed.getDoc().createRange(); |
| + | r.setStart(n, n.nodeValue ? n.nodeValue.length : 0); |
| + | r.setEnd(n, n.nodeValue ? n.nodeValue.length : 0); |
| + | se.setRng(r); |
| + | |
| + | // Remove the target container |
| + | ed.dom.remove(sc); |
| + | } |
| + | |
| + | return Event.cancel(e); |
| + | } |
| + | } |
| + | } |
| + | } |
| + | }); |
| + | })(tinymce); |
| + | |
| + | (function(tinymce) { |
| + | // Shorten names |
| + | var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, extend = tinymce.extend; |
| + | |
| + | tinymce.create('tinymce.ControlManager', { |
| + | ControlManager : function(ed, s) { |
| + | var t = this, i; |
| + | |
| + | s = s || {}; |
| + | t.editor = ed; |
| + | t.controls = {}; |
| + | t.onAdd = new tinymce.util.Dispatcher(t); |
| + | t.onPostRender = new tinymce.util.Dispatcher(t); |
| + | t.prefix = s.prefix || ed.id + '_'; |
| + | t._cls = {}; |
| + | |
| + | t.onPostRender.add(function() { |
| + | each(t.controls, function(c) { |
| + | c.postRender(); |
| + | }); |
| + | }); |
| + | }, |
| + | |
| + | get : function(id) { |
| + | return this.controls[this.prefix + id] || this.controls[id]; |
| + | }, |
| + | |
| + | setActive : function(id, s) { |
| + | var c = null; |
| + | |
| + | if (c = this.get(id)) |
| + | c.setActive(s); |
| + | |
| + | return c; |
| + | }, |
| + | |
| + | setDisabled : function(id, s) { |
| + | var c = null; |
| + | |
| + | if (c = this.get(id)) |
| + | c.setDisabled(s); |
| + | |
| + | return c; |
| + | }, |
| + | |
| + | add : function(c) { |
| + | var t = this; |
| + | |
| + | if (c) { |
| + | t.controls[c.id] = c; |
| + | t.onAdd.dispatch(c, t); |
| + | } |
| + | |
| + | return c; |
| + | }, |
| + | |
| + | createControl : function(n) { |
| + | var c, t = this, ed = t.editor; |
| + | |
| + | each(ed.plugins, function(p) { |
| + | if (p.createControl) { |
| + | c = p.createControl(n, t); |
| + | |
| + | if (c) |
| + | return false; |
| + | } |
| + | }); |
| + | |
| + | switch (n) { |
| + | case "|": |
| + | case "separator": |
| + | return t.createSeparator(); |
| + | } |
| + | |
| + | if (!c && ed.buttons && (c = ed.buttons[n])) |
| + | return t.createButton(n, c); |
| + | |
| + | return t.add(c); |
| + | }, |
| + | |
| + | createDropMenu : function(id, s, cc) { |
| + | var t = this, ed = t.editor, c, bm, v, cls; |
| + | |
| + | s = extend({ |
| + | 'class' : 'mceDropDown', |
| + | constrain : ed.settings.constrain_menus |
| + | }, s); |
| + | |
| + | s['class'] = s['class'] + ' ' + ed.getParam('skin') + 'Skin'; |
| + | if (v = ed.getParam('skin_variant')) |
| + | s['class'] += ' ' + ed.getParam('skin') + 'Skin' + v.substring(0, 1).toUpperCase() + v.substring(1); |
| + | |
| + | id = t.prefix + id; |
| + | cls = cc || t._cls.dropmenu || tinymce.ui.DropMenu; |
| + | c = t.controls[id] = new cls(id, s); |
| + | c.onAddItem.add(function(c, o) { |
| + | var s = o.settings; |
| + | |
| + | s.title = ed.getLang(s.title, s.title); |
| + | |
| + | if (!s.onclick) { |
| + | s.onclick = function(v) { |
| + | if (s.cmd) |
| + | ed.execCommand(s.cmd, s.ui || false, s.value); |
| + | }; |
| + | } |
| + | }); |
| + | |
| + | ed.onRemove.add(function() { |
| + | c.destroy(); |
| + | }); |
| + | |
| + | // Fix for bug #1897785, #1898007 |
| + | if (tinymce.isIE) { |
| + | c.onShowMenu.add(function() { |
| + | // IE 8 needs focus in order to store away a range with the current collapsed caret location |
| + | ed.focus(); |
| + | |
| + | bm = ed.selection.getBookmark(1); |
| + | }); |
| + | |
| + | c.onHideMenu.add(function() { |
| + | if (bm) { |
| + | ed.selection.moveToBookmark(bm); |
| + | bm = 0; |
| + | } |
| + | }); |
| + | } |
| + | |
| + | return t.add(c); |
| + | }, |
| + | |
| + | createListBox : function(id, s, cc) { |
| + | var t = this, ed = t.editor, cmd, c, cls; |
| + | |
| + | if (t.get(id)) |
| + | return null; |
| + | |
| + | s.title = ed.translate(s.title); |
| + | s.scope = s.scope || ed; |
| + | |
| + | if (!s.onselect) { |
| + | s.onselect = function(v) { |
| + | ed.execCommand(s.cmd, s.ui || false, v || s.value); |
| + | }; |
| + | } |
| + | |
| + | s = extend({ |
| + | title : s.title, |
| + | 'class' : 'mce_' + id, |
| + | scope : s.scope, |
| + | control_manager : t |
| + | }, s); |
| + | |
| + | id = t.prefix + id; |
| + | |
| + | if (ed.settings.use_native_selects) |
| + | c = new tinymce.ui.NativeListBox(id, s); |
| + | else { |
| + | cls = cc || t._cls.listbox || tinymce.ui.ListBox; |
| + | c = new cls(id, s); |
| + | } |
| + | |
| + | t.controls[id] = c; |
| + | |
| + | // Fix focus problem in Safari |
| + | if (tinymce.isWebKit) { |
| + | c.onPostRender.add(function(c, n) { |
| + | // Store bookmark on mousedown |
| + | Event.add(n, 'mousedown', function() { |
| + | ed.bookmark = ed.selection.getBookmark(1); |
| + | }); |
| + | |
| + | // Restore on focus, since it might be lost |
| + | Event.add(n, 'focus', function() { |
| + | ed.selection.moveToBookmark(ed.bookmark); |
| + | ed.bookmark = null; |
| + | }); |
| + | }); |
| + | } |
| + | |
| + | if (c.hideMenu) |
| + | ed.onMouseDown.add(c.hideMenu, c); |
| + | |
| + | return t.add(c); |
| + | }, |
| + | |
| + | createButton : function(id, s, cc) { |
| + | var t = this, ed = t.editor, o, c, cls; |
| + | |
| + | if (t.get(id)) |
| + | return null; |
| + | |
| + | s.title = ed.translate(s.title); |
| + | s.label = ed.translate(s.label); |
| + | s.scope = s.scope || ed; |
| + | |
| + | if (!s.onclick && !s.menu_button) { |
| + | s.onclick = function() { |
| + | ed.execCommand(s.cmd, s.ui || false, s.value); |
| + | }; |
| + | } |
| + | |
| + | s = extend({ |
| + | title : s.title, |
| + | 'class' : 'mce_' + id, |
| + | unavailable_prefix : ed.getLang('unavailable', ''), |
| + | scope : s.scope, |
| + | control_manager : t |
| + | }, s); |
| + | |
| + | id = t.prefix + id; |
| + | |
| + | if (s.menu_button) { |
| + | cls = cc || t._cls.menubutton || tinymce.ui.MenuButton; |
| + | c = new cls(id, s); |
| + | ed.onMouseDown.add(c.hideMenu, c); |
| + | } else { |
| + | cls = t._cls.button || tinymce.ui.Button; |
| + | c = new cls(id, s); |
| + | } |
| + | |
| + | return t.add(c); |
| + | }, |
| + | |
| + | createMenuButton : function(id, s, cc) { |
| + | s = s || {}; |
| + | s.menu_button = 1; |
| + | |
| + | return this.createButton(id, s, cc); |
| + | }, |
| + | |
| + | createSplitButton : function(id, s, cc) { |
| + | var t = this, ed = t.editor, cmd, c, cls; |
| + | |
| + | if (t.get(id)) |
| + | return null; |
| + | |
| + | s.title = ed.translate(s.title); |
| + | s.scope = s.scope || ed; |
| + | |
| + | if (!s.onclick) { |
| + | s.onclick = function(v) { |
| + | ed.execCommand(s.cmd, s.ui || false, v || s.value); |
| + | }; |
| + | } |
| + | |
| + | if (!s.onselect) { |
| + | s.onselect = function(v) { |
| + | ed.execCommand(s.cmd, s.ui || false, v || s.value); |
| + | }; |
| + | } |
| + | |
| + | s = extend({ |
| + | title : s.title, |
| + | 'class' : 'mce_' + id, |
| + | scope : s.scope, |
| + | control_manager : t |
| + | }, s); |
| + | |
| + | id = t.prefix + id; |
| + | cls = cc || t._cls.splitbutton || tinymce.ui.SplitButton; |
| + | c = t.add(new cls(id, s)); |
| + | ed.onMouseDown.add(c.hideMenu, c); |
| + | |
| + | return c; |
| + | }, |
| + | |
| + | createColorSplitButton : function(id, s, cc) { |
| + | var t = this, ed = t.editor, cmd, c, cls, bm; |
| + | |
| + | if (t.get(id)) |
| + | return null; |
| + | |
| + | s.title = ed.translate(s.title); |
| + | s.scope = s.scope || ed; |
| + | |
| + | if (!s.onclick) { |
| + | s.onclick = function(v) { |
| + | if (tinymce.isIE) |
| + | bm = ed.selection.getBookmark(1); |
| + | |
| + | ed.execCommand(s.cmd, s.ui || false, v || s.value); |
| + | }; |
| + | } |
| + | |
| + | if (!s.onselect) { |
| + | s.onselect = function(v) { |
| + | ed.execCommand(s.cmd, s.ui || false, v || s.value); |
| + | }; |
| + | } |
| + | |
| + | s = extend({ |
| + | title : s.title, |
| + | 'class' : 'mce_' + id, |
| + | 'menu_class' : ed.getParam('skin') + 'Skin', |
| + | scope : s.scope, |
| + | more_colors_title : ed.getLang('more_colors') |
| + | }, s); |
| + | |
| + | id = t.prefix + id; |
| + | cls = cc || t._cls.colorsplitbutton || tinymce.ui.ColorSplitButton; |
| + | c = new cls(id, s); |
| + | ed.onMouseDown.add(c.hideMenu, c); |
| + | |
| + | // Remove the menu element when the editor is removed |
| + | ed.onRemove.add(function() { |
| + | c.destroy(); |
| + | }); |
| + | |
| + | // Fix for bug #1897785, #1898007 |
| + | if (tinymce.isIE) { |
| + | c.onShowMenu.add(function() { |
| + | // IE 8 needs focus in order to store away a range with the current collapsed caret location |
| + | ed.focus(); |
| + | bm = ed.selection.getBookmark(1); |
| + | }); |
| + | |
| + | c.onHideMenu.add(function() { |
| + | if (bm) { |
| + | ed.selection.moveToBookmark(bm); |
| + | bm = 0; |
| + | } |
| + | }); |
| + | } |
| + | |
| + | return t.add(c); |
| + | }, |
| + | |
| + | createToolbar : function(id, s, cc) { |
| + | var c, t = this, cls; |
| + | |
| + | id = t.prefix + id; |
| + | cls = cc || t._cls.toolbar || tinymce.ui.Toolbar; |
| + | c = new cls(id, s); |
| + | |
| + | if (t.get(id)) |
| + | return null; |
| + | |
| + | return t.add(c); |
| + | }, |
| + | |
| + | createSeparator : function(cc) { |
| + | var cls = cc || this._cls.separator || tinymce.ui.Separator; |
| + | |
| + | return new cls(); |
| + | }, |
| + | |
| + | setControlType : function(n, c) { |
| + | return this._cls[n.toLowerCase()] = c; |
| + | }, |
| + | |
| + | destroy : function() { |
| + | each(this.controls, function(c) { |
| + | c.destroy(); |
| + | }); |
| + | |
| + | this.controls = null; |
| + | } |
| + | }); |
| + | })(tinymce); |
| + | |
| + | (function(tinymce) { |
| + | var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isIE = tinymce.isIE, isOpera = tinymce.isOpera; |
| + | |
| + | tinymce.create('tinymce.WindowManager', { |
| + | WindowManager : function(ed) { |
| + | var t = this; |
| + | |
| + | t.editor = ed; |
| + | t.onOpen = new Dispatcher(t); |
| + | t.onClose = new Dispatcher(t); |
| + | t.params = {}; |
| + | t.features = {}; |
| + | }, |
| + | |
| + | open : function(s, p) { |
| + | var t = this, f = '', x, y, mo = t.editor.settings.dialog_type == 'modal', w, sw, sh, vp = tinymce.DOM.getViewPort(), u; |
| + | |
| + | // Default some options |
| + | s = s || {}; |
| + | p = p || {}; |
| + | sw = isOpera ? vp.w : screen.width; // Opera uses windows inside the Opera window |
| + | sh = isOpera ? vp.h : screen.height; |
| + | s.name = s.name || 'mc_' + new Date().getTime(); |
| + | s.width = parseInt(s.width || 320); |
| + | s.height = parseInt(s.height || 240); |
| + | s.resizable = true; |
| + | s.left = s.left || parseInt(sw / 2.0) - (s.width / 2.0); |
| + | s.top = s.top || parseInt(sh / 2.0) - (s.height / 2.0); |
| + | p.inline = false; |
| + | p.mce_width = s.width; |
| + | p.mce_height = s.height; |
| + | p.mce_auto_focus = s.auto_focus; |
| + | |
| + | if (mo) { |
| + | if (isIE) { |
| + | s.center = true; |
| + | s.help = false; |
| + | s.dialogWidth = s.width + 'px'; |
| + | s.dialogHeight = s.height + 'px'; |
| + | s.scroll = s.scrollbars || false; |
| + | } |
| + | } |
| + | |
| + | // Build features string |
| + | each(s, function(v, k) { |
| + | if (tinymce.is(v, 'boolean')) |
| + | v = v ? 'yes' : 'no'; |
| + | |
| + | if (!/^(name|url)$/.test(k)) { |
| + | if (isIE && mo) |
| + | f += (f ? ';' : '') + k + ':' + v; |
| + | else |
| + | f += (f ? ',' : '') + k + '=' + v; |
| + | } |
| + | }); |
| + | |
| + | t.features = s; |
| + | t.params = p; |
| + | t.onOpen.dispatch(t, s, p); |
| + | |
| + | u = s.url || s.file; |
| + | u = tinymce._addVer(u); |
| + | |
| + | try { |
| + | if (isIE && mo) { |
| + | w = 1; |
| + | window.showModalDialog(u, window, f); |
| + | } else |
| + | w = window.open(u, s.name, f); |
| + | } catch (ex) { |
| + | // Ignore |
| + | } |
| + | |
| + | if (!w) |
| + | alert(t.editor.getLang('popup_blocked')); |
| + | }, |
| + | |
| + | close : function(w) { |
| + | w.close(); |
| + | this.onClose.dispatch(this); |
| + | }, |
| + | |
| + | createInstance : function(cl, a, b, c, d, e) { |
| + | var f = tinymce.resolve(cl); |
| + | |
| + | return new f(a, b, c, d, e); |
| + | }, |
| + | |
| + | confirm : function(t, cb, s, w) { |
| + | w = w || window; |
| + | |
| + | cb.call(s || this, w.confirm(this._decode(this.editor.getLang(t, t)))); |
| + | }, |
| + | |
| + | alert : function(tx, cb, s, w) { |
| + | var t = this; |
| + | |
| + | w = w || window; |
| + | w.alert(t._decode(t.editor.getLang(tx, tx))); |
| + | |
| + | if (cb) |
| + | cb.call(s || t); |
| + | }, |
| + | |
| + | resizeBy : function(dw, dh, win) { |
| + | win.resizeBy(dw, dh); |
| + | }, |
| + | |
| + | // Internal functions |
| + | |
| + | _decode : function(s) { |
| + | return tinymce.DOM.decode(s).replace(/\\n/g, '\n'); |
| + | } |
| + | }); |
| + | }(tinymce)); |
| + | (function(tinymce) { |
| + | function CommandManager() { |
| + | var execCommands = {}, queryStateCommands = {}, queryValueCommands = {}; |
| + | |
| + | function add(collection, cmd, func, scope) { |
| + | if (typeof(cmd) == 'string') |
| + | cmd = [cmd]; |
| + | |
| + | tinymce.each(cmd, function(cmd) { |
| + | collection[cmd.toLowerCase()] = {func : func, scope : scope}; |
| + | }); |
| + | }; |
| + | |
| + | tinymce.extend(this, { |
| + | add : function(cmd, func, scope) { |
| + | add(execCommands, cmd, func, scope); |
| + | }, |
| + | |
| + | addQueryStateHandler : function(cmd, func, scope) { |
| + | add(queryStateCommands, cmd, func, scope); |
| + | }, |
| + | |
| + | addQueryValueHandler : function(cmd, func, scope) { |
| + | add(queryValueCommands, cmd, func, scope); |
| + | }, |
| + | |
| + | execCommand : function(scope, cmd, ui, value, args) { |
| + | if (cmd = execCommands[cmd.toLowerCase()]) { |
| + | if (cmd.func.call(scope || cmd.scope, ui, value, args) !== false) |
| + | return true; |
| + | } |
| + | }, |
| + | |
| + | queryCommandValue : function() { |
| + | if (cmd = queryValueCommands[cmd.toLowerCase()]) |
| + | return cmd.func.call(scope || cmd.scope, ui, value, args); |
| + | }, |
| + | |
| + | queryCommandState : function() { |
| + | if (cmd = queryStateCommands[cmd.toLowerCase()]) |
| + | return cmd.func.call(scope || cmd.scope, ui, value, args); |
| + | } |
| + | }); |
| + | }; |
| + | |
| + | tinymce.GlobalCommands = new CommandManager(); |
| + | })(tinymce); |
| + | (function(tinymce) { |
| + | tinymce.Formatter = function(ed) { |
| + | var formats = {}, |
| + | each = tinymce.each, |
| + | dom = ed.dom, |
| + | selection = ed.selection, |
| + | TreeWalker = tinymce.dom.TreeWalker, |
| + | rangeUtils = new tinymce.dom.RangeUtils(dom), |
| + | isValid = ed.schema.isValid, |
| + | isBlock = dom.isBlock, |
| + | forcedRootBlock = ed.settings.forced_root_block, |
| + | nodeIndex = dom.nodeIndex, |
| + | INVISIBLE_CHAR = '\uFEFF', |
| + | MCE_ATTR_RE = /^(src|href|style)$/, |
| + | FALSE = false, |
| + | TRUE = true, |
| + | undefined, |
| + | pendingFormats = {apply : [], remove : []}; |
| + | |
| + | function isArray(obj) { |
| + | return obj instanceof Array; |
| + | }; |
| + | |
| + | function getParents(node, selector) { |
| + | return dom.getParents(node, selector, dom.getRoot()); |
| + | }; |
| + | |
| + | function isCaretNode(node) { |
| + | return node.nodeType === 1 && (node.face === 'mceinline' || node.style.fontFamily === 'mceinline'); |
| + | }; |
| + | |
| + | // Public functions |
| + | |
| + | function get(name) { |
| + | return name ? formats[name] : formats; |
| + | }; |
| + | |
| + | function register(name, format) { |
| + | if (name) { |
| + | if (typeof(name) !== 'string') { |
| + | each(name, function(format, name) { |
| + | register(name, format); |
| + | }); |
| + | } else { |
| + | // Force format into array and add it to internal collection |
| + | format = format.length ? format : [format]; |
| + | |
| + | each(format, function(format) { |
| + | // Set deep to false by default on selector formats this to avoid removing |
| + | // alignment on images inside paragraphs when alignment is changed on paragraphs |
| + | if (format.deep === undefined) |
| + | format.deep = !format.selector; |
| + | |
| + | // Default to true |
| + | if (format.split === undefined) |
| + | format.split = !format.selector || format.inline; |
| + | |
| + | // Default to true |
| + | if (format.remove === undefined && format.selector && !format.inline) |
| + | format.remove = 'none'; |
| + | |
| + | // Mark format as a mixed format inline + block level |
| + | if (format.selector && format.inline) { |
| + | format.mixed = true; |
| + | format.block_expand = true; |
| + | } |
| + | |
| + | // Split classes if needed |
| + | if (typeof(format.classes) === 'string') |
| + | format.classes = format.classes.split(/\s+/); |
| + | }); |
| + | |
| + | formats[name] = format; |
| + | } |
| + | } |
| + | }; |
| + | |
| + | function apply(name, vars, node) { |
| + | var formatList = get(name), format = formatList[0], bookmark, rng, i; |
| + | |
| + | function moveStart(rng) { |
| + | var container = rng.startContainer, |
| + | offset = rng.startOffset, |
| + | walker, node; |
| + | |
| + | // Move startContainer/startOffset in to a suitable node |
| + | if (container.nodeType == 1 || container.nodeValue === "") { |
| + | container = container.nodeType == 1 ? container.childNodes[offset] : container; |
| + | |
| + | // Might fail if the offset is behind the last element in it's container |
| + | if (container) { |
| + | walker = new TreeWalker(container, container.parentNode); |
| + | for (node = walker.current(); node; node = walker.next()) { |
| + | if (node.nodeType == 3 && !isWhiteSpaceNode(node)) { |
| + | rng.setStart(node, 0); |
| + | break; |
| + | } |
| + | } |
| + | } |
| + | } |
| + | |
| + | return rng; |
| + | }; |
| + | |
| + | function setElementFormat(elm, fmt) { |
| + | fmt = fmt || format; |
| + | |
| + | if (elm) { |
| + | each(fmt.styles, function(value, name) { |
| + | dom.setStyle(elm, name, replaceVars(value, vars)); |
| + | }); |
| + | |
| + | each(fmt.attributes, function(value, name) { |
| + | dom.setAttrib(elm, name, replaceVars(value, vars)); |
| + | }); |
| + | |
| + | each(fmt.classes, function(value) { |
| + | value = replaceVars(value, vars); |
| + | |
| + | if (!dom.hasClass(elm, value)) |
| + | dom.addClass(elm, value); |
| + | }); |
| + | } |
| + | }; |
| + | |
| + | function applyRngStyle(rng) { |
| + | var newWrappers = [], wrapName, wrapElm; |
| + | |
| + | // Setup wrapper element |
| + | wrapName = format.inline || format.block; |
| + | wrapElm = dom.create(wrapName); |
| + | setElementFormat(wrapElm); |
| + | |
| + | rangeUtils.walk(rng, function(nodes) { |
| + | var currentWrapElm; |
| + | |
| + | function process(node) { |
| + | var nodeName = node.nodeName.toLowerCase(), parentName = node.parentNode.nodeName.toLowerCase(), found; |
| + | |
| + | // Stop wrapping on br elements |
| + | if (isEq(nodeName, 'br')) { |
| + | currentWrapElm = 0; |
| + | |
| + | // Remove any br elements when we wrap things |
| + | if (format.block) |
| + | dom.remove(node); |
| + | |
| + | return; |
| + | } |
| + | |
| + | // If node is wrapper type |
| + | if (format.wrapper && matchNode(node, name, vars)) { |
| + | currentWrapElm = 0; |
| + | return; |
| + | } |
| + | |
| + | // Can we rename the block |
| + | if (format.block && !format.wrapper && isTextBlock(nodeName)) { |
| + | node = dom.rename(node, wrapName); |
| + | setElementFormat(node); |
| + | newWrappers.push(node); |
| + | currentWrapElm = 0; |
| + | return; |
| + | } |
| + | |
| + | // Handle selector patterns |
| + | if (format.selector) { |
| + | // Look for matching formats |
| + | each(formatList, function(format) { |
| + | if (dom.is(node, format.selector) && !isCaretNode(node)) { |
| + | setElementFormat(node, format); |
| + | found = true; |
| + | } |
| + | }); |
| + | |
| + | // Continue processing if a selector match wasn't found and a inline element is defined |
| + | if (!format.inline || found) { |
| + | currentWrapElm = 0; |
| + | return; |
| + | } |
| + | } |
| + | |
| + | // Is it valid to wrap this item |
| + | if (isValid(wrapName, nodeName) && isValid(parentName, wrapName)) { |
| + | // Start wrapping |
| + | if (!currentWrapElm) { |
| + | // Wrap the node |
| + | currentWrapElm = wrapElm.cloneNode(FALSE); |
| + | node.parentNode.insertBefore(currentWrapElm, node); |
| + | newWrappers.push(currentWrapElm); |
| + | } |
| + | |
| + | currentWrapElm.appendChild(node); |
| + | } else { |
| + | // Start a new wrapper for possible children |
| + | currentWrapElm = 0; |
| + | |
| + | each(tinymce.grep(node.childNodes), process); |
| + | |
| + | // End the last wrapper |
| + | currentWrapElm = 0; |
| + | } |
| + | }; |
| + | |
| + | // Process siblings from range |
| + | each(nodes, process); |
| + | }); |
| + | |
| + | // Cleanup |
| + | each(newWrappers, function(node) { |
| + | var childCount; |
| + | |
| + | function getChildCount(node) { |
| + | var count = 0; |
| + | |
| + | each(node.childNodes, function(node) { |
| + | if (!isWhiteSpaceNode(node) && !isBookmarkNode(node)) |
| + | count++; |
| + | }); |
| + | |
| + | return count; |
| + | }; |
| + | |
| + | function mergeStyles(node) { |
| + | var child, clone; |
| + | |
| + | each(node.childNodes, function(node) { |
| + | if (node.nodeType == 1 && !isBookmarkNode(node) && !isCaretNode(node)) { |
| + | child = node; |
| + | return FALSE; // break loop |
| + | } |
| + | }); |
| + | |
| + | // If child was found and of the same type as the current node |
| + | if (child && matchName(child, format)) { |
| + | clone = child.cloneNode(FALSE); |
| + | setElementFormat(clone); |
| + | |
| + | dom.replace(clone, node, TRUE); |
| + | dom.remove(child, 1); |
| + | } |
| + | |
| + | return clone || node; |
| + | }; |
| + | |
| + | childCount = getChildCount(node); |
| + | |
| + | // Remove empty nodes |
| + | if (childCount === 0) { |
| + | dom.remove(node, 1); |
| + | return; |
| + | } |
| + | |
| + | if (format.inline || format.wrapper) { |
| + | // Merges the current node with it's children of similar type to reduce the number of elements |
| + | if (!format.exact && childCount === 1) |
| + | node = mergeStyles(node); |
| + | |
| + | // Remove/merge children |
| + | each(formatList, function(format) { |
| + | // Merge all children of similar type will move styles from child to parent |
| + | // this: <span style="color:red"><b><span style="color:red; font-size:10px">text</span></b></span> |
| + | // will become: <span style="color:red"><b><span style="font-size:10px">text</span></b></span> |
| + | each(dom.select(format.inline, node), function(child) { |
| + | removeFormat(format, vars, child, format.exact ? child : null); |
| + | }); |
| + | }); |
| + | |
| + | // Remove child if direct parent is of same type |
| + | if (matchNode(node.parentNode, name, vars)) { |
| + | dom.remove(node, 1); |
| + | node = 0; |
| + | return TRUE; |
| + | } |
| + | |
| + | // Look for parent with similar style format |
| + | if (format.merge_with_parents) { |
| + | dom.getParent(node.parentNode, function(parent) { |
| + | if (matchNode(parent, name, vars)) { |
| + | dom.remove(node, 1); |
| + | node = 0; |
| + | return TRUE; |
| + | } |
| + | }); |
| + | } |
| + | |
| + | // Merge next and previous siblings if they are similar <b>text</b><b>text</b> becomes <b>texttext</b> |
| + | if (node) { |
| + | node = mergeSiblings(getNonWhiteSpaceSibling(node), node); |
| + | node = mergeSiblings(node, getNonWhiteSpaceSibling(node, TRUE)); |
| + | } |
| + | } |
| + | }); |
| + | }; |
| + | |
| + | if (format) { |
| + | if (node) { |
| + | rng = dom.createRng(); |
| + | |
| + | rng.setStartBefore(node); |
| + | rng.setEndAfter(node); |
| + | |
| + | applyRngStyle(expandRng(rng, formatList)); |
| + | } else { |
| + | if (!selection.isCollapsed() || !format.inline) { |
| + | // Apply formatting to selection |
| + | bookmark = selection.getBookmark(); |
| + | applyRngStyle(expandRng(selection.getRng(TRUE), formatList)); |
| + | |
| + | selection.moveToBookmark(bookmark); |
| + | selection.setRng(moveStart(selection.getRng(TRUE))); |
| + | ed.nodeChanged(); |
| + | } else |
| + | performCaretAction('apply', name, vars); |
| + | } |
| + | } |
| + | }; |
| + | |
| + | function remove(name, vars, node) { |
| + | var formatList = get(name), format = formatList[0], bookmark, i, rng; |
| + | |
| + | function moveStart(rng) { |
| + | var container = rng.startContainer, |
| + | offset = rng.startOffset, |
| + | walker, node, nodes, tmpNode; |
| + | |
| + | // Convert text node into index if possible |
| + | if (container.nodeType == 3 && offset >= container.nodeValue.length - 1) { |
| + | container = container.parentNode; |
| + | offset = nodeIndex(container) + 1; |
| + | } |
| + | |
| + | // Move startContainer/startOffset in to a suitable node |
| + | if (container.nodeType == 1) { |
| + | nodes = container.childNodes; |
| + | container = nodes[Math.min(offset, nodes.length - 1)]; |
| + | walker = new TreeWalker(container); |
| + | |
| + | // If offset is at end of the parent node walk to the next one |
| + | if (offset > nodes.length - 1) |
| + | walker.next(); |
| + | |
| + | for (node = walker.current(); node; node = walker.next()) { |
| + | if (node.nodeType == 3 && !isWhiteSpaceNode(node)) { |
| + | // IE has a "neat" feature where it moves the start node into the closest element |
| + | // we can avoid this by inserting an element before it and then remove it after we set the selection |
| + | tmpNode = dom.create('a', null, INVISIBLE_CHAR); |
| + | node.parentNode.insertBefore(tmpNode, node); |
| + | |
| + | // Set selection and remove tmpNode |
| + | rng.setStart(node, 0); |
| + | selection.setRng(rng); |
| + | dom.remove(tmpNode); |
| + | |
| + | return; |
| + | } |
| + | } |
| + | } |
| + | }; |
| + | |
| + | // Merges the styles for each node |
| + | function process(node) { |
| + | var children, i, l; |
| + | |
| + | // Grab the children first since the nodelist might be changed |
| + | children = tinymce.grep(node.childNodes); |
| + | |
| + | // Process current node |
| + | for (i = 0, l = formatList.length; i < l; i++) { |
| + | if (removeFormat(formatList[i], vars, node, node)) |
| + | break; |
| + | } |
| + | |
| + | // Process the children |
| + | if (format.deep) { |
| + | for (i = 0, l = children.length; i < l; i++) |
| + | process(children[i]); |
| + | } |
| + | }; |
| + | |
| + | function findFormatRoot(container) { |
| + | var formatRoot; |
| + | |
| + | // Find format root |
| + | each(getParents(container.parentNode).reverse(), function(parent) { |
| + | var format; |
| + | |
| + | // Find format root element |
| + | if (!formatRoot && parent.id != '_start' && parent.id != '_end') { |
| + | // Is the node matching the format we are looking for |
| + | format = matchNode(parent, name, vars); |
| + | if (format && format.split !== false) |
| + | formatRoot = parent; |
| + | } |
| + | }); |
| + | |
| + | return formatRoot; |
| + | }; |
| + | |
| + | function wrapAndSplit(format_root, container, target, split) { |
| + | var parent, clone, lastClone, firstClone, i, formatRootParent; |
| + | |
| + | // Format root found then clone formats and split it |
| + | if (format_root) { |
| + | formatRootParent = format_root.parentNode; |
| + | |
| + | for (parent = container.parentNode; parent && parent != formatRootParent; parent = parent.parentNode) { |
| + | clone = parent.cloneNode(FALSE); |
| + | |
| + | for (i = 0; i < formatList.length; i++) { |
| + | if (removeFormat(formatList[i], vars, clone, clone)) { |
| + | clone = 0; |
| + | break; |
| + | } |
| + | } |
| + | |
| + | // Build wrapper node |
| + | if (clone) { |
| + | if (lastClone) |
| + | clone.appendChild(lastClone); |
| + | |
| + | if (!firstClone) |
| + | firstClone = clone; |
| + | |
| + | lastClone = clone; |
| + | } |
| + | } |
| + | |
| + | // Never split block elements if the format is mixed |
| + | if (split && (!format.mixed || !isBlock(format_root))) |
| + | container = dom.split(format_root, container); |
| + | |
| + | // Wrap container in cloned formats |
| + | if (lastClone) { |
| + | target.parentNode.insertBefore(lastClone, target); |
| + | firstClone.appendChild(target); |
| + | } |
| + | } |
| + | |
| + | return container; |
| + | }; |
| + | |
| + | function splitToFormatRoot(container) { |
| + | return wrapAndSplit(findFormatRoot(container), container, container, true); |
| + | }; |
| + | |
| + | function unwrap(start) { |
| + | var node = dom.get(start ? '_start' : '_end'), |
| + | out = node[start ? 'firstChild' : 'lastChild']; |
| + | |
| + | // If the end is placed within the start the result will be removed |
| + | // So this checks if the out node is a bookmark node if it is it |
| + | // checks for another more suitable node |
| + | if (isBookmarkNode(out)) |
| + | out = out[start ? 'firstChild' : 'lastChild']; |
| + | |
| + | dom.remove(node, true); |
| + | |
| + | return out; |
| + | }; |
| + | |
| + | function removeRngStyle(rng) { |
| + | var startContainer, endContainer; |
| + | |
| + | rng = expandRng(rng, formatList, TRUE); |
| + | |
| + | if (format.split) { |
| + | startContainer = getContainer(rng, TRUE); |
| + | endContainer = getContainer(rng); |
| + | |
| + | if (startContainer != endContainer) { |
| + | // Wrap start/end nodes in span element since these might be cloned/moved |
| + | startContainer = wrap(startContainer, 'span', {id : '_start', _mce_type : 'bookmark'}); |
| + | endContainer = wrap(endContainer, 'span', {id : '_end', _mce_type : 'bookmark'}); |
| + | |
| + | // Split start/end |
| + | splitToFormatRoot(startContainer); |
| + | splitToFormatRoot(endContainer); |
| + | |
| + | // Unwrap start/end to get real elements again |
| + | startContainer = unwrap(TRUE); |
| + | endContainer = unwrap(); |
| + | } else |
| + | startContainer = endContainer = splitToFormatRoot(startContainer); |
| + | |
| + | // Update range positions since they might have changed after the split operations |
| + | rng.startContainer = startContainer.parentNode; |
| + | rng.startOffset = nodeIndex(startContainer); |
| + | rng.endContainer = endContainer.parentNode; |
| + | rng.endOffset = nodeIndex(endContainer) + 1; |
| + | } |
| + | |
| + | // Remove items between start/end |
| + | rangeUtils.walk(rng, function(nodes) { |
| + | each(nodes, function(node) { |
| + | process(node); |
| + | }); |
| + | }); |
| + | }; |
| + | |
| + | // Handle node |
| + | if (node) { |
| + | rng = dom.createRng(); |
| + | rng.setStartBefore(node); |
| + | rng.setEndAfter(node); |
| + | removeRngStyle(rng); |
| + | return; |
| + | } |
| + | |
| + | if (!selection.isCollapsed() || !format.inline) { |
| + | bookmark = selection.getBookmark(); |
| + | removeRngStyle(selection.getRng(TRUE)); |
| + | selection.moveToBookmark(bookmark); |
| + | |
| + | // Check if start element still has formatting then we are at: "<b>text|</b>text" and need to move the start into the next text node |
| + | if (match(name, vars, selection.getStart())) { |
| + | moveStart(selection.getRng(true)); |
| + | } |
| + | |
| + | ed.nodeChanged(); |
| + | } else |
| + | performCaretAction('remove', name, vars); |
| + | }; |
| + | |
| + | function toggle(name, vars, node) { |
| + | if (match(name, vars, node)) |
| + | remove(name, vars, node); |
| + | else |
| + | apply(name, vars, node); |
| + | }; |
| + | |
| + | function matchNode(node, name, vars, similar) { |
| + | var formatList = get(name), format, i, classes; |
| + | |
| + | function matchItems(node, format, item_name) { |
| + | var key, value, items = format[item_name], i; |
| + | |
| + | // Check all items |
| + | if (items) { |
| + | // Non indexed object |
| + | if (items.length === undefined) { |
| + | for (key in items) { |
| + | if (items.hasOwnProperty(key)) { |
| + | if (item_name === 'attributes') |
| + | value = dom.getAttrib(node, key); |
| + | else |
| + | value = getStyle(node, key); |
| + | |
| + | if (similar && !value && !format.exact) |
| + | return; |
| + | |
| + | if ((!similar || format.exact) && !isEq(value, replaceVars(items[key], vars))) |
| + | return; |
| + | } |
| + | } |
| + | } else { |
| + | // Only one match needed for indexed arrays |
| + | for (i = 0; i < items.length; i++) { |
| + | if (item_name === 'attributes' ? dom.getAttrib(node, items[i]) : getStyle(node, items[i])) |
| + | return format; |
| + | } |
| + | } |
| + | } |
| + | |
| + | return format; |
| + | }; |
| + | |
| + | if (formatList && node) { |
| + | // Check each format in list |
| + | for (i = 0; i < formatList.length; i++) { |
| + | format = formatList[i]; |
| + | |
| + | // Name name, attributes, styles and classes |
| + | if (matchName(node, format) && matchItems(node, format, 'attributes') && matchItems(node, format, 'styles')) { |
| + | // Match classes |
| + | if (classes = format.classes) { |
| + | for (i = 0; i < classes.length; i++) { |
| + | if (!dom.hasClass(node, classes[i])) |
| + | return; |
| + | } |
| + | } |
| + | |
| + | return format; |
| + | } |
| + | } |
| + | } |
| + | }; |
| + | |
| + | function match(name, vars, node) { |
| + | var startNode, i; |
| + | |
| + | function matchParents(node) { |
| + | // Find first node with similar format settings |
| + | node = dom.getParent(node, function(node) { |
| + | return !!matchNode(node, name, vars, true); |
| + | }); |
| + | |
| + | // Do an exact check on the similar format element |
| + | return matchNode(node, name, vars); |
| + | }; |
| + | |
| + | // Check specified node |
| + | if (node) |
| + | return matchParents(node); |
| + | |
| + | // Check pending formats |
| + | if (selection.isCollapsed()) { |
| + | for (i = pendingFormats.apply.length - 1; i >= 0; i--) { |
| + | if (pendingFormats.apply[i].name == name) |
| + | return true; |
| + | } |
| + | |
| + | for (i = pendingFormats.remove.length - 1; i >= 0; i--) { |
| + | if (pendingFormats.remove[i].name == name) |
| + | return false; |
| + | } |
| + | |
| + | return matchParents(selection.getNode()); |
| + | } |
| + | |
| + | // Check selected node |
| + | node = selection.getNode(); |
| + | if (matchParents(node)) |
| + | return TRUE; |
| + | |
| + | // Check start node if it's different |
| + | startNode = selection.getStart(); |
| + | if (startNode != node) { |
| + | if (matchParents(startNode)) |
| + | return TRUE; |
| + | } |
| + | |
| + | return FALSE; |
| + | }; |
| + | |
| + | function matchAll(names, vars) { |
| + | var startElement, matchedFormatNames = [], checkedMap = {}, i, ni, name; |
| + | |
| + | // If the selection is collapsed then check pending formats |
| + | if (selection.isCollapsed()) { |
| + | for (ni = 0; ni < names.length; ni++) { |
| + | // If the name is to be removed, then stop it from being added |
| + | for (i = pendingFormats.remove.length - 1; i >= 0; i--) { |
| + | name = names[ni]; |
| + | |
| + | if (pendingFormats.remove[i].name == name) { |
| + | checkedMap[name] = true; |
| + | break; |
| + | } |
| + | } |
| + | } |
| + | |
| + | // If the format is to be applied |
| + | for (i = pendingFormats.apply.length - 1; i >= 0; i--) { |
| + | for (ni = 0; ni < names.length; ni++) { |
| + | name = names[ni]; |
| + | |
| + | if (!checkedMap[name] && pendingFormats.apply[i].name == name) { |
| + | checkedMap[name] = true; |
| + | matchedFormatNames.push(name); |
| + | } |
| + | } |
| + | } |
| + | } |
| + | |
| + | // Check start of selection for formats |
| + | startElement = selection.getStart(); |
| + | dom.getParent(startElement, function(node) { |
| + | var i, name; |
| + | |
| + | for (i = 0; i < names.length; i++) { |
| + | name = names[i]; |
| + | |
| + | if (!checkedMap[name] && matchNode(node, name, vars)) { |
| + | checkedMap[name] = true; |
| + | matchedFormatNames.push(name); |
| + | } |
| + | } |
| + | }); |
| + | |
| + | return matchedFormatNames; |
| + | }; |
| + | |
| + | function canApply(name) { |
| + | var formatList = get(name), startNode, parents, i, x, selector; |
| + | |
| + | if (formatList) { |
| + | startNode = selection.getStart(); |
| + | parents = getParents(startNode); |
| + | |
| + | for (x = formatList.length - 1; x >= 0; x--) { |
| + | selector = formatList[x].selector; |
| + | |
| + | // Format is not selector based, then always return TRUE |
| + | if (!selector) |
| + | return TRUE; |
| + | |
| + | for (i = parents.length - 1; i >= 0; i--) { |
| + | if (dom.is(parents[i], selector)) |
| + | return TRUE; |
| + | } |
| + | } |
| + | } |
| + | |
| + | return FALSE; |
| + | }; |
| + | |
| + | // Expose to public |
| + | tinymce.extend(this, { |
| + | get : get, |
| + | register : register, |
| + | apply : apply, |
| + | remove : remove, |
| + | toggle : toggle, |
| + | match : match, |
| + | matchAll : matchAll, |
| + | matchNode : matchNode, |
| + | canApply : canApply |
| + | }); |
| + | |
| + | // Private functions |
| + | |
| + | function matchName(node, format) { |
| + | // Check for inline match |
| + | if (isEq(node, format.inline)) |
| + | return TRUE; |
| + | |
| + | // Check for block match |
| + | if (isEq(node, format.block)) |
| + | return TRUE; |
| + | |
| + | // Check for selector match |
| + | if (format.selector) |
| + | return dom.is(node, format.selector); |
| + | }; |
| + | |
| + | function isEq(str1, str2) { |
| + | str1 = str1 || ''; |
| + | str2 = str2 || ''; |
| + | |
| + | str1 = '' + (str1.nodeName || str1); |
| + | str2 = '' + (str2.nodeName || str2); |
| + | |
| + | return str1.toLowerCase() == str2.toLowerCase(); |
| + | }; |
| + | |
| + | function getStyle(node, name) { |
| + | var styleVal = dom.getStyle(node, name); |
| + | |
| + | // Force the format to hex |
| + | if (name == 'color' || name == 'backgroundColor') |
| + | styleVal = dom.toHex(styleVal); |
| + | |
| + | // Opera will return bold as 700 |
| + | if (name == 'fontWeight' && styleVal == 700) |
| + | styleVal = 'bold'; |
| + | |
| + | return '' + styleVal; |
| + | }; |
| + | |
| + | function replaceVars(value, vars) { |
| + | if (typeof(value) != "string") |
| + | value = value(vars); |
| + | else if (vars) { |
| + | value = value.replace(/%(\w+)/g, function(str, name) { |
| + | return vars[name] || str; |
| + | }); |
| + | } |
| + | |
| + | return value; |
| + | }; |
| + | |
| + | function isWhiteSpaceNode(node) { |
| + | return node && node.nodeType === 3 && /^([\s\r\n]+|)$/.test(node.nodeValue); |
| + | }; |
| + | |
| + | function wrap(node, name, attrs) { |
| + | var wrapper = dom.create(name, attrs); |
| + | |
| + | node.parentNode.insertBefore(wrapper, node); |
| + | wrapper.appendChild(node); |
| + | |
| + | return wrapper; |
| + | }; |
| + | |
| + | function expandRng(rng, format, remove) { |
| + | var startContainer = rng.startContainer, |
| + | startOffset = rng.startOffset, |
| + | endContainer = rng.endContainer, |
| + | endOffset = rng.endOffset, sibling, lastIdx; |
| + | |
| + | // This function walks up the tree if there is no siblings before/after the node |
| + | function findParentContainer(container, child_name, sibling_name, root) { |
| + | var parent, child; |
| + | |
| + | root = root || dom.getRoot(); |
| + | |
| + | for (;;) { |
| + | // Check if we can move up are we at root level or body level |
| + | parent = container.parentNode; |
| + | |
| + | // Stop expanding on block elements or root depending on format |
| + | if (parent == root || (!format[0].block_expand && isBlock(parent))) |
| + | return container; |
| + | |
| + | for (sibling = parent[child_name]; sibling && sibling != container; sibling = sibling[sibling_name]) { |
| + | if (sibling.nodeType == 1 && !isBookmarkNode(sibling)) |
| + | return container; |
| + | |
| + | if (sibling.nodeType == 3 && !isWhiteSpaceNode(sibling)) |
| + | return container; |
| + | } |
| + | |
| + | container = container.parentNode; |
| + | } |
| + | |
| + | return container; |
| + | }; |
| + | |
| + | // If index based start position then resolve it |
| + | if (startContainer.nodeType == 1 && startContainer.hasChildNodes()) { |
| + | lastIdx = startContainer.childNodes.length - 1; |
| + | startContainer = startContainer.childNodes[startOffset > lastIdx ? lastIdx : startOffset]; |
| + | |
| + | if (startContainer.nodeType == 3) |
| + | startOffset = 0; |
| + | } |
| + | |
| + | // If index based end position then resolve it |
| + | if (endContainer.nodeType == 1 && endContainer.hasChildNodes()) { |
| + | lastIdx = endContainer.childNodes.length - 1; |
| + | endContainer = endContainer.childNodes[endOffset > lastIdx ? lastIdx : endOffset - 1]; |
| + | |
| + | if (endContainer.nodeType == 3) |
| + | endOffset = endContainer.nodeValue.length; |
| + | } |
| + | |
| + | // Exclude bookmark nodes if possible |
| + | if (isBookmarkNode(startContainer.parentNode)) |
| + | startContainer = startContainer.parentNode; |
| + | |
| + | if (isBookmarkNode(startContainer)) |
| + | startContainer = startContainer.nextSibling || startContainer; |
| + | |
| + | if (isBookmarkNode(endContainer.parentNode)) |
| + | endContainer = endContainer.parentNode; |
| + | |
| + | if (isBookmarkNode(endContainer)) |
| + | endContainer = endContainer.previousSibling || endContainer; |
| + | |
| + | // Move start/end point up the tree if the leaves are sharp and if we are in different containers |
| + | // Example * becomes !: !<p><b><i>*text</i><i>text*</i></b></p>! |
| + | // This will reduce the number of wrapper elements that needs to be created |
| + | // Move start point up the tree |
| + | if (format[0].inline || format[0].block_expand) { |
| + | startContainer = findParentContainer(startContainer, 'firstChild', 'nextSibling'); |
| + | endContainer = findParentContainer(endContainer, 'lastChild', 'previousSibling'); |
| + | } |
| + | |
| + | // Expand start/end container to matching selector |
| + | if (format[0].selector && format[0].expand !== FALSE && !format[0].inline) { |
| + | function findSelectorEndPoint(container, sibling_name) { |
| + | var parents, i, y; |
| + | |
| + | if (container.nodeType == 3 && container.nodeValue.length == 0 && container[sibling_name]) |
| + | container = container[sibling_name]; |
| + | |
| + | parents = getParents(container); |
| + | for (i = 0; i < parents.length; i++) { |
| + | for (y = 0; y < format.length; y++) { |
| + | if (dom.is(parents[i], format[y].selector)) |
| + | return parents[i]; |
| + | } |
| + | } |
| + | |
| + | return container; |
| + | }; |
| + | |
| + | // Find new startContainer/endContainer if there is better one |
| + | startContainer = findSelectorEndPoint(startContainer, 'previousSibling'); |
| + | endContainer = findSelectorEndPoint(endContainer, 'nextSibling'); |
| + | } |
| + | |
| + | // Expand start/end container to matching block element or text node |
| + | if (format[0].block || format[0].selector) { |
| + | function findBlockEndPoint(container, sibling_name, sibling_name2) { |
| + | var node; |
| + | |
| + | // Expand to block of similar type |
| + | if (!format[0].wrapper) |
| + | node = dom.getParent(container, format[0].block); |
| + | |
| + | // Expand to first wrappable block element or any block element |
| + | if (!node) |
| + | node = dom.getParent(container.nodeType == 3 ? container.parentNode : container, isBlock); |
| + | |
| + | // Exclude inner lists from wrapping |
| + | if (node && format[0].wrapper) |
| + | node = getParents(node, 'ul,ol').reverse()[0] || node; |
| + | |
| + | // Didn't find a block element look for first/last wrappable element |
| + | if (!node) { |
| + | node = container; |
| + | |
| + | while (node[sibling_name] && !isBlock(node[sibling_name])) { |
| + | node = node[sibling_name]; |
| + | |
| + | // Break on BR but include it will be removed later on |
| + | // we can't remove it now since we need to check if it can be wrapped |
| + | if (isEq(node, 'br')) |
| + | break; |
| + | } |
| + | } |
| + | |
| + | return node || container; |
| + | }; |
| + | |
| + | // Find new startContainer/endContainer if there is better one |
| + | startContainer = findBlockEndPoint(startContainer, 'previousSibling'); |
| + | endContainer = findBlockEndPoint(endContainer, 'nextSibling'); |
| + | |
| + | // Non block element then try to expand up the leaf |
| + | if (format[0].block) { |
| + | if (!isBlock(startContainer)) |
| + | startContainer = findParentContainer(startContainer, 'firstChild', 'nextSibling'); |
| + | |
| + | if (!isBlock(endContainer)) |
| + | endContainer = findParentContainer(endContainer, 'lastChild', 'previousSibling'); |
| + | } |
| + | } |
| + | |
| + | // Setup index for startContainer |
| + | if (startContainer.nodeType == 1) { |
| + | startOffset = nodeIndex(startContainer); |
| + | startContainer = startContainer.parentNode; |
| + | } |
| + | |
| + | // Setup index for endContainer |
| + | if (endContainer.nodeType == 1) { |
| + | endOffset = nodeIndex(endContainer) + 1; |
| + | endContainer = endContainer.parentNode; |
| + | } |
| + | |
| + | // Return new range like object |
| + | return { |
| + | startContainer : startContainer, |
| + | startOffset : startOffset, |
| + | endContainer : endContainer, |
| + | endOffset : endOffset |
| + | }; |
| + | } |
| + | |
| + | function removeFormat(format, vars, node, compare_node) { |
| + | var i, attrs, stylesModified; |
| + | |
| + | // Check if node matches format |
| + | if (!matchName(node, format)) |
| + | return FALSE; |
| + | |
| + | // Should we compare with format attribs and styles |
| + | if (format.remove != 'all') { |
| + | // Remove styles |
| + | each(format.styles, function(value, name) { |
| + | value = replaceVars(value, vars); |
| + | |
| + | // Indexed array |
| + | if (typeof(name) === 'number') { |
| + | name = value; |
| + | compare_node = 0; |
| + | } |
| + | |
| + | if (!compare_node || isEq(getStyle(compare_node, name), value)) |
| + | dom.setStyle(node, name, ''); |
| + | |
| + | stylesModified = 1; |
| + | }); |
| + | |
| + | // Remove style attribute if it's empty |
| + | if (stylesModified && dom.getAttrib(node, 'style') == '') { |
| + | node.removeAttribute('style'); |
| + | node.removeAttribute('_mce_style'); |
| + | } |
| + | |
| + | // Remove attributes |
| + | each(format.attributes, function(value, name) { |
| + | var valueOut; |
| + | |
| + | value = replaceVars(value, vars); |
| + | |
| + | // Indexed array |
| + | if (typeof(name) === 'number') { |
| + | name = value; |
| + | compare_node = 0; |
| + | } |
| + | |
| + | if (!compare_node || isEq(dom.getAttrib(compare_node, name), value)) { |
| + | // Keep internal classes |
| + | if (name == 'class') { |
| + | value = dom.getAttrib(node, name); |
| + | if (value) { |
| + | // Build new class value where everything is removed except the internal prefixed classes |
| + | valueOut = ''; |
| + | each(value.split(/\s+/), function(cls) { |
| + | if (/mce\w+/.test(cls)) |
| + | valueOut += (valueOut ? ' ' : '') + cls; |
| + | }); |
| + | |
| + | // We got some internal classes left |
| + | if (valueOut) { |
| + | dom.setAttrib(node, name, valueOut); |
| + | return; |
| + | } |
| + | } |
| + | } |
| + | |
| + | // IE6 has a bug where the attribute doesn't get removed correctly |
| + | if (name == "class") |
| + | node.removeAttribute('className'); |
| + | |
| + | // Remove mce prefixed attributes |
| + | if (MCE_ATTR_RE.test(name)) |
| + | node.removeAttribute('_mce_' + name); |
| + | |
| + | node.removeAttribute(name); |
| + | } |
| + | }); |
| + | |
| + | // Remove classes |
| + | each(format.classes, function(value) { |
| + | value = replaceVars(value, vars); |
| + | |
| + | if (!compare_node || dom.hasClass(compare_node, value)) |
| + | dom.removeClass(node, value); |
| + | }); |
| + | |
| + | // Check for non internal attributes |
| + | attrs = dom.getAttribs(node); |
| + | for (i = 0; i < attrs.length; i++) { |
| + | if (attrs[i].nodeName.indexOf('_') !== 0) |
| + | return FALSE; |
| + | } |
| + | } |
| + | |
| + | // Remove the inline child if it's empty for example <b> or <span> |
| + | if (format.remove != 'none') { |
| + | removeNode(node, format); |
| + | return TRUE; |
| + | } |
| + | }; |
| + | |
| + | function removeNode(node, format) { |
| + | var parentNode = node.parentNode, rootBlockElm; |
| + | |
| + | if (format.block) { |
| + | if (!forcedRootBlock) { |
| + | function find(node, next, inc) { |
| + | node = getNonWhiteSpaceSibling(node, next, inc); |
| + | |
| + | return !node || (node.nodeName == 'BR' || isBlock(node)); |
| + | }; |
| + | |
| + | // Append BR elements if needed before we remove the block |
| + | if (isBlock(node) && !isBlock(parentNode)) { |
| + | if (!find(node, FALSE) && !find(node.firstChild, TRUE, 1)) |
| + | node.insertBefore(dom.create('br'), node.firstChild); |
| + | |
| + | if (!find(node, TRUE) && !find(node.lastChild, FALSE, 1)) |
| + | node.appendChild(dom.create('br')); |
| + | } |
| + | } else { |
| + | // Wrap the block in a forcedRootBlock if we are at the root of document |
| + | if (parentNode == dom.getRoot()) { |
| + | if (!format.list_block || !isEq(node, format.list_block)) { |
| + | each(tinymce.grep(node.childNodes), function(node) { |
| + | if (isValid(forcedRootBlock, node.nodeName.toLowerCase())) { |
| + | if (!rootBlockElm) |
| + | rootBlockElm = wrap(node, forcedRootBlock); |
| + | else |
| + | rootBlockElm.appendChild(node); |
| + | } else |
| + | rootBlockElm = 0; |
| + | }); |
| + | } |
| + | } |
| + | } |
| + | } |
| + | |
| + | // Never remove nodes that isn't the specified inline element if a selector is specified too |
| + | if (format.selector && format.inline && !isEq(format.inline, node)) |
| + | return; |
| + | |
| + | dom.remove(node, 1); |
| + | }; |
| + | |
| + | function getNonWhiteSpaceSibling(node, next, inc) { |
| + | if (node) { |
| + | next = next ? 'nextSibling' : 'previousSibling'; |
| + | |
| + | for (node = inc ? node : node[next]; node; node = node[next]) { |
| + | if (node.nodeType == 1 || !isWhiteSpaceNode(node)) |
| + | return node; |
| + | } |
| + | } |
| + | }; |
| + | |
| + | function isBookmarkNode(node) { |
| + | return node && node.nodeType == 1 && node.getAttribute('_mce_type') == 'bookmark'; |
| + | }; |
| + | |
| + | function mergeSiblings(prev, next) { |
| + | var marker, sibling, tmpSibling; |
| + | |
| + | function compareElements(node1, node2) { |
| + | // Not the same name |
| + | if (node1.nodeName != node2.nodeName) |
| + | return FALSE; |
| + | |
| + | function getAttribs(node) { |
| + | var attribs = {}; |
| + | |
| + | each(dom.getAttribs(node), function(attr) { |
| + | var name = attr.nodeName.toLowerCase(); |
| + | |
| + | // Don't compare internal attributes or style |
| + | if (name.indexOf('_') !== 0 && name !== 'style') |
| + | attribs[name] = dom.getAttrib(node, name); |
| + | }); |
| + | |
| + | return attribs; |
| + | }; |
| + | |
| + | function compareObjects(obj1, obj2) { |
| + | var value, name; |
| + | |
| + | for (name in obj1) { |
| + | // Obj1 has item obj2 doesn't have |
| + | if (obj1.hasOwnProperty(name)) { |
| + | value = obj2[name]; |
| + | |
| + | // Obj2 doesn't have obj1 item |
| + | if (value === undefined) |
| + | return FALSE; |
| + | |
| + | // Obj2 item has a different value |
| + | if (obj1[name] != value) |
| + | return FALSE; |
| + | |
| + | // Delete similar value |
| + | delete obj2[name]; |
| + | } |
| + | } |
| + | |
| + | // Check if obj 2 has something obj 1 doesn't have |
| + | for (name in obj2) { |
| + | // Obj2 has item obj1 doesn't have |
| + | if (obj2.hasOwnProperty(name)) |
| + | return FALSE; |
| + | } |
| + | |
| + | return TRUE; |
| + | }; |
| + | |
| + | // Attribs are not the same |
| + | if (!compareObjects(getAttribs(node1), getAttribs(node2))) |
| + | return FALSE; |
| + | |
| + | // Styles are not the same |
| + | if (!compareObjects(dom.parseStyle(dom.getAttrib(node1, 'style')), dom.parseStyle(dom.getAttrib(node2, 'style')))) |
| + | return FALSE; |
| + | |
| + | return TRUE; |
| + | }; |
| + | |
| + | // Check if next/prev exists and that they are elements |
| + | if (prev && next) { |
| + | function findElementSibling(node, sibling_name) { |
| + | for (sibling = node; sibling; sibling = sibling[sibling_name]) { |
| + | if (sibling.nodeType == 3 && !isWhiteSpaceNode(sibling)) |
| + | return node; |
| + | |
| + | if (sibling.nodeType == 1 && !isBookmarkNode(sibling)) |
| + | return sibling; |
| + | } |
| + | |
| + | return node; |
| + | }; |
| + | |
| + | // If previous sibling is empty then jump over it |
| + | prev = findElementSibling(prev, 'previousSibling'); |
| + | next = findElementSibling(next, 'nextSibling'); |
| + | |
| + | // Compare next and previous nodes |
| + | if (compareElements(prev, next)) { |
| + | // Append nodes between |
| + | for (sibling = prev.nextSibling; sibling && sibling != next;) { |
| + | tmpSibling = sibling; |
| + | sibling = sibling.nextSibling; |
| + | prev.appendChild(tmpSibling); |
| + | } |
| + | |
| + | // Remove next node |
| + | dom.remove(next); |
| + | |
| + | // Move children into prev node |
| + | each(tinymce.grep(next.childNodes), function(node) { |
| + | prev.appendChild(node); |
| + | }); |
| + | |
| + | return prev; |
| + | } |
| + | } |
| + | |
| + | return next; |
| + | }; |
| + | |
| + | function isTextBlock(name) { |
| + | return /^(h[1-6]|p|div|pre|address|dl|dt|dd)$/.test(name); |
| + | }; |
| + | |
| + | function getContainer(rng, start) { |
| + | var container, offset, lastIdx; |
| + | |
| + | container = rng[start ? 'startContainer' : 'endContainer']; |
| + | offset = rng[start ? 'startOffset' : 'endOffset']; |
| + | |
| + | if (container.nodeType == 1) { |
| + | lastIdx = container.childNodes.length - 1; |
| + | |
| + | if (!start && offset) |
| + | offset--; |
| + | |
| + | container = container.childNodes[offset > lastIdx ? lastIdx : offset]; |
| + | } |
| + | |
| + | return container; |
| + | }; |
| + | |
| + | function performCaretAction(type, name, vars) { |
| + | var i, currentPendingFormats = pendingFormats[type], |
| + | otherPendingFormats = pendingFormats[type == 'apply' ? 'remove' : 'apply']; |
| + | |
| + | function hasPending() { |
| + | return pendingFormats.apply.length || pendingFormats.remove.length; |
| + | }; |
| + | |
| + | function resetPending() { |
| + | pendingFormats.apply = []; |
| + | pendingFormats.remove = []; |
| + | }; |
| + | |
| + | function perform(caret_node) { |
| + | // Apply pending formats |
| + | each(pendingFormats.apply.reverse(), function(item) { |
| + | apply(item.name, item.vars, caret_node); |
| + | }); |
| + | |
| + | // Remove pending formats |
| + | each(pendingFormats.remove.reverse(), function(item) { |
| + | remove(item.name, item.vars, caret_node); |
| + | }); |
| + | |
| + | dom.remove(caret_node, 1); |
| + | resetPending(); |
| + | }; |
| + | |
| + | // Check if it already exists then ignore it |
| + | for (i = currentPendingFormats.length - 1; i >= 0; i--) { |
| + | if (currentPendingFormats[i].name == name) |
| + | return; |
| + | } |
| + | |
| + | currentPendingFormats.push({name : name, vars : vars}); |
| + | |
| + | // Check if it's in the other type, then remove it |
| + | for (i = otherPendingFormats.length - 1; i >= 0; i--) { |
| + | if (otherPendingFormats[i].name == name) |
| + | otherPendingFormats.splice(i, 1); |
| + | } |
| + | |
| + | // Pending apply or remove formats |
| + | if (hasPending()) { |
| + | ed.getDoc().execCommand('FontName', false, 'mceinline'); |
| + | pendingFormats.lastRng = selection.getRng(); |
| + | |
| + | // IE will convert the current word |
| + | each(dom.select('font,span'), function(node) { |
| + | var bookmark; |
| + | |
| + | if (isCaretNode(node)) { |
| + | bookmark = selection.getBookmark(); |
| + | perform(node); |
| + | selection.moveToBookmark(bookmark); |
| + | ed.nodeChanged(); |
| + | } |
| + | }); |
| + | |
| + | // Only register listeners once if we need to |
| + | if (!pendingFormats.isListening && hasPending()) { |
| + | pendingFormats.isListening = true; |
| + | |
| + | each('onKeyDown,onKeyUp,onKeyPress,onMouseUp'.split(','), function(event) { |
| + | ed[event].addToTop(function(ed, e) { |
| + | // Do we have pending formats and is the selection moved has moved |
| + | if (hasPending() && !tinymce.dom.RangeUtils.compareRanges(pendingFormats.lastRng, selection.getRng())) { |
| + | each(dom.select('font,span'), function(node) { |
| + | var textNode, rng; |
| + | |
| + | // Look for marker |
| + | if (isCaretNode(node)) { |
| + | textNode = node.firstChild; |
| + | |
| + | if (textNode) { |
| + | perform(node); |
| + | |
| + | rng = dom.createRng(); |
| + | rng.setStart(textNode, textNode.nodeValue.length); |
| + | rng.setEnd(textNode, textNode.nodeValue.length); |
| + | selection.setRng(rng); |
| + | ed.nodeChanged(); |
| + | } else |
| + | dom.remove(node); |
| + | } |
| + | }); |
| + | |
| + | // Always unbind and clear pending styles on keyup |
| + | if (e.type == 'keyup' || e.type == 'mouseup') |
| + | resetPending(); |
| + | } |
| + | }); |
| + | }); |
| + | } |
| + | } |
| + | }; |
| + | }; |
| + | })(tinymce); |
| + | |
| + | tinymce.onAddEditor.add(function(tinymce, ed) { |
| + | var filters, fontSizes, dom, settings = ed.settings; |
| + | |
| + | if (settings.inline_styles) { |
| + | fontSizes = tinymce.explode(settings.font_size_style_values); |
| + | |
| + | function replaceWithSpan(node, styles) { |
| + | dom.replace(dom.create('span', { |
| + | style : styles |
| + | }), node, 1); |
| + | }; |
| + | |
| + | filters = { |
| + | font : function(dom, node) { |
| + | replaceWithSpan(node, { |
| + | backgroundColor : node.style.backgroundColor, |
| + | color : node.color, |
| + | fontFamily : node.face, |
| + | fontSize : fontSizes[parseInt(node.size) - 1] |
| + | }); |
| + | }, |
| + | |
| + | u : function(dom, node) { |
| + | replaceWithSpan(node, { |
| + | textDecoration : 'underline' |
| + | }); |
| + | }, |
| + | |
| + | strike : function(dom, node) { |
| + | replaceWithSpan(node, { |
| + | textDecoration : 'line-through' |
| + | }); |
| + | } |
| + | }; |
| + | |
| + | function convert(editor, params) { |
| + | dom = editor.dom; |
| + | |
| + | if (settings.convert_fonts_to_spans) { |
| + | tinymce.each(dom.select('font,u,strike', params.node), function(node) { |
| + | filters[node.nodeName.toLowerCase()](ed.dom, node); |
| + | }); |
| + | } |
| + | }; |
| + | |
| + | ed.onPreProcess.add(convert); |
| + | |
| + | ed.onInit.add(function() { |
| + | ed.selection.onSetContent.add(convert); |
| + | }); |
| + | } |
| + | }); |
| + | |
public/javascripts/cms/3rdparty/tiny_mce/utils/editable_selects.js
+70
-0
| @@ | @@ -0,0 +1,70 @@ |
| + | /** |
| + | * editable_selects.js |
| + | * |
| + | * Copyright 2009, Moxiecode Systems AB |
| + | * Released under LGPL License. |
| + | * |
| + | * License: http://tinymce.moxiecode.com/license |
| + | * Contributing: http://tinymce.moxiecode.com/contributing |
| + | */ |
| + | |
| + | var TinyMCE_EditableSelects = { |
| + | editSelectElm : null, |
| + | |
| + | init : function() { |
| + | var nl = document.getElementsByTagName("select"), i, d = document, o; |
| + | |
| + | for (i=0; i<nl.length; i++) { |
| + | if (nl[i].className.indexOf('mceEditableSelect') != -1) { |
| + | o = new Option('(value)', '__mce_add_custom__'); |
| + | |
| + | o.className = 'mceAddSelectValue'; |
| + | |
| + | nl[i].options[nl[i].options.length] = o; |
| + | nl[i].onchange = TinyMCE_EditableSelects.onChangeEditableSelect; |
| + | } |
| + | } |
| + | }, |
| + | |
| + | onChangeEditableSelect : function(e) { |
| + | var d = document, ne, se = window.event ? window.event.srcElement : e.target; |
| + | |
| + | if (se.options[se.selectedIndex].value == '__mce_add_custom__') { |
| + | ne = d.createElement("input"); |
| + | ne.id = se.id + "_custom"; |
| + | ne.name = se.name + "_custom"; |
| + | ne.type = "text"; |
| + | |
| + | ne.style.width = se.offsetWidth + 'px'; |
| + | se.parentNode.insertBefore(ne, se); |
| + | se.style.display = 'none'; |
| + | ne.focus(); |
| + | ne.onblur = TinyMCE_EditableSelects.onBlurEditableSelectInput; |
| + | ne.onkeydown = TinyMCE_EditableSelects.onKeyDown; |
| + | TinyMCE_EditableSelects.editSelectElm = se; |
| + | } |
| + | }, |
| + | |
| + | onBlurEditableSelectInput : function() { |
| + | var se = TinyMCE_EditableSelects.editSelectElm; |
| + | |
| + | if (se) { |
| + | if (se.previousSibling.value != '') { |
| + | addSelectValue(document.forms[0], se.id, se.previousSibling.value, se.previousSibling.value); |
| + | selectByValue(document.forms[0], se.id, se.previousSibling.value); |
| + | } else |
| + | selectByValue(document.forms[0], se.id, ''); |
| + | |
| + | se.style.display = 'inline'; |
| + | se.parentNode.removeChild(se.previousSibling); |
| + | TinyMCE_EditableSelects.editSelectElm = null; |
| + | } |
| + | }, |
| + | |
| + | onKeyDown : function(e) { |
| + | e = e || window.event; |
| + | |
| + | if (e.keyCode == 13) |
| + | TinyMCE_EditableSelects.onBlurEditableSelectInput(); |
| + | } |
| + | }; |
public/javascripts/cms/3rdparty/tiny_mce/utils/form_utils.js
+200
-0
| @@ | @@ -0,0 +1,200 @@ |
| + | /** |
| + | * form_utils.js |
| + | * |
| + | * Copyright 2009, Moxiecode Systems AB |
| + | * Released under LGPL License. |
| + | * |
| + | * License: http://tinymce.moxiecode.com/license |
| + | * Contributing: http://tinymce.moxiecode.com/contributing |
| + | */ |
| + | |
| + | var themeBaseURL = tinyMCEPopup.editor.baseURI.toAbsolute('themes/' + tinyMCEPopup.getParam("theme")); |
| + | |
| + | function getColorPickerHTML(id, target_form_element) { |
| + | var h = ""; |
| + | |
| + | h += '<a id="' + id + '_link" href="javascript:;" onclick="tinyMCEPopup.pickColor(event,\'' + target_form_element +'\');" onmousedown="return false;" class="pickcolor">'; |
| + | h += '<span id="' + id + '" title="' + tinyMCEPopup.getLang('browse') + '"> </span></a>'; |
| + | |
| + | return h; |
| + | } |
| + | |
| + | function updateColor(img_id, form_element_id) { |
| + | document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value; |
| + | } |
| + | |
| + | function setBrowserDisabled(id, state) { |
| + | var img = document.getElementById(id); |
| + | var lnk = document.getElementById(id + "_link"); |
| + | |
| + | if (lnk) { |
| + | if (state) { |
| + | lnk.setAttribute("realhref", lnk.getAttribute("href")); |
| + | lnk.removeAttribute("href"); |
| + | tinyMCEPopup.dom.addClass(img, 'disabled'); |
| + | } else { |
| + | if (lnk.getAttribute("realhref")) |
| + | lnk.setAttribute("href", lnk.getAttribute("realhref")); |
| + | |
| + | tinyMCEPopup.dom.removeClass(img, 'disabled'); |
| + | } |
| + | } |
| + | } |
| + | |
| + | function getBrowserHTML(id, target_form_element, type, prefix) { |
| + | var option = prefix + "_" + type + "_browser_callback", cb, html; |
| + | |
| + | cb = tinyMCEPopup.getParam(option, tinyMCEPopup.getParam("file_browser_callback")); |
| + | |
| + | if (!cb) |
| + | return ""; |
| + | |
| + | html = ""; |
| + | html += '<a id="' + id + '_link" href="javascript:openBrowser(\'' + id + '\',\'' + target_form_element + '\', \'' + type + '\',\'' + option + '\');" onmousedown="return false;" class="browse">'; |
| + | html += '<span id="' + id + '" title="' + tinyMCEPopup.getLang('browse') + '"> </span></a>'; |
| + | |
| + | return html; |
| + | } |
| + | |
| + | function openBrowser(img_id, target_form_element, type, option) { |
| + | var img = document.getElementById(img_id); |
| + | |
| + | if (img.className != "mceButtonDisabled") |
| + | tinyMCEPopup.openBrowser(target_form_element, type, option); |
| + | } |
| + | |
| + | function selectByValue(form_obj, field_name, value, add_custom, ignore_case) { |
| + | if (!form_obj || !form_obj.elements[field_name]) |
| + | return; |
| + | |
| + | var sel = form_obj.elements[field_name]; |
| + | |
| + | var found = false; |
| + | for (var i=0; i<sel.options.length; i++) { |
| + | var option = sel.options[i]; |
| + | |
| + | if (option.value == value || (ignore_case && option.value.toLowerCase() == value.toLowerCase())) { |
| + | option.selected = true; |
| + | found = true; |
| + | } else |
| + | option.selected = false; |
| + | } |
| + | |
| + | if (!found && add_custom && value != '') { |
| + | var option = new Option(value, value); |
| + | option.selected = true; |
| + | sel.options[sel.options.length] = option; |
| + | sel.selectedIndex = sel.options.length - 1; |
| + | } |
| + | |
| + | return found; |
| + | } |
| + | |
| + | function getSelectValue(form_obj, field_name) { |
| + | var elm = form_obj.elements[field_name]; |
| + | |
| + | if (elm == null || elm.options == null || elm.selectedIndex === -1) |
| + | return ""; |
| + | |
| + | return elm.options[elm.selectedIndex].value; |
| + | } |
| + | |
| + | function addSelectValue(form_obj, field_name, name, value) { |
| + | var s = form_obj.elements[field_name]; |
| + | var o = new Option(name, value); |
| + | s.options[s.options.length] = o; |
| + | } |
| + | |
| + | function addClassesToList(list_id, specific_option) { |
| + | // Setup class droplist |
| + | var styleSelectElm = document.getElementById(list_id); |
| + | var styles = tinyMCEPopup.getParam('theme_advanced_styles', false); |
| + | styles = tinyMCEPopup.getParam(specific_option, styles); |
| + | |
| + | if (styles) { |
| + | var stylesAr = styles.split(';'); |
| + | |
| + | for (var i=0; i<stylesAr.length; i++) { |
| + | if (stylesAr != "") { |
| + | var key, value; |
| + | |
| + | key = stylesAr[i].split('=')[0]; |
| + | value = stylesAr[i].split('=')[1]; |
| + | |
| + | styleSelectElm.options[styleSelectElm.length] = new Option(key, value); |
| + | } |
| + | } |
| + | } else { |
| + | tinymce.each(tinyMCEPopup.editor.dom.getClasses(), function(o) { |
| + | styleSelectElm.options[styleSelectElm.length] = new Option(o.title || o['class'], o['class']); |
| + | }); |
| + | } |
| + | } |
| + | |
| + | function isVisible(element_id) { |
| + | var elm = document.getElementById(element_id); |
| + | |
| + | return elm && elm.style.display != "none"; |
| + | } |
| + | |
| + | function convertRGBToHex(col) { |
| + | var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi"); |
| + | |
| + | var rgb = col.replace(re, "$1,$2,$3").split(','); |
| + | if (rgb.length == 3) { |
| + | r = parseInt(rgb[0]).toString(16); |
| + | g = parseInt(rgb[1]).toString(16); |
| + | b = parseInt(rgb[2]).toString(16); |
| + | |
| + | r = r.length == 1 ? '0' + r : r; |
| + | g = g.length == 1 ? '0' + g : g; |
| + | b = b.length == 1 ? '0' + b : b; |
| + | |
| + | return "#" + r + g + b; |
| + | } |
| + | |
| + | return col; |
| + | } |
| + | |
| + | function convertHexToRGB(col) { |
| + | if (col.indexOf('#') != -1) { |
| + | col = col.replace(new RegExp('[^0-9A-F]', 'gi'), ''); |
| + | |
| + | r = parseInt(col.substring(0, 2), 16); |
| + | g = parseInt(col.substring(2, 4), 16); |
| + | b = parseInt(col.substring(4, 6), 16); |
| + | |
| + | return "rgb(" + r + "," + g + "," + b + ")"; |
| + | } |
| + | |
| + | return col; |
| + | } |
| + | |
| + | function trimSize(size) { |
| + | return size.replace(/([0-9\.]+)px|(%|in|cm|mm|em|ex|pt|pc)/, '$1$2'); |
| + | } |
| + | |
| + | function getCSSSize(size) { |
| + | size = trimSize(size); |
| + | |
| + | if (size == "") |
| + | return ""; |
| + | |
| + | // Add px |
| + | if (/^[0-9]+$/.test(size)) |
| + | size += 'px'; |
| + | |
| + | return size; |
| + | } |
| + | |
| + | function getStyle(elm, attrib, style) { |
| + | var val = tinyMCEPopup.dom.getAttrib(elm, attrib); |
| + | |
| + | if (val != '') |
| + | return '' + val; |
| + | |
| + | if (typeof(style) == 'undefined') |
| + | style = attrib; |
| + | |
| + | return tinyMCEPopup.dom.getStyle(elm, style); |
| + | } |
public/javascripts/cms/3rdparty/tiny_mce/utils/mctabs.js
+77
-0
| @@ | @@ -0,0 +1,77 @@ |
| + | /** |
| + | * mctabs.js |
| + | * |
| + | * Copyright 2009, Moxiecode Systems AB |
| + | * Released under LGPL License. |
| + | * |
| + | * License: http://tinymce.moxiecode.com/license |
| + | * Contributing: http://tinymce.moxiecode.com/contributing |
| + | */ |
| + | |
| + | function MCTabs() { |
| + | this.settings = []; |
| + | }; |
| + | |
| + | MCTabs.prototype.init = function(settings) { |
| + | this.settings = settings; |
| + | }; |
| + | |
| + | MCTabs.prototype.getParam = function(name, default_value) { |
| + | var value = null; |
| + | |
| + | value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name]; |
| + | |
| + | // Fix bool values |
| + | if (value == "true" || value == "false") |
| + | return (value == "true"); |
| + | |
| + | return value; |
| + | }; |
| + | |
| + | MCTabs.prototype.displayTab = function(tab_id, panel_id) { |
| + | var panelElm, panelContainerElm, tabElm, tabContainerElm, selectionClass, nodes, i; |
| + | |
| + | panelElm= document.getElementById(panel_id); |
| + | panelContainerElm = panelElm ? panelElm.parentNode : null; |
| + | tabElm = document.getElementById(tab_id); |
| + | tabContainerElm = tabElm ? tabElm.parentNode : null; |
| + | selectionClass = this.getParam('selection_class', 'current'); |
| + | |
| + | if (tabElm && tabContainerElm) { |
| + | nodes = tabContainerElm.childNodes; |
| + | |
| + | // Hide all other tabs |
| + | for (i = 0; i < nodes.length; i++) { |
| + | if (nodes[i].nodeName == "LI") |
| + | nodes[i].className = ''; |
| + | } |
| + | |
| + | // Show selected tab |
| + | tabElm.className = 'current'; |
| + | } |
| + | |
| + | if (panelElm && panelContainerElm) { |
| + | nodes = panelContainerElm.childNodes; |
| + | |
| + | // Hide all other panels |
| + | for (i = 0; i < nodes.length; i++) { |
| + | if (nodes[i].nodeName == "DIV") |
| + | nodes[i].className = 'panel'; |
| + | } |
| + | |
| + | // Show selected panel |
| + | panelElm.className = 'current'; |
| + | } |
| + | }; |
| + | |
| + | MCTabs.prototype.getAnchor = function() { |
| + | var pos, url = document.location.href; |
| + | |
| + | if ((pos = url.lastIndexOf('#')) != -1) |
| + | return url.substring(pos + 1); |
| + | |
| + | return ""; |
| + | }; |
| + | |
| + | // Global instance |
| + | var mcTabs = new MCTabs(); |
public/javascripts/cms/3rdparty/tiny_mce/utils/validate.js
+220
-0
| @@ | @@ -0,0 +1,220 @@ |
| + | /** |
| + | * validate.js |
| + | * |
| + | * Copyright 2009, Moxiecode Systems AB |
| + | * Released under LGPL License. |
| + | * |
| + | * License: http://tinymce.moxiecode.com/license |
| + | * Contributing: http://tinymce.moxiecode.com/contributing |
| + | */ |
| + | |
| + | /** |
| + | // String validation: |
| + | |
| + | if (!Validator.isEmail('myemail')) |
| + | alert('Invalid email.'); |
| + | |
| + | // Form validation: |
| + | |
| + | var f = document.forms['myform']; |
| + | |
| + | if (!Validator.isEmail(f.myemail)) |
| + | alert('Invalid email.'); |
| + | */ |
| + | |
| + | var Validator = { |
| + | isEmail : function(s) { |
| + | return this.test(s, '^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$'); |
| + | }, |
| + | |
| + | isAbsUrl : function(s) { |
| + | return this.test(s, '^(news|telnet|nttp|file|http|ftp|https)://[-A-Za-z0-9\\.]+\\/?.*$'); |
| + | }, |
| + | |
| + | isSize : function(s) { |
| + | return this.test(s, '^[0-9]+(%|in|cm|mm|em|ex|pt|pc|px)?$'); |
| + | }, |
| + | |
| + | isId : function(s) { |
| + | return this.test(s, '^[A-Za-z_]([A-Za-z0-9_])*$'); |
| + | }, |
| + | |
| + | isEmpty : function(s) { |
| + | var nl, i; |
| + | |
| + | if (s.nodeName == 'SELECT' && s.selectedIndex < 1) |
| + | return true; |
| + | |
| + | if (s.type == 'checkbox' && !s.checked) |
| + | return true; |
| + | |
| + | if (s.type == 'radio') { |
| + | for (i=0, nl = s.form.elements; i<nl.length; i++) { |
| + | if (nl[i].type == "radio" && nl[i].name == s.name && nl[i].checked) |
| + | return false; |
| + | } |
| + | |
| + | return true; |
| + | } |
| + | |
| + | return new RegExp('^\\s*$').test(s.nodeType == 1 ? s.value : s); |
| + | }, |
| + | |
| + | isNumber : function(s, d) { |
| + | return !isNaN(s.nodeType == 1 ? s.value : s) && (!d || !this.test(s, '^-?[0-9]*\\.[0-9]*$')); |
| + | }, |
| + | |
| + | test : function(s, p) { |
| + | s = s.nodeType == 1 ? s.value : s; |
| + | |
| + | return s == '' || new RegExp(p).test(s); |
| + | } |
| + | }; |
| + | |
| + | var AutoValidator = { |
| + | settings : { |
| + | id_cls : 'id', |
| + | int_cls : 'int', |
| + | url_cls : 'url', |
| + | number_cls : 'number', |
| + | email_cls : 'email', |
| + | size_cls : 'size', |
| + | required_cls : 'required', |
| + | invalid_cls : 'invalid', |
| + | min_cls : 'min', |
| + | max_cls : 'max' |
| + | }, |
| + | |
| + | init : function(s) { |
| + | var n; |
| + | |
| + | for (n in s) |
| + | this.settings[n] = s[n]; |
| + | }, |
| + | |
| + | validate : function(f) { |
| + | var i, nl, s = this.settings, c = 0; |
| + | |
| + | nl = this.tags(f, 'label'); |
| + | for (i=0; i<nl.length; i++) |
| + | this.removeClass(nl[i], s.invalid_cls); |
| + | |
| + | c += this.validateElms(f, 'input'); |
| + | c += this.validateElms(f, 'select'); |
| + | c += this.validateElms(f, 'textarea'); |
| + | |
| + | return c == 3; |
| + | }, |
| + | |
| + | invalidate : function(n) { |
| + | this.mark(n.form, n); |
| + | }, |
| + | |
| + | reset : function(e) { |
| + | var t = ['label', 'input', 'select', 'textarea']; |
| + | var i, j, nl, s = this.settings; |
| + | |
| + | if (e == null) |
| + | return; |
| + | |
| + | for (i=0; i<t.length; i++) { |
| + | nl = this.tags(e.form ? e.form : e, t[i]); |
| + | for (j=0; j<nl.length; j++) |
| + | this.removeClass(nl[j], s.invalid_cls); |
| + | } |
| + | }, |
| + | |
| + | validateElms : function(f, e) { |
| + | var nl, i, n, s = this.settings, st = true, va = Validator, v; |
| + | |
| + | nl = this.tags(f, e); |
| + | for (i=0; i<nl.length; i++) { |
| + | n = nl[i]; |
| + | |
| + | this.removeClass(n, s.invalid_cls); |
| + | |
| + | if (this.hasClass(n, s.required_cls) && va.isEmpty(n)) |
| + | st = this.mark(f, n); |
| + | |
| + | if (this.hasClass(n, s.number_cls) && !va.isNumber(n)) |
| + | st = this.mark(f, n); |
| + | |
| + | if (this.hasClass(n, s.int_cls) && !va.isNumber(n, true)) |
| + | st = this.mark(f, n); |
| + | |
| + | if (this.hasClass(n, s.url_cls) && !va.isAbsUrl(n)) |
| + | st = this.mark(f, n); |
| + | |
| + | if (this.hasClass(n, s.email_cls) && !va.isEmail(n)) |
| + | st = this.mark(f, n); |
| + | |
| + | if (this.hasClass(n, s.size_cls) && !va.isSize(n)) |
| + | st = this.mark(f, n); |
| + | |
| + | if (this.hasClass(n, s.id_cls) && !va.isId(n)) |
| + | st = this.mark(f, n); |
| + | |
| + | if (this.hasClass(n, s.min_cls, true)) { |
| + | v = this.getNum(n, s.min_cls); |
| + | |
| + | if (isNaN(v) || parseInt(n.value) < parseInt(v)) |
| + | st = this.mark(f, n); |
| + | } |
| + | |
| + | if (this.hasClass(n, s.max_cls, true)) { |
| + | v = this.getNum(n, s.max_cls); |
| + | |
| + | if (isNaN(v) || parseInt(n.value) > parseInt(v)) |
| + | st = this.mark(f, n); |
| + | } |
| + | } |
| + | |
| + | return st; |
| + | }, |
| + | |
| + | hasClass : function(n, c, d) { |
| + | return new RegExp('\\b' + c + (d ? '[0-9]+' : '') + '\\b', 'g').test(n.className); |
| + | }, |
| + | |
| + | getNum : function(n, c) { |
| + | c = n.className.match(new RegExp('\\b' + c + '([0-9]+)\\b', 'g'))[0]; |
| + | c = c.replace(/[^0-9]/g, ''); |
| + | |
| + | return c; |
| + | }, |
| + | |
| + | addClass : function(n, c, b) { |
| + | var o = this.removeClass(n, c); |
| + | n.className = b ? c + (o != '' ? (' ' + o) : '') : (o != '' ? (o + ' ') : '') + c; |
| + | }, |
| + | |
| + | removeClass : function(n, c) { |
| + | c = n.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' '); |
| + | return n.className = c != ' ' ? c : ''; |
| + | }, |
| + | |
| + | tags : function(f, s) { |
| + | return f.getElementsByTagName(s); |
| + | }, |
| + | |
| + | mark : function(f, n) { |
| + | var s = this.settings; |
| + | |
| + | this.addClass(n, s.invalid_cls); |
| + | this.markLabels(f, n, s.invalid_cls); |
| + | |
| + | return false; |
| + | }, |
| + | |
| + | markLabels : function(f, n, ic) { |
| + | var nl, i; |
| + | |
| + | nl = this.tags(f, "label"); |
| + | for (i=0; i<nl.length; i++) { |
| + | if (nl[i].getAttribute("for") == n.id || nl[i].htmlFor == n.id) |
| + | this.addClass(nl[i], ic); |
| + | } |
| + | |
| + | return null; |
| + | } |
| + | }; |
public/javascripts/cms/cms.js
+0
-4
| @@ | @@ -40,10 +40,6 @@ $.CMS = function(){ |
| $.ajax({url: ['/cms-admin/pages', page_id, 'form_blocks'].join('/'), data: ({ layout_id: $(this).val()})}) | |
| }) | |
| - | // Datepicker |
| - | $('input[data-datepicker]').datepicker({dateFormat : 'yy-mm-dd'}); |
| - | |
| - | |
| }); // End $(document).ready() | |
public/javascripts/cms/codemirror.js
+0
-21
| @@ | @@ -1,21 +0,0 @@ |
| - | $.CMS.CodeMirror = function(){ |
| - | |
| - | $(document).ready(function(){ |
| - | $.CMS.CodeMirror.init(); |
| - | }).ajaxSuccess(function(){ |
| - | $.CMS.CodeMirror.init(); |
| - | }); |
| - | |
| - | return { |
| - | init: function(){ |
| - | $('.codeTextArea').each(function(i, el){ |
| - | CodeMirror.fromTextArea(el, { |
| - | parserfile: ["parsexml.js", "parsecss.js", "tokenizejavascript.js", "parsejavascript.js", "parsehtmlmixed.js"], |
| - | stylesheet: ["/stylesheets/codemirror/xmlcolors.css", "/stylesheets/codemirror/jscolors.css", "/stylesheets/codemirror/csscolors.css"], |
| - | path: "/javascripts/codemirror/", |
| - | iframeClass: 'codeMirrorIframe' |
| - | }); |
| - | }); |
| - | } |
| - | } |
| - | }(); |
public/javascripts/cms/jquery-ui.js
+102
-330
| @@ | @@ -1,354 +1,126 @@ |
| - | /*! |
| - | * jQuery UI 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI |
| - | */ /* |
| - | * jQuery UI 1.8 |
| + | /*! |
| + | * jQuery UI 1.8.4 |
| * | |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| + | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) |
| + | * Dual licensed under the MIT or GPL Version 2 licenses. |
| + | * http://jquery.org/license |
| * | |
| * http://docs.jquery.com/UI | |
| */ | |
| - | jQuery.ui||(function(a){a.ui={version:"1.8",plugin:{add:function(c,d,f){var e=a.ui[c].prototype;for(var b in f){e.plugins[b]=e.plugins[b]||[];e.plugins[b].push([d,f[b]])}},call:function(b,d,c){var f=b.plugins[d];if(!f||!b.element[0].parentNode){return}for(var e=0;e<f.length;e++){if(b.options[f[e][0]]){f[e][1].apply(b.element,c)}}}},contains:function(d,c){return document.compareDocumentPosition?d.compareDocumentPosition(c)&16:d!==c&&d.contains(c)},hasScroll:function(e,c){if(a(e).css("overflow")=="hidden"){return false}var b=(c&&c=="left")?"scrollLeft":"scrollTop",d=false;if(e[b]>0){return true}e[b]=1;d=(e[b]>0);e[b]=0;return d},isOverAxis:function(c,b,d){return(c>b)&&(c<(b+d))},isOver:function(g,c,f,e,b,d){return a.ui.isOverAxis(g,f,b)&&a.ui.isOverAxis(c,e,d)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};a.fn.extend({_focus:a.fn.focus,focus:function(b,c){return typeof b==="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus();(c&&c.call(d))},b)}):this._focus.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var b;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){b=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{b=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!b.length?a(document):b},zIndex:function(e){if(e!==undefined){return this.css("zIndex",e)}if(this.length){var c=a(this[0]),b,d;while(c.length&&c[0]!==document){b=c.css("position");if(b=="absolute"||b=="relative"||b=="fixed"){d=parseInt(c.css("zIndex"));if(!isNaN(d)&&d!=0){return d}}c=c.parent()}}return 0}});a.extend(a.expr[":"],{data:function(d,c,b){return !!a.data(d,b[3])},focusable:function(c){var d=c.nodeName.toLowerCase(),b=a.attr(c,"tabindex");return(/input|select|textarea|button|object/.test(d)?!c.disabled:"a"==d||"area"==d?c.href||!isNaN(b):!isNaN(b))&&!a(c)["area"==d?"parents":"closest"](":hidden").length},tabbable:function(c){var b=a.attr(c,"tabindex");return(isNaN(b)||b>=0)&&a(c).is(":focusable")}})})(jQuery);;/*! |
| - | * jQuery UI Widget 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Widget |
| - | */ /* |
| - | * jQuery UI Widget 1.8 |
| + | (function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.4",plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element,d)}},contains:function(a, |
| + | b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)},keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93, |
| + | CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable", |
| + | "off").css("MozUserSelect","")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none")},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this, |
| + | "overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"));if(!isNaN(b)&&b!=0)return b}a=a.parent()}}return 0}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-= |
| + | parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c.style(this,h,d(this,f)+"px")})};c.fn["outer"+ |
| + | b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c.style(this,h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"== |
| + | b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}})}})(jQuery); |
| + | ;/*! |
| + | * jQuery UI Widget 1.8.4 |
| * | |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| + | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) |
| + | * Dual licensed under the MIT or GPL Version 2 licenses. |
| + | * http://jquery.org/license |
| * | |
| * http://docs.jquery.com/UI/Widget | |
| */ | |
| - | (function(b){var a=b.fn.remove;b.fn.remove=function(c,d){return this.each(function(){if(!d){if(!c||b.filter(c,[this]).length){b("*",this).add(this).each(function(){b(this).triggerHandler("remove")})}}return a.call(b(this),c,d)})};b.widget=function(d,f,c){var e=d.split(".")[0],h;d=d.split(".")[1];h=e+"-"+d;if(!c){c=f;f=b.Widget}b.expr[":"][h]=function(i){return !!b.data(i,d)};b[e]=b[e]||{};b[e][d]=function(i,j){if(arguments.length){this._createWidget(i,j)}};var g=new f();g.options=b.extend({},g.options);b[e][d].prototype=b.extend(true,g,{namespace:e,widgetName:d,widgetEventPrefix:b[e][d].prototype.widgetEventPrefix||d,widgetBaseClass:h},c);b.widget.bridge(d,b[e][d])};b.widget.bridge=function(d,c){b.fn[d]=function(g){var e=typeof g==="string",f=Array.prototype.slice.call(arguments,1),h=this;g=!e&&f.length?b.extend.apply(null,[true,g].concat(f)):g;if(e&&g.substring(0,1)==="_"){return h}if(e){this.each(function(){var i=b.data(this,d),j=i&&b.isFunction(i[g])?i[g].apply(i,f):i;if(j!==i&&j!==undefined){h=j;return false}})}else{this.each(function(){var i=b.data(this,d);if(i){if(g){i.option(g)}i._init()}else{b.data(this,d,new c(g,this))}})}return h}};b.Widget=function(c,d){if(arguments.length){this._createWidget(c,d)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(d,e){this.element=b(e).data(this.widgetName,this);this.options=b.extend(true,{},this.options,b.metadata&&b.metadata.get(e)[this.widgetName],d);var c=this;this.element.bind("remove."+this.widgetName,function(){c.destroy()});this._create();this._init()},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled")},widget:function(){return this.element},option:function(e,f){var d=e,c=this;if(arguments.length===0){return b.extend({},c.options)}if(typeof e==="string"){if(f===undefined){return this.options[e]}d={};d[e]=f}b.each(d,function(g,h){c._setOption(g,h)});return c},_setOption:function(c,d){this.options[c]=d;if(c==="disabled"){this.widget()[d?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",d)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(d,e,f){var h=this.options[d];e=b.Event(e);e.type=(d===this.widgetEventPrefix?d:this.widgetEventPrefix+d).toLowerCase();f=f||{};if(e.originalEvent){for(var c=b.event.props.length,g;c;){g=b.event.props[--c];e[g]=e.originalEvent[g]}}this.element.trigger(e,f);return !(b.isFunction(h)&&h.call(this.element[0],e,f)===false||e.isDefaultPrevented())}}})(jQuery);;/*! |
| - | * jQuery UI Mouse 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Mouse |
| - | * |
| - | * Depends: |
| - | * jquery.ui.widget.js |
| - | */ /* |
| - | * jQuery UI Mouse 1.8 |
| + | (function(b,j){var k=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return k.call(b(this),a,c)})};b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options); |
| + | b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.substring(0,1)==="_")return h;e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}): |
| + | this.each(function(){var g=b.data(this,a);if(g){d&&g.option(d);g._init()}else b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,b.metadata&&b.metadata.get(c)[this.widgetName],a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()}); |
| + | this._create();this._init()},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(a,c){var d=a,e=this;if(arguments.length===0)return b.extend({},e.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}b.each(d,function(f, |
| + | h){e._setOption(f,h)});return e},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a= |
| + | b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery); |
| + | ;/*! |
| + | * jQuery UI Mouse 1.8.4 |
| * | |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| + | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) |
| + | * Dual licensed under the MIT or GPL Version 2 licenses. |
| + | * http://jquery.org/license |
| * | |
| * http://docs.jquery.com/UI/Mouse | |
| * | |
| * Depends: | |
| * jquery.ui.widget.js | |
| */ | |
| - | (function(a){a.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var b=this;this.element.bind("mousedown."+this.widgetName,function(c){return b._mouseDown(c)}).bind("click."+this.widgetName,function(c){if(b._preventClickEvent){b._preventClickEvent=false;c.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(d){d.originalEvent=d.originalEvent||{};if(d.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(d));this._mouseDownEvent=d;var c=this,e=(d.which==1),b=(typeof this.options.cancel=="string"?a(d.target).parents().add(d.target).filter(this.options.cancel).length:false);if(!e||b||!this._mouseCapture(d)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){c.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(d)!==false);if(!this._mouseStarted){d.preventDefault();return true}}this._mouseMoveDelegate=function(f){return c._mouseMove(f)};this._mouseUpDelegate=function(f){return c._mouseUp(f)};a(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(a.browser.safari||d.preventDefault());d.originalEvent.mouseHandled=true;return true},_mouseMove:function(b){if(a.browser.msie&&!b.button){return this._mouseUp(b)}if(this._mouseStarted){this._mouseDrag(b);return b.preventDefault()}if(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,b)!==false);(this._mouseStarted?this._mouseDrag(b):this._mouseUp(b))}return !this._mouseStarted},_mouseUp:function(b){a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(b.target==this._mouseDownEvent.target);this._mouseStop(b)}return false},_mouseDistanceMet:function(b){return(Math.max(Math.abs(this._mouseDownEvent.pageX-b.pageX),Math.abs(this._mouseDownEvent.pageY-b.pageY))>=this.options.distance)},_mouseDelayMet:function(b){return this.mouseDelayMet},_mouseStart:function(b){},_mouseDrag:function(b){},_mouseStop:function(b){},_mouseCapture:function(b){return true}})})(jQuery);;/* |
| - | * jQuery UI Position 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Position |
| - | */ (function(f){f.ui=f.ui||{};var c=/left|center|right/,e="center",d=/top|center|bottom/,g="center",a=f.fn.position,b=f.fn.offset;f.fn.position=function(i){if(!i||!i.of){return a.apply(this,arguments)}i=f.extend({},i);var l=f(i.of),n=(i.collision||"flip").split(" "),m=i.offset?i.offset.split(" "):[0,0],k,h,j;if(i.of.nodeType===9){k=l.width();h=l.height();j={top:0,left:0}}else{if(i.of.scrollTo&&i.of.document){k=l.width();h=l.height();j={top:l.scrollTop(),left:l.scrollLeft()}}else{if(i.of.preventDefault){i.at="left top";k=h=0;j={top:i.of.pageY,left:i.of.pageX}}else{k=l.outerWidth();h=l.outerHeight();j=l.offset()}}}f.each(["my","at"],function(){var o=(i[this]||"").split(" ");if(o.length===1){o=c.test(o[0])?o.concat([g]):d.test(o[0])?[e].concat(o):[e,g]}o[0]=c.test(o[0])?o[0]:e;o[1]=d.test(o[1])?o[1]:g;i[this]=o});if(n.length===1){n[1]=n[0]}m[0]=parseInt(m[0],10)||0;if(m.length===1){m[1]=m[0]}m[1]=parseInt(m[1],10)||0;if(i.at[0]==="right"){j.left+=k}else{if(i.at[0]===e){j.left+=k/2}}if(i.at[1]==="bottom"){j.top+=h}else{if(i.at[1]===g){j.top+=h/2}}j.left+=m[0];j.top+=m[1];return this.each(function(){var r=f(this),q=r.outerWidth(),p=r.outerHeight(),o=f.extend({},j);if(i.my[0]==="right"){o.left-=q}else{if(i.my[0]===e){o.left-=q/2}}if(i.my[1]==="bottom"){o.top-=p}else{if(i.my[1]===g){o.top-=p/2}}f.each(["left","top"],function(t,s){if(f.ui.position[n[t]]){f.ui.position[n[t]][s](o,{targetWidth:k,targetHeight:h,elemWidth:q,elemHeight:p,offset:m,my:i.my,at:i.at})}});if(f.fn.bgiframe){r.bgiframe()}r.offset(f.extend(o,{using:i.using}))})};f.ui.position={fit:{left:function(h,i){var k=f(window),j=h.left+i.elemWidth-k.width()-k.scrollLeft();h.left=j>0?h.left-j:Math.max(0,h.left)},top:function(h,i){var k=f(window),j=h.top+i.elemHeight-k.height()-k.scrollTop();h.top=j>0?h.top-j:Math.max(0,h.top)}},flip:{left:function(i,j){if(j.at[0]==="center"){return}var l=f(window),k=i.left+j.elemWidth-l.width()-l.scrollLeft(),h=j.my[0]==="left"?-j.elemWidth:j.my[0]==="right"?j.elemWidth:0,m=-2*j.offset[0];i.left+=i.left<0?h+j.targetWidth+m:k>0?h-j.targetWidth+m:0},top:function(i,k){if(k.at[1]==="center"){return}var m=f(window),l=i.top+k.elemHeight-m.height()-m.scrollTop(),h=k.my[1]==="top"?-k.elemHeight:k.my[1]==="bottom"?k.elemHeight:0,j=k.at[1]==="top"?k.targetHeight:-k.targetHeight,n=-2*k.offset[1];i.top+=i.top<0?h+k.targetHeight+n:l>0?h+j+n:0}}};if(!f.offset.setOffset){f.offset.setOffset=function(l,i){if(/static/.test(f.curCSS(l,"position"))){l.style.position="relative"}var k=f(l),n=k.offset(),h=parseInt(f.curCSS(l,"top",true),10)||0,m=parseInt(f.curCSS(l,"left",true),10)||0,j={top:(i.top-n.top)+h,left:(i.left-n.left)+m};if("using" in i){i.using.call(l,j)}else{k.css(j)}};f.fn.offset=function(h){var i=this[0];if(!i||!i.ownerDocument){return null}if(h){return this.each(function(){f.offset.setOffset(this,h)})}return b.call(this)}}}(jQuery));;/* |
| - | * jQuery UI Draggable 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Draggables |
| - | * |
| - | * Depends: |
| - | * jquery.ui.core.js |
| - | * jquery.ui.mouse.js |
| - | * jquery.ui.widget.js |
| - | */ (function(a){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper=="original"&&!(/^(?:r|a|f)/).test(this.element.css("position"))){this.element[0].style.position="relative"}(this.options.addClasses&&this.element.addClass("ui-draggable"));(this.options.disabled&&this.element.addClass("ui-draggable-disabled"));this._mouseInit()},destroy:function(){if(!this.element.data("draggable")){return}this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this},_mouseCapture:function(b){var c=this.options;if(this.helper||c.disabled||a(b.target).is(".ui-resizable-handle")){return false}this.handle=this._getHandle(b);if(!this.handle){return false}return true},_mouseStart:function(b){var c=this.options;this.helper=this._createHelper(b);this._cacheHelperProportions();if(a.ui.ddmanager){a.ui.ddmanager.current=this}this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(b);this.originalPageX=b.pageX;this.originalPageY=b.pageY;(c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt));if(c.containment){this._setContainment()}if(this._trigger("start",b)===false){this._clear();return false}this._cacheHelperProportions();if(a.ui.ddmanager&&!c.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,b)}this.helper.addClass("ui-draggable-dragging");this._mouseDrag(b,true);return true},_mouseDrag:function(b,d){this.position=this._generatePosition(b);this.positionAbs=this._convertPositionTo("absolute");if(!d){var c=this._uiHash();if(this._trigger("drag",b,c)===false){this._mouseUp({});return false}this.position=c.position}if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}if(a.ui.ddmanager){a.ui.ddmanager.drag(this,b)}return false},_mouseStop:function(c){var d=false;if(a.ui.ddmanager&&!this.options.dropBehaviour){d=a.ui.ddmanager.drop(this,c)}if(this.dropped){d=this.dropped;this.dropped=false}if(!this.element[0]||!this.element[0].parentNode){return false}if((this.options.revert=="invalid"&&!d)||(this.options.revert=="valid"&&d)||this.options.revert===true||(a.isFunction(this.options.revert)&&this.options.revert.call(this.element,d))){var b=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){if(b._trigger("stop",c)!==false){b._clear()}})}else{if(this._trigger("stop",c)!==false){this._clear()}}return false},cancel:function(){if(this.helper.is(".ui-draggable-dragging")){this._mouseUp({})}else{this._clear()}return this},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?true:false;a(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==b.target){c=true}});return c},_createHelper:function(c){var d=this.options;var b=a.isFunction(d.helper)?a(d.helper.apply(this.element[0],[c])):(d.helper=="clone"?this.element.clone():this.element);if(!b.parents("body").length){b.appendTo((d.appendTo=="parent"?this.element[0].parentNode:d.appendTo))}if(b[0]!=this.element[0]&&!(/(fixed|absolute)/).test(b.css("position"))){b.css("position","absolute")}return b},_adjustOffsetFromHelper:function(b){if(typeof b=="string"){b=b.split(" ")}if(a.isArray(b)){b={left:+b[0],top:+b[1]||0}}if("left" in b){this.offset.click.left=b.left+this.margins.left}if("right" in b){this.offset.click.left=this.helperProportions.width-b.right+this.margins.left}if("top" in b){this.offset.click.top=b.top+this.margins.top}if("bottom" in b){this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])){b.left+=this.scrollParent.scrollLeft();b.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)){b={top:0,left:0}}return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var b=this.element.position();return{top:b.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:b.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.element.css("marginLeft"),10)||0),top:(parseInt(this.element.css("marginTop"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e=this.options;if(e.containment=="parent"){e.containment=this.helper[0].parentNode}if(e.containment=="document"||e.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(e.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(e.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(e.containment)&&e.containment.constructor!=Array){var c=a(e.containment)[0];if(!c){return}var d=a(e.containment).offset();var b=(a(c).css("overflow")!="hidden");this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(b?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(b?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}else{if(e.containment.constructor==Array){this.containment=e.containment}}},_convertPositionTo:function(f,h){if(!h){h=this.position}var c=f=="absolute"?1:-1;var e=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=(/(html|body)/i).test(b[0].tagName);return{top:(h.top+this.offset.relative.top*c+this.offset.parent.top*c-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(g?0:b.scrollTop()))*c)),left:(h.left+this.offset.relative.left*c+this.offset.parent.left*c-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:b.scrollLeft())*c))}},_generatePosition:function(e){var h=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,i=(/(html|body)/i).test(b[0].tagName);var d=e.pageX;var c=e.pageY;if(this.originalPosition){if(this.containment){if(e.pageX-this.offset.click.left<this.containment[0]){d=this.containment[0]+this.offset.click.left}if(e.pageY-this.offset.click.top<this.containment[1]){c=this.containment[1]+this.offset.click.top}if(e.pageX-this.offset.click.left>this.containment[2]){d=this.containment[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>this.containment[3]){c=this.containment[3]+this.offset.click.top}}if(h.grid){var g=this.originalPageY+Math.round((c-this.originalPageY)/h.grid[1])*h.grid[1];c=this.containment?(!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:(!(g-this.offset.click.top<this.containment[1])?g-h.grid[1]:g+h.grid[1])):g;var f=this.originalPageX+Math.round((d-this.originalPageX)/h.grid[0])*h.grid[0];d=this.containment?(!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:(!(f-this.offset.click.left<this.containment[0])?f-h.grid[0]:f+h.grid[0])):f}}return{top:(c-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(i?0:b.scrollTop())))),left:(d-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():i?0:b.scrollLeft())))}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");if(this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval){this.helper.remove()}this.helper=null;this.cancelHelperRemoval=false},_trigger:function(b,c,d){d=d||this._uiHash();a.ui.plugin.call(this,b,[c,d]);if(b=="drag"){this.positionAbs=this._convertPositionTo("absolute")}return a.Widget.prototype._trigger.call(this,b,c,d)},plugins:{},_uiHash:function(b){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});a.extend(a.ui.draggable,{version:"1.8"});a.ui.plugin.add("draggable","connectToSortable",{start:function(c,e){var d=a(this).data("draggable"),f=d.options,b=a.extend({},e,{item:d.element});d.sortables=[];a(f.connectToSortable).each(function(){var g=a.data(this,"sortable");if(g&&!g.options.disabled){d.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",c,b)}})},stop:function(c,e){var d=a(this).data("draggable"),b=a.extend({},e,{item:d.element});a.each(d.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;d.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert){this.instance.options.revert=true}this.instance._mouseStop(c);this.instance.options.helper=this.instance.options._helper;if(d.options.helper=="original"){this.instance.currentItem.css({top:"auto",left:"auto"})}}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",c,b)}})},drag:function(c,f){var e=a(this).data("draggable"),b=this;var d=function(i){var n=this.offset.click.top,m=this.offset.click.left;var g=this.positionAbs.top,k=this.positionAbs.left;var j=i.height,l=i.width;var p=i.top,h=i.left;return a.ui.isOver(g+n,k+m,p,h,j,l)};a.each(e.sortables,function(g){this.instance.positionAbs=e.positionAbs;this.instance.helperProportions=e.helperProportions;this.instance.offset.click=e.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=a(b).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return f.helper[0]};c.target=this.instance.currentItem[0];this.instance._mouseCapture(c,true);this.instance._mouseStart(c,true,true);this.instance.offset.click.top=e.offset.click.top;this.instance.offset.click.left=e.offset.click.left;this.instance.offset.parent.left-=e.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=e.offset.parent.top-this.instance.offset.parent.top;e._trigger("toSortable",c);e.dropped=this.instance.element;e.currentItem=e.element;this.instance.fromOutside=e}if(this.instance.currentItem){this.instance._mouseDrag(c)}}else{if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",c,this.instance._uiHash(this.instance));this.instance._mouseStop(c,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();if(this.instance.placeholder){this.instance.placeholder.remove()}e._trigger("fromSortable",c);e.dropped=false}}})}});a.ui.plugin.add("draggable","cursor",{start:function(c,d){var b=a("body"),e=a(this).data("draggable").options;if(b.css("cursor")){e._cursor=b.css("cursor")}b.css("cursor",e.cursor)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._cursor){a("body").css("cursor",d._cursor)}}});a.ui.plugin.add("draggable","iframeFix",{start:function(b,c){var d=a(this).data("draggable").options;a(d.iframeFix===true?"iframe":d.iframeFix).each(function(){a('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1000}).css(a(this).offset()).appendTo("body")})},stop:function(b,c){a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});a.ui.plugin.add("draggable","opacity",{start:function(c,d){var b=a(d.helper),e=a(this).data("draggable").options;if(b.css("opacity")){e._opacity=b.css("opacity")}b.css("opacity",e.opacity)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._opacity){a(c.helper).css("opacity",d._opacity)}}});a.ui.plugin.add("draggable","scroll",{start:function(c,d){var b=a(this).data("draggable");if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){b.overflowOffset=b.scrollParent.offset()}},drag:function(d,e){var c=a(this).data("draggable"),f=c.options,b=false;if(c.scrollParent[0]!=document&&c.scrollParent[0].tagName!="HTML"){if(!f.axis||f.axis!="x"){if((c.overflowOffset.top+c.scrollParent[0].offsetHeight)-d.pageY<f.scrollSensitivity){c.scrollParent[0].scrollTop=b=c.scrollParent[0].scrollTop+f.scrollSpeed}else{if(d.pageY-c.overflowOffset.top<f.scrollSensitivity){c.scrollParent[0].scrollTop=b=c.scrollParent[0].scrollTop-f.scrollSpeed}}}if(!f.axis||f.axis!="y"){if((c.overflowOffset.left+c.scrollParent[0].offsetWidth)-d.pageX<f.scrollSensitivity){c.scrollParent[0].scrollLeft=b=c.scrollParent[0].scrollLeft+f.scrollSpeed}else{if(d.pageX-c.overflowOffset.left<f.scrollSensitivity){c.scrollParent[0].scrollLeft=b=c.scrollParent[0].scrollLeft-f.scrollSpeed}}}}else{if(!f.axis||f.axis!="x"){if(d.pageY-a(document).scrollTop()<f.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()-f.scrollSpeed)}else{if(a(window).height()-(d.pageY-a(document).scrollTop())<f.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()+f.scrollSpeed)}}}if(!f.axis||f.axis!="y"){if(d.pageX-a(document).scrollLeft()<f.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()-f.scrollSpeed)}else{if(a(window).width()-(d.pageX-a(document).scrollLeft())<f.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()+f.scrollSpeed)}}}}if(b!==false&&a.ui.ddmanager&&!f.dropBehaviour){a.ui.ddmanager.prepareOffsets(c,d)}}});a.ui.plugin.add("draggable","snap",{start:function(c,d){var b=a(this).data("draggable"),e=b.options;b.snapElements=[];a(e.snap.constructor!=String?(e.snap.items||":data(draggable)"):e.snap).each(function(){var g=a(this);var f=g.offset();if(this!=b.element[0]){b.snapElements.push({item:this,width:g.outerWidth(),height:g.outerHeight(),top:f.top,left:f.left})}})},drag:function(u,p){var g=a(this).data("draggable"),q=g.options;var y=q.snapTolerance;var x=p.offset.left,w=x+g.helperProportions.width,f=p.offset.top,e=f+g.helperProportions.height;for(var v=g.snapElements.length-1;v>=0;v--){var s=g.snapElements[v].left,n=s+g.snapElements[v].width,m=g.snapElements[v].top,A=m+g.snapElements[v].height;if(!((s-y<x&&x<n+y&&m-y<f&&f<A+y)||(s-y<x&&x<n+y&&m-y<e&&e<A+y)||(s-y<w&&w<n+y&&m-y<f&&f<A+y)||(s-y<w&&w<n+y&&m-y<e&&e<A+y))){if(g.snapElements[v].snapping){(g.options.snap.release&&g.options.snap.release.call(g.element,u,a.extend(g._uiHash(),{snapItem:g.snapElements[v].item})))}g.snapElements[v].snapping=false;continue}if(q.snapMode!="inner"){var c=Math.abs(m-e)<=y;var z=Math.abs(A-f)<=y;var j=Math.abs(s-w)<=y;var k=Math.abs(n-x)<=y;if(c){p.position.top=g._convertPositionTo("relative",{top:m-g.helperProportions.height,left:0}).top-g.margins.top}if(z){p.position.top=g._convertPositionTo("relative",{top:A,left:0}).top-g.margins.top}if(j){p.position.left=g._convertPositionTo("relative",{top:0,left:s-g.helperProportions.width}).left-g.margins.left}if(k){p.position.left=g._convertPositionTo("relative",{top:0,left:n}).left-g.margins.left}}var h=(c||z||j||k);if(q.snapMode!="outer"){var c=Math.abs(m-f)<=y;var z=Math.abs(A-e)<=y;var j=Math.abs(s-x)<=y;var k=Math.abs(n-w)<=y;if(c){p.position.top=g._convertPositionTo("relative",{top:m,left:0}).top-g.margins.top}if(z){p.position.top=g._convertPositionTo("relative",{top:A-g.helperProportions.height,left:0}).top-g.margins.top}if(j){p.position.left=g._convertPositionTo("relative",{top:0,left:s}).left-g.margins.left}if(k){p.position.left=g._convertPositionTo("relative",{top:0,left:n-g.helperProportions.width}).left-g.margins.left}}if(!g.snapElements[v].snapping&&(c||z||j||k||h)){(g.options.snap.snap&&g.options.snap.snap.call(g.element,u,a.extend(g._uiHash(),{snapItem:g.snapElements[v].item})))}g.snapElements[v].snapping=(c||z||j||k||h)}}});a.ui.plugin.add("draggable","stack",{start:function(c,d){var f=a(this).data("draggable").options;var e=a.makeArray(a(f.stack)).sort(function(h,g){return(parseInt(a(h).css("zIndex"),10)||0)-(parseInt(a(g).css("zIndex"),10)||0)});if(!e.length){return}var b=parseInt(e[0].style.zIndex)||0;a(e).each(function(g){this.style.zIndex=b+g});this[0].style.zIndex=b+e.length}});a.ui.plugin.add("draggable","zIndex",{start:function(c,d){var b=a(d.helper),e=a(this).data("draggable").options;if(b.css("zIndex")){e._zIndex=b.css("zIndex")}b.css("zIndex",e.zIndex)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._zIndex){a(c.helper).css("zIndex",d._zIndex)}}})})(jQuery);;/* |
| - | * jQuery UI Droppable 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Droppables |
| - | * |
| - | * Depends: |
| - | * jquery.ui.core.js |
| - | * jquery.ui.widget.js |
| - | * jquery.ui.mouse.js |
| - | * jquery.ui.draggable.js |
| - | */ (function(a){a.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var c=this.options,b=c.accept;this.isover=0;this.isout=1;this.accept=a.isFunction(b)?b:function(e){return e.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};a.ui.ddmanager.droppables[c.scope]=a.ui.ddmanager.droppables[c.scope]||[];a.ui.ddmanager.droppables[c.scope].push(this);(c.addClasses&&this.element.addClass("ui-droppable"))},destroy:function(){var b=a.ui.ddmanager.droppables[this.options.scope];for(var c=0;c<b.length;c++){if(b[c]==this){b.splice(c,1)}}this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(b,c){if(b=="accept"){this.accept=a.isFunction(c)?c:function(e){return e.is(c)}}a.Widget.prototype._setOption.apply(this,arguments)},_activate:function(c){var b=a.ui.ddmanager.current;if(this.options.activeClass){this.element.addClass(this.options.activeClass)}(b&&this._trigger("activate",c,this.ui(b)))},_deactivate:function(c){var b=a.ui.ddmanager.current;if(this.options.activeClass){this.element.removeClass(this.options.activeClass)}(b&&this._trigger("deactivate",c,this.ui(b)))},_over:function(c){var b=a.ui.ddmanager.current;if(!b||(b.currentItem||b.element)[0]==this.element[0]){return}if(this.accept.call(this.element[0],(b.currentItem||b.element))){if(this.options.hoverClass){this.element.addClass(this.options.hoverClass)}this._trigger("over",c,this.ui(b))}},_out:function(c){var b=a.ui.ddmanager.current;if(!b||(b.currentItem||b.element)[0]==this.element[0]){return}if(this.accept.call(this.element[0],(b.currentItem||b.element))){if(this.options.hoverClass){this.element.removeClass(this.options.hoverClass)}this._trigger("out",c,this.ui(b))}},_drop:function(c,d){var b=d||a.ui.ddmanager.current;if(!b||(b.currentItem||b.element)[0]==this.element[0]){return false}var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var f=a.data(this,"droppable");if(f.options.greedy&&!f.options.disabled&&f.options.scope==b.options.scope&&f.accept.call(f.element[0],(b.currentItem||b.element))&&a.ui.intersect(b,a.extend(f,{offset:f.element.offset()}),f.options.tolerance)){e=true;return false}});if(e){return false}if(this.accept.call(this.element[0],(b.currentItem||b.element))){if(this.options.activeClass){this.element.removeClass(this.options.activeClass)}if(this.options.hoverClass){this.element.removeClass(this.options.hoverClass)}this._trigger("drop",c,this.ui(b));return this.element}return false},ui:function(b){return{draggable:(b.currentItem||b.element),helper:b.helper,position:b.position,offset:b.positionAbs}}});a.extend(a.ui.droppable,{version:"1.8"});a.ui.intersect=function(q,j,o){if(!j.offset){return false}var e=(q.positionAbs||q.position.absolute).left,d=e+q.helperProportions.width,n=(q.positionAbs||q.position.absolute).top,m=n+q.helperProportions.height;var g=j.offset.left,c=g+j.proportions.width,p=j.offset.top,k=p+j.proportions.height;switch(o){case"fit":return(g<e&&d<c&&p<n&&m<k);break;case"intersect":return(g<e+(q.helperProportions.width/2)&&d-(q.helperProportions.width/2)<c&&p<n+(q.helperProportions.height/2)&&m-(q.helperProportions.height/2)<k);break;case"pointer":var h=((q.positionAbs||q.position.absolute).left+(q.clickOffset||q.offset.click).left),i=((q.positionAbs||q.position.absolute).top+(q.clickOffset||q.offset.click).top),f=a.ui.isOver(i,h,p,g,j.proportions.height,j.proportions.width);return f;break;case"touch":return((n>=p&&n<=k)||(m>=p&&m<=k)||(n<p&&m>k))&&((e>=g&&e<=c)||(d>=g&&d<=c)||(e<g&&d>c));break;default:return false;break}};a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,g){var b=a.ui.ddmanager.droppables[e.options.scope]||[];var f=g?g.type:null;var h=(e.currentItem||e.element).find(":data(droppable)").andSelf();droppablesLoop:for(var d=0;d<b.length;d++){if(b[d].options.disabled||(e&&!b[d].accept.call(b[d].element[0],(e.currentItem||e.element)))){continue}for(var c=0;c<h.length;c++){if(h[c]==b[d].element[0]){b[d].proportions.height=0;continue droppablesLoop}}b[d].visible=b[d].element.css("display")!="none";if(!b[d].visible){continue}b[d].offset=b[d].element.offset();b[d].proportions={width:b[d].element[0].offsetWidth,height:b[d].element[0].offsetHeight};if(f=="mousedown"){b[d]._activate.call(b[d],g)}}},drop:function(b,c){var d=false;a.each(a.ui.ddmanager.droppables[b.options.scope]||[],function(){if(!this.options){return}if(!this.options.disabled&&this.visible&&a.ui.intersect(b,this,this.options.tolerance)){d=d||this._drop.call(this,c)}if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],(b.currentItem||b.element))){this.isout=1;this.isover=0;this._deactivate.call(this,c)}});return d},drag:function(b,c){if(b.options.refreshPositions){a.ui.ddmanager.prepareOffsets(b,c)}a.each(a.ui.ddmanager.droppables[b.options.scope]||[],function(){if(this.options.disabled||this.greedyChild||!this.visible){return}var e=a.ui.intersect(b,this,this.options.tolerance);var g=!e&&this.isover==1?"isout":(e&&this.isover==0?"isover":null);if(!g){return}var f;if(this.options.greedy){var d=this.element.parents(":data(droppable):eq(0)");if(d.length){f=a.data(d[0],"droppable");f.greedyChild=(g=="isover"?1:0)}}if(f&&g=="isover"){f.isover=0;f.isout=1;f._out.call(f,c)}this[g]=1;this[g=="isout"?"isover":"isout"]=0;this[g=="isover"?"_over":"_out"].call(this,c);if(f&&g=="isout"){f.isout=0;f.isover=1;f._over.call(f,c)}})}}})(jQuery);;/* |
| - | * jQuery UI Resizable 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Resizables |
| - | * |
| - | * Depends: |
| - | * jquery.ui.core.js |
| - | * jquery.ui.mouse.js |
| - | * jquery.ui.widget.js |
| - | */ (function(c){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var e=this,j=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(j.aspectRatio),aspectRatio:j.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:j.helper||j.ghost||j.animate?j.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){if(/relative/.test(this.element.css("position"))&&c.browser.opera){this.element.css({position:"relative",top:"auto",left:"auto"})}this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=j.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var k=this.handles.split(",");this.handles={};for(var f=0;f<k.length;f++){var h=c.trim(k[f]),d="ui-resizable-"+h;var g=c('<div class="ui-resizable-handle '+d+'"></div>');if(/sw|se|ne|nw/.test(h)){g.css({zIndex:++j.zIndex})}if("se"==h){g.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[h]=".ui-resizable-"+h;this.element.append(g)}}this._renderAxis=function(p){p=p||this.element;for(var m in this.handles){if(this.handles[m].constructor==String){this.handles[m]=c(this.handles[m],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var n=c(this.handles[m],this.element),o=0;o=/sw|ne|nw|se|n|s/.test(m)?n.outerHeight():n.outerWidth();var l=["padding",/ne|nw|n/.test(m)?"Top":/se|sw|s/.test(m)?"Bottom":/^e$/.test(m)?"Right":"Left"].join("");p.css(l,o);this._proportionallyResize()}if(!c(this.handles[m]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!e.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}e.axis=i&&i[1]?i[1]:"se"}});if(j.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){c(this).removeClass("ui-resizable-autohide");e._handles.show()},function(){if(!e.resizing){c(this).addClass("ui-resizable-autohide");e._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var d=function(f){c(f).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){d(this.element);var e=this.element;e.after(this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);d(this.originalElement);return this},_mouseCapture:function(e){var f=false;for(var d in this.handles){if(c(this.handles[d])[0]==e.target){f=true}}return !this.options.disabled&&f},_mouseStart:function(f){var i=this.options,e=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(d.is(".ui-draggable")||(/absolute/).test(d.css("position"))){d.css({position:"absolute",top:e.top,left:e.left})}if(c.browser.opera&&(/relative/).test(d.css("position"))){d.css({position:"relative",top:"auto",left:"auto"})}this._renderProxy();var j=b(this.helper.css("left")),g=b(this.helper.css("top"));if(i.containment){j+=c(i.containment).scrollLeft()||0;g+=c(i.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:j,top:g};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:j,top:g};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:f.pageX,top:f.pageY};this.aspectRatio=(typeof i.aspectRatio=="number")?i.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var h=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",h=="auto"?this.axis+"-resize":h);d.addClass("ui-resizable-resizing");this._propagate("start",f);return true},_mouseDrag:function(d){var g=this.helper,f=this.options,l={},p=this,i=this.originalMousePosition,m=this.axis;var q=(d.pageX-i.left)||0,n=(d.pageY-i.top)||0;var h=this._change[m];if(!h){return false}var k=h.apply(this,[d,q,n]),j=c.browser.msie&&c.browser.version<7,e=this.sizeDiff;if(this._aspectRatio||d.shiftKey){k=this._updateRatio(k,d)}k=this._respectSize(k,d);this._propagate("resize",d);g.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(k);this._trigger("resize",d,this.ui());return false},_mouseStop:function(g){this.resizing=false;var h=this.options,l=this;if(this._helper){var f=this._proportionallyResizeElements,d=f.length&&(/textarea/i).test(f[0].nodeName),e=d&&c.ui.hasScroll(f[0],"left")?0:l.sizeDiff.height,j=d?0:l.sizeDiff.width;var m={width:(l.size.width-j),height:(l.size.height-e)},i=(parseInt(l.element.css("left"),10)+(l.position.left-l.originalPosition.left))||null,k=(parseInt(l.element.css("top"),10)+(l.position.top-l.originalPosition.top))||null;if(!h.animate){this.element.css(c.extend(m,{top:k,left:i}))}l.helper.height(l.size.height);l.helper.width(l.size.width);if(this._helper&&!h.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",g);if(this._helper){this.helper.remove()}return false},_updateCache:function(d){var e=this.options;this.offset=this.helper.offset();if(a(d.left)){this.position.left=d.left}if(a(d.top)){this.position.top=d.top}if(a(d.height)){this.size.height=d.height}if(a(d.width)){this.size.width=d.width}},_updateRatio:function(g,f){var h=this.options,i=this.position,e=this.size,d=this.axis;if(g.height){g.width=(e.height*this.aspectRatio)}else{if(g.width){g.height=(e.width/this.aspectRatio)}}if(d=="sw"){g.left=i.left+(e.width-g.width);g.top=null}if(d=="nw"){g.top=i.top+(e.height-g.height);g.left=i.left+(e.width-g.width)}return g},_respectSize:function(k,f){var i=this.helper,h=this.options,q=this._aspectRatio||f.shiftKey,p=this.axis,s=a(k.width)&&h.maxWidth&&(h.maxWidth<k.width),l=a(k.height)&&h.maxHeight&&(h.maxHeight<k.height),g=a(k.width)&&h.minWidth&&(h.minWidth>k.width),r=a(k.height)&&h.minHeight&&(h.minHeight>k.height);if(g){k.width=h.minWidth}if(r){k.height=h.minHeight}if(s){k.width=h.maxWidth}if(l){k.height=h.maxHeight}var e=this.originalPosition.left+this.originalSize.width,n=this.position.top+this.size.height;var j=/sw|nw|w/.test(p),d=/nw|ne|n/.test(p);if(g&&j){k.left=e-h.minWidth}if(s&&j){k.left=e-h.maxWidth}if(r&&d){k.top=n-h.minHeight}if(l&&d){k.top=n-h.maxHeight}var m=!k.width&&!k.height;if(m&&!k.left&&k.top){k.top=null}else{if(m&&!k.top&&k.left){k.left=null}}return k},_proportionallyResize:function(){var j=this.options;if(!this._proportionallyResizeElements.length){return}var f=this.helper||this.element;for(var e=0;e<this._proportionallyResizeElements.length;e++){var g=this._proportionallyResizeElements[e];if(!this.borderDif){var d=[g.css("borderTopWidth"),g.css("borderRightWidth"),g.css("borderBottomWidth"),g.css("borderLeftWidth")],h=[g.css("paddingTop"),g.css("paddingRight"),g.css("paddingBottom"),g.css("paddingLeft")];this.borderDif=c.map(d,function(k,m){var l=parseInt(k,10)||0,n=parseInt(h[m],10)||0;return l+n})}if(c.browser.msie&&!(!(c(f).is(":hidden")||c(f).parents(":hidden").length))){continue}g.css({height:(f.height()-this.borderDif[0]-this.borderDif[2])||0,width:(f.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var e=this.element,h=this.options;this.elementOffset=e.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var d=c.browser.msie&&c.browser.version<7,f=(d?1:0),g=(d?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+g,height:this.element.outerHeight()+g,position:"absolute",left:this.elementOffset.left-f+"px",top:this.elementOffset.top-f+"px",zIndex:++h.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(f,e,d){return{width:this.originalSize.width+e}},w:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{left:h.left+e,width:f.width-e}},n:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{top:h.top+d,height:f.height-d}},s:function(f,e,d){return{height:this.originalSize.height+d}},se:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},sw:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[f,e,d]))},ne:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},nw:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[f,e,d]))}},_propagate:function(e,d){c.ui.plugin.call(this,e,[d,this.ui()]);(e!="resize"&&this._trigger(e,d,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8"});c.ui.plugin.add("resizable","alsoResize",{start:function(e,f){var d=c(this).data("resizable"),h=d.options;var g=function(i){c(i).each(function(){c(this).data("resizable-alsoresize",{width:parseInt(c(this).width(),10),height:parseInt(c(this).height(),10),left:parseInt(c(this).css("left"),10),top:parseInt(c(this).css("top"),10)})})};if(typeof(h.alsoResize)=="object"&&!h.alsoResize.parentNode){if(h.alsoResize.length){h.alsoResize=h.alsoResize[0];g(h.alsoResize)}else{c.each(h.alsoResize,function(i,j){g(i)})}}else{g(h.alsoResize)}},resize:function(f,h){var e=c(this).data("resizable"),i=e.options,g=e.originalSize,k=e.originalPosition;var j={height:(e.size.height-g.height)||0,width:(e.size.width-g.width)||0,top:(e.position.top-k.top)||0,left:(e.position.left-k.left)||0},d=function(l,m){c(l).each(function(){var p=c(this),q=c(this).data("resizable-alsoresize"),o={},n=m&&m.length?m:["width","height","top","left"];c.each(n||["width","height","top","left"],function(r,t){var s=(q[t]||0)+(j[t]||0);if(s&&s>=0){o[t]=s||null}});if(/relative/.test(p.css("position"))&&c.browser.opera){e._revertToRelativePosition=true;p.css({position:"absolute",top:"auto",left:"auto"})}p.css(o)})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.nodeType){c.each(i.alsoResize,function(l,m){d(l,m)})}else{d(i.alsoResize)}},stop:function(e,f){var d=c(this).data("resizable");if(d._revertToRelativePosition&&c.browser.opera){d._revertToRelativePosition=false;el.css({position:"relative"})}c(this).removeData("resizable-alsoresize-start")}});c.ui.plugin.add("resizable","animate",{stop:function(h,m){var n=c(this).data("resizable"),i=n.options;var g=n._proportionallyResizeElements,d=g.length&&(/textarea/i).test(g[0].nodeName),e=d&&c.ui.hasScroll(g[0],"left")?0:n.sizeDiff.height,k=d?0:n.sizeDiff.width;var f={width:(n.size.width-k),height:(n.size.height-e)},j=(parseInt(n.element.css("left"),10)+(n.position.left-n.originalPosition.left))||null,l=(parseInt(n.element.css("top"),10)+(n.position.top-n.originalPosition.top))||null;n.element.animate(c.extend(f,l&&j?{top:l,left:j}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var o={width:parseInt(n.element.css("width"),10),height:parseInt(n.element.css("height"),10),top:parseInt(n.element.css("top"),10),left:parseInt(n.element.css("left"),10)};if(g&&g.length){c(g[0]).css({width:o.width,height:o.height})}n._updateCache(o);n._propagate("resize",h)}})}});c.ui.plugin.add("resizable","containment",{start:function(e,q){var s=c(this).data("resizable"),i=s.options,k=s.element;var f=i.containment,j=(f instanceof c)?f.get(0):(/parent/.test(f))?k.parent().get(0):f;if(!j){return}s.containerElement=c(j);if(/document/.test(f)||f==document){s.containerOffset={left:0,top:0};s.containerPosition={left:0,top:0};s.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var m=c(j),h=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){h[p]=b(m.css("padding"+o))});s.containerOffset=m.offset();s.containerPosition=m.position();s.containerSize={height:(m.innerHeight()-h[3]),width:(m.innerWidth()-h[1])};var n=s.containerOffset,d=s.containerSize.height,l=s.containerSize.width,g=(c.ui.hasScroll(j,"left")?j.scrollWidth:l),r=(c.ui.hasScroll(j)?j.scrollHeight:d);s.parentData={element:j,left:n.left,top:n.top,width:g,height:r}}},resize:function(f,p){var s=c(this).data("resizable"),h=s.options,e=s.containerSize,n=s.containerOffset,l=s.size,m=s.position,q=s._aspectRatio||f.shiftKey,d={top:0,left:0},g=s.containerElement;if(g[0]!=document&&(/static/).test(g.css("position"))){d=n}if(m.left<(s._helper?n.left:0)){s.size.width=s.size.width+(s._helper?(s.position.left-n.left):(s.position.left-d.left));if(q){s.size.height=s.size.width/h.aspectRatio}s.position.left=h.helper?n.left:0}if(m.top<(s._helper?n.top:0)){s.size.height=s.size.height+(s._helper?(s.position.top-n.top):s.position.top);if(q){s.size.width=s.size.height*h.aspectRatio}s.position.top=s._helper?n.top:0}s.offset.left=s.parentData.left+s.position.left;s.offset.top=s.parentData.top+s.position.top;var k=Math.abs((s._helper?s.offset.left-d.left:(s.offset.left-d.left))+s.sizeDiff.width),r=Math.abs((s._helper?s.offset.top-d.top:(s.offset.top-n.top))+s.sizeDiff.height);var j=s.containerElement.get(0)==s.element.parent().get(0),i=/relative|absolute/.test(s.containerElement.css("position"));if(j&&i){k-=s.parentData.left}if(k+s.size.width>=s.parentData.width){s.size.width=s.parentData.width-k;if(q){s.size.height=s.size.width/s.aspectRatio}}if(r+s.size.height>=s.parentData.height){s.size.height=s.parentData.height-r;if(q){s.size.width=s.size.height*s.aspectRatio}}},stop:function(e,m){var p=c(this).data("resizable"),f=p.options,k=p.position,l=p.containerOffset,d=p.containerPosition,g=p.containerElement;var i=c(p.helper),q=i.offset(),n=i.outerWidth()-p.sizeDiff.width,j=i.outerHeight()-p.sizeDiff.height;if(p._helper&&!f.animate&&(/relative/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}if(p._helper&&!f.animate&&(/static/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}}});c.ui.plugin.add("resizable","ghost",{start:function(f,g){var d=c(this).data("resizable"),h=d.options,e=d.size;d.ghost=d.originalElement.clone();d.ghost.css({opacity:0.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof h.ghost=="string"?h.ghost:"");d.ghost.appendTo(d.helper)},resize:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost){d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})}},stop:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost&&d.helper){d.helper.get(0).removeChild(d.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(d,l){var n=c(this).data("resizable"),g=n.options,j=n.size,h=n.originalSize,i=n.originalPosition,m=n.axis,k=g._aspectRatio||d.shiftKey;g.grid=typeof g.grid=="number"?[g.grid,g.grid]:g.grid;var f=Math.round((j.width-h.width)/(g.grid[0]||1))*(g.grid[0]||1),e=Math.round((j.height-h.height)/(g.grid[1]||1))*(g.grid[1]||1);if(/^(se|s|e)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e}else{if(/^(ne)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e}else{if(/^(sw)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.left=i.left-f}else{n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e;n.position.left=i.left-f}}}}});var b=function(d){return parseInt(d,10)||0};var a=function(d){return !isNaN(parseInt(d,10))}})(jQuery);;/* |
| - | * jQuery UI Selectable 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Selectables |
| - | * |
| - | * Depends: |
| - | * jquery.ui.core.js |
| - | * jquery.ui.mouse.js |
| - | * jquery.ui.widget.js |
| - | */ (function(a){a.widget("ui.selectable",a.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var b=this;this.element.addClass("ui-selectable");this.dragged=false;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]);c.each(function(){var d=a(this);var e=d.offset();a.data(this,"selectable-item",{element:this,$element:d,left:e.left,top:e.top,right:e.left+d.outerWidth(),bottom:e.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=c.addClass("ui-selectee");this._mouseInit();this.helper=a(document.createElement("div")).css({border:"1px dotted black"}).addClass("ui-selectable-helper")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(d){var b=this;this.opos=[d.pageX,d.pageY];if(this.options.disabled){return}var c=this.options;this.selectees=a(c.filter,this.element[0]);this._trigger("start",d);a(c.appendTo).append(this.helper);this.helper.css({"z-index":100,position:"absolute",left:d.clientX,top:d.clientY,width:0,height:0});if(c.autoRefresh){this.refresh()}this.selectees.filter(".ui-selected").each(function(){var e=a.data(this,"selectable-item");e.startselected=true;if(!d.metaKey){e.$element.removeClass("ui-selected");e.selected=false;e.$element.addClass("ui-unselecting");e.unselecting=true;b._trigger("unselecting",d,{unselecting:e.element})}});a(d.target).parents().andSelf().each(function(){var e=a.data(this,"selectable-item");if(e){e.$element.removeClass("ui-unselecting").addClass("ui-selecting");e.unselecting=false;e.selecting=true;e.selected=true;b._trigger("selecting",d,{selecting:e.element});return false}})},_mouseDrag:function(i){var c=this;this.dragged=true;if(this.options.disabled){return}var e=this.options;var d=this.opos[0],h=this.opos[1],b=i.pageX,g=i.pageY;if(d>b){var f=b;b=d;d=f}if(h>g){var f=g;g=h;h=f}this.helper.css({left:d,top:h,width:b-d,height:g-h});this.selectees.each(function(){var j=a.data(this,"selectable-item");if(!j||j.element==c.element[0]){return}var k=false;if(e.tolerance=="touch"){k=(!(j.left>b||j.right<d||j.top>g||j.bottom<h))}else{if(e.tolerance=="fit"){k=(j.left>d&&j.right<b&&j.top>h&&j.bottom<g)}}if(k){if(j.selected){j.$element.removeClass("ui-selected");j.selected=false}if(j.unselecting){j.$element.removeClass("ui-unselecting");j.unselecting=false}if(!j.selecting){j.$element.addClass("ui-selecting");j.selecting=true;c._trigger("selecting",i,{selecting:j.element})}}else{if(j.selecting){if(i.metaKey&&j.startselected){j.$element.removeClass("ui-selecting");j.selecting=false;j.$element.addClass("ui-selected");j.selected=true}else{j.$element.removeClass("ui-selecting");j.selecting=false;if(j.startselected){j.$element.addClass("ui-unselecting");j.unselecting=true}c._trigger("unselecting",i,{unselecting:j.element})}}if(j.selected){if(!i.metaKey&&!j.startselected){j.$element.removeClass("ui-selected");j.selected=false;j.$element.addClass("ui-unselecting");j.unselecting=true;c._trigger("unselecting",i,{unselecting:j.element})}}}});return false},_mouseStop:function(d){var b=this;this.dragged=false;var c=this.options;a(".ui-unselecting",this.element[0]).each(function(){var e=a.data(this,"selectable-item");e.$element.removeClass("ui-unselecting");e.unselecting=false;e.startselected=false;b._trigger("unselected",d,{unselected:e.element})});a(".ui-selecting",this.element[0]).each(function(){var e=a.data(this,"selectable-item");e.$element.removeClass("ui-selecting").addClass("ui-selected");e.selecting=false;e.selected=true;e.startselected=true;b._trigger("selected",d,{selected:e.element})});this._trigger("stop",d);this.helper.remove();return false}});a.extend(a.ui.selectable,{version:"1.8"})})(jQuery);;/* |
| - | * jQuery UI Sortable 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Sortables |
| - | * |
| - | * Depends: |
| - | * jquery.ui.core.js |
| - | * jquery.ui.mouse.js |
| - | * jquery.ui.widget.js |
| - | */ (function(a){a.widget("ui.sortable",a.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1000},_create:function(){var b=this.options;this.containerCache={};this.element.addClass("ui-sortable");this.refresh();this.floating=this.items.length?(/left|right/).test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var b=this.items.length-1;b>=0;b--){this.items[b].item.removeData("sortable-item")}return this},_mouseCapture:function(e,f){if(this.reverting){return false}if(this.options.disabled||this.options.type=="static"){return false}this._refreshItems(e);var d=null,c=this,b=a(e.target).parents().each(function(){if(a.data(this,"sortable-item")==c){d=a(this);return false}});if(a.data(e.target,"sortable-item")==c){d=a(e.target)}if(!d){return false}if(this.options.handle&&!f){var g=false;a(this.options.handle,d).find("*").andSelf().each(function(){if(this==e.target){g=true}});if(!g){return false}}this.currentItem=d;this._removeCurrentsFromItems();return true},_mouseStart:function(e,f,b){var g=this.options,c=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(e);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");a.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(e);this.originalPageX=e.pageX;this.originalPageY=e.pageY;(g.cursorAt&&this._adjustOffsetFromHelper(g.cursorAt));this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};if(this.helper[0]!=this.currentItem[0]){this.currentItem.hide()}this._createPlaceholder();if(g.containment){this._setContainment()}if(g.cursor){if(a("body").css("cursor")){this._storedCursor=a("body").css("cursor")}a("body").css("cursor",g.cursor)}if(g.opacity){if(this.helper.css("opacity")){this._storedOpacity=this.helper.css("opacity")}this.helper.css("opacity",g.opacity)}if(g.zIndex){if(this.helper.css("zIndex")){this._storedZIndex=this.helper.css("zIndex")}this.helper.css("zIndex",g.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){this.overflowOffset=this.scrollParent.offset()}this._trigger("start",e,this._uiHash());if(!this._preserveHelperProportions){this._cacheHelperProportions()}if(!b){for(var d=this.containers.length-1;d>=0;d--){this.containers[d]._trigger("activate",e,c._uiHash(this))}}if(a.ui.ddmanager){a.ui.ddmanager.current=this}if(a.ui.ddmanager&&!g.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,e)}this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(e);return true},_mouseDrag:function(f){this.position=this._generatePosition(f);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs){this.lastPositionAbs=this.positionAbs}if(this.options.scroll){var g=this.options,b=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if((this.overflowOffset.top+this.scrollParent[0].offsetHeight)-f.pageY<g.scrollSensitivity){this.scrollParent[0].scrollTop=b=this.scrollParent[0].scrollTop+g.scrollSpeed}else{if(f.pageY-this.overflowOffset.top<g.scrollSensitivity){this.scrollParent[0].scrollTop=b=this.scrollParent[0].scrollTop-g.scrollSpeed}}if((this.overflowOffset.left+this.scrollParent[0].offsetWidth)-f.pageX<g.scrollSensitivity){this.scrollParent[0].scrollLeft=b=this.scrollParent[0].scrollLeft+g.scrollSpeed}else{if(f.pageX-this.overflowOffset.left<g.scrollSensitivity){this.scrollParent[0].scrollLeft=b=this.scrollParent[0].scrollLeft-g.scrollSpeed}}}else{if(f.pageY-a(document).scrollTop()<g.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()-g.scrollSpeed)}else{if(a(window).height()-(f.pageY-a(document).scrollTop())<g.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()+g.scrollSpeed)}}if(f.pageX-a(document).scrollLeft()<g.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()-g.scrollSpeed)}else{if(a(window).width()-(f.pageX-a(document).scrollLeft())<g.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()+g.scrollSpeed)}}}if(b!==false&&a.ui.ddmanager&&!g.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,f)}}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}for(var d=this.items.length-1;d>=0;d--){var e=this.items[d],c=e.item[0],h=this._intersectsWithPointer(e);if(!h){continue}if(c!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=c&&!a.ui.contains(this.placeholder[0],c)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],c):true)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(e)){this._rearrange(f,e)}else{break}this._trigger("change",f,this._uiHash());break}}this._contactContainers(f);if(a.ui.ddmanager){a.ui.ddmanager.drag(this,f)}this._trigger("sort",f,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(c,d){if(!c){return}if(a.ui.ddmanager&&!this.options.dropBehaviour){a.ui.ddmanager.drop(this,c)}if(this.options.revert){var b=this;var e=b.placeholder.offset();b.reverting=true;a(this.helper).animate({left:e.left-this.offset.parent.left-b.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-b.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){b._clear(c)})}else{this._clear(c,d)}return false},cancel:function(){var b=this;if(this.dragging){this._mouseUp();if(this.options.helper=="original"){this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else{this.currentItem.show()}for(var c=this.containers.length-1;c>=0;c--){this.containers[c]._trigger("deactivate",null,b._uiHash(this));if(this.containers[c].containerCache.over){this.containers[c]._trigger("out",null,b._uiHash(this));this.containers[c].containerCache.over=0}}}if(this.placeholder[0].parentNode){this.placeholder[0].parentNode.removeChild(this.placeholder[0])}if(this.options.helper!="original"&&this.helper&&this.helper[0].parentNode){this.helper.remove()}a.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});if(this.domPosition.prev){a(this.domPosition.prev).after(this.currentItem)}else{a(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(d){var b=this._getItemsAsjQuery(d&&d.connected);var c=[];d=d||{};a(b).each(function(){var e=(a(d.item||this).attr(d.attribute||"id")||"").match(d.expression||(/(.+)[-=_](.+)/));if(e){c.push((d.key||e[1]+"[]")+"="+(d.key&&d.expression?e[1]:e[2]))}});return c.join("&")},toArray:function(d){var b=this._getItemsAsjQuery(d&&d.connected);var c=[];d=d||{};b.each(function(){c.push(a(d.item||this).attr(d.attribute||"id")||"")});return c},_intersectsWith:function(m){var e=this.positionAbs.left,d=e+this.helperProportions.width,k=this.positionAbs.top,j=k+this.helperProportions.height;var f=m.left,c=f+m.width,n=m.top,i=n+m.height;var o=this.offset.click.top,h=this.offset.click.left;var g=(k+o)>n&&(k+o)<i&&(e+h)>f&&(e+h)<c;if(this.options.tolerance=="pointer"||this.options.forcePointerForContainers||(this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>m[this.floating?"width":"height"])){return g}else{return(f<e+(this.helperProportions.width/2)&&d-(this.helperProportions.width/2)<c&&n<k+(this.helperProportions.height/2)&&j-(this.helperProportions.height/2)<i)}},_intersectsWithPointer:function(d){var e=a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,d.top,d.height),c=a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,d.left,d.width),g=e&&c,b=this._getDragVerticalDirection(),f=this._getDragHorizontalDirection();if(!g){return false}return this.floating?(((f&&f=="right")||b=="down")?2:1):(b&&(b=="down"?2:1))},_intersectsWithSides:function(e){var c=a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+(e.height/2),e.height),d=a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+(e.width/2),e.width),b=this._getDragVerticalDirection(),f=this._getDragHorizontalDirection();if(this.floating&&f){return((f=="right"&&d)||(f=="left"&&!d))}else{return b&&((b=="down"&&c)||(b=="up"&&!c))}},_getDragVerticalDirection:function(){var b=this.positionAbs.top-this.lastPositionAbs.top;return b!=0&&(b>0?"down":"up")},_getDragHorizontalDirection:function(){var b=this.positionAbs.left-this.lastPositionAbs.left;return b!=0&&(b>0?"right":"left")},refresh:function(b){this._refreshItems(b);this.refreshPositions();return this},_connectWith:function(){var b=this.options;return b.connectWith.constructor==String?[b.connectWith]:b.connectWith},_getItemsAsjQuery:function(b){var l=this;var g=[];var e=[];var h=this._connectWith();if(h&&b){for(var d=h.length-1;d>=0;d--){var k=a(h[d]);for(var c=k.length-1;c>=0;c--){var f=a.data(k[c],"sortable");if(f&&f!=this&&!f.options.disabled){e.push([a.isFunction(f.options.items)?f.options.items.call(f.element):a(f.options.items,f.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),f])}}}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var d=e.length-1;d>=0;d--){e[d][0].each(function(){g.push(this)})}return a(g)},_removeCurrentsFromItems:function(){var d=this.currentItem.find(":data(sortable-item)");for(var c=0;c<this.items.length;c++){for(var b=0;b<d.length;b++){if(d[b]==this.items[c].item[0]){this.items.splice(c,1)}}}},_refreshItems:function(b){this.items=[];this.containers=[this];var h=this.items;var p=this;var f=[[a.isFunction(this.options.items)?this.options.items.call(this.element[0],b,{item:this.currentItem}):a(this.options.items,this.element),this]];var l=this._connectWith();if(l){for(var e=l.length-1;e>=0;e--){var m=a(l[e]);for(var d=m.length-1;d>=0;d--){var g=a.data(m[d],"sortable");if(g&&g!=this&&!g.options.disabled){f.push([a.isFunction(g.options.items)?g.options.items.call(g.element[0],b,{item:this.currentItem}):a(g.options.items,g.element),g]);this.containers.push(g)}}}}for(var e=f.length-1;e>=0;e--){var k=f[e][1];var c=f[e][0];for(var d=0,n=c.length;d<n;d++){var o=a(c[d]);o.data("sortable-item",k);h.push({item:o,instance:k,width:0,height:0,left:0,top:0})}}},refreshPositions:function(b){if(this.offsetParent&&this.helper){this.offset.parent=this._getParentOffset()}for(var d=this.items.length-1;d>=0;d--){var e=this.items[d];var c=this.options.toleranceElement?a(this.options.toleranceElement,e.item):e.item;if(!b){e.width=c.outerWidth();e.height=c.outerHeight()}var f=c.offset();e.left=f.left;e.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers){this.options.custom.refreshContainers.call(this)}else{for(var d=this.containers.length-1;d>=0;d--){var f=this.containers[d].element.offset();this.containers[d].containerCache.left=f.left;this.containers[d].containerCache.top=f.top;this.containers[d].containerCache.width=this.containers[d].element.outerWidth();this.containers[d].containerCache.height=this.containers[d].element.outerHeight()}}return this},_createPlaceholder:function(d){var b=d||this,e=b.options;if(!e.placeholder||e.placeholder.constructor==String){var c=e.placeholder;e.placeholder={element:function(){var f=a(document.createElement(b.currentItem[0].nodeName)).addClass(c||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!c){f.style.visibility="hidden"}return f},update:function(f,g){if(c&&!e.forcePlaceholderSize){return}if(!g.height()){g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10))}if(!g.width()){g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=a(e.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);e.placeholder.update(b,b.placeholder)},_contactContainers:function(b){var d=null,k=null;for(var f=this.containers.length-1;f>=0;f--){if(a.ui.contains(this.currentItem[0],this.containers[f].element[0])){continue}if(this._intersectsWith(this.containers[f].containerCache)){if(d&&a.ui.contains(this.containers[f].element[0],d.element[0])){continue}d=this.containers[f];k=f}else{if(this.containers[f].containerCache.over){this.containers[f]._trigger("out",b,this._uiHash(this));this.containers[f].containerCache.over=0}}}if(!d){return}if(this.containers.length===1){this.containers[k]._trigger("over",b,this._uiHash(this));this.containers[k].containerCache.over=1}else{if(this.currentContainer!=this.containers[k]){var h=10000;var g=null;var c=this.positionAbs[this.containers[k].floating?"left":"top"];for(var e=this.items.length-1;e>=0;e--){if(!a.ui.contains(this.containers[k].element[0],this.items[e].item[0])){continue}var l=this.items[e][this.containers[k].floating?"left":"top"];if(Math.abs(l-c)<h){h=Math.abs(l-c);g=this.items[e]}}if(!g&&!this.options.dropOnEmpty){return}this.currentContainer=this.containers[k];g?this._rearrange(b,g,null,true):this._rearrange(b,null,this.containers[k].element,true);this._trigger("change",b,this._uiHash());this.containers[k]._trigger("change",b,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[k]._trigger("over",b,this._uiHash(this));this.containers[k].containerCache.over=1}}},_createHelper:function(c){var d=this.options;var b=a.isFunction(d.helper)?a(d.helper.apply(this.element[0],[c,this.currentItem])):(d.helper=="clone"?this.currentItem.clone():this.currentItem);if(!b.parents("body").length){a(d.appendTo!="parent"?d.appendTo:this.currentItem[0].parentNode)[0].appendChild(b[0])}if(b[0]==this.currentItem[0]){this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}}if(b[0].style.width==""||d.forceHelperSize){b.width(this.currentItem.width())}if(b[0].style.height==""||d.forceHelperSize){b.height(this.currentItem.height())}return b},_adjustOffsetFromHelper:function(b){if(typeof b=="string"){b=b.split(" ")}if(a.isArray(b)){b={left:+b[0],top:+b[1]||0}}if("left" in b){this.offset.click.left=b.left+this.margins.left}if("right" in b){this.offset.click.left=this.helperProportions.width-b.right+this.margins.left}if("top" in b){this.offset.click.top=b.top+this.margins.top}if("bottom" in b){this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])){b.left+=this.scrollParent.scrollLeft();b.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)){b={top:0,left:0}}return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var b=this.currentItem.position();return{top:b.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:b.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.currentItem.css("marginLeft"),10)||0),top:(parseInt(this.currentItem.css("marginTop"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e=this.options;if(e.containment=="parent"){e.containment=this.helper[0].parentNode}if(e.containment=="document"||e.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(e.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(e.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(e.containment)){var c=a(e.containment)[0];var d=a(e.containment).offset();var b=(a(c).css("overflow")!="hidden");this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(b?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(b?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(f,h){if(!h){h=this.position}var c=f=="absolute"?1:-1;var e=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=(/(html|body)/i).test(b[0].tagName);return{top:(h.top+this.offset.relative.top*c+this.offset.parent.top*c-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(g?0:b.scrollTop()))*c)),left:(h.left+this.offset.relative.left*c+this.offset.parent.left*c-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:b.scrollLeft())*c))}},_generatePosition:function(e){var h=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,i=(/(html|body)/i).test(b[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0])){this.offset.relative=this._getRelativeOffset()}var d=e.pageX;var c=e.pageY;if(this.originalPosition){if(this.containment){if(e.pageX-this.offset.click.left<this.containment[0]){d=this.containment[0]+this.offset.click.left}if(e.pageY-this.offset.click.top<this.containment[1]){c=this.containment[1]+this.offset.click.top}if(e.pageX-this.offset.click.left>this.containment[2]){d=this.containment[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>this.containment[3]){c=this.containment[3]+this.offset.click.top}}if(h.grid){var g=this.originalPageY+Math.round((c-this.originalPageY)/h.grid[1])*h.grid[1];c=this.containment?(!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:(!(g-this.offset.click.top<this.containment[1])?g-h.grid[1]:g+h.grid[1])):g;var f=this.originalPageX+Math.round((d-this.originalPageX)/h.grid[0])*h.grid[0];d=this.containment?(!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:(!(f-this.offset.click.left<this.containment[0])?f-h.grid[0]:f+h.grid[0])):f}}return{top:(c-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(i?0:b.scrollTop())))),left:(d-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():i?0:b.scrollLeft())))}},_rearrange:function(g,f,c,e){c?c[0].appendChild(this.placeholder[0]):f.item[0].parentNode.insertBefore(this.placeholder[0],(this.direction=="down"?f.item[0]:f.item[0].nextSibling));this.counter=this.counter?++this.counter:1;var d=this,b=this.counter;window.setTimeout(function(){if(b==d.counter){d.refreshPositions(!e)}},0)},_clear:function(d,e){this.reverting=false;var f=[],b=this;if(!this._noFinalSort&&this.currentItem[0].parentNode){this.placeholder.before(this.currentItem)}this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var c in this._storedCSS){if(this._storedCSS[c]=="auto"||this._storedCSS[c]=="static"){this._storedCSS[c]=""}}this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else{this.currentItem.show()}if(this.fromOutside&&!e){f.push(function(g){this._trigger("receive",g,this._uiHash(this.fromOutside))})}if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!e){f.push(function(g){this._trigger("update",g,this._uiHash())})}if(!a.ui.contains(this.element[0],this.currentItem[0])){if(!e){f.push(function(g){this._trigger("remove",g,this._uiHash())})}for(var c=this.containers.length-1;c>=0;c--){if(a.ui.contains(this.containers[c].element[0],this.currentItem[0])&&!e){f.push((function(g){return function(h){g._trigger("receive",h,this._uiHash(this))}}).call(this,this.containers[c]));f.push((function(g){return function(h){g._trigger("update",h,this._uiHash(this))}}).call(this,this.containers[c]))}}}for(var c=this.containers.length-1;c>=0;c--){if(!e){f.push((function(g){return function(h){g._trigger("deactivate",h,this._uiHash(this))}}).call(this,this.containers[c]))}if(this.containers[c].containerCache.over){f.push((function(g){return function(h){g._trigger("out",h,this._uiHash(this))}}).call(this,this.containers[c]));this.containers[c].containerCache.over=0}}if(this._storedCursor){a("body").css("cursor",this._storedCursor)}if(this._storedOpacity){this.helper.css("opacity",this._storedOpacity)}if(this._storedZIndex){this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex)}this.dragging=false;if(this.cancelHelperRemoval){if(!e){this._trigger("beforeStop",d,this._uiHash());for(var c=0;c<f.length;c++){f[c].call(this,d)}this._trigger("stop",d,this._uiHash())}return false}if(!e){this._trigger("beforeStop",d,this._uiHash())}this.placeholder[0].parentNode.removeChild(this.placeholder[0]);if(this.helper[0]!=this.currentItem[0]){this.helper.remove()}this.helper=null;if(!e){for(var c=0;c<f.length;c++){f[c].call(this,d)}this._trigger("stop",d,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){if(a.Widget.prototype._trigger.apply(this,arguments)===false){this.cancel()}},_uiHash:function(c){var b=c||this;return{helper:b.helper,placeholder:b.placeholder||a([]),position:b.position,originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:c?c.element:null}}});a.extend(a.ui.sortable,{version:"1.8"})})(jQuery);;/* |
| - | * jQuery UI Effects 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Effects/ |
| - | */ jQuery.effects||(function(g){g.effects={};g.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(l,k){g.fx.step[k]=function(m){if(!m.colorInit){m.start=j(m.elem,k);m.end=i(m.end);m.colorInit=true}m.elem.style[k]="rgb("+Math.max(Math.min(parseInt((m.pos*(m.end[0]-m.start[0]))+m.start[0],10),255),0)+","+Math.max(Math.min(parseInt((m.pos*(m.end[1]-m.start[1]))+m.start[1],10),255),0)+","+Math.max(Math.min(parseInt((m.pos*(m.end[2]-m.start[2]))+m.start[2],10),255),0)+")"}});function i(l){var k;if(l&&l.constructor==Array&&l.length==3){return l}if(k=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(l)){return[parseInt(k[1],10),parseInt(k[2],10),parseInt(k[3],10)]}if(k=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(l)){return[parseFloat(k[1])*2.55,parseFloat(k[2])*2.55,parseFloat(k[3])*2.55]}if(k=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(l)){return[parseInt(k[1],16),parseInt(k[2],16),parseInt(k[3],16)]}if(k=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(l)){return[parseInt(k[1]+k[1],16),parseInt(k[2]+k[2],16),parseInt(k[3]+k[3],16)]}if(k=/rgba\(0, 0, 0, 0\)/.exec(l)){return a.transparent}return a[g.trim(l).toLowerCase()]}function j(m,k){var l;do{l=g.curCSS(m,k);if(l!=""&&l!="transparent"||g.nodeName(m,"body")){break}k="backgroundColor"}while(m=m.parentNode);return i(l)}var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]};var e=["add","remove","toggle"],c={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};function f(){var n=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,o={},l,m;if(n&&n.length&&n[0]&&n[n[0]]){var k=n.length;while(k--){l=n[k];if(typeof n[l]=="string"){m=l.replace(/\-(\w)/g,function(p,q){return q.toUpperCase()});o[m]=n[l]}}}else{for(l in n){if(typeof n[l]==="string"){o[l]=n[l]}}}return o}function b(l){var k,m;for(k in l){m=l[k];if(m==null||g.isFunction(m)||k in c||(/scrollbar/).test(k)||(!(/color/i).test(k)&&isNaN(parseFloat(m)))){delete l[k]}}return l}function h(k,m){var n={_:0},l;for(l in m){if(k[l]!=m[l]){n[l]=m[l]}}return n}g.effects.animateClass=function(k,l,n,m){if(g.isFunction(n)){m=n;n=null}return this.each(function(){var r=g(this),o=r.attr("style")||" ",s=b(f.call(this)),q,p=r.attr("className");g.each(e,function(t,u){if(k[u]){r[u+"Class"](k[u])}});q=b(f.call(this));r.attr("className",p);r.animate(h(s,q),l,n,function(){g.each(e,function(t,u){if(k[u]){r[u+"Class"](k[u])}});if(typeof r.attr("style")=="object"){r.attr("style").cssText="";r.attr("style").cssText=o}else{r.attr("style",o)}if(m){m.apply(this,arguments)}})})};g.fn.extend({_addClass:g.fn.addClass,addClass:function(l,k,n,m){return k?g.effects.animateClass.apply(this,[{add:l},k,n,m]):this._addClass(l)},_removeClass:g.fn.removeClass,removeClass:function(l,k,n,m){return k?g.effects.animateClass.apply(this,[{remove:l},k,n,m]):this._removeClass(l)},_toggleClass:g.fn.toggleClass,toggleClass:function(m,l,k,o,n){if(typeof l=="boolean"||l===undefined){if(!k){return this._toggleClass(m,l)}else{return g.effects.animateClass.apply(this,[(l?{add:m}:{remove:m}),k,o,n])}}else{return g.effects.animateClass.apply(this,[{toggle:m},l,k,o])}},switchClass:function(k,m,l,o,n){return g.effects.animateClass.apply(this,[{add:m,remove:k},l,o,n])}});g.extend(g.effects,{version:"1.8",save:function(l,m){for(var k=0;k<m.length;k++){if(m[k]!==null){l.data("ec.storage."+m[k],l[0].style[m[k]])}}},restore:function(l,m){for(var k=0;k<m.length;k++){if(m[k]!==null){l.css(m[k],l.data("ec.storage."+m[k]))}}},setMode:function(k,l){if(l=="toggle"){l=k.is(":hidden")?"show":"hide"}return l},getBaseline:function(l,m){var n,k;switch(l[0]){case"top":n=0;break;case"middle":n=0.5;break;case"bottom":n=1;break;default:n=l[0]/m.height}switch(l[1]){case"left":k=0;break;case"center":k=0.5;break;case"right":k=1;break;default:k=l[1]/m.width}return{x:k,y:n}},createWrapper:function(k){if(k.parent().is(".ui-effects-wrapper")){return k.parent()}var l={width:k.outerWidth(true),height:k.outerHeight(true),"float":k.css("float")},m=g("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0});k.wrap(m);m=k.parent();if(k.css("position")=="static"){m.css({position:"relative"});k.css({position:"relative"})}else{g.extend(l,{position:k.css("position"),zIndex:k.css("z-index")});g.each(["top","left","bottom","right"],function(n,o){l[o]=k.css(o);if(isNaN(parseInt(l[o],10))){l[o]="auto"}});k.css({position:"relative",top:0,left:0})}return m.css(l).show()},removeWrapper:function(k){if(k.parent().is(".ui-effects-wrapper")){return k.parent().replaceWith(k)}return k},setTransition:function(l,n,k,m){m=m||{};g.each(n,function(p,o){unit=l.cssUnit(o);if(unit[0]>0){m[o]=unit[0]*k+unit[1]}});return m}});function d(l,k,m,n){if(typeof l=="object"){n=k;m=null;k=l;l=k.effect}if(g.isFunction(k)){n=k;m=null;k={}}if(g.isFunction(m)){n=m;m=null}if(typeof k=="number"||g.fx.speeds[k]){n=m;m=k;k={}}k=k||{};m=m||k.duration;m=g.fx.off?0:typeof m=="number"?m:g.fx.speeds[m]||g.fx.speeds._default;n=n||k.complete;return[l,k,m,n]}g.fn.extend({effect:function(n,m,p,q){var l=d.apply(this,arguments),o={options:l[1],duration:l[2],callback:l[3]},k=g.effects[n];return k&&!g.fx.off?k.call(this,o):this},_show:g.fn.show,show:function(l){if(!l||typeof l=="number"||g.fx.speeds[l]){return this._show.apply(this,arguments)}else{var k=d.apply(this,arguments);k[1].mode="show";return this.effect.apply(this,k)}},_hide:g.fn.hide,hide:function(l){if(!l||typeof l=="number"||g.fx.speeds[l]){return this._hide.apply(this,arguments)}else{var k=d.apply(this,arguments);k[1].mode="hide";return this.effect.apply(this,k)}},__toggle:g.fn.toggle,toggle:function(l){if(!l||typeof l=="number"||g.fx.speeds[l]||typeof l=="boolean"||g.isFunction(l)){return this.__toggle.apply(this,arguments)}else{var k=d.apply(this,arguments);k[1].mode="toggle";return this.effect.apply(this,k)}},cssUnit:function(k){var l=this.css(k),m=[];g.each(["em","px","%","pt"],function(n,o){if(l.indexOf(o)>0){m=[parseFloat(l),o]}});return m}});g.easing.jswing=g.easing.swing;g.extend(g.easing,{def:"easeOutQuad",swing:function(l,m,k,o,n){return g.easing[g.easing.def](l,m,k,o,n)},easeInQuad:function(l,m,k,o,n){return o*(m/=n)*m+k},easeOutQuad:function(l,m,k,o,n){return -o*(m/=n)*(m-2)+k},easeInOutQuad:function(l,m,k,o,n){if((m/=n/2)<1){return o/2*m*m+k}return -o/2*((--m)*(m-2)-1)+k},easeInCubic:function(l,m,k,o,n){return o*(m/=n)*m*m+k},easeOutCubic:function(l,m,k,o,n){return o*((m=m/n-1)*m*m+1)+k},easeInOutCubic:function(l,m,k,o,n){if((m/=n/2)<1){return o/2*m*m*m+k}return o/2*((m-=2)*m*m+2)+k},easeInQuart:function(l,m,k,o,n){return o*(m/=n)*m*m*m+k},easeOutQuart:function(l,m,k,o,n){return -o*((m=m/n-1)*m*m*m-1)+k},easeInOutQuart:function(l,m,k,o,n){if((m/=n/2)<1){return o/2*m*m*m*m+k}return -o/2*((m-=2)*m*m*m-2)+k},easeInQuint:function(l,m,k,o,n){return o*(m/=n)*m*m*m*m+k},easeOutQuint:function(l,m,k,o,n){return o*((m=m/n-1)*m*m*m*m+1)+k},easeInOutQuint:function(l,m,k,o,n){if((m/=n/2)<1){return o/2*m*m*m*m*m+k}return o/2*((m-=2)*m*m*m*m+2)+k},easeInSine:function(l,m,k,o,n){return -o*Math.cos(m/n*(Math.PI/2))+o+k},easeOutSine:function(l,m,k,o,n){return o*Math.sin(m/n*(Math.PI/2))+k},easeInOutSine:function(l,m,k,o,n){return -o/2*(Math.cos(Math.PI*m/n)-1)+k},easeInExpo:function(l,m,k,o,n){return(m==0)?k:o*Math.pow(2,10*(m/n-1))+k},easeOutExpo:function(l,m,k,o,n){return(m==n)?k+o:o*(-Math.pow(2,-10*m/n)+1)+k},easeInOutExpo:function(l,m,k,o,n){if(m==0){return k}if(m==n){return k+o}if((m/=n/2)<1){return o/2*Math.pow(2,10*(m-1))+k}return o/2*(-Math.pow(2,-10*--m)+2)+k},easeInCirc:function(l,m,k,o,n){return -o*(Math.sqrt(1-(m/=n)*m)-1)+k},easeOutCirc:function(l,m,k,o,n){return o*Math.sqrt(1-(m=m/n-1)*m)+k},easeInOutCirc:function(l,m,k,o,n){if((m/=n/2)<1){return -o/2*(Math.sqrt(1-m*m)-1)+k}return o/2*(Math.sqrt(1-(m-=2)*m)+1)+k},easeInElastic:function(l,n,k,u,r){var o=1.70158;var q=0;var m=u;if(n==0){return k}if((n/=r)==1){return k+u}if(!q){q=r*0.3}if(m<Math.abs(u)){m=u;var o=q/4}else{var o=q/(2*Math.PI)*Math.asin(u/m)}return -(m*Math.pow(2,10*(n-=1))*Math.sin((n*r-o)*(2*Math.PI)/q))+k},easeOutElastic:function(l,n,k,u,r){var o=1.70158;var q=0;var m=u;if(n==0){return k}if((n/=r)==1){return k+u}if(!q){q=r*0.3}if(m<Math.abs(u)){m=u;var o=q/4}else{var o=q/(2*Math.PI)*Math.asin(u/m)}return m*Math.pow(2,-10*n)*Math.sin((n*r-o)*(2*Math.PI)/q)+u+k},easeInOutElastic:function(l,n,k,u,r){var o=1.70158;var q=0;var m=u;if(n==0){return k}if((n/=r/2)==2){return k+u}if(!q){q=r*(0.3*1.5)}if(m<Math.abs(u)){m=u;var o=q/4}else{var o=q/(2*Math.PI)*Math.asin(u/m)}if(n<1){return -0.5*(m*Math.pow(2,10*(n-=1))*Math.sin((n*r-o)*(2*Math.PI)/q))+k}return m*Math.pow(2,-10*(n-=1))*Math.sin((n*r-o)*(2*Math.PI)/q)*0.5+u+k},easeInBack:function(l,m,k,p,o,n){if(n==undefined){n=1.70158}return p*(m/=o)*m*((n+1)*m-n)+k},easeOutBack:function(l,m,k,p,o,n){if(n==undefined){n=1.70158}return p*((m=m/o-1)*m*((n+1)*m+n)+1)+k},easeInOutBack:function(l,m,k,p,o,n){if(n==undefined){n=1.70158}if((m/=o/2)<1){return p/2*(m*m*(((n*=(1.525))+1)*m-n))+k}return p/2*((m-=2)*m*(((n*=(1.525))+1)*m+n)+2)+k},easeInBounce:function(l,m,k,o,n){return o-g.easing.easeOutBounce(l,n-m,0,o,n)+k},easeOutBounce:function(l,m,k,o,n){if((m/=n)<(1/2.75)){return o*(7.5625*m*m)+k}else{if(m<(2/2.75)){return o*(7.5625*(m-=(1.5/2.75))*m+0.75)+k}else{if(m<(2.5/2.75)){return o*(7.5625*(m-=(2.25/2.75))*m+0.9375)+k}else{return o*(7.5625*(m-=(2.625/2.75))*m+0.984375)+k}}}},easeInOutBounce:function(l,m,k,o,n){if(m<n/2){return g.easing.easeInBounce(l,m*2,0,o,n)*0.5+k}return g.easing.easeOutBounce(l,m*2-n,0,o,n)*0.5+o*0.5+k}})})(jQuery);;/* |
| - | * jQuery UI Effects Blind 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Effects/Blind |
| - | * |
| - | * Depends: |
| - | * jquery.effects.core.js |
| - | */ (function(a){a.effects.blind=function(b){return this.queue(function(){var d=a(this),c=["position","top","left"];var h=a.effects.setMode(d,b.options.mode||"hide");var g=b.options.direction||"vertical";a.effects.save(d,c);d.show();var j=a.effects.createWrapper(d).css({overflow:"hidden"});var e=(g=="vertical")?"height":"width";var i=(g=="vertical")?j.height():j.width();if(h=="show"){j.css(e,0)}var f={};f[e]=h=="show"?i:0;j.animate(f,b.duration,b.options.easing,function(){if(h=="hide"){d.hide()}a.effects.restore(d,c);a.effects.removeWrapper(d);if(b.callback){b.callback.apply(d[0],arguments)}d.dequeue()})})}})(jQuery);;/* |
| - | * jQuery UI Effects Bounce 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Effects/Bounce |
| - | * |
| - | * Depends: |
| - | * jquery.effects.core.js |
| - | */ (function(a){a.effects.bounce=function(b){return this.queue(function(){var e=a(this),l=["position","top","left"];var k=a.effects.setMode(e,b.options.mode||"effect");var n=b.options.direction||"up";var c=b.options.distance||20;var d=b.options.times||5;var g=b.duration||250;if(/show|hide/.test(k)){l.push("opacity")}a.effects.save(e,l);e.show();a.effects.createWrapper(e);var f=(n=="up"||n=="down")?"top":"left";var p=(n=="up"||n=="left")?"pos":"neg";var c=b.options.distance||(f=="top"?e.outerHeight({margin:true})/3:e.outerWidth({margin:true})/3);if(k=="show"){e.css("opacity",0).css(f,p=="pos"?-c:c)}if(k=="hide"){c=c/(d*2)}if(k!="hide"){d--}if(k=="show"){var h={opacity:1};h[f]=(p=="pos"?"+=":"-=")+c;e.animate(h,g/2,b.options.easing);c=c/2;d--}for(var j=0;j<d;j++){var o={},m={};o[f]=(p=="pos"?"-=":"+=")+c;m[f]=(p=="pos"?"+=":"-=")+c;e.animate(o,g/2,b.options.easing).animate(m,g/2,b.options.easing);c=(k=="hide")?c*2:c/2}if(k=="hide"){var h={opacity:0};h[f]=(p=="pos"?"-=":"+=")+c;e.animate(h,g/2,b.options.easing,function(){e.hide();a.effects.restore(e,l);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(this,arguments)}})}else{var o={},m={};o[f]=(p=="pos"?"-=":"+=")+c;m[f]=(p=="pos"?"+=":"-=")+c;e.animate(o,g/2,b.options.easing).animate(m,g/2,b.options.easing,function(){a.effects.restore(e,l);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(this,arguments)}})}e.queue("fx",function(){e.dequeue()});e.dequeue()})}})(jQuery);;/* |
| - | * jQuery UI Effects Clip 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Effects/Clip |
| - | * |
| - | * Depends: |
| - | * jquery.effects.core.js |
| - | */ (function(a){a.effects.clip=function(b){return this.queue(function(){var f=a(this),j=["position","top","left","height","width"];var i=a.effects.setMode(f,b.options.mode||"hide");var k=b.options.direction||"vertical";a.effects.save(f,j);f.show();var c=a.effects.createWrapper(f).css({overflow:"hidden"});var e=f[0].tagName=="IMG"?c:f;var g={size:(k=="vertical")?"height":"width",position:(k=="vertical")?"top":"left"};var d=(k=="vertical")?e.height():e.width();if(i=="show"){e.css(g.size,0);e.css(g.position,d/2)}var h={};h[g.size]=i=="show"?d:0;h[g.position]=i=="show"?0:d/2;e.animate(h,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){if(i=="hide"){f.hide()}a.effects.restore(f,j);a.effects.removeWrapper(f);if(b.callback){b.callback.apply(f[0],arguments)}f.dequeue()}})})}})(jQuery);;/* |
| - | * jQuery UI Effects Drop 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Effects/Drop |
| - | * |
| - | * Depends: |
| - | * jquery.effects.core.js |
| - | */ (function(a){a.effects.drop=function(b){return this.queue(function(){var e=a(this),d=["position","top","left","opacity"];var i=a.effects.setMode(e,b.options.mode||"hide");var h=b.options.direction||"left";a.effects.save(e,d);e.show();a.effects.createWrapper(e);var f=(h=="up"||h=="down")?"top":"left";var c=(h=="up"||h=="left")?"pos":"neg";var j=b.options.distance||(f=="top"?e.outerHeight({margin:true})/2:e.outerWidth({margin:true})/2);if(i=="show"){e.css("opacity",0).css(f,c=="pos"?-j:j)}var g={opacity:i=="show"?1:0};g[f]=(i=="show"?(c=="pos"?"+=":"-="):(c=="pos"?"-=":"+="))+j;e.animate(g,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){if(i=="hide"){e.hide()}a.effects.restore(e,d);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(this,arguments)}e.dequeue()}})})}})(jQuery);;/* |
| - | * jQuery UI Effects Explode 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Effects/Explode |
| - | * |
| - | * Depends: |
| - | * jquery.effects.core.js |
| - | */ (function(a){a.effects.explode=function(b){return this.queue(function(){var k=b.options.pieces?Math.round(Math.sqrt(b.options.pieces)):3;var e=b.options.pieces?Math.round(Math.sqrt(b.options.pieces)):3;b.options.mode=b.options.mode=="toggle"?(a(this).is(":visible")?"hide":"show"):b.options.mode;var h=a(this).show().css("visibility","hidden");var l=h.offset();l.top-=parseInt(h.css("marginTop"),10)||0;l.left-=parseInt(h.css("marginLeft"),10)||0;var g=h.outerWidth(true);var c=h.outerHeight(true);for(var f=0;f<k;f++){for(var d=0;d<e;d++){h.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-d*(g/e),top:-f*(c/k)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/e,height:c/k,left:l.left+d*(g/e)+(b.options.mode=="show"?(d-Math.floor(e/2))*(g/e):0),top:l.top+f*(c/k)+(b.options.mode=="show"?(f-Math.floor(k/2))*(c/k):0),opacity:b.options.mode=="show"?0:1}).animate({left:l.left+d*(g/e)+(b.options.mode=="show"?0:(d-Math.floor(e/2))*(g/e)),top:l.top+f*(c/k)+(b.options.mode=="show"?0:(f-Math.floor(k/2))*(c/k)),opacity:b.options.mode=="show"?1:0},b.duration||500)}}setTimeout(function(){b.options.mode=="show"?h.css({visibility:"visible"}):h.css({visibility:"visible"}).hide();if(b.callback){b.callback.apply(h[0])}h.dequeue();a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);;/* |
| - | * jQuery UI Effects Fold 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Effects/Fold |
| - | * |
| - | * Depends: |
| - | * jquery.effects.core.js |
| - | */ (function(a){a.effects.fold=function(b){return this.queue(function(){var e=a(this),k=["position","top","left"];var h=a.effects.setMode(e,b.options.mode||"hide");var o=b.options.size||15;var n=!(!b.options.horizFirst);var g=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(e,k);e.show();var d=a.effects.createWrapper(e).css({overflow:"hidden"});var i=((h=="show")!=n);var f=i?["width","height"]:["height","width"];var c=i?[d.width(),d.height()]:[d.height(),d.width()];var j=/([0-9]+)%/.exec(o);if(j){o=parseInt(j[1],10)/100*c[h=="hide"?0:1]}if(h=="show"){d.css(n?{height:0,width:o}:{height:o,width:0})}var m={},l={};m[f[0]]=h=="show"?c[0]:o;l[f[1]]=h=="show"?c[1]:0;d.animate(m,g,b.options.easing).animate(l,g,b.options.easing,function(){if(h=="hide"){e.hide()}a.effects.restore(e,k);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(e[0],arguments)}e.dequeue()})})}})(jQuery);;/* |
| - | * jQuery UI Effects Highlight 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Effects/Highlight |
| - | * |
| - | * Depends: |
| - | * jquery.effects.core.js |
| - | */ (function(a){a.effects.highlight=function(b){return this.queue(function(){var d=a(this),c=["backgroundImage","backgroundColor","opacity"],f=a.effects.setMode(d,b.options.mode||"show"),e={backgroundColor:d.css("backgroundColor")};if(f=="hide"){e.opacity=0}a.effects.save(d,c);d.show().css({backgroundImage:"none",backgroundColor:b.options.color||"#ffff99"}).animate(e,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){(f=="hide"&&d.hide());a.effects.restore(d,c);(f=="show"&&!a.support.opacity&&this.style.removeAttribute("filter"));(b.callback&&b.callback.apply(this,arguments));d.dequeue()}})})}})(jQuery);;/* |
| - | * jQuery UI Effects Pulsate 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Effects/Pulsate |
| - | * |
| - | * Depends: |
| - | * jquery.effects.core.js |
| - | */ (function(a){a.effects.pulsate=function(b){return this.queue(function(){var d=a(this),e=a.effects.setMode(d,b.options.mode||"show");times=((b.options.times||5)*2)-1;duration=b.duration?b.duration/2:a.fx.speeds._default/2,isVisible=d.is(":visible"),animateTo=0;if(!isVisible){d.css("opacity",0).show();animateTo=1}if((e=="hide"&&isVisible)||(e=="show"&&!isVisible)){times--}for(var c=0;c<times;c++){d.animate({opacity:animateTo},duration,b.options.easing);animateTo=(animateTo+1)%2}d.animate({opacity:animateTo},duration,b.options.easing,function(){if(animateTo==0){d.hide()}(b.callback&&b.callback.apply(this,arguments))});d.queue("fx",function(){d.dequeue()}).dequeue()})}})(jQuery);;/* |
| - | * jQuery UI Effects Scale 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Effects/Scale |
| - | * |
| - | * Depends: |
| - | * jquery.effects.core.js |
| - | */ (function(a){a.effects.puff=function(b){return this.queue(function(){var f=a(this),g=a.effects.setMode(f,b.options.mode||"hide"),e=parseInt(b.options.percent,10)||150,d=e/100,c={height:f.height(),width:f.width()};a.extend(b.options,{fade:true,mode:g,percent:g=="hide"?e:100,from:g=="hide"?c:{height:c.height*d,width:c.width*d}});f.effect("scale",b.options,b.duration,b.callback);f.dequeue()})};a.effects.scale=function(b){return this.queue(function(){var g=a(this);var d=a.extend(true,{},b.options);var j=a.effects.setMode(g,b.options.mode||"effect");var h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:(j=="hide"?0:100));var i=b.options.direction||"both";var c=b.options.origin;if(j!="effect"){d.origin=c||["middle","center"];d.restore=true}var f={height:g.height(),width:g.width()};g.from=b.options.from||(j=="show"?{height:0,width:0}:f);var e={y:i!="horizontal"?(h/100):1,x:i!="vertical"?(h/100):1};g.to={height:f.height*e.y,width:f.width*e.x};if(b.options.fade){if(j=="show"){g.from.opacity=0;g.to.opacity=1}if(j=="hide"){g.from.opacity=1;g.to.opacity=0}}d.from=g.from;d.to=g.to;d.mode=j;g.effect("size",d,b.duration,b.callback);g.dequeue()})};a.effects.size=function(b){return this.queue(function(){var c=a(this),n=["position","top","left","width","height","overflow","opacity"];var m=["position","top","left","overflow","opacity"];var j=["width","height","overflow"];var p=["fontSize"];var k=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"];var f=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"];var g=a.effects.setMode(c,b.options.mode||"effect");var i=b.options.restore||false;var e=b.options.scale||"both";var o=b.options.origin;var d={height:c.height(),width:c.width()};c.from=b.options.from||d;c.to=b.options.to||d;if(o){var h=a.effects.getBaseline(o,d);c.from.top=(d.height-c.from.height)*h.y;c.from.left=(d.width-c.from.width)*h.x;c.to.top=(d.height-c.to.height)*h.y;c.to.left=(d.width-c.to.width)*h.x}var l={from:{y:c.from.height/d.height,x:c.from.width/d.width},to:{y:c.to.height/d.height,x:c.to.width/d.width}};if(e=="box"||e=="both"){if(l.from.y!=l.to.y){n=n.concat(k);c.from=a.effects.setTransition(c,k,l.from.y,c.from);c.to=a.effects.setTransition(c,k,l.to.y,c.to)}if(l.from.x!=l.to.x){n=n.concat(f);c.from=a.effects.setTransition(c,f,l.from.x,c.from);c.to=a.effects.setTransition(c,f,l.to.x,c.to)}}if(e=="content"||e=="both"){if(l.from.y!=l.to.y){n=n.concat(p);c.from=a.effects.setTransition(c,p,l.from.y,c.from);c.to=a.effects.setTransition(c,p,l.to.y,c.to)}}a.effects.save(c,i?n:m);c.show();a.effects.createWrapper(c);c.css("overflow","hidden").css(c.from);if(e=="content"||e=="both"){k=k.concat(["marginTop","marginBottom"]).concat(p);f=f.concat(["marginLeft","marginRight"]);j=n.concat(k).concat(f);c.find("*[width]").each(function(){child=a(this);if(i){a.effects.save(child,j)}var q={height:child.height(),width:child.width()};child.from={height:q.height*l.from.y,width:q.width*l.from.x};child.to={height:q.height*l.to.y,width:q.width*l.to.x};if(l.from.y!=l.to.y){child.from=a.effects.setTransition(child,k,l.from.y,child.from);child.to=a.effects.setTransition(child,k,l.to.y,child.to)}if(l.from.x!=l.to.x){child.from=a.effects.setTransition(child,f,l.from.x,child.from);child.to=a.effects.setTransition(child,f,l.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){if(i){a.effects.restore(child,j)}})})}c.animate(c.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){if(c.to.opacity===0){c.css("opacity",c.from.opacity)}if(g=="hide"){c.hide()}a.effects.restore(c,i?n:m);a.effects.removeWrapper(c);if(b.callback){b.callback.apply(this,arguments)}c.dequeue()}})})}})(jQuery);;/* |
| - | * jQuery UI Effects Shake 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Effects/Shake |
| - | * |
| - | * Depends: |
| - | * jquery.effects.core.js |
| - | */ (function(a){a.effects.shake=function(b){return this.queue(function(){var e=a(this),l=["position","top","left"];var k=a.effects.setMode(e,b.options.mode||"effect");var n=b.options.direction||"left";var c=b.options.distance||20;var d=b.options.times||3;var g=b.duration||b.options.duration||140;a.effects.save(e,l);e.show();a.effects.createWrapper(e);var f=(n=="up"||n=="down")?"top":"left";var p=(n=="up"||n=="left")?"pos":"neg";var h={},o={},m={};h[f]=(p=="pos"?"-=":"+=")+c;o[f]=(p=="pos"?"+=":"-=")+c*2;m[f]=(p=="pos"?"-=":"+=")+c*2;e.animate(h,g,b.options.easing);for(var j=1;j<d;j++){e.animate(o,g,b.options.easing).animate(m,g,b.options.easing)}e.animate(o,g,b.options.easing).animate(h,g/2,b.options.easing,function(){a.effects.restore(e,l);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(this,arguments)}});e.queue("fx",function(){e.dequeue()});e.dequeue()})}})(jQuery);;/* |
| - | * jQuery UI Effects Slide 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Effects/Slide |
| - | * |
| - | * Depends: |
| - | * jquery.effects.core.js |
| - | */ (function(a){a.effects.slide=function(b){return this.queue(function(){var e=a(this),d=["position","top","left"];var i=a.effects.setMode(e,b.options.mode||"show");var h=b.options.direction||"left";a.effects.save(e,d);e.show();a.effects.createWrapper(e).css({overflow:"hidden"});var f=(h=="up"||h=="down")?"top":"left";var c=(h=="up"||h=="left")?"pos":"neg";var j=b.options.distance||(f=="top"?e.outerHeight({margin:true}):e.outerWidth({margin:true}));if(i=="show"){e.css(f,c=="pos"?-j:j)}var g={};g[f]=(i=="show"?(c=="pos"?"+=":"-="):(c=="pos"?"-=":"+="))+j;e.animate(g,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){if(i=="hide"){e.hide()}a.effects.restore(e,d);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(this,arguments)}e.dequeue()}})})}})(jQuery);;/* |
| - | * jQuery UI Effects Transfer 1.8 |
| - | * |
| - | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT (MIT-LICENSE.txt) |
| - | * and GPL (GPL-LICENSE.txt) licenses. |
| - | * |
| - | * http://docs.jquery.com/UI/Effects/Transfer |
| - | * |
| - | * Depends: |
| - | * jquery.effects.core.js |
| - | */ (function(a){a.effects.transfer=function(b){return this.queue(function(){var f=a(this),h=a(b.options.to),e=h.offset(),g={top:e.top,left:e.left,height:h.innerHeight(),width:h.innerWidth()},d=f.offset(),c=a('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(b.options.className).css({top:d.top,left:d.left,height:f.innerHeight(),width:f.innerWidth(),position:"absolute"}).animate(g,b.duration,b.options.easing,function(){c.remove();(b.callback&&b.callback.apply(f[0],arguments));f.dequeue()})})}})(jQuery);; |
| - | /* |
| - | * jQuery UI Datepicker 1.8.4 |
| + | (function(c){c.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(b){return a._mouseDown(b)}).bind("click."+this.widgetName,function(b){if(a._preventClickEvent){a._preventClickEvent=false;b.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&& |
| + | this._mouseUp(a);this._mouseDownEvent=a;var b=this,e=a.which==1,f=typeof this.options.cancel=="string"?c(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){b.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault(); |
| + | return true}}this._mouseMoveDelegate=function(d){return b._mouseMove(d)};this._mouseUpDelegate=function(d){return b._mouseUp(d)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);c.browser.safari||a.preventDefault();return a.originalEvent.mouseHandled=true}},_mouseMove:function(a){if(c.browser.msie&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&& |
| + | this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=a.target==this._mouseDownEvent.target;this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX- |
| + | a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); |
| + | ;/* |
| + | * jQuery UI Sortable 1.8.4 |
| * | |
| * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) | |
| * Dual licensed under the MIT or GPL Version 2 licenses. | |
| * http://jquery.org/license | |
| * | |
| - | * http://docs.jquery.com/UI/Datepicker |
| + | * http://docs.jquery.com/UI/Sortables |
| * | |
| * Depends: | |
| * jquery.ui.core.js | |
| + | * jquery.ui.mouse.js |
| + | * jquery.ui.widget.js |
| + | */ |
| + | (function(d){d.widget("ui.sortable",d.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable"); |
| + | this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this, |
| + | arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem= |
| + | c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset, |
| + | {click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment(); |
| + | if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start", |
| + | a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute"); |
| + | if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop+b.scrollSpeed;else if(a.pageY-this.overflowOffset.top<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop-b.scrollSpeed;if(this.overflowOffset.left+ |
| + | this.scrollParent[0].offsetWidth-a.pageX<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft+b.scrollSpeed;else if(a.pageX-this.overflowOffset.left<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft-b.scrollSpeed}else{if(a.pageY-d(document).scrollTop()<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()-b.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()+ |
| + | b.scrollSpeed);if(a.pageX-d(document).scrollLeft()<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()-b.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()+b.scrollSpeed)}c!==false&&d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+ |
| + | "px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(b=this.items.length-1;b>=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a, |
| + | c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]== |
| + | document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp();this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate", |
| + | null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem): |
| + | d(this.domPosition.parent).prepend(this.currentItem);return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")},toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute|| |
| + | "id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+j<k&&b+l>g&&b+l<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>a[this.floating?"width":"height"]?j:g<b+ |
| + | this.helperProportions.width/2&&c-this.helperProportions.width/2<h&&i<e+this.helperProportions.height/2&&f-this.helperProportions.height/2<k},_intersectsWithPointer:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left,a.width);b=b&&a;a=this._getDragVerticalDirection();var c=this._getDragHorizontalDirection();if(!b)return false;return this.floating?c&&c=="right"||a=="down"?2:1:a&&(a=="down"? |
| + | 2:1)},_intersectsWithSides:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top+a.height/2,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left+a.width/2,a.width);var c=this._getDragVerticalDirection(),e=this._getDragHorizontalDirection();return this.floating&&e?e=="right"&&a||e=="left"&&!a:c&&(c=="down"&&b||c=="up"&&!b)},_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;return a!=0&&(a>0?"down":"up")}, |
| + | _getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!= |
| + | this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a= |
| + | this.currentItem.find(":data(sortable-item)"),b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(a){this.items=[];this.containers=[this];var b=this.items,c=[[d.isFunction(this.options.items)?this.options.items.call(this.element[0],a,{item:this.currentItem}):d(this.options.items,this.element),this]],e=this._connectWith();if(e)for(var f=e.length-1;f>=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable"); |
| + | if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h<g;h++){i=d(e[h]);i.data("sortable-item",a);b.push({item:i,instance:a,width:0,height:0,left:0,top:0})}}},refreshPositions:function(a){if(this.offsetParent&&this.helper)this.offset.parent=this._getParentOffset();for(var b=this.items.length-1;b>= |
| + | 0;b--){var c=this.items[b],e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width= |
| + | this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f}, |
| + | update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b= |
| + | null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this)); |
| + | this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-f)<b){b=Math.abs(h-f);e=this.items[g]}}if(e||this.options.dropOnEmpty){this.currentContainer=this.containers[c];e?this._rearrange(a,e,null,true):this._rearrange(a, |
| + | null,this.containers[c].element,true);this._trigger("change",a,this._uiHash());this.containers[c]._trigger("change",a,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}}},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a,this.currentItem])):b.helper=="clone"?this.currentItem.clone():this.currentItem;a.parents("body").length|| |
| + | d(b.appendTo!="parent"?b.appendTo:this.currentItem[0].parentNode)[0].appendChild(a[0]);if(a[0]==this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(a[0].style.width==""||b.forceHelperSize)a.width(this.currentItem.width());if(a[0].style.height==""||b.forceHelperSize)a.height(this.currentItem.height());return a},_adjustOffsetFromHelper:function(a){if(typeof a== |
| + | "string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition== |
| + | "absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition== |
| + | "relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}}, |
| + | _setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height- |
| + | this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)){var b=d(a.containment)[0];a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"), |
| + | 10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))? |
| + | this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b= |
| + | this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();var f=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])f=this.containment[0]+ |
| + | this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])? |
| + | g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;f=this.originalPageX+Math.round((f-this.originalPageX)/b.grid[0])*b.grid[0];f=this.containment?!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:!(f-this.offset.click.left<this.containment[0])?f-b.grid[0]:f+b.grid[0]:f}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop(): |
| + | e?0:c.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())}},_rearrange:function(a,b,c,e){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?b.item[0]:b.item[0].nextSibling);this.counter=this.counter?++this.counter:1;var f=this,g=this.counter;window.setTimeout(function(){g== |
| + | f.counter&&f.refreshPositions(!e)},0)},_clear:function(a,b){this.reverting=false;var c=[];!this._noFinalSort&&this.currentItem[0].parentNode&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var e in this._storedCSS)if(this._storedCSS[e]=="auto"||this._storedCSS[e]=="static")this._storedCSS[e]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!b&&c.push(function(f){this._trigger("receive", |
| + | f,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!b)c.push(function(f){this._trigger("update",f,this._uiHash())});if(!d.ui.contains(this.element[0],this.currentItem[0])){b||c.push(function(f){this._trigger("remove",f,this._uiHash())});for(e=this.containers.length-1;e>=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive", |
| + | g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over= |
| + | 0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",a,this._uiHash());for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}return false}b||this._trigger("beforeStop",a,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]); |
| + | this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!b){for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){d.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},_uiHash:function(a){var b=a||this;return{helper:b.helper,placeholder:b.placeholder||d([]),position:b.position,originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}}); |
| + | d.extend(d.ui.sortable,{version:"1.8.4"})})(jQuery); |
| + | ;/* |
| + | * jQuery UI Progressbar 1.8.4 |
| + | * |
| + | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) |
| + | * Dual licensed under the MIT or GPL Version 2 licenses. |
| + | * http://jquery.org/license |
| + | * |
| + | * http://docs.jquery.com/UI/Progressbar |
| + | * |
| + | * Depends: |
| + | * jquery.ui.core.js |
| + | * jquery.ui.widget.js |
| */ | |
| - | (function(d,G){function L(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass= |
| - | "ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su", |
| - | "Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10", |
| - | minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>')}function E(a,b){d.extend(a, |
| - | b);for(var c in b)if(b[c]==null||b[c]==G)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.4"}});var y=(new Date).getTime();d.extend(L.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]= |
| - | f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}}, |
| - | _connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&& |
| - | b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f== |
| - | ""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a, |
| - | c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b), |
| - | true);this._updateDatepicker(b);this._updateAlternate(b)}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}E(a.settings,e||{});b=b&&b.constructor== |
| - | Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]); |
| - | d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}}, |
| - | _enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b= |
| - | d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false; |
| - | for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?d.extend({},e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&& |
| - | this._hideDatepicker();var h=this._getDateDatepicker(a,true);E(e.settings,f);this._attachments(d(a),e);this._autoSize(e);this._setDateDatepicker(a,h);this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&& |
| - | !a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker();c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass,b.dpDiv).add(d("td."+d.datepicker._currentClass,b.dpDiv));c[0]?d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]):d.datepicker._hideDatepicker(); |
| - | return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey|| |
| - | a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target, |
| - | a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat")); |
| - | var c=String.fromCharCode(a.charCode==G?a.keyCode:a.charCode);return a.ctrlKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target|| |
| - | a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");E(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a); |
| - | d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&& |
| - | d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=d.datepicker._getBorders(b.dpDiv);b.dpDiv.find("iframe.ui-datepicker-cover").css({left:-i[0],top:-i[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f, |
| - | h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a)).find("iframe.ui-datepicker-cover").css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}).end().find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){d(this).removeClass("ui-state-hover"); |
| - | this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover"); |
| - | this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);var e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"); |
| - | a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input.focus()},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(), |
| - | k=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>k&&k>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1);)a=a[b?"previousSibling":"nextSibling"]; |
| - | a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val(): |
| - | "",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&& |
| - | !a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth; |
| - | b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b= |
| - | this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a= |
| - | d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a, |
| - | "altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b== |
| - | "object"?b.toString():b+"";if(b=="")return null;for(var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff,f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,k=c=-1,l=-1,u=-1,j=false,o=function(p){(p=z+1<a.length&&a.charAt(z+1)==p)&&z++;return p},m=function(p){o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"?4:p=="o"? |
| - | 3:2)+"}");p=b.substring(s).match(p);if(!p)throw"Missing number at position "+s;s+=p[0].length;return parseInt(p[0],10)},n=function(p,w,H){p=o(p)?H:w;for(w=0;w<p.length;w++)if(b.substr(s,p[w].length)==p[w]){s+=p[w].length;return w+1}throw"Unknown name at position "+s;},r=function(){if(b.charAt(s)!=a.charAt(z))throw"Unexpected literal at position "+s;s++},s=0,z=0;z<a.length;z++)if(j)if(a.charAt(z)=="'"&&!o("'"))j=false;else r();else switch(a.charAt(z)){case "d":l=m("d");break;case "D":n("D",f,h);break; |
| - | case "o":u=m("o");break;case "m":k=m("m");break;case "M":k=n("M",i,g);break;case "y":c=m("y");break;case "@":var v=new Date(m("@"));c=v.getFullYear();k=v.getMonth()+1;l=v.getDate();break;case "!":v=new Date((m("!")-this._ticksTo1970)/1E4);c=v.getFullYear();k=v.getMonth()+1;l=v.getDate();break;case "'":if(o("'"))r();else j=true;break;default:r()}if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>-1){k=1;l=u;do{e=this._getDaysInMonth(c, |
| - | k-1);if(l<=e)break;k++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,k-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=k||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return""; |
| - | var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=j+1<a.length&&a.charAt(j+1)==o)&&j++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},k=function(o,m,n,r){return i(o)?r[m]:n[m]},l="",u=false;if(b)for(var j=0;j<a.length;j++)if(u)if(a.charAt(j)=="'"&&!i("'"))u=false;else l+=a.charAt(j); |
| - | else switch(a.charAt(j)){case "d":l+=g("d",b.getDate(),2);break;case "D":l+=k("D",b.getDay(),e,f);break;case "o":l+=g("o",(b.getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=k("M",b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+="'";else u=true;break;default:l+=a.charAt(j)}return l}, |
| - | _possibleChars:function(a){for(var b="",c=false,e=function(h){(h=f+1<a.length&&a.charAt(f+1)==h)&&f++;return h},f=0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+="0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==G?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!= |
| - | a.lastVal){var c=this._get(a,"dateFormat"),e=a.lastVal=a.input?a.input.val():null,f,h;f=h=this._getDefaultDate(a);var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a, |
| - | this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var e=function(h){var i=new Date;i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,k=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,j=u.exec(h);j;){switch(j[2]||"d"){case "d":case "D":g+=parseInt(j[1], |
| - | 10);break;case "w":case "W":g+=parseInt(j[1],10)*7;break;case "m":case "M":l+=parseInt(j[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(k,l));break;case "y":case "Y":k+=parseInt(j[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(k,l));break}j=u.exec(h)}return new Date(k,l,g)};if(b=(b=b==null?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):b)&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},_daylightSavingAdjust:function(a){if(!a)return null; |
| - | a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear|| |
| - | a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),k=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay? |
| - | new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),j=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=j&&n<j?j:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-k,1)),this._getFormatConfig(a)); |
| - | n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', -"+k+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m, |
| - | g+k,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', +"+k+", 'M');\" title=\""+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>";k=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&& |
| - | a.currentDay?u:b;k=!h?k:this.formatDate(k,r,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+y+'.datepicker._hideDatepicker();">'+this._get(a,"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,r)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+ |
| - | y+".datepicker._gotoToday('#"+a.id+"');\">"+k+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;k=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),w=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var M=this._getDefaultDate(a),I="",C=0;C<i[0];C++){for(var N= |
| - | "",D=0;D<i[1];D++){var J=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",x="";if(l){x+='<div class="ui-datepicker-group';if(i[1]>1)switch(D){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&C==0?c? |
| - | f:n:"")+(/all|right/.test(t)&&C==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,j,o,C>0||D>0,z,v)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var A=k?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var q=(t+h)%7;A+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+r[q]+'">'+s[q]+"</span></th>"}x+=A+"</tr></thead><tbody>";A=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay, |
| - | A);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;A=l?6:Math.ceil((t+A)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O<A;O++){x+="<tr>";var P=!k?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(q)+"</td>";for(t=0;t<7;t++){var F=p?p.apply(a.input?a.input[0]:null,[q]):[true,""],B=q.getMonth()!=g,K=B&&!H||!F[0]||j&&q<j||o&&q>o;P+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(B?" ui-datepicker-other-month":"")+(q.getTime()==J.getTime()&&g==a.selectedMonth&& |
| - | a._keyEvent||M.getTime()==q.getTime()&&M.getTime()==J.getTime()?" "+this._dayOverClass:"")+(K?" "+this._unselectableClass+" ui-state-disabled":"")+(B&&!w?"":" "+F[1]+(q.getTime()==u.getTime()?" "+this._currentClass:"")+(q.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!B||w)&&F[2]?' title="'+F[2]+'"':"")+(K?"":' onclick="DP_jQuery_'+y+".datepicker._selectDay('#"+a.id+"',"+q.getMonth()+","+q.getFullYear()+', this);return false;"')+">"+(B&&!w?" ":K?'<span class="ui-state-default">'+q.getDate()+ |
| - | "</span>":'<a class="ui-state-default'+(q.getTime()==b.getTime()?" ui-state-highlight":"")+(q.getTime()==J.getTime()?" ui-state-active":"")+(B?" ui-priority-secondary":"")+'" href="#">'+q.getDate()+"</a>")+"</td>";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+=P+"</tr>"}g++;if(g>11){g=0;m++}x+="</tbody></table>"+(l?"</div>"+(i[0]>0&&D==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");N+=x}I+=N}I+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>': |
| - | "");a._keyEvent=false;return I},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var k=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),j='<div class="ui-datepicker-title">',o="";if(h||!k)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+ |
| - | a.id+"');\">";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(j+=o+(h||!(k&&l)?" ":""));if(h||!l)j+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b, |
| - | i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(j+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)j+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";j+="</select>"}j+=this._get(a,"yearSuffix");if(u)j+=(h||!(k&&l)?" ":"")+o;j+="</div>";return j},_adjustInstDate:function(a,b,c){var e= |
| - | a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a, |
| - | "onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a); |
| - | c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a, |
| - | "dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker= |
| - | function(a){if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b)); |
| - | return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new L;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.4";window["DP_jQuery_"+y]=d})(jQuery); |
| - | ; |
| - | |
| + | (function(b,c){b.widget("ui.progressbar",{options:{value:0},min:0,max:100,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.max,"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); |
| + | this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===c)return this._value();this._setOption("value",a);return this},_setOption:function(a,d){if(a==="value"){this.options.value=d;this._refreshValue();this._trigger("change")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.max,Math.max(this.min,a))},_refreshValue:function(){var a=this.value();this.valueDiv.toggleClass("ui-corner-right", |
| + | a===this.max).width(a+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.4"})})(jQuery); |
| + | ; |
| \ No newline at end of file | |
public/javascripts/cms/rteditor.js
+19
-41
| @@ | @@ -1,47 +1,25 @@ |
| $.CMS.RTEditor = function(){ | |
| - | |
| - | $(document).ready(function() { |
| - | $.CMS.RTEditor.init(); |
| - | }).ajaxSend(function(){ |
| - | $.CMS.RTEditor.reset(); |
| - | }).ajaxSuccess(function(){ |
| + | $(document).ready(function() { |
| $.CMS.RTEditor.init(); | |
| }); | |
| return { | |
| - | init: function(){ |
| - | if($('textarea.richText').length > 0){ |
| - | $.CMS.RTEditor.toolbars(); |
| - | $('textarea.richText').each(function(i){ |
| - | CKEDITOR.replace(this.id, { |
| - | resize_maxWidth: 668, |
| - | resize_minWidth: 668, |
| - | toolbar: 'CmsFull', |
| - | toolbar_CmsFull: $.CMS.RTEditor.full_toolbars, |
| - | on: { instanceReady : function( ev ) { |
| - | this.dataProcessor.writer.indentationChars = ' '; |
| - | this.dataProcessor.writer.setRules( '#', { breakBeforeClose: true }); |
| - | } |
| - | } |
| - | }); |
| - | }); |
| - | } |
| - | }, |
| - | |
| - | toolbars: function() { |
| - | $.CMS.RTEditor.basic_toolbars = [ |
| - | [ 'Copy','Cut','Paste','PasteText','PasteFromWord', '-', 'Bold','Italic','Underline','Strike','-', 'NumberedList','BulletedList', '-', 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock', '-', 'Undo','Redo', '-', 'Link','Unlink','Anchor', '-', 'Table' ] |
| - | ]; |
| - | |
| - | $.CMS.RTEditor.full_toolbars = $.CMS.RTEditor.basic_toolbars.concat([ '/', |
| - | ['Subscript','Superscript', '-', 'Source'] |
| - | ]); |
| - | }, |
| - | |
| - | reset: function(){ |
| - | $.each(CKEDITOR.instances, function(i, v){ |
| - | v.destroy(); |
| - | }); |
| - | } |
| - | }; |
| + | init: function() { |
| + | $('textarea.richText').tinymce({ |
| + | // General options |
| + | theme : "advanced", |
| + | // Plugins |
| + | plugins: "", |
| + | // Theme options |
| + | theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,cut,copy,paste,pastetext,pasteword,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,code", |
| + | theme_advanced_buttons2 : "", |
| + | theme_advanced_buttons3 : "", |
| + | theme_advanced_buttons4 : "", |
| + | theme_advanced_toolbar_location : "top", |
| + | theme_advanced_toolbar_align : "left", |
| + | theme_advanced_statusbar_location : "bottom", |
| + | theme_advanced_resizing : true, |
| + | }) |
| + | } |
| + | } |
| }(); | |
public/javascripts/cms/syntax_highlighter.js
+21
-0
| @@ | @@ -0,0 +1,21 @@ |
| + | $.CMS.CodeMirror = function(){ |
| + | |
| + | $(document).ready(function(){ |
| + | $.CMS.CodeMirror.init(); |
| + | }).ajaxSuccess(function(){ |
| + | $.CMS.CodeMirror.init(); |
| + | }); |
| + | |
| + | return { |
| + | init: function(){ |
| + | $('.codeTextArea').each(function(i, el){ |
| + | CodeMirror.fromTextArea(el, { |
| + | parserfile: ["parsexml.js", "parsecss.js", "tokenizejavascript.js", "parsejavascript.js", "parsehtmlmixed.js"], |
| + | stylesheet: ["/stylesheets/codemirror/xmlcolors.css", "/stylesheets/codemirror/jscolors.css", "/stylesheets/codemirror/csscolors.css"], |
| + | path: "/javascripts/codemirror/", |
| + | iframeClass: 'codeMirrorIframe' |
| + | }); |
| + | }); |
| + | } |
| + | } |
| + | }(); |
public/javascripts/cms/uploader.js
+43
-0
| @@ | @@ -0,0 +1,43 @@ |
| + | $.CMS.Uploader = function(){ |
| + | $(document).ready(function() { |
| + | $.CMS.Uploader.init(); |
| + | }); |
| + | |
| + | return { |
| + | init: function() { |
| + | auth_token = $("meta[name=csrf-token]").attr('content'); |
| + | |
| + | var uploader = new plupload.Uploader({ |
| + | runtimes: 'html5,html4', |
| + | browse_button: 'pickfiles', |
| + | unique_names: true, |
| + | multipart: true, |
| + | multipart_params: { authenticity_token: auth_token }, |
| + | url: '/cms-admin/assets' |
| + | }); |
| + | |
| + | uploader.init(); |
| + | |
| + | uploader.bind('FilesAdded', function(up, files) { |
| + | $.each(files, function(i, file) { |
| + | $('#filelist').append('<div id="' + file.id + '">' + file.name + ' (' + plupload.formatSize(file.size) + ')<div class="progressbar"></div></div>'); |
| + | $( "#"+file.id+' .progressbar' ).progressbar(); |
| + | }); |
| + | uploader.start(); |
| + | }); |
| + | |
| + | uploader.bind('UploadProgress', function(up, file) { |
| + | $( "#"+file.id+' .progressbar' ).progressbar({ value: file.percent }); |
| + | }); |
| + | |
| + | uploader.bind('Error', function(up, err) { |
| + | alert(err.file.name+": "+err.message) |
| + | }); |
| + | |
| + | uploader.bind('FileUploaded', function(up, file){ |
| + | $.get('/cms-admin/assets'); |
| + | $('#'+file.id).fadeOut(4000); |
| + | }) |
| + | } |
| + | } |
| + | }(); |
public/stylesheets/cms/cms_master.css
+451
-0
| @@ | @@ -0,0 +1,451 @@ |
| + | html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { |
| + | margin: 0; |
| + | padding: 0; |
| + | border: 0; |
| + | outline: 0; |
| + | font-size: 100%; |
| + | vertical-align: baseline; |
| + | background: transparent; |
| + | font-weight: normal; } |
| + | |
| + | body { |
| + | line-height: 1; } |
| + | |
| + | ol, ul { |
| + | list-style: none; } |
| + | |
| + | blockquote, q { |
| + | quotes: none; } |
| + | |
| + | blockquote:before, blockquote:after, q:before, q:after { |
| + | content: ""; |
| + | content: none; } |
| + | |
| + | *:focus { |
| + | outline: 0; } |
| + | |
| + | ins { |
| + | text-decoration: none; } |
| + | |
| + | del { |
| + | text-decoration: line-through; } |
| + | |
| + | table { |
| + | border-collapse: collapse; |
| + | border-spacing: 0; } |
| + | |
| + | caption, th { |
| + | text-align: left; } |
| + | |
| + | body { |
| + | font: 13px Arial, Verdana, clean, sans-serif; |
| + | _font-size: small; |
| + | _font: x-small; } |
| + | |
| + | table { |
| + | font-size: inherit; } |
| + | table th { |
| + | font-weight: bold; } |
| + | |
| + | pre, code { |
| + | font: 115% monospace; |
| + | _font-size: 100%; } |
| + | |
| + | p { |
| + | font: 12px/15px Arial, sans-serif; |
| + | color: black; } |
| + | |
| + | h1, h2, h3 { |
| + | margin: 0.8em 0em; } |
| + | |
| + | h2 { |
| + | font: bold 25px/30px Arial, sans-serif; |
| + | color: black; } |
| + | |
| + | h3 { |
| + | font: bold 18px/24px Arial, sans-serif; |
| + | color: black; } |
| + | |
| + | a { |
| + | color: #26a9e0; |
| + | text-decoration: none; } |
| + | |
| + | a:hover { |
| + | text-decoration: none; |
| + | border-bottom: 1px dotted #26a9e0; } |
| + | |
| + | a.button { |
| + | -moz-border-radius: 5px; |
| + | -webkit-border-radius: 5px; |
| + | background-color: #7cae00; |
| + | padding: 5px 8px; |
| + | font: 10px/20px Arial, sans-serif; |
| + | color: white; |
| + | text-transform: uppercase; |
| + | letter-spacing: 1px; } |
| + | |
| + | a.button:hover { |
| + | background-color: #629700; |
| + | border: 0px; } |
| + | |
| + | a.big_button { |
| + | float: left; |
| + | padding: 0px 15px; |
| + | font: bold 14px/33px Arial, sans-serif; |
| + | color: white; |
| + | -moz-border-radius: 7px; |
| + | -webkit-border-radius: 7px; |
| + | background: url("/images/cms/bg-button-green-34.gif") top; |
| + | display: block; |
| + | text-decoration: none; |
| + | height: 34px; } |
| + | |
| + | a.big_button:hover { |
| + | background-position: 0 -34px; |
| + | border: 0px; } |
| + | |
| + | a.top_button { |
| + | float: right; |
| + | padding: 0px 15px; |
| + | margin-top: -35px; |
| + | font: bold 14px/33px Arial, sans-serif; |
| + | color: white; |
| + | -moz-border-radius: 0px 0px 7px 7px; |
| + | -webkit-border-bottom-left-radius: 7px; |
| + | -webkit-border-bottom-right-radius: 7px; |
| + | background: url("/images/cms/bg-button-green-34.gif") top; |
| + | display: block; |
| + | text-decoration: none; |
| + | height: 34px; } |
| + | |
| + | a.top_button:hover { |
| + | background-position: 0 -34px; |
| + | border: 0px; } |
| + | |
| + | .filter_form { |
| + | float: right; |
| + | margin-bottom: 15px; } |
| + | |
| + | body { |
| + | background: white url("/images/cms/background.png") top left repeat-y; } |
| + | body .content_wrapper { |
| + | width: 1195px; } |
| + | body .content_wrapper .left_column { |
| + | width: 205px; |
| + | float: left; } |
| + | body .content_wrapper .left_column .header { |
| + | text-align: center; |
| + | width: 150px; |
| + | margin: 15px auto; } |
| + | body .content_wrapper .left_column .header h1 { |
| + | padding: 0px; |
| + | margin: 0px; |
| + | display: none; } |
| + | body .content_wrapper .left_column .header a { |
| + | font-size: 0px; |
| + | line-height: 0px; |
| + | color: white; |
| + | text-decoration: none; } |
| + | body .content_wrapper .left_column .header a:hover { |
| + | border: 0px; } |
| + | body .content_wrapper .content_column { |
| + | width: 990px; |
| + | float: left; } |
| + | body .content_wrapper .content_column .flash.notice { |
| + | padding: 6px; |
| + | background-color: #c7e03d; |
| + | color: black; |
| + | margin: 15px 0px; |
| + | font-size: 14px; } |
| + | body .content_wrapper .content_column .center_column { |
| + | padding: 30px; |
| + | float: left; |
| + | width: 680px; } |
| + | body .content_wrapper .content_column .center_column #form_blocks { |
| + | float: left; |
| + | width: 100%; } |
| + | body .content_wrapper .content_column .center_column #form_blocks label { |
| + | font: bold 16px/24px Arial, sans-serif; |
| + | color: black; |
| + | text-transform: none; |
| + | letter-spacing: 0px; } |
| + | body .content_wrapper .content_column .right_column { |
| + | float: right; |
| + | width: 250px; } |
| + | body .content_wrapper .content_column .right_column .form_element_group { |
| + | padding: 30px 20px 20px 20px; } |
| + | body .content_wrapper .content_column .right_column .form_element_group + .form_element_group { |
| + | border-top: 3px solid #e6e7e8; |
| + | padding-top: 13px; } |
| + | body .content_wrapper .content_column .right_column h2 { |
| + | font: bold 18px/24px Arial, sans-serif; |
| + | color: black; |
| + | margin-bottom: 10px; } |
| + | body .footer { |
| + | display: none; |
| + | padding: 15px; |
| + | color: white; } |
| + | body .footer a { |
| + | color: white; } |
| + | |
| + | .left_column ul { |
| + | margin-bottom: 5px; |
| + | padding: 5px 0px; } |
| + | .left_column ul li { |
| + | margin: 6px 0px; } |
| + | .left_column ul li a { |
| + | display: block; |
| + | font: bold 14px/34px Arial, sans-serif; |
| + | color: #58595b; |
| + | margin-left: 5px; |
| + | padding-left: 35px; |
| + | text-decoration: none; } |
| + | .left_column ul li a.active, .left_column ul li a:hover { |
| + | color: white; |
| + | height: 34px; |
| + | background-color: #231f20; |
| + | -moz-border-radius: 7px 0px 0px 7px; |
| + | -webkit-border-top-left-radius: 7px; |
| + | -webkit-border-bottom-left-radius: 7px; |
| + | border: 0px; } |
| + | |
| + | ul.closed { |
| + | display: none; } |
| + | |
| + | ul.tree_structure { |
| + | background-color: white; |
| + | padding: 25px; |
| + | margin-top: 15px; |
| + | box-shadow: 0px 2px 8px #dddddd; |
| + | -moz-box-shadow: 0px 2px 8px #dddddd; |
| + | -webkit-box-shadow: 0px 2px 8px #dddddd; } |
| + | ul.tree_structure li { |
| + | margin-left: 25px; } |
| + | ul.tree_structure li + li, ul.tree_structure li > ul { |
| + | border-top: 1px solid #eeeeee; } |
| + | ul.tree_structure a.tree_toggle { |
| + | margin-top: 5px; |
| + | width: 20px; |
| + | height: 28px; |
| + | float: left; |
| + | margin-left: -35px; |
| + | font: bold 14px/25px Arial, sans-serif; |
| + | background: url(/images/cms/arrow_bottom.gif) right center no-repeat; |
| + | padding-right: 15px; |
| + | color: #cccccc; |
| + | text-align: right; |
| + | text-decoration: none; } |
| + | ul.tree_structure a.tree_toggle.closed { |
| + | background-image: url(/images/cms/arrow_right.gif); } |
| + | ul.tree_structure a.tree_toggle:hover { |
| + | border: 0px; |
| + | color: black; } |
| + | ul.tree_structure .item { |
| + | padding: 7px 0px 7px 35px; |
| + | overflow: hidden; } |
| + | ul.tree_structure .item .icon { |
| + | margin-left: -30px; |
| + | float: left; |
| + | width: 28px; |
| + | height: 28px; |
| + | background: url(/images/cms/icon_draft.gif); } |
| + | ul.tree_structure .item .icon .dragger { |
| + | width: 28px; |
| + | height: 28px; |
| + | cursor: move; } |
| + | ul.tree_structure .item .icon .dragger:hover { |
| + | background: url(/images/cms/icon_move.gif); } |
| + | ul.tree_structure .item a.label { |
| + | font-size: 14px; |
| + | color: black; } |
| + | ul.tree_structure .item a.label:hover { |
| + | border-bottom: 1px dotted black; } |
| + | ul.tree_structure .item .url { |
| + | font-size: 10px; } |
| + | ul.tree_structure .item .action_links { |
| + | visibility: hidden; |
| + | font-size: 10px; } |
| + | ul.tree_structure .item table.details { |
| + | font-size: 10px; |
| + | margin: 5px 15px; |
| + | border-left: 3px solid #cccccc; } |
| + | ul.tree_structure .item table.details th { |
| + | padding: 0px 5px 0px 10px; |
| + | font-weight: normal; } |
| + | ul.tree_structure .item:hover { |
| + | background-color: #ebf5fc; } |
| + | ul.tree_structure .item:hover .action_links { |
| + | visibility: visible; } |
| + | |
| + | table.formatted { |
| + | margin-bottom: 15px; |
| + | background-color: white; |
| + | border: 10px solid white; |
| + | box-shadow: 0px 2px 8px #dddddd; |
| + | -moz-box-shadow: 0px 2px 8px #dddddd; |
| + | -webkit-box-shadow: 0px 2px 8px #dddddd; } |
| + | table.formatted th, table.formatted td { |
| + | padding: 10px; |
| + | vertical-align: top; |
| + | white-space: nowrap; } |
| + | table.formatted th a.label, table.formatted td a.label { |
| + | color: black; |
| + | font-size: 14px; } |
| + | table.formatted th a.slug, table.formatted td a.slug { |
| + | font-size: 10px; } |
| + | table.formatted th { |
| + | background-color: #eeeeee; |
| + | font-size: 10px; |
| + | text-transform: uppercase; |
| + | border-bottom: 1px solid #444444; } |
| + | table.formatted td.main, table.formatted th.main { |
| + | width: 100%; |
| + | white-space: normal; } |
| + | table.formatted tr { |
| + | border-bottom: 1px solid #eeeeee; } |
| + | |
| + | .form_element_group { |
| + | margin-top: 10px; } |
| + | |
| + | .form_element { |
| + | margin-bottom: 10px; |
| + | overflow: hidden; } |
| + | .form_element .label { |
| + | height: 22px; |
| + | font: 10px/22px Arial, sans-serif; |
| + | color: black; |
| + | text-transform: uppercase; |
| + | letter-spacing: 1px; } |
| + | .form_element .value .field_with_errors { |
| + | display: inline; } |
| + | .form_element .value input, .form_element .value select, .form_element .value textarea { |
| + | width: 97%; |
| + | border: 1px solid #cccccc; |
| + | padding: 3px; } |
| + | .form_element .value input[type=checkbox] { |
| + | width: auto; |
| + | border: 0; |
| + | float: left; |
| + | margin: 1px 4px 0px 0px; } |
| + | .form_element .value .codemirror { |
| + | background-color: white; |
| + | border: 1px inset #e5e5e5; } |
| + | .form_element .value.narrow input, .form_element .value.narrow select, .form_element .value.narrow textarea { |
| + | width: 80%; } |
| + | .form_element .fieldWithErrors label { |
| + | color: #9e0b0f; } |
| + | .form_element .errors { |
| + | color: #9e0b0f; |
| + | margin: 3px 0px; } |
| + | .form_element .select .label label { |
| + | line-height: 20px; } |
| + | |
| + | .form_element.large label { |
| + | font-size: 16px; |
| + | line-height: 26px; } |
| + | .form_element.large .value input { |
| + | font-size: 16px; } |
| + | |
| + | .form_element.time_select_element select, .form_element.time_select_element input, .form_element.date_select_element select, .form_element.date_select_element input, .form_element.check_box_element select, .form_element.check_box_element input, .form_element.radio_button_element select, .form_element.radio_button_element input { |
| + | width: auto; } |
| + | |
| + | .form_element.submit_element input { |
| + | -moz-border-radius: 5px; |
| + | -webkit-border-radius: 5px; |
| + | background-color: #7cae00; |
| + | padding: 5px 8px; |
| + | font: 10px/20px Arial, sans-serif; |
| + | color: white; |
| + | text-transform: uppercase; |
| + | letter-spacing: 1px; |
| + | border: none; } |
| + | |
| + | .form_element_group.vertical { |
| + | float: left; |
| + | width: 50%; } |
| + | .form_element_group.vertical .form_element .label { |
| + | text-align: right; |
| + | width: 40px; |
| + | float: left; } |
| + | .form_element_group.vertical .form_element .value { |
| + | float: left; |
| + | width: 80%; |
| + | margin-left: 10px; } |
| + | .form_element_group.vertical .form_element .value select { |
| + | width: 100%; } |
| + | .form_element_group.vertical .form_element .value input[type=text] { |
| + | width: 100%; } |
| + | |
| + | .vertical + .vertical .form_element .label { |
| + | width: 100px; } |
| + | .vertical + .vertical .form_element .value { |
| + | width: 60%; } |
| + | |
| + | .form_element_group.publishing .form_element .field input { |
| + | width: 200px; } |
| + | |
| + | .submit { |
| + | float: left; |
| + | line-height: 30px; } |
| + | .submit .submit_element { |
| + | margin: 5px 5px 5px 0px; |
| + | float: left; } |
| + | |
| + | form .errorExplanation { |
| + | background-color: #9e0b0f; |
| + | padding: 10px; |
| + | color: white; |
| + | font-size: 12px; } |
| + | form .errorExplanation h2 { |
| + | margin: 0.1em 0em; |
| + | font-size: 16px; } |
| + | form .errorExplanation h2, form .errorExplanation p { |
| + | color: white; } |
| + | form .errorExplanation ul { |
| + | margin: 10px 10px 0px 10px; } |
| + | |
| + | .form_element_group.advanced { |
| + | display: none; } |
| + | |
| + | .pagination { |
| + | margin-bottom: 15px; |
| + | float: right; } |
| + | .pagination a, .pagination span { |
| + | background: #404040; |
| + | color: white; |
| + | padding: 2px 5px; |
| + | font-size: 11px; |
| + | -moz-border-radius: 2px; } |
| + | .pagination a:hover { |
| + | text-decoration: none; } |
| + | .pagination span.disabled { |
| + | display: none; } |
| + | .pagination span.current { |
| + | background-color: #999999; } |
| + | |
| + | #cms_admin_layouts_index .icon { |
| + | background-image: url(/images/cms/icon_layout.gif); } |
| + | |
| + | #cms_admin_pages_index .icon.published { |
| + | background-image: url(/images/cms/icon_regular.gif); } |
| + | |
| + | #cms_admin_snippets_index .icon { |
| + | width: 28px; |
| + | height: 28px; |
| + | background: url(/images/cms/icon_snippet.gif); } |
| + | |
| + | a#pickfiles { |
| + | float: right; |
| + | cursor: pointer; } |
| + | |
| + | #assets_list .assets { |
| + | overflow: hidden; } |
| + | #assets_list .assets .asset { |
| + | float: left; |
| + | width: 60px; |
| + | margin-bottom: 5px; } |
| + | #assets_list .assets .asset .thumb img { |
| + | border: 1px solid #cccccc; |
| + | padding: 1px; } |
| + | #assets_list .assets .asset + .asset { |
| + | margin-left: 10px; } |
public/stylesheets/cms/images/ui-bg_flat_0_aaaaaa_40x100.png
+0
-0
public/stylesheets/cms/images/ui-bg_flat_75_ffffff_40x100.png
+0
-0
public/stylesheets/cms/images/ui-bg_glass_55_fbf9ee_1x400.png
+0
-0
public/stylesheets/cms/images/ui-bg_glass_65_ffffff_1x400.png
+0
-0
public/stylesheets/cms/images/ui-bg_glass_75_dadada_1x400.png
+0
-0
public/stylesheets/cms/images/ui-bg_glass_75_e6e6e6_1x400.png
+0
-0
public/stylesheets/cms/images/ui-bg_glass_95_fef1ec_1x400.png
+0
-0
public/stylesheets/cms/images/ui-bg_highlight-soft_75_cccccc_1x100.png
+0
-0
public/stylesheets/cms/images/ui-icons_222222_256x240.png
+0
-0
public/stylesheets/cms/images/ui-icons_2e83ff_256x240.png
+0
-0
public/stylesheets/cms/images/ui-icons_454545_256x240.png
+0
-0
public/stylesheets/cms/images/ui-icons_888888_256x240.png
+0
-0
public/stylesheets/cms/images/ui-icons_cd0a0a_256x240.png
+0
-0
public/stylesheets/cms/jquery-ui.css
+305
-0
| @@ | @@ -0,0 +1,305 @@ |
| + | /* |
| + | * jQuery UI CSS Framework @VERSION |
| + | * |
| + | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) |
| + | * Dual licensed under the MIT or GPL Version 2 licenses. |
| + | * http://jquery.org/license |
| + | * |
| + | * http://docs.jquery.com/UI/Theming/API |
| + | */ |
| + | |
| + | /* Layout helpers |
| + | ----------------------------------*/ |
| + | .ui-helper-hidden { display: none; } |
| + | .ui-helper-hidden-accessible { position: absolute; left: -99999999px; } |
| + | .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } |
| + | .ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } |
| + | .ui-helper-clearfix { display: inline-block; } |
| + | /* required comment for clearfix to work in Opera \*/ |
| + | * html .ui-helper-clearfix { height:1%; } |
| + | .ui-helper-clearfix { display:block; } |
| + | /* end clearfix */ |
| + | .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } |
| + | |
| + | |
| + | /* Interaction Cues |
| + | ----------------------------------*/ |
| + | .ui-state-disabled { cursor: default !important; } |
| + | |
| + | |
| + | /* Icons |
| + | ----------------------------------*/ |
| + | |
| + | /* states and images */ |
| + | .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } |
| + | |
| + | |
| + | /* Misc visuals |
| + | ----------------------------------*/ |
| + | |
| + | /* Overlays */ |
| + | .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } |
| + | |
| + | |
| + | /* |
| + | * jQuery UI CSS Framework @VERSION |
| + | * |
| + | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) |
| + | * Dual licensed under the MIT or GPL Version 2 licenses. |
| + | * http://jquery.org/license |
| + | * |
| + | * http://docs.jquery.com/UI/Theming/API |
| + | * |
| + | * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px |
| + | */ |
| + | |
| + | |
| + | /* Component containers |
| + | ----------------------------------*/ |
| + | .ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } |
| + | .ui-widget .ui-widget { font-size: 1em; } |
| + | .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } |
| + | .ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; } |
| + | .ui-widget-content a { color: #222222; } |
| + | .ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; } |
| + | .ui-widget-header a { color: #222222; } |
| + | |
| + | /* Interaction states |
| + | ----------------------------------*/ |
| + | .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; } |
| + | .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } |
| + | .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } |
| + | .ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; } |
| + | .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } |
| + | .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } |
| + | .ui-widget :active { outline: none; } |
| + | |
| + | /* Interaction Cues |
| + | ----------------------------------*/ |
| + | .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } |
| + | .ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } |
| + | .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } |
| + | .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } |
| + | .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } |
| + | .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } |
| + | .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } |
| + | .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } |
| + | |
| + | /* Icons |
| + | ----------------------------------*/ |
| + | |
| + | /* states and images */ |
| + | .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } |
| + | .ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } |
| + | .ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } |
| + | .ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } |
| + | .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } |
| + | .ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } |
| + | .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } |
| + | .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } |
| + | |
| + | /* positioning */ |
| + | .ui-icon-carat-1-n { background-position: 0 0; } |
| + | .ui-icon-carat-1-ne { background-position: -16px 0; } |
| + | .ui-icon-carat-1-e { background-position: -32px 0; } |
| + | .ui-icon-carat-1-se { background-position: -48px 0; } |
| + | .ui-icon-carat-1-s { background-position: -64px 0; } |
| + | .ui-icon-carat-1-sw { background-position: -80px 0; } |
| + | .ui-icon-carat-1-w { background-position: -96px 0; } |
| + | .ui-icon-carat-1-nw { background-position: -112px 0; } |
| + | .ui-icon-carat-2-n-s { background-position: -128px 0; } |
| + | .ui-icon-carat-2-e-w { background-position: -144px 0; } |
| + | .ui-icon-triangle-1-n { background-position: 0 -16px; } |
| + | .ui-icon-triangle-1-ne { background-position: -16px -16px; } |
| + | .ui-icon-triangle-1-e { background-position: -32px -16px; } |
| + | .ui-icon-triangle-1-se { background-position: -48px -16px; } |
| + | .ui-icon-triangle-1-s { background-position: -64px -16px; } |
| + | .ui-icon-triangle-1-sw { background-position: -80px -16px; } |
| + | .ui-icon-triangle-1-w { background-position: -96px -16px; } |
| + | .ui-icon-triangle-1-nw { background-position: -112px -16px; } |
| + | .ui-icon-triangle-2-n-s { background-position: -128px -16px; } |
| + | .ui-icon-triangle-2-e-w { background-position: -144px -16px; } |
| + | .ui-icon-arrow-1-n { background-position: 0 -32px; } |
| + | .ui-icon-arrow-1-ne { background-position: -16px -32px; } |
| + | .ui-icon-arrow-1-e { background-position: -32px -32px; } |
| + | .ui-icon-arrow-1-se { background-position: -48px -32px; } |
| + | .ui-icon-arrow-1-s { background-position: -64px -32px; } |
| + | .ui-icon-arrow-1-sw { background-position: -80px -32px; } |
| + | .ui-icon-arrow-1-w { background-position: -96px -32px; } |
| + | .ui-icon-arrow-1-nw { background-position: -112px -32px; } |
| + | .ui-icon-arrow-2-n-s { background-position: -128px -32px; } |
| + | .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } |
| + | .ui-icon-arrow-2-e-w { background-position: -160px -32px; } |
| + | .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } |
| + | .ui-icon-arrowstop-1-n { background-position: -192px -32px; } |
| + | .ui-icon-arrowstop-1-e { background-position: -208px -32px; } |
| + | .ui-icon-arrowstop-1-s { background-position: -224px -32px; } |
| + | .ui-icon-arrowstop-1-w { background-position: -240px -32px; } |
| + | .ui-icon-arrowthick-1-n { background-position: 0 -48px; } |
| + | .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } |
| + | .ui-icon-arrowthick-1-e { background-position: -32px -48px; } |
| + | .ui-icon-arrowthick-1-se { background-position: -48px -48px; } |
| + | .ui-icon-arrowthick-1-s { background-position: -64px -48px; } |
| + | .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } |
| + | .ui-icon-arrowthick-1-w { background-position: -96px -48px; } |
| + | .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } |
| + | .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } |
| + | .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } |
| + | .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } |
| + | .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } |
| + | .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } |
| + | .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } |
| + | .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } |
| + | .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } |
| + | .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } |
| + | .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } |
| + | .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } |
| + | .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } |
| + | .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } |
| + | .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } |
| + | .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } |
| + | .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } |
| + | .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } |
| + | .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } |
| + | .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } |
| + | .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } |
| + | .ui-icon-arrow-4 { background-position: 0 -80px; } |
| + | .ui-icon-arrow-4-diag { background-position: -16px -80px; } |
| + | .ui-icon-extlink { background-position: -32px -80px; } |
| + | .ui-icon-newwin { background-position: -48px -80px; } |
| + | .ui-icon-refresh { background-position: -64px -80px; } |
| + | .ui-icon-shuffle { background-position: -80px -80px; } |
| + | .ui-icon-transfer-e-w { background-position: -96px -80px; } |
| + | .ui-icon-transferthick-e-w { background-position: -112px -80px; } |
| + | .ui-icon-folder-collapsed { background-position: 0 -96px; } |
| + | .ui-icon-folder-open { background-position: -16px -96px; } |
| + | .ui-icon-document { background-position: -32px -96px; } |
| + | .ui-icon-document-b { background-position: -48px -96px; } |
| + | .ui-icon-note { background-position: -64px -96px; } |
| + | .ui-icon-mail-closed { background-position: -80px -96px; } |
| + | .ui-icon-mail-open { background-position: -96px -96px; } |
| + | .ui-icon-suitcase { background-position: -112px -96px; } |
| + | .ui-icon-comment { background-position: -128px -96px; } |
| + | .ui-icon-person { background-position: -144px -96px; } |
| + | .ui-icon-print { background-position: -160px -96px; } |
| + | .ui-icon-trash { background-position: -176px -96px; } |
| + | .ui-icon-locked { background-position: -192px -96px; } |
| + | .ui-icon-unlocked { background-position: -208px -96px; } |
| + | .ui-icon-bookmark { background-position: -224px -96px; } |
| + | .ui-icon-tag { background-position: -240px -96px; } |
| + | .ui-icon-home { background-position: 0 -112px; } |
| + | .ui-icon-flag { background-position: -16px -112px; } |
| + | .ui-icon-calendar { background-position: -32px -112px; } |
| + | .ui-icon-cart { background-position: -48px -112px; } |
| + | .ui-icon-pencil { background-position: -64px -112px; } |
| + | .ui-icon-clock { background-position: -80px -112px; } |
| + | .ui-icon-disk { background-position: -96px -112px; } |
| + | .ui-icon-calculator { background-position: -112px -112px; } |
| + | .ui-icon-zoomin { background-position: -128px -112px; } |
| + | .ui-icon-zoomout { background-position: -144px -112px; } |
| + | .ui-icon-search { background-position: -160px -112px; } |
| + | .ui-icon-wrench { background-position: -176px -112px; } |
| + | .ui-icon-gear { background-position: -192px -112px; } |
| + | .ui-icon-heart { background-position: -208px -112px; } |
| + | .ui-icon-star { background-position: -224px -112px; } |
| + | .ui-icon-link { background-position: -240px -112px; } |
| + | .ui-icon-cancel { background-position: 0 -128px; } |
| + | .ui-icon-plus { background-position: -16px -128px; } |
| + | .ui-icon-plusthick { background-position: -32px -128px; } |
| + | .ui-icon-minus { background-position: -48px -128px; } |
| + | .ui-icon-minusthick { background-position: -64px -128px; } |
| + | .ui-icon-close { background-position: -80px -128px; } |
| + | .ui-icon-closethick { background-position: -96px -128px; } |
| + | .ui-icon-key { background-position: -112px -128px; } |
| + | .ui-icon-lightbulb { background-position: -128px -128px; } |
| + | .ui-icon-scissors { background-position: -144px -128px; } |
| + | .ui-icon-clipboard { background-position: -160px -128px; } |
| + | .ui-icon-copy { background-position: -176px -128px; } |
| + | .ui-icon-contact { background-position: -192px -128px; } |
| + | .ui-icon-image { background-position: -208px -128px; } |
| + | .ui-icon-video { background-position: -224px -128px; } |
| + | .ui-icon-script { background-position: -240px -128px; } |
| + | .ui-icon-alert { background-position: 0 -144px; } |
| + | .ui-icon-info { background-position: -16px -144px; } |
| + | .ui-icon-notice { background-position: -32px -144px; } |
| + | .ui-icon-help { background-position: -48px -144px; } |
| + | .ui-icon-check { background-position: -64px -144px; } |
| + | .ui-icon-bullet { background-position: -80px -144px; } |
| + | .ui-icon-radio-off { background-position: -96px -144px; } |
| + | .ui-icon-radio-on { background-position: -112px -144px; } |
| + | .ui-icon-pin-w { background-position: -128px -144px; } |
| + | .ui-icon-pin-s { background-position: -144px -144px; } |
| + | .ui-icon-play { background-position: 0 -160px; } |
| + | .ui-icon-pause { background-position: -16px -160px; } |
| + | .ui-icon-seek-next { background-position: -32px -160px; } |
| + | .ui-icon-seek-prev { background-position: -48px -160px; } |
| + | .ui-icon-seek-end { background-position: -64px -160px; } |
| + | .ui-icon-seek-start { background-position: -80px -160px; } |
| + | /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ |
| + | .ui-icon-seek-first { background-position: -80px -160px; } |
| + | .ui-icon-stop { background-position: -96px -160px; } |
| + | .ui-icon-eject { background-position: -112px -160px; } |
| + | .ui-icon-volume-off { background-position: -128px -160px; } |
| + | .ui-icon-volume-on { background-position: -144px -160px; } |
| + | .ui-icon-power { background-position: 0 -176px; } |
| + | .ui-icon-signal-diag { background-position: -16px -176px; } |
| + | .ui-icon-signal { background-position: -32px -176px; } |
| + | .ui-icon-battery-0 { background-position: -48px -176px; } |
| + | .ui-icon-battery-1 { background-position: -64px -176px; } |
| + | .ui-icon-battery-2 { background-position: -80px -176px; } |
| + | .ui-icon-battery-3 { background-position: -96px -176px; } |
| + | .ui-icon-circle-plus { background-position: 0 -192px; } |
| + | .ui-icon-circle-minus { background-position: -16px -192px; } |
| + | .ui-icon-circle-close { background-position: -32px -192px; } |
| + | .ui-icon-circle-triangle-e { background-position: -48px -192px; } |
| + | .ui-icon-circle-triangle-s { background-position: -64px -192px; } |
| + | .ui-icon-circle-triangle-w { background-position: -80px -192px; } |
| + | .ui-icon-circle-triangle-n { background-position: -96px -192px; } |
| + | .ui-icon-circle-arrow-e { background-position: -112px -192px; } |
| + | .ui-icon-circle-arrow-s { background-position: -128px -192px; } |
| + | .ui-icon-circle-arrow-w { background-position: -144px -192px; } |
| + | .ui-icon-circle-arrow-n { background-position: -160px -192px; } |
| + | .ui-icon-circle-zoomin { background-position: -176px -192px; } |
| + | .ui-icon-circle-zoomout { background-position: -192px -192px; } |
| + | .ui-icon-circle-check { background-position: -208px -192px; } |
| + | .ui-icon-circlesmall-plus { background-position: 0 -208px; } |
| + | .ui-icon-circlesmall-minus { background-position: -16px -208px; } |
| + | .ui-icon-circlesmall-close { background-position: -32px -208px; } |
| + | .ui-icon-squaresmall-plus { background-position: -48px -208px; } |
| + | .ui-icon-squaresmall-minus { background-position: -64px -208px; } |
| + | .ui-icon-squaresmall-close { background-position: -80px -208px; } |
| + | .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } |
| + | .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } |
| + | .ui-icon-grip-solid-vertical { background-position: -32px -224px; } |
| + | .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } |
| + | .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } |
| + | .ui-icon-grip-diagonal-se { background-position: -80px -224px; } |
| + | |
| + | |
| + | /* Misc visuals |
| + | ----------------------------------*/ |
| + | |
| + | /* Corner radius */ |
| + | .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; } |
| + | .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } |
| + | .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } |
| + | .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } |
| + | .ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } |
| + | .ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } |
| + | .ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } |
| + | .ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } |
| + | .ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; } |
| + | |
| + | /* Overlays */ |
| + | .ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } |
| + | .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* |
| + | * jQuery UI Progressbar @VERSION |
| + | * |
| + | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) |
| + | * Dual licensed under the MIT or GPL Version 2 licenses. |
| + | * http://jquery.org/license |
| + | * |
| + | * http://docs.jquery.com/UI/Progressbar#theming |
| + | */ |
| + | .ui-progressbar { height:1em; text-align: left; } |
| + | .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } |
| \ No newline at end of file | |
public/stylesheets/cms_master.css
+0
-435
| @@ | @@ -1,435 +0,0 @@ |
| - | html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { |
| - | margin: 0; |
| - | padding: 0; |
| - | border: 0; |
| - | outline: 0; |
| - | font-size: 100%; |
| - | vertical-align: baseline; |
| - | background: transparent; |
| - | font-weight: normal; } |
| - | |
| - | body { |
| - | line-height: 1; } |
| - | |
| - | ol, ul { |
| - | list-style: none; } |
| - | |
| - | blockquote, q { |
| - | quotes: none; } |
| - | |
| - | blockquote:before, blockquote:after, q:before, q:after { |
| - | content: ""; |
| - | content: none; } |
| - | |
| - | *:focus { |
| - | outline: 0; } |
| - | |
| - | ins { |
| - | text-decoration: none; } |
| - | |
| - | del { |
| - | text-decoration: line-through; } |
| - | |
| - | table { |
| - | border-collapse: collapse; |
| - | border-spacing: 0; } |
| - | |
| - | caption, th { |
| - | text-align: left; } |
| - | |
| - | body { |
| - | font: 13px Arial, Verdana, clean, sans-serif; |
| - | _font-size: small; |
| - | _font: x-small; } |
| - | |
| - | table { |
| - | font-size: inherit; } |
| - | table th { |
| - | font-weight: bold; } |
| - | |
| - | pre, code { |
| - | font: 115% monospace; |
| - | _font-size: 100%; } |
| - | |
| - | p { |
| - | font: 12px/15px Arial, sans-serif; |
| - | color: black; } |
| - | |
| - | h1, h2, h3 { |
| - | margin: 0.8em 0em; } |
| - | |
| - | h2 { |
| - | font: bold 25px/30px Arial, sans-serif; |
| - | color: black; } |
| - | |
| - | h3 { |
| - | font: bold 18px/24px Arial, sans-serif; |
| - | color: black; } |
| - | |
| - | a { |
| - | color: #26a9e0; |
| - | text-decoration: none; } |
| - | |
| - | a:hover { |
| - | text-decoration: none; |
| - | border-bottom: 1px dotted #26a9e0; } |
| - | |
| - | a.button { |
| - | -moz-border-radius: 5px; |
| - | -webkit-border-radius: 5px; |
| - | background-color: #7cae00; |
| - | padding: 5px 8px; |
| - | font: 10px/20px Arial, sans-serif; |
| - | color: white; |
| - | text-transform: uppercase; |
| - | letter-spacing: 1px; } |
| - | |
| - | a.button:hover { |
| - | background-color: #629700; |
| - | border: 0px; } |
| - | |
| - | a.big_button { |
| - | float: left; |
| - | padding: 0px 15px; |
| - | font: bold 14px/33px Arial, sans-serif; |
| - | color: white; |
| - | -moz-border-radius: 7px; |
| - | -webkit-border-radius: 7px; |
| - | background: url("/images/cms/bg-button-green-34.gif") top; |
| - | display: block; |
| - | text-decoration: none; |
| - | height: 34px; } |
| - | |
| - | a.big_button:hover { |
| - | background-position: 0 -34px; |
| - | border: 0px; } |
| - | |
| - | a.top_button { |
| - | float: right; |
| - | padding: 0px 15px; |
| - | margin-top: -35px; |
| - | font: bold 14px/33px Arial, sans-serif; |
| - | color: white; |
| - | -moz-border-radius: 0px 0px 7px 7px; |
| - | -webkit-border-bottom-left-radius: 7px; |
| - | -webkit-border-bottom-right-radius: 7px; |
| - | background: url("/images/cms/bg-button-green-34.gif") top; |
| - | display: block; |
| - | text-decoration: none; |
| - | height: 34px; } |
| - | |
| - | a.top_button:hover { |
| - | background-position: 0 -34px; |
| - | border: 0px; } |
| - | |
| - | .filter_form { |
| - | float: right; |
| - | margin-bottom: 15px; } |
| - | |
| - | body { |
| - | background: white url("/images/cms/background.png") top left repeat-y; } |
| - | body .content_wrapper { |
| - | width: 1195px; } |
| - | body .content_wrapper .left_column { |
| - | width: 205px; |
| - | float: left; } |
| - | body .content_wrapper .left_column .header { |
| - | text-align: center; |
| - | width: 150px; |
| - | margin: 15px auto; } |
| - | body .content_wrapper .left_column .header h1 { |
| - | padding: 0px; |
| - | margin: 0px; |
| - | display: none; } |
| - | body .content_wrapper .left_column .header a { |
| - | font-size: 0px; |
| - | line-height: 0px; |
| - | color: white; |
| - | text-decoration: none; } |
| - | body .content_wrapper .left_column .header a:hover { |
| - | border: 0px; } |
| - | body .content_wrapper .content_column { |
| - | width: 990px; |
| - | float: left; } |
| - | body .content_wrapper .content_column .flash.notice { |
| - | padding: 6px; |
| - | background-color: #c7e03d; |
| - | color: black; |
| - | margin: 15px 0px; |
| - | font-size: 14px; } |
| - | body .content_wrapper .content_column .center_column { |
| - | padding: 30px; |
| - | float: left; |
| - | width: 680px; } |
| - | body .content_wrapper .content_column .center_column #form_blocks { |
| - | float: left; |
| - | width: 100%; } |
| - | body .content_wrapper .content_column .center_column #form_blocks label { |
| - | font: bold 16px/24px Arial, sans-serif; |
| - | color: black; |
| - | text-transform: none; |
| - | letter-spacing: 0px; } |
| - | body .content_wrapper .content_column .right_column { |
| - | float: right; |
| - | width: 250px; } |
| - | body .content_wrapper .content_column .right_column .form_element_group { |
| - | padding: 30px 20px 20px 20px; } |
| - | body .content_wrapper .content_column .right_column .form_element_group + .form_element_group { |
| - | border-top: 3px solid #e6e7e8; |
| - | padding-top: 13px; } |
| - | body .content_wrapper .content_column .right_column h2 { |
| - | font: bold 18px/24px Arial, sans-serif; |
| - | color: black; |
| - | margin-bottom: 10px; } |
| - | body .footer { |
| - | display: none; |
| - | padding: 15px; |
| - | color: white; } |
| - | body .footer a { |
| - | color: white; } |
| - | |
| - | .left_column ul { |
| - | margin-bottom: 5px; |
| - | padding: 5px 0px; } |
| - | .left_column ul li { |
| - | margin: 6px 0px; } |
| - | .left_column ul li a { |
| - | display: block; |
| - | font: bold 14px/34px Arial, sans-serif; |
| - | color: #58595b; |
| - | margin-left: 5px; |
| - | padding-left: 35px; |
| - | text-decoration: none; } |
| - | .left_column ul li a.active, .left_column ul li a:hover { |
| - | color: white; |
| - | height: 34px; |
| - | background-color: #231f20; |
| - | -moz-border-radius: 7px 0px 0px 7px; |
| - | -webkit-border-top-left-radius: 7px; |
| - | -webkit-border-bottom-left-radius: 7px; |
| - | border: 0px; } |
| - | |
| - | ul.closed { |
| - | display: none; } |
| - | |
| - | ul.tree_structure { |
| - | background-color: white; |
| - | padding: 25px; |
| - | margin-top: 15px; |
| - | box-shadow: 0px 2px 8px #dddddd; |
| - | -moz-box-shadow: 0px 2px 8px #dddddd; |
| - | -webkit-box-shadow: 0px 2px 8px #dddddd; } |
| - | ul.tree_structure li { |
| - | margin-left: 25px; } |
| - | ul.tree_structure li + li, ul.tree_structure li > ul { |
| - | border-top: 1px solid #eeeeee; } |
| - | ul.tree_structure a.tree_toggle { |
| - | margin-top: 5px; |
| - | width: 20px; |
| - | height: 28px; |
| - | float: left; |
| - | margin-left: -35px; |
| - | font: bold 14px/25px Arial, sans-serif; |
| - | background: url(/images/cms/arrow_bottom.gif) right center no-repeat; |
| - | padding-right: 15px; |
| - | color: #cccccc; |
| - | text-align: right; |
| - | text-decoration: none; } |
| - | ul.tree_structure a.tree_toggle.closed { |
| - | background-image: url(/images/cms/arrow_right.gif); } |
| - | ul.tree_structure a.tree_toggle:hover { |
| - | border: 0px; |
| - | color: black; } |
| - | ul.tree_structure .item { |
| - | padding: 7px 0px 7px 35px; |
| - | overflow: hidden; } |
| - | ul.tree_structure .item .icon { |
| - | margin-left: -30px; |
| - | float: left; |
| - | width: 28px; |
| - | height: 28px; |
| - | background: url(/images/cms/icon_draft.gif); } |
| - | ul.tree_structure .item .icon .dragger { |
| - | width: 28px; |
| - | height: 28px; |
| - | cursor: move; } |
| - | ul.tree_structure .item .icon .dragger:hover { |
| - | background: url(/images/cms/icon_move.gif); } |
| - | ul.tree_structure .item a.label { |
| - | font-size: 14px; |
| - | color: black; } |
| - | ul.tree_structure .item a.label:hover { |
| - | border-bottom: 1px dotted black; } |
| - | ul.tree_structure .item .url { |
| - | font-size: 10px; } |
| - | ul.tree_structure .item .action_links { |
| - | visibility: hidden; |
| - | font-size: 10px; } |
| - | ul.tree_structure .item table.details { |
| - | font-size: 10px; |
| - | margin: 5px 15px; |
| - | border-left: 3px solid #cccccc; } |
| - | ul.tree_structure .item table.details th { |
| - | padding: 0px 5px 0px 10px; |
| - | font-weight: normal; } |
| - | ul.tree_structure .item:hover { |
| - | background-color: #ebf5fc; } |
| - | ul.tree_structure .item:hover .action_links { |
| - | visibility: visible; } |
| - | |
| - | table.formatted { |
| - | margin-bottom: 15px; |
| - | background-color: white; |
| - | border: 10px solid white; |
| - | box-shadow: 0px 2px 8px #dddddd; |
| - | -moz-box-shadow: 0px 2px 8px #dddddd; |
| - | -webkit-box-shadow: 0px 2px 8px #dddddd; } |
| - | table.formatted th, table.formatted td { |
| - | padding: 10px; |
| - | vertical-align: top; |
| - | white-space: nowrap; } |
| - | table.formatted th a.label, table.formatted td a.label { |
| - | color: black; |
| - | font-size: 14px; } |
| - | table.formatted th a.slug, table.formatted td a.slug { |
| - | font-size: 10px; } |
| - | table.formatted th { |
| - | background-color: #eeeeee; |
| - | font-size: 10px; |
| - | text-transform: uppercase; |
| - | border-bottom: 1px solid #444444; } |
| - | table.formatted td.main, table.formatted th.main { |
| - | width: 100%; |
| - | white-space: normal; } |
| - | table.formatted tr { |
| - | border-bottom: 1px solid #eeeeee; } |
| - | |
| - | .form_element_group { |
| - | margin-top: 10px; } |
| - | |
| - | .form_element { |
| - | margin-bottom: 10px; |
| - | overflow: hidden; } |
| - | .form_element .label { |
| - | height: 22px; |
| - | font: 10px/22px Arial, sans-serif; |
| - | color: black; |
| - | text-transform: uppercase; |
| - | letter-spacing: 1px; } |
| - | .form_element .value .field_with_errors { |
| - | display: inline; } |
| - | .form_element .value input, .form_element .value select, .form_element .value textarea { |
| - | width: 97%; |
| - | border: 1px solid #cccccc; |
| - | padding: 3px; } |
| - | .form_element .value input[type=checkbox] { |
| - | width: auto; |
| - | border: 0; |
| - | float: left; |
| - | margin: 1px 4px 0px 0px; } |
| - | .form_element .value .codemirror { |
| - | background-color: white; |
| - | border: 1px inset #e5e5e5; } |
| - | .form_element .value.narrow input, .form_element .value.narrow select, .form_element .value.narrow textarea { |
| - | width: 80%; } |
| - | .form_element .fieldWithErrors label { |
| - | color: #9e0b0f; } |
| - | .form_element .errors { |
| - | color: #9e0b0f; |
| - | margin: 3px 0px; } |
| - | .form_element .select .label label { |
| - | line-height: 20px; } |
| - | |
| - | .form_element.large label { |
| - | font-size: 16px; |
| - | line-height: 26px; } |
| - | .form_element.large .value input { |
| - | font-size: 16px; } |
| - | |
| - | .form_element.time_select_element select, .form_element.time_select_element input, .form_element.date_select_element select, .form_element.date_select_element input, .form_element.check_box_element select, .form_element.check_box_element input, .form_element.radio_button_element select, .form_element.radio_button_element input { |
| - | width: auto; } |
| - | |
| - | .form_element.submit_element input { |
| - | -moz-border-radius: 5px; |
| - | -webkit-border-radius: 5px; |
| - | background-color: #7cae00; |
| - | padding: 5px 8px; |
| - | font: 10px/20px Arial, sans-serif; |
| - | color: white; |
| - | text-transform: uppercase; |
| - | letter-spacing: 1px; |
| - | border: none; } |
| - | |
| - | .form_element_group.vertical { |
| - | float: left; |
| - | width: 50%; } |
| - | .form_element_group.vertical .form_element .label { |
| - | text-align: right; |
| - | width: 40px; |
| - | float: left; } |
| - | .form_element_group.vertical .form_element .value { |
| - | float: left; |
| - | width: 80%; |
| - | margin-left: 10px; } |
| - | .form_element_group.vertical .form_element .value select { |
| - | width: 100%; } |
| - | .form_element_group.vertical .form_element .value input[type=text] { |
| - | width: 100%; } |
| - | |
| - | .vertical + .vertical .form_element .label { |
| - | width: 100px; } |
| - | .vertical + .vertical .form_element .value { |
| - | width: 60%; } |
| - | |
| - | .form_element_group.publishing .form_element .field input { |
| - | width: 200px; } |
| - | |
| - | .submit { |
| - | float: left; |
| - | line-height: 30px; } |
| - | .submit .submit_element { |
| - | margin: 5px 5px 5px 0px; |
| - | float: left; } |
| - | |
| - | form .errorExplanation { |
| - | background-color: #9e0b0f; |
| - | padding: 10px; |
| - | color: white; |
| - | font-size: 12px; } |
| - | form .errorExplanation h2 { |
| - | margin: 0.1em 0em; |
| - | font-size: 16px; } |
| - | form .errorExplanation h2, form .errorExplanation p { |
| - | color: white; } |
| - | form .errorExplanation ul { |
| - | margin: 10px 10px 0px 10px; } |
| - | |
| - | .form_element_group.advanced { |
| - | display: none; } |
| - | |
| - | .pagination { |
| - | margin-bottom: 15px; |
| - | float: right; } |
| - | .pagination a, .pagination span { |
| - | background: #404040; |
| - | color: white; |
| - | padding: 2px 5px; |
| - | font-size: 11px; |
| - | -moz-border-radius: 2px; } |
| - | .pagination a:hover { |
| - | text-decoration: none; } |
| - | .pagination span.disabled { |
| - | display: none; } |
| - | .pagination span.current { |
| - | background-color: #999999; } |
| - | |
| - | #cms_admin_layouts_index .icon { |
| - | background-image: url(/images/cms/icon_layout.gif); } |
| - | |
| - | #cms_admin_pages_index .icon.published { |
| - | background-image: url(/images/cms/icon_regular.gif); } |
| - | |
| - | #cms_admin_snippets_index .icon { |
| - | width: 28px; |
| - | height: 28px; |
| - | background: url(/images/cms/icon_snippet.gif); } |
public/stylesheets/jquery_ui.css
+0
-961
| @@ | @@ -1,961 +0,0 @@ |
| - | /* jQuery UI CSS Framework @VERSION |
| - | * |
| - | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT or GPL Version 2 licenses. |
| - | * http://jquery.org/license |
| - | * |
| - | * http://docs.jquery.com/UI/Theming/API */ |
| - | /* Layout helpers |
| - | *---------------------------------- */ |
| - | .ui-helper-hidden { |
| - | display: none; } |
| - | |
| - | .ui-helper-hidden-accessible { |
| - | position: absolute; |
| - | left: -99999999px; } |
| - | |
| - | .ui-helper-reset { |
| - | margin: 0; |
| - | padding: 0; |
| - | border: 0; |
| - | outline: 0; |
| - | line-height: 1.3; |
| - | text-decoration: none; |
| - | font-size: 100%; |
| - | list-style: none; } |
| - | |
| - | .ui-helper-clearfix { |
| - | display: inline-block; } |
| - | .ui-helper-clearfix:after { |
| - | content: "."; |
| - | display: block; |
| - | height: 0; |
| - | clear: both; |
| - | visibility: hidden; } |
| - | |
| - | /* required comment for clearfix to work in Opera \ */ |
| - | * html .ui-helper-clearfix { |
| - | height: 1%; } |
| - | |
| - | .ui-helper-clearfix { |
| - | display: block; } |
| - | |
| - | /* end clearfix */ |
| - | .ui-helper-zfix { |
| - | width: 100%; |
| - | height: 100%; |
| - | top: 0; |
| - | left: 0; |
| - | position: absolute; |
| - | opacity: 0; |
| - | filter: Alpha(Opacity=0); } |
| - | |
| - | /* Interaction Cues |
| - | *---------------------------------- */ |
| - | .ui-state-disabled { |
| - | cursor: default !important; } |
| - | |
| - | /* Icons |
| - | *---------------------------------- */ |
| - | /* states and images */ |
| - | .ui-icon { |
| - | display: block; |
| - | text-indent: -99999px; |
| - | overflow: hidden; |
| - | background-repeat: no-repeat; } |
| - | |
| - | /* Misc visuals |
| - | *---------------------------------- */ |
| - | /* Overlays */ |
| - | .ui-widget-overlay { |
| - | position: absolute; |
| - | top: 0; |
| - | left: 0; |
| - | width: 100%; |
| - | height: 100%; } |
| - | |
| - | /* jQuery UI CSS Framework @VERSION |
| - | * |
| - | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT or GPL Version 2 licenses. |
| - | * http://jquery.org/license |
| - | * |
| - | * http://docs.jquery.com/UI/Theming/API |
| - | * |
| - | * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px */ |
| - | /* Component containers |
| - | *---------------------------------- */ |
| - | .ui-widget { |
| - | font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; |
| - | font-size: 1.1em; } |
| - | .ui-widget .ui-widget { |
| - | font-size: 1em; } |
| - | .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { |
| - | font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; |
| - | font-size: 1em; } |
| - | |
| - | .ui-widget-content { |
| - | border: 1px solid #dddddd; |
| - | background: #eeeeee url(/images/cms/jquery_ui/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; |
| - | color: #333333; } |
| - | .ui-widget-content a { |
| - | color: #333333; } |
| - | |
| - | .ui-widget-header { |
| - | border: 1px solid #e78f08; |
| - | background: #f6a828 url(/images/cms/jquery_ui/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; |
| - | color: white; |
| - | font-weight: bold; } |
| - | .ui-widget-header a { |
| - | color: white; } |
| - | |
| - | /* Interaction states |
| - | *---------------------------------- */ |
| - | .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { |
| - | border: 1px solid #cccccc; |
| - | background: #f6f6f6 url(/images/cms/jquery_ui/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; |
| - | font-weight: bold; |
| - | color: #1c94c4; } |
| - | |
| - | .ui-state-default a { |
| - | color: #1c94c4; |
| - | text-decoration: none; } |
| - | .ui-state-default a:link, .ui-state-default a:visited { |
| - | color: #1c94c4; |
| - | text-decoration: none; } |
| - | |
| - | .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { |
| - | border: 1px solid #fbcb09; |
| - | background: #fdf5ce url(/images/cms/jquery_ui/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; |
| - | font-weight: bold; |
| - | color: #c77405; } |
| - | |
| - | .ui-state-hover a { |
| - | color: #c77405; |
| - | text-decoration: none; } |
| - | .ui-state-hover a:hover { |
| - | color: #c77405; |
| - | text-decoration: none; } |
| - | |
| - | .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { |
| - | border: 1px solid #fbd850; |
| - | background: white url(/images/cms/jquery_ui/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; |
| - | font-weight: bold; |
| - | color: #eb8f00; } |
| - | |
| - | .ui-state-active a { |
| - | color: #eb8f00; |
| - | text-decoration: none; } |
| - | .ui-state-active a:link, .ui-state-active a:visited { |
| - | color: #eb8f00; |
| - | text-decoration: none; } |
| - | |
| - | .ui-widget :active { |
| - | outline: none; } |
| - | |
| - | /* Interaction Cues |
| - | *---------------------------------- */ |
| - | .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight { |
| - | border: 1px solid #fed22f; |
| - | background: #ffe45c url(/images/cms/jquery_ui/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; |
| - | color: #363636; } |
| - | |
| - | .ui-state-highlight a, .ui-widget-content .ui-state-highlight a, .ui-widget-header .ui-state-highlight a { |
| - | color: #363636; } |
| - | |
| - | .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error { |
| - | border: 1px solid #cd0a0a; |
| - | background: #b81900 url(/images/cms/jquery_ui/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; |
| - | color: white; } |
| - | |
| - | .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a, .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { |
| - | color: white; } |
| - | |
| - | .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { |
| - | font-weight: bold; } |
| - | |
| - | .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { |
| - | opacity: 0.7; |
| - | filter: Alpha(Opacity=70); |
| - | font-weight: normal; } |
| - | |
| - | .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { |
| - | opacity: 0.35; |
| - | filter: Alpha(Opacity=35); |
| - | background-image: none; } |
| - | |
| - | /* Icons |
| - | *---------------------------------- */ |
| - | /* states and images */ |
| - | .ui-icon { |
| - | width: 16px; |
| - | height: 16px; |
| - | background-image: url(/images/cms/jquery_ui/ui-icons_222222_256x240.png); } |
| - | |
| - | .ui-widget-content .ui-icon { |
| - | background-image: url(/images/cms/jquery_ui/ui-icons_222222_256x240.png); } |
| - | |
| - | .ui-widget-header .ui-icon { |
| - | background-image: url(/images/cms/jquery_ui/ui-icons_ffffff_256x240.png); } |
| - | |
| - | .ui-state-default .ui-icon, .ui-state-hover .ui-icon, .ui-state-focus .ui-icon, .ui-state-active .ui-icon { |
| - | background-image: url(/images/cms/jquery_ui/ui-icons_ef8c08_256x240.png); } |
| - | |
| - | .ui-state-highlight .ui-icon { |
| - | background-image: url(/images/cms/jquery_ui/ui-icons_228ef1_256x240.png); } |
| - | |
| - | .ui-state-error .ui-icon, .ui-state-error-text .ui-icon { |
| - | background-image: url(/images/cms/jquery_ui/ui-icons_ffd27a_256x240.png); } |
| - | |
| - | /* positioning */ |
| - | .ui-icon-carat-1-n { |
| - | background-position: 0 0; } |
| - | |
| - | .ui-icon-carat-1-ne { |
| - | background-position: -16px 0; } |
| - | |
| - | .ui-icon-carat-1-e { |
| - | background-position: -32px 0; } |
| - | |
| - | .ui-icon-carat-1-se { |
| - | background-position: -48px 0; } |
| - | |
| - | .ui-icon-carat-1-s { |
| - | background-position: -64px 0; } |
| - | |
| - | .ui-icon-carat-1-sw { |
| - | background-position: -80px 0; } |
| - | |
| - | .ui-icon-carat-1-w { |
| - | background-position: -96px 0; } |
| - | |
| - | .ui-icon-carat-1-nw { |
| - | background-position: -112px 0; } |
| - | |
| - | .ui-icon-carat-2-n-s { |
| - | background-position: -128px 0; } |
| - | |
| - | .ui-icon-carat-2-e-w { |
| - | background-position: -144px 0; } |
| - | |
| - | .ui-icon-triangle-1-n { |
| - | background-position: 0 -16px; } |
| - | |
| - | .ui-icon-triangle-1-ne { |
| - | background-position: -16px -16px; } |
| - | |
| - | .ui-icon-triangle-1-e { |
| - | background-position: -32px -16px; } |
| - | |
| - | .ui-icon-triangle-1-se { |
| - | background-position: -48px -16px; } |
| - | |
| - | .ui-icon-triangle-1-s { |
| - | background-position: -64px -16px; } |
| - | |
| - | .ui-icon-triangle-1-sw { |
| - | background-position: -80px -16px; } |
| - | |
| - | .ui-icon-triangle-1-w { |
| - | background-position: -96px -16px; } |
| - | |
| - | .ui-icon-triangle-1-nw { |
| - | background-position: -112px -16px; } |
| - | |
| - | .ui-icon-triangle-2-n-s { |
| - | background-position: -128px -16px; } |
| - | |
| - | .ui-icon-triangle-2-e-w { |
| - | background-position: -144px -16px; } |
| - | |
| - | .ui-icon-arrow-1-n { |
| - | background-position: 0 -32px; } |
| - | |
| - | .ui-icon-arrow-1-ne { |
| - | background-position: -16px -32px; } |
| - | |
| - | .ui-icon-arrow-1-e { |
| - | background-position: -32px -32px; } |
| - | |
| - | .ui-icon-arrow-1-se { |
| - | background-position: -48px -32px; } |
| - | |
| - | .ui-icon-arrow-1-s { |
| - | background-position: -64px -32px; } |
| - | |
| - | .ui-icon-arrow-1-sw { |
| - | background-position: -80px -32px; } |
| - | |
| - | .ui-icon-arrow-1-w { |
| - | background-position: -96px -32px; } |
| - | |
| - | .ui-icon-arrow-1-nw { |
| - | background-position: -112px -32px; } |
| - | |
| - | .ui-icon-arrow-2-n-s { |
| - | background-position: -128px -32px; } |
| - | |
| - | .ui-icon-arrow-2-ne-sw { |
| - | background-position: -144px -32px; } |
| - | |
| - | .ui-icon-arrow-2-e-w { |
| - | background-position: -160px -32px; } |
| - | |
| - | .ui-icon-arrow-2-se-nw { |
| - | background-position: -176px -32px; } |
| - | |
| - | .ui-icon-arrowstop-1-n { |
| - | background-position: -192px -32px; } |
| - | |
| - | .ui-icon-arrowstop-1-e { |
| - | background-position: -208px -32px; } |
| - | |
| - | .ui-icon-arrowstop-1-s { |
| - | background-position: -224px -32px; } |
| - | |
| - | .ui-icon-arrowstop-1-w { |
| - | background-position: -240px -32px; } |
| - | |
| - | .ui-icon-arrowthick-1-n { |
| - | background-position: 0 -48px; } |
| - | |
| - | .ui-icon-arrowthick-1-ne { |
| - | background-position: -16px -48px; } |
| - | |
| - | .ui-icon-arrowthick-1-e { |
| - | background-position: -32px -48px; } |
| - | |
| - | .ui-icon-arrowthick-1-se { |
| - | background-position: -48px -48px; } |
| - | |
| - | .ui-icon-arrowthick-1-s { |
| - | background-position: -64px -48px; } |
| - | |
| - | .ui-icon-arrowthick-1-sw { |
| - | background-position: -80px -48px; } |
| - | |
| - | .ui-icon-arrowthick-1-w { |
| - | background-position: -96px -48px; } |
| - | |
| - | .ui-icon-arrowthick-1-nw { |
| - | background-position: -112px -48px; } |
| - | |
| - | .ui-icon-arrowthick-2-n-s { |
| - | background-position: -128px -48px; } |
| - | |
| - | .ui-icon-arrowthick-2-ne-sw { |
| - | background-position: -144px -48px; } |
| - | |
| - | .ui-icon-arrowthick-2-e-w { |
| - | background-position: -160px -48px; } |
| - | |
| - | .ui-icon-arrowthick-2-se-nw { |
| - | background-position: -176px -48px; } |
| - | |
| - | .ui-icon-arrowthickstop-1-n { |
| - | background-position: -192px -48px; } |
| - | |
| - | .ui-icon-arrowthickstop-1-e { |
| - | background-position: -208px -48px; } |
| - | |
| - | .ui-icon-arrowthickstop-1-s { |
| - | background-position: -224px -48px; } |
| - | |
| - | .ui-icon-arrowthickstop-1-w { |
| - | background-position: -240px -48px; } |
| - | |
| - | .ui-icon-arrowreturnthick-1-w { |
| - | background-position: 0 -64px; } |
| - | |
| - | .ui-icon-arrowreturnthick-1-n { |
| - | background-position: -16px -64px; } |
| - | |
| - | .ui-icon-arrowreturnthick-1-e { |
| - | background-position: -32px -64px; } |
| - | |
| - | .ui-icon-arrowreturnthick-1-s { |
| - | background-position: -48px -64px; } |
| - | |
| - | .ui-icon-arrowreturn-1-w { |
| - | background-position: -64px -64px; } |
| - | |
| - | .ui-icon-arrowreturn-1-n { |
| - | background-position: -80px -64px; } |
| - | |
| - | .ui-icon-arrowreturn-1-e { |
| - | background-position: -96px -64px; } |
| - | |
| - | .ui-icon-arrowreturn-1-s { |
| - | background-position: -112px -64px; } |
| - | |
| - | .ui-icon-arrowrefresh-1-w { |
| - | background-position: -128px -64px; } |
| - | |
| - | .ui-icon-arrowrefresh-1-n { |
| - | background-position: -144px -64px; } |
| - | |
| - | .ui-icon-arrowrefresh-1-e { |
| - | background-position: -160px -64px; } |
| - | |
| - | .ui-icon-arrowrefresh-1-s { |
| - | background-position: -176px -64px; } |
| - | |
| - | .ui-icon-arrow-4 { |
| - | background-position: 0 -80px; } |
| - | |
| - | .ui-icon-arrow-4-diag { |
| - | background-position: -16px -80px; } |
| - | |
| - | .ui-icon-extlink { |
| - | background-position: -32px -80px; } |
| - | |
| - | .ui-icon-newwin { |
| - | background-position: -48px -80px; } |
| - | |
| - | .ui-icon-refresh { |
| - | background-position: -64px -80px; } |
| - | |
| - | .ui-icon-shuffle { |
| - | background-position: -80px -80px; } |
| - | |
| - | .ui-icon-transfer-e-w { |
| - | background-position: -96px -80px; } |
| - | |
| - | .ui-icon-transferthick-e-w { |
| - | background-position: -112px -80px; } |
| - | |
| - | .ui-icon-folder-collapsed { |
| - | background-position: 0 -96px; } |
| - | |
| - | .ui-icon-folder-open { |
| - | background-position: -16px -96px; } |
| - | |
| - | .ui-icon-document { |
| - | background-position: -32px -96px; } |
| - | |
| - | .ui-icon-document-b { |
| - | background-position: -48px -96px; } |
| - | |
| - | .ui-icon-note { |
| - | background-position: -64px -96px; } |
| - | |
| - | .ui-icon-mail-closed { |
| - | background-position: -80px -96px; } |
| - | |
| - | .ui-icon-mail-open { |
| - | background-position: -96px -96px; } |
| - | |
| - | .ui-icon-suitcase { |
| - | background-position: -112px -96px; } |
| - | |
| - | .ui-icon-comment { |
| - | background-position: -128px -96px; } |
| - | |
| - | .ui-icon-person { |
| - | background-position: -144px -96px; } |
| - | |
| - | .ui-icon-print { |
| - | background-position: -160px -96px; } |
| - | |
| - | .ui-icon-trash { |
| - | background-position: -176px -96px; } |
| - | |
| - | .ui-icon-locked { |
| - | background-position: -192px -96px; } |
| - | |
| - | .ui-icon-unlocked { |
| - | background-position: -208px -96px; } |
| - | |
| - | .ui-icon-bookmark { |
| - | background-position: -224px -96px; } |
| - | |
| - | .ui-icon-tag { |
| - | background-position: -240px -96px; } |
| - | |
| - | .ui-icon-home { |
| - | background-position: 0 -112px; } |
| - | |
| - | .ui-icon-flag { |
| - | background-position: -16px -112px; } |
| - | |
| - | .ui-icon-calendar { |
| - | background-position: -32px -112px; } |
| - | |
| - | .ui-icon-cart { |
| - | background-position: -48px -112px; } |
| - | |
| - | .ui-icon-pencil { |
| - | background-position: -64px -112px; } |
| - | |
| - | .ui-icon-clock { |
| - | background-position: -80px -112px; } |
| - | |
| - | .ui-icon-disk { |
| - | background-position: -96px -112px; } |
| - | |
| - | .ui-icon-calculator { |
| - | background-position: -112px -112px; } |
| - | |
| - | .ui-icon-zoomin { |
| - | background-position: -128px -112px; } |
| - | |
| - | .ui-icon-zoomout { |
| - | background-position: -144px -112px; } |
| - | |
| - | .ui-icon-search { |
| - | background-position: -160px -112px; } |
| - | |
| - | .ui-icon-wrench { |
| - | background-position: -176px -112px; } |
| - | |
| - | .ui-icon-gear { |
| - | background-position: -192px -112px; } |
| - | |
| - | .ui-icon-heart { |
| - | background-position: -208px -112px; } |
| - | |
| - | .ui-icon-star { |
| - | background-position: -224px -112px; } |
| - | |
| - | .ui-icon-link { |
| - | background-position: -240px -112px; } |
| - | |
| - | .ui-icon-cancel { |
| - | background-position: 0 -128px; } |
| - | |
| - | .ui-icon-plus { |
| - | background-position: -16px -128px; } |
| - | |
| - | .ui-icon-plusthick { |
| - | background-position: -32px -128px; } |
| - | |
| - | .ui-icon-minus { |
| - | background-position: -48px -128px; } |
| - | |
| - | .ui-icon-minusthick { |
| - | background-position: -64px -128px; } |
| - | |
| - | .ui-icon-close { |
| - | background-position: -80px -128px; } |
| - | |
| - | .ui-icon-closethick { |
| - | background-position: -96px -128px; } |
| - | |
| - | .ui-icon-key { |
| - | background-position: -112px -128px; } |
| - | |
| - | .ui-icon-lightbulb { |
| - | background-position: -128px -128px; } |
| - | |
| - | .ui-icon-scissors { |
| - | background-position: -144px -128px; } |
| - | |
| - | .ui-icon-clipboard { |
| - | background-position: -160px -128px; } |
| - | |
| - | .ui-icon-copy { |
| - | background-position: -176px -128px; } |
| - | |
| - | .ui-icon-contact { |
| - | background-position: -192px -128px; } |
| - | |
| - | .ui-icon-image { |
| - | background-position: -208px -128px; } |
| - | |
| - | .ui-icon-video { |
| - | background-position: -224px -128px; } |
| - | |
| - | .ui-icon-script { |
| - | background-position: -240px -128px; } |
| - | |
| - | .ui-icon-alert { |
| - | background-position: 0 -144px; } |
| - | |
| - | .ui-icon-info { |
| - | background-position: -16px -144px; } |
| - | |
| - | .ui-icon-notice { |
| - | background-position: -32px -144px; } |
| - | |
| - | .ui-icon-help { |
| - | background-position: -48px -144px; } |
| - | |
| - | .ui-icon-check { |
| - | background-position: -64px -144px; } |
| - | |
| - | .ui-icon-bullet { |
| - | background-position: -80px -144px; } |
| - | |
| - | .ui-icon-radio-off { |
| - | background-position: -96px -144px; } |
| - | |
| - | .ui-icon-radio-on { |
| - | background-position: -112px -144px; } |
| - | |
| - | .ui-icon-pin-w { |
| - | background-position: -128px -144px; } |
| - | |
| - | .ui-icon-pin-s { |
| - | background-position: -144px -144px; } |
| - | |
| - | .ui-icon-play { |
| - | background-position: 0 -160px; } |
| - | |
| - | .ui-icon-pause { |
| - | background-position: -16px -160px; } |
| - | |
| - | .ui-icon-seek-next { |
| - | background-position: -32px -160px; } |
| - | |
| - | .ui-icon-seek-prev { |
| - | background-position: -48px -160px; } |
| - | |
| - | .ui-icon-seek-end { |
| - | background-position: -64px -160px; } |
| - | |
| - | .ui-icon-seek-start, .ui-icon-seek-first { |
| - | background-position: -80px -160px; } |
| - | |
| - | /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ |
| - | .ui-icon-stop { |
| - | background-position: -96px -160px; } |
| - | |
| - | .ui-icon-eject { |
| - | background-position: -112px -160px; } |
| - | |
| - | .ui-icon-volume-off { |
| - | background-position: -128px -160px; } |
| - | |
| - | .ui-icon-volume-on { |
| - | background-position: -144px -160px; } |
| - | |
| - | .ui-icon-power { |
| - | background-position: 0 -176px; } |
| - | |
| - | .ui-icon-signal-diag { |
| - | background-position: -16px -176px; } |
| - | |
| - | .ui-icon-signal { |
| - | background-position: -32px -176px; } |
| - | |
| - | .ui-icon-battery-0 { |
| - | background-position: -48px -176px; } |
| - | |
| - | .ui-icon-battery-1 { |
| - | background-position: -64px -176px; } |
| - | |
| - | .ui-icon-battery-2 { |
| - | background-position: -80px -176px; } |
| - | |
| - | .ui-icon-battery-3 { |
| - | background-position: -96px -176px; } |
| - | |
| - | .ui-icon-circle-plus { |
| - | background-position: 0 -192px; } |
| - | |
| - | .ui-icon-circle-minus { |
| - | background-position: -16px -192px; } |
| - | |
| - | .ui-icon-circle-close { |
| - | background-position: -32px -192px; } |
| - | |
| - | .ui-icon-circle-triangle-e { |
| - | background-position: -48px -192px; } |
| - | |
| - | .ui-icon-circle-triangle-s { |
| - | background-position: -64px -192px; } |
| - | |
| - | .ui-icon-circle-triangle-w { |
| - | background-position: -80px -192px; } |
| - | |
| - | .ui-icon-circle-triangle-n { |
| - | background-position: -96px -192px; } |
| - | |
| - | .ui-icon-circle-arrow-e { |
| - | background-position: -112px -192px; } |
| - | |
| - | .ui-icon-circle-arrow-s { |
| - | background-position: -128px -192px; } |
| - | |
| - | .ui-icon-circle-arrow-w { |
| - | background-position: -144px -192px; } |
| - | |
| - | .ui-icon-circle-arrow-n { |
| - | background-position: -160px -192px; } |
| - | |
| - | .ui-icon-circle-zoomin { |
| - | background-position: -176px -192px; } |
| - | |
| - | .ui-icon-circle-zoomout { |
| - | background-position: -192px -192px; } |
| - | |
| - | .ui-icon-circle-check { |
| - | background-position: -208px -192px; } |
| - | |
| - | .ui-icon-circlesmall-plus { |
| - | background-position: 0 -208px; } |
| - | |
| - | .ui-icon-circlesmall-minus { |
| - | background-position: -16px -208px; } |
| - | |
| - | .ui-icon-circlesmall-close { |
| - | background-position: -32px -208px; } |
| - | |
| - | .ui-icon-squaresmall-plus { |
| - | background-position: -48px -208px; } |
| - | |
| - | .ui-icon-squaresmall-minus { |
| - | background-position: -64px -208px; } |
| - | |
| - | .ui-icon-squaresmall-close { |
| - | background-position: -80px -208px; } |
| - | |
| - | .ui-icon-grip-dotted-vertical { |
| - | background-position: 0 -224px; } |
| - | |
| - | .ui-icon-grip-dotted-horizontal { |
| - | background-position: -16px -224px; } |
| - | |
| - | .ui-icon-grip-solid-vertical { |
| - | background-position: -32px -224px; } |
| - | |
| - | .ui-icon-grip-solid-horizontal { |
| - | background-position: -48px -224px; } |
| - | |
| - | .ui-icon-gripsmall-diagonal-se { |
| - | background-position: -64px -224px; } |
| - | |
| - | .ui-icon-grip-diagonal-se { |
| - | background-position: -80px -224px; } |
| - | |
| - | /* Misc visuals |
| - | *---------------------------------- */ |
| - | /* Corner radius */ |
| - | .ui-corner-tl { |
| - | -moz-border-radius-topleft: 4px; |
| - | -webkit-border-top-left-radius: 4px; |
| - | border-top-left-radius: 4px; } |
| - | |
| - | .ui-corner-tr { |
| - | -moz-border-radius-topright: 4px; |
| - | -webkit-border-top-right-radius: 4px; |
| - | border-top-right-radius: 4px; } |
| - | |
| - | .ui-corner-bl { |
| - | -moz-border-radius-bottomleft: 4px; |
| - | -webkit-border-bottom-left-radius: 4px; |
| - | border-bottom-left-radius: 4px; } |
| - | |
| - | .ui-corner-br { |
| - | -moz-border-radius-bottomright: 4px; |
| - | -webkit-border-bottom-right-radius: 4px; |
| - | border-bottom-right-radius: 4px; } |
| - | |
| - | .ui-corner-top { |
| - | -moz-border-radius-topleft: 4px; |
| - | -webkit-border-top-left-radius: 4px; |
| - | border-top-left-radius: 4px; |
| - | -moz-border-radius-topright: 4px; |
| - | -webkit-border-top-right-radius: 4px; |
| - | border-top-right-radius: 4px; } |
| - | |
| - | .ui-corner-bottom { |
| - | -moz-border-radius-bottomleft: 4px; |
| - | -webkit-border-bottom-left-radius: 4px; |
| - | border-bottom-left-radius: 4px; |
| - | -moz-border-radius-bottomright: 4px; |
| - | -webkit-border-bottom-right-radius: 4px; |
| - | border-bottom-right-radius: 4px; } |
| - | |
| - | .ui-corner-right { |
| - | -moz-border-radius-topright: 4px; |
| - | -webkit-border-top-right-radius: 4px; |
| - | border-top-right-radius: 4px; |
| - | -moz-border-radius-bottomright: 4px; |
| - | -webkit-border-bottom-right-radius: 4px; |
| - | border-bottom-right-radius: 4px; } |
| - | |
| - | .ui-corner-left { |
| - | -moz-border-radius-topleft: 4px; |
| - | -webkit-border-top-left-radius: 4px; |
| - | border-top-left-radius: 4px; |
| - | -moz-border-radius-bottomleft: 4px; |
| - | -webkit-border-bottom-left-radius: 4px; |
| - | border-bottom-left-radius: 4px; } |
| - | |
| - | .ui-corner-all { |
| - | -moz-border-radius: 4px; |
| - | -webkit-border-radius: 4px; |
| - | border-radius: 4px; } |
| - | |
| - | /* Overlays */ |
| - | .ui-widget-overlay { |
| - | background: #666666 url(/images/cms/jquery_ui/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; |
| - | opacity: 0.5; |
| - | filter: Alpha(Opacity=50); } |
| - | |
| - | .ui-widget-shadow { |
| - | margin: -5px 0 0 -5px; |
| - | padding: 5px; |
| - | background: black url(/images/cms/jquery_ui/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; |
| - | opacity: 0.2; |
| - | filter: Alpha(Opacity=20); |
| - | -moz-border-radius: 5px; |
| - | -webkit-border-radius: 5px; |
| - | border-radius: 5px; } |
| - | |
| - | /* * jQuery UI Datepicker @VERSION |
| - | * * |
| - | * * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) |
| - | * * Dual licensed under the MIT or GPL Version 2 licenses. |
| - | * * http://jquery.org/license |
| - | * * |
| - | * * http://docs.jquery.com/UI/Datepicker#theming */ |
| - | .ui-datepicker { |
| - | width: 17em; |
| - | padding: 0.2em 0.2em 0; } |
| - | .ui-datepicker .ui-datepicker-header { |
| - | position: relative; |
| - | padding: 0.2em 0; } |
| - | .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { |
| - | position: absolute; |
| - | top: 2px; |
| - | width: 1.8em; |
| - | height: 1.8em; } |
| - | .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { |
| - | top: 1px; } |
| - | .ui-datepicker .ui-datepicker-prev { |
| - | left: 2px; } |
| - | .ui-datepicker .ui-datepicker-next { |
| - | right: 2px; } |
| - | .ui-datepicker .ui-datepicker-prev-hover { |
| - | left: 1px; } |
| - | .ui-datepicker .ui-datepicker-next-hover { |
| - | right: 1px; } |
| - | .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { |
| - | display: block; |
| - | position: absolute; |
| - | left: 50%; |
| - | margin-left: -8px; |
| - | top: 50%; |
| - | margin-top: -8px; } |
| - | .ui-datepicker .ui-datepicker-title { |
| - | margin: 0 2.3em; |
| - | line-height: 1.8em; |
| - | text-align: center; } |
| - | .ui-datepicker .ui-datepicker-title select { |
| - | font-size: 1em; |
| - | margin: 1px 0; } |
| - | .ui-datepicker select.ui-datepicker-month-year { |
| - | width: 100%; } |
| - | .ui-datepicker select.ui-datepicker-month, .ui-datepicker select.ui-datepicker-year { |
| - | width: 49%; } |
| - | .ui-datepicker table { |
| - | width: 100%; |
| - | font-size: 0.9em; |
| - | border-collapse: collapse; |
| - | margin: 0 0 0.4em; } |
| - | .ui-datepicker th { |
| - | padding: 0.7em 0.3em; |
| - | text-align: center; |
| - | font-weight: bold; |
| - | border: 0; } |
| - | .ui-datepicker td { |
| - | border: 0; |
| - | padding: 1px; } |
| - | .ui-datepicker td span, .ui-datepicker td a { |
| - | display: block; |
| - | padding: 0.2em; |
| - | text-align: right; |
| - | text-decoration: none; } |
| - | .ui-datepicker .ui-datepicker-buttonpane { |
| - | background-image: none; |
| - | margin: 0.7em 0 0 0; |
| - | padding: 0 0.2em; |
| - | border-left: 0; |
| - | border-right: 0; |
| - | border-bottom: 0; } |
| - | .ui-datepicker .ui-datepicker-buttonpane button { |
| - | float: right; |
| - | margin: 0.5em 0.2em 0.4em; |
| - | cursor: pointer; |
| - | padding: 0.2em 0.6em 0.3em 0.6em; |
| - | width: auto; |
| - | overflow: visible; } |
| - | .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { |
| - | float: left; } |
| - | .ui-datepicker.ui-datepicker-multi { |
| - | width: auto; } |
| - | |
| - | /* with multiple calendars */ |
| - | .ui-datepicker-multi .ui-datepicker-group { |
| - | float: left; } |
| - | .ui-datepicker-multi .ui-datepicker-group table { |
| - | width: 95%; |
| - | margin: 0 auto 0.4em; } |
| - | |
| - | .ui-datepicker-multi-2 .ui-datepicker-group { |
| - | width: 50%; } |
| - | |
| - | .ui-datepicker-multi-3 .ui-datepicker-group { |
| - | width: 33.3%; } |
| - | |
| - | .ui-datepicker-multi-4 .ui-datepicker-group { |
| - | width: 25%; } |
| - | |
| - | .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { |
| - | border-left-width: 0; } |
| - | .ui-datepicker-multi .ui-datepicker-buttonpane { |
| - | clear: left; } |
| - | |
| - | .ui-datepicker-row-break { |
| - | clear: both; |
| - | width: 100%; } |
| - | |
| - | /* RTL support */ |
| - | .ui-datepicker-rtl { |
| - | direction: rtl; } |
| - | .ui-datepicker-rtl .ui-datepicker-prev { |
| - | right: 2px; |
| - | left: auto; } |
| - | .ui-datepicker-rtl .ui-datepicker-next { |
| - | left: 2px; |
| - | right: auto; } |
| - | .ui-datepicker-rtl .ui-datepicker-prev:hover { |
| - | right: 1px; |
| - | left: auto; } |
| - | .ui-datepicker-rtl .ui-datepicker-next:hover { |
| - | left: 1px; |
| - | right: auto; } |
| - | .ui-datepicker-rtl .ui-datepicker-buttonpane { |
| - | clear: right; } |
| - | .ui-datepicker-rtl .ui-datepicker-buttonpane button { |
| - | float: left; } |
| - | .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { |
| - | float: right; } |
| - | .ui-datepicker-rtl .ui-datepicker-group { |
| - | float: right; } |
| - | .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { |
| - | border-right-width: 0; |
| - | border-left-width: 1px; } |
| - | |
| - | /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ |
| - | .ui-datepicker-cover { |
| - | display: none; |
| - | /*sorry for IE5 */ |
| - | display/**/: block; |
| - | /*sorry for IE5 */ |
| - | position: absolute; |
| - | /*must have */ |
| - | z-index: -1; |
| - | /*must have */ |
| - | filter: mask(); |
| - | /*must have */ |
| - | top: -4px; |
| - | /*must have */ |
| - | left: -4px; |
| - | /*must have */ |
| - | width: 200px; |
| - | /*must have */ |
| - | height: 200px; |
| - | /*must have */ } |
public/stylesheets/sass/cms/cms_master.sass
+484
-0
| @@ | @@ -0,0 +1,484 @@ |
| + | // -------------------------------------------------------------------- Reset |
| + | html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td |
| + | margin: 0 |
| + | padding: 0 |
| + | border: 0 |
| + | outline: 0 |
| + | font-size: 100% |
| + | vertical-align: baseline |
| + | background: transparent |
| + | font-weight: normal |
| + | body |
| + | line-height: 1 |
| + | ol, ul |
| + | list-style: none |
| + | blockquote, q |
| + | quotes: none |
| + | blockquote:before, blockquote:after, q:before, q:after |
| + | content: '' |
| + | content: none |
| + | *:focus |
| + | outline: 0 |
| + | ins |
| + | text-decoration: none |
| + | del |
| + | text-decoration: line-through |
| + | table |
| + | border-collapse: collapse |
| + | border-spacing: 0 |
| + | caption, th |
| + | text-align: left |
| + | |
| + | // --------------------------------------------------------------- Typography |
| + | body |
| + | font: 13px Arial, Verdana, clean, sans-serif |
| + | _font-size: small |
| + | _font: x-small |
| + | table |
| + | font-size: inherit |
| + | th |
| + | font-weight: bold |
| + | pre, code |
| + | font: 115% monospace |
| + | _font-size: 100% |
| + | |
| + | p |
| + | font: 12px/15px Arial, sans-serif |
| + | color: #000 |
| + | |
| + | h1, h2, h3 |
| + | margin: 0.8em 0em |
| + | |
| + | h2 |
| + | font: bold 25px/30px Arial, sans-serif |
| + | color: #000 |
| + | |
| + | h3 |
| + | font: bold 18px/24px Arial, sans-serif |
| + | color: #000 |
| + | |
| + | // ------------------------------------------------------------------- Common |
| + | |
| + | a |
| + | color: #26A9E0 |
| + | text-decoration: none |
| + | |
| + | a:hover |
| + | text-decoration: none |
| + | border-bottom: 1px dotted #26A9E0 |
| + | |
| + | a.button |
| + | -moz-border-radius: 5px |
| + | -webkit-border-radius: 5px |
| + | background-color: #7CAE00 |
| + | padding: 5px 8px |
| + | font: 10px/20px Arial, sans-serif |
| + | color: #fff |
| + | text-transform: uppercase |
| + | letter-spacing: 1px |
| + | |
| + | a.button:hover |
| + | background-color: #629700 |
| + | border: 0px |
| + | |
| + | a.big_button |
| + | float: left |
| + | padding: 0px 15px |
| + | font: bold 14px/33px Arial, sans-serif |
| + | color: #fff |
| + | -moz-border-radius: 7px |
| + | -webkit-border-radius: 7px |
| + | background: url("/images/cms/bg-button-green-34.gif") top |
| + | display: block |
| + | text-decoration: none |
| + | height: 34px |
| + | |
| + | a.big_button:hover |
| + | background-position: 0 -34px |
| + | border: 0px |
| + | |
| + | a.top_button |
| + | float: right |
| + | padding: 0px 15px |
| + | margin-top: -35px |
| + | font: bold 14px/33px Arial, sans-serif |
| + | color: #fff |
| + | -moz-border-radius: 0px 0px 7px 7px |
| + | -webkit-border-bottom-left-radius: 7px |
| + | -webkit-border-bottom-right-radius: 7px |
| + | background: url("/images/cms/bg-button-green-34.gif") top |
| + | display: block |
| + | text-decoration: none |
| + | height: 34px |
| + | |
| + | a.top_button:hover |
| + | background-position: 0 -34px |
| + | border: 0px |
| + | |
| + | .filter_form |
| + | float: right |
| + | margin-bottom: 15px |
| + | |
| + | // ---------------------------------------------------------------- Structure |
| + | |
| + | body |
| + | background: #fff url('/images/cms/background.png') top left repeat-y |
| + | .content_wrapper |
| + | width: 1195px |
| + | .left_column |
| + | width: 205px |
| + | float: left |
| + | .header |
| + | text-align: center |
| + | width: 150px |
| + | margin: 15px auto |
| + | h1 |
| + | padding: 0px |
| + | margin: 0px |
| + | display: none |
| + | a |
| + | font-size: 0px |
| + | line-height: 0px |
| + | color: #fff |
| + | text-decoration: none |
| + | a:hover |
| + | border: 0px |
| + | |
| + | .content_column |
| + | width: 990px |
| + | float: left |
| + | .flash.notice |
| + | padding: 6px |
| + | background-color: #c7e03d |
| + | color: #000 |
| + | margin: 15px 0px |
| + | font-size: 14px |
| + | .center_column |
| + | padding: 30px |
| + | float: left |
| + | width: 680px |
| + | #form_blocks |
| + | float: left |
| + | width: 100% |
| + | label |
| + | font: bold 16px/24px Arial, sans-serif |
| + | color: #000 |
| + | text-transform: none |
| + | letter-spacing: 0px |
| + | .right_column |
| + | float: right |
| + | width: 250px |
| + | .form_element_group |
| + | padding: 30px 20px 20px 20px |
| + | .form_element_group + .form_element_group |
| + | border-top: 3px solid #E6E7E8 |
| + | padding-top: 13px |
| + | h2 |
| + | font: bold 18px/24px Arial, sans-serif |
| + | color: #000 |
| + | margin-bottom: 10px |
| + | |
| + | .footer |
| + | display: none |
| + | padding: 15px |
| + | color: #fff |
| + | a |
| + | color: #fff |
| + | |
| + | // -------------------------------------------------------------- Left Column |
| + | .left_column |
| + | ul |
| + | margin-bottom: 5px |
| + | padding: 5px 0px |
| + | li |
| + | margin: 6px 0px |
| + | a |
| + | display: block |
| + | font: bold 14px/34px Arial, sans-serif |
| + | color: #58595B |
| + | margin-left: 5px |
| + | padding-left: 35px |
| + | text-decoration: none |
| + | |
| + | a.active, a:hover |
| + | color: #fff |
| + | height: 34px |
| + | background-color: #231F20 |
| + | -moz-border-radius: 7px 0px 0px 7px |
| + | -webkit-border-top-left-radius: 7px |
| + | -webkit-border-bottom-left-radius: 7px |
| + | border: 0px |
| + | |
| + | |
| + | // ----------------------------------------------------------- Tree Structure |
| + | ul.closed |
| + | display: none |
| + | |
| + | ul.tree_structure |
| + | background-color: #fff |
| + | padding: 25px |
| + | margin-top: 15px |
| + | box-shadow: 0px 2px 8px #ddd |
| + | -moz-box-shadow: 0px 2px 8px #ddd |
| + | -webkit-box-shadow: 0px 2px 8px #ddd |
| + | |
| + | li |
| + | margin-left: 25px |
| + | li + li, li > ul |
| + | border-top: 1px solid #eee |
| + | |
| + | a.tree_toggle |
| + | margin-top: 5px |
| + | width: 20px |
| + | height: 28px |
| + | float: left |
| + | margin-left: -35px |
| + | font: bold 14px/25px Arial, sans-serif |
| + | background: url(/images/cms/arrow_bottom.gif) right center no-repeat |
| + | padding-right: 15px |
| + | color: #ccc |
| + | text-align: right |
| + | text-decoration: none |
| + | a.tree_toggle.closed |
| + | background-image: url(/images/cms/arrow_right.gif) |
| + | a.tree_toggle:hover |
| + | border: 0px |
| + | color: #000 |
| + | |
| + | .item |
| + | padding: 7px 0px 7px 35px |
| + | overflow: hidden |
| + | |
| + | .icon |
| + | margin-left: -30px |
| + | float: left |
| + | width: 28px |
| + | height: 28px |
| + | background: url(/images/cms/icon_draft.gif) |
| + | .dragger |
| + | width: 28px |
| + | height: 28px |
| + | cursor: move |
| + | .dragger:hover |
| + | background: url(/images/cms/icon_move.gif) |
| + | |
| + | a.label |
| + | font-size: 14px |
| + | color: #000 |
| + | a.label:hover |
| + | border-bottom: 1px dotted #000 |
| + | .url |
| + | font-size: 10px |
| + | |
| + | .action_links |
| + | visibility: hidden |
| + | font-size: 10px |
| + | |
| + | table.details |
| + | font-size: 10px |
| + | margin: 5px 15px |
| + | border-left: 3px solid #ccc |
| + | th |
| + | padding: 0px 5px 0px 10px |
| + | font-weight: normal |
| + | |
| + | .item:hover |
| + | background-color: #ebf5fc |
| + | .action_links |
| + | visibility: visible |
| + | |
| + | // ---------------------------------------------------------- Formatted Table |
| + | table.formatted |
| + | margin-bottom: 15px |
| + | background-color: #fff |
| + | border: 10px solid #fff |
| + | box-shadow: 0px 2px 8px #ddd |
| + | -moz-box-shadow: 0px 2px 8px #ddd |
| + | -webkit-box-shadow: 0px 2px 8px #ddd |
| + | |
| + | th, td |
| + | padding: 10px |
| + | vertical-align: top |
| + | white-space: nowrap |
| + | a.label |
| + | color: black |
| + | font-size: 14px |
| + | a.slug |
| + | font-size: 10px |
| + | |
| + | th |
| + | background-color: #eee |
| + | font-size: 10px |
| + | text-transform: uppercase |
| + | border-bottom: 1px solid #444 |
| + | td.main, th.main |
| + | width: 100% |
| + | white-space: normal |
| + | tr |
| + | border-bottom: 1px solid #eee |
| + | |
| + | // -------------------------------------------------------------------- Forms |
| + | .form_element_group |
| + | margin-top: 10px |
| + | |
| + | |
| + | .form_element |
| + | margin-bottom: 10px |
| + | overflow: hidden |
| + | .label |
| + | height: 22px |
| + | font: 10px/22px Arial, sans-serif |
| + | color: #000 |
| + | text-transform: uppercase |
| + | letter-spacing: 1px |
| + | .value |
| + | .field_with_errors |
| + | display: inline |
| + | input, select, textarea |
| + | width: 97% |
| + | border: 1px solid #ccc |
| + | padding: 3px |
| + | input[type=checkbox] |
| + | width: auto |
| + | border: 0 |
| + | float: left |
| + | margin: 1px 4px 0px 0px |
| + | |
| + | .codemirror |
| + | background-color: #fff |
| + | border: 1px inset #e5e5e5 |
| + | .value.narrow |
| + | input, select, textarea |
| + | width: 80% |
| + | .fieldWithErrors label |
| + | color: #9E0B0F |
| + | .errors |
| + | color: #9E0B0F |
| + | margin: 3px 0px |
| + | .select |
| + | .label |
| + | label |
| + | line-height: 20px |
| + | .form_element.large |
| + | label |
| + | font-size: 16px |
| + | line-height: 26px |
| + | .value |
| + | input |
| + | font-size: 16px |
| + | .form_element.time_select_element, .form_element.date_select_element, .form_element.check_box_element, .form_element.radio_button_element |
| + | select, input |
| + | width: auto |
| + | |
| + | .form_element.submit_element |
| + | input |
| + | -moz-border-radius: 5px |
| + | -webkit-border-radius: 5px |
| + | background-color: #7CAE00 |
| + | padding: 5px 8px |
| + | font: 10px/20px Arial, sans-serif |
| + | color: #fff |
| + | text-transform: uppercase |
| + | letter-spacing: 1px |
| + | border: none |
| + | |
| + | .form_element_group.vertical |
| + | float: left |
| + | width: 50% |
| + | .form_element |
| + | .label |
| + | text-align: right |
| + | width: 40px |
| + | float: left |
| + | .value |
| + | float: left |
| + | width: 80% |
| + | margin-left: 10px |
| + | select |
| + | width: 100% |
| + | input[type=text] |
| + | width: 100% |
| + | .vertical + .vertical |
| + | .form_element |
| + | .label |
| + | width: 100px |
| + | .value |
| + | width: 60% |
| + | |
| + | .form_element_group.publishing |
| + | .form_element .field |
| + | input |
| + | width: 200px |
| + | |
| + | .submit |
| + | float: left |
| + | line-height: 30px |
| + | .submit_element |
| + | margin: 5px 5px 5px 0px |
| + | float: left |
| + | form |
| + | .errorExplanation |
| + | background-color: #9E0B0F |
| + | padding: 10px |
| + | color: #fff |
| + | font-size: 12px |
| + | h2 |
| + | margin: 0.1em 0em |
| + | font-size: 16px |
| + | h2, p |
| + | color: #fff |
| + | ul |
| + | margin: 10px 10px 0px 10px |
| + | |
| + | .form_element_group.advanced |
| + | display: none |
| + | // --------------------------------------------------------------- Pagination |
| + | .pagination |
| + | margin-bottom: 15px |
| + | float: right |
| + | a, span |
| + | background: #404040 |
| + | color: #fff |
| + | padding: 2px 5px |
| + | font-size: 11px |
| + | -moz-border-radius: 2px |
| + | a:hover |
| + | text-decoration: none |
| + | span.disabled |
| + | display: none |
| + | span.current |
| + | background-color: #999 |
| + | |
| + | // ------------------------------------------------------------------ Layouts |
| + | #cms_admin_layouts_index |
| + | .icon |
| + | background-image: url(/images/cms/icon_layout.gif) |
| + | |
| + | // -------------------------------------------------------------------- Pages |
| + | #cms_admin_pages_index |
| + | .icon.published |
| + | background-image: url(/images/cms/icon_regular.gif) |
| + | |
| + | // ----------------------------------------------------------------- Snippets |
| + | #cms_admin_snippets_index |
| + | .icon |
| + | width: 28px |
| + | height: 28px |
| + | background: url(/images/cms/icon_snippet.gif) |
| + | |
| + | // ------------------------------------------------------------------- Assets |
| + | a#pickfiles |
| + | float: right |
| + | cursor: pointer |
| + | #assets_list |
| + | .assets |
| + | overflow: hidden |
| + | .asset |
| + | float: left |
| + | width: 60px |
| + | margin-bottom: 5px |
| + | .thumb img |
| + | border: 1px solid #ccc |
| + | padding: 1px |
| + | .asset+.asset |
| + | margin-left: 10px |
| \ No newline at end of file | |
public/stylesheets/sass/cms_master.sass
+0
-468
| @@ | @@ -1,468 +0,0 @@ |
| - | // -------------------------------------------------------------------- Reset |
| - | html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td |
| - | margin: 0 |
| - | padding: 0 |
| - | border: 0 |
| - | outline: 0 |
| - | font-size: 100% |
| - | vertical-align: baseline |
| - | background: transparent |
| - | font-weight: normal |
| - | body |
| - | line-height: 1 |
| - | ol, ul |
| - | list-style: none |
| - | blockquote, q |
| - | quotes: none |
| - | blockquote:before, blockquote:after, q:before, q:after |
| - | content: '' |
| - | content: none |
| - | *:focus |
| - | outline: 0 |
| - | ins |
| - | text-decoration: none |
| - | del |
| - | text-decoration: line-through |
| - | table |
| - | border-collapse: collapse |
| - | border-spacing: 0 |
| - | caption, th |
| - | text-align: left |
| - | |
| - | // --------------------------------------------------------------- Typography |
| - | body |
| - | font: 13px Arial, Verdana, clean, sans-serif |
| - | _font-size: small |
| - | _font: x-small |
| - | table |
| - | font-size: inherit |
| - | th |
| - | font-weight: bold |
| - | pre, code |
| - | font: 115% monospace |
| - | _font-size: 100% |
| - | |
| - | p |
| - | font: 12px/15px Arial, sans-serif |
| - | color: #000 |
| - | |
| - | h1, h2, h3 |
| - | margin: 0.8em 0em |
| - | |
| - | h2 |
| - | font: bold 25px/30px Arial, sans-serif |
| - | color: #000 |
| - | |
| - | h3 |
| - | font: bold 18px/24px Arial, sans-serif |
| - | color: #000 |
| - | |
| - | // ------------------------------------------------------------------- Common |
| - | |
| - | a |
| - | color: #26A9E0 |
| - | text-decoration: none |
| - | |
| - | a:hover |
| - | text-decoration: none |
| - | border-bottom: 1px dotted #26A9E0 |
| - | |
| - | a.button |
| - | -moz-border-radius: 5px |
| - | -webkit-border-radius: 5px |
| - | background-color: #7CAE00 |
| - | padding: 5px 8px |
| - | font: 10px/20px Arial, sans-serif |
| - | color: #fff |
| - | text-transform: uppercase |
| - | letter-spacing: 1px |
| - | |
| - | a.button:hover |
| - | background-color: #629700 |
| - | border: 0px |
| - | |
| - | a.big_button |
| - | float: left |
| - | padding: 0px 15px |
| - | font: bold 14px/33px Arial, sans-serif |
| - | color: #fff |
| - | -moz-border-radius: 7px |
| - | -webkit-border-radius: 7px |
| - | background: url("/images/cms/bg-button-green-34.gif") top |
| - | display: block |
| - | text-decoration: none |
| - | height: 34px |
| - | |
| - | a.big_button:hover |
| - | background-position: 0 -34px |
| - | border: 0px |
| - | |
| - | a.top_button |
| - | float: right |
| - | padding: 0px 15px |
| - | margin-top: -35px |
| - | font: bold 14px/33px Arial, sans-serif |
| - | color: #fff |
| - | -moz-border-radius: 0px 0px 7px 7px |
| - | -webkit-border-bottom-left-radius: 7px |
| - | -webkit-border-bottom-right-radius: 7px |
| - | background: url("/images/cms/bg-button-green-34.gif") top |
| - | display: block |
| - | text-decoration: none |
| - | height: 34px |
| - | |
| - | a.top_button:hover |
| - | background-position: 0 -34px |
| - | border: 0px |
| - | |
| - | .filter_form |
| - | float: right |
| - | margin-bottom: 15px |
| - | |
| - | // ---------------------------------------------------------------- Structure |
| - | |
| - | body |
| - | background: #fff url('/images/cms/background.png') top left repeat-y |
| - | .content_wrapper |
| - | width: 1195px |
| - | .left_column |
| - | width: 205px |
| - | float: left |
| - | .header |
| - | text-align: center |
| - | width: 150px |
| - | margin: 15px auto |
| - | h1 |
| - | padding: 0px |
| - | margin: 0px |
| - | display: none |
| - | a |
| - | font-size: 0px |
| - | line-height: 0px |
| - | color: #fff |
| - | text-decoration: none |
| - | a:hover |
| - | border: 0px |
| - | |
| - | .content_column |
| - | width: 990px |
| - | float: left |
| - | .flash.notice |
| - | padding: 6px |
| - | background-color: #c7e03d |
| - | color: #000 |
| - | margin: 15px 0px |
| - | font-size: 14px |
| - | .center_column |
| - | padding: 30px |
| - | float: left |
| - | width: 680px |
| - | #form_blocks |
| - | float: left |
| - | width: 100% |
| - | label |
| - | font: bold 16px/24px Arial, sans-serif |
| - | color: #000 |
| - | text-transform: none |
| - | letter-spacing: 0px |
| - | .right_column |
| - | float: right |
| - | width: 250px |
| - | .form_element_group |
| - | padding: 30px 20px 20px 20px |
| - | .form_element_group + .form_element_group |
| - | border-top: 3px solid #E6E7E8 |
| - | padding-top: 13px |
| - | h2 |
| - | font: bold 18px/24px Arial, sans-serif |
| - | color: #000 |
| - | margin-bottom: 10px |
| - | |
| - | .footer |
| - | display: none |
| - | padding: 15px |
| - | color: #fff |
| - | a |
| - | color: #fff |
| - | |
| - | // -------------------------------------------------------------- Left Column |
| - | .left_column |
| - | ul |
| - | margin-bottom: 5px |
| - | padding: 5px 0px |
| - | li |
| - | margin: 6px 0px |
| - | a |
| - | display: block |
| - | font: bold 14px/34px Arial, sans-serif |
| - | color: #58595B |
| - | margin-left: 5px |
| - | padding-left: 35px |
| - | text-decoration: none |
| - | |
| - | a.active, a:hover |
| - | color: #fff |
| - | height: 34px |
| - | background-color: #231F20 |
| - | -moz-border-radius: 7px 0px 0px 7px |
| - | -webkit-border-top-left-radius: 7px |
| - | -webkit-border-bottom-left-radius: 7px |
| - | border: 0px |
| - | |
| - | |
| - | // ----------------------------------------------------------- Tree Structure |
| - | ul.closed |
| - | display: none |
| - | |
| - | ul.tree_structure |
| - | background-color: #fff |
| - | padding: 25px |
| - | margin-top: 15px |
| - | box-shadow: 0px 2px 8px #ddd |
| - | -moz-box-shadow: 0px 2px 8px #ddd |
| - | -webkit-box-shadow: 0px 2px 8px #ddd |
| - | |
| - | li |
| - | margin-left: 25px |
| - | li + li, li > ul |
| - | border-top: 1px solid #eee |
| - | |
| - | a.tree_toggle |
| - | margin-top: 5px |
| - | width: 20px |
| - | height: 28px |
| - | float: left |
| - | margin-left: -35px |
| - | font: bold 14px/25px Arial, sans-serif |
| - | background: url(/images/cms/arrow_bottom.gif) right center no-repeat |
| - | padding-right: 15px |
| - | color: #ccc |
| - | text-align: right |
| - | text-decoration: none |
| - | a.tree_toggle.closed |
| - | background-image: url(/images/cms/arrow_right.gif) |
| - | a.tree_toggle:hover |
| - | border: 0px |
| - | color: #000 |
| - | |
| - | .item |
| - | padding: 7px 0px 7px 35px |
| - | overflow: hidden |
| - | |
| - | .icon |
| - | margin-left: -30px |
| - | float: left |
| - | width: 28px |
| - | height: 28px |
| - | background: url(/images/cms/icon_draft.gif) |
| - | .dragger |
| - | width: 28px |
| - | height: 28px |
| - | cursor: move |
| - | .dragger:hover |
| - | background: url(/images/cms/icon_move.gif) |
| - | |
| - | a.label |
| - | font-size: 14px |
| - | color: #000 |
| - | a.label:hover |
| - | border-bottom: 1px dotted #000 |
| - | .url |
| - | font-size: 10px |
| - | |
| - | .action_links |
| - | visibility: hidden |
| - | font-size: 10px |
| - | |
| - | table.details |
| - | font-size: 10px |
| - | margin: 5px 15px |
| - | border-left: 3px solid #ccc |
| - | th |
| - | padding: 0px 5px 0px 10px |
| - | font-weight: normal |
| - | |
| - | .item:hover |
| - | background-color: #ebf5fc |
| - | .action_links |
| - | visibility: visible |
| - | |
| - | // ---------------------------------------------------------- Formatted Table |
| - | table.formatted |
| - | margin-bottom: 15px |
| - | background-color: #fff |
| - | border: 10px solid #fff |
| - | box-shadow: 0px 2px 8px #ddd |
| - | -moz-box-shadow: 0px 2px 8px #ddd |
| - | -webkit-box-shadow: 0px 2px 8px #ddd |
| - | |
| - | th, td |
| - | padding: 10px |
| - | vertical-align: top |
| - | white-space: nowrap |
| - | a.label |
| - | color: black |
| - | font-size: 14px |
| - | a.slug |
| - | font-size: 10px |
| - | |
| - | th |
| - | background-color: #eee |
| - | font-size: 10px |
| - | text-transform: uppercase |
| - | border-bottom: 1px solid #444 |
| - | td.main, th.main |
| - | width: 100% |
| - | white-space: normal |
| - | tr |
| - | border-bottom: 1px solid #eee |
| - | |
| - | // -------------------------------------------------------------------- Forms |
| - | .form_element_group |
| - | margin-top: 10px |
| - | |
| - | |
| - | .form_element |
| - | margin-bottom: 10px |
| - | overflow: hidden |
| - | .label |
| - | height: 22px |
| - | font: 10px/22px Arial, sans-serif |
| - | color: #000 |
| - | text-transform: uppercase |
| - | letter-spacing: 1px |
| - | .value |
| - | .field_with_errors |
| - | display: inline |
| - | input, select, textarea |
| - | width: 97% |
| - | border: 1px solid #ccc |
| - | padding: 3px |
| - | input[type=checkbox] |
| - | width: auto |
| - | border: 0 |
| - | float: left |
| - | margin: 1px 4px 0px 0px |
| - | |
| - | .codemirror |
| - | background-color: #fff |
| - | border: 1px inset #e5e5e5 |
| - | .value.narrow |
| - | input, select, textarea |
| - | width: 80% |
| - | .fieldWithErrors label |
| - | color: #9E0B0F |
| - | .errors |
| - | color: #9E0B0F |
| - | margin: 3px 0px |
| - | .select |
| - | .label |
| - | label |
| - | line-height: 20px |
| - | .form_element.large |
| - | label |
| - | font-size: 16px |
| - | line-height: 26px |
| - | .value |
| - | input |
| - | font-size: 16px |
| - | .form_element.time_select_element, .form_element.date_select_element, .form_element.check_box_element, .form_element.radio_button_element |
| - | select, input |
| - | width: auto |
| - | |
| - | .form_element.submit_element |
| - | input |
| - | -moz-border-radius: 5px |
| - | -webkit-border-radius: 5px |
| - | background-color: #7CAE00 |
| - | padding: 5px 8px |
| - | font: 10px/20px Arial, sans-serif |
| - | color: #fff |
| - | text-transform: uppercase |
| - | letter-spacing: 1px |
| - | border: none |
| - | |
| - | .form_element_group.vertical |
| - | float: left |
| - | width: 50% |
| - | .form_element |
| - | .label |
| - | text-align: right |
| - | width: 40px |
| - | float: left |
| - | .value |
| - | float: left |
| - | width: 80% |
| - | margin-left: 10px |
| - | select |
| - | width: 100% |
| - | input[type=text] |
| - | width: 100% |
| - | .vertical + .vertical |
| - | .form_element |
| - | .label |
| - | width: 100px |
| - | .value |
| - | width: 60% |
| - | |
| - | .form_element_group.publishing |
| - | .form_element .field |
| - | input |
| - | width: 200px |
| - | |
| - | .submit |
| - | float: left |
| - | line-height: 30px |
| - | .submit_element |
| - | margin: 5px 5px 5px 0px |
| - | float: left |
| - | form |
| - | .errorExplanation |
| - | background-color: #9E0B0F |
| - | padding: 10px |
| - | color: #fff |
| - | font-size: 12px |
| - | h2 |
| - | margin: 0.1em 0em |
| - | font-size: 16px |
| - | h2, p |
| - | color: #fff |
| - | ul |
| - | margin: 10px 10px 0px 10px |
| - | |
| - | .form_element_group.advanced |
| - | display: none |
| - | // --------------------------------------------------------------- Pagination |
| - | .pagination |
| - | margin-bottom: 15px |
| - | float: right |
| - | a, span |
| - | background: #404040 |
| - | color: #fff |
| - | padding: 2px 5px |
| - | font-size: 11px |
| - | -moz-border-radius: 2px |
| - | a:hover |
| - | text-decoration: none |
| - | span.disabled |
| - | display: none |
| - | span.current |
| - | background-color: #999 |
| - | |
| - | // ------------------------------------------------------------------ Layouts |
| - | #cms_admin_layouts_index |
| - | .icon |
| - | background-image: url(/images/cms/icon_layout.gif) |
| - | |
| - | // -------------------------------------------------------------------- Pages |
| - | #cms_admin_pages_index |
| - | .icon.published |
| - | background-image: url(/images/cms/icon_regular.gif) |
| - | |
| - | // ----------------------------------------------------------------- Snippets |
| - | #cms_admin_snippets_index |
| - | .icon |
| - | width: 28px |
| - | height: 28px |
| - | background: url(/images/cms/icon_snippet.gif) |
| - | |
public/stylesheets/sass/jquery_ui.sass
+0
-990
| @@ | @@ -1,990 +0,0 @@ |
| - | /* |
| - | * jQuery UI CSS Framework @VERSION |
| - | * |
| - | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT or GPL Version 2 licenses. |
| - | * http://jquery.org/license |
| - | * |
| - | * http://docs.jquery.com/UI/Theming/API |
| - | |
| - | /* Layout helpers |
| - | *---------------------------------- |
| - | |
| - | .ui-helper-hidden |
| - | display: none |
| - | |
| - | .ui-helper-hidden-accessible |
| - | position: absolute |
| - | left: -99999999px |
| - | |
| - | .ui-helper-reset |
| - | margin: 0 |
| - | padding: 0 |
| - | border: 0 |
| - | outline: 0 |
| - | line-height: 1.3 |
| - | text-decoration: none |
| - | font-size: 100% |
| - | list-style: none |
| - | |
| - | .ui-helper-clearfix |
| - | &:after |
| - | content: "." |
| - | display: block |
| - | height: 0 |
| - | clear: both |
| - | visibility: hidden |
| - | display: inline-block |
| - | |
| - | /* required comment for clearfix to work in Opera \ |
| - | |
| - | * html .ui-helper-clearfix |
| - | height: 1% |
| - | |
| - | .ui-helper-clearfix |
| - | display: block |
| - | |
| - | /* end clearfix |
| - | |
| - | .ui-helper-zfix |
| - | width: 100% |
| - | height: 100% |
| - | top: 0 |
| - | left: 0 |
| - | position: absolute |
| - | opacity: 0 |
| - | filter: Alpha(Opacity = 0) |
| - | |
| - | /* Interaction Cues |
| - | *---------------------------------- |
| - | |
| - | .ui-state-disabled |
| - | cursor: default !important |
| - | |
| - | /* Icons |
| - | *---------------------------------- |
| - | |
| - | /* states and images |
| - | |
| - | .ui-icon |
| - | display: block |
| - | text-indent: -99999px |
| - | overflow: hidden |
| - | background-repeat: no-repeat |
| - | |
| - | /* Misc visuals |
| - | *---------------------------------- |
| - | |
| - | /* Overlays |
| - | |
| - | .ui-widget-overlay |
| - | position: absolute |
| - | top: 0 |
| - | left: 0 |
| - | width: 100% |
| - | height: 100% |
| - | |
| - | /* |
| - | * jQuery UI CSS Framework @VERSION |
| - | * |
| - | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) |
| - | * Dual licensed under the MIT or GPL Version 2 licenses. |
| - | * http://jquery.org/license |
| - | * |
| - | * http://docs.jquery.com/UI/Theming/API |
| - | * |
| - | * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px |
| - | |
| - | /* Component containers |
| - | *---------------------------------- |
| - | |
| - | .ui-widget |
| - | font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif |
| - | font-size: 1.1em |
| - | .ui-widget |
| - | font-size: 1em |
| - | input, select, textarea, button |
| - | font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif |
| - | font-size: 1em |
| - | |
| - | .ui-widget-content |
| - | border: 1px solid #dddddd |
| - | background: #eeeeee url(/images/cms/jquery_ui/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x |
| - | color: #333333 |
| - | a |
| - | color: #333333 |
| - | |
| - | .ui-widget-header |
| - | border: 1px solid #e78f08 |
| - | background: #f6a828 url(/images/cms/jquery_ui/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x |
| - | color: #ffffff |
| - | font-weight: bold |
| - | a |
| - | color: #ffffff |
| - | |
| - | /* Interaction states |
| - | *---------------------------------- |
| - | |
| - | .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default |
| - | border: 1px solid #cccccc |
| - | background: #f6f6f6 url(/images/cms/jquery_ui/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x |
| - | font-weight: bold |
| - | color: #1c94c4 |
| - | |
| - | .ui-state-default a |
| - | color: #1c94c4 |
| - | text-decoration: none |
| - | &:link, &:visited |
| - | color: #1c94c4 |
| - | text-decoration: none |
| - | |
| - | .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus |
| - | border: 1px solid #fbcb09 |
| - | background: #fdf5ce url(/images/cms/jquery_ui/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x |
| - | font-weight: bold |
| - | color: #c77405 |
| - | |
| - | .ui-state-hover a |
| - | color: #c77405 |
| - | text-decoration: none |
| - | &:hover |
| - | color: #c77405 |
| - | text-decoration: none |
| - | |
| - | .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active |
| - | border: 1px solid #fbd850 |
| - | background: white url(/images/cms/jquery_ui/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x |
| - | font-weight: bold |
| - | color: #eb8f00 |
| - | |
| - | .ui-state-active a |
| - | color: #eb8f00 |
| - | text-decoration: none |
| - | &:link, &:visited |
| - | color: #eb8f00 |
| - | text-decoration: none |
| - | |
| - | .ui-widget :active |
| - | outline: none |
| - | |
| - | /* Interaction Cues |
| - | *---------------------------------- |
| - | |
| - | .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight |
| - | border: 1px solid #fed22f |
| - | background: #ffe45c url(/images/cms/jquery_ui/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x |
| - | color: #363636 |
| - | |
| - | .ui-state-highlight a, .ui-widget-content .ui-state-highlight a, .ui-widget-header .ui-state-highlight a |
| - | color: #363636 |
| - | |
| - | .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error |
| - | border: 1px solid #cd0a0a |
| - | background: #b81900 url(/images/cms/jquery_ui/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat |
| - | color: #ffffff |
| - | |
| - | .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a, .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text |
| - | color: #ffffff |
| - | |
| - | .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary |
| - | font-weight: bold |
| - | |
| - | .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary |
| - | opacity: .7 |
| - | filter: Alpha(Opacity = 70) |
| - | font-weight: normal |
| - | |
| - | .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled |
| - | opacity: .35 |
| - | filter: Alpha(Opacity = 35) |
| - | background-image: none |
| - | |
| - | /* Icons |
| - | *---------------------------------- |
| - | |
| - | /* states and images |
| - | |
| - | .ui-icon |
| - | width: 16px |
| - | height: 16px |
| - | background-image: url(/images/cms/jquery_ui/ui-icons_222222_256x240.png) |
| - | |
| - | .ui-widget-content .ui-icon |
| - | background-image: url(/images/cms/jquery_ui/ui-icons_222222_256x240.png) |
| - | |
| - | .ui-widget-header .ui-icon |
| - | background-image: url(/images/cms/jquery_ui/ui-icons_ffffff_256x240.png) |
| - | |
| - | .ui-state-default .ui-icon, .ui-state-hover .ui-icon, .ui-state-focus .ui-icon, .ui-state-active .ui-icon |
| - | background-image: url(/images/cms/jquery_ui/ui-icons_ef8c08_256x240.png) |
| - | |
| - | .ui-state-highlight .ui-icon |
| - | background-image: url(/images/cms/jquery_ui/ui-icons_228ef1_256x240.png) |
| - | |
| - | .ui-state-error .ui-icon, .ui-state-error-text .ui-icon |
| - | background-image: url(/images/cms/jquery_ui/ui-icons_ffd27a_256x240.png) |
| - | |
| - | /* positioning |
| - | |
| - | .ui-icon-carat-1-n |
| - | background-position: 0 0 |
| - | |
| - | .ui-icon-carat-1-ne |
| - | background-position: -16px 0 |
| - | |
| - | .ui-icon-carat-1-e |
| - | background-position: -32px 0 |
| - | |
| - | .ui-icon-carat-1-se |
| - | background-position: -48px 0 |
| - | |
| - | .ui-icon-carat-1-s |
| - | background-position: -64px 0 |
| - | |
| - | .ui-icon-carat-1-sw |
| - | background-position: -80px 0 |
| - | |
| - | .ui-icon-carat-1-w |
| - | background-position: -96px 0 |
| - | |
| - | .ui-icon-carat-1-nw |
| - | background-position: -112px 0 |
| - | |
| - | .ui-icon-carat-2-n-s |
| - | background-position: -128px 0 |
| - | |
| - | .ui-icon-carat-2-e-w |
| - | background-position: -144px 0 |
| - | |
| - | .ui-icon-triangle-1-n |
| - | background-position: 0 -16px |
| - | |
| - | .ui-icon-triangle-1-ne |
| - | background-position: -16px -16px |
| - | |
| - | .ui-icon-triangle-1-e |
| - | background-position: -32px -16px |
| - | |
| - | .ui-icon-triangle-1-se |
| - | background-position: -48px -16px |
| - | |
| - | .ui-icon-triangle-1-s |
| - | background-position: -64px -16px |
| - | |
| - | .ui-icon-triangle-1-sw |
| - | background-position: -80px -16px |
| - | |
| - | .ui-icon-triangle-1-w |
| - | background-position: -96px -16px |
| - | |
| - | .ui-icon-triangle-1-nw |
| - | background-position: -112px -16px |
| - | |
| - | .ui-icon-triangle-2-n-s |
| - | background-position: -128px -16px |
| - | |
| - | .ui-icon-triangle-2-e-w |
| - | background-position: -144px -16px |
| - | |
| - | .ui-icon-arrow-1-n |
| - | background-position: 0 -32px |
| - | |
| - | .ui-icon-arrow-1-ne |
| - | background-position: -16px -32px |
| - | |
| - | .ui-icon-arrow-1-e |
| - | background-position: -32px -32px |
| - | |
| - | .ui-icon-arrow-1-se |
| - | background-position: -48px -32px |
| - | |
| - | .ui-icon-arrow-1-s |
| - | background-position: -64px -32px |
| - | |
| - | .ui-icon-arrow-1-sw |
| - | background-position: -80px -32px |
| - | |
| - | .ui-icon-arrow-1-w |
| - | background-position: -96px -32px |
| - | |
| - | .ui-icon-arrow-1-nw |
| - | background-position: -112px -32px |
| - | |
| - | .ui-icon-arrow-2-n-s |
| - | background-position: -128px -32px |
| - | |
| - | .ui-icon-arrow-2-ne-sw |
| - | background-position: -144px -32px |
| - | |
| - | .ui-icon-arrow-2-e-w |
| - | background-position: -160px -32px |
| - | |
| - | .ui-icon-arrow-2-se-nw |
| - | background-position: -176px -32px |
| - | |
| - | .ui-icon-arrowstop-1-n |
| - | background-position: -192px -32px |
| - | |
| - | .ui-icon-arrowstop-1-e |
| - | background-position: -208px -32px |
| - | |
| - | .ui-icon-arrowstop-1-s |
| - | background-position: -224px -32px |
| - | |
| - | .ui-icon-arrowstop-1-w |
| - | background-position: -240px -32px |
| - | |
| - | .ui-icon-arrowthick-1-n |
| - | background-position: 0 -48px |
| - | |
| - | .ui-icon-arrowthick-1-ne |
| - | background-position: -16px -48px |
| - | |
| - | .ui-icon-arrowthick-1-e |
| - | background-position: -32px -48px |
| - | |
| - | .ui-icon-arrowthick-1-se |
| - | background-position: -48px -48px |
| - | |
| - | .ui-icon-arrowthick-1-s |
| - | background-position: -64px -48px |
| - | |
| - | .ui-icon-arrowthick-1-sw |
| - | background-position: -80px -48px |
| - | |
| - | .ui-icon-arrowthick-1-w |
| - | background-position: -96px -48px |
| - | |
| - | .ui-icon-arrowthick-1-nw |
| - | background-position: -112px -48px |
| - | |
| - | .ui-icon-arrowthick-2-n-s |
| - | background-position: -128px -48px |
| - | |
| - | .ui-icon-arrowthick-2-ne-sw |
| - | background-position: -144px -48px |
| - | |
| - | .ui-icon-arrowthick-2-e-w |
| - | background-position: -160px -48px |
| - | |
| - | .ui-icon-arrowthick-2-se-nw |
| - | background-position: -176px -48px |
| - | |
| - | .ui-icon-arrowthickstop-1-n |
| - | background-position: -192px -48px |
| - | |
| - | .ui-icon-arrowthickstop-1-e |
| - | background-position: -208px -48px |
| - | |
| - | .ui-icon-arrowthickstop-1-s |
| - | background-position: -224px -48px |
| - | |
| - | .ui-icon-arrowthickstop-1-w |
| - | background-position: -240px -48px |
| - | |
| - | .ui-icon-arrowreturnthick-1-w |
| - | background-position: 0 -64px |
| - | |
| - | .ui-icon-arrowreturnthick-1-n |
| - | background-position: -16px -64px |
| - | |
| - | .ui-icon-arrowreturnthick-1-e |
| - | background-position: -32px -64px |
| - | |
| - | .ui-icon-arrowreturnthick-1-s |
| - | background-position: -48px -64px |
| - | |
| - | .ui-icon-arrowreturn-1-w |
| - | background-position: -64px -64px |
| - | |
| - | .ui-icon-arrowreturn-1-n |
| - | background-position: -80px -64px |
| - | |
| - | .ui-icon-arrowreturn-1-e |
| - | background-position: -96px -64px |
| - | |
| - | .ui-icon-arrowreturn-1-s |
| - | background-position: -112px -64px |
| - | |
| - | .ui-icon-arrowrefresh-1-w |
| - | background-position: -128px -64px |
| - | |
| - | .ui-icon-arrowrefresh-1-n |
| - | background-position: -144px -64px |
| - | |
| - | .ui-icon-arrowrefresh-1-e |
| - | background-position: -160px -64px |
| - | |
| - | .ui-icon-arrowrefresh-1-s |
| - | background-position: -176px -64px |
| - | |
| - | .ui-icon-arrow-4 |
| - | background-position: 0 -80px |
| - | |
| - | .ui-icon-arrow-4-diag |
| - | background-position: -16px -80px |
| - | |
| - | .ui-icon-extlink |
| - | background-position: -32px -80px |
| - | |
| - | .ui-icon-newwin |
| - | background-position: -48px -80px |
| - | |
| - | .ui-icon-refresh |
| - | background-position: -64px -80px |
| - | |
| - | .ui-icon-shuffle |
| - | background-position: -80px -80px |
| - | |
| - | .ui-icon-transfer-e-w |
| - | background-position: -96px -80px |
| - | |
| - | .ui-icon-transferthick-e-w |
| - | background-position: -112px -80px |
| - | |
| - | .ui-icon-folder-collapsed |
| - | background-position: 0 -96px |
| - | |
| - | .ui-icon-folder-open |
| - | background-position: -16px -96px |
| - | |
| - | .ui-icon-document |
| - | background-position: -32px -96px |
| - | |
| - | .ui-icon-document-b |
| - | background-position: -48px -96px |
| - | |
| - | .ui-icon-note |
| - | background-position: -64px -96px |
| - | |
| - | .ui-icon-mail-closed |
| - | background-position: -80px -96px |
| - | |
| - | .ui-icon-mail-open |
| - | background-position: -96px -96px |
| - | |
| - | .ui-icon-suitcase |
| - | background-position: -112px -96px |
| - | |
| - | .ui-icon-comment |
| - | background-position: -128px -96px |
| - | |
| - | .ui-icon-person |
| - | background-position: -144px -96px |
| - | |
| - | .ui-icon-print |
| - | background-position: -160px -96px |
| - | |
| - | .ui-icon-trash |
| - | background-position: -176px -96px |
| - | |
| - | .ui-icon-locked |
| - | background-position: -192px -96px |
| - | |
| - | .ui-icon-unlocked |
| - | background-position: -208px -96px |
| - | |
| - | .ui-icon-bookmark |
| - | background-position: -224px -96px |
| - | |
| - | .ui-icon-tag |
| - | background-position: -240px -96px |
| - | |
| - | .ui-icon-home |
| - | background-position: 0 -112px |
| - | |
| - | .ui-icon-flag |
| - | background-position: -16px -112px |
| - | |
| - | .ui-icon-calendar |
| - | background-position: -32px -112px |
| - | |
| - | .ui-icon-cart |
| - | background-position: -48px -112px |
| - | |
| - | .ui-icon-pencil |
| - | background-position: -64px -112px |
| - | |
| - | .ui-icon-clock |
| - | background-position: -80px -112px |
| - | |
| - | .ui-icon-disk |
| - | background-position: -96px -112px |
| - | |
| - | .ui-icon-calculator |
| - | background-position: -112px -112px |
| - | |
| - | .ui-icon-zoomin |
| - | background-position: -128px -112px |
| - | |
| - | .ui-icon-zoomout |
| - | background-position: -144px -112px |
| - | |
| - | .ui-icon-search |
| - | background-position: -160px -112px |
| - | |
| - | .ui-icon-wrench |
| - | background-position: -176px -112px |
| - | |
| - | .ui-icon-gear |
| - | background-position: -192px -112px |
| - | |
| - | .ui-icon-heart |
| - | background-position: -208px -112px |
| - | |
| - | .ui-icon-star |
| - | background-position: -224px -112px |
| - | |
| - | .ui-icon-link |
| - | background-position: -240px -112px |
| - | |
| - | .ui-icon-cancel |
| - | background-position: 0 -128px |
| - | |
| - | .ui-icon-plus |
| - | background-position: -16px -128px |
| - | |
| - | .ui-icon-plusthick |
| - | background-position: -32px -128px |
| - | |
| - | .ui-icon-minus |
| - | background-position: -48px -128px |
| - | |
| - | .ui-icon-minusthick |
| - | background-position: -64px -128px |
| - | |
| - | .ui-icon-close |
| - | background-position: -80px -128px |
| - | |
| - | .ui-icon-closethick |
| - | background-position: -96px -128px |
| - | |
| - | .ui-icon-key |
| - | background-position: -112px -128px |
| - | |
| - | .ui-icon-lightbulb |
| - | background-position: -128px -128px |
| - | |
| - | .ui-icon-scissors |
| - | background-position: -144px -128px |
| - | |
| - | .ui-icon-clipboard |
| - | background-position: -160px -128px |
| - | |
| - | .ui-icon-copy |
| - | background-position: -176px -128px |
| - | |
| - | .ui-icon-contact |
| - | background-position: -192px -128px |
| - | |
| - | .ui-icon-image |
| - | background-position: -208px -128px |
| - | |
| - | .ui-icon-video |
| - | background-position: -224px -128px |
| - | |
| - | .ui-icon-script |
| - | background-position: -240px -128px |
| - | |
| - | .ui-icon-alert |
| - | background-position: 0 -144px |
| - | |
| - | .ui-icon-info |
| - | background-position: -16px -144px |
| - | |
| - | .ui-icon-notice |
| - | background-position: -32px -144px |
| - | |
| - | .ui-icon-help |
| - | background-position: -48px -144px |
| - | |
| - | .ui-icon-check |
| - | background-position: -64px -144px |
| - | |
| - | .ui-icon-bullet |
| - | background-position: -80px -144px |
| - | |
| - | .ui-icon-radio-off |
| - | background-position: -96px -144px |
| - | |
| - | .ui-icon-radio-on |
| - | background-position: -112px -144px |
| - | |
| - | .ui-icon-pin-w |
| - | background-position: -128px -144px |
| - | |
| - | .ui-icon-pin-s |
| - | background-position: -144px -144px |
| - | |
| - | .ui-icon-play |
| - | background-position: 0 -160px |
| - | |
| - | .ui-icon-pause |
| - | background-position: -16px -160px |
| - | |
| - | .ui-icon-seek-next |
| - | background-position: -32px -160px |
| - | |
| - | .ui-icon-seek-prev |
| - | background-position: -48px -160px |
| - | |
| - | .ui-icon-seek-end |
| - | background-position: -64px -160px |
| - | |
| - | .ui-icon-seek-start, .ui-icon-seek-first |
| - | background-position: -80px -160px |
| - | |
| - | /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead |
| - | |
| - | .ui-icon-stop |
| - | background-position: -96px -160px |
| - | |
| - | .ui-icon-eject |
| - | background-position: -112px -160px |
| - | |
| - | .ui-icon-volume-off |
| - | background-position: -128px -160px |
| - | |
| - | .ui-icon-volume-on |
| - | background-position: -144px -160px |
| - | |
| - | .ui-icon-power |
| - | background-position: 0 -176px |
| - | |
| - | .ui-icon-signal-diag |
| - | background-position: -16px -176px |
| - | |
| - | .ui-icon-signal |
| - | background-position: -32px -176px |
| - | |
| - | .ui-icon-battery-0 |
| - | background-position: -48px -176px |
| - | |
| - | .ui-icon-battery-1 |
| - | background-position: -64px -176px |
| - | |
| - | .ui-icon-battery-2 |
| - | background-position: -80px -176px |
| - | |
| - | .ui-icon-battery-3 |
| - | background-position: -96px -176px |
| - | |
| - | .ui-icon-circle-plus |
| - | background-position: 0 -192px |
| - | |
| - | .ui-icon-circle-minus |
| - | background-position: -16px -192px |
| - | |
| - | .ui-icon-circle-close |
| - | background-position: -32px -192px |
| - | |
| - | .ui-icon-circle-triangle-e |
| - | background-position: -48px -192px |
| - | |
| - | .ui-icon-circle-triangle-s |
| - | background-position: -64px -192px |
| - | |
| - | .ui-icon-circle-triangle-w |
| - | background-position: -80px -192px |
| - | |
| - | .ui-icon-circle-triangle-n |
| - | background-position: -96px -192px |
| - | |
| - | .ui-icon-circle-arrow-e |
| - | background-position: -112px -192px |
| - | |
| - | .ui-icon-circle-arrow-s |
| - | background-position: -128px -192px |
| - | |
| - | .ui-icon-circle-arrow-w |
| - | background-position: -144px -192px |
| - | |
| - | .ui-icon-circle-arrow-n |
| - | background-position: -160px -192px |
| - | |
| - | .ui-icon-circle-zoomin |
| - | background-position: -176px -192px |
| - | |
| - | .ui-icon-circle-zoomout |
| - | background-position: -192px -192px |
| - | |
| - | .ui-icon-circle-check |
| - | background-position: -208px -192px |
| - | |
| - | .ui-icon-circlesmall-plus |
| - | background-position: 0 -208px |
| - | |
| - | .ui-icon-circlesmall-minus |
| - | background-position: -16px -208px |
| - | |
| - | .ui-icon-circlesmall-close |
| - | background-position: -32px -208px |
| - | |
| - | .ui-icon-squaresmall-plus |
| - | background-position: -48px -208px |
| - | |
| - | .ui-icon-squaresmall-minus |
| - | background-position: -64px -208px |
| - | |
| - | .ui-icon-squaresmall-close |
| - | background-position: -80px -208px |
| - | |
| - | .ui-icon-grip-dotted-vertical |
| - | background-position: 0 -224px |
| - | |
| - | .ui-icon-grip-dotted-horizontal |
| - | background-position: -16px -224px |
| - | |
| - | .ui-icon-grip-solid-vertical |
| - | background-position: -32px -224px |
| - | |
| - | .ui-icon-grip-solid-horizontal |
| - | background-position: -48px -224px |
| - | |
| - | .ui-icon-gripsmall-diagonal-se |
| - | background-position: -64px -224px |
| - | |
| - | .ui-icon-grip-diagonal-se |
| - | background-position: -80px -224px |
| - | |
| - | /* Misc visuals |
| - | *---------------------------------- |
| - | |
| - | /* Corner radius |
| - | |
| - | .ui-corner-tl |
| - | -moz-border-radius-topleft: 4px |
| - | -webkit-border-top-left-radius: 4px |
| - | border-top-left-radius: 4px |
| - | |
| - | .ui-corner-tr |
| - | -moz-border-radius-topright: 4px |
| - | -webkit-border-top-right-radius: 4px |
| - | border-top-right-radius: 4px |
| - | |
| - | .ui-corner-bl |
| - | -moz-border-radius-bottomleft: 4px |
| - | -webkit-border-bottom-left-radius: 4px |
| - | border-bottom-left-radius: 4px |
| - | |
| - | .ui-corner-br |
| - | -moz-border-radius-bottomright: 4px |
| - | -webkit-border-bottom-right-radius: 4px |
| - | border-bottom-right-radius: 4px |
| - | |
| - | .ui-corner-top |
| - | -moz-border-radius-topleft: 4px |
| - | -webkit-border-top-left-radius: 4px |
| - | border-top-left-radius: 4px |
| - | -moz-border-radius-topright: 4px |
| - | -webkit-border-top-right-radius: 4px |
| - | border-top-right-radius: 4px |
| - | |
| - | .ui-corner-bottom |
| - | -moz-border-radius-bottomleft: 4px |
| - | -webkit-border-bottom-left-radius: 4px |
| - | border-bottom-left-radius: 4px |
| - | -moz-border-radius-bottomright: 4px |
| - | -webkit-border-bottom-right-radius: 4px |
| - | border-bottom-right-radius: 4px |
| - | |
| - | .ui-corner-right |
| - | -moz-border-radius-topright: 4px |
| - | -webkit-border-top-right-radius: 4px |
| - | border-top-right-radius: 4px |
| - | -moz-border-radius-bottomright: 4px |
| - | -webkit-border-bottom-right-radius: 4px |
| - | border-bottom-right-radius: 4px |
| - | |
| - | .ui-corner-left |
| - | -moz-border-radius-topleft: 4px |
| - | -webkit-border-top-left-radius: 4px |
| - | border-top-left-radius: 4px |
| - | -moz-border-radius-bottomleft: 4px |
| - | -webkit-border-bottom-left-radius: 4px |
| - | border-bottom-left-radius: 4px |
| - | |
| - | .ui-corner-all |
| - | -moz-border-radius: 4px |
| - | -webkit-border-radius: 4px |
| - | border-radius: 4px |
| - | |
| - | /* Overlays |
| - | |
| - | .ui-widget-overlay |
| - | background: #666666 url(/images/cms/jquery_ui/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat |
| - | opacity: .50 |
| - | filter: Alpha(Opacity = 50) |
| - | |
| - | .ui-widget-shadow |
| - | margin: -5px 0 0 -5px |
| - | padding: 5px |
| - | background: black url(/images/cms/jquery_ui/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x |
| - | opacity: .20 |
| - | filter: Alpha(Opacity = 20) |
| - | -moz-border-radius: 5px |
| - | -webkit-border-radius: 5px |
| - | border-radius: 5px |
| - | |
| - | /* |
| - | * * jQuery UI Datepicker @VERSION |
| - | * * |
| - | * * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) |
| - | * * Dual licensed under the MIT or GPL Version 2 licenses. |
| - | * * http://jquery.org/license |
| - | * * |
| - | * * http://docs.jquery.com/UI/Datepicker#theming |
| - | |
| - | .ui-datepicker |
| - | width: 17em |
| - | padding: .2em .2em 0 |
| - | .ui-datepicker-header |
| - | position: relative |
| - | padding: .2em 0 |
| - | .ui-datepicker-prev, .ui-datepicker-next |
| - | position: absolute |
| - | top: 2px |
| - | width: 1.8em |
| - | height: 1.8em |
| - | .ui-datepicker-prev-hover, .ui-datepicker-next-hover |
| - | top: 1px |
| - | .ui-datepicker-prev |
| - | left: 2px |
| - | .ui-datepicker-next |
| - | right: 2px |
| - | .ui-datepicker-prev-hover |
| - | left: 1px |
| - | .ui-datepicker-next-hover |
| - | right: 1px |
| - | .ui-datepicker-prev span, .ui-datepicker-next span |
| - | display: block |
| - | position: absolute |
| - | left: 50% |
| - | margin-left: -8px |
| - | top: 50% |
| - | margin-top: -8px |
| - | .ui-datepicker-title |
| - | margin: 0 2.3em |
| - | line-height: 1.8em |
| - | text-align: center |
| - | select |
| - | font-size: 1em |
| - | margin: 1px 0 |
| - | select |
| - | &.ui-datepicker-month-year |
| - | width: 100% |
| - | &.ui-datepicker-month, &.ui-datepicker-year |
| - | width: 49% |
| - | table |
| - | width: 100% |
| - | font-size: .9em |
| - | border-collapse: collapse |
| - | margin: 0 0 .4em |
| - | th |
| - | padding: .7em .3em |
| - | text-align: center |
| - | font-weight: bold |
| - | border: 0 |
| - | td |
| - | border: 0 |
| - | padding: 1px |
| - | span, a |
| - | display: block |
| - | padding: .2em |
| - | text-align: right |
| - | text-decoration: none |
| - | .ui-datepicker-buttonpane |
| - | background-image: none |
| - | margin: .7em 0 0 0 |
| - | padding: 0 .2em |
| - | border-left: 0 |
| - | border-right: 0 |
| - | border-bottom: 0 |
| - | button |
| - | float: right |
| - | margin: .5em .2em .4em |
| - | cursor: pointer |
| - | padding: .2em .6em .3em .6em |
| - | width: auto |
| - | overflow: visible |
| - | &.ui-datepicker-current |
| - | float: left |
| - | &.ui-datepicker-multi |
| - | width: auto |
| - | |
| - | /* with multiple calendars |
| - | |
| - | .ui-datepicker-multi .ui-datepicker-group |
| - | float: left |
| - | table |
| - | width: 95% |
| - | margin: 0 auto .4em |
| - | |
| - | .ui-datepicker-multi-2 .ui-datepicker-group |
| - | width: 50% |
| - | |
| - | .ui-datepicker-multi-3 .ui-datepicker-group |
| - | width: 33.3% |
| - | |
| - | .ui-datepicker-multi-4 .ui-datepicker-group |
| - | width: 25% |
| - | |
| - | .ui-datepicker-multi |
| - | .ui-datepicker-group-last .ui-datepicker-header, .ui-datepicker-group-middle .ui-datepicker-header |
| - | border-left-width: 0 |
| - | .ui-datepicker-buttonpane |
| - | clear: left |
| - | |
| - | .ui-datepicker-row-break |
| - | clear: both |
| - | width: 100% |
| - | |
| - | /* RTL support |
| - | |
| - | .ui-datepicker-rtl |
| - | direction: rtl |
| - | .ui-datepicker-prev |
| - | right: 2px |
| - | left: auto |
| - | .ui-datepicker-next |
| - | left: 2px |
| - | right: auto |
| - | .ui-datepicker-prev:hover |
| - | right: 1px |
| - | left: auto |
| - | .ui-datepicker-next:hover |
| - | left: 1px |
| - | right: auto |
| - | .ui-datepicker-buttonpane |
| - | clear: right |
| - | button |
| - | float: left |
| - | &.ui-datepicker-current |
| - | float: right |
| - | .ui-datepicker-group |
| - | float: right |
| - | .ui-datepicker-group-last .ui-datepicker-header, .ui-datepicker-group-middle .ui-datepicker-header |
| - | border-right-width: 0 |
| - | border-left-width: 1px |
| - | |
| - | /* IE6 IFRAME FIX (taken from datepicker 1.5.3 |
| - | |
| - | .ui-datepicker-cover |
| - | display: none |
| - | /*sorry for IE5 |
| - | display/**/: block |
| - | /*sorry for IE5 |
| - | position: absolute |
| - | /*must have |
| - | z-index: -1 |
| - | /*must have |
| - | filter: mask() |
| - | /*must have |
| - | top: -4px |
| - | /*must have |
| - | left: -4px |
| - | /*must have |
| - | width: 200px |
| - | /*must have |
| - | height: 200px |
| - | /*must have |
lake-louise-canada.jpg b/public/system/files/236/thumb/lake-louise-canada.jpg
+0
-0
test/fixtures/cms_assets.yml
+11
-0
| @@ | @@ -0,0 +1,11 @@ |
| + | # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html |
| + | |
| + | # This model initially had no columns defined. If you add columns to the |
| + | # model remove the '{}' from the fixture names and add the columns immediately |
| + | # below each fixture, per the syntax in the comments below |
| + | # |
| + | one: {} |
| + | # column: value |
| + | # |
| + | two: {} |
| + | # column: value |
test/functional/cms_admin/assets_controller_test.rb
+8
-0
| @@ | @@ -0,0 +1,8 @@ |
| + | require 'test_helper' |
| + | |
| + | class CmsAdmin::AssetsControllerTest < ActionController::TestCase |
| + | # Replace this with your real tests. |
| + | test "the truth" do |
| + | assert true |
| + | end |
| + | end |
test/unit/cms_asset_test.rb
+4
-0
| @@ | @@ -0,0 +1,4 @@ |
| + | require 'test_helper' |
| + | |
| + | class CmsAssetTest < ActiveSupport::TestCase |
| + | end |