rails_kindeditor 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (195) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +4 -0
  3. data/README.rdoc +34 -0
  4. data/Rakefile +2 -0
  5. data/app/controllers/kindeditor/assets_controller.rb +50 -0
  6. data/app/models/kindeditor/asset.rb +14 -0
  7. data/app/models/kindeditor/file.rb +4 -0
  8. data/app/models/kindeditor/image.rb +4 -0
  9. data/app/uploaders/kindeditor/file_uploader.rb +54 -0
  10. data/app/uploaders/kindeditor/image_uploader.rb +54 -0
  11. data/config/routes.rb +7 -0
  12. data/lib/generators/rails_kindeditor/install/USAGE +9 -0
  13. data/lib/generators/rails_kindeditor/install/install_generator.rb +11 -0
  14. data/lib/generators/rails_kindeditor/install/templates/kindeditor/kindeditor-init.js +7 -0
  15. data/lib/generators/rails_kindeditor/install/templates/kindeditor/kindeditor.js +4688 -0
  16. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/about.html +52 -0
  17. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/accessory.html +74 -0
  18. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/advtable/advtable.html +235 -0
  19. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/advtable/cell.html +201 -0
  20. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/0.gif +0 -0
  21. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/1.gif +0 -0
  22. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/10.gif +0 -0
  23. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/100.gif +0 -0
  24. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/101.gif +0 -0
  25. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/102.gif +0 -0
  26. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/103.gif +0 -0
  27. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/104.gif +0 -0
  28. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/105.gif +0 -0
  29. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/106.gif +0 -0
  30. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/107.gif +0 -0
  31. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/108.gif +0 -0
  32. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/109.gif +0 -0
  33. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/11.gif +0 -0
  34. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/110.gif +0 -0
  35. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/111.gif +0 -0
  36. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/112.gif +0 -0
  37. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/113.gif +0 -0
  38. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/114.gif +0 -0
  39. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/115.gif +0 -0
  40. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/116.gif +0 -0
  41. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/117.gif +0 -0
  42. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/118.gif +0 -0
  43. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/119.gif +0 -0
  44. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/12.gif +0 -0
  45. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/120.gif +0 -0
  46. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/121.gif +0 -0
  47. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/122.gif +0 -0
  48. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/123.gif +0 -0
  49. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/124.gif +0 -0
  50. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/125.gif +0 -0
  51. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/126.gif +0 -0
  52. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/127.gif +0 -0
  53. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/128.gif +0 -0
  54. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/129.gif +0 -0
  55. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/13.gif +0 -0
  56. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/130.gif +0 -0
  57. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/131.gif +0 -0
  58. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/132.gif +0 -0
  59. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/133.gif +0 -0
  60. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/134.gif +0 -0
  61. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/14.gif +0 -0
  62. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/15.gif +0 -0
  63. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/16.gif +0 -0
  64. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/17.gif +0 -0
  65. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/18.gif +0 -0
  66. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/19.gif +0 -0
  67. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/2.gif +0 -0
  68. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/20.gif +0 -0
  69. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/21.gif +0 -0
  70. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/22.gif +0 -0
  71. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/23.gif +0 -0
  72. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/24.gif +0 -0
  73. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/25.gif +0 -0
  74. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/26.gif +0 -0
  75. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/27.gif +0 -0
  76. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/28.gif +0 -0
  77. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/29.gif +0 -0
  78. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/3.gif +0 -0
  79. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/30.gif +0 -0
  80. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/31.gif +0 -0
  81. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/32.gif +0 -0
  82. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/33.gif +0 -0
  83. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/34.gif +0 -0
  84. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/35.gif +0 -0
  85. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/36.gif +0 -0
  86. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/37.gif +0 -0
  87. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/38.gif +0 -0
  88. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/39.gif +0 -0
  89. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/4.gif +0 -0
  90. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/40.gif +0 -0
  91. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/41.gif +0 -0
  92. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/42.gif +0 -0
  93. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/43.gif +0 -0
  94. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/44.gif +0 -0
  95. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/45.gif +0 -0
  96. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/46.gif +0 -0
  97. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/47.gif +0 -0
  98. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/48.gif +0 -0
  99. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/49.gif +0 -0
  100. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/5.gif +0 -0
  101. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/50.gif +0 -0
  102. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/51.gif +0 -0
  103. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/52.gif +0 -0
  104. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/53.gif +0 -0
  105. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/54.gif +0 -0
  106. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/55.gif +0 -0
  107. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/56.gif +0 -0
  108. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/57.gif +0 -0
  109. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/58.gif +0 -0
  110. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/59.gif +0 -0
  111. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/6.gif +0 -0
  112. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/60.gif +0 -0
  113. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/61.gif +0 -0
  114. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/62.gif +0 -0
  115. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/63.gif +0 -0
  116. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/64.gif +0 -0
  117. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/65.gif +0 -0
  118. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/66.gif +0 -0
  119. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/67.gif +0 -0
  120. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/68.gif +0 -0
  121. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/69.gif +0 -0
  122. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/7.gif +0 -0
  123. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/70.gif +0 -0
  124. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/71.gif +0 -0
  125. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/72.gif +0 -0
  126. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/73.gif +0 -0
  127. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/74.gif +0 -0
  128. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/75.gif +0 -0
  129. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/76.gif +0 -0
  130. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/77.gif +0 -0
  131. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/78.gif +0 -0
  132. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/79.gif +0 -0
  133. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/8.gif +0 -0
  134. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/80.gif +0 -0
  135. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/81.gif +0 -0
  136. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/82.gif +0 -0
  137. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/83.gif +0 -0
  138. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/84.gif +0 -0
  139. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/85.gif +0 -0
  140. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/86.gif +0 -0
  141. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/87.gif +0 -0
  142. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/88.gif +0 -0
  143. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/89.gif +0 -0
  144. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/9.gif +0 -0
  145. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/90.gif +0 -0
  146. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/91.gif +0 -0
  147. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/92.gif +0 -0
  148. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/93.gif +0 -0
  149. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/94.gif +0 -0
  150. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/95.gif +0 -0
  151. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/96.gif +0 -0
  152. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/97.gif +0 -0
  153. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/98.gif +0 -0
  154. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/99.gif +0 -0
  155. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/emoticons/qq.gif +0 -0
  156. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/file_manager/file_manager.css +64 -0
  157. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/file_manager/file_manager.html +31 -0
  158. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/file_manager/file_manager.js +221 -0
  159. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/file_manager/images/file-16.gif +0 -0
  160. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/file_manager/images/file-64.gif +0 -0
  161. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/file_manager/images/folder-16.gif +0 -0
  162. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/file_manager/images/folder-64.gif +0 -0
  163. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/file_manager/images/go-up.gif +0 -0
  164. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/flash.html +69 -0
  165. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/image/image.html +305 -0
  166. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/image/images/align_left.gif +0 -0
  167. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/image/images/align_right.gif +0 -0
  168. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/image/images/align_top.gif +0 -0
  169. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/image/images/refresh.gif +0 -0
  170. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/link/link.html +82 -0
  171. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/media.html +73 -0
  172. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/plainpaste.html +44 -0
  173. data/lib/generators/rails_kindeditor/install/templates/kindeditor/plugins/wordpaste.html +50 -0
  174. data/lib/generators/rails_kindeditor/install/templates/kindeditor/skins/common/blank.gif +0 -0
  175. data/lib/generators/rails_kindeditor/install/templates/kindeditor/skins/common/doc.gif +0 -0
  176. data/lib/generators/rails_kindeditor/install/templates/kindeditor/skins/common/editor.css +47 -0
  177. data/lib/generators/rails_kindeditor/install/templates/kindeditor/skins/common/flash.gif +0 -0
  178. data/lib/generators/rails_kindeditor/install/templates/kindeditor/skins/common/loading.gif +0 -0
  179. data/lib/generators/rails_kindeditor/install/templates/kindeditor/skins/common/media.gif +0 -0
  180. data/lib/generators/rails_kindeditor/install/templates/kindeditor/skins/common/mp3.gif +0 -0
  181. data/lib/generators/rails_kindeditor/install/templates/kindeditor/skins/common/pdf.gif +0 -0
  182. data/lib/generators/rails_kindeditor/install/templates/kindeditor/skins/common/rar.gif +0 -0
  183. data/lib/generators/rails_kindeditor/install/templates/kindeditor/skins/common/rm.gif +0 -0
  184. data/lib/generators/rails_kindeditor/install/templates/kindeditor/skins/common/xls.gif +0 -0
  185. data/lib/generators/rails_kindeditor/install/templates/kindeditor/skins/default/bg.gif +0 -0
  186. data/lib/generators/rails_kindeditor/install/templates/kindeditor/skins/default/default.gif +0 -0
  187. data/lib/generators/rails_kindeditor/install/templates/kindeditor/skins/default.css +911 -0
  188. data/lib/generators/rails_kindeditor/migration/USAGE +13 -0
  189. data/lib/generators/rails_kindeditor/migration/migration_generator.rb +20 -0
  190. data/lib/generators/rails_kindeditor/migration/templates/migration/migration.rb +15 -0
  191. data/lib/rails_kindeditor/engine.rb +9 -0
  192. data/lib/rails_kindeditor/version.rb +3 -0
  193. data/lib/rails_kindeditor.rb +10 -0
  194. data/rails_kindeditor.gemspec +24 -0
  195. metadata +259 -0
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in rails_kindeditor.gemspec
4
+ gemspec
data/README.rdoc ADDED
@@ -0,0 +1,34 @@
1
+ == kindeditor for rails3
2
+
3
+ == Installation
4
+
5
+ gem install rails_kindeditor
6
+
7
+ After you install rails_kindeditor and add it to your Gemfile, you need to run the generator:
8
+
9
+ rails generate rails_kindeditor:install
10
+
11
+ The generator will copy kindeditor to your application. When you are done, you are ready to add migration using the generator:
12
+
13
+ rails generate rails_kindeditor:migration
14
+
15
+ The generator will copy migration to your application. When you are done, remember run rake db:migrate:
16
+
17
+ rake db:migrate
18
+
19
+ == Usage
20
+
21
+ Basically include this in the page you wish to use the editor in:
22
+ <%= include_kindeditor %>
23
+
24
+ then use it like this:
25
+ <%= f.text_area :content, :id => "editor_id" %>
26
+ or <%= text_area_tag :content, :id => "editor_id" %>
27
+ or <textarea id="editor_id"></textarea>
28
+
29
+ just assign the id to "editor_id".
30
+
31
+ == License
32
+
33
+ MIT License. Copyright 2011
34
+
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,50 @@
1
+ class Kindeditor::AssetsController < ApplicationController
2
+
3
+ def create
4
+ @asset_params = params[:imgFile]
5
+ case @asset_params.content_type.gsub(/\/[a-z]*/, "")
6
+ when 'image'
7
+ @asset = Kindeditor::Image.new(:asset => @asset_params)
8
+ if @asset.save
9
+ render :text => ({:error => 0, :url => @asset.asset.url}.to_json)
10
+ else
11
+ render :text => ({:error => 1, :message => @asset.errors.full_messages}.to_json)
12
+ end
13
+ else # other type files
14
+ @asset = Kindeditor::File.new(:asset => params[:imgFile])
15
+ if @asset.save
16
+ str = "<script type='text/javascript'>parent.KE.plugin['accessory'].insert('" \
17
+ + request[:id] + "', '" + @asset.asset.url + "','" + @asset.asset.filename \
18
+ + "','" + File.extname(@asset.asset.to_s).gsub(".","") + "');</script>"
19
+ render :text => str
20
+ else
21
+ render :nothing => true
22
+ end
23
+ end
24
+ end
25
+
26
+ def list
27
+ order = case params[:order]
28
+ when "NAME"
29
+ "asset"
30
+ when "TYPE"
31
+ "file_type"
32
+ when "SIZE"
33
+ "file_size"
34
+ else
35
+ "id"
36
+ end
37
+ @images = Image.where("file_type LIKE '%image%'").order(order).all
38
+ @json = []
39
+ for image in @images
40
+ temp = %Q{{"filesize":#{image.file_size},
41
+ "filename":"#{image.asset.to_s}",
42
+ "dir_path":"#{image.asset.url}",
43
+ "datetime":"#{image.created_at.to_date}"}}
44
+ @json << temp
45
+ end
46
+ render :text => ("{\"file_list\":[" << @json.join(",") << "]}")
47
+ end
48
+
49
+ end
50
+
@@ -0,0 +1,14 @@
1
+ class Kindeditor::Asset < ActiveRecord::Base
2
+ set_table_name "kindeditor_assets"
3
+
4
+ validates_presence_of :asset
5
+ before_save :update_asset_attributes
6
+
7
+ private
8
+
9
+ def update_asset_attributes
10
+ self.file_size = asset.file.size
11
+ self.file_type = asset.file.content_type
12
+ end
13
+ end
14
+
@@ -0,0 +1,4 @@
1
+ class Kindeditor::File < Kindeditor::Asset
2
+ mount_uploader :asset, Kindeditor::FileUploader
3
+ end
4
+
@@ -0,0 +1,4 @@
1
+ class Kindeditor::Image < Kindeditor::Asset
2
+ mount_uploader :asset, Kindeditor::ImageUploader
3
+ end
4
+
@@ -0,0 +1,54 @@
1
+ # encoding: utf-8
2
+
3
+ class Kindeditor::FileUploader < CarrierWave::Uploader::Base
4
+
5
+ # Include RMagick or ImageScience support:
6
+ # include CarrierWave::RMagick
7
+ # include CarrierWave::ImageScience
8
+
9
+ # Choose what kind of storage to use for this uploader:
10
+ storage :file
11
+ # storage :fog
12
+
13
+ # Override the directory where uploaded files will be stored.
14
+ # This is a sensible default for uploaders that are meant to be mounted:
15
+ def store_dir
16
+ "uploads/File/#{Time.now.strftime("%Y-%m")}"
17
+ end
18
+
19
+ #def cache_dir
20
+ # "#{Rails.root}/tmp/uploads"
21
+ #end
22
+
23
+ # Provide a default URL as a default if there hasn't been a file uploaded:
24
+ # def default_url
25
+ # "/images/fallback/" + [version_name, "default.png"].compact.join('_')
26
+ # end
27
+
28
+ # Process files as they are uploaded:
29
+ # process :scale => [200, 300]
30
+ #
31
+ # def scale(width, height)
32
+ # # do something
33
+ # end
34
+
35
+ # Create different versions of your uploaded files:
36
+ # version :thumb do
37
+ # process :scale => [50, 50]
38
+ # end
39
+
40
+ # Add a white list of extensions which are allowed to be uploaded.
41
+ # For images you might use something like this:
42
+ def extension_white_list
43
+ %w(doc xls ppt docx xlsx pptx pdf txt rar zip mp3)
44
+ end
45
+
46
+ # Override the filename of the uploaded files:
47
+ # Avoid using model.id or version_name here, see uploader/store.rb for details.
48
+ def filename
49
+ @name ||= Time.now.to_date.to_s(:db) + "-" + ActiveSupport::SecureRandom.hex
50
+ "#{@name}#{File.extname(original_filename).downcase}" if original_filename
51
+ end
52
+
53
+ end
54
+
@@ -0,0 +1,54 @@
1
+ # encoding: utf-8
2
+
3
+ class Kindeditor::ImageUploader < CarrierWave::Uploader::Base
4
+
5
+ # Include RMagick or ImageScience support:
6
+ # include CarrierWave::RMagick
7
+ # include CarrierWave::ImageScience
8
+
9
+ # Choose what kind of storage to use for this uploader:
10
+ storage :file
11
+ # storage :fog
12
+
13
+ # Override the directory where uploaded files will be stored.
14
+ # This is a sensible default for uploaders that are meant to be mounted:
15
+ def store_dir
16
+ "uploads/Image/#{Time.now.strftime("%Y-%m")}"
17
+ end
18
+
19
+ #def cache_dir
20
+ # "#{Rails.root}/tmp/uploads"
21
+ #end
22
+
23
+ # Provide a default URL as a default if there hasn't been a file uploaded:
24
+ # def default_url
25
+ # "/images/fallback/" + [version_name, "default.png"].compact.join('_')
26
+ # end
27
+
28
+ # Process files as they are uploaded:
29
+ # process :scale => [200, 300]
30
+ #
31
+ # def scale(width, height)
32
+ # # do something
33
+ # end
34
+
35
+ # Create different versions of your uploaded files:
36
+ # version :thumb do
37
+ # process :scale => [50, 50]
38
+ # end
39
+
40
+ # Add a white list of extensions which are allowed to be uploaded.
41
+ # For images you might use something like this:
42
+ def extension_white_list
43
+ %w(jpg gif png bmp)
44
+ end
45
+
46
+ # Override the filename of the uploaded files:
47
+ # Avoid using model.id or version_name here, see uploader/store.rb for details.
48
+ def filename
49
+ @name ||= Time.now.to_date.to_s(:db) + "-" + ActiveSupport::SecureRandom.hex
50
+ "#{@name}#{File.extname(original_filename).downcase}" if original_filename
51
+ end
52
+
53
+ end
54
+
data/config/routes.rb ADDED
@@ -0,0 +1,7 @@
1
+ Rails::Application.routes.draw do
2
+ namespace :kindeditor do
3
+ post "/upload" => "assets#create"
4
+ get "/filemanager" => "assets#list"
5
+ end
6
+ end
7
+
@@ -0,0 +1,9 @@
1
+ Description:
2
+ Copy kindeditor files into your application
3
+
4
+ Example:
5
+ rails generate rails_kindeditor:install
6
+
7
+ This will create:
8
+ public/javascripts/kindeditor
9
+
@@ -0,0 +1,11 @@
1
+ module RailsKindeditor
2
+ class InstallGenerator < Rails::Generators::Base
3
+ source_root File.expand_path('../templates', __FILE__)
4
+ desc "Copy kindeditor files to your application."
5
+
6
+ def copy_kindeditor_files
7
+ directory "kindeditor", "public/javascripts/kindeditor"
8
+ end
9
+ end
10
+ end
11
+
@@ -0,0 +1,7 @@
1
+ KE.show({
2
+ id : 'kindeditor_id',
3
+ allowFileManager: true,
4
+ imageUploadJson : '/kindeditor/upload',
5
+ fileManagerJson: '/kindeditor/filemanager'
6
+ });
7
+
@@ -0,0 +1,4688 @@
1
+ /*******************************************************************************
2
+ * KindEditor - WYSIWYG HTML Editor for Internet
3
+ * Copyright (C) 2006-2011 Longhao Luo
4
+ *
5
+ * @author Roddy <luolonghao@gmail.com>
6
+ * @site http://www.kindsoft.net/
7
+ * @licence http://www.kindsoft.net/license.php
8
+ * @version 3.5.5 (2011-05-22)
9
+ *******************************************************************************/
10
+
11
+ (function (undefined) {
12
+
13
+ if (window.KindEditor !== undefined) return;
14
+
15
+ var KE = {};
16
+
17
+ KE.version = '3.5.5 (2011-05-22)';
18
+
19
+ KE.scriptPath = (function() {
20
+ var elements = document.getElementsByTagName('script');
21
+ for (var i = 0, len = elements.length; i < len; i++) {
22
+ var src = elements[i].src;
23
+ if (src && src.match(/kindeditor[\w\-\.]*\.js/)) {
24
+ return src.substring(0, src.lastIndexOf('/') + 1);
25
+ }
26
+ }
27
+ return '';
28
+ })();
29
+
30
+ KE.browser = (function() {
31
+ var ua = navigator.userAgent.toLowerCase();
32
+ return {
33
+ VERSION: ua.match(/(msie|firefox|webkit|opera)[\/:\s](\d+)/) ? RegExp.$2 : '0',
34
+ IE: (ua.indexOf('msie') > -1 && ua.indexOf('opera') == -1),
35
+ GECKO: (ua.indexOf('gecko') > -1 && ua.indexOf('khtml') == -1),
36
+ WEBKIT: (ua.indexOf('applewebkit') > -1),
37
+ OPERA: (ua.indexOf('opera') > -1)
38
+ };
39
+ })();
40
+
41
+ KE.setting = {
42
+ wyswygMode : true,
43
+ loadStyleMode : true,
44
+ resizeMode : 2,
45
+ filterMode : false,
46
+ autoSetDataMode : false,
47
+ shadowMode : true,
48
+ useContextmenu : true,
49
+ urlType : '',
50
+ skinType : 'default',
51
+ syncType : 'form',
52
+ newlineTag : 'p',
53
+ dialogAlignType : 'page',
54
+ cssPath : '',
55
+ skinsPath : KE.scriptPath + 'skins/',
56
+ pluginsPath : KE.scriptPath + 'plugins/',
57
+ minWidth : 200,
58
+ minHeight : 100,
59
+ minChangeSize : 5,
60
+ toolbarLineHeight : 24,
61
+ statusbarHeight : 11,
62
+ items : [
63
+ 'source', '|', 'fullscreen', 'undo', 'redo', 'print', 'cut', 'copy', 'paste',
64
+ 'plainpaste', 'wordpaste', '|', 'justifyleft', 'justifycenter', 'justifyright',
65
+ 'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript',
66
+ 'superscript', '|', 'selectall', '-',
67
+ 'title', 'fontname', 'fontsize', '|', 'textcolor', 'bgcolor', 'bold',
68
+ 'italic', 'underline', 'strikethrough', 'removeformat', '|', 'image', 'accessory',
69
+ 'flash', 'media', 'advtable', 'hr', 'emoticons', 'link', 'unlink', '|', 'about'
70
+ ],
71
+ colorTable : [
72
+ ['#E53333', '#E56600', '#FF9900', '#64451D', '#DFC5A4', '#FFE500'],
73
+ ['#009900', '#006600', '#99BB00', '#B8D100', '#60D978', '#00D5FF'],
74
+ ['#337FE5', '#003399', '#4C33E5', '#9933E5', '#CC33E5', '#EE33EE'],
75
+ ['#FFFFFF', '#CCCCCC', '#999999', '#666666', '#333333', '#000000']
76
+ ],
77
+ noEndTags : ['br', 'hr', 'img', 'area', 'col', 'embed', 'input', 'param'],
78
+ inlineTags : ['b', 'del', 'em', 'font', 'i', 'span', 'strike', 'strong', 'sub', 'sup', 'u'],
79
+ endlineTags : [
80
+ 'br', 'hr', 'table', 'tbody', 'td', 'tr', 'th', 'div', 'p', 'ol', 'ul',
81
+ 'li', 'blockquote', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'script', 'style', 'marquee'
82
+ ],
83
+ htmlTags : {
84
+ font : ['color', 'size', 'face', '.background-color'],
85
+ span : [
86
+ '.color', '.background-color', '.font-size', '.font-family', '.background',
87
+ '.font-weight', '.font-style', '.text-decoration', '.vertical-align'
88
+ ],
89
+ div : [
90
+ 'align', '.border', '.margin', '.padding', '.text-align', '.color',
91
+ '.background-color', '.font-size', '.font-family', '.font-weight', '.background',
92
+ '.font-style', '.text-decoration', '.vertical-align', '.margin-left'
93
+ ],
94
+ table: [
95
+ 'border', 'cellspacing', 'cellpadding', 'width', 'height', 'align', 'bordercolor',
96
+ '.padding', '.margin', '.border', 'bgcolor', '.text-align', '.color', '.background-color',
97
+ '.font-size', '.font-family', '.font-weight', '.font-style', '.text-decoration', '.background',
98
+ '.width', '.height'
99
+ ],
100
+ 'td,th': [
101
+ 'align', 'valign', 'width', 'height', 'colspan', 'rowspan', 'bgcolor',
102
+ '.text-align', '.color', '.background-color', '.font-size', '.font-family', '.font-weight',
103
+ '.font-style', '.text-decoration', '.vertical-align', '.background'
104
+ ],
105
+ a : ['href', 'target', 'name'],
106
+ embed : ['src', 'width', 'height', 'type', 'loop', 'autostart', 'quality', '.width', '.height', 'align', 'allowscriptaccess', '/'],
107
+ img : ['src', 'width', 'height', 'border', 'alt', 'title', '.width', '.height', '/'],
108
+ hr : ['/'],
109
+ br : ['/'],
110
+ 'p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6' : [
111
+ 'align', '.text-align', '.color', '.background-color', '.font-size', '.font-family', '.background',
112
+ '.font-weight', '.font-style', '.text-decoration', '.vertical-align', '.text-indent', '.margin-left'
113
+ ],
114
+ 'tbody,tr,strong,b,sub,sup,em,i,u,strike' : []
115
+ },
116
+ mediaTypes : {
117
+ rm : 'audio/x-pn-realaudio-plugin',
118
+ flash : 'application/x-shockwave-flash',
119
+ media : 'video/x-ms-asf-plugin'
120
+ },
121
+ afterTab : function(id) {
122
+ KE.util.setSelection(id);
123
+ KE.util.insertHtml(id, '&nbsp;&nbsp;&nbsp;&nbsp;');
124
+ }
125
+ };
126
+
127
+ KE.g = {};
128
+
129
+ KE.plugin = {};
130
+
131
+ KE.$ = function(id, doc){
132
+ var doc = doc || document;
133
+ return doc.getElementById(id);
134
+ };
135
+
136
+ KE.$$ = function(name, doc){
137
+ var doc = doc || document;
138
+ return doc.createElement(name);
139
+ };
140
+
141
+ KE.event = {
142
+ add : function(el, type, fn, id) {
143
+ if (el.addEventListener){
144
+ el.addEventListener(type, fn, false);
145
+ } else if (el.attachEvent){
146
+ el.attachEvent('on' + type, fn);
147
+ }
148
+ if (id !== undefined) {
149
+ KE.g[id].eventStack.push({
150
+ el : el,
151
+ type : type,
152
+ fn : fn
153
+ });
154
+ }
155
+ },
156
+ remove : function(el, type, fn, id) {
157
+ if (el.removeEventListener){
158
+ el.removeEventListener(type, fn, false);
159
+ } else if (el.detachEvent){
160
+ el.detachEvent('on' + type, fn);
161
+ }
162
+ if (id !== undefined) {
163
+ var stack = KE.g[id].eventStack;
164
+ for (var i = 0, len = stack.length; i < len; i++) {
165
+ var item = stack[i];
166
+ if (item && el === item.el && type === item.type && fn === item.fn) {
167
+ delete stack[i];
168
+ }
169
+ }
170
+ }
171
+ },
172
+ stopPropagation : function(e) {
173
+ if (e.stopPropagation) e.stopPropagation();
174
+ if (e.cancelBubble !== undefined) e.cancelBubble = true;
175
+ },
176
+ preventDefault : function(e) {
177
+ if (e.preventDefault) e.preventDefault();
178
+ if (e.returnValue !== undefined) e.returnValue = false;
179
+ },
180
+ stop : function(e) {
181
+ this.stopPropagation(e);
182
+ this.preventDefault(e);
183
+ },
184
+ bind : function(el, type, fn, id) {
185
+ this.add(el, type, function(e) {
186
+ fn(e);
187
+ KE.event.stop(e);
188
+ return false;
189
+ }, id);
190
+ },
191
+ input : function(el, func, id) {
192
+ this.add(el, 'keyup', function(e) {
193
+ if (!e.ctrlKey && !e.altKey && (e.keyCode < 16 || e.keyCode > 18) && e.keyCode != 116) {
194
+ func(e);
195
+ KE.event.stop(e);
196
+ return false;
197
+ }
198
+ }, id);
199
+ function handler (e) {
200
+ window.setTimeout(function() {
201
+ func(e);
202
+ }, 1);
203
+ }
204
+ var newElement = (el.nodeName == '#document') ? el.body : el;
205
+ this.add(newElement, 'paste', handler, id);
206
+ this.add(newElement, 'cut', handler, id);
207
+ },
208
+ ctrl : function(el, key, func, id) {
209
+ key = key.toString().match(/^\d{2,}$/) ? key : key.toUpperCase().charCodeAt(0);
210
+ this.add(el, 'keydown', function(e) {
211
+ if (e.ctrlKey && e.keyCode == key && !e.shiftKey && !e.altKey) {
212
+ func(e);
213
+ KE.event.stop(e);
214
+ return false;
215
+ }
216
+ }, id);
217
+ },
218
+ ready : function(func, win, doc, id) {
219
+ var win = win || window;
220
+ var doc = doc || document;
221
+ var loaded = false;
222
+ var readyFunc = function() {
223
+ if (loaded) return;
224
+ loaded = true;
225
+ func();
226
+ };
227
+ if (doc.addEventListener) {
228
+ this.add(doc, "DOMContentLoaded", readyFunc, id);
229
+ } else if (doc.attachEvent){
230
+ this.add(doc, "readystatechange", function() {
231
+ if (doc.readyState == "complete") readyFunc();
232
+ }, id);
233
+ if ( doc.documentElement.doScroll && typeof win.frameElement === "undefined" ) {
234
+ var ieReadyFunc = function() {
235
+ if (loaded) return;
236
+ try {
237
+ doc.documentElement.doScroll("left");
238
+ } catch(e) {
239
+ window.setTimeout(ieReadyFunc, 0);
240
+ return;
241
+ }
242
+ readyFunc();
243
+ };
244
+ ieReadyFunc();
245
+ }
246
+ }
247
+ this.add(win, 'load', readyFunc, id);
248
+ }
249
+ };
250
+
251
+ KE.each = function(obj, func) {
252
+ for (var key in obj) {
253
+ if (obj.hasOwnProperty(key)) func(key, obj[key]);
254
+ }
255
+ };
256
+
257
+ KE.eachNode = function(node, func) {
258
+ var walkNodes = function(parent) {
259
+ if (KE.util.getNodeType(parent) != 1) return true;
260
+ var n = parent.firstChild;
261
+ while (n) {
262
+ var next = n.nextSibling;
263
+ if (!func(n)) return false;
264
+ if (!walkNodes(n)) return false;
265
+ n = next;
266
+ }
267
+ return true;
268
+ };
269
+ walkNodes(node);
270
+ };
271
+
272
+ KE.selection = function(doc) {
273
+ this.sel = null;
274
+ this.range = null;
275
+ this.keRange = null;
276
+ this.isControl = false;
277
+ var win = doc.parentWindow || doc.defaultView;
278
+ this.init = function() {
279
+ var sel = doc.selection ? doc.selection : win.getSelection();
280
+ var range;
281
+ try {
282
+ if (sel.rangeCount > 0) range = sel.getRangeAt(0);
283
+ else range = sel.createRange();
284
+ } catch(e) {}
285
+ if (!range) range = KE.util.createRange(doc);
286
+ this.sel = sel;
287
+ this.range = range;
288
+ var startNode, startPos, endNode, endPos;
289
+ if (KE.browser.IE) {
290
+ if (range.item) {
291
+ this.isControl = true;
292
+ var el = range.item(0);
293
+ startNode = endNode = el;
294
+ startPos = endPos = 0;
295
+ } else {
296
+ this.isControl = false;
297
+ var getStartEnd = function(isStart) {
298
+ var pointRange = range.duplicate();
299
+ pointRange.collapse(isStart);
300
+ var parentNode = pointRange.parentElement();
301
+ var nodes = parentNode.childNodes;
302
+ if (nodes.length == 0) return {node: parentNode, pos: 0};
303
+ var startNode;
304
+ var endElement;
305
+ var startPos = 0;
306
+ var isEnd = false;
307
+ var testRange = range.duplicate();
308
+ KE.util.moveToElementText(testRange, parentNode);
309
+ for (var i = 0, len = nodes.length; i < len; i++) {
310
+ var node = nodes[i];
311
+ var cmp = testRange.compareEndPoints('StartToStart', pointRange);
312
+ if (cmp > 0) {
313
+ isEnd = true;
314
+ } else if (cmp == 0) {
315
+ if (node.nodeType == 1) {
316
+ var keRange = new KE.range(doc);
317
+ keRange.selectTextNode(node);
318
+ return {node: keRange.startNode, pos: 0};
319
+ } else {
320
+ return {node: node, pos: 0};
321
+ }
322
+ }
323
+ if (node.nodeType == 1) {
324
+ var nodeRange = range.duplicate();
325
+ KE.util.moveToElementText(nodeRange, node);
326
+ testRange.setEndPoint('StartToEnd', nodeRange);
327
+ if (isEnd) startPos += nodeRange.text.replace(/\r\n|\n|\r/g, '').length;
328
+ else startPos = 0;
329
+ } else if (node.nodeType == 3) {
330
+ //fix bug: typeof node.nodeValue can return "unknown" in IE.
331
+ if (typeof node.nodeValue === 'string') {
332
+ testRange.moveStart('character', node.nodeValue.length);
333
+ startPos += node.nodeValue.length;
334
+ }
335
+ }
336
+ if (!isEnd) startNode = node;
337
+ }
338
+ if (!isEnd && startNode.nodeType == 1) {
339
+ var startNode = parentNode.lastChild;
340
+ return {node: startNode, pos: startNode.nodeType == 1 ? 1 : startNode.nodeValue.length};
341
+ }
342
+ testRange = range.duplicate();
343
+ KE.util.moveToElementText(testRange, parentNode);
344
+ testRange.setEndPoint('StartToEnd', pointRange);
345
+ startPos -= testRange.text.replace(/\r\n|\n|\r/g, '').length;
346
+ return {node: startNode, pos: startPos};
347
+ };
348
+ var start = getStartEnd(true);
349
+ var end = getStartEnd(false);
350
+ startNode = start.node;
351
+ startPos = start.pos;
352
+ endNode = end.node;
353
+ endPos = end.pos;
354
+ }
355
+ } else {
356
+ startNode = range.startContainer;
357
+ startPos = range.startOffset;
358
+ endNode = range.endContainer;
359
+ endPos = range.endOffset;
360
+ if (startNode.nodeType == 1 && typeof startNode.childNodes[startPos] != 'undefined') {
361
+ startNode = startNode.childNodes[startPos];
362
+ startPos = 0;
363
+ }
364
+ if (endNode.nodeType == 1) {
365
+ endPos = endPos == 0 ? 1 : endPos;
366
+ if (typeof endNode.childNodes[endPos - 1] != 'undefined') {
367
+ endNode = endNode.childNodes[endPos - 1];
368
+ endPos = (endNode.nodeType == 1) ? 0 : endNode.nodeValue.length;
369
+ }
370
+ }
371
+ this.isControl = (startNode.nodeType == 1 && startNode === endNode && range.startOffset + 1 == range.endOffset);
372
+ if (startNode.nodeType == 1 && endNode.nodeType == 3 && endPos == 0 && endNode.previousSibling) {
373
+ var node = endNode.previousSibling;
374
+ while (node) {
375
+ if (node === startNode) {
376
+ endNode = startNode;
377
+ break;
378
+ }
379
+ if (node.childNodes.length != 1) break;
380
+ node = node.childNodes[0];
381
+ }
382
+ }
383
+ if (range.collapsed) {
384
+ var keRange = new KE.range(doc);
385
+ keRange.setTextStart(startNode, startPos);
386
+ endNode = keRange.startNode;
387
+ endPos = keRange.startPos;
388
+ }
389
+ }
390
+ var keRange = new KE.range(doc);
391
+ keRange.setTextStart(startNode, startPos);
392
+ keRange.setTextEnd(endNode, endPos);
393
+ this.keRange = keRange;
394
+ };
395
+ this.init();
396
+ this.addRange = function(keRange) {
397
+ if (KE.browser.GECKO && KE.browser.VERSION < 3) return;
398
+ this.keRange = keRange;
399
+ if (KE.browser.IE) {
400
+ var getEndRange = function(isStart) {
401
+ var range = KE.util.createRange(doc);
402
+ var node = isStart ? keRange.startNode : keRange.endNode;
403
+ if (node.nodeType == 1) {
404
+ KE.util.moveToElementText(range, node);
405
+ range.collapse(isStart);
406
+ } else if (node.nodeType == 3) {
407
+ range = KE.util.getNodeStartRange(doc, node);
408
+ var pos = isStart ? keRange.startPos : keRange.endPos;
409
+ range.moveStart('character', pos);
410
+ }
411
+ return range;
412
+ }
413
+ if (!this.range.item) {
414
+ var node = keRange.startNode;
415
+ if (node == keRange.endNode && KE.util.getNodeType(node) == 1 && KE.util.getNodeTextLength(node) == 0) {
416
+ var temp = doc.createTextNode(" ");
417
+ node.appendChild(temp);
418
+ KE.util.moveToElementText(this.range, node);
419
+ this.range.collapse(false);
420
+ this.range.select();
421
+ node.removeChild(temp);
422
+ } else {
423
+ if (node.nodeType == 3 && keRange.collapsed()) {
424
+ this.range = getEndRange(true);
425
+ this.range.collapse(true);
426
+ } else {
427
+ this.range.setEndPoint('StartToStart', getEndRange(true));
428
+ this.range.setEndPoint('EndToStart', getEndRange(false));
429
+ }
430
+ this.range.select();
431
+ }
432
+ }
433
+ } else {
434
+ var getNodePos = function(node) {
435
+ var pos = 0;
436
+ while (node) {
437
+ node = node.previousSibling;
438
+ pos++;
439
+ }
440
+ return --pos;
441
+ };
442
+ var range = new KE.range(doc);
443
+ range.setTextStart(keRange.startNode, keRange.startPos);
444
+ range.setTextEnd(keRange.endNode, keRange.endPos);
445
+ var startNode = range.startNode;
446
+ var endNode = range.endNode;
447
+ if (KE.util.getNodeType(startNode) == 88) {
448
+ this.range.setStart(startNode.parentNode, getNodePos(range.startNode));
449
+ } else {
450
+ this.range.setStart(startNode, range.startPos);
451
+ }
452
+ if (KE.util.getNodeType(endNode) == 88) {
453
+ this.range.setEnd(endNode.parentNode, getNodePos(range.endNode) + 1);
454
+ } else {
455
+ this.range.setEnd(endNode, range.endPos);
456
+ }
457
+ this.sel.removeAllRanges();
458
+ this.sel.addRange(this.range);
459
+ }
460
+ };
461
+ this.focus = function() {
462
+ if (KE.browser.IE && this.range != null) this.range.select();
463
+ }
464
+ };
465
+
466
+ KE.range = function(doc) {
467
+ this.startNode = null;
468
+ this.startPos = null;
469
+ this.endNode = null;
470
+ this.endPos = null;
471
+ this.getParentElement = function() {
472
+ var scanParent = function(node, func) {
473
+ while (node && (!node.tagName || node.tagName.toLowerCase() != 'body')) {
474
+ node = node.parentNode;
475
+ if (func(node)) return;
476
+ }
477
+ }
478
+ var nodeList = [];
479
+ scanParent(this.startNode, function(node) {
480
+ nodeList.push(node);
481
+ });
482
+ var parentNode;
483
+ scanParent(this.endNode, function(node) {
484
+ if (KE.util.inArray(node, nodeList)) {
485
+ parentNode = node;
486
+ return true;
487
+ }
488
+ });
489
+ return parentNode ? parentNode : doc.body;
490
+ };
491
+ this.getNodeList = function() {
492
+ var self = this;
493
+ var parentNode = this.getParentElement();
494
+ var nodeList = [];
495
+ var isStarted = false;
496
+ if (parentNode == self.startNode) isStarted = true;
497
+ if (isStarted) nodeList.push(parentNode);
498
+ KE.eachNode(parentNode, function(node) {
499
+ if (node == self.startNode) isStarted = true;
500
+ var range = new KE.range(doc);
501
+ range.selectTextNode(node);
502
+ var cmp = range.comparePoints('START_TO_END', self);
503
+ if (cmp > 0) {
504
+ return false;
505
+ } else if (cmp == 0) {
506
+ if (range.startNode !== range.endNode || range.startPos !== range.endPos) return false;
507
+ }
508
+ if (isStarted) nodeList.push(node);
509
+ return true;
510
+ });
511
+ return nodeList;
512
+ };
513
+ this.comparePoints = function(how, range) {
514
+ var compareNodes = function(nodeA, posA, nodeB, posB) {
515
+ var cmp;
516
+ if (KE.browser.IE) {
517
+ var getStartRange = function(node, pos, isStart) {
518
+ var range = KE.util.createRange(doc);
519
+ var type = KE.util.getNodeType(node);
520
+ if (type == 1) {
521
+ KE.util.moveToElementText(range, node);
522
+ range.collapse(isStart);
523
+ } else if (type == 3) {
524
+ range = KE.util.getNodeStartRange(doc, node);
525
+ range.moveStart('character', pos);
526
+ range.collapse(true);
527
+ }
528
+ return range;
529
+ }
530
+ var rangeA, rangeB;
531
+ if (how == 'START_TO_START' || how == 'START_TO_END') rangeA = getStartRange(nodeA, posA, true);
532
+ else rangeA = getStartRange(nodeA, posA, false);
533
+ if (how == 'START_TO_START' || how == 'END_TO_START') rangeB = getStartRange(nodeB, posB, true);
534
+ else rangeB = getStartRange(nodeB, posB, false);
535
+ return rangeA.compareEndPoints('StartToStart', rangeB);
536
+ } else {
537
+ var rangeA = KE.util.createRange(doc);
538
+ rangeA.selectNode(nodeA);
539
+ if (how == 'START_TO_START' || how == 'START_TO_END') rangeA.collapse(true);
540
+ else rangeA.collapse(false);
541
+ var rangeB = KE.util.createRange(doc);
542
+ rangeB.selectNode(nodeB);
543
+ if (how == 'START_TO_START' || how == 'END_TO_START') rangeB.collapse(true);
544
+ else rangeB.collapse(false);
545
+ if (rangeA.compareBoundaryPoints(Range.START_TO_START, rangeB) > 0) {
546
+ cmp = 1;
547
+ } else if (rangeA.compareBoundaryPoints(Range.START_TO_START, rangeB) == 0) {
548
+ if (posA > posB) cmp = 1;
549
+ else if (posA == posB) cmp = 0;
550
+ else cmp = -1;
551
+ } else {
552
+ cmp = -1;
553
+ }
554
+ }
555
+ return cmp;
556
+ }
557
+ if (how == 'START_TO_START') return compareNodes(this.startNode, this.startPos, range.startNode, range.startPos);
558
+ if (how == 'START_TO_END') return compareNodes(this.startNode, this.startPos, range.endNode, range.endPos);
559
+ if (how == 'END_TO_START') return compareNodes(this.endNode, this.endPos, range.startNode, range.startPos);
560
+ if (how == 'END_TO_END') return compareNodes(this.endNode, this.endPos, range.endNode, range.endPos);
561
+ };
562
+ this.collapsed = function() {
563
+ return (this.startNode === this.endNode && this.startPos === this.endPos);
564
+ };
565
+ this.collapse = function(toStart) {
566
+ if (toStart) {
567
+ this.setEnd(this.startNode, this.startPos);
568
+ } else {
569
+ this.setStart(this.endNode, this.endPos);
570
+ }
571
+ };
572
+ this.setTextStart = function(node, pos) {
573
+ var textNode = node;
574
+ KE.eachNode(node, function(n) {
575
+ if (KE.util.getNodeType(n) == 3 && n.nodeValue.length > 0 || KE.util.getNodeType(n) == 88) {
576
+ textNode = n;
577
+ pos = 0;
578
+ return false;
579
+ }
580
+ return true;
581
+ });
582
+ this.setStart(textNode, pos);
583
+ };
584
+ this.setStart = function(node, pos) {
585
+ this.startNode = node;
586
+ this.startPos = pos;
587
+ if (this.endNode === null) {
588
+ this.endNode = node;
589
+ this.endPos = pos;
590
+ }
591
+ };
592
+ this.setTextEnd = function(node, pos) {
593
+ var textNode = node;
594
+ KE.eachNode(node, function(n) {
595
+ if (KE.util.getNodeType(n) == 3 && n.nodeValue.length > 0 || KE.util.getNodeType(n) == 88) {
596
+ textNode = n;
597
+ pos = KE.util.getNodeType(n) == 3 ? n.nodeValue.length : 0;
598
+ }
599
+ return true;
600
+ });
601
+ this.setEnd(textNode, pos);
602
+ };
603
+ this.setEnd = function(node, pos) {
604
+ this.endNode = node;
605
+ this.endPos = pos;
606
+ if (this.startNode === null) {
607
+ this.startNode = node;
608
+ this.startPos = pos;
609
+ }
610
+ };
611
+ this.selectNode = function(node) {
612
+ this.setStart(node, 0);
613
+ this.setEnd(node, node.nodeType == 1 ? 0 : node.nodeValue.length);
614
+ };
615
+ this.selectTextNode = function(node) {
616
+ this.setTextStart(node, 0);
617
+ this.setTextEnd(node, node.nodeType == 1 ? 0 : node.nodeValue.length);
618
+ };
619
+ this.extractContents = function(isDelete) {
620
+ isDelete = (isDelete === undefined) ? true : isDelete;
621
+ var thisRange = this;
622
+ var startNode = this.startNode;
623
+ var startPos = this.startPos;
624
+ var endNode = this.endNode;
625
+ var endPos = this.endPos;
626
+ var removedNodes = [];
627
+ function extractTextNode(node, startPos, endPos) {
628
+ var length = node.nodeValue.length;
629
+ var cloneNode = node.cloneNode(true);
630
+ var centerNode = cloneNode.splitText(startPos);
631
+ centerNode.splitText(endPos - startPos);
632
+ if (isDelete) {
633
+ var center = node;
634
+ if (startPos > 0) center = node.splitText(startPos);
635
+ if (endPos < length) center.splitText(endPos - startPos);
636
+ removedNodes.push(center);
637
+ }
638
+ return centerNode;
639
+ };
640
+ var noEndTagHash = KE.util.arrayToHash(KE.setting.noEndTags);
641
+ var isStarted = false;
642
+ var isEnd = false;
643
+ function extractNodes(parent, frag) {
644
+ if (KE.util.getNodeType(parent) != 1) return true;
645
+ var node = parent.firstChild;
646
+ while (node) {
647
+ if (node == startNode) isStarted = true;
648
+ if (node == endNode) isEnd = true;
649
+ var nextNode = node.nextSibling;
650
+ var type = node.nodeType;
651
+ if (type == 1) {
652
+ var range = new KE.range(doc);
653
+ range.selectNode(node);
654
+ var cmp = range.comparePoints('END_TO_END', thisRange);
655
+ if (isStarted && (cmp < 0 || (cmp == 0 && noEndTagHash[node.nodeName.toLowerCase()] !== undefined))) {
656
+ var cloneNode = node.cloneNode(true);
657
+ frag.appendChild(cloneNode);
658
+ if (isDelete) {
659
+ node.parentNode.removeChild(node);
660
+ }
661
+ } else {
662
+ var childFlag = node.cloneNode(false);
663
+ if (noEndTagHash[childFlag.nodeName.toLowerCase()] === undefined) {
664
+ frag.appendChild(childFlag);
665
+ if (!extractNodes(node, childFlag)) return false;
666
+ }
667
+ }
668
+ } else if (type == 3) {
669
+ if (isStarted) {
670
+ var textNode;
671
+ if (node == startNode && node == endNode) {
672
+ textNode = extractTextNode(node, startPos, endPos);
673
+ frag.appendChild(textNode);
674
+ return false;
675
+ } else if (node == startNode) {
676
+ textNode = extractTextNode(node, startPos, node.nodeValue.length);
677
+ frag.appendChild(textNode);
678
+ } else if (node == endNode) {
679
+ textNode = extractTextNode(node, 0, endPos);
680
+ frag.appendChild(textNode);
681
+ return false;
682
+ } else {
683
+ textNode = extractTextNode(node, 0, node.nodeValue.length);
684
+ frag.appendChild(textNode);
685
+ }
686
+ }
687
+ }
688
+ node = nextNode;
689
+ if (isEnd) return false;
690
+ }
691
+ if (frag.innerHTML.replace(/<.*?>/g, '') === '' && frag.parentNode) {
692
+ frag.parentNode.removeChild(frag);
693
+ }
694
+ return true;
695
+ }
696
+ var parentNode = this.getParentElement();
697
+ var docFrag = parentNode.cloneNode(false);
698
+ extractNodes(parentNode, docFrag);
699
+ KE.each(removedNodes, function(key, val) {
700
+ if (val.nodeType != 3 || val.nodeValue.length > 0) {
701
+ val.parentNode.removeChild(val);
702
+ }
703
+ });
704
+ return docFrag;
705
+ };
706
+ this.cloneContents = function() {
707
+ return this.extractContents(false);
708
+ };
709
+ this.getText = function() {
710
+ var html = this.cloneContents().innerHTML;
711
+ return html.replace(/<.*?>/g, "");
712
+ };
713
+ };
714
+
715
+ KE.cmd = function(id) {
716
+ this.doc = KE.g[id].iframeDoc;
717
+ this.keSel = KE.g[id].keSel;
718
+ this.keRange = KE.g[id].keRange;
719
+ this.mergeAttributes = function(el, attr) {
720
+ for (var i = 0, len = attr.length; i < len; i++) {
721
+ KE.each(attr[i], function(key, value) {
722
+ if (key.charAt(0) == '.') {
723
+ var jsKey = KE.util.getJsKey(key.substr(1));
724
+ el.style[jsKey] = value;
725
+ } else {
726
+ if (KE.browser.IE && KE.browser.VERSION < 8 && key == 'class') key = 'className';
727
+ el.setAttribute(key, value);
728
+ }
729
+ });
730
+ }
731
+ return el;
732
+ };
733
+ this.wrapTextNode = function(node, startPos, endPos, element, attributes) {
734
+ var length = node.nodeValue.length;
735
+ var isFull = (startPos == 0 && endPos == length);
736
+ var range = new KE.range(this.doc);
737
+ range.selectTextNode(node.parentNode);
738
+ if (isFull &&
739
+ node.parentNode.tagName == element.tagName &&
740
+ range.comparePoints('END_TO_END', this.keRange) <= 0 &&
741
+ range.comparePoints('START_TO_START', this.keRange) >= 0) {
742
+ this.mergeAttributes(node.parentNode, attributes);
743
+ return node;
744
+ } else {
745
+ var el = element.cloneNode(true);
746
+ if (isFull) {
747
+ var cloneNode = node.cloneNode(true);
748
+ el.appendChild(cloneNode);
749
+ node.parentNode.replaceChild(el, node);
750
+ return cloneNode;
751
+ } else {
752
+ var centerNode = node;
753
+ if (startPos < endPos) {
754
+ if (startPos > 0) centerNode = node.splitText(startPos);
755
+ if (endPos < length) centerNode.splitText(endPos - startPos);
756
+ var cloneNode = centerNode.cloneNode(true);
757
+ el.appendChild(cloneNode);
758
+ centerNode.parentNode.replaceChild(el, centerNode);
759
+ return cloneNode;
760
+ } else {
761
+ if (startPos < length) {
762
+ centerNode = node.splitText(startPos);
763
+ centerNode.parentNode.insertBefore(el, centerNode);
764
+ } else {
765
+ if (centerNode.nextSibling) {
766
+ centerNode.parentNode.insertBefore(el, centerNode.nextSibling);
767
+ } else {
768
+ centerNode.parentNode.appendChild(el);
769
+ }
770
+ }
771
+ return el;
772
+ }
773
+ }
774
+ }
775
+ };
776
+ this.wrap = function(tagName, attributes) {
777
+ attributes = attributes || [];
778
+ var self = this;
779
+ this.keSel.focus();
780
+ var element = KE.$$(tagName, this.doc);
781
+ this.mergeAttributes(element, attributes);
782
+ var keRange = this.keRange;
783
+ var startNode = keRange.startNode;
784
+ var startPos = keRange.startPos;
785
+ var endNode = keRange.endNode;
786
+ var endPos = keRange.endPos;
787
+ var parentNode = keRange.getParentElement();
788
+ if (KE.util.inMarquee(parentNode)) return;
789
+ var isStarted = false;
790
+ KE.eachNode(parentNode, function(node) {
791
+ if (node == startNode) isStarted = true;
792
+ if (node.nodeType == 1) {
793
+ if (node == startNode && node == endNode) {
794
+ if (KE.util.inArray(node.tagName.toLowerCase(), KE.g[id].noEndTags)) {
795
+ if (startPos > 0) node.parentNode.appendChild(element);
796
+ else node.parentNode.insertBefore(element, node);
797
+ } else {
798
+ node.appendChild(element);
799
+ }
800
+ keRange.selectNode(element);
801
+ return false;
802
+ } else if (node == startNode) {
803
+ keRange.setStart(node, 0);
804
+ } else if (node == endNode) {
805
+ keRange.setEnd(node, 0);
806
+ return false;
807
+ }
808
+ } else if (node.nodeType == 3) {
809
+ if (isStarted) {
810
+ if (node == startNode && node == endNode) {
811
+ var rangeNode = self.wrapTextNode(node, startPos, endPos, element, attributes);
812
+ keRange.selectNode(rangeNode);
813
+ return false;
814
+ } else if (node == startNode) {
815
+ var rangeNode = self.wrapTextNode(node, startPos, node.nodeValue.length, element, attributes);
816
+ keRange.setStart(rangeNode, 0);
817
+ } else if (node == endNode) {
818
+ var rangeNode = self.wrapTextNode(node, 0, endPos, element, attributes);
819
+ keRange.setEnd(rangeNode, rangeNode.nodeType == 1 ? 0 : rangeNode.nodeValue.length);
820
+ return false;
821
+ } else {
822
+ self.wrapTextNode(node, 0, node.nodeValue.length, element, attributes);
823
+ }
824
+ }
825
+ }
826
+ return true;
827
+ });
828
+ this.keSel.addRange(keRange);
829
+ };
830
+ this.getTopParent = function(tagNames, node) {
831
+ var parent = null;
832
+ while (node) {
833
+ node = node.parentNode;
834
+ if (KE.util.inArray(node.tagName.toLowerCase(), tagNames)) {
835
+ parent = node;
836
+ } else {
837
+ break;
838
+ }
839
+ }
840
+ return parent;
841
+ };
842
+ this.splitNodeParent = function(parent, node, pos) {
843
+ var leftRange = new KE.range(this.doc);
844
+ leftRange.selectNode(parent.firstChild);
845
+ leftRange.setEnd(node, pos);
846
+ var leftFrag = leftRange.extractContents();
847
+ parent.parentNode.insertBefore(leftFrag, parent);
848
+ return {left : leftFrag, right : parent};
849
+ };
850
+ this.remove = function(tags) {
851
+ var self = this;
852
+ var keRange = this.keRange;
853
+ var startNode = keRange.startNode;
854
+ var startPos = keRange.startPos;
855
+ var endNode = keRange.endNode;
856
+ var endPos = keRange.endPos;
857
+ this.keSel.focus();
858
+ if (KE.util.inMarquee(keRange.getParentElement())) return;
859
+ var isCollapsed = (keRange.getText().replace(/\s+/g, '') === '');
860
+ if (isCollapsed && !KE.browser.IE) return;
861
+ var tagNames = [];
862
+ KE.each(tags, function(key, val) {
863
+ if (key != '*') tagNames.push(key);
864
+ });
865
+ var startParent = this.getTopParent(tagNames, startNode);
866
+ var endParent = this.getTopParent(tagNames, endNode);
867
+ if (startParent) {
868
+ var startFrags = this.splitNodeParent(startParent, startNode, startPos);
869
+ keRange.setStart(startFrags.right, 0);
870
+ if (startNode == endNode && KE.util.getNodeTextLength(startFrags.right) > 0) {
871
+ keRange.selectNode(startFrags.right);
872
+ var range = new KE.range(this.doc);
873
+ range.selectTextNode(startFrags.left);
874
+ if (startPos > 0) endPos -= range.endNode.nodeValue.length;
875
+ range.selectTextNode(startFrags.right);
876
+ endNode = range.startNode;
877
+ }
878
+ }
879
+ if (isCollapsed) {
880
+ var node = keRange.startNode;
881
+ if (node.nodeType == 1) {
882
+ if (node.nodeName.toLowerCase() == 'br') return;
883
+ keRange.selectNode(node);
884
+ } else {
885
+ return;
886
+ }
887
+ } else if (endParent) {
888
+ var endFrags = this.splitNodeParent(endParent, endNode, endPos);
889
+ keRange.setEnd(endFrags.left, 0);
890
+ if (startParent == endParent) {
891
+ keRange.setStart(endFrags.left, 0);
892
+ }
893
+ }
894
+ var removeAttr = function(node, attr) {
895
+ if (attr.charAt(0) == '.') {
896
+ var jsKey = KE.util.getJsKey(attr.substr(1));
897
+ node.style[jsKey] = '';
898
+ } else {
899
+ if (KE.browser.IE && KE.browser.VERSION < 8 && attr == 'class') attr = 'className';
900
+ node.removeAttribute(attr);
901
+ }
902
+ };
903
+ var nodeList = keRange.getNodeList();
904
+ keRange.setTextStart(keRange.startNode, keRange.startPos);
905
+ keRange.setTextEnd(keRange.endNode, keRange.endPos);
906
+ for (var i = 0, length = nodeList.length; i < length; i++) {
907
+ var node = nodeList[i];
908
+ if (node.nodeType == 1) {
909
+ var tagName = node.tagName.toLowerCase();
910
+ if (tags[tagName]) {
911
+ var attr = tags[tagName];
912
+ for (var j = 0, len = attr.length; j < len; j++) {
913
+ if (attr[j] == '*') {
914
+ KE.util.removeParent(node);
915
+ break;
916
+ } else {
917
+ removeAttr(node, attr[j]);
918
+ var attrs = [];
919
+ if (node.outerHTML) {
920
+ attrHash = KE.util.getAttrList(node.outerHTML);
921
+ KE.each(attrHash, function(key, val) {
922
+ attrs.push({
923
+ name : key,
924
+ value : val
925
+ });
926
+ });
927
+ } else {
928
+ attrs = node.attributes;
929
+ }
930
+ if (attrs.length == 0) {
931
+ KE.util.removeParent(node);
932
+ break;
933
+ } else if (attrs[0].name == 'style' && attrs[0].value === '') {
934
+ KE.util.removeParent(node);
935
+ break;
936
+ }
937
+ }
938
+ }
939
+ }
940
+ if (tags['*']) {
941
+ var attr = tags['*'];
942
+ for (var j = 0, len = attr.length; j < len; j++) {
943
+ removeAttr(node, attr[j]);
944
+ }
945
+ }
946
+ }
947
+ }
948
+ try {
949
+ this.keSel.addRange(keRange);
950
+ } catch(e) {}
951
+ };
952
+ };
953
+
954
+ KE.format = {
955
+ getUrl : function(url, mode, host, pathname) {
956
+ if (!mode) return url;
957
+ mode = mode.toLowerCase();
958
+ if (!KE.util.inArray(mode, ['absolute', 'relative', 'domain'])) return url;
959
+ host = host || location.protocol + '//' + location.host;
960
+ if (pathname === undefined) {
961
+ var m = location.pathname.match(/^(\/.*)\//);
962
+ pathname = m ? m[1] : '';
963
+ }
964
+ var matches = url.match(/^(\w+:\/\/[^\/]*)/);
965
+ if (matches) {
966
+ if (matches[1] !== host) return url;
967
+ } else if (url.match(/^\w+:/)) {
968
+ return url;
969
+ }
970
+ var getRealPath = function(path) {
971
+ var parts = path.split('/');
972
+ paths = [];
973
+ for (var i = 0, len = parts.length; i < len; i++) {
974
+ var part = parts[i];
975
+ if (part == '..') {
976
+ if (paths.length > 0) paths.pop();
977
+ } else if (part !== '' && part != '.') {
978
+ paths.push(part);
979
+ }
980
+ }
981
+ return '/' + paths.join('/');
982
+ };
983
+ if (url.match(/^\//)) {
984
+ url = host + getRealPath(url.substr(1));
985
+ } else if (!url.match(/^\w+:\/\//)) {
986
+ url = host + getRealPath(pathname + '/' + url);
987
+ }
988
+ if (mode == 'relative') {
989
+ var getRelativePath = function(path, depth) {
990
+ if (url.substr(0, path.length) === path) {
991
+ var arr = [];
992
+ for (var i = 0; i < depth; i++) {
993
+ arr.push('..');
994
+ }
995
+ var prefix = '.';
996
+ if (arr.length > 0) prefix += '/' + arr.join('/');
997
+ if (pathname == '/') prefix += '/';
998
+ return prefix + url.substr(path.length);
999
+ } else {
1000
+ var m = path.match(/^(.*)\//);
1001
+ if (m) {
1002
+ return getRelativePath(m[1], ++depth);
1003
+ }
1004
+ }
1005
+ };
1006
+ url = getRelativePath(host + pathname, 0).substr(2);
1007
+ } else if (mode == 'absolute') {
1008
+ if (url.substr(0, host.length) === host) {
1009
+ url = url.substr(host.length);
1010
+ }
1011
+ }
1012
+ return url;
1013
+ },
1014
+ getHtml : function(html, htmlTags, urlType) {
1015
+ var isFilter = htmlTags ? true : false;
1016
+ html = html.replace(/(<pre[^>]*>)([\s\S]*?)(<\/pre>)/ig, function($0, $1, $2, $3){
1017
+ return $1 + $2.replace(/<br[^>]*>/ig, '\n') + $3;
1018
+ });
1019
+ var htmlTagHash = {};
1020
+ var fontSizeHash = ['xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'];
1021
+ if (isFilter) {
1022
+ KE.each(htmlTags, function(key, val) {
1023
+ var arr = key.split(',');
1024
+ for (var i = 0, len = arr.length; i < len; i++) htmlTagHash[arr[i]] = KE.util.arrayToHash(val);
1025
+ });
1026
+ }
1027
+ var skipFlag = false;
1028
+ var noEndTagHash = KE.util.arrayToHash(KE.setting.noEndTags);
1029
+ var inlineTagHash = KE.util.arrayToHash(KE.setting.inlineTags);
1030
+ var endlineTagHash = KE.util.arrayToHash(KE.setting.endlineTags);
1031
+ var re = /((?:\r\n|\n|\r)*)<(\/)?([\w\-:]+)((?:\s+|(?:\s+[\w\-:]+)|(?:\s+[\w\-:]+=[^\s"'<>]+)|(?:\s+[\w\-:]+="[^"]*")|(?:\s+[\w\-:]+='[^']*'))*)(\/)?>((?:\r\n|\n|\r)*)/g;
1032
+ html = html.replace(re, function($0, $1, $2, $3, $4, $5, $6) {
1033
+ var startNewline = $1 || '';
1034
+ var startSlash = $2 || '';
1035
+ var tagName = $3.toLowerCase();
1036
+ var attr = $4 || '';
1037
+ var endSlash = $5 ? ' ' + $5 : '';
1038
+ var endNewline = $6 || '';
1039
+ if (tagName === 'script' && startSlash !== '') skipFlag = false;
1040
+ if (skipFlag) return $0;
1041
+ if (tagName === 'script' && startSlash === '') skipFlag = true;
1042
+ if (isFilter && typeof htmlTagHash[tagName] == "undefined") return '';
1043
+ if (endSlash === '' && typeof noEndTagHash[tagName] != "undefined") endSlash = ' /';
1044
+ if (tagName in endlineTagHash) {
1045
+ if (startSlash || endSlash) endNewline = '\n';
1046
+ } else {
1047
+ if (endNewline) endNewline = ' ';
1048
+ }
1049
+ if (tagName !== 'script' && tagName !== 'style') {
1050
+ startNewline = '';
1051
+ }
1052
+ if (tagName === 'font') {
1053
+ var style = {}, styleStr = '';
1054
+ attr = attr.replace(/\s*([\w\-:]+)=([^\s"'<>]+|"[^"]*"|'[^']*')/g, function($0, $1, $2) {
1055
+ var key = $1.toLowerCase();
1056
+ var val = $2 || '';
1057
+ val = val.replace(/^["']|["']$/g, '');
1058
+ if (key === 'color') {
1059
+ style['color'] = val;
1060
+ return ' ';
1061
+ }
1062
+ if (key === 'size') {
1063
+ style['font-size'] = fontSizeHash[parseInt(val) - 1] || '';
1064
+ return ' ';
1065
+ }
1066
+ if (key === 'face') {
1067
+ style['font-family'] = val;
1068
+ return ' ';
1069
+ }
1070
+ if (key === 'style') {
1071
+ styleStr = val;
1072
+ return ' ';
1073
+ }
1074
+ return $0;
1075
+ });
1076
+ if (styleStr && !/;$/.test(styleStr)) styleStr += ';';
1077
+ KE.each(style, function(key, val) {
1078
+ if (val !== '') {
1079
+ if (/\s/.test(val)) val = "'" + val + "'";
1080
+ styleStr += key + ':' + val + ';';
1081
+ }
1082
+ });
1083
+ if (styleStr) attr += ' style="' + styleStr + '"';
1084
+ tagName = 'span';
1085
+ }
1086
+ if (attr !== '') {
1087
+ attr = attr.replace(/\s*([\w\-:]+)=([^\s"'<>]+|"[^"]*"|'[^']*')/g, function($0, $1, $2) {
1088
+ var key = $1.toLowerCase();
1089
+ var val = $2 || '';
1090
+ if (isFilter) {
1091
+ if (key.charAt(0) === "." || (key !== "style" && typeof htmlTagHash[tagName][key] == "undefined")) return ' ';
1092
+ }
1093
+ if (val === '') {
1094
+ val = '""';
1095
+ } else {
1096
+ if (key === "style") {
1097
+ val = val.substr(1, val.length - 2);
1098
+ val = val.replace(/\s*([^\s]+?)\s*:(.*?)(;|$)/g, function($0, $1, $2) {
1099
+ var k = $1.toLowerCase();
1100
+ if (isFilter) {
1101
+ if (typeof htmlTagHash[tagName]['style'] == "undefined" && typeof htmlTagHash[tagName]['.' + k] == "undefined") return '';
1102
+ }
1103
+ var v = KE.util.trim($2);
1104
+ v = KE.util.rgbToHex(v);
1105
+ return k + ':' + v + ';';
1106
+ });
1107
+ val = KE.util.trim(val);
1108
+ if (val === '') return '';
1109
+ val = '"' + val + '"';
1110
+ }
1111
+ if (KE.util.inArray(key, ['src', 'href'])) {
1112
+ if (val.charAt(0) === '"') {
1113
+ val = val.substr(1, val.length - 2);
1114
+ }
1115
+ val = KE.format.getUrl(val, urlType);
1116
+ }
1117
+ if (val.charAt(0) !== '"') val = '"' + val + '"';
1118
+ }
1119
+ return ' ' + key + '=' + val + ' ';
1120
+ });
1121
+ attr = attr.replace(/\s+(checked|selected|disabled|readonly)(\s+|$)/ig, function($0, $1) {
1122
+ var key = $1.toLowerCase();
1123
+ if (isFilter) {
1124
+ if (key.charAt(0) === "." || typeof htmlTagHash[tagName][key] == "undefined") return ' ';
1125
+ }
1126
+ return ' ' + key + '="' + key + '"' + ' ';
1127
+ });
1128
+ attr = KE.util.trim(attr);
1129
+ attr = attr.replace(/\s+/g, ' ');
1130
+ if (attr) attr = ' ' + attr;
1131
+ return startNewline + '<' + startSlash + tagName + attr + endSlash + '>' + endNewline;
1132
+ } else {
1133
+ return startNewline + '<' + startSlash + tagName + endSlash + '>' + endNewline;
1134
+ }
1135
+ });
1136
+ if (!KE.browser.IE) {
1137
+ html = html.replace(/<p><br\s+\/>\n<\/p>/ig, '<p>&nbsp;</p>');
1138
+ html = html.replace(/<br\s+\/>\n<\/p>/ig, '</p>');
1139
+ }
1140
+ html = html.replace(/\u200B/g, '');
1141
+ var reg = KE.setting.inlineTags.join('|');
1142
+ var trimHtml = function(inHtml) {
1143
+ var outHtml = inHtml.replace(new RegExp('<(' + reg + ')[^>]*><\\/(' + reg + ')>', 'ig'), function($0, $1, $2) {
1144
+ if ($1 == $2) return '';
1145
+ else return $0;
1146
+ });
1147
+ if (inHtml !== outHtml) outHtml = trimHtml(outHtml);
1148
+ return outHtml;
1149
+ };
1150
+ return KE.util.trim(trimHtml(html));
1151
+ }
1152
+ };
1153
+
1154
+ KE.attr = function(el, key, val) {
1155
+ if (KE.browser.IE && KE.browser.VERSION < 8 && key.toLowerCase() == 'class') key = 'className';
1156
+ val = '' + val;
1157
+ el.setAttribute(key, val);
1158
+ if (val === '') el.removeAttribute(key);
1159
+ };
1160
+
1161
+ KE.addClass = function(el, className) {
1162
+ if (typeof el == 'object') {
1163
+ var cls = el.className;
1164
+ if (cls) {
1165
+ if ((' ' + cls + ' ').indexOf(' ' + className + ' ') < 0) {
1166
+ el.className = cls + ' ' + className;
1167
+ }
1168
+ } else {
1169
+ el.className = className;
1170
+ }
1171
+ } else if (typeof el == 'string') {
1172
+ if (/\s+class\s*=/.test(el)) {
1173
+ el = el.replace(/(\s+class=["']?)([^"']*)(["']?[\s>])/, function($0, $1, $2, $3) {
1174
+ if ((' ' + $2 + ' ').indexOf(' ' + className + ' ') < 0) {
1175
+ return $2 === '' ? $1 + className + $3 : $1 + $2 + ' ' + className + $3;
1176
+ } else {
1177
+ return $0;
1178
+ }
1179
+ });
1180
+ } else {
1181
+ el = el.substr(0, el.length - 1) + ' class="' + className + '">';
1182
+ }
1183
+ }
1184
+ return el;
1185
+ };
1186
+
1187
+ KE.removeClass = function(el, className) {
1188
+ var cls = el.className || '';
1189
+ cls = ' ' + cls + ' ';
1190
+ className = ' ' + className + ' ';
1191
+ if (cls.indexOf(className) >= 0) {
1192
+ cls = KE.util.trim(cls.replace(new RegExp(className, 'ig'), ''));
1193
+ if (cls === '') {
1194
+ var key = el.getAttribute('class') ? 'class' : 'className';
1195
+ el.removeAttribute(key);
1196
+ } else {
1197
+ el.className = cls;
1198
+ }
1199
+ }
1200
+ return el;
1201
+ };
1202
+
1203
+ KE.getComputedStyle = function(el, key) {
1204
+ var doc = el.ownerDocument,
1205
+ win = doc.parentWindow || doc.defaultView,
1206
+ jsKey = KE.util.getJsKey(key),
1207
+ val = '';
1208
+ if (win.getComputedStyle) {
1209
+ var style = win.getComputedStyle(el, null);
1210
+ val = style[jsKey] || style.getPropertyValue(key) || el.style[jsKey];
1211
+ } else if (el.currentStyle) {
1212
+ val = el.currentStyle[jsKey] || el.style[jsKey];
1213
+ }
1214
+ return val;
1215
+ };
1216
+
1217
+ KE.getCommonAncestor = function(keSel, tagName) {
1218
+ var range = keSel.range,
1219
+ keRange = keSel.keRange,
1220
+ startNode = keRange.startNode,
1221
+ endNode = keRange.endNode;
1222
+ if (KE.util.inArray(tagName, ['table', 'td', 'tr'])) {
1223
+ if (KE.browser.IE) {
1224
+ if (range.item) {
1225
+ if (range.item(0).nodeName.toLowerCase() === tagName) {
1226
+ startNode = endNode = range.item(0);
1227
+ }
1228
+ } else {
1229
+ var rangeA = range.duplicate();
1230
+ rangeA.collapse(true);
1231
+ var rangeB = range.duplicate();
1232
+ rangeB.collapse(false);
1233
+ startNode = rangeA.parentElement();
1234
+ endNode = rangeB.parentElement();
1235
+ }
1236
+ } else {
1237
+ var rangeA = range.cloneRange();
1238
+ rangeA.collapse(true);
1239
+ var rangeB = range.cloneRange();
1240
+ rangeB.collapse(false);
1241
+ startNode = rangeA.startContainer;
1242
+ endNode = rangeB.startContainer;
1243
+ }
1244
+ }
1245
+ function find(node) {
1246
+ while (node) {
1247
+ if (node.nodeType == 1) {
1248
+ if (node.tagName.toLowerCase() === tagName) return node;
1249
+ }
1250
+ node = node.parentNode;
1251
+ }
1252
+ return null;
1253
+ };
1254
+ var start = find(startNode),
1255
+ end = find(endNode);
1256
+ if (start && end && start === end) {
1257
+ return start;
1258
+ }
1259
+ return null;
1260
+ };
1261
+
1262
+ KE.queryCommandValue = function(doc, cmd) {
1263
+ cmd = cmd.toLowerCase();
1264
+ function commandValue() {
1265
+ var val = doc.queryCommandValue(cmd);
1266
+ if (typeof val !== 'string') val = '';
1267
+ return val;
1268
+ }
1269
+ var val = '';
1270
+ if (cmd === 'fontname') {
1271
+ val = commandValue();
1272
+ val = val.replace(/['"]/g, '');
1273
+ } else if (cmd === 'formatblock') {
1274
+ val = commandValue();
1275
+ if (val === '') {
1276
+ var keSel = new KE.selection(doc);
1277
+ var el = KE.getCommonAncestor(keSel, 'h1');
1278
+ if (!el) el = KE.getCommonAncestor(keSel, 'h2');
1279
+ if (!el) el = KE.getCommonAncestor(keSel, 'h3');
1280
+ if (!el) el = KE.getCommonAncestor(keSel, 'h4');
1281
+ if (!el) el = KE.getCommonAncestor(keSel, 'p');
1282
+ if (el) val = el.nodeName;
1283
+ }
1284
+ if (val === 'Normal') val = 'p';
1285
+ } else if (cmd === 'fontsize') {
1286
+ var keSel = new KE.selection(doc);
1287
+ var el = KE.getCommonAncestor(keSel, 'span');
1288
+ if (el) val = KE.getComputedStyle(el, 'font-size');
1289
+ } else if (cmd === 'textcolor') {
1290
+ var keSel = new KE.selection(doc);
1291
+ var el = KE.getCommonAncestor(keSel, 'span');
1292
+ if (el) val = KE.getComputedStyle(el, 'color');
1293
+ val = KE.util.rgbToHex(val);
1294
+ if (val === '') val = 'default';
1295
+ } else if (cmd === 'bgcolor') {
1296
+ var keSel = new KE.selection(doc);
1297
+ var el = KE.getCommonAncestor(keSel, 'span');
1298
+ if (el) val = KE.getComputedStyle(el, 'background-color');
1299
+ val = KE.util.rgbToHex(val);
1300
+ if (val === '') val = 'default';
1301
+ }
1302
+ return val.toLowerCase();
1303
+ };
1304
+
1305
+ KE.util = {
1306
+ getDocumentElement : function(doc) {
1307
+ doc = doc || document;
1308
+ return (doc.compatMode != "CSS1Compat") ? doc.body : doc.documentElement;
1309
+ },
1310
+ getDocumentHeight : function(doc) {
1311
+ var el = this.getDocumentElement(doc);
1312
+ return Math.max(el.scrollHeight, el.clientHeight);
1313
+ },
1314
+ getDocumentWidth : function(doc) {
1315
+ var el = this.getDocumentElement(doc);
1316
+ return Math.max(el.scrollWidth, el.clientWidth);
1317
+ },
1318
+ createTable : function(doc) {
1319
+ var table = KE.$$('table', doc);
1320
+ table.cellPadding = 0;
1321
+ table.cellSpacing = 0;
1322
+ table.border = 0;
1323
+ return {table: table, cell: table.insertRow(0).insertCell(0)};
1324
+ },
1325
+ loadStyle : function(path) {
1326
+ var link = KE.$$('link');
1327
+ link.setAttribute('type', 'text/css');
1328
+ link.setAttribute('rel', 'stylesheet');
1329
+ link.setAttribute('href', path);
1330
+ document.getElementsByTagName("head")[0].appendChild(link);
1331
+ },
1332
+ getAttrList : function(tag) {
1333
+ var re = /\s+(?:([\w\-:]+)|(?:([\w\-:]+)=([\w\-:]+))|(?:([\w\-:]+)="([^"]*)")|(?:([\w\-:]+)='([^']*)'))(?=(?:\s|\/|>)+)/g;
1334
+ var arr, key, val, list = {};
1335
+ while ((arr = re.exec(tag))) {
1336
+ key = arr[1] || arr[2] || arr[4] || arr[6];
1337
+ val = arr[1] || (arr[2] ? arr[3] : (arr[4] ? arr[5] : arr[7]));
1338
+ list[key] = val;
1339
+ }
1340
+ return list;
1341
+ },
1342
+ inArray : function(str, arr) {
1343
+ for (var i = 0; i < arr.length; i++) {if (str == arr[i]) return true;}
1344
+ return false;
1345
+ },
1346
+ trim : function(str) {
1347
+ return str.replace(/^\s+|\s+$/g, "");
1348
+ },
1349
+ getJsKey : function(key) {
1350
+ var arr = key.split('-');
1351
+ key = '';
1352
+ for (var i = 0, len = arr.length; i < len; i++) {
1353
+ key += (i > 0) ? arr[i].charAt(0).toUpperCase() + arr[i].substr(1) : arr[i];
1354
+ }
1355
+ return key;
1356
+ },
1357
+ arrayToHash : function(arr) {
1358
+ var hash = {};
1359
+ for (var i = 0, len = arr.length; i < len; i++) hash[arr[i]] = 1;
1360
+ return hash;
1361
+ },
1362
+ escape : function(str) {
1363
+ str = str.replace(/&/g, '&amp;');
1364
+ str = str.replace(/</g, '&lt;');
1365
+ str = str.replace(/>/g, '&gt;');
1366
+ str = str.replace(/"/g, '&quot;');
1367
+ return str;
1368
+ },
1369
+ unescape : function(str) {
1370
+ str = str.replace(/&lt;/g, '<');
1371
+ str = str.replace(/&gt;/g, '>');
1372
+ str = str.replace(/&quot;/g, '"');
1373
+ str = str.replace(/&amp;/g, '&');
1374
+ return str;
1375
+ },
1376
+ getScrollPos : function() {
1377
+ var x, y;
1378
+ if (KE.browser.IE || KE.browser.OPERA) {
1379
+ var el = this.getDocumentElement();
1380
+ x = el.scrollLeft;
1381
+ y = el.scrollTop;
1382
+ } else {
1383
+ x = window.scrollX;
1384
+ y = window.scrollY;
1385
+ }
1386
+ return {x : x, y : y};
1387
+ },
1388
+ getElementPos : function(el) {
1389
+ var x = 0, y = 0;
1390
+ if (el.getBoundingClientRect) {
1391
+ var box = el.getBoundingClientRect();
1392
+ var pos = this.getScrollPos();
1393
+ x = box.left + pos.x;
1394
+ y = box.top + pos.y;
1395
+ } else {
1396
+ x = el.offsetLeft;
1397
+ y = el.offsetTop;
1398
+ var parent = el.offsetParent;
1399
+ while (parent) {
1400
+ x += parent.offsetLeft;
1401
+ y += parent.offsetTop;
1402
+ parent = parent.offsetParent;
1403
+ }
1404
+ }
1405
+ return {x : x, y : y};
1406
+ },
1407
+ getCoords : function(ev) {
1408
+ ev = ev || window.event;
1409
+ return {
1410
+ x : ev.clientX,
1411
+ y : ev.clientY
1412
+ };
1413
+ },
1414
+ setOpacity : function(el, opacity) {
1415
+ if (typeof el.style.opacity == "undefined") {
1416
+ el.style.filter = (opacity == 100) ? "" : "alpha(opacity=" + opacity + ")";
1417
+ } else {
1418
+ el.style.opacity = (opacity == 100) ? "" : (opacity / 100);
1419
+ }
1420
+ },
1421
+ getIframeDoc : function(iframe) {
1422
+ return iframe.contentDocument || iframe.contentWindow.document;
1423
+ },
1424
+ rgbToHex : function(str) {
1425
+ function hex(s) {
1426
+ s = parseInt(s).toString(16);
1427
+ return s.length > 1 ? s : '0' + s;
1428
+ };
1429
+ return str.replace(/rgb\s*?\(\s*?(\d+)\s*?,\s*?(\d+)\s*?,\s*?(\d+)\s*?\)/ig,
1430
+ function($0, $1, $2, $3) {
1431
+ return '#' + hex($1) + hex($2) + hex($3);
1432
+ }
1433
+ );
1434
+ },
1435
+ parseJson : function (text) {
1436
+ //extract JSON string
1437
+ var match;
1438
+ if ((match = /\{[\s\S]*\}|\[[\s\S]*\]/.exec(text))) {
1439
+ text = match[0];
1440
+ }
1441
+ var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
1442
+ cx.lastIndex = 0;
1443
+ if (cx.test(text)) {
1444
+ text = text.replace(cx, function (a) {
1445
+ return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
1446
+ });
1447
+ }
1448
+ if (/^[\],:{}\s]*$/.
1449
+ test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
1450
+ replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
1451
+ replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
1452
+ return eval('(' + text + ')');
1453
+ }
1454
+ throw 'JSON parse error';
1455
+ },
1456
+ getParam : function(url, name) {
1457
+ return url.match(new RegExp('[?&]' + name + '=([^?&]+)', 'i')) ? unescape(RegExp.$1) : '';
1458
+ },
1459
+ createRange : function(doc) {
1460
+ return doc.body.createTextRange ? doc.body.createTextRange() : doc.createRange();
1461
+ },
1462
+ getNodeType : function(node) {
1463
+ return (node.nodeType == 1 && KE.util.inArray(node.tagName.toLowerCase(), KE.setting.noEndTags)) ? 88 : node.nodeType;
1464
+ },
1465
+ inMarquee : function(node) {
1466
+ var n = node, nodeName;
1467
+ while (n) {
1468
+ nodeName = n.nodeName.toLowerCase();
1469
+ if (nodeName == 'marquee' || nodeName == 'select') return true;
1470
+ n = n.parentNode;
1471
+ }
1472
+ return false;
1473
+ },
1474
+ moveToElementText : function (range, el) {
1475
+ if (!this.inMarquee(el)) range.moveToElementText(el);
1476
+ },
1477
+ getNodeTextLength : function(node) {
1478
+ var type = KE.util.getNodeType(node);
1479
+ if (type == 1) {
1480
+ var html = node.innerHTML;
1481
+ return html.replace(/<.*?>/ig, "").length;
1482
+ } else if (type == 3) {
1483
+ return node.nodeValue.length;
1484
+ }
1485
+ },
1486
+ getNodeStartRange : function(doc, node) {
1487
+ var range = KE.util.createRange(doc);
1488
+ var type = node.nodeType;
1489
+ if (type == 1) {
1490
+ KE.util.moveToElementText(range, node);
1491
+ return range;
1492
+ } else if (type == 3) {
1493
+ var offset = 0;
1494
+ var sibling = node.previousSibling;
1495
+ while (sibling) {
1496
+ if (sibling.nodeType == 1) {
1497
+ var nodeRange = KE.util.createRange(doc);
1498
+ KE.util.moveToElementText(nodeRange, sibling);
1499
+ range.setEndPoint('StartToEnd', nodeRange);
1500
+ range.moveStart('character', offset);
1501
+ return range;
1502
+ } else if (sibling.nodeType == 3) {
1503
+ offset += sibling.nodeValue.length;
1504
+ }
1505
+ sibling = sibling.previousSibling;
1506
+ }
1507
+ KE.util.moveToElementText(range, node.parentNode);
1508
+ range.moveStart('character', offset);
1509
+ return range;
1510
+ }
1511
+ },
1512
+ removeParent : function(parent) {
1513
+ if (parent.hasChildNodes) {
1514
+ var node = parent.firstChild;
1515
+ while (node) {
1516
+ var nextNode = node.nextSibling;
1517
+ parent.parentNode.insertBefore(node, parent);
1518
+ node = nextNode;
1519
+ }
1520
+ }
1521
+ parent.parentNode.removeChild(parent);
1522
+ },
1523
+ pluginLang : function(pluginName, doc) {
1524
+ KE.each(KE.lang.plugins[pluginName], function (key, val) {
1525
+ var span = KE.$('lang.' + key, doc);
1526
+ if (span) {
1527
+ span.parentNode.insertBefore(doc.createTextNode(val), span);
1528
+ span.parentNode.removeChild(span);
1529
+ }
1530
+ });
1531
+ },
1532
+ drag : function(id, mousedownObj, moveObj, func) {
1533
+ var g = KE.g[id];
1534
+ mousedownObj.onmousedown = function(e) {
1535
+ var self = this;
1536
+ e = e || window.event;
1537
+ var pos = KE.util.getCoords(e);
1538
+ var objTop = parseInt(moveObj.style.top);
1539
+ var objLeft = parseInt(moveObj.style.left);
1540
+ var objWidth = moveObj.style.width;
1541
+ var objHeight = moveObj.style.height;
1542
+ if (objWidth.match(/%$/)) objWidth = moveObj.offsetWidth + 'px';
1543
+ if (objHeight.match(/%$/)) objHeight = moveObj.offsetHeight + 'px';
1544
+ objWidth = parseInt(objWidth);
1545
+ objHeight = parseInt(objHeight);
1546
+ var mouseTop = pos.y;
1547
+ var mouseLeft = pos.x;
1548
+ var scrollPos = KE.util.getScrollPos();
1549
+ var scrollTop = scrollPos.y;
1550
+ var scrollLeft = scrollPos.x;
1551
+ var dragFlag = true;
1552
+ function moveListener(e) {
1553
+ if (dragFlag) {
1554
+ var pos = KE.util.getCoords(e);
1555
+ var scrollPos = KE.util.getScrollPos();
1556
+ var top = parseInt(pos.y - mouseTop - scrollTop + scrollPos.y);
1557
+ var left = parseInt(pos.x - mouseLeft - scrollLeft + scrollPos.x);
1558
+ func(objTop, objLeft, objWidth, objHeight, top, left);
1559
+ }
1560
+ }
1561
+ var iframePos = KE.util.getElementPos(g.iframe);
1562
+ function iframeMoveListener(e) {
1563
+ if (dragFlag) {
1564
+ var pos = KE.util.getCoords(e, g.iframeDoc);
1565
+ var top = parseInt(iframePos.y + pos.y - mouseTop - scrollTop);
1566
+ var left = parseInt(iframePos.x + pos.x - mouseLeft - scrollLeft);
1567
+ func(objTop, objLeft, objWidth, objHeight, top, left);
1568
+ }
1569
+ }
1570
+ var selectListener = function() { return false; };
1571
+ function upListener(e) {
1572
+ dragFlag = false;
1573
+ if (self.releaseCapture) self.releaseCapture();
1574
+ KE.event.remove(document, 'mousemove', moveListener);
1575
+ KE.event.remove(document, 'mouseup', upListener);
1576
+ KE.event.remove(g.iframeDoc, 'mousemove', iframeMoveListener);
1577
+ KE.event.remove(g.iframeDoc, 'mouseup', upListener);
1578
+ KE.event.remove(document, 'selectstart', selectListener);
1579
+ KE.event.stop(e);
1580
+ return false;
1581
+ }
1582
+ KE.event.add(document, 'mousemove', moveListener);
1583
+ KE.event.add(document, 'mouseup', upListener);
1584
+ KE.event.add(g.iframeDoc, 'mousemove', iframeMoveListener);
1585
+ KE.event.add(g.iframeDoc, 'mouseup', upListener);
1586
+ KE.event.add(document, 'selectstart', selectListener);
1587
+ if (self.setCapture) self.setCapture();
1588
+ KE.event.stop(e);
1589
+ return false;
1590
+ };
1591
+ },
1592
+ resize : function(id, width, height, isCheck, isResizeWidth) {
1593
+ isResizeWidth = (typeof isResizeWidth == "undefined") ? true : isResizeWidth;
1594
+ var g = KE.g[id];
1595
+ if (!g.container) return;
1596
+ if (isCheck && (parseInt(width) <= g.minWidth || parseInt(height) <= g.minHeight)) return;
1597
+ if (isResizeWidth) g.container.style.width = width;
1598
+ if (KE.browser.IE) {
1599
+ //improve IE performance (issue #126)
1600
+ var temp = g.toolbarTable && g.toolbarTable.offsetHeight;
1601
+ }
1602
+ g.container.style.height = height;
1603
+ var diff = parseInt(height) - g.toolbarHeight - g.statusbarHeight;
1604
+ if (diff >= 0) {
1605
+ g.iframe.style.height = diff + 'px';
1606
+ g.newTextarea.style.height = (((KE.browser.IE && KE.browser.VERSION < 8 || document.compatMode != 'CSS1Compat') && diff >= 2) ? diff - 2 : diff) + 'px';
1607
+ }
1608
+ },
1609
+ hideLoadingPage : function(id) {
1610
+ var stack = KE.g[id].dialogStack;
1611
+ var dialog = stack[stack.length - 1];
1612
+ dialog.loading.style.display = 'none';
1613
+ dialog.iframe.style.display = '';
1614
+ },
1615
+ showLoadingPage : function(id) {
1616
+ var stack = KE.g[id].dialogStack;
1617
+ var dialog = stack[stack.length - 1];
1618
+ dialog.loading.style.display = '';
1619
+ dialog.iframe.style.display = 'none';
1620
+ },
1621
+ setDefaultPlugin : function(id) {
1622
+ var items = [
1623
+ 'selectall', 'justifyleft', 'justifycenter', 'justifyright', 'justifyfull',
1624
+ 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript',
1625
+ 'superscript', 'bold', 'italic', 'underline', 'strikethrough'
1626
+ ];
1627
+ var shortcuts = {
1628
+ bold : 'B',
1629
+ italic : 'I',
1630
+ underline : 'U'
1631
+ };
1632
+ for (var i = 0; i < items.length; i++) {
1633
+ var item = items[i],
1634
+ plugin = {};
1635
+ if (item in shortcuts) {
1636
+ plugin.init = (function(item) {
1637
+ return function(id) {
1638
+ KE.event.ctrl(KE.g[id].iframeDoc, shortcuts[item], function(e) {
1639
+ KE.plugin[item].click(id);
1640
+ KE.util.focus(id);
1641
+ }, id);
1642
+ };
1643
+ })(item);
1644
+ }
1645
+ plugin.click = (function(item) {
1646
+ return function(id) {
1647
+ KE.util.execCommand(id, item, null);
1648
+ };
1649
+ })(item);
1650
+ KE.plugin[item] = plugin;
1651
+ }
1652
+ },
1653
+ getFullHtml : function(id) {
1654
+ var html = '<html>';
1655
+ html += '<head>';
1656
+ html += '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
1657
+ html += '<title>KindEditor</title>';
1658
+ html += '<link href="' + KE.g[id].skinsPath + 'common/editor.css?ver=' + escape(KE.version) + '" rel="stylesheet" type="text/css" />';
1659
+ var cssPath = KE.g[id].cssPath;
1660
+ if (typeof cssPath == 'string') cssPath = [cssPath];
1661
+ for (var i = 0, len = cssPath.length; i < len; i++) {
1662
+ if (cssPath[i] !== '') html += '<link href="' + cssPath[i] + '" rel="stylesheet" type="text/css" />';
1663
+ }
1664
+ html += '</head>';
1665
+ html += '<body class="ke-content"></body>';
1666
+ html += '</html>';
1667
+ return html;
1668
+ },
1669
+ getMediaType : function(src) {
1670
+ if (src.match(/\.(rm|rmvb)(\?|$)/i)) return 'rm';
1671
+ else if (src.match(/\.(swf|flv)(\?|$)/i)) return 'flash';
1672
+ else return 'media';
1673
+ },
1674
+ getMediaImage : function(id, type, attrs) {
1675
+ var width = attrs.width;
1676
+ var height = attrs.height;
1677
+ type = type || this.getMediaType(attrs.src);
1678
+ var srcTag = this.getMediaEmbed(attrs);
1679
+ var style = '';
1680
+ if (width > 0) style += 'width:' + width + 'px;';
1681
+ if (height > 0) style += 'height:' + height + 'px;';
1682
+ var className = 'ke-' + type;
1683
+ var html = '<img class="' + className + '" src="' + KE.g[id].skinsPath + 'common/blank.gif" ';
1684
+ if (style !== '') html += 'style="' + style + '" ';
1685
+ html += 'kesrctag="' + escape(srcTag) + '" alt="" />';
1686
+ return html;
1687
+ },
1688
+ getMediaEmbed : function(attrs) {
1689
+ var html = '<embed ';
1690
+ KE.each(attrs, function(key, val) {
1691
+ html += key + '="' + val + '" ';
1692
+ });
1693
+ html += '/>';
1694
+ return html;
1695
+ },
1696
+ execGetHtmlHooks : function(id, html) {
1697
+ var hooks = KE.g[id].getHtmlHooks;
1698
+ for (var i = 0, len = hooks.length; i < len; i++) {
1699
+ html = hooks[i](html);
1700
+ }
1701
+ return html;
1702
+ },
1703
+ execSetHtmlHooks : function(id, html) {
1704
+ var hooks = KE.g[id].setHtmlHooks;
1705
+ for (var i = 0, len = hooks.length; i < len; i++) {
1706
+ html = hooks[i](html);
1707
+ }
1708
+ return html;
1709
+ },
1710
+ execOnchangeHandler : function(id) {
1711
+ var handlers = KE.g[id].onchangeHandlerStack;
1712
+ for (var i = 0, len = handlers.length; i < len; i++) {
1713
+ handlers[i]();
1714
+ }
1715
+ },
1716
+ toData : function(id, srcData) {
1717
+ var g = KE.g[id];
1718
+ var html = this.execGetHtmlHooks(id, srcData);
1719
+ html = html.replace(/^\s*<br[^>]*>\s*$/ig, '');
1720
+ html = html.replace(/^\s*<p>\s*&nbsp;\s*<\/p>\s*$/ig, '');
1721
+ if (g.filterMode) {
1722
+ return KE.format.getHtml(html, g.htmlTags, g.urlType);
1723
+ } else {
1724
+ return KE.format.getHtml(html, null, g.urlType);
1725
+ }
1726
+ },
1727
+ getData : function(id, wyswygMode) {
1728
+ var g = KE.g[id];
1729
+ wyswygMode = (wyswygMode === undefined) ? g.wyswygMode : wyswygMode;
1730
+ if (!wyswygMode) {
1731
+ this.innerHtml(g.iframeDoc.body, KE.util.execSetHtmlHooks(id, g.newTextarea.value));
1732
+ }
1733
+ return this.toData(id, g.iframeDoc.body.innerHTML);
1734
+ },
1735
+ getSrcData : function(id) {
1736
+ var g = KE.g[id];
1737
+ if (!g.wyswygMode) {
1738
+ this.innerHtml(g.iframeDoc.body, KE.util.execSetHtmlHooks(id, g.newTextarea.value));
1739
+ }
1740
+ return g.iframeDoc.body.innerHTML;
1741
+ },
1742
+ getPureData : function(id) {
1743
+ return this.extractText(this.getData(id));
1744
+ },
1745
+ extractText : function(str) {
1746
+ str = str.replace(/<(?!img|embed).*?>/ig, '');
1747
+ str = str.replace(/&nbsp;/ig, ' ');
1748
+ return str;
1749
+ },
1750
+ isEmpty : function(id) {
1751
+ return this.getPureData(id).replace(/\r\n|\n|\r/, '').replace(/^\s+|\s+$/, '') === '';
1752
+ },
1753
+ setData : function(id) {
1754
+ var g = KE.g[id];
1755
+ if (g.srcTextarea) g.srcTextarea.value = this.getData(id);
1756
+ },
1757
+ focus : function(id) {
1758
+ var g = KE.g[id];
1759
+ if (g.wyswygMode) {
1760
+ g.iframeWin.focus();
1761
+ } else {
1762
+ g.newTextarea.focus();
1763
+ }
1764
+ },
1765
+ click : function(id, cmd) {
1766
+ this.focus(id);
1767
+ KE.hideMenu(id);
1768
+ KE.plugin[cmd].click(id);
1769
+ },
1770
+ selection : function(id) {
1771
+ if (!KE.browser.IE || !KE.g[id].keRange) {
1772
+ this.setSelection(id);
1773
+ }
1774
+ },
1775
+ setSelection : function(id) {
1776
+ var g = KE.g[id];
1777
+ var keSel = new KE.selection(g.iframeDoc);
1778
+ if (!KE.browser.IE || keSel.range.item || keSel.range.parentElement().ownerDocument === g.iframeDoc) {
1779
+ g.keSel = keSel;
1780
+ g.keRange = g.keSel.keRange;
1781
+ g.sel = g.keSel.sel;
1782
+ g.range = g.keSel.range;
1783
+ }
1784
+ },
1785
+ select : function(id) {
1786
+ if (KE.browser.IE && KE.g[id].wyswygMode && KE.g[id].range) KE.g[id].range.select();
1787
+ },
1788
+ execCommand : function(id, cmd, value) {
1789
+ KE.util.focus(id);
1790
+ KE.util.select(id);
1791
+ try {
1792
+ KE.g[id].iframeDoc.execCommand(cmd, false, value);
1793
+ } catch(e) {}
1794
+ KE.toolbar.updateState(id);
1795
+ KE.util.execOnchangeHandler(id);
1796
+ },
1797
+ innerHtml : function(el, html) {
1798
+ if (KE.browser.IE) {
1799
+ el.innerHTML = '<img id="__ke_temp_tag__" width="0" height="0" />' + html;
1800
+ var temp = KE.$('__ke_temp_tag__', el.ownerDocument);
1801
+ if (temp) temp.parentNode.removeChild(temp);
1802
+ } else {
1803
+ el.innerHTML = html;
1804
+ }
1805
+ },
1806
+ pasteHtml : function(id, html, isStart) {
1807
+ var g = KE.g[id];
1808
+ var imgStr = '<img id="__ke_temp_tag__" width="0" height="0" />';
1809
+ if (isStart) html = imgStr + html;
1810
+ else html += imgStr;
1811
+ if (KE.browser.IE) {
1812
+ if (g.range.item) g.range.item(0).outerHTML = html;
1813
+ else g.range.pasteHTML(html);
1814
+ } else {
1815
+ g.range.deleteContents();
1816
+ var frag = g.range.createContextualFragment(html);
1817
+ g.range.insertNode(frag);
1818
+ }
1819
+ var node = KE.$('__ke_temp_tag__', g.iframeDoc);
1820
+ var blank = g.iframeDoc.createTextNode('');
1821
+ node.parentNode.replaceChild(blank, node);
1822
+ g.keRange.selectNode(blank);
1823
+ g.keSel.addRange(g.keRange);
1824
+ },
1825
+ insertHtml : function(id, html) {
1826
+ if (html === '') return;
1827
+ var g = KE.g[id];
1828
+ if (!g.wyswygMode) return;
1829
+ if (!g.range) return;
1830
+ html = this.execSetHtmlHooks(id, html);
1831
+ if (KE.browser.IE) {
1832
+ this.select(id);
1833
+ if (g.range.item) {
1834
+ try {
1835
+ g.range.item(0).outerHTML = html;
1836
+ } catch(e) {
1837
+ var el = g.range.item(0);
1838
+ var parent = el.parentNode;
1839
+ parent.removeChild(el);
1840
+ if (parent.nodeName.toLowerCase() != 'body') parent = parent.parentNode;
1841
+ this.innerHtml(parent, html + parent.innerHTML);
1842
+ }
1843
+ } else {
1844
+ g.range.pasteHTML('<span id="__ke_temp_tag__">\u200B</span>' + html);
1845
+ var node = KE.$('__ke_temp_tag__', g.iframeDoc);
1846
+ node.parentNode.removeChild(node);
1847
+ }
1848
+ } else if (KE.browser.GECKO) {
1849
+ this.execCommand(id, 'inserthtml', html);
1850
+ return;
1851
+ } else {
1852
+ this.pasteHtml(id, html);
1853
+ }
1854
+ KE.util.execOnchangeHandler(id);
1855
+ },
1856
+ setFullHtml : function(id, html) {
1857
+ var g = KE.g[id];
1858
+ if (!KE.browser.IE && html === '') html = '<br />';
1859
+ var html = KE.util.execSetHtmlHooks(id, html);
1860
+ this.innerHtml(g.iframeDoc.body, html);
1861
+ if (!g.wyswygMode) g.newTextarea.value = KE.util.getData(id, true);
1862
+ KE.util.execOnchangeHandler(id);
1863
+ },
1864
+ selectImageWebkit : function(id, e, isSelection) {
1865
+ if (KE.browser.WEBKIT) {
1866
+ var target = e.srcElement || e.target;
1867
+ if (target.tagName.toLowerCase() == 'img') {
1868
+ if (isSelection) KE.util.selection(id);
1869
+ var range = KE.g[id].keRange;
1870
+ range.selectNode(target);
1871
+ KE.g[id].keSel.addRange(range);
1872
+ }
1873
+ }
1874
+ },
1875
+ addTabEvent : function(id) {
1876
+ var g = KE.g[id];
1877
+ KE.event.add(g.iframeDoc, 'keydown', function(e) {
1878
+ if (e.keyCode == 9) {
1879
+ if (g.afterTab) g.afterTab(id);
1880
+ KE.event.stop(e);
1881
+ return false;
1882
+ }
1883
+ }, id);
1884
+ },
1885
+ addContextmenuEvent : function(id) {
1886
+ var g = KE.g[id];
1887
+ if (g.contextmenuItems.length == 0) return;
1888
+ if (!g.useContextmenu) return;
1889
+ KE.event.add(g.iframeDoc, 'contextmenu', function(e){
1890
+ KE.hideMenu(id);
1891
+ KE.util.setSelection(id);
1892
+ KE.util.selectImageWebkit(id, e, false);
1893
+ var maxWidth = 0;
1894
+ var items = [];
1895
+ for (var i = 0, len = g.contextmenuItems.length; i < len; i++) {
1896
+ var item = g.contextmenuItems[i];
1897
+ if (item === '-') {
1898
+ items.push(item);
1899
+ } else if (item.cond && item.cond(id)) {
1900
+ items.push(item);
1901
+ if (item.options) {
1902
+ var width = parseInt(item.options.width) || 0;
1903
+ if (width > maxWidth) maxWidth = width;
1904
+ }
1905
+ }
1906
+ prevItem = item;
1907
+ }
1908
+ while (items.length > 0 && items[0] === '-') {
1909
+ items.shift();
1910
+ }
1911
+ while (items.length > 0 && items[items.length - 1] === '-') {
1912
+ items.pop();
1913
+ }
1914
+ var prevItem = null;
1915
+ for (var i = 0, len = items.length; i < len; i++) {
1916
+ if (items[i] === '-' && prevItem === '-') delete items[i];
1917
+ prevItem = items[i] || null;
1918
+ }
1919
+ if (items.length > 0) {
1920
+ var menu = new KE.menu({
1921
+ id : id,
1922
+ event : e,
1923
+ type : 'contextmenu',
1924
+ width : maxWidth
1925
+ });
1926
+ for (var i = 0, len = items.length; i < len; i++) {
1927
+ var item = items[i];
1928
+ if (!item) continue;
1929
+ if (item === '-') {
1930
+ if (i < len - 1) menu.addSeparator();
1931
+ } else {
1932
+ menu.add(item.text, (function(item) {
1933
+ return function() {
1934
+ item.click(id, menu);
1935
+ };
1936
+ })(item), item.options);
1937
+ }
1938
+ }
1939
+ menu.show();
1940
+ KE.event.stop(e);
1941
+ return false;
1942
+ }
1943
+ return true;
1944
+ }, id);
1945
+ },
1946
+ addNewlineEvent : function(id) {
1947
+ var g = KE.g[id];
1948
+ if (KE.browser.IE && g.newlineTag.toLowerCase() != 'br') return;
1949
+ if (KE.browser.GECKO && KE.browser.VERSION < 3 && g.newlineTag.toLowerCase() != 'p') return;
1950
+ if (KE.browser.OPERA) return;
1951
+ KE.event.add(g.iframeDoc, 'keydown', function(e) {
1952
+ if (e.keyCode != 13 || e.shiftKey || e.ctrlKey || e.altKey) return true;
1953
+ KE.util.setSelection(id);
1954
+ var parent = g.keRange.getParentElement();
1955
+ if (KE.util.inMarquee(parent)) return;
1956
+ var tagName = parent.tagName.toLowerCase();
1957
+ if (g.newlineTag.toLowerCase() == 'br') {
1958
+ if (!KE.util.inArray(tagName, ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'li'])) {
1959
+ KE.util.pasteHtml(id, '<br />');
1960
+ var nextNode = g.keRange.startNode.nextSibling;
1961
+ if (KE.browser.IE) {
1962
+ if (!nextNode) KE.util.pasteHtml(id, '<br />', true);
1963
+ } else if (KE.browser.WEBKIT) {
1964
+ if (!nextNode) {
1965
+ KE.util.pasteHtml(id, '<br />', true);
1966
+ } else {
1967
+ var range = new KE.range(g.iframeDoc);
1968
+ range.selectNode(nextNode.parentNode);
1969
+ range.setStart(nextNode, 0);
1970
+ if (range.cloneContents().innerHTML.replace(/<(?!img|embed).*?>/ig, '') === '') {
1971
+ KE.util.pasteHtml(id, '<br />', true);
1972
+ }
1973
+ }
1974
+ }
1975
+ KE.event.stop(e);
1976
+ return false;
1977
+ }
1978
+ } else {
1979
+ if (!KE.util.inArray(tagName, ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'pre', 'div', 'li'])) {
1980
+ KE.util.execCommand(id, 'formatblock', '<P>');
1981
+ }
1982
+ }
1983
+ return true;
1984
+ }, id);
1985
+ }
1986
+ };
1987
+
1988
+ KE.layout = {
1989
+ hide : function(id) {
1990
+ var g = KE.g[id];
1991
+ KE.hideMenu(id);
1992
+ var stack = g.dialogStack;
1993
+ while (stack.length > 0) {
1994
+ var dialog = stack[stack.length - 1];
1995
+ dialog.hide();
1996
+ }
1997
+ g.maskDiv.style.display = 'none';
1998
+ }
1999
+ };
2000
+
2001
+ KE.hideMenu = function(id) {
2002
+ var g = KE.g[id];
2003
+ g.hideDiv.innerHTML = '';
2004
+ g.hideDiv.style.display = 'none';
2005
+ };
2006
+
2007
+ KE.colorpicker = function(arg) {
2008
+ var wrapper;
2009
+ var x = arg.x || 0;
2010
+ var y = arg.y || 0;
2011
+ var z = arg.z || 0;
2012
+ var colors = arg.colors || KE.setting.colorTable;
2013
+ var doc = arg.doc || document;
2014
+ var onclick = arg.onclick;
2015
+ var selectedColor = (arg.selectedColor || '').toLowerCase();
2016
+ function init() {
2017
+ wrapper = KE.$$('div');
2018
+ wrapper.className = 'ke-colorpicker';
2019
+ wrapper.style.top = y + 'px';
2020
+ wrapper.style.left = x + 'px';
2021
+ wrapper.style.zIndex = z;
2022
+ }
2023
+ init.call(this);
2024
+ this.remove = function() {
2025
+ doc.body.removeChild(wrapper);
2026
+ };
2027
+ this.getElement = function() {
2028
+ function addAttr(cell, color, cls) {
2029
+ if (selectedColor === color.toLowerCase()) cls += ' ke-colorpicker-cell-selected';
2030
+ cell.className = cls;
2031
+ cell.title = color || KE.lang['noColor'];
2032
+ cell.onmouseover = function() { this.className = cls + ' ke-colorpicker-cell-on'; };
2033
+ cell.onmouseout = function() { this.className = cls; };
2034
+ cell.onclick = function() { onclick(color); };
2035
+ if (color) {
2036
+ var div = KE.$$('div');
2037
+ div.className = 'ke-colorpicker-cell-color';
2038
+ div.style.backgroundColor = color;
2039
+ cell.appendChild(div);
2040
+ } else {
2041
+ cell.innerHTML = KE.lang['noColor'];
2042
+ }
2043
+ }
2044
+ var table = KE.$$('table');
2045
+ table.className = 'ke-colorpicker-table';
2046
+ table.cellPadding = 0;
2047
+ table.cellSpacing = 0;
2048
+ table.border = 0;
2049
+ var row = table.insertRow(0),
2050
+ cell = row.insertCell(0);
2051
+ cell.colSpan = colors[0].length;
2052
+ addAttr(cell, '', 'ke-colorpicker-cell-top');
2053
+ for (var i = 0; i < colors.length; i++) {
2054
+ var row = table.insertRow(i + 1);
2055
+ for (var j = 0; j < colors[i].length; j++) {
2056
+ var color = colors[i][j],
2057
+ cell = row.insertCell(j);
2058
+ addAttr(cell, color, 'ke-colorpicker-cell');
2059
+ }
2060
+ }
2061
+ return table;
2062
+ };
2063
+ this.create = function() {
2064
+ wrapper.appendChild(this.getElement());
2065
+ KE.event.bind(wrapper, 'click', function(e){});
2066
+ KE.event.bind(wrapper, 'mousedown', function(e){});
2067
+ doc.body.appendChild(wrapper);
2068
+ };
2069
+ };
2070
+
2071
+ KE.menu = function(arg){
2072
+ function getPos(width, height) {
2073
+ var id = arg.id;
2074
+ var x = 0;
2075
+ var y = 0;
2076
+ if (this.type == 'menu') {
2077
+ var obj = KE.g[id].toolbarIcon[arg.cmd];
2078
+ var pos = KE.util.getElementPos(obj[0]);
2079
+ x = pos.x;
2080
+ y = pos.y + obj[0].offsetHeight;
2081
+ } else {
2082
+ var pos = KE.util.getCoords(arg.event);
2083
+ var iframePos = KE.util.getElementPos(KE.g[id].iframe);
2084
+ x = pos.x + iframePos.x;
2085
+ y = pos.y + iframePos.y + 5;
2086
+ }
2087
+ if (width > 0 || height > 0) {
2088
+ var scrollPos = KE.util.getScrollPos();
2089
+ var docEl = KE.util.getDocumentElement();
2090
+ var maxLeft = scrollPos.x + docEl.clientWidth - width - 2;
2091
+ if (x > maxLeft) x = maxLeft;
2092
+ }
2093
+ return {x : x, y : y};
2094
+ };
2095
+ function init() {
2096
+ var width = arg.width;
2097
+ this.type = (arg.type && arg.type == 'contextmenu') ? arg.type : 'menu';
2098
+ var div = KE.$$('div');
2099
+ div.className = 'ke-' + this.type;
2100
+ div.setAttribute('name', arg.cmd);
2101
+ var pos = getPos.call(this, 0, 0);
2102
+ div.style.top = pos.y + 'px';
2103
+ div.style.left = pos.x + 'px';
2104
+ if (arg.width) div.style.width = (/^\d+$/.test(width)) ? width + 'px' : width;
2105
+ KE.event.bind(div, 'click', function(e){}, arg.id);
2106
+ KE.event.bind(div, 'mousedown', function(e){}, arg.id);
2107
+ this.div = div;
2108
+ };
2109
+ init.call(this);
2110
+ this.add = function(html, event, options) {
2111
+ var height, iconHtml, checked = false;
2112
+ if (options !== undefined) {
2113
+ height = options.height;
2114
+ iconHtml = options.iconHtml;
2115
+ checked = options.checked;
2116
+ }
2117
+ var self = this;
2118
+ var cDiv = KE.$$('div');
2119
+ cDiv.className = 'ke-' + self.type + '-item';
2120
+ if (height) cDiv.style.height = height;
2121
+ var left = KE.$$('div');
2122
+ left.className = 'ke-' + this.type + '-left';
2123
+ var center = KE.$$('div');
2124
+ center.className = 'ke-' + self.type + '-center';
2125
+ if (height) center.style.height = height;
2126
+ var right = KE.$$('div');
2127
+ right.className = 'ke-' + this.type + '-right';
2128
+ if (height) right.style.lineHeight = height;
2129
+ cDiv.onmouseover = function() {
2130
+ this.className = 'ke-' + self.type + '-item ke-' + self.type + '-item-on';
2131
+ center.className = 'ke-' + self.type + '-center ke-' + self.type + '-center-on';
2132
+ };
2133
+ cDiv.onmouseout = function() {
2134
+ this.className = 'ke-' + self.type + '-item';
2135
+ center.className = 'ke-' + self.type + '-center';
2136
+ };
2137
+ cDiv.onclick = event;
2138
+ cDiv.appendChild(left);
2139
+ cDiv.appendChild(center);
2140
+ cDiv.appendChild(right);
2141
+ if (checked) {
2142
+ KE.util.innerHtml(left, '<span class="ke-common-icon ke-common-icon-url ke-icon-checked"></span>');
2143
+ } else {
2144
+ if (iconHtml) KE.util.innerHtml(left, iconHtml);
2145
+ }
2146
+ KE.util.innerHtml(right, html);
2147
+ this.append(cDiv);
2148
+ };
2149
+ this.addSeparator = function() {
2150
+ var div = KE.$$('div');
2151
+ div.className = 'ke-' + this.type + '-separator';
2152
+ this.append(div);
2153
+ };
2154
+ this.append = function(el) {
2155
+ this.div.appendChild(el);
2156
+ };
2157
+ this.insert = function(html) {
2158
+ KE.util.innerHtml(this.div, html);
2159
+ };
2160
+ this.hide = function() {
2161
+ KE.hideMenu(arg.id);
2162
+ };
2163
+ this.show = function() {
2164
+ this.hide();
2165
+ var id = arg.id;
2166
+ KE.g[id].hideDiv.style.display = '';
2167
+ KE.g[id].hideDiv.appendChild(this.div);
2168
+ var pos = getPos.call(this, this.div.clientWidth, this.div.clientHeight);
2169
+ this.div.style.top = pos.y + 'px';
2170
+ this.div.style.left = pos.x + 'px';
2171
+ };
2172
+ this.picker = function(color) {
2173
+ var colorTable = KE.g[arg.id].colorTable;
2174
+ var picker = new KE.colorpicker({
2175
+ colors : colorTable,
2176
+ onclick : function(color) { KE.plugin[arg.cmd].exec(arg.id, color); },
2177
+ selectedColor : color
2178
+ });
2179
+ this.append(picker.getElement());
2180
+ this.show();
2181
+ };
2182
+ };
2183
+
2184
+ KE.button = function(arg) {
2185
+ arg = arg || {};
2186
+ doc = arg.doc || document;
2187
+ var span = KE.$$('span', doc);
2188
+ span.className = 'ke-button-common ke-button-outer ' + (arg.className || '');
2189
+ span.title = arg.text;
2190
+ btn = KE.$$('input', doc);
2191
+ btn.className = 'ke-button-common ke-button';
2192
+ btn.type = 'button';
2193
+ btn.value = arg.text || '';
2194
+ if (arg.clickFn) {
2195
+ btn.onclick = arg.clickFn;
2196
+ }
2197
+ span.appendChild(btn);
2198
+ return {span : span, btn : btn};
2199
+ }
2200
+
2201
+ KE.dialog = function(arg){
2202
+ var self = this;
2203
+ this.widthMargin = 30;
2204
+ this.heightMargin = 100;
2205
+ this.zIndex = 19811214;
2206
+ this.width = arg.width;
2207
+ this.height = arg.height;
2208
+ var minTop, minLeft;
2209
+ function setLimitNumber() {
2210
+ var docEl = KE.util.getDocumentElement();
2211
+ var pos = KE.util.getScrollPos();
2212
+ minTop = pos.y;
2213
+ minLeft = pos.x;
2214
+ }
2215
+ function init() {
2216
+ this.beforeHide = arg.beforeHide;
2217
+ this.afterHide = arg.afterHide;
2218
+ this.beforeShow = arg.beforeShow;
2219
+ this.afterShow = arg.afterShow;
2220
+ this.ondrag = arg.ondrag;
2221
+ }
2222
+ init.call(this);
2223
+ function getPos() {
2224
+ var width = this.width + this.widthMargin;
2225
+ var height = this.height + this.heightMargin;
2226
+ var id = arg.id;
2227
+ var g = KE.g[id];
2228
+ var x = 0, y = 0;
2229
+ if (g.dialogAlignType == 'page') {
2230
+ var el = KE.util.getDocumentElement();
2231
+ var scrollPos = KE.util.getScrollPos();
2232
+ x = Math.round(scrollPos.x + (el.clientWidth - width) / 2);
2233
+ y = Math.round(scrollPos.y + (el.clientHeight - height) / 2);
2234
+ } else {
2235
+ var pos = KE.util.getElementPos(KE.g[id].container);
2236
+ var el = g.container;
2237
+ var xDiff = Math.round(el.clientWidth / 2) - Math.round(width / 2);
2238
+ var yDiff = Math.round(el.clientHeight / 2) - Math.round(height / 2);
2239
+ x = xDiff < 0 ? pos.x : pos.x + xDiff;
2240
+ y = yDiff < 0 ? pos.y : pos.y + yDiff;
2241
+ }
2242
+ x = x < 0 ? 0 : x;
2243
+ y = y < 0 ? 0 : y;
2244
+ return {x : x, y : y};
2245
+ };
2246
+ this.resize = function(width, height) {
2247
+ if (width) this.width = width;
2248
+ if (height) this.height = height;
2249
+ this.hide();
2250
+ this.show();
2251
+ };
2252
+ this.hide = function() {
2253
+ if (this.beforeHide) this.beforeHide(id);
2254
+ var id = arg.id;
2255
+ var stack = KE.g[id].dialogStack;
2256
+ if (stack[stack.length - 1] != this) return;
2257
+ var dialog = stack.pop();
2258
+ var iframe = dialog.iframe;
2259
+ iframe.src = 'javascript:false';
2260
+ iframe.parentNode.removeChild(iframe);
2261
+ document.body.removeChild(this.div);
2262
+ if (stack.length < 1) {
2263
+ KE.g[id].maskDiv.style.display = 'none';
2264
+ }
2265
+ KE.event.remove(window, 'resize', setLimitNumber);
2266
+ KE.event.remove(window, 'scroll', setLimitNumber);
2267
+ if (this.afterHide) this.afterHide(id);
2268
+ KE.util.focus(id);
2269
+ };
2270
+ this.show = function() {
2271
+ if (this.beforeShow) this.beforeShow(id);
2272
+ var self = this;
2273
+ var id = arg.id;
2274
+ var div = KE.$$('div');
2275
+ div.className = 'ke-dialog';
2276
+ KE.event.bind(div, 'click', function(e){}, id);
2277
+ var stack = KE.g[id].dialogStack;
2278
+ if (stack.length > 0) {
2279
+ this.zIndex = stack[stack.length - 1].zIndex + 1;
2280
+ }
2281
+ div.style.zIndex = this.zIndex;
2282
+ var pos = getPos.call(this);
2283
+ div.style.top = pos.y + 'px';
2284
+ div.style.left = pos.x + 'px';
2285
+ if (KE.g[id].shadowMode) {
2286
+ KE.addClass(div, 'ke-dialog-shadow');
2287
+ } else {
2288
+ KE.addClass(div, 'ke-dialog-no-shadow');
2289
+ }
2290
+ var titleDiv = KE.$$('div');
2291
+ titleDiv.className = 'ke-dialog-title';
2292
+ titleDiv.innerHTML = arg.title;
2293
+ var span = KE.$$('span');
2294
+ span.className = 'ke-dialog-close';
2295
+ span.alt = KE.lang['close'];
2296
+ span.title = KE.lang['close'];
2297
+ span.onclick = function () {
2298
+ self.hide();
2299
+ KE.util.select(id);
2300
+ };
2301
+ titleDiv.appendChild(span);
2302
+ setLimitNumber();
2303
+ KE.event.add(window, 'resize', setLimitNumber);
2304
+ KE.event.add(window, 'scroll', setLimitNumber);
2305
+ KE.util.drag(id, titleDiv, div, function(objTop, objLeft, objWidth, objHeight, top, left) {
2306
+ if (self.ondrag) self.ondrag(id);
2307
+ setLimitNumber();
2308
+ top = objTop + top;
2309
+ left = objLeft + left;
2310
+ if (top < minTop) top = minTop;
2311
+ if (left < minLeft) left = minLeft;
2312
+ div.style.top = top + 'px';
2313
+ div.style.left = left + 'px';
2314
+ });
2315
+ div.appendChild(titleDiv);
2316
+ var bodyDiv = KE.$$('div');
2317
+ bodyDiv.className = 'ke-dialog-body';
2318
+ var loadingTable = KE.util.createTable();
2319
+ loadingTable.table.className = 'ke-loading-table';
2320
+ loadingTable.table.style.width = this.width + 'px';
2321
+ loadingTable.table.style.height = this.height + 'px';
2322
+ var loadingImg = KE.$$('span');
2323
+ loadingImg.className = 'ke-loading-img';
2324
+ loadingTable.cell.appendChild(loadingImg);
2325
+ var iframe = (KE.g[id].dialogStack.length == 0 && KE.g[id].dialog) ? KE.g[id].dialog : KE.$$('iframe');
2326
+ if (arg.useFrameCSS) {
2327
+ iframe.className = 'ke-dialog-iframe ke-dialog-iframe-border';
2328
+ } else {
2329
+ iframe.className = 'ke-dialog-iframe';
2330
+ }
2331
+ iframe.setAttribute("frameBorder", "0");
2332
+ iframe.style.width = this.width + 'px';
2333
+ iframe.style.height = this.height + 'px';
2334
+ iframe.style.display = 'none';
2335
+ bodyDiv.appendChild(iframe);
2336
+ bodyDiv.appendChild(loadingTable.table);
2337
+ div.appendChild(bodyDiv);
2338
+ var bottomDiv = KE.$$('div');
2339
+ bottomDiv.className = 'ke-dialog-bottom';
2340
+ var noButton = null;
2341
+ var yesButton = null;
2342
+ var previewButton = null;
2343
+ if (arg.previewButton) {
2344
+ var btn = KE.button({
2345
+ className : 'ke-dialog-preview',
2346
+ text : arg.previewButton,
2347
+ clickFn : function() {
2348
+ var stack = KE.g[id].dialogStack;
2349
+ if (stack[stack.length - 1] == self) {
2350
+ if (arg.previewClickFn) {
2351
+ arg.previewClickFn(id);
2352
+ } else {
2353
+ KE.plugin[arg.cmd].preview(id);
2354
+ }
2355
+ }
2356
+ }
2357
+ });
2358
+ previewButton = btn.btn;
2359
+ bottomDiv.appendChild(btn.span);
2360
+ }
2361
+ if (arg.yesButton) {
2362
+ var btn = KE.button({
2363
+ className : 'ke-dialog-yes',
2364
+ text : arg.yesButton,
2365
+ clickFn : function() {
2366
+ var stack = KE.g[id].dialogStack;
2367
+ if (stack[stack.length - 1] == self) {
2368
+ if (arg.yesClickFn) {
2369
+ arg.yesClickFn(id);
2370
+ } else {
2371
+ KE.plugin[arg.cmd].exec(id);
2372
+ }
2373
+ }
2374
+ }
2375
+ });
2376
+ yesButton = btn.btn;
2377
+ bottomDiv.appendChild(btn.span);
2378
+ }
2379
+ if (arg.noButton) {
2380
+ var btn = KE.button({
2381
+ className : 'ke-dialog-no',
2382
+ text : arg.noButton,
2383
+ clickFn : function() {
2384
+ self.hide();
2385
+ KE.util.select(id);
2386
+ }
2387
+ });
2388
+ noButton = btn.btn;
2389
+ bottomDiv.appendChild(btn.span);
2390
+ }
2391
+ if (arg.yesButton || arg.noButton || arg.previewButton) {
2392
+ div.appendChild(bottomDiv);
2393
+ }
2394
+ document.body.appendChild(div);
2395
+ KE.event.bind(div, 'mousedown', function(e){}, id);
2396
+ window.focus();
2397
+ if (arg.html !== undefined) {
2398
+ var dialogDoc = KE.util.getIframeDoc(iframe);
2399
+ var html = KE.util.getFullHtml(id);
2400
+ dialogDoc.open();
2401
+ dialogDoc.write(html);
2402
+ dialogDoc.close();
2403
+ KE.util.innerHtml(dialogDoc.body, arg.html);
2404
+ } else if (arg.url !== undefined) {
2405
+ iframe.src = arg.url;
2406
+ } else {
2407
+ var param = 'id=' + escape(id) + '&ver=' + escape(KE.version);
2408
+ if (arg.file === undefined) {
2409
+ iframe.src = KE.g[id].pluginsPath + arg.cmd + '.html?' + param;
2410
+ } else {
2411
+ param = (/\?/.test(arg.file) ? '&' : '?') + param;
2412
+ iframe.src = KE.g[id].pluginsPath + arg.file + param;
2413
+ }
2414
+ }
2415
+ KE.g[id].maskDiv.style.width = KE.util.getDocumentWidth() + 'px';
2416
+ KE.g[id].maskDiv.style.height = KE.util.getDocumentHeight() + 'px';
2417
+ KE.g[id].maskDiv.style.display = 'block';
2418
+ this.iframe = iframe;
2419
+ this.loading = loadingTable.table;
2420
+ this.noButton = noButton;
2421
+ this.yesButton = yesButton;
2422
+ this.previewButton = previewButton;
2423
+ this.div = div;
2424
+ KE.g[id].dialogStack.push(this);
2425
+ KE.g[id].dialog = iframe;
2426
+ KE.g[id].yesButton = yesButton;
2427
+ KE.g[id].noButton = noButton;
2428
+ KE.g[id].previewButton = previewButton;
2429
+ if (!arg.loadingMode) KE.util.hideLoadingPage(id);
2430
+ if (this.afterShow) this.afterShow(id);
2431
+ if (KE.g[id].afterDialogCreate) KE.g[id].afterDialogCreate(id);
2432
+ };
2433
+ };
2434
+
2435
+ KE.toolbar = {
2436
+ updateState : function(id) {
2437
+ var cmdList = [
2438
+ 'justifyleft', 'justifycenter', 'justifyright',
2439
+ 'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript','superscript',
2440
+ 'bold', 'italic', 'underline', 'strikethrough'
2441
+ ];
2442
+ for (var i = 0; i < cmdList.length; i++) {
2443
+ var cmd = cmdList[i];
2444
+ var state = false;
2445
+ try {
2446
+ state = KE.g[id].iframeDoc.queryCommandState(cmd);
2447
+ } catch(e) {}
2448
+ if (state) {
2449
+ KE.toolbar.select(id, cmd);
2450
+ } else {
2451
+ KE.toolbar.unselect(id, cmd);
2452
+ }
2453
+ }
2454
+ },
2455
+ isSelected : function(id, cmd) {
2456
+ if (KE.plugin[cmd] && KE.plugin[cmd].isSelected) return true;
2457
+ else return false;
2458
+ },
2459
+ select : function(id, cmd) {
2460
+ if (KE.g[id].toolbarIcon[cmd]) {
2461
+ var a = KE.g[id].toolbarIcon[cmd][0];
2462
+ a.className = 'ke-icon ke-icon-selected';
2463
+ a.onmouseover = null;
2464
+ a.onmouseout = null;
2465
+ }
2466
+ },
2467
+ unselect : function(id, cmd) {
2468
+ if (KE.g[id].toolbarIcon[cmd]) {
2469
+ var a = KE.g[id].toolbarIcon[cmd][0];
2470
+ a.className = 'ke-icon';
2471
+ a.onmouseover = function(){ this.className = 'ke-icon ke-icon-on'; };
2472
+ a.onmouseout = function(){ this.className = 'ke-icon'; };
2473
+ }
2474
+ },
2475
+ _setAttr : function(id, a, cmd) {
2476
+ a.className = 'ke-icon';
2477
+ a.href = 'javascript:;';
2478
+ a.onclick = function(e) {
2479
+ e = e || window.event;
2480
+ var div = KE.g[id].hideDiv.firstChild;
2481
+ if (div && div.getAttribute('name') == cmd) {
2482
+ KE.hideMenu(id);
2483
+ } else {
2484
+ KE.util.click(id, cmd);
2485
+ }
2486
+ if (e.preventDefault) e.preventDefault();
2487
+ if (e.stopPropagation) e.stopPropagation();
2488
+ if (e.cancelBubble !== undefined) e.cancelBubble = true;
2489
+ return false;
2490
+ };
2491
+ a.onmouseover = function(){ this.className = 'ke-icon ke-icon-on'; };
2492
+ a.onmouseout = function(){ this.className = 'ke-icon'; };
2493
+ a.hidefocus = true;
2494
+ a.title = KE.lang[cmd];
2495
+ },
2496
+ able : function(id, arr) {
2497
+ var self = this;
2498
+ KE.each(KE.g[id].toolbarIcon, function(cmd, obj) {
2499
+ if (!KE.util.inArray(cmd, arr)) {
2500
+ var a = obj[0];
2501
+ var span = obj[1];
2502
+ self._setAttr(id, a, cmd);
2503
+ KE.util.setOpacity(span, 100);
2504
+ }
2505
+ });
2506
+ },
2507
+ disable : function(id, arr) {
2508
+ KE.each(KE.g[id].toolbarIcon, function(cmd, obj) {
2509
+ if (!KE.util.inArray(cmd, arr)) {
2510
+ var a = obj[0];
2511
+ var span = obj[1];
2512
+ a.className = 'ke-icon ke-icon-disabled';
2513
+ KE.util.setOpacity(span, 50);
2514
+ a.onclick = null;
2515
+ a.onmouseover = null;
2516
+ a.onmouseout = null;
2517
+ }
2518
+ });
2519
+ },
2520
+ create : function(id) {
2521
+ var self = this;
2522
+ var defaultItemHash = KE.util.arrayToHash(KE.setting.items);
2523
+ KE.g[id].toolbarIcon = [];
2524
+ var tableObj = KE.util.createTable();
2525
+ var toolbar = tableObj.table;
2526
+ toolbar.className = 'ke-toolbar';
2527
+ toolbar.oncontextmenu = function() { return false; };
2528
+ toolbar.onmousedown = function() { return false; };
2529
+ toolbar.onmousemove = function() { return false; };
2530
+ var toolbarCell = tableObj.cell;
2531
+ var length = KE.g[id].items.length;
2532
+ var cellNum = 0;
2533
+ var row;
2534
+ KE.g[id].toolbarHeight = KE.g[id].toolbarLineHeight;
2535
+ for (var i = 0; i < length; i++) {
2536
+ var cmd = KE.g[id].items[i];
2537
+ if (i == 0 || cmd == '-') {
2538
+ var table = KE.$$('table');
2539
+ table.cellPadding = 0;
2540
+ table.cellSpacing = 0;
2541
+ table.border = 0;
2542
+ table.className = 'ke-toolbar-table';
2543
+ row = table.insertRow(0);
2544
+ cellNum = 0;
2545
+ toolbarCell.appendChild(table);
2546
+ if (cmd == '-') {
2547
+ KE.g[id].toolbarHeight += KE.g[id].toolbarLineHeight;
2548
+ continue;
2549
+ }
2550
+ }
2551
+ var cell = row.insertCell(cellNum);
2552
+ cell.hideforcus = true;
2553
+ cellNum++;
2554
+ if (cmd == '|') {
2555
+ var div = KE.$$('div');
2556
+ div.className = 'ke-toolbar-separator';
2557
+ cell.appendChild(div);
2558
+ continue;
2559
+ }
2560
+ var a = KE.$$('a');
2561
+ a.tabIndex = -1;
2562
+ self._setAttr(id, a, cmd);
2563
+ var span = KE.$$('span');
2564
+ if (typeof defaultItemHash[cmd] == 'undefined') {
2565
+ span.className = 'ke-common-icon ke-icon-' + cmd;
2566
+ } else {
2567
+ span.className = 'ke-common-icon ke-common-icon-url ke-icon-' + cmd;
2568
+ }
2569
+ a.appendChild(span);
2570
+ cell.appendChild(a);
2571
+ KE.g[id].toolbarIcon[cmd] = [a, span];
2572
+ if (KE.toolbar.isSelected(id, cmd)) KE.toolbar.select(id, cmd);
2573
+ }
2574
+ return toolbar;
2575
+ }
2576
+ };
2577
+
2578
+ KE.history = {
2579
+ addStackData : function(stack, data) {
2580
+ var prev = '';
2581
+ if (stack.length > 0) {
2582
+ prev = stack[stack.length - 1];
2583
+ }
2584
+ if (stack.length == 0 || data !== prev) stack.push(data);
2585
+ },
2586
+ add : function(id, minChangeSize) {
2587
+ var g = KE.g[id];
2588
+ var html = KE.util.getSrcData(id);
2589
+ if (g.undoStack.length > 0) {
2590
+ var prevHtml = g.undoStack[g.undoStack.length - 1];
2591
+ if (Math.abs(html.length - prevHtml.length) < minChangeSize) return;
2592
+ }
2593
+ this.addStackData(g.undoStack, html);
2594
+ },
2595
+ undo : function(id) {
2596
+ var g = KE.g[id];
2597
+ if (g.undoStack.length == 0) return;
2598
+ var html = KE.util.getSrcData(id);
2599
+ this.addStackData(g.redoStack, html);
2600
+ var prevHtml = g.undoStack.pop();
2601
+ if (html === prevHtml && g.undoStack.length > 0) {
2602
+ prevHtml = g.undoStack.pop();
2603
+ }
2604
+ prevHtml = KE.util.toData(id, prevHtml);
2605
+ if (g.wyswygMode) {
2606
+ KE.util.innerHtml(g.iframeDoc.body, KE.util.execSetHtmlHooks(id, prevHtml));
2607
+ } else {
2608
+ g.newTextarea.value = prevHtml;
2609
+ }
2610
+ },
2611
+ redo : function(id) {
2612
+ var g = KE.g[id];
2613
+ if (g.redoStack.length == 0) return;
2614
+ var html = KE.util.getSrcData(id);
2615
+ this.addStackData(g.undoStack, html);
2616
+ var nextHtml = g.redoStack.pop();
2617
+ nextHtml = KE.util.toData(id, nextHtml);
2618
+ if (g.wyswygMode) {
2619
+ KE.util.innerHtml(g.iframeDoc.body, KE.util.execSetHtmlHooks(id, nextHtml));
2620
+ } else {
2621
+ g.newTextarea.value = nextHtml;
2622
+ }
2623
+ }
2624
+ };
2625
+
2626
+ KE.readonly = function(id, isReadonly) {
2627
+ isReadonly = isReadonly == undefined ? true : isReadonly;
2628
+ var g = KE.g[id];
2629
+ if (KE.browser.IE) g.iframeDoc.body.contentEditable = isReadonly ? 'false' : 'true';
2630
+ else g.iframeDoc.designMode = isReadonly ? 'off' : 'on';
2631
+ };
2632
+
2633
+ KE.focus = function(id, position) {
2634
+ position = (position || '').toLowerCase();
2635
+ if (!KE.g[id].container) return;
2636
+ KE.util.focus(id);
2637
+ if (position === 'end') {
2638
+ KE.util.setSelection(id);
2639
+ if (!KE.g[id].sel) return; //issue #120: Sometimes Firefox does not get selection
2640
+ var sel = KE.g[id].keSel,
2641
+ range = KE.g[id].keRange,
2642
+ doc = KE.g[id].iframeDoc;
2643
+ range.selectTextNode(doc.body);
2644
+ range.collapse(false);
2645
+ sel.addRange(range);
2646
+ }
2647
+ };
2648
+
2649
+ KE.blur = function(id) {
2650
+ var g = KE.g[id];
2651
+ if (!g.container) return;
2652
+ if (KE.browser.IE) {
2653
+ var input = KE.$$('input');
2654
+ input.type = 'text';
2655
+ g.container.appendChild(input);
2656
+ input.focus();
2657
+ g.container.removeChild(input);
2658
+ } else {
2659
+ g.wyswygMode ? g.iframeWin.blur() : g.newTextarea.blur();
2660
+ }
2661
+ };
2662
+
2663
+ KE.html = function(id, val) {
2664
+ if (val === undefined) {
2665
+ return KE.util.getData(id);
2666
+ } else {
2667
+ if (!KE.g[id].container) return;
2668
+ KE.util.setFullHtml(id, val);
2669
+ KE.focus(id);
2670
+ }
2671
+ };
2672
+
2673
+ KE.text = function(id, val) {
2674
+ if (val === undefined) {
2675
+ val = KE.html(id);
2676
+ val = val.replace(/<.*?>/ig, '');
2677
+ val = val.replace(/&nbsp;/ig, ' ');
2678
+ val = KE.util.trim(val);
2679
+ return val;
2680
+ } else {
2681
+ KE.html(id, KE.util.escape(val));
2682
+ }
2683
+ };
2684
+
2685
+ KE.insertHtml = function(id, val) {
2686
+ if (!KE.g[id].container) return;
2687
+ var range = KE.g[id].range;
2688
+ if (!range) {
2689
+ KE.appendHtml(id, val);
2690
+ } else {
2691
+ KE.focus(id);
2692
+ KE.util.selection(id);
2693
+ KE.util.insertHtml(id, val);
2694
+ }
2695
+ };
2696
+
2697
+ KE.appendHtml = function(id, val) {
2698
+ KE.html(id, KE.html(id) + val);
2699
+ };
2700
+
2701
+ KE.isEmpty = function(id) {
2702
+ return KE.util.isEmpty(id);
2703
+ };
2704
+
2705
+ KE.selectedHtml = function(id) {
2706
+ var range = KE.g[id].range;
2707
+ if (!range) return '';
2708
+ var html = '';
2709
+ if (KE.browser.IE) {
2710
+ if (range.item) {
2711
+ html = range.item(0).outerHTML;
2712
+ } else {
2713
+ html = range.htmlText;
2714
+ }
2715
+ } else {
2716
+ var temp = KE.$$('div', KE.g[id].iframeDoc);
2717
+ temp.appendChild(range.cloneContents());
2718
+ html = temp.innerHTML;
2719
+ }
2720
+ return KE.util.toData(id, html);
2721
+ };
2722
+
2723
+ KE.count = function(id, mode) {
2724
+ mode = (mode || 'html').toLowerCase();
2725
+ if (mode === 'html') {
2726
+ return KE.html(id).length;
2727
+ } else if (mode === 'text') {
2728
+ var data = KE.util.getPureData(id);
2729
+ data = data.replace(/<(?:img|embed).*?>/ig, 'K');
2730
+ data = data.replace(/\r\n|\n|\r/g, '');
2731
+ data = KE.util.trim(data);
2732
+ return data.length;
2733
+ }
2734
+ return 0;
2735
+ };
2736
+
2737
+ KE.sync = function(id) {
2738
+ return KE.util.setData(id);
2739
+ };
2740
+
2741
+ KE.remove = function(id, mode) {
2742
+ var g = KE.g[id];
2743
+ if (!g.container) return false;
2744
+ mode = (typeof mode == "undefined") ? 0 : mode;
2745
+ KE.util.setData(id);
2746
+ var container = g.container;
2747
+ var eventStack = g.eventStack;
2748
+ for (var i = 0, len = eventStack.length; i < len; i++) {
2749
+ var item = eventStack[i];
2750
+ if (item) KE.event.remove(item.el, item.type, item.fn, id);
2751
+ }
2752
+ g.iframeDoc.src = 'javascript:false';
2753
+ g.iframe.parentNode.removeChild(g.iframe);
2754
+ if (mode == 1) {
2755
+ document.body.removeChild(container);
2756
+ } else {
2757
+ var srcTextarea = g.srcTextarea;
2758
+ srcTextarea.parentNode.removeChild(container);
2759
+ if (mode == 0) srcTextarea.style.display = '';
2760
+ }
2761
+ document.body.removeChild(g.hideDiv);
2762
+ document.body.removeChild(g.maskDiv);
2763
+ g.container = null;
2764
+ g.dialogStack = [];
2765
+ g.contextmenuItems = [];
2766
+ g.getHtmlHooks = [];
2767
+ g.setHtmlHooks = [];
2768
+ g.onchangeHandlerStack = [];
2769
+ g.eventStack = [];
2770
+ };
2771
+
2772
+ KE.create = function(id, mode) {
2773
+ if (KE.g[id].beforeCreate) KE.g[id].beforeCreate(id);
2774
+ if (KE.browser.IE && KE.browser.VERSION < 7) try { document.execCommand('BackgroundImageCache', false, true); }catch(e){}
2775
+ var srcTextarea = KE.$(id) || document.getElementsByName(id)[0];
2776
+ mode = (typeof mode == "undefined") ? 0 : mode;
2777
+ if (mode == 0 && KE.g[id].container) return;
2778
+ var width = KE.g[id].width || srcTextarea.style.width || srcTextarea.offsetWidth + 'px';
2779
+ var height = KE.g[id].height || srcTextarea.style.height || srcTextarea.offsetHeight + 'px';
2780
+ var tableObj = KE.util.createTable();
2781
+ var container = tableObj.table;
2782
+ container.className = 'ke-container';
2783
+ container.style.width = width;
2784
+ container.style.height = height;
2785
+ var toolbarOuter = tableObj.cell;
2786
+ toolbarOuter.className = 'ke-toolbar-outer';
2787
+ var textareaOuter = container.insertRow(1).insertCell(0);
2788
+ textareaOuter.className = 'ke-textarea-outer';
2789
+ tableObj = KE.util.createTable();
2790
+ var textareaTable = tableObj.table;
2791
+ textareaTable.className = 'ke-textarea-table';
2792
+ var textareaCell = tableObj.cell;
2793
+ textareaOuter.appendChild(textareaTable);
2794
+ var bottomOuter = container.insertRow(2).insertCell(0);
2795
+ bottomOuter.className = 'ke-bottom-outer';
2796
+ srcTextarea.style.display = 'none';
2797
+ if (mode == 1) document.body.appendChild(container);
2798
+ else srcTextarea.parentNode.insertBefore(container, srcTextarea);
2799
+ var toolbarTable = KE.toolbar.create(id);
2800
+ toolbarTable.style.height = KE.g[id].toolbarHeight + 'px';
2801
+ toolbarOuter.appendChild(toolbarTable);
2802
+ var iframe = KE.g[id].iframe || KE.$$('iframe');
2803
+ iframe.tabIndex = KE.g[id].tabIndex || srcTextarea.tabIndex;
2804
+ iframe.className = 'ke-iframe';
2805
+ iframe.setAttribute("frameBorder", "0");
2806
+ var newTextarea = KE.$$('textarea');
2807
+ newTextarea.tabIndex = iframe.tabIndex;
2808
+ newTextarea.className = 'ke-textarea';
2809
+ newTextarea.style.display = 'none';
2810
+ KE.g[id].container = container;
2811
+ KE.g[id].iframe = iframe;
2812
+ KE.g[id].newTextarea = newTextarea;
2813
+ KE.util.resize(id, width, height);
2814
+ textareaCell.appendChild(iframe);
2815
+ textareaCell.appendChild(newTextarea);
2816
+ var bottom = KE.$$('table');
2817
+ bottom.className = 'ke-bottom';
2818
+ bottom.cellPadding = 0;
2819
+ bottom.cellSpacing = 0;
2820
+ bottom.border = 0;
2821
+ bottom.style.height = KE.g[id].statusbarHeight + 'px';
2822
+ var row = bottom.insertRow(0);
2823
+ var bottomLeft = row.insertCell(0);
2824
+ bottomLeft.className = 'ke-bottom-left';
2825
+ var leftImg = KE.$$('span');
2826
+ leftImg.className = 'ke-bottom-left-img';
2827
+ if (KE.g[id].config.resizeMode == 0 || mode == 1) {
2828
+ bottomLeft.style.cursor = 'default';
2829
+ leftImg.style.visibility = 'hidden';
2830
+ }
2831
+ bottomLeft.appendChild(leftImg);
2832
+ var bottomRight = row.insertCell(1);
2833
+ bottomRight.className = 'ke-bottom-right';
2834
+ var rightImg = KE.$$('span');
2835
+ rightImg.className = 'ke-bottom-right-img';
2836
+ if (KE.g[id].config.resizeMode == 0 || mode == 1) {
2837
+ bottomRight.style.cursor = 'default';
2838
+ rightImg.style.visibility = 'hidden';
2839
+ } else if (KE.g[id].config.resizeMode == 1) {
2840
+ bottomRight.style.cursor = 's-resize';
2841
+ rightImg.style.visibility = 'hidden';
2842
+ }
2843
+ bottomRight.appendChild(rightImg);
2844
+ bottomOuter.appendChild(bottom);
2845
+ var hideDiv = KE.$$('div');
2846
+ hideDiv.className = 'ke-reset';
2847
+ hideDiv.style.display = 'none';
2848
+ var maskDiv = KE.$$('div');
2849
+ maskDiv.className = 'ke-mask';
2850
+ KE.util.setOpacity(maskDiv, 50);
2851
+ KE.event.bind(maskDiv, 'click', function(e){}, id);
2852
+ KE.event.bind(maskDiv, 'mousedown', function(e){}, id);
2853
+ document.body.appendChild(hideDiv);
2854
+ document.body.appendChild(maskDiv);
2855
+ KE.util.setDefaultPlugin(id);
2856
+ var iframeWin = iframe.contentWindow;
2857
+ var iframeDoc = KE.util.getIframeDoc(iframe);
2858
+ if (!KE.browser.IE) iframeDoc.designMode = 'on';
2859
+ var html = KE.util.getFullHtml(id);
2860
+ iframeDoc.open();
2861
+ iframeDoc.write(html);
2862
+ iframeDoc.close();
2863
+ if (!KE.g[id].wyswygMode) {
2864
+ newTextarea.value = KE.util.execSetHtmlHooks(id, srcTextarea.value);
2865
+ newTextarea.style.display = 'block';
2866
+ iframe.style.display = 'none';
2867
+ KE.toolbar.disable(id, ['source', 'fullscreen']);
2868
+ KE.toolbar.select(id, 'source');
2869
+ }
2870
+ if (KE.g[id].syncType == 'form') {
2871
+ var el = srcTextarea;
2872
+ while ((el = el.parentNode)) {
2873
+ if (el.nodeName.toLowerCase() == 'form') {
2874
+ KE.event.add(el, 'submit', function() { KE.sync(id); }, id);
2875
+ break;
2876
+ }
2877
+ }
2878
+ }
2879
+ function hideMenu() {
2880
+ KE.hideMenu(id);
2881
+ }
2882
+ function updateToolbar() {
2883
+ KE.toolbar.updateState(id);
2884
+ }
2885
+ if (KE.browser.WEBKIT) {
2886
+ KE.event.add(iframeDoc, 'click', function(e) {
2887
+ KE.util.selectImageWebkit(id, e, true);
2888
+ }, id);
2889
+ }
2890
+ if (KE.browser.IE) {
2891
+ KE.event.add(iframeDoc, 'keydown', function(e) {
2892
+ if (e.keyCode == 8) {
2893
+ var range = KE.g[id].range;
2894
+ if (range.item) {
2895
+ var item = range.item(0);
2896
+ item.parentNode.removeChild(item);
2897
+ KE.util.execOnchangeHandler(id);
2898
+ KE.event.stop(id);
2899
+ return false;
2900
+ }
2901
+ }
2902
+ }, id);
2903
+ }
2904
+ function afterFocus() {
2905
+ if (KE.g[id].afterFocus) KE.g[id].afterFocus(id);
2906
+ }
2907
+ function afterBlur() {
2908
+ if (KE.g[id].afterBlur) KE.g[id].afterBlur(id);
2909
+ }
2910
+ KE.event.add(iframeDoc, 'mousedown', hideMenu, id);
2911
+ KE.event.add(iframeDoc, 'click', updateToolbar, id);
2912
+ KE.event.input(iframeDoc, updateToolbar, id);
2913
+ KE.event.bind(newTextarea, 'click', hideMenu, id);
2914
+ KE.event.add(document, 'click', hideMenu, id);
2915
+ KE.event.add(iframeWin, 'focus', afterFocus);
2916
+ KE.event.add(newTextarea, 'focus', afterFocus);
2917
+ KE.event.add(iframeWin, 'blur', afterBlur);
2918
+ KE.event.add(newTextarea, 'blur', afterBlur);
2919
+ KE.g[id].toolbarTable = toolbarTable;
2920
+ KE.g[id].textareaTable = textareaTable;
2921
+ KE.g[id].srcTextarea = srcTextarea;
2922
+ KE.g[id].bottom = bottom;
2923
+ KE.g[id].hideDiv = hideDiv;
2924
+ KE.g[id].maskDiv = maskDiv;
2925
+ KE.g[id].iframeWin = iframeWin;
2926
+ KE.g[id].iframeDoc = iframeDoc;
2927
+ KE.g[id].width = width;
2928
+ KE.g[id].height = height;
2929
+ KE.util.drag(id, bottomRight, container, function(objTop, objLeft, objWidth, objHeight, top, left) {
2930
+ if (KE.g[id].resizeMode == 2) KE.util.resize(id, (objWidth + left) + 'px', (objHeight + top) + 'px', true);
2931
+ else if (KE.g[id].resizeMode == 1) KE.util.resize(id, objWidth + 'px', (objHeight + top) + 'px', true, false);
2932
+ });
2933
+ KE.util.drag(id, bottomLeft, container, function(objTop, objLeft, objWidth, objHeight, top, left) {
2934
+ if (KE.g[id].resizeMode > 0) KE.util.resize(id, objWidth + 'px', (objHeight + top) + 'px', true, false);
2935
+ });
2936
+ KE.each(KE.plugin, function(cmd, plugin) {
2937
+ if (plugin.init) plugin.init(id);
2938
+ });
2939
+ KE.g[id].getHtmlHooks.push(function(html) {
2940
+ html = html.replace(/(<[^>]*)kesrc="([^"]+)"([^>]*>)/ig, function(full, start, src, end) {
2941
+ full = full.replace(/(\s+(?:href|src)=")[^"]+(")/i, '$1' + src + '$2');
2942
+ full = full.replace(/\s+kesrc="[^"]+"/i, '');
2943
+ return full;
2944
+ });
2945
+ html = html.replace(/(<[^>]+\s)ke-(on\w+="[^"]+"[^>]*>)/ig, function(full, start, end) {
2946
+ return start + end;
2947
+ });
2948
+ return html;
2949
+ });
2950
+ KE.g[id].setHtmlHooks.push(function(html) {
2951
+ html = html.replace(/(<[^>]*)(href|src)="([^"]+)"([^>]*>)/ig, function(full, start, key, src, end) {
2952
+ if (full.match(/\skesrc="[^"]+"/i)) return full;
2953
+ full = start + key + '="' + src + '"' + ' kesrc="' + src + '"' + end;
2954
+ return full;
2955
+ });
2956
+ html = html.replace(/(<[^>]+\s)(on\w+="[^"]+"[^>]*>)/ig, function(full, start, end) {
2957
+ return start + 'ke-' + end;
2958
+ });
2959
+ return html;
2960
+ });
2961
+ KE.util.addContextmenuEvent(id);
2962
+ KE.util.addNewlineEvent(id);
2963
+ KE.util.addTabEvent(id);
2964
+ function setSelectionHandler() {
2965
+ KE.util.setSelection(id);
2966
+ }
2967
+ KE.event.input(iframeDoc, setSelectionHandler, id);
2968
+ KE.event.add(iframeDoc, 'mouseup', setSelectionHandler, id);
2969
+ KE.event.add(document, 'mousedown', setSelectionHandler, id);
2970
+ KE.onchange(id, function(id) {
2971
+ if (KE.g[id].autoSetDataMode || KE.g[id].syncType == 'auto') {
2972
+ KE.util.setData(id);
2973
+ if (KE.g[id].afterSetData) KE.g[id].afterSetData(id);
2974
+ }
2975
+ if (KE.g[id].afterChange) KE.g[id].afterChange(id);
2976
+ KE.history.add(id, KE.g[id].minChangeSize);
2977
+ });
2978
+ if (KE.browser.IE) {
2979
+ iframeDoc.body.disabled = true;
2980
+ KE.readonly(id, false);
2981
+ iframeDoc.body.removeAttribute('disabled');
2982
+ }
2983
+ KE.util.setFullHtml(id, srcTextarea.value);
2984
+ KE.history.add(id, 0);
2985
+ if (mode > 0) KE.util.focus(id);
2986
+ if (KE.g[id].afterCreate) KE.g[id].afterCreate(id);
2987
+ };
2988
+
2989
+ KE.onchange = function(id, func) {
2990
+ var g = KE.g[id];
2991
+ function handler() {
2992
+ func(id);
2993
+ };
2994
+ g.onchangeHandlerStack.push(handler);
2995
+ KE.event.input(g.iframeDoc, handler, id);
2996
+ KE.event.input(g.newTextarea, handler, id);
2997
+ KE.event.add(g.iframeDoc, 'mouseup', function(e) {
2998
+ window.setTimeout(function() {
2999
+ func(id);
3000
+ }, 0);
3001
+ }, id);
3002
+ };
3003
+
3004
+ var _needStyle = true;
3005
+
3006
+ KE.init = function(args) {
3007
+ var g = KE.g[args.id] = args;
3008
+ g.config = {};
3009
+ g.undoStack = [];
3010
+ g.redoStack = [];
3011
+ g.dialogStack = [];
3012
+ g.contextmenuItems = [];
3013
+ g.getHtmlHooks = [];
3014
+ g.setHtmlHooks = [];
3015
+ g.onchangeHandlerStack = [];
3016
+ g.eventStack = [];
3017
+ KE.each(KE.setting, function(key, val) {
3018
+ g[key] = (typeof args[key] == 'undefined') ? val : args[key];
3019
+ g.config[key] = g[key];
3020
+ });
3021
+ if (g.loadStyleMode && _needStyle) {
3022
+ KE.util.loadStyle(g.skinsPath + g.skinType + '.css');
3023
+ _needStyle = false;
3024
+ }
3025
+ }
3026
+
3027
+ KE.show = function(args) {
3028
+ KE.init(args);
3029
+ KE.event.ready(function() { KE.create(args.id); });
3030
+ };
3031
+
3032
+ if (window.KE === undefined) window.KE = KE;
3033
+ window.KindEditor = KE;
3034
+
3035
+ })();
3036
+
3037
+ (function (KE, undefined) {
3038
+
3039
+ KE.langType = 'en';
3040
+
3041
+ KE.lang = {
3042
+ source : 'Source',
3043
+ undo : 'Undo(Ctrl+Z)',
3044
+ redo : 'Redo(Ctrl+Y)',
3045
+ cut : 'Cut(Ctrl+X)',
3046
+ copy : 'Copy(Ctrl+C)',
3047
+ paste : 'Paste(Ctrl+V)',
3048
+ plainpaste : 'Paste as plain text',
3049
+ wordpaste : 'Paste from Word',
3050
+ selectall : 'Select all',
3051
+ justifyleft : 'Align left',
3052
+ justifycenter : 'Align center',
3053
+ justifyright : 'Align right',
3054
+ justifyfull : 'Align full',
3055
+ insertorderedlist : 'Ordered list',
3056
+ insertunorderedlist : 'Unordered list',
3057
+ indent : 'Increase indent',
3058
+ outdent : 'Decrease indent',
3059
+ subscript : 'Subscript',
3060
+ superscript : 'Superscript',
3061
+ title : 'Paragraph format',
3062
+ fontname : 'Font family',
3063
+ fontsize : 'Font size',
3064
+ textcolor : 'Text color',
3065
+ bgcolor : 'Highlight color',
3066
+ bold : 'Bold(Ctrl+B)',
3067
+ italic : 'Italic(Ctrl+I)',
3068
+ underline : 'Underline(Ctrl+U)',
3069
+ strikethrough : 'Strikethrough',
3070
+ removeformat : 'Remove format',
3071
+ image : 'Image',
3072
+ flash : 'Insert Flash',
3073
+ media : 'Insert embeded media',
3074
+ table : 'Insert table',
3075
+ hr : 'Insert horizontal line',
3076
+ emoticons : 'Insert emoticon',
3077
+ link : 'Link',
3078
+ unlink : 'Unlink',
3079
+ fullscreen : 'Toggle fullscreen mode',
3080
+ about : 'About',
3081
+ print : 'Print',
3082
+ fileManager : 'File Manager',
3083
+ advtable : 'Table',
3084
+ tablecell : 'Cell',
3085
+ yes : 'OK',
3086
+ no : 'Cancel',
3087
+ close : 'Close',
3088
+ editImage : 'Image properties',
3089
+ deleteImage : 'Delete image',
3090
+ editLink : 'Link properties',
3091
+ deleteLink : 'Unlink',
3092
+ tableprop : 'Table properties',
3093
+ tablecellprop : 'Cell properties',
3094
+ tableinsert : 'Insert table',
3095
+ tabledelete : 'Delete table',
3096
+ tablecolinsertleft : 'Insert column left',
3097
+ tablecolinsertright : 'Insert column right',
3098
+ tablerowinsertabove : 'Insert row above',
3099
+ tablerowinsertbelow : 'Insert row below',
3100
+ tablecoldelete : 'Delete column',
3101
+ tablerowdelete : 'Delete row',
3102
+ noColor : 'Default',
3103
+ invalidImg : "Please type valid URL.\nAllowed file extension: jpg,gif,bmp,png",
3104
+ invalidMedia : "Please type valid URL.\nAllowed file extension: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb",
3105
+ invalidWidth : "The width must be number.",
3106
+ invalidHeight : "The height must be number.",
3107
+ invalidBorder : "The border must be number.",
3108
+ invalidUrl : "Please type valid URL.",
3109
+ invalidRows : 'Invalid rows.',
3110
+ invalidCols : 'Invalid columns.',
3111
+ invalidPadding : 'The padding must be number.',
3112
+ invalidSpacing : 'The spacing must be number.',
3113
+ invalidBorder : 'The border width must be number.',
3114
+ pleaseInput : "Please type content.",
3115
+ invalidJson : 'Invalid JSON string.',
3116
+ cutError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+X) instead.',
3117
+ copyError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+C) instead.',
3118
+ pasteError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+V) instead.',
3119
+ accessory : 'Insert file.',
3120
+ invalidAccessory : 'Only doc,xls,pdf,docx,xlsx,pptx,txt,ppt,rar,zip Files can upload.'
3121
+ };
3122
+
3123
+ var plugins = KE.lang.plugins = {};
3124
+
3125
+ plugins.about = {
3126
+ version : KE.version,
3127
+ title : 'WYSIWYG Editor'
3128
+ };
3129
+
3130
+ plugins.plainpaste = {
3131
+ comment : 'Use keyboard shortcut(Ctrl+V) to paste the text into the window.'
3132
+ };
3133
+
3134
+ plugins.wordpaste = {
3135
+ comment : 'Use keyboard shortcut(Ctrl+V) to paste the text into the window.'
3136
+ };
3137
+
3138
+ plugins.link = {
3139
+ url : 'Link URL',
3140
+ linkType : 'Target',
3141
+ newWindow : 'New window',
3142
+ selfWindow : 'Same window'
3143
+ };
3144
+
3145
+ plugins.flash = {
3146
+ url : 'Flash URL',
3147
+ width : 'Width',
3148
+ height : 'Height'
3149
+ };
3150
+
3151
+ plugins.media = {
3152
+ url : 'Media URL',
3153
+ width : 'Width',
3154
+ height : 'Height',
3155
+ autostart : 'Auto start'
3156
+ };
3157
+
3158
+ plugins.image = {
3159
+ remoteImage : 'Insert URL',
3160
+ localImage : 'Upload',
3161
+ remoteUrl : 'URL',
3162
+ localUrl : 'File',
3163
+ size : 'Size',
3164
+ width : 'Width',
3165
+ height : 'Height',
3166
+ resetSize : 'Reset dimensions',
3167
+ align : 'Align',
3168
+ defaultAlign : 'Default',
3169
+ leftAlign : 'Left',
3170
+ rightAlign : 'Right',
3171
+ imgTitle : 'Title',
3172
+ viewServer : 'Browse'
3173
+ };
3174
+
3175
+ plugins.file_manager = {
3176
+ emptyFolder : 'Blank',
3177
+ moveup : 'Parent folder',
3178
+ viewType : 'Display: ',
3179
+ viewImage : 'Thumbnails',
3180
+ listImage : 'List',
3181
+ orderType : 'Sorting: ',
3182
+ fileName : 'By name',
3183
+ fileSize : 'By size',
3184
+ fileType : 'By type'
3185
+ };
3186
+
3187
+ plugins.advtable = {
3188
+ cells : 'Cells',
3189
+ rows : 'Rows',
3190
+ cols : 'Columns',
3191
+ size : 'Size',
3192
+ width : 'Width',
3193
+ height : 'Height',
3194
+ percent : '%',
3195
+ px : 'px',
3196
+ space : 'Space',
3197
+ padding : 'Padding',
3198
+ spacing : 'Spacing',
3199
+ align : 'Align',
3200
+ textAlign : 'Horizontal',
3201
+ verticalAlign : 'Vertical',
3202
+ alignDefault : 'Default',
3203
+ alignLeft : 'Left',
3204
+ alignCenter : 'Center',
3205
+ alignRight : 'Right',
3206
+ alignTop : 'Top',
3207
+ alignMiddle : 'Middle',
3208
+ alignBottom : 'Bottom',
3209
+ alignBaseline : 'Baseline',
3210
+ border : 'Border',
3211
+ borderWidth : 'Width',
3212
+ borderColor : 'Color',
3213
+ backgroundColor : 'Background'
3214
+ };
3215
+
3216
+ plugins.title = {
3217
+ h1 : 'Heading 1',
3218
+ h2 : 'Heading 2',
3219
+ h3 : 'Heading 3',
3220
+ h4 : 'Heading 4',
3221
+ p : 'Normal'
3222
+ };
3223
+
3224
+ plugins.fontname = {
3225
+ fontName : {
3226
+ 'Arial' : 'Arial',
3227
+ 'Arial Black' : 'Arial Black',
3228
+ 'Comic Sans MS' : 'Comic Sans MS',
3229
+ 'Courier New' : 'Courier New',
3230
+ 'Garamond' : 'Garamond',
3231
+ 'Georgia' : 'Georgia',
3232
+ 'Tahoma' : 'Tahoma',
3233
+ 'Times New Roman' : 'Times New Roman',
3234
+ 'Trebuchet MS' : 'Trebuchet MS',
3235
+ 'Verdana' : 'Verdana'
3236
+ }
3237
+ };
3238
+
3239
+ })(KindEditor);
3240
+
3241
+ (function (KE, undefined) {
3242
+
3243
+ KE.plugin.about = {
3244
+ click : function(id) {
3245
+ KE.util.selection(id);
3246
+ var dialog = new KE.dialog({
3247
+ id : id,
3248
+ cmd : 'about',
3249
+ file : 'about.html',
3250
+ width : 300,
3251
+ height : 70,
3252
+ loadingMode : true,
3253
+ title : KE.lang['about'],
3254
+ noButton : KE.lang['close']
3255
+ });
3256
+ dialog.show();
3257
+ }
3258
+ };
3259
+
3260
+ KE.plugin.undo = {
3261
+ init : function(id) {
3262
+ KE.event.ctrl(KE.g[id].iframeDoc, 'Z', function(e) {
3263
+ KE.plugin['undo'].click(id);
3264
+ KE.util.focus(id);
3265
+ }, id);
3266
+ KE.event.ctrl(KE.g[id].newTextarea, 'Z', function(e) {
3267
+ KE.plugin['undo'].click(id);
3268
+ KE.util.focus(id);
3269
+ }, id);
3270
+ },
3271
+ click : function(id) {
3272
+ KE.history.undo(id);
3273
+ KE.util.execOnchangeHandler(id);
3274
+ }
3275
+ };
3276
+
3277
+ KE.plugin.redo = {
3278
+ init : function(id) {
3279
+ KE.event.ctrl(KE.g[id].iframeDoc, 'Y', function(e) {
3280
+ KE.plugin['redo'].click(id);
3281
+ KE.util.focus(id);
3282
+ }, id);
3283
+ KE.event.ctrl(KE.g[id].newTextarea, 'Y', function(e) {
3284
+ KE.plugin['redo'].click(id);
3285
+ KE.util.focus(id);
3286
+ }, id);
3287
+ },
3288
+ click : function(id) {
3289
+ KE.history.redo(id);
3290
+ KE.util.execOnchangeHandler(id);
3291
+ }
3292
+ };
3293
+
3294
+ KE.plugin.cut = {
3295
+ click : function(id) {
3296
+ try {
3297
+ if (!KE.g[id].iframeDoc.queryCommandSupported('cut')) throw 'e';
3298
+ } catch(e) {
3299
+ alert(KE.lang.cutError);
3300
+ return;
3301
+ }
3302
+ KE.util.execCommand(id, 'cut', null);
3303
+ }
3304
+ };
3305
+
3306
+ KE.plugin.copy = {
3307
+ click : function(id) {
3308
+ try {
3309
+ if (!KE.g[id].iframeDoc.queryCommandSupported('copy')) throw 'e';
3310
+ } catch(e) {
3311
+ alert(KE.lang.copyError);
3312
+ return;
3313
+ }
3314
+ KE.util.execCommand(id, 'copy', null);
3315
+ }
3316
+ };
3317
+
3318
+ KE.plugin.paste = {
3319
+ click : function(id) {
3320
+ try {
3321
+ if (!KE.g[id].iframeDoc.queryCommandSupported('paste')) throw 'e';
3322
+ } catch(e) {
3323
+ alert(KE.lang.pasteError);
3324
+ return;
3325
+ }
3326
+ KE.util.execCommand(id, 'paste', null);
3327
+ }
3328
+ };
3329
+
3330
+ KE.plugin.plainpaste = {
3331
+ click : function(id) {
3332
+ KE.util.selection(id);
3333
+ this.dialog = new KE.dialog({
3334
+ id : id,
3335
+ cmd : 'plainpaste',
3336
+ file : 'plainpaste.html',
3337
+ width : 450,
3338
+ height : 300,
3339
+ loadingMode : true,
3340
+ title : KE.lang['plainpaste'],
3341
+ yesButton : KE.lang['yes'],
3342
+ noButton : KE.lang['no']
3343
+ });
3344
+ this.dialog.show();
3345
+ },
3346
+ exec : function(id) {
3347
+ var dialogDoc = KE.util.getIframeDoc(this.dialog.iframe);
3348
+ var html = KE.$('textArea', dialogDoc).value;
3349
+ html = KE.util.escape(html);
3350
+ html = html.replace(/ /g, '&nbsp;');
3351
+ if (KE.g[id].newlineTag == 'p') {
3352
+ html = html.replace(/^/, '<p>').replace(/$/, '</p>').replace(/\r\n|\n|\r/g, '</p><p>');
3353
+ } else {
3354
+ html = html.replace(/\r\n|\n|\r/g, '<br />$&');
3355
+ }
3356
+ KE.util.insertHtml(id, html);
3357
+ this.dialog.hide();
3358
+ KE.util.focus(id);
3359
+ }
3360
+ };
3361
+
3362
+ KE.plugin.wordpaste = {
3363
+ click : function(id) {
3364
+ KE.util.selection(id);
3365
+ this.dialog = new KE.dialog({
3366
+ id : id,
3367
+ cmd : 'wordpaste',
3368
+ file : 'wordpaste.html',
3369
+ width : 450,
3370
+ height : 300,
3371
+ loadingMode : true,
3372
+ title : KE.lang['wordpaste'],
3373
+ yesButton : KE.lang['yes'],
3374
+ noButton : KE.lang['no']
3375
+ });
3376
+ this.dialog.show();
3377
+ },
3378
+ exec : function(id) {
3379
+ var dialogDoc = KE.util.getIframeDoc(this.dialog.iframe);
3380
+ var wordIframe = KE.$('wordIframe', dialogDoc);
3381
+ var str = KE.util.getIframeDoc(wordIframe).body.innerHTML;
3382
+ str = str.replace(/<meta(\n|.)*?>/ig, "");
3383
+ str = str.replace(/<!(\n|.)*?>/ig, "");
3384
+ str = str.replace(/<style[^>]*>(\n|.)*?<\/style>/ig, "");
3385
+ str = str.replace(/<script[^>]*>(\n|.)*?<\/script>/ig, "");
3386
+ str = str.replace(/<w:[^>]+>(\n|.)*?<\/w:[^>]+>/ig, "");
3387
+ str = str.replace(/<xml>(\n|.)*?<\/xml>/ig, "");
3388
+ str = str.replace(/\r\n|\n|\r/ig, "");
3389
+ str = KE.util.execGetHtmlHooks(id, str);
3390
+ str = KE.format.getHtml(str, KE.g[id].htmlTags, KE.g[id].urlType);
3391
+ KE.util.insertHtml(id, str);
3392
+ this.dialog.hide();
3393
+ KE.util.focus(id);
3394
+ }
3395
+ };
3396
+
3397
+ KE.plugin.fullscreen = {
3398
+ click : function(id) {
3399
+ var g = KE.g[id];
3400
+ var self = this;
3401
+ var resetSize = function() {
3402
+ var el = KE.util.getDocumentElement();
3403
+ g.width = el.clientWidth + 'px';
3404
+ g.height = el.clientHeight + 'px';
3405
+ };
3406
+ var windowSize = '';
3407
+ var resizeListener = function() {
3408
+ if (!self.isSelected) return;
3409
+ var el = KE.util.getDocumentElement();
3410
+ var size = [el.clientWidth, el.clientHeight].join('');
3411
+ if (windowSize != size) {
3412
+ windowSize = size;
3413
+ resetSize();
3414
+ KE.util.resize(id, g.width, g.height);
3415
+ }
3416
+ }
3417
+ if (this.isSelected) {
3418
+ this.isSelected = false;
3419
+ KE.util.setData(id);
3420
+ KE.remove(id, 1);
3421
+ g.width = this.width;
3422
+ g.height = this.height;
3423
+ KE.create(id, 2);
3424
+ document.body.parentNode.style.overflow = 'auto';
3425
+ KE.event.remove(window, 'resize', resizeListener);
3426
+ g.resizeMode = g.config.resizeMode;
3427
+ KE.toolbar.unselect(id, "fullscreen");
3428
+ } else {
3429
+ this.isSelected = true;
3430
+ this.width = g.container.style.width;
3431
+ this.height = g.container.style.height;
3432
+ KE.util.setData(id);
3433
+ KE.remove(id, 2);
3434
+ document.body.parentNode.style.overflow = 'hidden';
3435
+ resetSize();
3436
+ KE.create(id, 1);
3437
+ var pos = KE.util.getScrollPos();
3438
+ var div = g.container;
3439
+ div.style.position = 'absolute';
3440
+ div.style.left = pos.x + 'px';
3441
+ div.style.top = pos.y + 'px';
3442
+ div.style.zIndex = 19811211;
3443
+ KE.event.add(window, 'resize', resizeListener);
3444
+ g.resizeMode = 0;
3445
+ KE.toolbar.select(id, "fullscreen");
3446
+ }
3447
+ }
3448
+ };
3449
+
3450
+ KE.plugin.bgcolor = {
3451
+ click : function(id) {
3452
+ KE.util.selection(id);
3453
+ var color = KE.queryCommandValue(KE.g[id].iframeDoc, 'bgcolor');
3454
+ this.menu = new KE.menu({
3455
+ id : id,
3456
+ cmd : 'bgcolor'
3457
+ });
3458
+ this.menu.picker(color);
3459
+ },
3460
+ exec : function(id, value) {
3461
+ var cmd = new KE.cmd(id);
3462
+ if (value == '') {
3463
+ cmd.remove({
3464
+ 'span' : ['.background-color']
3465
+ });
3466
+ } else {
3467
+ cmd.wrap('span', [{'.background-color': value}]);
3468
+ }
3469
+ KE.util.execOnchangeHandler(id);
3470
+ this.menu.hide();
3471
+ KE.util.focus(id);
3472
+ }
3473
+ };
3474
+
3475
+ KE.plugin.fontname = {
3476
+ click : function(id) {
3477
+ var fontName = KE.lang.plugins.fontname.fontName;
3478
+ var cmd = 'fontname';
3479
+ KE.util.selection(id);
3480
+ var menu = new KE.menu({
3481
+ id : id,
3482
+ cmd : cmd,
3483
+ width : 150
3484
+ });
3485
+ var font = KE.queryCommandValue(KE.g[id].iframeDoc, cmd);
3486
+ KE.each(fontName, function(key, value) {
3487
+ var html = '<span class="ke-reset" style="font-family: ' + key + ';">' + value + '</span>';
3488
+ menu.add(
3489
+ html,
3490
+ function() { KE.plugin[cmd].exec(id, key); },
3491
+ { checked : (font === key.toLowerCase() || font === value.toLowerCase()) }
3492
+ );
3493
+ });
3494
+ menu.show();
3495
+ this.menu = menu;
3496
+ },
3497
+ exec : function(id, value) {
3498
+ var cmd = new KE.cmd(id);
3499
+ cmd.wrap('span', [{'.font-family': value}]);
3500
+ KE.util.execOnchangeHandler(id);
3501
+ this.menu.hide();
3502
+ KE.util.focus(id);
3503
+ }
3504
+ };
3505
+
3506
+ KE.plugin.fontsize = {
3507
+ click : function(id) {
3508
+ var fontSize = ['9px', '10px', '12px', '14px', '16px', '18px', '24px', '32px'];
3509
+ var cmd = 'fontsize';
3510
+ KE.util.selection(id);
3511
+ var size = KE.queryCommandValue(KE.g[id].iframeDoc, 'fontsize');
3512
+ var menu = new KE.menu({
3513
+ id : id,
3514
+ cmd : cmd,
3515
+ width : 120
3516
+ });
3517
+ for (var i = 0, len = fontSize.length; i < len; i++) {
3518
+ var value = fontSize[i];
3519
+ var html = '<span class="ke-reset" style="font-size: ' + value + ';">' + value + '</span>';
3520
+ menu.add(
3521
+ html,
3522
+ (function(value) {
3523
+ return function() {
3524
+ KE.plugin[cmd].exec(id, value);
3525
+ };
3526
+ })(value),
3527
+ {
3528
+ height : (parseInt(value) + 12) + 'px',
3529
+ checked : (size === value)
3530
+ }
3531
+ );
3532
+ }
3533
+ menu.show();
3534
+ this.menu = menu;
3535
+ },
3536
+ exec : function(id, value) {
3537
+ var cmd = new KE.cmd(id);
3538
+ cmd.wrap('span', [{'.font-size': value}]);
3539
+ KE.util.execOnchangeHandler(id);
3540
+ this.menu.hide();
3541
+ KE.util.focus(id);
3542
+ }
3543
+ };
3544
+
3545
+ KE.plugin.hr = {
3546
+ click : function(id) {
3547
+ KE.util.selection(id);
3548
+ KE.util.insertHtml(id, '<hr />');
3549
+ KE.util.focus(id);
3550
+ }
3551
+ };
3552
+
3553
+ KE.plugin.print = {
3554
+ click : function(id) {
3555
+ KE.util.selection(id);
3556
+ KE.g[id].iframeWin.print();
3557
+ }
3558
+ };
3559
+
3560
+ KE.plugin.removeformat = {
3561
+ click : function(id) {
3562
+ KE.util.selection(id);
3563
+ var cmd = new KE.cmd(id);
3564
+ var tags = {
3565
+ '*' : ['class', 'style']
3566
+ };
3567
+ for (var i = 0, len = KE.g[id].inlineTags.length; i < len; i++) {
3568
+ tags[KE.g[id].inlineTags[i]] = ['*'];
3569
+ }
3570
+ cmd.remove(tags);
3571
+ KE.util.execOnchangeHandler(id);
3572
+ KE.toolbar.updateState(id);
3573
+ KE.util.focus(id);
3574
+ }
3575
+ };
3576
+
3577
+ KE.plugin.source = {
3578
+ click : function(id) {
3579
+ var g = KE.g[id];
3580
+ if (!g.wyswygMode) {
3581
+ KE.util.setFullHtml(id, g.newTextarea.value);
3582
+ g.iframe.style.display = 'block';
3583
+ g.newTextarea.style.display = 'none';
3584
+ KE.toolbar.able(id, ['source', 'fullscreen']);
3585
+ g.wyswygMode = true;
3586
+ this.isSelected = false;
3587
+ KE.toolbar.unselect(id, "source");
3588
+ } else {
3589
+ KE.hideMenu(id);
3590
+ g.newTextarea.value = KE.util.getData(id);
3591
+ g.iframe.style.display = 'none';
3592
+ g.newTextarea.style.display = 'block';
3593
+ KE.toolbar.disable(id, ['source', 'fullscreen']);
3594
+ g.wyswygMode = false;
3595
+ this.isSelected = true;
3596
+ KE.toolbar.select(id, "source");
3597
+ }
3598
+ KE.util.focus(id);
3599
+ }
3600
+ };
3601
+
3602
+ KE.plugin.textcolor = {
3603
+ click : function(id) {
3604
+ KE.util.selection(id);
3605
+ var color = KE.queryCommandValue(KE.g[id].iframeDoc, 'textcolor');
3606
+ this.menu = new KE.menu({
3607
+ id : id,
3608
+ cmd : 'textcolor'
3609
+ });
3610
+ this.menu.picker(color);
3611
+ },
3612
+ exec : function(id, value) {
3613
+ var cmd = new KE.cmd(id);
3614
+ if (value == '') {
3615
+ cmd.remove({
3616
+ 'span' : ['.color'],
3617
+ 'font' : ['color']
3618
+ });
3619
+ } else {
3620
+ cmd.wrap('span', [{'.color': value}]);
3621
+ }
3622
+ KE.util.execOnchangeHandler(id);
3623
+ this.menu.hide();
3624
+ KE.util.focus(id);
3625
+ }
3626
+ };
3627
+
3628
+ KE.plugin.title = {
3629
+ click : function(id) {
3630
+ var lang = KE.lang.plugins.title;
3631
+ var title = {
3632
+ 'H1' : lang.h1,
3633
+ 'H2' : lang.h2,
3634
+ 'H3' : lang.h3,
3635
+ 'H4' : lang.h4,
3636
+ 'P' : lang.p
3637
+ };
3638
+ var sizeHash = {
3639
+ 'H1' : 28,
3640
+ 'H2' : 24,
3641
+ 'H3' : 18,
3642
+ 'H4' : 14,
3643
+ 'P' : 12
3644
+ };
3645
+ var cmd = 'title';
3646
+ KE.util.selection(id);
3647
+ var block = KE.queryCommandValue(KE.g[id].iframeDoc, 'formatblock');
3648
+ var menu = new KE.menu({
3649
+ id : id,
3650
+ cmd : cmd,
3651
+ width : (KE.langType == 'en' ? 200 : 150)
3652
+ });
3653
+ KE.each(title, function(key, value) {
3654
+ var style = 'font-size:' + sizeHash[key] + 'px;'
3655
+ if (key !== 'P') style += 'font-weight:bold;';
3656
+ var html = '<span class="ke-reset" style="' + style + '">' + value + '</span>';
3657
+ menu.add(html, function() {
3658
+ KE.plugin[cmd].exec(id, '<' + key + '>'); },
3659
+ {
3660
+ height : (sizeHash[key] + 12) + 'px',
3661
+ checked : (block === key.toLowerCase() || block === value.toLowerCase() )
3662
+ }
3663
+ );
3664
+ });
3665
+ menu.show();
3666
+ this.menu = menu;
3667
+ },
3668
+ exec : function(id, value) {
3669
+ KE.util.select(id);
3670
+ KE.util.execCommand(id, 'formatblock', value);
3671
+ this.menu.hide();
3672
+ KE.util.focus(id);
3673
+ }
3674
+ };
3675
+
3676
+ KE.plugin.emoticons = {
3677
+ click : function(id) {
3678
+ var self = this,
3679
+ cmd = 'emoticons',
3680
+ rows = 5,
3681
+ cols = 9,
3682
+ total = 135,
3683
+ startNum = 0,
3684
+ cells = rows * cols,
3685
+ pages = Math.ceil(total / cells),
3686
+ colsHalf = Math.floor(cols / 2),
3687
+ g = KE.g[id],
3688
+ path = g.pluginsPath + 'emoticons/',
3689
+ allowPreview = (g.allowPreviewEmoticons === undefined) ? true : g.allowPreviewEmoticons;
3690
+ KE.util.selection(id);
3691
+ var wrapperDiv = KE.$$('div');
3692
+ wrapperDiv.className = 'ke-plugin-emoticons-wrapper';
3693
+ var previewDiv, previewImg;
3694
+ if (allowPreview) {
3695
+ previewDiv = KE.$$('div');
3696
+ previewDiv.className = 'ke-plugin-emoticons-preview';
3697
+ previewDiv.style.right = 0;
3698
+ var previewImg = KE.$$('img');
3699
+ previewImg.className = 'ke-reset';
3700
+ previewImg.src = path + '0.gif';
3701
+ previewImg.border = 0;
3702
+ previewDiv.appendChild(previewImg);
3703
+ wrapperDiv.appendChild(previewDiv);
3704
+ }
3705
+ function createEmoticonsTable(pageNum) {
3706
+ var table = KE.$$('table');
3707
+ if (previewDiv) {
3708
+ table.onmouseover = function() { previewDiv.style.display = 'block'; };
3709
+ table.onmouseout = function() { previewDiv.style.display = 'none'; };
3710
+ }
3711
+ table.className = 'ke-plugin-emoticons-table';
3712
+ table.cellPadding = 0;
3713
+ table.cellSpacing = 0;
3714
+ table.border = 0;
3715
+ var num = (pageNum - 1) * cells + startNum;
3716
+ for (var i = 0; i < rows; i++) {
3717
+ var row = table.insertRow(i);
3718
+ for (var j = 0; j < cols; j++) {
3719
+ var cell = row.insertCell(j);
3720
+ cell.className = 'ke-plugin-emoticons-cell';
3721
+ if (previewDiv) {
3722
+ cell.onmouseover = (function(j, num) {
3723
+ return function() {
3724
+ if (j > colsHalf) {
3725
+ previewDiv.style.left = 0;
3726
+ previewDiv.style.right = '';
3727
+ } else {
3728
+ previewDiv.style.left = '';
3729
+ previewDiv.style.right = 0;
3730
+ }
3731
+ previewImg.src = path + num + '.gif';;
3732
+ this.className = 'ke-plugin-emoticons-cell ke-plugin-emoticons-cell-on';
3733
+ };
3734
+ })(j, num);
3735
+ } else {
3736
+ cell.onmouseover = function() {
3737
+ this.className = 'ke-plugin-emoticons-cell ke-plugin-emoticons-cell-on';
3738
+ };
3739
+ }
3740
+ cell.onmouseout = function() { this.className = 'ke-plugin-emoticons-cell'; };
3741
+ cell.onclick = (function(num) {
3742
+ return function() {
3743
+ self.exec(id, num);
3744
+ return false;
3745
+ };
3746
+ })(num);
3747
+ var span = KE.$$('span');
3748
+ span.className = 'ke-plugin-emoticons-img';
3749
+ span.style.backgroundPosition = '-' + (24 * num) + 'px 0px';
3750
+ cell.appendChild(span);
3751
+ num++;
3752
+ }
3753
+ }
3754
+ return table;
3755
+ }
3756
+ var table = createEmoticonsTable(1);
3757
+ wrapperDiv.appendChild(table);
3758
+ var pageDiv = KE.$$('div');
3759
+ pageDiv.className = 'ke-plugin-emoticons-page';
3760
+ wrapperDiv.appendChild(pageDiv);
3761
+ function createPageTable(currentPageNum) {
3762
+ for (var pageNum = 1; pageNum <= pages; pageNum++) {
3763
+ if (currentPageNum !== pageNum) {
3764
+ var a = KE.$$('a');
3765
+ a.href = 'javascript:;';
3766
+ a.innerHTML = '[' + pageNum + ']';
3767
+ a.onclick = (function(pageNum) {
3768
+ return function() {
3769
+ wrapperDiv.removeChild(table);
3770
+ var newTable = createEmoticonsTable(pageNum);
3771
+ wrapperDiv.insertBefore(newTable, pageDiv);
3772
+ table = newTable;
3773
+ pageDiv.innerHTML = '';
3774
+ createPageTable(pageNum);
3775
+ return false;
3776
+ };
3777
+ })(pageNum);
3778
+ pageDiv.appendChild(a);
3779
+ } else {
3780
+ pageDiv.appendChild(document.createTextNode('[' + pageNum + ']'));
3781
+ }
3782
+ pageDiv.appendChild(document.createTextNode(' '));
3783
+ }
3784
+ }
3785
+ createPageTable(1);
3786
+ var menu = new KE.menu({
3787
+ id : id,
3788
+ cmd : cmd
3789
+ });
3790
+ menu.append(wrapperDiv);
3791
+ menu.show();
3792
+ this.menu = menu;
3793
+ },
3794
+ exec : function(id, num) {
3795
+ var src = KE.g[id].pluginsPath + 'emoticons/' + num + '.gif';
3796
+ var html = '<img src="' + src + '" kesrc="' + src + '" alt="" />';
3797
+ KE.util.insertHtml(id, html);
3798
+ this.menu.hide();
3799
+ KE.util.focus(id);
3800
+ }
3801
+ };
3802
+
3803
+ KE.plugin.flash = {
3804
+ init : function(id) {
3805
+ var self = this;
3806
+ KE.g[id].getHtmlHooks.push(function(html) {
3807
+ return html.replace(/<img[^>]*class="?ke-flash"?[^>]*>/ig, function(imgStr) {
3808
+ var width = imgStr.match(/style="[^"]*;?\s*width:\s*(\d+)/i) ? RegExp.$1 : 0;
3809
+ var height = imgStr.match(/style="[^"]*;?\s*height:\s*(\d+)/i) ? RegExp.$1 : 0;
3810
+ width = width || (imgStr.match(/width="([^"]+)"/i) ? RegExp.$1 : 0);
3811
+ height = height || (imgStr.match(/height="([^"]+)"/i) ? RegExp.$1 : 0);
3812
+ if (imgStr.match(/kesrctag="([^"]+)"/i)) {
3813
+ var attrs = KE.util.getAttrList(unescape(RegExp.$1));
3814
+ attrs.width = width || attrs.width || 0;
3815
+ attrs.height = height || attrs.height || 0;
3816
+ attrs.kesrc = attrs.src;
3817
+ return KE.util.getMediaEmbed(attrs);
3818
+ }
3819
+ });
3820
+ });
3821
+ KE.g[id].setHtmlHooks.push(function(html) {
3822
+ return html.replace(/<embed[^>]*type="application\/x-shockwave-flash"[^>]*>(?:<\/embed>)?/ig, function($0) {
3823
+ var src = $0.match(/\s+src="([^"]+)"/i) ? RegExp.$1 : '';
3824
+ if ($0.match(/\s+kesrc="([^"]+)"/i)) src = RegExp.$1;
3825
+ var width = $0.match(/\s+width="([^"]+)"/i) ? RegExp.$1 : 0;
3826
+ var height = $0.match(/\s+height="([^"]+)"/i) ? RegExp.$1 : 0;
3827
+ var attrs = KE.util.getAttrList($0);
3828
+ attrs.src = src;
3829
+ attrs.width = width;
3830
+ attrs.height = height;
3831
+ return KE.util.getMediaImage(id, 'flash', attrs);
3832
+ });
3833
+ });
3834
+ },
3835
+ click : function(id) {
3836
+ KE.util.selection(id);
3837
+ this.dialog = new KE.dialog({
3838
+ id : id,
3839
+ cmd : 'flash',
3840
+ file : 'flash.html',
3841
+ width : 400,
3842
+ height : 140,
3843
+ loadingMode : true,
3844
+ title : KE.lang['flash'],
3845
+ yesButton : KE.lang['yes'],
3846
+ noButton : KE.lang['no']
3847
+ });
3848
+ this.dialog.show();
3849
+ },
3850
+ check : function(id, url, width, height) {
3851
+ var dialogDoc = KE.util.getIframeDoc(this.dialog.iframe);
3852
+ if (!url.match(/^.{3,}$/)) {
3853
+ alert(KE.lang['invalidUrl']);
3854
+ KE.$('url', dialogDoc).focus();
3855
+ return false;
3856
+ }
3857
+ if (!width.match(/^\d*$/)) {
3858
+ alert(KE.lang['invalidWidth']);
3859
+ KE.$('width', dialogDoc).focus();
3860
+ return false;
3861
+ }
3862
+ if (!height.match(/^\d*$/)) {
3863
+ alert(KE.lang['invalidHeight']);
3864
+ KE.$('height', dialogDoc).focus();
3865
+ return false;
3866
+ }
3867
+ return true;
3868
+ },
3869
+ exec : function(id) {
3870
+ var dialogDoc = KE.util.getIframeDoc(this.dialog.iframe);
3871
+ var url = KE.$('url', dialogDoc).value;
3872
+ var width = KE.$('width', dialogDoc).value;
3873
+ var height = KE.$('height', dialogDoc).value;
3874
+ if (!this.check(id, url, width, height)) return false;
3875
+ var html = KE.util.getMediaImage(id, 'flash', {
3876
+ src : url,
3877
+ type : KE.g[id].mediaTypes['flash'],
3878
+ width : width,
3879
+ height : height,
3880
+ quality : 'high'
3881
+ });
3882
+ KE.util.insertHtml(id, html);
3883
+ this.dialog.hide();
3884
+ KE.util.focus(id);
3885
+ }
3886
+ };
3887
+
3888
+ KE.plugin.image = {
3889
+ getSelectedNode : function(id) {
3890
+ var g = KE.g[id];
3891
+ var startNode = g.keRange.startNode;
3892
+ var endNode = g.keRange.endNode;
3893
+ if (!KE.browser.WEBKIT && !g.keSel.isControl) return;
3894
+ if (startNode.nodeType != 1) return;
3895
+ if (startNode.tagName.toLowerCase() != 'img') return;
3896
+ if (startNode != endNode) return;
3897
+ if (!startNode.className.match(/^ke-\w+/i)) return startNode;
3898
+ },
3899
+ init : function(id) {
3900
+ var self = this;
3901
+ var g = KE.g[id];
3902
+ g.contextmenuItems.push({
3903
+ text : KE.lang['editImage'],
3904
+ click : function(id, menu) {
3905
+ KE.util.select(id);
3906
+ menu.hide();
3907
+ self.click(id);
3908
+ },
3909
+ cond : function(id) {
3910
+ return self.getSelectedNode(id);
3911
+ },
3912
+ options : {
3913
+ width : '150px',
3914
+ iconHtml : '<span class="ke-common-icon ke-common-icon-url ke-icon-image"></span>'
3915
+ }
3916
+ });
3917
+ g.contextmenuItems.push({
3918
+ text : KE.lang['deleteImage'],
3919
+ click : function(id, menu) {
3920
+ KE.util.select(id);
3921
+ menu.hide();
3922
+ var img = self.getSelectedNode(id);
3923
+ img.parentNode.removeChild(img);
3924
+ KE.util.execOnchangeHandler(id);
3925
+ },
3926
+ cond : function(id) {
3927
+ return self.getSelectedNode(id);
3928
+ },
3929
+ options : {
3930
+ width : '150px'
3931
+ }
3932
+ });
3933
+ g.contextmenuItems.push('-');
3934
+ },
3935
+ click : function(id) {
3936
+ KE.util.selection(id);
3937
+ this.dialog = new KE.dialog({
3938
+ id : id,
3939
+ cmd : 'image',
3940
+ file : 'image/image.html',
3941
+ width : 400,
3942
+ height : 220,
3943
+ loadingMode : true,
3944
+ title : KE.lang['image'],
3945
+ yesButton : KE.lang['yes'],
3946
+ noButton : KE.lang['no']
3947
+ });
3948
+ this.dialog.show();
3949
+ },
3950
+ check : function(id) {
3951
+ var dialogDoc = KE.util.getIframeDoc(this.dialog.iframe);
3952
+ var type = KE.$('type', dialogDoc).value;
3953
+ var width = KE.$('imgWidth', dialogDoc).value;
3954
+ var height = KE.$('imgHeight', dialogDoc).value;
3955
+ var title = KE.$('imgTitle', dialogDoc).value;
3956
+ var urlBox;
3957
+ if (type == 2) {
3958
+ urlBox = KE.$('imgFile', dialogDoc);
3959
+ } else {
3960
+ urlBox = KE.$('url', dialogDoc);
3961
+ }
3962
+ if (!urlBox.value.match(/\.(jpg|jpeg|gif|bmp|png)(\s|\?|$)/i)) {
3963
+ alert(KE.lang['invalidImg']);
3964
+ urlBox.focus();
3965
+ return false;
3966
+ }
3967
+ if (!width.match(/^\d*$/)) {
3968
+ alert(KE.lang['invalidWidth']);
3969
+ KE.$('imgWidth', dialogDoc).focus();
3970
+ return false;
3971
+ }
3972
+ if (!height.match(/^\d*$/)) {
3973
+ alert(KE.lang['invalidHeight']);
3974
+ KE.$('imgHeight', dialogDoc).focus();
3975
+ return false;
3976
+ }
3977
+ return true;
3978
+ },
3979
+ exec : function(id) {
3980
+ var self = this;
3981
+ var dialogDoc = KE.util.getIframeDoc(this.dialog.iframe);
3982
+ var type = KE.$('type', dialogDoc).value;
3983
+ var width = KE.$('imgWidth', dialogDoc).value;
3984
+ var height = KE.$('imgHeight', dialogDoc).value;
3985
+ var title = KE.$('imgTitle', dialogDoc).value;
3986
+ var alignElements = dialogDoc.getElementsByName('align');
3987
+ var align = '';
3988
+ for (var i = 0, len = alignElements.length; i < len; i++) {
3989
+ if (alignElements[i].checked) {
3990
+ align = alignElements[i].value;
3991
+ break;
3992
+ }
3993
+ }
3994
+ if (!this.check(id)) return false;
3995
+ if (type == 2) {
3996
+ KE.$('editorId', dialogDoc).value = id;
3997
+ var uploadIframe = KE.$('uploadIframe', dialogDoc);
3998
+ KE.util.showLoadingPage(id);
3999
+ var onloadFunc = function() {
4000
+ KE.event.remove(uploadIframe, 'load', onloadFunc);
4001
+ KE.util.hideLoadingPage(id);
4002
+ var uploadDoc = KE.util.getIframeDoc(uploadIframe);
4003
+ var data = '';
4004
+ try {
4005
+ data = KE.util.parseJson(uploadDoc.body.innerHTML);
4006
+ } catch(e) {
4007
+ alert(KE.lang.invalidJson);
4008
+ }
4009
+ if (typeof data === 'object' && 'error' in data) {
4010
+ if (data.error === 0) {
4011
+ var url = KE.format.getUrl(data.url, 'absolute');
4012
+ self.insert(id, url, title, width, height, 0, align);
4013
+ } else {
4014
+ alert(data.message);
4015
+ return false;
4016
+ }
4017
+ }
4018
+ };
4019
+ KE.event.add(uploadIframe, 'load', onloadFunc);
4020
+ dialogDoc.uploadForm.submit();
4021
+ return;
4022
+ } else {
4023
+ var url = KE.$('url', dialogDoc).value;
4024
+ this.insert(id, url, title, width, height, 0, align);
4025
+ }
4026
+ },
4027
+ insert : function(id, url, title, width, height, border, align) {
4028
+ var html = '<img src="' + url + '" kesrc="' + url + '" ';
4029
+ if (width > 0) html += 'width="' + width + '" ';
4030
+ if (height > 0) html += 'height="' + height + '" ';
4031
+ if (title) html += 'title="' + title + '" ';
4032
+ if (align) html += 'align="' + align + '" ';
4033
+ html += 'alt="' + title + '" ';
4034
+ if (border) html += 'border="' + border + '" ';
4035
+ html += '/>';
4036
+ KE.util.insertHtml(id, html);
4037
+ this.dialog.hide();
4038
+ KE.util.focus(id);
4039
+ }
4040
+ };
4041
+
4042
+ KE.plugin.link = {
4043
+ getSelectedNode : function(id) {
4044
+ return KE.getCommonAncestor(KE.g[id].keSel, 'a');
4045
+ },
4046
+ init : function(id) {
4047
+ var self = this;
4048
+ KE.g[id].contextmenuItems.push({
4049
+ text : KE.lang['editLink'],
4050
+ click : function(id, menu) {
4051
+ KE.util.select(id);
4052
+ menu.hide();
4053
+ self.click(id);
4054
+ },
4055
+ cond : function(id) {
4056
+ return self.getSelectedNode(id);
4057
+ },
4058
+ options : {
4059
+ width : '150px',
4060
+ iconHtml : '<span class="ke-common-icon ke-common-icon-url ke-icon-link"></span>'
4061
+ }
4062
+ });
4063
+ },
4064
+ click : function(id) {
4065
+ KE.util.selection(id);
4066
+ this.dialog = new KE.dialog({
4067
+ id : id,
4068
+ cmd : 'link',
4069
+ file : 'link/link.html',
4070
+ width : 400,
4071
+ height : 90,
4072
+ loadingMode : true,
4073
+ title : KE.lang['link'],
4074
+ yesButton : KE.lang['yes'],
4075
+ noButton : KE.lang['no']
4076
+ });
4077
+ this.dialog.show();
4078
+ },
4079
+ exec : function(id) {
4080
+ var g = KE.g[id];
4081
+ KE.util.select(id);
4082
+ var range = g.keRange;
4083
+ var startNode = range.startNode;
4084
+ var endNode = range.endNode;
4085
+ var iframeDoc = g.iframeDoc;
4086
+ var dialogDoc = KE.util.getIframeDoc(this.dialog.iframe);
4087
+ var url = KE.$('hyperLink', dialogDoc).value;
4088
+ var target = KE.$('linkType', dialogDoc).value;
4089
+ if (!url.match(/.+/) || url.match(/^\w+:\/\/\/?$/)) {
4090
+ alert(KE.lang['invalidUrl']);
4091
+ KE.$('hyperLink', dialogDoc).focus();
4092
+ return false;
4093
+ }
4094
+ var node = range.getParentElement();
4095
+ while (node) {
4096
+ if (node.tagName.toLowerCase() == 'a' || node.tagName.toLowerCase() == 'body') break;
4097
+ node = node.parentNode;
4098
+ }
4099
+ node = node.parentNode;
4100
+ var isItem;
4101
+ if (KE.browser.IE) {
4102
+ isItem = !!g.range.item;
4103
+ } else {
4104
+ isItem = (startNode.nodeType == 1 && startNode === endNode && startNode.nodeName.toLowerCase() != 'br');
4105
+ }
4106
+ var isEmpty = !isItem;
4107
+ if (!isItem) isEmpty = KE.browser.IE ? g.range.text === '' : g.range.toString() === '';
4108
+ if (isEmpty || KE.util.isEmpty(id)) {
4109
+ var html = '<a href="' + url + '"';
4110
+ if (target) html += ' target="' + target + '"';
4111
+ html += '>' + url + '</a>';
4112
+ KE.util.insertHtml(id, html);
4113
+ } else {
4114
+ iframeDoc.execCommand('createlink', false, '__ke_temp_url__');
4115
+ var arr = node.getElementsByTagName('a');
4116
+ for (var i = 0, l = arr.length; i < l; i++) {
4117
+ if (arr[i].href.match(/\/?__ke_temp_url__$/)) {
4118
+ arr[i].href = url;
4119
+ arr[i].setAttribute('kesrc', url);
4120
+ if (target) arr[i].target = target;
4121
+ else arr[i].removeAttribute('target');
4122
+ }
4123
+ }
4124
+ if (KE.browser.WEBKIT && isItem && startNode.tagName.toLowerCase() == 'img') {
4125
+ var parent = startNode.parentNode;
4126
+ if (parent.tagName.toLowerCase() != 'a') {
4127
+ var a = KE.$$('a', iframeDoc);
4128
+ parent.insertBefore(a, startNode);
4129
+ a.appendChild(startNode);
4130
+ parent = a;
4131
+ }
4132
+ parent.href = url;
4133
+ parent.setAttribute('kesrc', url);
4134
+ if (target) parent.target = target;
4135
+ else parent.removeAttribute('target');
4136
+ g.keSel.addRange(range);
4137
+ }
4138
+ }
4139
+ KE.util.execOnchangeHandler(id);
4140
+ this.dialog.hide();
4141
+ KE.util.focus(id);
4142
+ }
4143
+ };
4144
+
4145
+ KE.plugin.unlink = {
4146
+ init : function(id) {
4147
+ var self = this;
4148
+ KE.g[id].contextmenuItems.push({
4149
+ text : KE.lang['deleteLink'],
4150
+ click : function(id, menu) {
4151
+ KE.util.select(id);
4152
+ menu.hide();
4153
+ self.click(id);
4154
+ },
4155
+ cond : function(id) {
4156
+ return KE.plugin['link'].getSelectedNode(id);
4157
+ },
4158
+ options : {
4159
+ width : '150px',
4160
+ iconHtml : '<span class="ke-common-icon ke-common-icon-url ke-icon-unlink"></span>'
4161
+ }
4162
+ });
4163
+ KE.g[id].contextmenuItems.push('-');
4164
+ },
4165
+ click : function(id) {
4166
+ var g = KE.g[id];
4167
+ var iframeDoc = g.iframeDoc;
4168
+ KE.util.selection(id);
4169
+ var range = g.keRange;
4170
+ var startNode = range.startNode;
4171
+ var endNode = range.endNode;
4172
+ var isItem = (startNode.nodeType == 1 && startNode === endNode);
4173
+ var isEmpty = !isItem;
4174
+ if (!isItem) isEmpty = KE.browser.IE ? g.range.text === '' : g.range.toString() === '';
4175
+ if (isEmpty) {
4176
+ var linkNode = KE.plugin['link'].getSelectedNode(id);
4177
+ if (!linkNode) return;
4178
+ var range = g.keRange;
4179
+ range.selectTextNode(linkNode);
4180
+ g.keSel.addRange(range);
4181
+ KE.util.select(id);
4182
+ iframeDoc.execCommand('unlink', false, null);
4183
+ if (KE.browser.WEBKIT && startNode.tagName.toLowerCase() == 'img') {
4184
+ var parent = startNode.parentNode;
4185
+ if (parent.tagName.toLowerCase() == 'a') {
4186
+ KE.util.removeParent(parent);
4187
+ g.keSel.addRange(range);
4188
+ }
4189
+ }
4190
+ } else {
4191
+ iframeDoc.execCommand('unlink', false, null);
4192
+ }
4193
+ KE.util.execOnchangeHandler(id);
4194
+ KE.toolbar.updateState(id);
4195
+ KE.util.focus(id);
4196
+ }
4197
+ };
4198
+
4199
+ KE.plugin.media = {
4200
+ init : function(id) {
4201
+ var self = this;
4202
+ var typeHash = {};
4203
+ KE.each(KE.g[id].mediaTypes, function(key, val) {
4204
+ typeHash[val] = key;
4205
+ });
4206
+ KE.g[id].getHtmlHooks.push(function(html) {
4207
+ return html.replace(/<img[^>]*class="?ke-\w+"?[^>]*>/ig, function($0) {
4208
+ var width = $0.match(/style="[^"]*;?\s*width:\s*(\d+)/i) ? RegExp.$1 : 0;
4209
+ var height = $0.match(/style="[^"]*;?\s*height:\s*(\d+)/i) ? RegExp.$1 : 0;
4210
+ width = width || ($0.match(/width="([^"]+)"/i) ? RegExp.$1 : 0);
4211
+ height = height || ($0.match(/height="([^"]+)"/i) ? RegExp.$1 : 0);
4212
+ if ($0.match(/\s+kesrctag="([^"]+)"/i)) {
4213
+ var attrs = KE.util.getAttrList(unescape(RegExp.$1));
4214
+ attrs.width = width || attrs.width || 0;
4215
+ attrs.height = height || attrs.height || 0;
4216
+ attrs.kesrc = attrs.src;
4217
+ return KE.util.getMediaEmbed(attrs);
4218
+ }
4219
+ });
4220
+ });
4221
+ KE.g[id].setHtmlHooks.push(function(html) {
4222
+ return html.replace(/<embed[^>]*type="([^"]+)"[^>]*>(?:<\/embed>)?/ig, function($0, $1) {
4223
+ if (typeof typeHash[$1] == 'undefined') return $0;
4224
+ var src = $0.match(/\s+src="([^"]+)"/i) ? RegExp.$1 : '';
4225
+ if ($0.match(/\s+kesrc="([^"]+)"/i)) src = RegExp.$1;
4226
+ var width = $0.match(/\s+width="([^"]+)"/i) ? RegExp.$1 : 0;
4227
+ var height = $0.match(/\s+height="([^"]+)"/i) ? RegExp.$1 : 0;
4228
+ var attrs = KE.util.getAttrList($0);
4229
+ attrs.src = src;
4230
+ attrs.width = width;
4231
+ attrs.height = height;
4232
+ return KE.util.getMediaImage(id, '', attrs);
4233
+ });
4234
+ });
4235
+ },
4236
+ click : function(id) {
4237
+ KE.util.selection(id);
4238
+ this.dialog = new KE.dialog({
4239
+ id : id,
4240
+ cmd : 'media',
4241
+ file : 'media.html',
4242
+ width : 400,
4243
+ height : 170,
4244
+ loadingMode : true,
4245
+ title : KE.lang['media'],
4246
+ yesButton : KE.lang['yes'],
4247
+ noButton : KE.lang['no']
4248
+ });
4249
+ this.dialog.show();
4250
+ },
4251
+ check : function(id, url, width, height) {
4252
+ var dialogDoc = KE.util.getIframeDoc(this.dialog.iframe);
4253
+ if (!url.match(/^.{3,}\.(swf|flv|mp3|wav|wma|wmv|mid|avi|mpg|mpeg|asf|rm|rmvb)(\?|$)/i)) {
4254
+ alert(KE.lang['invalidMedia']);
4255
+ KE.$('url', dialogDoc).focus();
4256
+ return false;
4257
+ }
4258
+ if (!width.match(/^\d*$/)) {
4259
+ alert(KE.lang['invalidWidth']);
4260
+ KE.$('width', dialogDoc).focus();
4261
+ return false;
4262
+ }
4263
+ if (!height.match(/^\d*$/)) {
4264
+ alert(KE.lang['invalidHeight']);
4265
+ KE.$('height', dialogDoc).focus();
4266
+ return false;
4267
+ }
4268
+ return true;
4269
+ },
4270
+ exec : function(id) {
4271
+ var dialogDoc = KE.util.getIframeDoc(this.dialog.iframe);
4272
+ var url = KE.$('url', dialogDoc).value;
4273
+ var width = KE.$('width', dialogDoc).value;
4274
+ var height = KE.$('height', dialogDoc).value;
4275
+ if (!this.check(id, url, width, height)) return false;
4276
+ var autostart = KE.$('autostart', dialogDoc).checked ? 'true' : 'false';
4277
+ var html = KE.util.getMediaImage(id, '', {
4278
+ src : url,
4279
+ type : KE.g[id].mediaTypes[KE.util.getMediaType(url)],
4280
+ width : width,
4281
+ height : height,
4282
+ autostart : autostart,
4283
+ loop : 'true'
4284
+ });
4285
+ KE.util.insertHtml(id, html);
4286
+ this.dialog.hide();
4287
+ KE.util.focus(id);
4288
+ }
4289
+ };
4290
+
4291
+ KE.plugin.advtable = {
4292
+ getSelectedTable : function(id) {
4293
+ return KE.getCommonAncestor(KE.g[id].keSel, 'table');
4294
+ },
4295
+ getSelectedRow : function(id) {
4296
+ return KE.getCommonAncestor(KE.g[id].keSel, 'tr');
4297
+ },
4298
+ getSelectedCell : function(id) {
4299
+ return KE.getCommonAncestor(KE.g[id].keSel, 'td');
4300
+ },
4301
+ tableprop : function(id) {
4302
+ this.click(id);
4303
+ },
4304
+ tablecellprop : function(id) {
4305
+ var self = this;
4306
+ KE.util.selection(id);
4307
+ var dialog = new KE.dialog({
4308
+ id : id,
4309
+ cmd : 'advtable',
4310
+ file : 'advtable/cell.html',
4311
+ width : 420,
4312
+ height : 150,
4313
+ loadingMode : true,
4314
+ title : KE.lang['tablecell'],
4315
+ yesButton : KE.lang['yes'],
4316
+ noButton : KE.lang['no'],
4317
+ yesClickFn : function(id) {
4318
+ var dialogDoc = KE.util.getIframeDoc(dialog.iframe),
4319
+ widthBox = KE.$('width', dialogDoc),
4320
+ heightBox = KE.$('height', dialogDoc),
4321
+ widthTypeBox = KE.$('widthType', dialogDoc),
4322
+ heightTypeBox = KE.$('heightType', dialogDoc),
4323
+ textAlignBox = KE.$('textAlign', dialogDoc),
4324
+ verticalAlignBox = KE.$('verticalAlign', dialogDoc),
4325
+ borderBox = KE.$('border', dialogDoc),
4326
+ borderColorBox = KE.$('borderColor', dialogDoc),
4327
+ backgroundColorBox = KE.$('backgroundColor', dialogDoc),
4328
+ width = widthBox.value,
4329
+ height = heightBox.value,
4330
+ widthType = widthTypeBox.value,
4331
+ heightType = heightTypeBox.value,
4332
+ textAlign = textAlignBox.value,
4333
+ verticalAlign = verticalAlignBox.value,
4334
+ border = borderBox.value,
4335
+ borderColor = borderColorBox.innerHTML,
4336
+ backgroundColor = backgroundColorBox.innerHTML;
4337
+ if (!width.match(/^\d*$/)) {
4338
+ alert(KE.lang['invalidWidth']);
4339
+ widthBox.focus();
4340
+ return false;
4341
+ }
4342
+ if (!height.match(/^\d*$/)) {
4343
+ alert(KE.lang['invalidHeight']);
4344
+ heightBox.focus();
4345
+ return false;
4346
+ }
4347
+ if (!border.match(/^\d*$/)) {
4348
+ alert(KE.lang['invalidBorder']);
4349
+ borderBox.focus();
4350
+ return false;
4351
+ }
4352
+ var cell = self.getSelectedCell(id);
4353
+ cell.style.width = width !== '' ? (width + widthType) : '';
4354
+ cell.style.height = height !== '' ? (height + heightType) : '';
4355
+ cell.style.backgroundColor = backgroundColor;
4356
+ cell.style.textAlign = textAlign;
4357
+ cell.style.verticalAlign = verticalAlign;
4358
+ cell.style.borderWidth = border;
4359
+ cell.style.borderStyle = border !== '' ? 'solid' : '';
4360
+ cell.style.borderColor = borderColor;
4361
+ KE.util.execOnchangeHandler(id);
4362
+ dialog.hide();
4363
+ KE.util.focus(id);
4364
+ }
4365
+ });
4366
+ dialog.show();
4367
+ },
4368
+ tableinsert : function(id) {
4369
+ this.click(id, 'insert');
4370
+ },
4371
+ tabledelete : function(id) {
4372
+ var table = this.getSelectedTable(id);
4373
+ table.parentNode.removeChild(table);
4374
+ },
4375
+ tablecolinsert : function(id, offset) {
4376
+ var table = this.getSelectedTable(id),
4377
+ cell = this.getSelectedCell(id),
4378
+ index = cell.cellIndex + offset;
4379
+ for (var i = 0, len = table.rows.length; i < len; i++) {
4380
+ var newCell = table.rows[i].insertCell(index);
4381
+ newCell.innerHTML = '&nbsp;';
4382
+ }
4383
+ },
4384
+ tablecolinsertleft : function(id) {
4385
+ this.tablecolinsert(id, 0);
4386
+ },
4387
+ tablecolinsertright : function(id) {
4388
+ this.tablecolinsert(id, 1);
4389
+ },
4390
+ tablerowinsert : function(id, offset) {
4391
+ var table = this.getSelectedTable(id),
4392
+ row = this.getSelectedRow(id),
4393
+ newRow = table.insertRow(row.rowIndex + offset);
4394
+ for (var i = 0, len = row.cells.length; i < len; i++) {
4395
+ var cell = newRow.insertCell(i);
4396
+ cell.innerHTML = '&nbsp;';
4397
+ }
4398
+ },
4399
+ tablerowinsertabove : function(id) {
4400
+ this.tablerowinsert(id, 0);
4401
+ },
4402
+ tablerowinsertbelow : function(id) {
4403
+ this.tablerowinsert(id, 1);
4404
+ },
4405
+ tablecoldelete : function(id) {
4406
+ var table = this.getSelectedTable(id),
4407
+ cell = this.getSelectedCell(id),
4408
+ index = cell.cellIndex;
4409
+ for (var i = 0, len = table.rows.length; i < len; i++) {
4410
+ table.rows[i].deleteCell(index);
4411
+ }
4412
+ },
4413
+ tablerowdelete : function(id) {
4414
+ var table = this.getSelectedTable(id);
4415
+ var row = this.getSelectedRow(id);
4416
+ table.deleteRow(row.rowIndex);
4417
+ },
4418
+ init : function(id) {
4419
+ var self = this;
4420
+ var zeroborder = 'ke-zeroborder';
4421
+ var tableCmds = 'prop,cellprop,colinsertleft,colinsertright,rowinsertabove,rowinsertbelow,coldelete,rowdelete,insert,delete'.split(',');
4422
+ for (var i = 0, len = tableCmds.length; i < len; i++) {
4423
+ var name = 'table' + tableCmds[i];
4424
+ KE.g[id].contextmenuItems.push({
4425
+ text : KE.lang[name],
4426
+ click : (function(name) {
4427
+ return function(id, menu) {
4428
+ KE.util.select(id);
4429
+ menu.hide();
4430
+ if (self[name] !== undefined) self[name](id);
4431
+ if (!/prop/.test(name)) {
4432
+ KE.util.execOnchangeHandler(id);
4433
+ }
4434
+ };
4435
+ })(name),
4436
+ cond : (function(name) {
4437
+ if (KE.util.inArray(name, ['tableprop', 'tabledelete'])) {
4438
+ return function(id) {
4439
+ return self.getSelectedTable(id);
4440
+ };
4441
+ } else {
4442
+ return function(id) {
4443
+ return self.getSelectedCell(id);
4444
+ };
4445
+ }
4446
+ })(name),
4447
+ options : {
4448
+ width : '170px',
4449
+ iconHtml : '<span class="ke-common-icon ke-common-icon-url ke-icon-' + name + '"></span>'
4450
+ }
4451
+ });
4452
+ }
4453
+ KE.g[id].contextmenuItems.push('-');
4454
+ KE.g[id].setHtmlHooks.push(function(html) {
4455
+ return html.replace(/<table([^>]*)>/ig, function($0, $1) {
4456
+ if ($1.match(/\s+border=["']?(\d*)["']?/ig)) {
4457
+ var border = RegExp.$1;
4458
+ if ($1.indexOf(zeroborder) < 0 && (border === '' || border === '0')) {
4459
+ return KE.addClass($0, zeroborder);
4460
+ } else {
4461
+ return $0;
4462
+ }
4463
+ } else {
4464
+ return KE.addClass($0, zeroborder);
4465
+ }
4466
+ });
4467
+ });
4468
+ },
4469
+ click : function(id, mode) {
4470
+ mode = mode || 'default';
4471
+ var cmd = 'advtable';
4472
+ KE.util.selection(id);
4473
+ this.dialog = new KE.dialog({
4474
+ id : id,
4475
+ cmd : cmd,
4476
+ file : 'advtable/advtable.html?mode=' + mode,
4477
+ width : 420,
4478
+ height : 220,
4479
+ loadingMode : true,
4480
+ title : KE.lang['advtable'],
4481
+ yesButton : KE.lang['yes'],
4482
+ noButton : KE.lang['no']
4483
+ });
4484
+ this.dialog.show();
4485
+ },
4486
+ exec : function(id) {
4487
+ var zeroborder = 'ke-zeroborder',
4488
+ dialogDoc = KE.util.getIframeDoc(this.dialog.iframe),
4489
+ modeBox = KE.$('mode', dialogDoc),
4490
+ rowsBox = KE.$('rows', dialogDoc),
4491
+ colsBox = KE.$('cols', dialogDoc),
4492
+ widthBox = KE.$('width', dialogDoc),
4493
+ heightBox = KE.$('height', dialogDoc),
4494
+ widthTypeBox = KE.$('widthType', dialogDoc),
4495
+ heightTypeBox = KE.$('heightType', dialogDoc),
4496
+ paddingBox = KE.$('padding', dialogDoc),
4497
+ spacingBox = KE.$('spacing', dialogDoc),
4498
+ alignBox = KE.$('align', dialogDoc),
4499
+ borderBox = KE.$('border', dialogDoc),
4500
+ borderColorBox = KE.$('borderColor', dialogDoc),
4501
+ backgroundColorBox = KE.$('backgroundColor', dialogDoc),
4502
+ rows = rowsBox.value,
4503
+ cols = colsBox.value,
4504
+ width = widthBox.value,
4505
+ height = heightBox.value,
4506
+ widthType = widthTypeBox.value,
4507
+ heightType = heightTypeBox.value,
4508
+ padding = paddingBox.value,
4509
+ spacing = spacingBox.value,
4510
+ align = alignBox.value,
4511
+ border = borderBox.value,
4512
+ borderColor = borderColorBox.innerHTML,
4513
+ backgroundColor = backgroundColorBox.innerHTML;
4514
+ if (rows == '' || rows == 0 || !rows.match(/^\d*$/)) {
4515
+ alert(KE.lang['invalidRows']);
4516
+ rowsBox.focus();
4517
+ return false;
4518
+ }
4519
+ if (cols == '' || cols == 0 || !cols.match(/^\d*$/)) {
4520
+ alert(KE.lang['invalidCols']);
4521
+ colsBox.focus();
4522
+ return false;
4523
+ }
4524
+ if (!width.match(/^\d*$/)) {
4525
+ alert(KE.lang['invalidWidth']);
4526
+ widthBox.focus();
4527
+ return false;
4528
+ }
4529
+ if (!height.match(/^\d*$/)) {
4530
+ alert(KE.lang['invalidHeight']);
4531
+ heightBox.focus();
4532
+ return false;
4533
+ }
4534
+ if (!padding.match(/^\d*$/)) {
4535
+ alert(KE.lang['invalidPadding']);
4536
+ paddingBox.focus();
4537
+ return false;
4538
+ }
4539
+ if (!spacing.match(/^\d*$/)) {
4540
+ alert(KE.lang['invalidSpacing']);
4541
+ spacingBox.focus();
4542
+ return false;
4543
+ }
4544
+ if (!border.match(/^\d*$/)) {
4545
+ alert(KE.lang['invalidBorder']);
4546
+ borderBox.focus();
4547
+ return false;
4548
+ }
4549
+ if (modeBox.value === 'update') {
4550
+ var table = this.getSelectedTable(id);
4551
+ table.style.width = width !== '' ? (width + widthType) : '';
4552
+ table.style.height = height !== '' ? (height + heightType) : '';
4553
+ table.style.backgroundColor = backgroundColor;
4554
+ KE.attr(table, 'width', '');
4555
+ KE.attr(table, 'height', '');
4556
+ KE.attr(table, 'bgColor', '');
4557
+ KE.attr(table, 'cellPadding', padding);
4558
+ KE.attr(table, 'cellSpacing', spacing);
4559
+ KE.attr(table, 'align', align);
4560
+ if (border === '' || border === '0') {
4561
+ KE.addClass(table, zeroborder);
4562
+ } else {
4563
+ KE.removeClass(table, zeroborder);
4564
+ }
4565
+ KE.attr(table, 'border', border);
4566
+ KE.attr(table, 'borderColor', borderColor);
4567
+ KE.util.execOnchangeHandler(id);
4568
+ } else {
4569
+ var style = '';
4570
+ if (width !== '') style += 'width:' + width + widthType + ';';
4571
+ if (height !== '') style += 'height:' + height + heightType + ';';
4572
+ if (backgroundColor !== '') style += 'background-color:' + backgroundColor + ';';
4573
+ var html = '<table';
4574
+ if (style !== '') html += ' style="' + style + '"';
4575
+ if (padding !== '') html += ' cellpadding="' + padding + '"';
4576
+ if (spacing !== '') html += ' cellspacing="' + spacing + '"';
4577
+ if (align !== '') html += ' align="' + align + '"';
4578
+ if (border === '' || border === '0') html += ' class="' + zeroborder + '"';
4579
+ if (border !== '') html += ' border="' + border + '"';
4580
+ if (borderColor !== '') html += ' bordercolor="' + borderColor + '"';
4581
+ html += '>';
4582
+ for (var i = 0; i < rows; i++) {
4583
+ html += '<tr>';
4584
+ for (var j = 0; j < cols; j++) {
4585
+ html += '<td>&nbsp;</td>';
4586
+ }
4587
+ html += '</tr>';
4588
+ }
4589
+ html += '</table>';
4590
+ KE.util.insertHtml(id, html);
4591
+ }
4592
+ this.dialog.hide();
4593
+ KE.util.focus(id);
4594
+ }
4595
+ };
4596
+
4597
+ })(KindEditor);
4598
+
4599
+ KE.plugin['accessory'] = {
4600
+ click: function(id) {
4601
+ KE.util.selection(id);
4602
+ this.dialog = new KE.dialog({
4603
+ id: id,
4604
+ cmd: 'accessory',
4605
+ file: 'accessory.html',
4606
+ width: 390,
4607
+ height: 100,
4608
+ title: KE.lang['accessory'],
4609
+ yesButton: KE.lang['yes'],
4610
+ noButton: KE.lang['no']
4611
+ });
4612
+ this.dialog.show();
4613
+ },
4614
+ check: function(id) {
4615
+ var dialogDoc = KE.util.getIframeDoc(this.dialog.iframe);
4616
+ var type = KE.$('type', dialogDoc).value;
4617
+ var url = '';
4618
+ if (type == 1) {
4619
+ url = KE.$('imgFile', dialogDoc).value;
4620
+ } else {
4621
+ url = KE.$('url', dialogDoc).value;
4622
+ }
4623
+ if (url.match(/\.(doc|xls|ppt|docx|xlsx|pptx|pdf|txt|rar|zip|mp3)$/i) == null) {
4624
+ alert(KE.lang['invalidAccessory']);
4625
+ window.focus();
4626
+ KE.g[id].yesButton.focus();
4627
+ return false;
4628
+ }
4629
+ return true;
4630
+ },
4631
+ exec: function(id) {
4632
+ KE.util.select(id);
4633
+ var dialogDoc = KE.util.getIframeDoc(this.dialog.iframe);
4634
+ var type = KE.$('type', dialogDoc).value;
4635
+ if (!this.check(id)) return false;
4636
+ if (type == 1) {
4637
+ KE.$('editorId', dialogDoc).value = id;
4638
+ dialogDoc.uploadForm.submit();
4639
+ return false;
4640
+ } else {
4641
+ var url = KE.$('url', dialogDoc).value;
4642
+ var title = KE.$('description', dialogDoc).value;
4643
+ if (url != '') {
4644
+ var re = /(\\+)/g;
4645
+ var filename = url.replace(re, "#");
4646
+ var one = filename.split("#");
4647
+ var two = one[one.length - 1];
4648
+ var three = two.split(".");
4649
+ ext = three[three.length - 1];
4650
+ this.insert(id, url, title, ext);
4651
+ }
4652
+ }
4653
+ },
4654
+ insert: function(id, url, title, ext) {
4655
+ var img;
4656
+ var path = "/javascripts/kindeditor/skins/common/";
4657
+ switch (ext) {
4658
+ case "doc":
4659
+ case "docx":
4660
+ img = "doc.gif";
4661
+ break;
4662
+ case "xls":
4663
+ case "xlsx":
4664
+ img = "xls.gif";
4665
+ break;
4666
+ case "rar":
4667
+ case "zip":
4668
+ img = "rar.gif";
4669
+ break;
4670
+ case "mp3":
4671
+ img = "mp3.gif";
4672
+ break;
4673
+ case "pdf":
4674
+ img = "pdf.gif";
4675
+ break;
4676
+ default:
4677
+ img = "rar.gif";
4678
+ }
4679
+ var html = '<img src="' + path + img + '" >&nbsp;';
4680
+ html += '<a href="' + url + '" >';
4681
+ if (title) html += title;
4682
+ html += '</a>';
4683
+ KE.util.insertHtml(id, html);
4684
+ this.dialog.hide();
4685
+ KE.util.focus(id);
4686
+ }
4687
+ };
4688
+