Compare commits

...

117 Commits

Author SHA1 Message Date
yujialong d034264f14 考核实验报告 1 month ago
yujialong 61067a7b25 fix 1 month ago
yujialong ad9235ba24 fix 2 months ago
yujialong 961ed45cc3 token改成存sessionStorage里面(保证一个账号只能在一个浏览器的tab页保持登录状态,由此避免子系统的tab页多开) 2 months ago
yujialong b7142db102 进入理论考试改成弹出页 2 months ago
yujialong 16a1b014c7 fix 2 months ago
yujialong 30a507303b 实验台加分页 2 months ago
yujialong 153afffabb 教学中心增加我的课程 2 months ago
yujialong 54844099c6 fix 2 months ago
yujialong e6c6323781 fix 2 months ago
yujialong 27ba915902 课程过期弹出添加客服二维码 2 months ago
yujialong c9ebd6f57b fix 3 months ago
yujialong d18143af97 fix 3 months ago
yujialong d4fcac57cc 微信登录联调完成 3 months ago
yujialong 34ba538cdb 登录修复 3 months ago
yujialong 54ef52797e 学生微信登录等 3 months ago
yujialong 5638089fc9 fix 3 months ago
yujialong 745caa7ab1 fix 3 months ago
yujialong 110580c311 fix 3 months ago
yujialong 09b0734d2f fix 3 months ago
yujialong f6bcb729c2 登录后弹出填写真实姓名弹框 3 months ago
yujialong 0196f27459 fix 3 months ago
yujialong 87c2af5363 fix 3 months ago
yujialong a5e95f7591 fix 3 months ago
yujialong 66649dc686 fix 3 months ago
yujialong 075d877b78 fix 3 months ago
yujialong a96dfec18e fix 4 months ago
yujialong 0f6c7fe6b6 理论考试 4 months ago
yujialong 571673fe8a fix 4 months ago
yujialong db3f21f48b fix 4 months ago
yujialong 55e21d2dbb fix 4 months ago
yujialong e6903a20d4 fix 4 months ago
yujialong 3715bf714a fix 4 months ago
yujialong 44c21fa35e fix 4 months ago
yujialong afbb71b80b fix 4 months ago
yujialong a3e8dc0f62 fix 4 months ago
yujialong a0634d4dcb fix 4 months ago
yujialong 8193864fe5 赛事注册及理论实验报告 4 months ago
yujialong 82b2f701ad fix 5 months ago
yujialong 50ecd7e2f1 fix 5 months ago
yujialong 5868ddd3c3 职站竞赛报名添加选择所在学校 5 months ago
yujialong 03cc27ed79 赛事详情读取当前所在学校 5 months ago
yujialong 5018ac5e0b 赛事修复 6 months ago
yujialong 8c085f63eb 登录添加手机号输入正确提示 6 months ago
yujialong cf7a643f2e 安财赛事报名 6 months ago
yujialong 175962b8dc 安财赛事报名及注册 6 months ago
yujialong a5a224d885 fix 6 months ago
yujialong f1bbd5be05 fix 6 months ago
yujialong a8d8e144c8 fix 6 months ago
yujialong 376395256d 理论考试实验报告 6 months ago
yujialong 3e0e873a7b fix 6 months ago
yujialong 5996ac855e fix 6 months ago
yujialong 95256876ab fix 6 months ago
yujialong 50339c1779 fix 6 months ago
yujialong 5f20a498af fix 6 months ago
yujialong c2cd09c29f 理论考试填空题小空自适应及简答题修复 6 months ago
yujialong 32953b4698 理论考试相关 6 months ago
yujialong 838a5b9ed7 fix 6 months ago
yujialong 3ea12dca58 理论考试联调完成 6 months ago
yujialong bf2a191592 老的赛事报名-申请账号还原 6 months ago
yujialong 2086398228 理论考试、ueditorPlus嵌入 6 months ago
yujialong 123be6ef05 个人注册 6 months ago
yujialong 46b0be32f5 登录调整 7 months ago
yujialong 5b71c26fa5 fix 7 months ago
yujialong 285de23c33 fix 7 months ago
yujialong 11b9c6a117 oss上传秘钥加密 7 months ago
yujialong a79f9ce3cc 实验台 7 months ago
yujialong 896fc92195 fix 7 months ago
yujialong dc44e73e80 实验台等 7 months ago
yujialong 49b8141518 添加ai入口 8 months ago
yujialong 4d203b67f4 登录前页面的自适应 8 months ago
yujialong d792fcf846 fix 8 months ago
yujialong 359e02bd47 fix 8 months ago
yujialong 4ea4165395 fix 9 months ago
yujialong 7bea692dfb 赛事修复 9 months ago
yujialong 3e4e9f5329 赛事修复 9 months ago
yujialong 85486b3a33 赛事分配修复及实验报告且或 9 months ago
yujialong b61162f633 fix 9 months ago
yujialong b97887506e 自动分配、团队异常联调 9 months ago
yujialong 79411cfb07 fix 9 months ago
yujialong 44368d96b1 fix 10 months ago
yujialong 354c2f8ca2 全站添加筛选功能缓存 10 months ago
yujialong 1b38df77d2 fix 10 months ago
yujialong 0a9fcf47f3 职站首页、智信云首页自适应 10 months ago
yujialong b5ce42dd75 自适应 10 months ago
yujialong 3c7f035ecc fix 11 months ago
yujialong a98ebce307 加入团队迁移过来 11 months ago
yujialong 9197292305 fix 11 months ago
yujialong c179ffad7b fix 11 months ago
yujialong 69010141d5 confirm确认弹框禁止点击遮盖层关闭 12 months ago
yujialong 161b86e7d0 fix 12 months ago
yujialong 434e52e808 fix 1 year ago
yujialong f5c0e5325e fix 1 year ago
yujialong f11ef0d40a fix 1 year ago
yujialong 698beae38c fix 1 year ago
yujialong 8117804a6d 安农大可视化 1 year ago
yujialong 7ac82b3909 安农大 1 year ago
yujialong 3147bada16 安农大可视化及清除缓存 1 year ago
yujialong 3fa6e01694 fix 1 year ago
yujialong c7946744d3 fix 1 year ago
yujialong 8b4062f917 安农大数据看板完成 1 year ago
yujialong 34ef75bb65 安农大大屏展示 1 year ago
yujialong a3c27568f0 fix 1 year ago
yujialong e9af0bb178 fix 1 year ago
yujialong ae39cf9b44 oss全部替换完成 1 year ago
yujialong fcedab589f 赛事优化 1 year ago
yujialong 30136c32f3 封装阿里云oss 1 year ago
yujialong f66b3bf254 赛事报名状态 1 year ago
yujialong c811ffc914 fix 1 year ago
yujialong 77012b78a6 fix 1 year ago
yujialong 2c59529486 赛事上传文件修改成阿里云oss 1 year ago
yujialong 63dccce56b 阿里云oss(multipartUpload拆成3个接口版本) 1 year ago
yujialong cce6029403 竞赛 1 year ago
yujialong bda8932ff0 fix 1 year ago
yujialong 340bfc7e42 fix 1 year ago
yujialong 60b86efb83 竞赛文件上传 1 year ago
yujialong 5be4e2f204 众筹加测试服标识 1 year ago
  1. 1
      .env
  2. 3428
      package-lock.json
  3. 9
      package.json
  4. 37
      public/index-occupationlab.html
  5. 13
      public/index-zxy.html
  6. 12
      public/index.html
  7. 62
      public/static/ueditorPlus/dialogs/anchor/anchor.html
  8. 716
      public/static/ueditorPlus/dialogs/attachment/attachment.css
  9. 61
      public/static/ueditorPlus/dialogs/attachment/attachment.html
  10. 777
      public/static/ueditorPlus/dialogs/attachment/attachment.js
  11. BIN
      public/static/ueditorPlus/dialogs/attachment/images/alignicon.gif
  12. BIN
      public/static/ueditorPlus/dialogs/attachment/images/alignicon.png
  13. BIN
      public/static/ueditorPlus/dialogs/attachment/images/bg.png
  14. BIN
      public/static/ueditorPlus/dialogs/attachment/images/file-icons.gif
  15. BIN
      public/static/ueditorPlus/dialogs/attachment/images/file-icons.png
  16. BIN
      public/static/ueditorPlus/dialogs/attachment/images/icons.gif
  17. BIN
      public/static/ueditorPlus/dialogs/attachment/images/icons.png
  18. BIN
      public/static/ueditorPlus/dialogs/attachment/images/image.png
  19. BIN
      public/static/ueditorPlus/dialogs/attachment/images/progress.png
  20. BIN
      public/static/ueditorPlus/dialogs/attachment/images/success.gif
  21. BIN
      public/static/ueditorPlus/dialogs/attachment/images/success.png
  22. 818
      public/static/ueditorPlus/dialogs/audio/audio.css
  23. 83
      public/static/ueditorPlus/dialogs/audio/audio.html
  24. 785
      public/static/ueditorPlus/dialogs/audio/audio.js
  25. BIN
      public/static/ueditorPlus/dialogs/audio/images/bg.png
  26. BIN
      public/static/ueditorPlus/dialogs/audio/images/center_focus.jpg
  27. BIN
      public/static/ueditorPlus/dialogs/audio/images/file-icons.gif
  28. BIN
      public/static/ueditorPlus/dialogs/audio/images/file-icons.png
  29. BIN
      public/static/ueditorPlus/dialogs/audio/images/icons.gif
  30. BIN
      public/static/ueditorPlus/dialogs/audio/images/icons.png
  31. BIN
      public/static/ueditorPlus/dialogs/audio/images/image.png
  32. BIN
      public/static/ueditorPlus/dialogs/audio/images/left_focus.jpg
  33. BIN
      public/static/ueditorPlus/dialogs/audio/images/none_focus.jpg
  34. BIN
      public/static/ueditorPlus/dialogs/audio/images/progress.png
  35. BIN
      public/static/ueditorPlus/dialogs/audio/images/right_focus.jpg
  36. BIN
      public/static/ueditorPlus/dialogs/audio/images/success.gif
  37. BIN
      public/static/ueditorPlus/dialogs/audio/images/success.png
  38. 193
      public/static/ueditorPlus/dialogs/background/background.css
  39. 59
      public/static/ueditorPlus/dialogs/background/background.html
  40. 370
      public/static/ueditorPlus/dialogs/background/background.js
  41. BIN
      public/static/ueditorPlus/dialogs/background/images/bg.png
  42. BIN
      public/static/ueditorPlus/dialogs/background/images/success.png
  43. 176
      public/static/ueditorPlus/dialogs/contentimport/contentimport.html
  44. 91
      public/static/ueditorPlus/dialogs/contentimport/contentimport.js
  45. 21
      public/static/ueditorPlus/dialogs/contentimport/mammoth.browser.min.js
  46. 3
      public/static/ueditorPlus/dialogs/contentimport/showdown.min.js
  47. 129
      public/static/ueditorPlus/dialogs/emotion/emotion.css
  48. 70
      public/static/ueditorPlus/dialogs/emotion/emotion.html
  49. 186
      public/static/ueditorPlus/dialogs/emotion/emotion.js
  50. BIN
      public/static/ueditorPlus/dialogs/emotion/images/0.gif
  51. BIN
      public/static/ueditorPlus/dialogs/emotion/images/bface.gif
  52. BIN
      public/static/ueditorPlus/dialogs/emotion/images/cface.gif
  53. BIN
      public/static/ueditorPlus/dialogs/emotion/images/fface.gif
  54. BIN
      public/static/ueditorPlus/dialogs/emotion/images/jxface2.gif
  55. BIN
      public/static/ueditorPlus/dialogs/emotion/images/neweditor-tab-bg.png
  56. BIN
      public/static/ueditorPlus/dialogs/emotion/images/tface.gif
  57. BIN
      public/static/ueditorPlus/dialogs/emotion/images/wface.gif
  58. BIN
      public/static/ueditorPlus/dialogs/emotion/images/yface.gif
  59. 98
      public/static/ueditorPlus/dialogs/formula/formula.html
  60. 147
      public/static/ueditorPlus/dialogs/formula/formula.js
  61. 37
      public/static/ueditorPlus/dialogs/help/help.css
  62. 82
      public/static/ueditorPlus/dialogs/help/help.html
  63. 57
      public/static/ueditorPlus/dialogs/help/help.js
  64. 752
      public/static/ueditorPlus/dialogs/image/image.css
  65. 125
      public/static/ueditorPlus/dialogs/image/image.html
  66. 1033
      public/static/ueditorPlus/dialogs/image/image.js
  67. BIN
      public/static/ueditorPlus/dialogs/image/images/alignicon.jpg
  68. BIN
      public/static/ueditorPlus/dialogs/image/images/bg.png
  69. BIN
      public/static/ueditorPlus/dialogs/image/images/icons.gif
  70. BIN
      public/static/ueditorPlus/dialogs/image/images/icons.png
  71. BIN
      public/static/ueditorPlus/dialogs/image/images/image.png
  72. BIN
      public/static/ueditorPlus/dialogs/image/images/progress.png
  73. BIN
      public/static/ueditorPlus/dialogs/image/images/success.gif
  74. BIN
      public/static/ueditorPlus/dialogs/image/images/success.png
  75. 135
      public/static/ueditorPlus/dialogs/insertframe/insertframe.html
  76. 81
      public/static/ueditorPlus/dialogs/internal.js
  77. 155
      public/static/ueditorPlus/dialogs/link/link.html
  78. 45
      public/static/ueditorPlus/dialogs/preview/preview.html
  79. BIN
      public/static/ueditorPlus/dialogs/scrawl/images/addimg.png
  80. BIN
      public/static/ueditorPlus/dialogs/scrawl/images/brush.png
  81. BIN
      public/static/ueditorPlus/dialogs/scrawl/images/delimg.png
  82. BIN
      public/static/ueditorPlus/dialogs/scrawl/images/delimgH.png
  83. BIN
      public/static/ueditorPlus/dialogs/scrawl/images/empty.png
  84. BIN
      public/static/ueditorPlus/dialogs/scrawl/images/emptyH.png
  85. BIN
      public/static/ueditorPlus/dialogs/scrawl/images/eraser.png
  86. BIN
      public/static/ueditorPlus/dialogs/scrawl/images/redo.png
  87. BIN
      public/static/ueditorPlus/dialogs/scrawl/images/redoH.png
  88. BIN
      public/static/ueditorPlus/dialogs/scrawl/images/scale.png
  89. BIN
      public/static/ueditorPlus/dialogs/scrawl/images/scaleH.png
  90. BIN
      public/static/ueditorPlus/dialogs/scrawl/images/size.png
  91. BIN
      public/static/ueditorPlus/dialogs/scrawl/images/undo.png
  92. BIN
      public/static/ueditorPlus/dialogs/scrawl/images/undoH.png
  93. 324
      public/static/ueditorPlus/dialogs/scrawl/scrawl.css
  94. 95
      public/static/ueditorPlus/dialogs/scrawl/scrawl.html
  95. 682
      public/static/ueditorPlus/dialogs/scrawl/scrawl.js
  96. 144
      public/static/ueditorPlus/dialogs/searchreplace/searchreplace.html
  97. 174
      public/static/ueditorPlus/dialogs/searchreplace/searchreplace.js
  98. 42
      public/static/ueditorPlus/dialogs/spechars/spechars.html
  99. 86
      public/static/ueditorPlus/dialogs/spechars/spechars.js
  100. BIN
      public/static/ueditorPlus/dialogs/table/dragicon.png
  101. Some files were not shown because too many files have changed in this diff Show More

@ -0,0 +1 @@
VUE_APP_VERSION=2.3.4

3428
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -8,16 +8,24 @@
"build": "vue-cli-service build"
},
"dependencies": {
"@tinymce/tinymce-vue": "^3.2.8",
"ali-oss": "^6.18.1",
"axios": "^0.26.1",
"babel-polyfill": "^6.26.0",
"core-js": "^2.6.10",
"crypto-js": "^4.2.0",
"echarts": "^4.9.0",
"element-theme": "^2.0.1",
"element-ui": "^2.15.9",
"html2canvas": "^1.3.2",
"image-webpack-loader": "^8.1.0",
"js-cookie": "^2.2.1",
"jsencrypt": "^3.3.2",
"jspdf": "^2.5.1",
"lodash": "^4.17.21",
"mavon-editor": "^2.10.4",
"moment": "^2.29.4",
"tinymce": "^6.7.3",
"vue": "^2.7.10",
"vue-cropperjs": "^3.0.0",
"vue-i18n": "^8.27.2",
@ -33,7 +41,6 @@
"@vue/cli-plugin-babel": "^3.9.0",
"@vue/cli-service": "^3.9.0",
"browserslist": "^4.17.5",
"caniuse-lite": "^1.0.30001271",
"element-theme-chalk": "^2.15.9",
"node-sass": "^4.14.0",
"sass-loader": "^8.0.2",

@ -0,0 +1,37 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="keywords" content="职站,教学,教育,在线编程" />
<meta
name="description"
content="职站是一款辅助院校教师开展虚拟仿真实验教学的智能云实践平台。平台采用了大数据,云计算等技术,为学校搭建信息化平台提供了基础,可助力院校实现教学智能化升级。职站平台设计遵循着极简、高效的理念,可帮助老师轻松开展实验教学,并支持自定义发布考核和练习,智能统计和检验学生的日常实训练习效果;老师还可以通过可视化图表报告直观查看学生实训成绩,评估教学成果。"
/>
<meta name="baidu-site-verification" content="code-TRfXe8xIkJ" />
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<!-- <meta name="viewport" content="width=device-width, user-scalable=yes, shrink-to-fit=no" /> -->
<link rel="stylesheet" href="//at.alicdn.com/t/font_830376_qzecyukz0s.css" />
<title>职站——为院校打造一站式虚拟仿真实训教学数智云平台</title>
<script>
var _hmt = _hmt || [];
(function () {
var hm = document.createElement('script');
hm.src = 'https://hm.baidu.com/hm.js?72fbad6ebf1d6c705117fe8fe0686a0e';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
</head>
<body>
<noscript>
<strong>We're sorry but vms doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
<script src="/styles/tinymce/tinymce.min.js"></script>
<script src='./static/ueditorPlus/ueditor.config.js?v=3'></script>
<script src='./static/ueditorPlus/ueditor.all.js?v=3'></script>
<script src='./static/ueditorPlus/lang/zh-cn/zh-cn.js'></script>
</body>
</html>

@ -10,8 +10,18 @@
/>
<meta name="baidu-site-verification" content="code-TRfXe8xIkJ" />
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<!-- <meta name="viewport" content="width=device-width, user-scalable=yes, shrink-to-fit=no" /> -->
<link rel="stylesheet" href="//at.alicdn.com/t/font_830376_qzecyukz0s.css" />
<title>智信云</title>
<script>
var _hmt = _hmt || [];
(function () {
var hm = document.createElement('script');
hm.src = 'https://hm.baidu.com/hm.js?e4d7deeca2d6ea71d2bd5fa2365bc654';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
</head>
<body>
<noscript>
@ -20,5 +30,8 @@
<div id="app"></div>
<!-- built files will be auto injected -->
<script src="/styles/tinymce/tinymce.min.js"></script>
<script src='./static/ueditorPlus/ueditor.config.js?v=3'></script>
<script src='./static/ueditorPlus/ueditor.all.js?v=3'></script>
<script src='./static/ueditorPlus/lang/zh-cn/zh-cn.js'></script>
</body>
</html>

@ -3,20 +3,21 @@
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="keywords" content="职站,教学,教育,在线编程" />
<meta name="keywords" content="智信云,教学,教育,在线编程" />
<meta
name="description"
content="职站是一款辅助院校教师开展虚拟仿真实验教学的智能云实践平台。平台采用了大数据,云计算等技术,为学校搭建信息化平台提供了基础,可助力院校实现教学智能化升级。职站平台设计遵循着极简、高效的理念,可帮助老师轻松开展实验教学,并支持自定义发布考核和练习,智能统计和检验学生的日常实训练习效果;老师还可以通过可视化图表报告直观查看学生实训成绩,评估教学成果。"
content="智信云是一家为高等院校提供实验课程数字化服务的国家级高新技术企业。以区块链、大数据、人工智能等前沿技术在行业领域的运用为支撑,将新技术与经济与管理人才培养深度融合,面向全国高等院校的经济、金融、大数据应用等相关专业提供科研创新、金课建设、实验实训教学软件、实践教学以及学生就业培训为一体的专业建设咨询与技术支持服务。"
/>
<meta name="baidu-site-verification" content="code-TRfXe8xIkJ" />
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<!-- <meta name="viewport" content="width=device-width, user-scalable=yes, shrink-to-fit=no" /> -->
<link rel="stylesheet" href="//at.alicdn.com/t/font_830376_qzecyukz0s.css" />
<title>职站——为院校打造一站式虚拟仿真实训教学数智云平台</title>
<title></title>
<script>
var _hmt = _hmt || [];
(function () {
var hm = document.createElement('script');
hm.src = 'https://hm.baidu.com/hm.js?72fbad6ebf1d6c705117fe8fe0686a0e';
hm.src = 'https://hm.baidu.com/hm.js?e4d7deeca2d6ea71d2bd5fa2365bc654';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(hm, s);
})();
@ -29,5 +30,8 @@
<div id="app"></div>
<!-- built files will be auto injected -->
<script src="/styles/tinymce/tinymce.min.js"></script>
<script src='./static/ueditorPlus/ueditor.config.js?v=3'></script>
<script src='./static/ueditorPlus/ueditor.all.js?v=3'></script>
<script src='./static/ueditorPlus/lang/zh-cn/zh-cn.js'></script>
</body>
</html>

@ -0,0 +1,62 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<style type="text/css">
* {
color: #838383;
margin: 0;
padding: 0
}
html, body {
font-size: 12px;
overflow: hidden;
}
.content {
padding: 5px 0 0 15px;
}
input {
margin-left: 4px;
box-sizing: border-box;
width: 210px;
height: 30px;
line-height: 30px;
border: 1px solid #d7d7d7;
border-radius: 3px;
padding: 0 5px;
outline: none;
}
</style>
</head>
<body>
<div class="content">
<span><var id="lang_input_anchorName"></var></span><input id="anchorName" value=""/>
</div>
<script type="text/javascript" src="../internal.js?aea0c61c"></script>
<script type="text/javascript">
var anchorInput = $G('anchorName'),
node = editor.selection.getRange().getClosedNode();
if (node && node.tagName == 'IMG' && (node = node.getAttribute('anchorname'))) {
anchorInput.value = node;
}
anchorInput.onkeydown = function (evt) {
evt = evt || window.event;
if (evt.keyCode == 13) {
editor.execCommand('anchor', anchorInput.value);
dialog.close();
domUtils.preventDefault(evt)
}
};
dialog.onok = function () {
editor.execCommand('anchor', anchorInput.value);
dialog.close();
};
$focus(anchorInput);
</script>
</body>
</html>

@ -0,0 +1,716 @@
@charset "utf-8";
/* dialog样式 */
.wrapper {
zoom: 1;
width: 630px;
*width: 626px;
height: 380px;
margin: 0 auto;
padding: 10px;
position: relative;
font-family: sans-serif;
}
/*tab样式框大小*/
.tabhead {
float: left;
}
.tabbody {
width: 100%;
height: 346px;
position: relative;
clear: both;
}
.tabbody .panel {
position: absolute;
width: 0;
height: 0;
background: #fff;
overflow: hidden;
display: none;
}
.tabbody .panel.focus {
width: 100%;
height: 346px;
display: block;
}
/* 上传附件 */
.tabbody #upload.panel {
width: 0;
height: 0;
overflow: hidden;
position: absolute !important;
clip: rect(1px, 1px, 1px, 1px);
background: #fff;
display: block;
}
.tabbody #upload.panel.focus {
width: 100%;
height: 346px;
display: block;
clip: auto;
}
#upload .queueList {
margin: 0;
width: 100%;
height: 100%;
position: absolute;
overflow: hidden;
}
#upload p {
margin: 0;
}
.element-invisible {
width: 0 !important;
height: 0 !important;
border: 0;
padding: 0;
margin: 0;
overflow: hidden;
position: absolute !important;
clip: rect(1px, 1px, 1px, 1px);
}
#upload .placeholder {
margin: 10px;
border: 2px dashed #e6e6e6;
*border: 0px dashed #e6e6e6;
height: 172px;
padding-top: 150px;
text-align: center;
background: url(./images/image.png) center 70px no-repeat;
color: #cccccc;
font-size: 18px;
position: relative;
top: 0;
*top: 10px;
}
#upload .placeholder .webuploader-pick {
font-size: 18px;
background: #00b7ee;
border-radius: 3px;
line-height: 44px;
padding: 0 30px;
*width: 120px;
color: #fff;
display: inline-block;
margin: 0 auto 20px auto;
cursor: pointer;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
}
#upload .placeholder .webuploader-pick-hover {
background: #00a2d4;
}
#filePickerContainer {
text-align: center;
}
#upload .placeholder .flashTip {
color: #666666;
font-size: 12px;
position: absolute;
width: 100%;
text-align: center;
bottom: 20px;
}
#upload .placeholder .flashTip a {
color: #0785d1;
text-decoration: none;
}
#upload .placeholder .flashTip a:hover {
text-decoration: underline;
}
#upload .placeholder.webuploader-dnd-over {
border-color: #999999;
}
#upload .filelist {
list-style: none;
margin: 0;
padding: 0;
overflow-x: hidden;
overflow-y: auto;
position: relative;
height: 300px;
}
#upload .filelist:after {
content: '';
display: block;
width: 0;
height: 0;
overflow: hidden;
clear: both;
}
#upload .filelist li {
width: 113px;
height: 113px;
background: url(./images/bg.png);
text-align: center;
margin: 9px 0 0 9px;
*margin: 6px 0 0 6px;
position: relative;
display: block;
float: left;
overflow: hidden;
font-size: 12px;
}
#upload .filelist li p.log {
position: relative;
top: -45px;
}
#upload .filelist li p.title {
position: absolute;
top: 0;
left: 0;
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
top: 5px;
text-indent: 5px;
text-align: left;
}
#upload .filelist li p.progress {
position: absolute;
width: 100%;
bottom: 0;
left: 0;
height: 8px;
overflow: hidden;
z-index: 50;
margin: 0;
border-radius: 0;
background: none;
-webkit-box-shadow: 0 0 0;
}
#upload .filelist li p.progress span {
display: none;
overflow: hidden;
width: 0;
height: 100%;
background: #1483d8 url(./images/progress.png) repeat-x;
-webit-transition: width 200ms linear;
-moz-transition: width 200ms linear;
-o-transition: width 200ms linear;
-ms-transition: width 200ms linear;
transition: width 200ms linear;
-webkit-animation: progressmove 2s linear infinite;
-moz-animation: progressmove 2s linear infinite;
-o-animation: progressmove 2s linear infinite;
-ms-animation: progressmove 2s linear infinite;
animation: progressmove 2s linear infinite;
-webkit-transform: translateZ(0);
}
@-webkit-keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
@-moz-keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
@keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
#upload .filelist li p.imgWrap {
position: relative;
z-index: 2;
line-height: 113px;
vertical-align: middle;
overflow: hidden;
width: 113px;
height: 113px;
-webkit-transform-origin: 50% 50%;
-moz-transform-origin: 50% 50%;
-o-transform-origin: 50% 50%;
-ms-transform-origin: 50% 50%;
transform-origin: 50% 50%;
-webit-transition: 200ms ease-out;
-moz-transition: 200ms ease-out;
-o-transition: 200ms ease-out;
-ms-transition: 200ms ease-out;
transition: 200ms ease-out;
}
#upload .filelist li p.imgWrap.notimage {
margin-top: 0;
width: 111px;
height: 111px;
border: 1px #eeeeee solid;
}
#upload .filelist li p.imgWrap.notimage i.file-preview {
margin-top: 15px;
}
#upload .filelist li img {
width: 100%;
}
#upload .filelist li p.error {
background: #f43838;
color: #fff;
position: absolute;
bottom: 0;
left: 0;
height: 28px;
line-height: 28px;
width: 100%;
z-index: 100;
display: none;
}
#upload .filelist li .success {
display: block;
position: absolute;
left: 0;
bottom: 0;
height: 40px;
width: 100%;
z-index: 200;
background: url(./images/success.png) no-repeat right bottom;
background-image: url(./images/success.gif) \9;
}
#upload .filelist li.filePickerBlock {
width: 113px;
height: 113px;
background: url(./images/image.png) no-repeat center 12px;
border: 1px solid #eeeeee;
border-radius: 0;
}
#upload .filelist li.filePickerBlock div.webuploader-pick {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
opacity: 0;
background: none;
font-size: 0;
}
#upload .filelist div.file-panel {
position: absolute;
height: 0;
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0;
background: rgba(0, 0, 0, 0.5);
width: 100%;
top: 0;
left: 0;
overflow: hidden;
z-index: 300;
}
#upload .filelist div.file-panel span {
width: 24px;
height: 24px;
display: inline;
float: right;
text-indent: -9999px;
overflow: hidden;
background: url(./images/icons.png) no-repeat;
background: url(./images/icons.gif) no-repeat \9;
margin: 5px 1px 1px;
cursor: pointer;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#upload .filelist div.file-panel span.rotateLeft {
display: none;
background-position: 0 -24px;
}
#upload .filelist div.file-panel span.rotateLeft:hover {
background-position: 0 0;
}
#upload .filelist div.file-panel span.rotateRight {
display: none;
background-position: -24px -24px;
}
#upload .filelist div.file-panel span.rotateRight:hover {
background-position: -24px 0;
}
#upload .filelist div.file-panel span.cancel {
background-position: -48px -24px;
}
#upload .filelist div.file-panel span.cancel:hover {
background-position: -48px 0;
}
#upload .statusBar {
height: 45px;
border-bottom: 1px solid #dadada;
margin: 0 10px;
padding: 0;
line-height: 45px;
vertical-align: middle;
position: relative;
}
#upload .statusBar .progress {
border: 1px solid #1483d8;
width: 198px;
background: #fff;
height: 18px;
position: absolute;
top: 12px;
display: none;
text-align: center;
line-height: 18px;
color: #6dbfff;
margin: 0 10px 0 0;
}
#upload .statusBar .progress span.percentage {
width: 0;
height: 100%;
left: 0;
top: 0;
background: #1483d8;
position: absolute;
}
#upload .statusBar .progress span.text {
position: relative;
z-index: 10;
}
#upload .statusBar .info {
display: inline-block;
font-size: 14px;
color: #666666;
}
#upload .statusBar .btns {
position: absolute;
top: 7px;
right: 0;
line-height: 30px;
}
#filePickerBtn {
display: inline-block;
float: left;
}
#upload .statusBar .btns .webuploader-pick,
#upload .statusBar .btns .uploadBtn,
#upload .statusBar .btns .uploadBtn.state-uploading,
#upload .statusBar .btns .uploadBtn.state-paused {
background: #ffffff;
border: 1px solid #cfcfcf;
color: #565656;
padding: 0 18px;
display: inline-block;
border-radius: 3px;
margin-left: 10px;
cursor: pointer;
font-size: 14px;
float: left;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#upload .statusBar .btns .webuploader-pick-hover,
#upload .statusBar .btns .uploadBtn:hover,
#upload .statusBar .btns .uploadBtn.state-uploading:hover,
#upload .statusBar .btns .uploadBtn.state-paused:hover {
background: #f0f0f0;
}
#upload .statusBar .btns .uploadBtn,
#upload .statusBar .btns .uploadBtn.state-paused {
background: #00b7ee;
color: #fff;
border-color: transparent;
}
#upload .statusBar .btns .uploadBtn:hover,
#upload .statusBar .btns .uploadBtn.state-paused:hover {
background: #00a2d4;
}
#upload .statusBar .btns .uploadBtn.disabled {
pointer-events: none;
filter: alpha(opacity=60);
-moz-opacity: 0.6;
-khtml-opacity: 0.6;
opacity: 0.6;
}
/* 图片管理样式 */
#online {
width: 100%;
height: 336px;
padding: 10px 0 0 0;
}
#online #fileList {
width: 100%;
height: 100%;
overflow-x: hidden;
overflow-y: auto;
position: relative;
}
#online ul {
display: block;
list-style: none;
margin: 0;
padding: 0;
}
#online li {
float: left;
display: block;
list-style: none;
padding: 0;
width: 113px;
height: 113px;
margin: 0 0 9px 9px;
*margin: 0 0 6px 6px;
background-color: #eee;
overflow: hidden;
cursor: pointer;
position: relative;
}
#online li.clearFloat {
float: none;
clear: both;
display: block;
width: 0;
height: 0;
margin: 0;
padding: 0;
}
#online li img {
cursor: pointer;
}
#online li div.file-wrapper {
cursor: pointer;
position: absolute;
display: block;
width: 111px;
height: 111px;
border: 1px solid #eee;
background: url("./images/bg.png") repeat;
}
#online li div span.file-title {
display: block;
padding: 0 3px;
margin: 3px 0 0 0;
font-size: 12px;
height: 15px;
color: #555555;
text-align: center;
width: 107px;
white-space: nowrap;
word-break: break-all;
overflow: hidden;
text-overflow: ellipsis;
}
#online li .icon {
cursor: pointer;
width: 113px;
height: 113px;
position: absolute;
top: 0;
left: 0;
z-index: 2;
border: 0;
background-repeat: no-repeat;
}
#online li .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
}
#online li.selected .icon {
background-image: url(images/success.png);
background-image: url(images/success.gif) \9;
background-position: 75px 75px;
}
#online li.selected .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
background-position: 72px 72px;
}
/* 在线文件的文件预览图标 */
i.file-preview {
display: block;
margin: 10px auto;
width: 70px;
height: 70px;
background-image: url("./images/file-icons.png");
background-image: url("./images/file-icons.gif") \9;
background-position: -140px center;
background-repeat: no-repeat;
}
i.file-preview.file-type-dir {
background-position: 0 center;
}
i.file-preview.file-type-file {
background-position: -140px center;
}
i.file-preview.file-type-filelist {
background-position: -210px center;
}
i.file-preview.file-type-zip,
i.file-preview.file-type-rar,
i.file-preview.file-type-7z,
i.file-preview.file-type-tar,
i.file-preview.file-type-gz,
i.file-preview.file-type-bz2 {
background-position: -280px center;
}
i.file-preview.file-type-xls,
i.file-preview.file-type-xlsx {
background-position: -350px center;
}
i.file-preview.file-type-doc,
i.file-preview.file-type-docx {
background-position: -420px center;
}
i.file-preview.file-type-ppt,
i.file-preview.file-type-pptx {
background-position: -490px center;
}
i.file-preview.file-type-vsd {
background-position: -560px center;
}
i.file-preview.file-type-pdf {
background-position: -630px center;
}
i.file-preview.file-type-txt,
i.file-preview.file-type-md,
i.file-preview.file-type-json,
i.file-preview.file-type-htm,
i.file-preview.file-type-xml,
i.file-preview.file-type-html,
i.file-preview.file-type-js,
i.file-preview.file-type-css,
i.file-preview.file-type-php,
i.file-preview.file-type-jsp,
i.file-preview.file-type-asp {
background-position: -700px center;
}
i.file-preview.file-type-apk {
background-position: -770px center;
}
i.file-preview.file-type-exe {
background-position: -840px center;
}
i.file-preview.file-type-ipa {
background-position: -910px center;
}
i.file-preview.file-type-mp4,
i.file-preview.file-type-swf,
i.file-preview.file-type-mkv,
i.file-preview.file-type-avi,
i.file-preview.file-type-flv,
i.file-preview.file-type-mov,
i.file-preview.file-type-mpg,
i.file-preview.file-type-mpeg,
i.file-preview.file-type-ogv,
i.file-preview.file-type-webm,
i.file-preview.file-type-rm,
i.file-preview.file-type-rmvb {
background-position: -980px center;
}
i.file-preview.file-type-ogg,
i.file-preview.file-type-wav,
i.file-preview.file-type-wmv,
i.file-preview.file-type-mid,
i.file-preview.file-type-mp3 {
background-position: -1050px center;
}
i.file-preview.file-type-jpg,
i.file-preview.file-type-jpeg,
i.file-preview.file-type-gif,
i.file-preview.file-type-bmp,
i.file-preview.file-type-png,
i.file-preview.file-type-psd {
background-position: -140px center;
}

@ -0,0 +1,61 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>ueditor图片对话框</title>
<script type="text/javascript" src="../internal.js?aea0c61c"></script>
<!-- jquery -->
<script type="text/javascript" src="../../third-party/jquery-1.10.2.js?628072e7"></script>
<!-- webuploader -->
<script src="../../third-party/webuploader/webuploader.js?e4f02d82"></script>
<link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css?0057c5c7">
<!-- attachment dialog -->
<link rel="stylesheet" href="attachment.css?e8f09700" type="text/css"/>
</head>
<body>
<div class="wrapper">
<div id="tabhead" class="tabhead">
<span class="tab focus" data-content-id="upload"><var id="lang_tab_upload"></var></span>
<span class="tab" data-content-id="online"><var id="lang_tab_online"></var></span>
</div>
<div id="tabbody" class="tabbody">
<!-- 上传图片 -->
<div id="upload" class="panel focus">
<div id="queueList" class="queueList">
<div class="statusBar element-invisible">
<div class="progress">
<span class="text">0%</span>
<span class="percentage"></span>
</div>
<div class="info"></div>
<div class="btns">
<div id="filePickerBtn"></div>
<div class="uploadBtn"><var id="lang_start_upload"></var></div>
</div>
</div>
<div id="dndArea" class="placeholder">
<div class="filePickerContainer">
<div id="filePickerReady"></div>
</div>
</div>
<ul class="filelist element-invisible">
<li id="filePickerBlock" class="filePickerBlock"></li>
</ul>
</div>
</div>
<!-- 在线图片 -->
<div id="online" class="panel">
<div id="fileList"><var id="lang_imgLoading"></var></div>
</div>
</div>
</div>
<script type="text/javascript" src="attachment.js?b17a61b0"></script>
</body>
</html>

@ -0,0 +1,777 @@
/**
* User: Jinqn
* Date: 14-04-08
* Time: 下午16:34
* 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片
*/
(function () {
var uploadFile,
onlineFile;
window.onload = function () {
initTabs();
initButtons();
};
/* 初始化tab标签 */
function initTabs() {
var tabs = $G('tabhead').children;
for (var i = 0; i < tabs.length; i++) {
domUtils.on(tabs[i], "click", function (e) {
var target = e.target || e.srcElement;
setTabFocus(target.getAttribute('data-content-id'));
});
}
setTabFocus('upload');
}
/* 初始化tabbody */
function setTabFocus(id) {
if (!id) return;
var i, bodyId, tabs = $G('tabhead').children;
for (i = 0; i < tabs.length; i++) {
bodyId = tabs[i].getAttribute('data-content-id')
if (bodyId == id) {
domUtils.addClass(tabs[i], 'focus');
domUtils.addClass($G(bodyId), 'focus');
} else {
domUtils.removeClasses(tabs[i], 'focus');
domUtils.removeClasses($G(bodyId), 'focus');
}
}
switch (id) {
case 'upload':
uploadFile = uploadFile || new UploadFile('queueList');
break;
case 'online':
onlineFile = onlineFile || new OnlineFile('fileList');
break;
}
}
/* 初始化onok事件 */
function initButtons() {
dialog.onok = function () {
var list = [], id, tabs = $G('tabhead').children;
for (var i = 0; i < tabs.length; i++) {
if (domUtils.hasClass(tabs[i], 'focus')) {
id = tabs[i].getAttribute('data-content-id');
break;
}
}
switch (id) {
case 'upload':
list = uploadFile.getInsertList();
var count = uploadFile.getQueueCount();
if (count) {
$('.info', '#queueList').html('<span style="color:red;">' + '还有2个未上传文件'.replace(/[\d]/, count) + '</span>');
return false;
}
break;
case 'online':
list = onlineFile.getInsertList();
break;
}
editor.execCommand('insertfile', list);
};
}
/* 上传附件 */
function UploadFile(target) {
this.$wrap = target.constructor == String ? $('#' + target) : $(target);
this.init();
}
UploadFile.prototype = {
init: function () {
this.fileList = [];
this.initContainer();
this.initUploader();
},
initContainer: function () {
this.$queue = this.$wrap.find('.filelist');
},
/* 初始化容器 */
initUploader: function () {
var _this = this,
$ = jQuery, // just in case. Make sure it's not an other libaray.
$wrap = _this.$wrap,
// 图片容器
$queue = $wrap.find('.filelist'),
// 状态栏,包括进度和控制按钮
$statusBar = $wrap.find('.statusBar'),
// 文件总体选择信息。
$info = $statusBar.find('.info'),
// 上传按钮
$upload = $wrap.find('.uploadBtn'),
// 上传按钮
$filePickerBtn = $wrap.find('.filePickerBtn'),
// 上传按钮
$filePickerBlock = $wrap.find('.filePickerBlock'),
// 没选择文件之前的内容。
$placeHolder = $wrap.find('.placeholder'),
// 总体进度条
$progress = $statusBar.find('.progress').hide(),
// 添加的文件数量
fileCount = 0,
// 添加的文件总大小
fileSize = 0,
// 优化retina, 在retina下这个值是2
ratio = window.devicePixelRatio || 1,
// 缩略图大小
thumbnailWidth = 113 * ratio,
thumbnailHeight = 113 * ratio,
// 可能有pedding, ready, uploading, confirm, done.
state = '',
// 所有文件的进度信息,key为file id
percentages = {},
supportTransition = (function () {
var s = document.createElement('p').style,
r = 'transition' in s ||
'WebkitTransition' in s ||
'MozTransition' in s ||
'msTransition' in s ||
'OTransition' in s;
s = null;
return r;
})(),
// WebUploader实例
uploader,
actionUrl = editor.getActionUrl(editor.getOpt('fileActionName')),
fileMaxSize = editor.getOpt('fileMaxSize'),
acceptExtensions = (editor.getOpt('fileAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, '');
;
if (!WebUploader.Uploader.support()) {
$('#filePickerReady').after($('<div>').html(lang.errorNotSupport)).hide();
return;
} else if (!editor.getOpt('fileActionName')) {
$('#filePickerReady').after($('<div>').html(lang.errorLoadConfig)).hide();
return;
}
uploader = _this.uploader = WebUploader.create({
pick: {
id: '#filePickerReady',
label: lang.uploadSelectFile
},
swf: '../../third-party/webuploader/Uploader.swf',
server: actionUrl,
fileVal: editor.getOpt('fileFieldName'),
duplicate: true,
fileSingleSizeLimit: fileMaxSize,
headers: editor.getOpt('serverHeaders') || {},
compress: false
});
uploader.addButton({
id: '#filePickerBlock'
});
uploader.addButton({
id: '#filePickerBtn',
label: lang.uploadAddFile
});
setState('pedding');
// 当有文件添加进来时执行,负责view的创建
function addFile(file) {
var $li = $('<li id="' + file.id + '">' +
'<p class="title">' + file.name + '</p>' +
'<p class="imgWrap"></p>' +
'<p class="progress"><span></span></p>' +
'</li>'),
$btns = $('<div class="file-panel">' +
'<span class="cancel">' + lang.uploadDelete + '</span>' +
'<span class="rotateRight">' + lang.uploadTurnRight + '</span>' +
'<span class="rotateLeft">' + lang.uploadTurnLeft + '</span></div>').appendTo($li),
$prgress = $li.find('p.progress span'),
$wrap = $li.find('p.imgWrap'),
$info = $('<p class="error"></p>').hide().appendTo($li),
showError = function (code) {
switch (code) {
case 'exceed_size':
text = lang.errorExceedSize;
break;
case 'interrupt':
text = lang.errorInterrupt;
break;
case 'http':
text = lang.errorHttp;
break;
case 'not_allow_type':
text = lang.errorFileType;
break;
default:
text = lang.errorUploadRetry;
break;
}
$info.text(text).show();
};
if (file.getStatus() === 'invalid') {
showError(file.statusText);
} else {
$wrap.text(lang.uploadPreview);
if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|' + file.ext.toLowerCase() + '|') == -1) {
$wrap.empty().addClass('notimage').append('<i class="file-preview file-type-' + file.ext.toLowerCase() + '"></i>' +
'<span class="file-title" title="' + file.name + '">' + file.name + '</span>');
} else {
if (browser.ie && browser.version <= 7) {
$wrap.text(lang.uploadNoPreview);
} else {
uploader.makeThumb(file, function (error, src) {
if (error || !src) {
$wrap.text(lang.uploadNoPreview);
} else {
var $img = $('<img src="' + src + '">');
$wrap.empty().append($img);
$img.on('error', function () {
$wrap.text(lang.uploadNoPreview);
});
}
}, thumbnailWidth, thumbnailHeight);
}
}
percentages[file.id] = [file.size, 0];
file.rotation = 0;
/* 检查文件格式 */
if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {
showError('not_allow_type');
uploader.removeFile(file);
}
}
file.on('statuschange', function (cur, prev) {
if (prev === 'progress') {
$prgress.hide().width(0);
} else if (prev === 'queued') {
$li.off('mouseenter mouseleave');
$btns.remove();
}
// 成功
if (cur === 'error' || cur === 'invalid') {
showError(file.statusText);
percentages[file.id][1] = 1;
} else if (cur === 'interrupt') {
showError('interrupt');
} else if (cur === 'queued') {
percentages[file.id][1] = 0;
} else if (cur === 'progress') {
$info.hide();
$prgress.css('display', 'block');
} else if (cur === 'complete') {
}
$li.removeClass('state-' + prev).addClass('state-' + cur);
});
$li.on('mouseenter', function () {
$btns.stop().animate({height: 30});
});
$li.on('mouseleave', function () {
$btns.stop().animate({height: 0});
});
$btns.on('click', 'span', function () {
var index = $(this).index(),
deg;
switch (index) {
case 0:
uploader.removeFile(file);
return;
case 1:
file.rotation += 90;
break;
case 2:
file.rotation -= 90;
break;
}
if (supportTransition) {
deg = 'rotate(' + file.rotation + 'deg)';
$wrap.css({
'-webkit-transform': deg,
'-mos-transform': deg,
'-o-transform': deg,
'transform': deg
});
} else {
$wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');
}
});
$li.insertBefore($filePickerBlock);
}
// 负责view的销毁
function removeFile(file) {
var $li = $('#' + file.id);
delete percentages[file.id];
updateTotalProgress();
$li.off().find('.file-panel').off().end().remove();
}
function updateTotalProgress() {
var loaded = 0,
total = 0,
spans = $progress.children(),
percent;
$.each(percentages, function (k, v) {
total += v[0];
loaded += v[0] * v[1];
});
percent = total ? loaded / total : 0;
spans.eq(0).text(Math.round(percent * 100) + '%');
spans.eq(1).css('width', Math.round(percent * 100) + '%');
updateStatus();
}
function setState(val, files) {
if (val != state) {
var stats = uploader.getStats();
$upload.removeClass('state-' + state);
$upload.addClass('state-' + val);
switch (val) {
/* 未选择文件 */
case 'pedding':
$queue.addClass('element-invisible');
$statusBar.addClass('element-invisible');
$placeHolder.removeClass('element-invisible');
$progress.hide();
$info.hide();
uploader.refresh();
break;
/* 可以开始上传 */
case 'ready':
$placeHolder.addClass('element-invisible');
$queue.removeClass('element-invisible');
$statusBar.removeClass('element-invisible');
$progress.hide();
$info.show();
$upload.text(lang.uploadStart);
uploader.refresh();
break;
/* 上传中 */
case 'uploading':
$progress.show();
$info.hide();
$upload.text(lang.uploadPause);
break;
/* 暂停上传 */
case 'paused':
$progress.show();
$info.hide();
$upload.text(lang.uploadContinue);
break;
case 'confirm':
$progress.show();
$info.hide();
$upload.text(lang.uploadStart);
stats = uploader.getStats();
if (stats.successNum && !stats.uploadFailNum) {
setState('finish');
return;
}
break;
case 'finish':
$progress.hide();
$info.show();
if (stats.uploadFailNum) {
$upload.text(lang.uploadRetry);
} else {
$upload.text(lang.uploadStart);
}
break;
}
state = val;
updateStatus();
}
if (!_this.getQueueCount()) {
$upload.addClass('disabled')
} else {
$upload.removeClass('disabled')
}
}
function updateStatus() {
var text = '', stats;
if (state === 'ready') {
text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));
} else if (state === 'confirm') {
stats = uploader.getStats();
if (stats.uploadFailNum) {
text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);
}
} else {
stats = uploader.getStats();
text = lang.updateStatusFinish.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)).replace('_', stats.successNum);
if (stats.uploadFailNum) {
text += lang.updateStatusError.replace('_', stats.uploadFailNum);
}
}
$info.html(text);
}
uploader.on('fileQueued', function (file) {
if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= fileMaxSize) {
fileCount++;
fileSize += file.size;
}
if (fileCount === 1) {
$placeHolder.addClass('element-invisible');
$statusBar.show();
}
addFile(file);
});
uploader.on('fileDequeued', function (file) {
if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= fileMaxSize) {
fileCount--;
fileSize -= file.size;
}
removeFile(file);
updateTotalProgress();
});
uploader.on('filesQueued', function (file) {
if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {
setState('ready');
}
updateTotalProgress();
});
uploader.on('all', function (type, files) {
switch (type) {
case 'uploadFinished':
setState('confirm', files);
break;
case 'startUpload':
/* 添加额外的GET参数 */
var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?' : '&') + 'encode=utf-8&' + params);
uploader.option('server', url);
setState('uploading', files);
break;
case 'stopUpload':
setState('paused', files);
break;
}
});
uploader.on('uploadBeforeSend', function (file, data, header) {
//这里可以通过data对象添加POST参数
if (actionUrl.toLowerCase().indexOf('jsp') != -1) {
header['X_Requested_With'] = 'XMLHttpRequest';
}
});
uploader.on('uploadProgress', function (file, percentage) {
var $li = $('#' + file.id),
$percent = $li.find('.progress span');
$percent.css('width', percentage * 100 + '%');
percentages[file.id][1] = percentage;
updateTotalProgress();
});
uploader.on('uploadSuccess', function (file, ret) {
var $file = $('#' + file.id);
try {
var responseText = (ret._raw || ret),
json = utils.str2json(responseText);
json = editor.getOpt('serverResponsePrepare')(json);
if (json.state == 'SUCCESS') {
_this.fileList.push(json);
$file.append('<span class="success"></span>');
// 触发上传附件事件
editor.fireEvent("uploadsuccess", {
res: json,
type: 'file'
});
} else {
$file.find('.error').text(json.state).show();
}
} catch (e) {
$file.find('.error').text(lang.errorServerUpload).show();
}
});
uploader.on('uploadError', function (file, code) {
});
uploader.on('error', function (code, param1, param2) {
if (code === 'F_EXCEED_SIZE') {
editor.getOpt('tipError')(lang.errorExceedSize + ' ' + (param1 / 1024 / 1024).toFixed(1) + 'MB');
} else {
console.log('error', code, param1, param2);
}
});
uploader.on('uploadComplete', function (file, ret) {
});
$upload.on('click', function () {
if ($(this).hasClass('disabled')) {
return false;
}
if (state === 'ready') {
uploader.upload();
} else if (state === 'paused') {
uploader.upload();
} else if (state === 'uploading') {
uploader.stop();
}
});
$upload.addClass('state-' + state);
updateTotalProgress();
},
getQueueCount: function () {
var file, i, status, readyFile = 0, files = this.uploader.getFiles();
for (i = 0; file = files[i++];) {
status = file.getStatus();
if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++;
}
return readyFile;
},
getInsertList: function () {
var i, link, data, list = [],
prefix = editor.getOpt('fileUrlPrefix');
for (i = 0; i < this.fileList.length; i++) {
data = this.fileList[i];
link = data.url;
list.push({
title: data.original || link.substr(link.lastIndexOf('/') + 1),
url: prefix + link
});
}
return list;
}
};
/* 在线附件 */
function OnlineFile(target) {
this.container = utils.isString(target) ? document.getElementById(target) : target;
this.init();
}
OnlineFile.prototype = {
init: function () {
this.initContainer();
this.initEvents();
this.initData();
},
/* 初始化容器 */
initContainer: function () {
this.container.innerHTML = '';
this.list = document.createElement('ul');
this.clearFloat = document.createElement('li');
domUtils.addClass(this.list, 'list');
domUtils.addClass(this.clearFloat, 'clearFloat');
this.list.appendChild(this.clearFloat);
this.container.appendChild(this.list);
},
/* 初始化滚动事件,滚动到地步自动拉取数据 */
initEvents: function () {
var _this = this;
/* 滚动拉取图片 */
domUtils.on($G('fileList'), 'scroll', function (e) {
var panel = this;
if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
_this.getFileData();
}
});
/* 选中图片 */
domUtils.on(this.list, 'click', function (e) {
var target = e.target || e.srcElement,
li = target.parentNode;
if (li.tagName.toLowerCase() == 'li') {
if (domUtils.hasClass(li, 'selected')) {
domUtils.removeClasses(li, 'selected');
} else {
domUtils.addClass(li, 'selected');
}
}
});
},
/* 初始化第一次的数据 */
initData: function () {
/* 拉取数据需要使用的值 */
this.state = 0;
this.listSize = editor.getOpt('fileManagerListSize');
this.listIndex = 0;
this.listEnd = false;
/* 第一次拉取数据 */
this.getFileData();
},
/* 向后台拉取图片列表数据 */
getFileData: function () {
var _this = this;
if (!_this.listEnd && !this.isLoadingData) {
this.isLoadingData = true;
ajax.request(editor.getActionUrl(editor.getOpt('fileManagerActionName')), {
timeout: 100000,
data: utils.extend({
start: this.listIndex,
size: this.listSize
}, editor.queryCommandValue('serverparam')),
headers: editor.options.serverHeaders || {},
method: 'get',
onsuccess: function (r) {
try {
var json = eval('(' + r.responseText + ')');
if (json.state == 'SUCCESS') {
_this.pushData(json.list);
_this.listIndex = parseInt(json.start) + parseInt(json.list.length);
if (_this.listIndex >= json.total) {
_this.listEnd = true;
}
_this.isLoadingData = false;
}
} catch (e) {
if (r.responseText.indexOf('ue_separate_ue') != -1) {
var list = r.responseText.split(r.responseText);
_this.pushData(list);
_this.listIndex = parseInt(list.length);
_this.listEnd = true;
_this.isLoadingData = false;
}
}
},
onerror: function () {
_this.isLoadingData = false;
}
});
}
},
/* 添加图片到列表界面上 */
pushData: function (list) {
var i, item, img, filetype, preview, icon, _this = this,
urlPrefix = editor.getOpt('fileManagerUrlPrefix');
for (i = 0; i < list.length; i++) {
if (list[i] && list[i].url) {
item = document.createElement('li');
icon = document.createElement('span');
filetype = list[i].url.substr(list[i].url.lastIndexOf('.') + 1);
if ("png|jpg|jpeg|gif|bmp".indexOf(filetype) != -1) {
preview = document.createElement('img');
domUtils.on(preview, 'load', (function (image) {
return function () {
_this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
};
})(preview));
preview.width = 113;
preview.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=' : '&noCache=') + (+new Date()).toString(36));
} else {
var ic = document.createElement('i'),
textSpan = document.createElement('span');
textSpan.innerHTML = list[i].original || list[i].url.substr(list[i].url.lastIndexOf('/') + 1);
preview = document.createElement('div');
preview.appendChild(ic);
preview.appendChild(textSpan);
domUtils.addClass(preview, 'file-wrapper');
domUtils.addClass(textSpan, 'file-title');
domUtils.addClass(ic, 'file-type-' + filetype);
domUtils.addClass(ic, 'file-preview');
}
domUtils.addClass(icon, 'icon');
item.setAttribute('data-url', urlPrefix + list[i].url);
if (list[i].original) {
item.setAttribute('data-title', list[i].original);
}
item.appendChild(preview);
item.appendChild(icon);
this.list.insertBefore(item, this.clearFloat);
}
}
},
/* 改变图片大小 */
scale: function (img, w, h, type) {
var ow = img.width,
oh = img.height;
if (type == 'justify') {
if (ow >= oh) {
img.width = w;
img.height = h * oh / ow;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w * ow / oh;
img.height = h;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
} else {
if (ow >= oh) {
img.width = w * ow / oh;
img.height = h;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w;
img.height = h * oh / ow;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
}
},
getInsertList: function () {
var i, lis = this.list.children, list = [];
for (i = 0; i < lis.length; i++) {
if (domUtils.hasClass(lis[i], 'selected')) {
var url = lis[i].getAttribute('data-url');
var title = lis[i].getAttribute('data-title') || url.substr(url.lastIndexOf('/') + 1);
list.push({
title: title,
url: url
});
}
}
return list;
}
};
})();

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 453 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -0,0 +1,818 @@
@charset "utf-8";
.wrapper {
width: 570px;
_width: 575px;
margin: 10px auto;
zoom: 1;
position: relative
}
.tabbody {
height: 355px;
}
.tabbody .panel {
position: absolute;
width: 0;
height: 0;
background: #fff;
overflow: hidden;
display: none;
}
.tabbody .panel.focus {
width: 100%;
height: 355px;
display: block;
}
.tabbody .panel table td {
vertical-align: middle;
}
#audioUrl {
width: 380px;
height: 26px;
line-height: 26px;
margin: 8px 5px;
background: #FFF;
border: 1px solid #d7d7d7;
outline: none;
border-radius: 3px;
padding: 0 5px;
}
#audioSelect {
width: 100px;
display: inline-block;
background: #FFF;
border: 1px solid #EEE;
line-height: 26px;
text-align: center;
color: #333;
text-decoration: none;
border-radius: 3px;
vertical-align: middle;
}
#audioSearchTxt {
margin-left: 15px;
background: #FFF;
width: 200px;
height: 21px;
line-height: 21px;
border: 1px solid #d7d7d7;
}
#searchList {
width: 570px;
overflow: auto;
zoom: 1;
height: 270px;
}
#searchList div {
float: left;
width: 120px;
height: 135px;
margin: 5px 15px;
}
#searchList img {
margin: 2px 8px;
cursor: pointer;
border: 2px solid #fff
}
/*不用缩略图*/
#searchList p {
margin-left: 10px;
}
#audioType {
width: 65px;
height: 23px;
line-height: 22px;
border: 1px solid #d7d7d7;
}
#audioSearchBtn, #audioSearchReset {
/*width: 80px;*/
height: 25px;
line-height: 25px;
background: #eee;
border: 1px solid #d7d7d7;
cursor: pointer;
padding: 0 5px;
}
#preview {
position: relative;
width: 420px;
padding: 0;
overflow: hidden;
margin-left: 10px;
_margin-left: 5px;
height: 280px;
background-color: #ddd;
float: left
}
#preview .previewMsg {
position: absolute;
top: 0;
margin: 0;
padding: 0;
height: 280px;
width: 100%;
background-color: #666;
}
#preview .previewMsg span {
display: block;
margin: 125px auto 0 auto;
text-align: center;
font-size: 18px;
color: #fff;
}
#preview .previewaudio {
position: absolute;
top: 0;
margin: 0;
padding: 0;
height: 280px;
width: 100%;
}
.edui-audio-wrapper fieldset {
border: 1px solid #ddd;
padding-left: 5px;
margin-bottom: 20px;
padding-bottom: 5px;
width: 115px;
}
#audioInfo {
width: 120px;
float: left;
margin-left: 10px;
_margin-left: 7px;
}
fieldset {
border: 1px solid #ddd;
padding-left: 5px;
margin-bottom: 20px;
padding-bottom: 5px;
width: 115px;
}
fieldset legend {
font-weight: bold;
}
fieldset p {
line-height: 30px;
}
fieldset input.txt {
width: 65px;
height: 21px;
line-height: 21px;
margin: 8px 5px;
background: #FFF;
border: 1px solid #d7d7d7;
}
label.url {
font-weight: bold;
margin-left: 5px;
}
#audioFloat div {
cursor: pointer;
opacity: 0.5;
filter: alpha(opacity=50);
margin: 9px;
_margin: 5px;
width: 38px;
height: 36px;
float: left;
}
#audioFloat .focus {
opacity: 1;
filter: alpha(opacity=100)
}
span.view {
display: inline-block;
width: 30px;
float: right;
cursor: pointer;
color: blue
}
/* upload audio */
.tabbody #upload.panel {
width: 0;
height: 0;
overflow: hidden;
position: absolute !important;
clip: rect(1px, 1px, 1px, 1px);
background: #fff;
display: block;
}
.tabbody #upload.panel.focus {
width: 100%;
height: 335px;
display: block;
clip: auto;
}
#upload_alignment div {
cursor: pointer;
opacity: 0.5;
filter: alpha(opacity=50);
margin: 9px;
_margin: 5px;
width: 38px;
height: 36px;
float: left;
}
#upload_alignment .focus {
opacity: 1;
filter: alpha(opacity=100)
}
#upload_left {
width: 427px;
float: left;
}
#upload_left .controller {
height: 30px;
clear: both;
}
#uploadaudioInfo {
margin-top: 10px;
float: right;
padding-right: 8px;
}
#upload .queueList {
margin: 0;
}
#upload p {
margin: 0;
}
.element-invisible {
width: 0 !important;
height: 0 !important;
border: 0;
padding: 0;
margin: 0;
overflow: hidden;
position: absolute !important;
clip: rect(1px, 1px, 1px, 1px);
}
#upload .placeholder {
margin: 10px;
margin-right: 0;
border: 2px dashed #e6e6e6;
*border: 0px dashed #e6e6e6;
height: 161px;
padding-top: 150px;
text-align: center;
width: 97%;
float: left;
background: url(./images/image.png) center 70px no-repeat;
color: #cccccc;
font-size: 18px;
position: relative;
top: 0;
*margin-left: 0;
*left: 10px;
}
#upload .placeholder .webuploader-pick {
font-size: 18px;
background: #00b7ee;
border-radius: 3px;
line-height: 44px;
padding: 0 30px;
*width: 120px;
color: #fff;
display: inline-block;
margin: 0 auto 20px auto;
cursor: pointer;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
}
#upload .placeholder .webuploader-pick-hover {
background: #00a2d4;
}
#filePickerContainer {
text-align: center;
}
#upload .placeholder .flashTip {
color: #666666;
font-size: 12px;
position: absolute;
width: 100%;
text-align: center;
bottom: 20px;
}
#upload .placeholder .flashTip a {
color: #0785d1;
text-decoration: none;
}
#upload .placeholder .flashTip a:hover {
text-decoration: underline;
}
#upload .placeholder.webuploader-dnd-over {
border-color: #999999;
}
#upload .filelist {
list-style: none;
margin: 0;
padding: 0;
overflow-x: hidden;
overflow-y: auto;
position: relative;
height: 285px;
}
#upload .filelist:after {
content: '';
display: block;
width: 0;
height: 0;
overflow: hidden;
clear: both;
}
#upload .filelist li {
width: 113px;
height: 113px;
background: url(./images/bg.png);
text-align: center;
margin: 15px 0 0 20px;
*margin: 15px 0 0 15px;
position: relative;
display: block;
float: left;
overflow: hidden;
font-size: 12px;
}
#upload .filelist li p.log {
position: relative;
top: -45px;
}
#upload .filelist li p.title {
position: absolute;
top: 0;
left: 0;
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
top: 5px;
text-indent: 5px;
text-align: left;
}
#upload .filelist li p.progress {
position: absolute;
width: 100%;
bottom: 0;
left: 0;
height: 8px;
overflow: hidden;
z-index: 50;
margin: 0;
border-radius: 0;
background: none;
-webkit-box-shadow: 0 0 0;
}
#upload .filelist li p.progress span {
display: none;
overflow: hidden;
width: 0;
height: 100%;
background: #1483d8 url(./images/progress.png) repeat-x;
-webit-transition: width 200ms linear;
-moz-transition: width 200ms linear;
-o-transition: width 200ms linear;
-ms-transition: width 200ms linear;
transition: width 200ms linear;
-webkit-animation: progressmove 2s linear infinite;
-moz-animation: progressmove 2s linear infinite;
-o-animation: progressmove 2s linear infinite;
-ms-animation: progressmove 2s linear infinite;
animation: progressmove 2s linear infinite;
-webkit-transform: translateZ(0);
}
@-webkit-keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
@-moz-keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
@keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
#upload .filelist li p.imgWrap {
position: relative;
z-index: 2;
line-height: 113px;
vertical-align: middle;
overflow: hidden;
width: 113px;
height: 113px;
-webkit-transform-origin: 50% 50%;
-moz-transform-origin: 50% 50%;
-o-transform-origin: 50% 50%;
-ms-transform-origin: 50% 50%;
transform-origin: 50% 50%;
-webit-transition: 200ms ease-out;
-moz-transition: 200ms ease-out;
-o-transition: 200ms ease-out;
-ms-transition: 200ms ease-out;
transition: 200ms ease-out;
}
#upload .filelist li p.imgWrap.notimage {
margin-top: 0;
width: 111px;
height: 111px;
border: 1px #eeeeee solid;
}
#upload .filelist li p.imgWrap.notimage i.file-preview {
margin-top: 15px;
}
#upload .filelist li img {
width: 100%;
}
#upload .filelist li p.error {
background: #f43838;
color: #fff;
position: absolute;
bottom: 0;
left: 0;
height: 28px;
line-height: 28px;
width: 100%;
z-index: 100;
display: none;
}
#upload .filelist li .success {
display: block;
position: absolute;
left: 0;
bottom: 0;
height: 40px;
width: 100%;
z-index: 200;
background: url(./images/success.png) no-repeat right bottom;
background-image: url(./images/success.gif) \9;
}
#upload .filelist li.filePickerBlock {
width: 113px;
height: 113px;
background: url(./images/image.png) no-repeat center 12px;
border: 1px solid #eeeeee;
border-radius: 0;
}
#upload .filelist li.filePickerBlock div.webuploader-pick {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
opacity: 0;
background: none;
font-size: 0;
}
#upload .filelist div.file-panel {
position: absolute;
height: 0;
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0;
background: rgba(0, 0, 0, 0.5);
width: 100%;
top: 0;
left: 0;
overflow: hidden;
z-index: 300;
}
#upload .filelist div.file-panel span {
width: 24px;
height: 24px;
display: inline;
float: right;
text-indent: -9999px;
overflow: hidden;
background: url(./images/icons.png) no-repeat;
background: url(./images/icons.gif) no-repeat \9;
margin: 5px 1px 1px;
cursor: pointer;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#upload .filelist div.file-panel span.rotateLeft {
display: none;
background-position: 0 -24px;
}
#upload .filelist div.file-panel span.rotateLeft:hover {
background-position: 0 0;
}
#upload .filelist div.file-panel span.rotateRight {
display: none;
background-position: -24px -24px;
}
#upload .filelist div.file-panel span.rotateRight:hover {
background-position: -24px 0;
}
#upload .filelist div.file-panel span.cancel {
background-position: -48px -24px;
}
#upload .filelist div.file-panel span.cancel:hover {
background-position: -48px 0;
}
#upload .statusBar {
height: 45px;
border-bottom: 1px solid #dadada;
margin: 0 10px;
padding: 0;
line-height: 45px;
vertical-align: middle;
position: relative;
}
#upload .statusBar .progress {
border: 1px solid #1483d8;
width: 198px;
background: #fff;
height: 18px;
position: absolute;
top: 12px;
display: none;
text-align: center;
line-height: 18px;
color: #6dbfff;
margin: 0 10px 0 0;
}
#upload .statusBar .progress span.percentage {
width: 0;
height: 100%;
left: 0;
top: 0;
background: #1483d8;
position: absolute;
}
#upload .statusBar .progress span.text {
position: relative;
z-index: 10;
}
#upload .statusBar .info {
display: inline-block;
font-size: 14px;
color: #666666;
}
#upload .statusBar .btns {
position: absolute;
top: 7px;
right: 0;
line-height: 30px;
}
#filePickerBtn {
display: inline-block;
float: left;
}
#upload .statusBar .btns .webuploader-pick,
#upload .statusBar .btns .uploadBtn,
#upload .statusBar .btns .uploadBtn.state-uploading,
#upload .statusBar .btns .uploadBtn.state-paused {
background: #ffffff;
border: 1px solid #cfcfcf;
color: #565656;
padding: 0 18px;
display: inline-block;
border-radius: 3px;
margin-left: 10px;
cursor: pointer;
font-size: 14px;
float: left;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#upload .statusBar .btns .webuploader-pick-hover,
#upload .statusBar .btns .uploadBtn:hover,
#upload .statusBar .btns .uploadBtn.state-uploading:hover,
#upload .statusBar .btns .uploadBtn.state-paused:hover {
background: #f0f0f0;
}
#upload .statusBar .btns .uploadBtn,
#upload .statusBar .btns .uploadBtn.state-paused {
background: #00b7ee;
color: #fff;
border-color: transparent;
}
#upload .statusBar .btns .uploadBtn:hover,
#upload .statusBar .btns .uploadBtn.state-paused:hover {
background: #00a2d4;
}
#upload .statusBar .btns .uploadBtn.disabled {
pointer-events: none;
filter: alpha(opacity=60);
-moz-opacity: 0.6;
-khtml-opacity: 0.6;
opacity: 0.6;
}
/* 在线文件的文件预览图标 */
i.file-preview {
display: block;
margin: 10px auto;
width: 70px;
height: 70px;
background-image: url("./images/file-icons.png");
background-image: url("./images/file-icons.gif") \9;
background-position: -140px center;
background-repeat: no-repeat;
}
i.file-preview.file-type-dir {
background-position: 0 center;
}
i.file-preview.file-type-file {
background-position: -140px center;
}
i.file-preview.file-type-filelist {
background-position: -210px center;
}
i.file-preview.file-type-zip,
i.file-preview.file-type-rar,
i.file-preview.file-type-7z,
i.file-preview.file-type-tar,
i.file-preview.file-type-gz,
i.file-preview.file-type-bz2 {
background-position: -280px center;
}
i.file-preview.file-type-xls,
i.file-preview.file-type-xlsx {
background-position: -350px center;
}
i.file-preview.file-type-doc,
i.file-preview.file-type-docx {
background-position: -420px center;
}
i.file-preview.file-type-ppt,
i.file-preview.file-type-pptx {
background-position: -490px center;
}
i.file-preview.file-type-vsd {
background-position: -560px center;
}
i.file-preview.file-type-pdf {
background-position: -630px center;
}
i.file-preview.file-type-txt,
i.file-preview.file-type-md,
i.file-preview.file-type-json,
i.file-preview.file-type-htm,
i.file-preview.file-type-xml,
i.file-preview.file-type-html,
i.file-preview.file-type-js,
i.file-preview.file-type-css,
i.file-preview.file-type-php,
i.file-preview.file-type-jsp,
i.file-preview.file-type-asp {
background-position: -700px center;
}
i.file-preview.file-type-apk {
background-position: -770px center;
}
i.file-preview.file-type-exe {
background-position: -840px center;
}
i.file-preview.file-type-ipa {
background-position: -910px center;
}
i.file-preview.file-type-mp4,
i.file-preview.file-type-swf,
i.file-preview.file-type-mkv,
i.file-preview.file-type-avi,
i.file-preview.file-type-flv,
i.file-preview.file-type-mov,
i.file-preview.file-type-mpg,
i.file-preview.file-type-mpeg,
i.file-preview.file-type-ogv,
i.file-preview.file-type-webm,
i.file-preview.file-type-rm,
i.file-preview.file-type-rmvb {
background-position: -980px center;
}
i.file-preview.file-type-ogg,
i.file-preview.file-type-wav,
i.file-preview.file-type-wmv,
i.file-preview.file-type-mid,
i.file-preview.file-type-mp3 {
background-position: -1050px center;
}
i.file-preview.file-type-jpg,
i.file-preview.file-type-jpeg,
i.file-preview.file-type-gif,
i.file-preview.file-type-bmp,
i.file-preview.file-type-png,
i.file-preview.file-type-psd {
background-position: -140px center;
}

@ -0,0 +1,83 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script type="text/javascript" src="../internal.js?aea0c61c"></script>
<link rel="stylesheet" type="text/css" href="audio.css?c75591bc"/>
</head>
<body>
<div class="wrapper">
<div id="audioTab">
<div id="tabHeads" class="tabhead">
<span tabSrc="audio" class="focus" data-content-id="audio"><var id="lang_tab_insertV"></var></span>
<span tabSrc="upload" style="display:none;" data-content-id="upload"><var
id="lang_tab_uploadV"></var></span>
</div>
<div id="tabBodys" class="tabbody">
<div id="audio" class="panel focus">
<table>
<tr>
<td><label for="audioUrl" class="url"><var id="lang_audio_url"></var></label></td>
<td><input id="audioUrl" type="text"><a href="javascript:;" id="audioSelect"
style="display:none;">选择音频</a></td>
</tr>
</table>
<div style="padding:0 5px 5px 5px;color:#999;">
外链音频支持MP3格式
</div>
<div id="preview"></div>
<div id="audioInfo">
<fieldset>
<legend><var id="lang_alignment"></var></legend>
<div id="audioFloat"></div>
</fieldset>
</div>
</div>
<div id="upload" class="panel">
<div id="upload_left">
<div id="queueList" class="queueList">
<div class="statusBar element-invisible">
<div class="progress">
<span class="text">0%</span>
<span class="percentage"></span>
</div>
<div class="info"></div>
<div class="btns">
<div id="filePickerBtn"></div>
<div class="uploadBtn"><var id="lang_start_upload"></var></div>
</div>
</div>
<div id="dndArea" class="placeholder">
<div class="filePickerContainer">
<div id="filePickerReady"></div>
</div>
</div>
<ul class="filelist element-invisible">
<li id="filePickerBlock" class="filePickerBlock"></li>
</ul>
</div>
</div>
<div id="uploadaudioInfo">
<fieldset>
<legend><var id="lang_upload_alignment"></var></legend>
<div id="upload_alignment"></div>
</fieldset>
</div>
</div>
</div>
</div>
</div>
<!-- jquery -->
<script type="text/javascript" src="../../third-party/jquery-1.10.2.js?628072e7"></script>
<!-- webuploader -->
<script type="text/javascript" src="../../third-party/webuploader/webuploader.js?e4f02d82"></script>
<link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css?0057c5c7">
<!-- audio -->
<script type="text/javascript" src="audio.js?a3aa9e68"></script>
</body>
</html>

@ -0,0 +1,785 @@
/**
* Created by JetBrains PhpStorm.
* User: taoqili
* Date: 12-2-20
* Time: 上午11:19
* To change this template use File | Settings | File Templates.
*/
(function () {
var audio = {},
uploadaudioList = [],
isModifyUploadaudio = false,
uploadFile;
var editorOpt = {};
window.onload = function () {
editorOpt = editor.getOpt('audioConfig');
$focus($G("audioUrl"));
initTabs();
initAudio();
initUpload();
};
/* 初始化tab标签 */
function initTabs() {
var tabs = $G('tabHeads').children;
for (var i = 0; i < tabs.length; i++) {
domUtils.on(tabs[i], "click", function (e) {
var j, bodyId, target = e.target || e.srcElement;
for (j = 0; j < tabs.length; j++) {
bodyId = tabs[j].getAttribute('data-content-id');
if (tabs[j] == target) {
domUtils.addClass(tabs[j], 'focus');
domUtils.addClass($G(bodyId), 'focus');
} else {
domUtils.removeClasses(tabs[j], 'focus');
domUtils.removeClasses($G(bodyId), 'focus');
}
}
});
}
if (!editorOpt.disableUpload) {
$G('tabHeads').querySelector('[data-content-id="upload"]').style.display = 'inline-block';
}
if (!!editorOpt.selectCallback) {
$G('audioSelect').style.display = 'inline-block';
domUtils.on($G('audioSelect'), "click", function (e) {
editorOpt.selectCallback(editor, function (info) {
if (info) {
$G('audioUrl').value = info.path;
createPreview(info.path);
}
});
});
}
}
function initAudio() {
createAlignButton(["audioFloat", "upload_alignment"]);
addUrlChangeListener($G("audioUrl"));
addOkListener();
//编辑视频时初始化相关信息
(function () {
var img = editor.selection.getRange().getClosedNode(), url;
if (img && img.className) {
var hasFakedClass = (img.className == "edui-faked-audio"),
hasUploadClass = img.className.indexOf("edui-upload-audio") != -1;
if (hasFakedClass || hasUploadClass) {
$G("audioUrl").value = url = img.getAttribute("_url");
var align = domUtils.getComputedStyle(img, "float"),
parentAlign = domUtils.getComputedStyle(img.parentNode, "text-align");
updateAlignButton(parentAlign === "center" ? "center" : align);
}
if (hasUploadClass) {
isModifyUploadaudio = true;
}
}
createPreview(url);
})();
}
/**
* 监听确认和取消两个按钮事件用户执行插入或者清空正在播放的视频实例操作
*/
function addOkListener() {
dialog.onok = function () {
$G("preview").innerHTML = "";
var currentTab = findFocus("tabHeads", "tabSrc");
switch (currentTab) {
case "audio":
return insertSingle();
break;
// case "audioSearch":
// return insertSearch("searchList");
// break;
case "upload":
return insertUpload();
break;
}
};
dialog.oncancel = function () {
$G("preview").innerHTML = "";
};
}
/**
* 依据传入的align值更新按钮信息
* @param align
*/
function updateAlignButton(align) {
var aligns = $G("audioFloat").children;
for (var i = 0, ci; ci = aligns[i++];) {
if (ci.getAttribute("name") == align) {
if (ci.className != "focus") {
ci.className = "focus";
}
} else {
if (ci.className == "focus") {
ci.className = "";
}
}
}
}
/**
* 将单个视频信息插入编辑器中
*/
function insertSingle() {
var url = $G('audioUrl').value,
align = findFocus("audioFloat", "name");
if (!url) return false;
editor.execCommand('insertaudio', {
url: url,
}, isModifyUploadaudio ? 'upload' : null);
}
/**
* 将元素id下的所有代表视频的图片插入编辑器中
* @param id
*/
function insertSearch(id) {
var imgs = domUtils.getElementsByTagName($G(id), "img"),
audioObjs = [];
for (var i = 0, img; img = imgs[i++];) {
if (img.getAttribute("selected")) {
audioObjs.push({
url: img.getAttribute("ue_audio_url"),
width: 420,
height: 280,
align: "none"
});
}
}
editor.execCommand('insertaudio', audioObjs);
}
/**
* 找到id下具有focus类的节点并返回该节点下的某个属性
* @param id
* @param returnProperty
*/
function findFocus(id, returnProperty) {
var tabs = $G(id).children,
property;
for (var i = 0, ci; ci = tabs[i++];) {
if (ci.className == "focus") {
property = ci.getAttribute(returnProperty);
break;
}
}
return property;
}
/**
* 数字判断
* @param value
*/
function isNumber(value) {
return /(0|^[1-9]\d*$)/.test(value);
}
/**
* 创建图片浮动选择按钮
* @param ids
*/
function createAlignButton(ids) {
for (var i = 0, ci; ci = ids[i++];) {
var floatContainer = $G(ci),
nameMaps = {
"none": lang['default'],
"left": lang.floatLeft,
"right": lang.floatRight,
"center": lang.block
};
for (var j in nameMaps) {
var div = document.createElement("div");
div.setAttribute("name", j);
if (j == "none") div.className = "focus";
div.style.cssText = "background:url(images/" + j + "_focus.jpg);";
div.setAttribute("title", nameMaps[j]);
floatContainer.appendChild(div);
}
switchSelect(ci);
}
}
/**
* 选择切换
* @param selectParentId
*/
function switchSelect(selectParentId) {
var selects = $G(selectParentId).children;
for (var i = 0, ci; ci = selects[i++];) {
domUtils.on(ci, "click", function () {
for (var j = 0, cj; cj = selects[j++];) {
cj.className = "";
cj.removeAttribute && cj.removeAttribute("class");
}
this.className = "focus";
})
}
}
/**
* 监听url改变事件
* @param url
*/
function addUrlChangeListener(url) {
if (browser.ie) {
url.onpropertychange = function () {
createPreview(this.value);
}
} else {
url.addEventListener("input", function () {
createPreview(this.value);
}, false);
}
}
function createAudioHtml(url, param) {
param = param || {};
var str = [
"<audio",
(param.id ? ' id="' + param.id + '"' : ""),
(param.cls ? ' class="' + param.cls + '"' : ''),
' controls >',
'<source src="' + url + '" type="audio/mpeg' + '" />',
'</audio>',
];
return str.join('');
}
/**
* 根据url生成视频预览
* @param url
*/
function createPreview(url) {
if (!url) {
return;
}
$G("preview").innerHTML = '<div class="previewMsg"><span>' + lang.urlError + '</span></div>' +
'<div style="position: absolute; inset: 0; background: #FFF; text-align: center; display: flex; justify-items: center; align-items: center;">' +
'<div style="text-align:center;flex-grow:1;">' + createAudioHtml(url) + '</div>'
+ '</div>';
}
/* 插入上传视频 */
function insertUpload() {
var audioObjs = [],
uploadDir = editor.getOpt('audioUrlPrefix'),
align = findFocus("upload_alignment", "name") || 'none';
for (var key in uploadaudioList) {
var file = uploadaudioList[key];
audioObjs.push({
url: uploadDir + file.url,
align: align
});
}
var count = uploadFile.getQueueCount();
if (count) {
$('.info', '#queueList').html('<span style="color:red;">' + '还有2个未上传文件'.replace(/[\d]/, count) + '</span>');
return false;
} else {
editor.execCommand('insertaudio', audioObjs, 'upload');
}
}
/*初始化上传标签*/
function initUpload() {
uploadFile = new UploadFile('queueList');
}
/* 上传附件 */
function UploadFile(target) {
this.$wrap = target.constructor == String ? $('#' + target) : $(target);
this.init();
}
UploadFile.prototype = {
init: function () {
this.fileList = [];
this.initContainer();
this.initUploader();
},
initContainer: function () {
this.$queue = this.$wrap.find('.filelist');
},
/* 初始化容器 */
initUploader: function () {
var _this = this,
$ = jQuery, // just in case. Make sure it's not an other libaray.
$wrap = _this.$wrap,
// 图片容器
$queue = $wrap.find('.filelist'),
// 状态栏,包括进度和控制按钮
$statusBar = $wrap.find('.statusBar'),
// 文件总体选择信息。
$info = $statusBar.find('.info'),
// 上传按钮
$upload = $wrap.find('.uploadBtn'),
// 上传按钮
$filePickerBtn = $wrap.find('.filePickerBtn'),
// 上传按钮
$filePickerBlock = $wrap.find('.filePickerBlock'),
// 没选择文件之前的内容。
$placeHolder = $wrap.find('.placeholder'),
// 总体进度条
$progress = $statusBar.find('.progress').hide(),
// 添加的文件数量
fileCount = 0,
// 添加的文件总大小
fileSize = 0,
// 优化retina, 在retina下这个值是2
ratio = window.devicePixelRatio || 1,
// 缩略图大小
thumbnailWidth = 113 * ratio,
thumbnailHeight = 113 * ratio,
// 可能有pedding, ready, uploading, confirm, done.
state = '',
// 所有文件的进度信息,key为file id
percentages = {},
supportTransition = (function () {
var s = document.createElement('p').style,
r = 'transition' in s ||
'WebkitTransition' in s ||
'MozTransition' in s ||
'msTransition' in s ||
'OTransition' in s;
s = null;
return r;
})(),
// WebUploader实例
uploader,
actionUrl = editor.getActionUrl(editor.getOpt('audioActionName')),
fileMaxSize = editor.getOpt('audioMaxSize'),
acceptExtensions = (editor.getOpt('audioAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, '');
;
if (!WebUploader.Uploader.support()) {
$('#filePickerReady').after($('<div>').html(lang.errorNotSupport)).hide();
return;
} else if (!editor.getOpt('audioActionName')) {
$('#filePickerReady').after($('<div>').html(lang.errorLoadConfig)).hide();
return;
}
uploader = _this.uploader = WebUploader.create({
pick: {
id: '#filePickerReady',
label: lang.uploadSelectFile
},
swf: '../../third-party/webuploader/Uploader.swf',
server: actionUrl,
fileVal: editor.getOpt('audioFieldName'),
duplicate: true,
fileSingleSizeLimit: fileMaxSize,
headers: editor.getOpt('serverHeaders') || {},
compress: false
});
uploader.addButton({
id: '#filePickerBlock'
});
uploader.addButton({
id: '#filePickerBtn',
label: lang.uploadAddFile
});
setState('pedding');
// 当有文件添加进来时执行,负责view的创建
function addFile(file) {
var $li = $('<li id="' + file.id + '">' +
'<p class="title">' + file.name + '</p>' +
'<p class="imgWrap"></p>' +
'<p class="progress"><span></span></p>' +
'</li>'),
$btns = $('<div class="file-panel">' +
'<span class="cancel">' + lang.uploadDelete + '</span>' +
'<span class="rotateRight">' + lang.uploadTurnRight + '</span>' +
'<span class="rotateLeft">' + lang.uploadTurnLeft + '</span></div>').appendTo($li),
$prgress = $li.find('p.progress span'),
$wrap = $li.find('p.imgWrap'),
$info = $('<p class="error"></p>').hide().appendTo($li),
showError = function (code) {
switch (code) {
case 'exceed_size':
text = lang.errorExceedSize;
break;
case 'interrupt':
text = lang.errorInterrupt;
break;
case 'http':
text = lang.errorHttp;
break;
case 'not_allow_type':
text = lang.errorFileType;
break;
default:
text = lang.errorUploadRetry;
break;
}
$info.text(text).show();
};
if (file.getStatus() === 'invalid') {
showError(file.statusText);
} else {
$wrap.text(lang.uploadPreview);
if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|' + file.ext.toLowerCase() + '|') == -1) {
$wrap.empty().addClass('notimage').append('<i class="file-preview file-type-' + file.ext.toLowerCase() + '"></i>' +
'<span class="file-title">' + file.name + '</span>');
} else {
if (browser.ie && browser.version <= 7) {
$wrap.text(lang.uploadNoPreview);
} else {
uploader.makeThumb(file, function (error, src) {
if (error || !src || (/^data:/.test(src) && browser.ie && browser.version <= 7)) {
$wrap.text(lang.uploadNoPreview);
} else {
var $img = $('<img src="' + src + '">');
$wrap.empty().append($img);
$img.on('error', function () {
$wrap.text(lang.uploadNoPreview);
});
}
}, thumbnailWidth, thumbnailHeight);
}
}
percentages[file.id] = [file.size, 0];
file.rotation = 0;
/* 检查文件格式 */
if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {
showError('not_allow_type');
uploader.removeFile(file);
}
}
file.on('statuschange', function (cur, prev) {
if (prev === 'progress') {
$prgress.hide().width(0);
} else if (prev === 'queued') {
$li.off('mouseenter mouseleave');
$btns.remove();
}
// 成功
if (cur === 'error' || cur === 'invalid') {
showError(file.statusText);
percentages[file.id][1] = 1;
} else if (cur === 'interrupt') {
showError('interrupt');
} else if (cur === 'queued') {
percentages[file.id][1] = 0;
} else if (cur === 'progress') {
$info.hide();
$prgress.css('display', 'block');
} else if (cur === 'complete') {
}
$li.removeClass('state-' + prev).addClass('state-' + cur);
});
$li.on('mouseenter', function () {
$btns.stop().animate({height: 30});
});
$li.on('mouseleave', function () {
$btns.stop().animate({height: 0});
});
$btns.on('click', 'span', function () {
var index = $(this).index(),
deg;
switch (index) {
case 0:
uploader.removeFile(file);
return;
case 1:
file.rotation += 90;
break;
case 2:
file.rotation -= 90;
break;
}
if (supportTransition) {
deg = 'rotate(' + file.rotation + 'deg)';
$wrap.css({
'-webkit-transform': deg,
'-mos-transform': deg,
'-o-transform': deg,
'transform': deg
});
} else {
$wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');
}
});
$li.insertBefore($filePickerBlock);
}
// 负责view的销毁
function removeFile(file) {
var $li = $('#' + file.id);
delete percentages[file.id];
updateTotalProgress();
$li.off().find('.file-panel').off().end().remove();
}
function updateTotalProgress() {
var loaded = 0,
total = 0,
spans = $progress.children(),
percent;
$.each(percentages, function (k, v) {
total += v[0];
loaded += v[0] * v[1];
});
percent = total ? loaded / total : 0;
spans.eq(0).text(Math.round(percent * 100) + '%');
spans.eq(1).css('width', Math.round(percent * 100) + '%');
updateStatus();
}
function setState(val, files) {
if (val != state) {
var stats = uploader.getStats();
$upload.removeClass('state-' + state);
$upload.addClass('state-' + val);
switch (val) {
/* 未选择文件 */
case 'pedding':
$queue.addClass('element-invisible');
$statusBar.addClass('element-invisible');
$placeHolder.removeClass('element-invisible');
$progress.hide();
$info.hide();
uploader.refresh();
break;
/* 可以开始上传 */
case 'ready':
$placeHolder.addClass('element-invisible');
$queue.removeClass('element-invisible');
$statusBar.removeClass('element-invisible');
$progress.hide();
$info.show();
$upload.text(lang.uploadStart);
uploader.refresh();
break;
/* 上传中 */
case 'uploading':
$progress.show();
$info.hide();
$upload.text(lang.uploadPause);
break;
/* 暂停上传 */
case 'paused':
$progress.show();
$info.hide();
$upload.text(lang.uploadContinue);
break;
case 'confirm':
$progress.show();
$info.hide();
$upload.text(lang.uploadStart);
stats = uploader.getStats();
if (stats.successNum && !stats.uploadFailNum) {
setState('finish');
return;
}
break;
case 'finish':
$progress.hide();
$info.show();
if (stats.uploadFailNum) {
$upload.text(lang.uploadRetry);
} else {
$upload.text(lang.uploadStart);
}
break;
}
state = val;
updateStatus();
}
if (!_this.getQueueCount()) {
$upload.addClass('disabled')
} else {
$upload.removeClass('disabled')
}
}
function updateStatus() {
var text = '', stats;
if (state === 'ready') {
text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));
} else if (state === 'confirm') {
stats = uploader.getStats();
if (stats.uploadFailNum) {
text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);
}
} else {
stats = uploader.getStats();
text = lang.updateStatusFinish.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)).replace('_', stats.successNum);
if (stats.uploadFailNum) {
text += lang.updateStatusError.replace('_', stats.uploadFailNum);
}
}
$info.html(text);
}
uploader.on('fileQueued', function (file) {
fileCount++;
fileSize += file.size;
if (fileCount === 1) {
$placeHolder.addClass('element-invisible');
$statusBar.show();
}
addFile(file);
});
uploader.on('fileDequeued', function (file) {
fileCount--;
fileSize -= file.size;
removeFile(file);
updateTotalProgress();
});
uploader.on('filesQueued', function (file) {
if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {
setState('ready');
}
updateTotalProgress();
});
uploader.on('all', function (type, files) {
switch (type) {
case 'uploadFinished':
setState('confirm', files);
break;
case 'startUpload':
/* 添加额外的GET参数 */
var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?' : '&') + 'encode=utf-8&' + params);
uploader.option('server', url);
setState('uploading', files);
break;
case 'stopUpload':
setState('paused', files);
break;
}
});
uploader.on('uploadBeforeSend', function (file, data, header) {
//这里可以通过data对象添加POST参数
if (actionUrl.toLowerCase().indexOf('jsp') != -1) {
header['X_Requested_With'] = 'XMLHttpRequest';
}
});
uploader.on('uploadProgress', function (file, percentage) {
var $li = $('#' + file.id),
$percent = $li.find('.progress span');
$percent.css('width', percentage * 100 + '%');
percentages[file.id][1] = percentage;
updateTotalProgress();
});
uploader.on('uploadSuccess', function (file, ret) {
var $file = $('#' + file.id);
try {
var responseText = (ret._raw || ret),
json = utils.str2json(responseText);
json = editor.getOpt('serverResponsePrepare')(json);
if (json.state == 'SUCCESS') {
uploadaudioList.push({
'url': json.url,
'type': json.type,
'original': json.original
});
$file.append('<span class="success"></span>');
} else {
$file.find('.error').text(json.state).show();
}
} catch (e) {
$file.find('.error').text(lang.errorServerUpload).show();
}
});
uploader.on('uploadError', function (file, code) {
});
uploader.on('error', function (code, param1, param2) {
if (code === 'F_EXCEED_SIZE') {
editor.getOpt('tipError')(lang.errorExceedSize + ' ' + (param1 / 1024 / 1024).toFixed(1) + 'MB');
} else {
console.log('error', code, param1, param2);
}
});
uploader.on('uploadComplete', function (file, ret) {
});
$upload.on('click', function () {
if ($(this).hasClass('disabled')) {
return false;
}
if (state === 'ready') {
uploader.upload();
} else if (state === 'paused') {
uploader.upload();
} else if (state === 'uploading') {
uploader.stop();
}
});
$upload.addClass('state-' + state);
updateTotalProgress();
},
getQueueCount: function () {
var file, i, status, readyFile = 0, files = this.uploader.getFiles();
for (i = 0; file = files[i++];) {
status = file.getStatus();
if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++;
}
return readyFile;
},
refresh: function () {
this.uploader.refresh();
}
};
})();

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 453 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -0,0 +1,193 @@
.wrapper {
width: 424px;
margin: 10px auto;
zoom: 1;
position: relative
}
.tabbody {
height: 225px;
}
.tabbody .panel {
position: absolute;
width: 100%;
height: 100%;
background: #fff;
display: none;
}
.tabbody .focus {
display: block;
}
body {
font-size: 12px;
color: #888;
overflow: hidden;
}
input, label {
vertical-align: middle
}
.clear {
clear: both;
}
.pl {
padding-left: 18px;
padding-left: 23px \9;
}
#imageList {
width: 420px;
height: 215px;
margin-top: 10px;
overflow: hidden;
overflow-y: auto;
}
#imageList div {
float: left;
width: 100px;
height: 95px;
margin: 5px 10px;
}
#imageList img {
cursor: pointer;
border: 2px solid white;
}
.bgarea {
margin: 10px;
padding: 5px;
height: 84%;
border: 1px solid #A8A297;
}
.content div {
margin: 10px 0 10px 5px;
}
.content .iptradio {
margin: 0px 5px 5px 0px;
}
.txt {
width: 280px;
}
.wrapcolor {
height: 19px;
}
div.color {
float: left;
margin: 0;
}
#colorPicker {
width: 17px;
height: 17px;
border: 1px solid #CCC;
display: inline-block;
border-radius: 3px;
box-shadow: 2px 2px 5px #D3D6DA;
margin: 0;
float: left;
}
div.alignment, #custom {
margin-left: 23px;
margin-left: 28px \9;
}
#custom input {
height: 15px;
min-height: 15px;
width: 20px;
}
#repeatType {
width: 100px;
}
/* 图片管理样式 */
#imgManager {
width: 100%;
height: 225px;
}
#imgManager #imageList {
width: 100%;
overflow-x: hidden;
overflow-y: auto;
}
#imgManager ul {
display: block;
list-style: none;
margin: 0;
padding: 0;
}
#imgManager li {
float: left;
display: block;
list-style: none;
padding: 0;
width: 113px;
height: 113px;
margin: 9px 0 0 19px;
background-color: #eee;
overflow: hidden;
cursor: pointer;
position: relative;
}
#imgManager li.clearFloat {
float: none;
clear: both;
display: block;
width: 0;
height: 0;
margin: 0;
padding: 0;
}
#imgManager li img {
cursor: pointer;
}
#imgManager li .icon {
cursor: pointer;
width: 113px;
height: 113px;
position: absolute;
top: 0;
left: 0;
z-index: 2;
border: 0;
background-repeat: no-repeat;
}
#imgManager li .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
}
#imgManager li.selected .icon {
background-image: url(images/success.png);
background-position: 75px 75px;
}
#imgManager li.selected .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
background-position: 72px 72px;
}

@ -0,0 +1,59 @@
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script type="text/javascript" src="../internal.js?aea0c61c"></script>
<link rel="stylesheet" type="text/css" href="background.css?da860c7a">
</head>
<body>
<div id="bg_container" class="wrapper">
<div id="tabHeads" class="tabhead">
<span class="focus" data-content-id="normal"><var id="lang_background_normal"></var></span>
</div>
<div id="tabBodys" class="tabbody">
<div id="normal" class="panel focus">
<fieldset class="bgarea">
<legend><var id="lang_background_set"></var></legend>
<div class="content">
<div>
<label><input id="nocolorRadio" class="iptradio" type="radio" name="t" value="none"
checked="checked"><var id="lang_background_none"></var></label>
<label><input id="coloredRadio" class="iptradio" type="radio" name="t" value="color"><var
id="lang_background_colored"></var></label>
</div>
<div class="wrapcolor pl">
<div class="color">
<var id="lang_background_color"></var>:
</div>
<div id="colorPicker"></div>
<div class="clear"></div>
</div>
<div class="wrapcolor pl">
<label><var id="lang_background_netimg"></var>:</label><input class="txt" type="text" id="url">
</div>
<div id="alignment" class="alignment">
<var id="lang_background_align"></var>:<select id="repeatType">
<option value="center"></option>
<option value="repeat-x"></option>
<option value="repeat-y"></option>
<option value="repeat"></option>
<option value="self"></option>
</select>
</div>
<div id="custom">
<var id="lang_background_position"></var>:x:<input type="text" size="1" id="x" maxlength="4"
value="0">px&nbsp;&nbsp;y:<input type="text"
size="1"
id="y"
maxlength="4"
value="0">px
</div>
</div>
</fieldset>
</div>
</div>
</div>
<script type="text/javascript" src="background.js?dd36acd0"></script>
</body>
</html>

@ -0,0 +1,370 @@
(function () {
var onlineImage,
backupStyle = editor.queryCommandValue('background');
window.onload = function () {
initTabs();
initColorSelector();
};
/* 初始化tab标签 */
function initTabs() {
var tabs = $G('tabHeads').children;
for (var i = 0; i < tabs.length; i++) {
domUtils.on(tabs[i], "click", function (e) {
var target = e.target || e.srcElement;
for (var j = 0; j < tabs.length; j++) {
if (tabs[j] == target) {
tabs[j].className = "focus";
var contentId = tabs[j].getAttribute('data-content-id');
$G(contentId).style.display = "block";
} else {
tabs[j].className = "";
$G(tabs[j].getAttribute('data-content-id')).style.display = "none";
}
}
});
}
}
/* 初始化颜色设置 */
function initColorSelector() {
var obj = editor.queryCommandValue('background');
if (obj) {
var color = obj['background-color'],
repeat = obj['background-repeat'] || 'repeat',
image = obj['background-image'] || '',
position = obj['background-position'] || 'center center',
pos = position.split(' '),
x = parseInt(pos[0]) || 0,
y = parseInt(pos[1]) || 0;
if (repeat == 'no-repeat' && (x || y)) repeat = 'self';
image = image.match(/url[\s]*\(([^\)]*)\)/);
image = image ? image[1] : '';
updateFormState('colored', color, image, repeat, x, y);
} else {
updateFormState();
}
var updateHandler = function () {
updateFormState();
updateBackground();
}
domUtils.on($G('nocolorRadio'), 'click', updateBackground);
domUtils.on($G('coloredRadio'), 'click', updateHandler);
domUtils.on($G('url'), 'keyup', function () {
if ($G('url').value && $G('alignment').style.display == "none") {
utils.each($G('repeatType').children, function (item) {
item.selected = ('repeat' == item.getAttribute('value') ? 'selected' : false);
});
}
updateHandler();
});
domUtils.on($G('repeatType'), 'change', updateHandler);
domUtils.on($G('x'), 'keyup', updateBackground);
domUtils.on($G('y'), 'keyup', updateBackground);
initColorPicker();
}
/* 初始化颜色选择器 */
function initColorPicker() {
var me = editor,
cp = $G("colorPicker");
/* 生成颜色选择器ui对象 */
var popup = new UE.ui.Popup({
content: new UE.ui.ColorPicker({
noColorText: me.getLang("clearColor"),
editor: me,
onpickcolor: function (t, color) {
updateFormState('colored', color);
updateBackground();
UE.ui.Popup.postHide();
},
onpicknocolor: function (t, color) {
updateFormState('colored', 'transparent');
updateBackground();
UE.ui.Popup.postHide();
}
}),
editor: me,
onhide: function () {
}
});
/* 设置颜色选择器 */
domUtils.on(cp, "click", function () {
popup.showAnchor(this);
});
domUtils.on(document, 'mousedown', function (evt) {
var el = evt.target || evt.srcElement;
UE.ui.Popup.postHide(el);
});
domUtils.on(window, 'scroll', function () {
UE.ui.Popup.postHide();
});
}
/* 更新背景色设置面板 */
function updateFormState(radio, color, url, align, x, y) {
var nocolorRadio = $G('nocolorRadio'),
coloredRadio = $G('coloredRadio');
if (radio) {
nocolorRadio.checked = (radio == 'colored' ? false : 'checked');
coloredRadio.checked = (radio == 'colored' ? 'checked' : false);
}
if (color) {
domUtils.setStyle($G("colorPicker"), "background-color", color);
}
if (url && /^\//.test(url)) {
var a = document.createElement('a');
a.href = url;
browser.ie && (a.href = a.href);
url = browser.ie ? a.href : (a.protocol + '//' + a.host + a.pathname + a.search + a.hash);
}
if (url || url === '') {
$G('url').value = url;
}
if (align) {
utils.each($G('repeatType').children, function (item) {
item.selected = (align == item.getAttribute('value') ? 'selected' : false);
});
}
if (x || y) {
$G('x').value = parseInt(x) || 0;
$G('y').value = parseInt(y) || 0;
}
$G('alignment').style.display = coloredRadio.checked && $G('url').value ? '' : 'none';
$G('custom').style.display = coloredRadio.checked && $G('url').value && $G('repeatType').value == 'self' ? '' : 'none';
}
/* 更新背景颜色 */
function updateBackground() {
if ($G('coloredRadio').checked) {
var color = domUtils.getStyle($G("colorPicker"), "background-color"),
bgimg = $G("url").value,
align = $G("repeatType").value,
backgroundObj = {
"background-repeat": "no-repeat",
"background-position": "center center"
};
if (color) backgroundObj["background-color"] = color;
if (bgimg) backgroundObj["background-image"] = 'url(' + bgimg + ')';
if (align == 'self') {
backgroundObj["background-position"] = $G("x").value + "px " + $G("y").value + "px";
} else if (align == 'repeat-x' || align == 'repeat-y' || align == 'repeat') {
backgroundObj["background-repeat"] = align;
}
editor.execCommand('background', backgroundObj);
} else {
editor.execCommand('background', null);
}
}
/* 在线图片 */
function OnlineImage(target) {
this.container = utils.isString(target) ? document.getElementById(target) : target;
this.init();
}
OnlineImage.prototype = {
init: function () {
this.reset();
this.initEvents();
},
/* 初始化容器 */
initContainer: function () {
this.container.innerHTML = '';
this.list = document.createElement('ul');
this.clearFloat = document.createElement('li');
domUtils.addClass(this.list, 'list');
domUtils.addClass(this.clearFloat, 'clearFloat');
this.list.id = 'imageListUl';
this.list.appendChild(this.clearFloat);
this.container.appendChild(this.list);
},
/* 初始化滚动事件,滚动到地步自动拉取数据 */
initEvents: function () {
var _this = this;
/* 滚动拉取图片 */
domUtils.on($G('imageList'), 'scroll', function (e) {
var panel = this;
if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
_this.getImageData();
}
});
/* 选中图片 */
domUtils.on(this.container, 'click', function (e) {
var target = e.target || e.srcElement,
li = target.parentNode,
nodes = $G('imageListUl').childNodes;
if (li.tagName.toLowerCase() == 'li') {
updateFormState('nocolor', null, '');
for (var i = 0, node; node = nodes[i++];) {
if (node == li && !domUtils.hasClass(node, 'selected')) {
domUtils.addClass(node, 'selected');
updateFormState('colored', null, li.firstChild.getAttribute("_src"), 'repeat');
} else {
domUtils.removeClasses(node, 'selected');
}
}
updateBackground();
}
});
},
/* 初始化第一次的数据 */
initData: function () {
/* 拉取数据需要使用的值 */
this.state = 0;
this.listSize = editor.getOpt('imageManagerListSize');
this.listIndex = 0;
this.listEnd = false;
/* 第一次拉取数据 */
this.getImageData();
},
/* 重置界面 */
reset: function () {
this.initContainer();
this.initData();
},
/* 向后台拉取图片列表数据 */
getImageData: function () {
var _this = this;
if (!_this.listEnd && !this.isLoadingData) {
this.isLoadingData = true;
var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')),
isJsonp = utils.isCrossDomainUrl(url);
ajax.request(url, {
'timeout': 100000,
'dataType': isJsonp ? 'jsonp' : '',
'data': utils.extend({
start: this.listIndex,
size: this.listSize
}, editor.queryCommandValue('serverparam')),
'headers': editor.options.serverHeaders || {},
'method': 'get',
'onsuccess': function (r) {
try {
var json = isJsonp ? r : eval('(' + r.responseText + ')');
if (json.state == 'SUCCESS') {
_this.pushData(json.list);
_this.listIndex = parseInt(json.start) + parseInt(json.list.length);
if (_this.listIndex >= json.total) {
_this.listEnd = true;
}
_this.isLoadingData = false;
}
} catch (e) {
if (r.responseText.indexOf('ue_separate_ue') != -1) {
var list = r.responseText.split(r.responseText);
_this.pushData(list);
_this.listIndex = parseInt(list.length);
_this.listEnd = true;
_this.isLoadingData = false;
}
}
},
'onerror': function () {
_this.isLoadingData = false;
}
});
}
},
/* 添加图片到列表界面上 */
pushData: function (list) {
var i, item, img, icon, _this = this,
urlPrefix = editor.getOpt('imageManagerUrlPrefix');
for (i = 0; i < list.length; i++) {
if (list[i] && list[i].url) {
item = document.createElement('li');
img = document.createElement('img');
icon = document.createElement('span');
domUtils.on(img, 'load', (function (image) {
return function () {
_this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
}
})(img));
img.width = 113;
img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=' : '&noCache=') + (+new Date()).toString(36));
img.setAttribute('_src', urlPrefix + list[i].url);
domUtils.addClass(icon, 'icon');
item.appendChild(img);
item.appendChild(icon);
this.list.insertBefore(item, this.clearFloat);
}
}
},
/* 改变图片大小 */
scale: function (img, w, h, type) {
var ow = img.width,
oh = img.height;
if (type == 'justify') {
if (ow >= oh) {
img.width = w;
img.height = h * oh / ow;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w * ow / oh;
img.height = h;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
} else {
if (ow >= oh) {
img.width = w * ow / oh;
img.height = h;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w;
img.height = h * oh / ow;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
}
},
getInsertList: function () {
var i, lis = this.list.children, list = [], align = getAlign();
for (i = 0; i < lis.length; i++) {
if (domUtils.hasClass(lis[i], 'selected')) {
var img = lis[i].firstChild,
src = img.getAttribute('_src');
list.push({
src: src,
_src: src,
floatStyle: align
});
}
}
return list;
}
};
dialog.onok = function () {
updateBackground();
editor.fireEvent('saveScene');
};
dialog.oncancel = function () {
editor.execCommand('background', backupStyle);
};
})();

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -0,0 +1,176 @@
<!DOCTYPE html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script type="text/javascript" src="../internal.js?aea0c61c"></script>
<style type="text/css">
.wrapper {
width: 600px;
padding: 10px;
height: 352px;
overflow: hidden;
position: relative;
border-bottom: 1px solid #d7d7d7;
}
.wrapper .file-upload {
display: flex;
align-items: center;
}
.wrapper .file-upload .file-tip {
color: #999;
font-size: 12px;
padding-left: 10px;
flex-grow: 1;
}
.wrapper .file-manual {
background: #EEE;
padding: 10px;
border-radius: 5px;
margin-top: 10px;
line-height: 2;
}
.wrapper .file-manual .title {
font-weight: bold;
font-size: 120%;
}
.wrapper .file-manual .body {
}
.wrapper .file-manual .body li {
list-style: disc;
margin-left: 20px;
}
.wrapper .upload-button {
width: 100px;
height: 30px;
background-color: #F8F8F8;
border: 1px solid #EEE;
border-radius: 4px;
text-align: center;
line-height: 28px;
cursor: pointer;
position: relative;
flex-shrink: 0;
margin-right: 5px;
}
.wrapper .upload-button .text {
display: inline-block;
vertical-align: middle;
}
.wrapper .upload-button input {
position: absolute;
left: 0;
top: 0;
opacity: 0;
cursor: pointer;
height: 100%;
width: 100%;
}
.wrapper .file-result {
border: 1px solid #333;
padding: 10px;
border-radius: 5px;
position: absolute;
left: 10px;
right: 10px;
top: 50px;
background: #FFF;
bottom: 10px;
overflow: auto;
display: none;
}
.wrapper .file-input{
position: absolute;
left: 10px;
right: 10px;
top: 50px;
background: #EEE;
bottom: 10px;
border-radius: 5px;
display:none;
}
.wrapper .file-input textarea{
position: absolute;
left: 10px;
right: 10px;
bottom: 10px;
border: none;
resize: none;
border-radius: 5px;
padding: 5px;
outline: none;
top: 30px;
}
.wrapper .file-input .tool{
text-align: right;
padding: 5px 10px;
}
.wrapper .file-input .tool a{
display: inline-block;
text-decoration: none;
color: #333;
background: #FFF;
padding: 0 10px;
line-height: 20px;
border-radius: 3px;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="file-upload">
<div class="upload-button">
<div class="text">选择本地文件</div>
<input type="file" id="contentImport"/>
</div>
<div class="upload-button">
<div class="text" onclick="$('.file-input').show();">粘贴Markdown</div>
</div>
<div class="file-tip"></div>
</div>
<div class="file-manual">
<div class="title">
支持文档格式
</div>
<div class="body">
<ul>
<li><b>Word</b>:docx</li>
<li><b>Markdown</b>:md</li>
</ul>
</div>
</div>
<div class="file-result"></div>
<div class="file-input">
<textarea id="fileInputContent"></textarea>
<div class="tool">
<a href="javascript:;" id="fileInputConfirm">
确定
</a>
<a href="javascript:;" onclick="$(this).closest('.file-input').hide();">
关闭
</a>
</div>
</div>
</div>
<script src="../../third-party/jquery-1.10.2.js?628072e7"></script>
<script src="mammoth.browser.min.js?bfaf513f"></script>
<script src="showdown.min.js?b4bef047"></script>
<script type="text/javascript" src="contentimport.js?5760833a"></script>
<script type="text/javascript">
utils.domReady(function () {
var options = {};
var callbacks = {};
contentImport.init(options, callbacks);
});
</script>
</body>
</html>

@ -0,0 +1,91 @@
var contentImport = {};
var g = $G;
contentImport.data = {
result: null,
};
contentImport.init = function (opt, callbacks) {
addUploadButtonListener();
addOkListener();
};
function processWord(file) {
$('.file-tip').html('正在转换Word文件,请稍后...');
$('.file-result').html('').hide();
var reader = new FileReader();
reader.onload = function (loadEvent) {
mammoth.convertToHtml({
arrayBuffer: loadEvent.target.result
})
.then(function displayResult(result) {
$('.file-tip').html('转换成功');
contentImport.data.result = result.value;
$('.file-result').html(result.value).show();
}, function (error) {
$('.file-tip').html('Word文件转换失败:' + error);
});
};
reader.onerror = function (loadEvent) {
$('.file-tip').html('Word文件转换失败:' + loadEvent);
};
reader.readAsArrayBuffer(file);
}
function processMarkdown( markdown ){
var converter = new showdown.Converter();
var html = converter.makeHtml(markdown);
$('.file-tip').html('转换成功');
contentImport.data.result = html;
$('.file-result').html(html).show();
}
function processMarkdownFile(file) {
$('.file-tip').html('正在转换Markdown文件,请稍后...');
$('.file-result').html('').hide();
var reader = new FileReader();
reader.onload = function (loadEvent) {
processMarkdown( loadEvent.target.result );
};
reader.onerror = function (loadEvent) {
$('.file-tip').html('Markdown文件转换失败:' + loadEvent);
};
reader.readAsText(file, "UTF-8");
}
function addUploadButtonListener() {
g('contentImport').addEventListener('change', function () {
const file = this.files[0];
const fileName = file.name;
const fileExt = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
switch (fileExt) {
case 'docx':
case 'doc':
processWord(file);
break;
case 'md':
processMarkdownFile(file);
break;
default:
$('.file-tip').html('不支持的文件格式:' + fileExt);
break;
}
});
g('fileInputConfirm').addEventListener('click', function () {
processMarkdown( g('fileInputContent').value );
$('.file-input').hide();
});
}
function addOkListener() {
dialog.onok = function () {
if (!contentImport.data.result) {
alert('请先上传文件识别内容');
return false;
}
editor.fireEvent('saveScene');
editor.execCommand("inserthtml", contentImport.data.result);
editor.fireEvent('saveScene');
};
dialog.oncancel = function () {
};
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,129 @@
.jd img {
background: transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top;
cursor: pointer;
width: 35px;
height: 35px;
display: block;
}
.pp img {
background: transparent url(images/fface.gif?v=1.1) no-repeat scroll left top;
cursor: pointer;
width: 25px;
height: 25px;
display: block;
}
.ldw img {
background: transparent url(images/wface.gif?v=1.1) no-repeat scroll left top;
cursor: pointer;
width: 35px;
height: 35px;
display: block;
}
.tsj img {
background: transparent url(images/tface.gif?v=1.1) no-repeat scroll left top;
cursor: pointer;
width: 35px;
height: 35px;
display: block;
}
.cat img {
background: transparent url(images/cface.gif?v=1.1) no-repeat scroll left top;
cursor: pointer;
width: 35px;
height: 35px;
display: block;
}
.bb img {
background: transparent url(images/bface.gif?v=1.1) no-repeat scroll left top;
cursor: pointer;
width: 35px;
height: 35px;
display: block;
}
.youa img {
background: transparent url(images/yface.gif?v=1.1) no-repeat scroll left top;
cursor: pointer;
width: 35px;
height: 35px;
display: block;
}
.smileytable td {
height: 37px;
}
#tabPanel {
margin-left: 5px;
overflow: hidden;
}
#tabContent {
float: left;
background: #FFFFFF;
}
#tabContent div {
display: none;
width: 480px;
overflow: hidden;
}
#tabIconReview.show {
left: 17px;
display: block;
}
.menuFocus {
background: #ACCD3C;
}
.menuDefault {
background: #FFFFFF;
}
#tabIconReview {
position: absolute;
left: 406px;
left: 398px \9;
top: 41px;
z-index: 65533;
width: 90px;
height: 76px;
}
img.review {
width: 90px;
height: 76px;
border: 2px solid #9cb945;
background: #FFFFFF;
background-position: center;
background-repeat: no-repeat;
}
.wrapper .tabbody {
position: relative;
float: left;
clear: both;
padding: 10px;
width: 95%;
}
.tabbody table {
width: 100%;
}
.tabbody td {
border: 1px solid #BAC498;
}
.tabbody td span {
display: block;
zoom: 1;
padding: 0 4px;
}

@ -0,0 +1,70 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="robots" content="noindex, nofollow"/>
<script type="text/javascript" src="../internal.js?aea0c61c"></script>
<link rel="stylesheet" type="text/css" href="emotion.css?d5b42328">
</head>
<body>
<div id="tabPanel" class="wrapper">
<div id="tabHeads" class="tabhead">
<span><var id="lang_input_choice"></var></span>
<span><var id="lang_input_Tuzki"></var></span>
<span><var id="lang_input_lvdouwa"></var></span>
<span><var id="lang_input_BOBO"></var></span>
<span><var id="lang_input_babyCat"></var></span>
<span><var id="lang_input_bubble"></var></span>
<span><var id="lang_input_youa"></var></span>
</div>
<div id="tabBodys" class="tabbody">
<div id="tab0"></div>
<div id="tab1"></div>
<div id="tab2"></div>
<div id="tab3"></div>
<div id="tab4"></div>
<div id="tab5"></div>
<div id="tab6"></div>
</div>
</div>
<div id="tabIconReview">
<img id='faceReview' class='review' src="../../themes/default/images/spacer.gif"/>
</div>
<script type="text/javascript" src="emotion.js?61027075"></script>
<script type="text/javascript">
var emotion = {
tabNum: 7, //切换面板数量
SmilmgName: {
tab0: ['j_00', 84],
tab1: ['t_00', 40],
tab2: ['w_00', 52],
tab3: ['B_00', 63],
tab4: ['C_00', 20],
tab5: ['i_f', 50],
tab6: ['y_00', 40]
}, //图片前缀名
imageFolders: {
tab0: 'jx2/',
tab1: 'tsj/',
tab2: 'ldw/',
tab3: 'bobo/',
tab4: 'babycat/',
tab5: 'face/',
tab6: 'youa/'
}, //图片对应文件夹路径
imageCss: {tab0: 'jd', tab1: 'tsj', tab2: 'ldw', tab3: 'bb', tab4: 'cat', tab5: 'pp', tab6: 'youa'}, //图片css类名
imageCssOffset: {tab0: 35, tab1: 35, tab2: 35, tab3: 35, tab4: 35, tab5: 25, tab6: 35}, //图片偏移
SmileyInfor: {
tab0: ['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '打酱油', '俯卧撑', '气愤', '?', '吻', '怒', '胜利', 'HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '微笑', '亲吻', '调皮', '惊恐', '耍酷', '发火', '害羞', '汗水', '大哭', '', '加油', '困', '你NB', '晕倒', '开心', '偷笑', '大哭', '滴汗', '叹气', '超赞', '??', '飞吻', '天使', '撒花', '生气', '被砸', '吓傻', '随意吐'],
tab1: ['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '摊手', '睡觉', '瘫坐', '无聊', '星星闪', '旋转', '也不行', '郁闷', '正Music', '抓墙', '撞墙至死', '歪头', '戳眼', '飘过', '互相拍砖', '砍死你', '扔桌子', '少林寺', '什么?', '转头', '我爱牛奶', '我踢', '摇晃', '晕厥', '在笼子里', '震荡'],
tab2: ['大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '我错了', 'money', '气愤', '挑逗', '吻', '怒', '胜利', '委屈', '受伤', '说啥呢?', '闭嘴', '不', '逗你玩儿', '飞吻', '眩晕', '魔法', '我来了', '睡了', '我打', '闭嘴', '打', '打晕了', '刷牙', '爆揍', '炸弹', '倒立', '刮胡子', '邪恶的笑', '不要不要', '爱恋中', '放大仔细看', '偷窥', '超高兴', '晕', '松口气', '我跑', '享受', '修养', '哭', '汗', '啊~', '热烈欢迎', '打酱油', '俯卧撑', '?'],
tab3: ['HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '泪眼', '流泪', '生气', '吐舌', '喜欢', '旋转', '再见', '抓狂', '汗', '鄙视', '拜', '吐血', '嘘', '打人', '蹦跳', '变脸', '扯肉', '吃To', '吃花', '吹泡泡糖', '大变身', '飞天舞', '回眸', '可怜', '猛抽', '泡泡', '苹果', '亲', '', '骚舞', '烧香', '睡', '套娃娃', '捅捅', '舞倒', '西红柿', '爱慕', '摇', '摇摆', '杂耍', '招财', '被殴', '被球闷', '大惊', '理想', '欧打', '呕吐', '碎', '吐痰'],
tab4: ['发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '顶', '幸运', '爱心', '躲', '送花', '选择'],
tab5: ['微笑', '亲吻', '调皮', '惊讶', '耍酷', '发火', '害羞', '汗水', '大哭', '得意', '鄙视', '困', '夸奖', '晕倒', '疑问', '媒婆', '狂吐', '青蛙', '发愁', '亲吻', '', '爱心', '心碎', '玫瑰', '礼物', '哭', '奸笑', '可爱', '得意', '呲牙', '暴汗', '楚楚可怜', '困', '哭', '生气', '惊讶', '口水', '彩虹', '夜空', '太阳', '钱钱', '灯泡', '咖啡', '蛋糕', '音乐', '爱', '胜利', '赞', '鄙视', 'OK'],
tab6: ['男兜', '女兜', '开心', '乖乖', '偷笑', '大笑', '抽泣', '大哭', '无奈', '滴汗', '叹气', '狂晕', '委屈', '超赞', '??', '疑问', '飞吻', '天使', '撒花', '生气', '被砸', '口水', '泪奔', '吓傻', '吐舌头', '点头', '随意吐', '旋转', '困困', '鄙视', '狂顶', '篮球', '再见', '欢迎光临', '恭喜发财', '稍等', '我在线', '恕不议价', '库房有货', '货在路上']
}
};
</script>
</body>
</html>

@ -0,0 +1,186 @@
window.onload = function () {
editor.setOpt({
emotionLocalization: false
});
emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "http://img.baidu.com/hi/";
emotion.SmileyBox = createTabList(emotion.tabNum);
emotion.tabExist = createArr(emotion.tabNum);
initImgName();
initEvtHandler("tabHeads");
};
function initImgName() {
for (var pro in emotion.SmilmgName) {
var tempName = emotion.SmilmgName[pro],
tempBox = emotion.SmileyBox[pro],
tempStr = "";
if (tempBox.length) return;
for (var i = 1; i <= tempName[1]; i++) {
tempStr = tempName[0];
if (i < 10) tempStr = tempStr + '0';
tempStr = tempStr + i + '.gif';
tempBox.push(tempStr);
}
}
}
function initEvtHandler(conId) {
var tabHeads = $G(conId);
for (var i = 0, j = 0; i < tabHeads.childNodes.length; i++) {
var tabObj = tabHeads.childNodes[i];
if (tabObj.nodeType == 1) {
domUtils.on(tabObj, "click", (function (index) {
return function () {
switchTab(index);
};
})(j));
j++;
}
}
switchTab(0);
$G("tabIconReview").style.display = 'none';
}
function InsertSmiley(url, evt) {
var obj = {
src: editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url
};
obj._src = obj.src;
editor.execCommand('insertimage', obj);
if (!evt.ctrlKey) {
dialog.popup.hide();
}
}
function switchTab(index) {
autoHeight(index);
if (emotion.tabExist[index] == 0) {
emotion.tabExist[index] = 1;
createTab('tab' + index);
}
//获取呈现元素句柄数组
var tabHeads = $G("tabHeads").getElementsByTagName("span"),
tabBodys = $G("tabBodys").getElementsByTagName("div"),
i = 0, L = tabHeads.length;
//隐藏所有呈现元素
for (; i < L; i++) {
tabHeads[i].className = "";
tabBodys[i].style.display = "none";
}
//显示对应呈现元素
tabHeads[index].className = "focus";
tabBodys[index].style.display = "block";
}
function autoHeight(index) {
var iframe = dialog.getDom("iframe"),
parent = iframe.parentNode.parentNode;
switch (index) {
case 0:
iframe.style.height = "380px";
parent.style.height = "392px";
break;
case 1:
iframe.style.height = "220px";
parent.style.height = "232px";
break;
case 2:
iframe.style.height = "260px";
parent.style.height = "272px";
break;
case 3:
iframe.style.height = "300px";
parent.style.height = "312px";
break;
case 4:
iframe.style.height = "140px";
parent.style.height = "152px";
break;
case 5:
iframe.style.height = "260px";
parent.style.height = "272px";
break;
case 6:
iframe.style.height = "230px";
parent.style.height = "242px";
break;
default:
}
}
function createTab(tabName) {
var faceVersion = "?v=1.1", //版本号
tab = $G(tabName), //获取将要生成的Div句柄
imagePath = emotion.SmileyPath + emotion.imageFolders[tabName], //获取显示表情和预览表情的路径
positionLine = 11 / 2, //中间数
iWidth = iHeight = 35, //图片长宽
iColWidth = 3, //表格剩余空间的显示比例
tableCss = emotion.imageCss[tabName],
cssOffset = emotion.imageCssOffset[tabName],
textHTML = ['<table class="smileytable">'],
i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage,
sUrl, realUrl, posflag, offset, infor;
for (; i < imgNum;) {
textHTML.push('<tr>');
for (var j = 0; j < imgColNum; j++, i++) {
faceImage = emotion.SmileyBox[tabName][i];
if (faceImage) {
sUrl = imagePath + faceImage + faceVersion;
realUrl = imagePath + faceImage;
posflag = j < positionLine ? 0 : 1;
offset = cssOffset * i * (-1) - 1;
infor = emotion.SmileyInfor[tabName][i];
textHTML.push('<td class="' + tableCss + '" border="1" width="' + iColWidth + '%" style="border-collapse:collapse;" align="center" bgcolor="transparent" onclick="InsertSmiley(\'' + realUrl.replace(/'/g, "\\'") + '\',event)" onmouseover="over(this,\'' + sUrl + '\',\'' + posflag + '\')" onmouseout="out(this)">');
textHTML.push('<span>');
textHTML.push('<img style="background-position:left ' + offset + 'px;" title="' + infor + '" src="' + emotion.SmileyPath + (editor.options.emotionLocalization ? '0.gif" width="' : 'default/0.gif" width="') + iWidth + '" height="' + iHeight + '"></img>');
textHTML.push('</span>');
} else {
textHTML.push('<td width="' + iColWidth + '%" bgcolor="#FFFFFF">');
}
textHTML.push('</td>');
}
textHTML.push('</tr>');
}
textHTML.push('</table>');
textHTML = textHTML.join("");
tab.innerHTML = textHTML;
}
function over(td, srcPath, posFlag) {
td.style.backgroundColor = "#ACCD3C";
$G('faceReview').style.backgroundImage = "url(" + srcPath + ")";
if (posFlag == 1) $G("tabIconReview").className = "show";
$G("tabIconReview").style.display = 'block';
}
function out(td) {
td.style.backgroundColor = "transparent";
var tabIconRevew = $G("tabIconReview");
tabIconRevew.className = "";
tabIconRevew.style.display = 'none';
}
function createTabList(tabNum) {
var obj = {};
for (var i = 0; i < tabNum; i++) {
obj["tab" + i] = [];
}
return obj;
}
function createArr(tabNum) {
var arr = [];
for (var i = 0; i < tabNum; i++) {
arr[i] = 0;
}
return arr;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

@ -0,0 +1,98 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script type="text/javascript" src="../internal.js?aea0c61c"></script>
<style type="text/css">
.wrapper {
box-sizing: border-box;
width: 800px;
height: 390px;
overflow: hidden;
position: relative;
border-bottom: 1px solid #d7d7d7
}
.editor-wrap {
display: flex;
margin: 10px;
}
.editor-wrap #editor {
width: 0;
flex-grow: 1;
border: 1px solid #CCC;
border-radius: 3px;
padding: 5px;
height: 100px;
outline: none;
}
.input-tip {
margin: 10px;
}
.input-tip a {
color: #0f0d0d;
}
.editor-preview {
background: #FFF;
border-radius: 3px;
border: 1px solid #EEE;
display: none;
margin: 10px;
}
.editor-preview .title {
padding: 5px;
}
.editor-preview .body {
padding: 5px 5px 15px 5px;
text-align: center;
}
.editor-preview .body .image {
max-width: 100%;
max-height: 100px;
}
</style>
</head>
<body>
<div class="wrapper">
<div id="modeLive" style="display:none;">
<iframe id="liveEditor"
frameborder="0"
style="width:800px;height:390px;border: 0;outline: none;"
></iframe>
</div>
<div id="modePlain" style="display:none;">
<div class="editor-wrap">
<textarea id="editor"></textarea>
</div>
<div class="input-tip">
基于 latex 语法,<a href="javascript:;" id="inputDemo">点击输入示例</a>
</div>
<div class="editor-preview" id="preview">
<div class="title">预览</div>
<div class="body">
<img class="image" id="previewImage"/>
</div>
</div>
</div>
</div>
<script src="../../third-party/jquery-1.10.2.js?628072e7"></script>
<script type="text/javascript" src="../../third-party/clipboard/clipboard.js?555edf0a"></script>
<script type="text/javascript" src="formula.js?8fdd0a42"></script>
<script type="text/javascript">
utils.domReady(function () {
Formula.init();
});
</script>
</body>
</html>

@ -0,0 +1,147 @@
function preg_quote(str, delimiter) {
// Quote regular expression characters plus an optional character
//
// version: 1107.2516
// discuss at: http://phpjs.org/functions/preg_quote
// + original by: booeyOH
// + improved by: Ates Goral (http://magnetiq.com)
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + bugfixed by: Onno Marsman
// + improved by: Brett Zamir (http://brett-zamir.me)
// * example 1: preg_quote("$40");
// * returns 1: '\$40'
// * example 2: preg_quote("*RRRING* Hello?");
// * returns 2: '\*RRRING\* Hello\?'
// * example 3: preg_quote("\\.+*?[^]$(){}=!<>|:");
// * returns 3: '\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:'
return (str + '').replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + (delimiter || '') + '-]', 'g'), '\\$&');
}
function loadScript(url, cb) {
var script;
script = document.createElement('script');
script.src = url;
script.onload = function () {
cb && cb({isNew: true})
};
document.getElementsByTagName('head')[0].appendChild(script);
}
var Formula = {
mode: 'plain',
latexeasy: null,
init: function () {
// console.log('Formula.init')
Formula.initMode();
Formula.initEvent();
Formula.initSubmit();
},
renderPlain: function () {
var $preview = $('#preview');
var value = $('#editor').val();
if (!value) {
$preview.hide();
return;
}
value = encodeURIComponent(value);
var formulaConfig = editor.getOpt('formulaConfig');
var src = formulaConfig.imageUrlTemplate.replace(/\{\}/, value);
$('#previewImage').attr('src', src);
$preview.show();
},
setValuePlain: function (value) {
$('#editor').val(value);
Formula.renderPlain();
},
setValueLive: function (value) {
if (!Formula.latexeasy) {
setTimeout(function () {
Formula.setValueLive(value);
}, 100);
return;
}
Formula.latexeasy.call('set.latex', {latex: value});
},
initMode: function () {
var formulaConfig = editor.getOpt('formulaConfig');
if ('live' === formulaConfig.editorMode) {
$('#liveEditor').attr('src', formulaConfig.editorLiveServer + '/editor');
$('#modeLive').show();
Formula.mode = 'live';
} else {
$('#modePlain').show();
Formula.mode = 'plain';
}
var img = editor.selection.getRange().getClosedNode();
if (img && img.getAttribute('data-formula-image') !== null) {
var value = img.getAttribute('data-formula-image');
if (value) {
Formula.setValue(decodeURIComponent(value));
}
}
},
setValue: function (value) {
switch (Formula.mode) {
case 'plain':
Formula.setValuePlain(value);
break;
case 'live':
Formula.setValueLive(value);
break;
}
},
getValue: function (cb) {
switch (Formula.mode) {
case 'plain':
cb($.trim($('#editor').val()));
break;
case 'live':
Formula.latexeasy.call('get.latex', {}, function (data) {
cb(data.latex);
});
break;
}
},
initEvent: function () {
var changeTimer = null, le;
switch (Formula.mode) {
case 'plain':
// console.log('Formula.initEvent');
$('#editor').on('change keypress', function () {
changeTimer && clearTimeout(changeTimer);
changeTimer = setTimeout(function () {
Formula.renderPlain();
}, 1000);
});
$('#inputDemo').on('click', function () {
$('#editor').val('f(a) = \\frac{1}{2\\pi i} \\oint\\frac{f(z)}{z-a}dz');
Formula.renderPlain();
});
break;
case 'live':
var formulaConfig = editor.getOpt('formulaConfig');
loadScript(formulaConfig.editorLiveServer + '/vendor/LatexEasyEditor/editor/sdk.js', function () {
le = new window.LatexEasy(document.getElementById('liveEditor'));
le.on('ready', function () {
Formula.latexeasy = le;
});
le.init();
});
break;
}
},
initSubmit: function () {
dialog.onclose = function (t, ok) {
if (!ok) {
return true;
}
// console.log('onclose', t, ok);
Formula.getValue(function (value) {
editor.execCommand('formula', value);
editor.fireEvent('saveScene');
dialog.close(false);
});
return false;
};
}
};

@ -0,0 +1,37 @@
.wrapper {
width: 370px;
margin: 10px auto;
zoom: 1;
}
.tabbody {
height: 360px;
}
.tabbody .panel {
width: 100%;
height: 360px;
position: absolute;
background: #fff;
}
.tabbody .panel h1 {
font-size: 26px;
margin: 5px 0 0 5px;
}
.tabbody .panel p {
font-size: 12px;
margin: 5px 0 0 5px;
}
.tabbody table {
width: 90%;
line-height: 20px;
margin: 5px 0 0 5px;;
}
.tabbody table thead {
font-weight: bold;
line-height: 25px;
}

@ -0,0 +1,82 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>帮助</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<script type="text/javascript" src="../internal.js?aea0c61c"></script>
<link rel="stylesheet" type="text/css" href="help.css?81231bdb">
</head>
<body>
<div class="wrapper" id="helptab">
<div id="tabHeads" class="tabhead">
<span class="focus" tabsrc="about"><var id="lang_input_about"></var></span>
<span tabsrc="shortcuts"><var id="lang_input_shortcuts"></var></span>
</div>
<div id="tabBodys" class="tabbody">
<div id="about" class="panel">
<h1>UEditor Plus</h1>
<p id="version"></p>
<p><var id="lang_input_introduction"></var></p>
</div>
<div id="shortcuts" class="panel">
<table>
<thead>
<tr>
<td><var id="lang_Txt_shortcuts"></var></td>
<td><var id="lang_Txt_func"></var></td>
</tr>
</thead>
<tbody>
<tr>
<td>ctrl+b</td>
<td><var id="lang_Txt_bold"></var></td>
</tr>
<tr>
<td>ctrl+c</td>
<td><var id="lang_Txt_copy"></var></td>
</tr>
<tr>
<td>ctrl+x</td>
<td><var id="lang_Txt_cut"></var></td>
</tr>
<tr>
<td>ctrl+v</td>
<td><var id="lang_Txt_Paste"></var></td>
</tr>
<tr>
<td>ctrl+y</td>
<td><var id="lang_Txt_undo"></var></td>
</tr>
<tr>
<td>ctrl+z</td>
<td><var id="lang_Txt_redo"></var></td>
</tr>
<tr>
<td>ctrl+i</td>
<td><var id="lang_Txt_italic"></var></td>
</tr>
<tr>
<td>ctrl+u</td>
<td><var id="lang_Txt_underline"></var></td>
</tr>
<tr>
<td>ctrl+a</td>
<td><var id="lang_Txt_selectAll"></var></td>
</tr>
<tr>
<td>shift+enter</td>
<td><var id="lang_Txt_visualEnter"></var></td>
</tr>
<tr>
<td>alt+z</td>
<td><var id="lang_Txt_fullscreen"></var></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<script type="text/javascript" src="help.js?0a6823d2"></script>
</body>
</html>

@ -0,0 +1,57 @@
/**
* Created with JetBrains PhpStorm.
* User: xuheng
* Date: 12-9-26
* Time: 下午1:06
* To change this template use File | Settings | File Templates.
*/
/**
* tab点击处理事件
* @param tabHeads
* @param tabBodys
* @param obj
*/
function clickHandler(tabHeads, tabBodys, obj) {
//head样式更改
for (var k = 0, len = tabHeads.length; k < len; k++) {
tabHeads[k].className = "";
}
obj.className = "focus";
//body显隐
var tabSrc = obj.getAttribute("tabSrc");
for (var j = 0, length = tabBodys.length; j < length; j++) {
var body = tabBodys[j],
id = body.getAttribute("id");
body.onclick = function () {
this.style.zoom = 1;
};
if (id != tabSrc) {
body.style.zIndex = 1;
} else {
body.style.zIndex = 200;
}
}
}
/**
* TAB切换
* @param tabParentId tab的父节点ID或者对象本身
*/
function switchTab(tabParentId) {
var tabElements = $G(tabParentId).children,
tabHeads = tabElements[0].children,
tabBodys = tabElements[1].children;
for (var i = 0, length = tabHeads.length; i < length; i++) {
var head = tabHeads[i];
if (head.className === "focus") clickHandler(tabHeads, tabBodys, head);
head.onclick = function () {
clickHandler(tabHeads, tabBodys, this);
}
}
}
switchTab("helptab");
document.getElementById('version').innerHTML = parent.UE.version;

@ -0,0 +1,752 @@
@charset "utf-8";
/* dialog样式 */
.wrapper {
zoom: 1;
width: 630px;
*width: 626px;
height: 380px;
margin: 0 auto;
padding: 10px;
position: relative;
font-family: sans-serif;
}
/*tab样式框大小*/
.tabhead {
float: left;
}
.tabbody {
width: 100%;
height: 346px;
position: relative;
clear: both;
}
.tabbody .panel {
position: absolute;
width: 0;
height: 0;
background: #fff;
overflow: hidden;
display: none;
}
.tabbody .panel.focus {
width: 100%;
height: 346px;
display: block;
}
/* 图片对齐方式 */
.alignBar {
float: right;
margin-top: 5px;
position: relative;
}
.alignBar .algnLabel {
float: left;
height: 20px;
line-height: 20px;
}
.alignBar #alignIcon {
zoom: 1;
_display: inline;
display: inline-block;
position: relative;
}
.alignBar #alignIcon span {
float: left;
cursor: pointer;
display: block;
width: 19px;
height: 17px;
margin-right: 3px;
margin-left: 3px;
background-image: url(./images/alignicon.jpg);
}
.alignBar #alignIcon .none-align {
background-position: 0 -18px;
}
.alignBar #alignIcon .left-align {
background-position: -20px -18px;
}
.alignBar #alignIcon .right-align {
background-position: -40px -18px;
}
.alignBar #alignIcon .center-align {
background-position: -60px -18px;
}
.alignBar #alignIcon .none-align.focus {
background-position: 0 0;
}
.alignBar #alignIcon .left-align.focus {
background-position: -20px 0;
}
.alignBar #alignIcon .right-align.focus {
background-position: -40px 0;
}
.alignBar #alignIcon .center-align.focus {
background-position: -60px 0;
}
/* 远程图片样式 */
#remote {
z-index: 200;
}
#remote .top {
width: 100%;
margin-top: 25px;
}
#remote .left {
display: block;
float: left;
width: 300px;
height: 10px;
}
#remote .right {
display: block;
float: right;
width: 300px;
height: 10px;
}
#remote .row {
margin-left: 20px;
clear: both;
height: 40px;
}
#remote .row label {
text-align: center;
width: 50px;
zoom: 1;
_display: inline;
display: inline-block;
vertical-align: middle;
}
#remote .row label.algnLabel {
float: left;
}
#remote input.text {
width: 150px;
padding: 3px 6px;
font-size: 14px;
line-height: 1.42857143;
color: #555;
background-color: #fff;
background-image: none;
border: 1px solid #ccc;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
}
#remote input.text:focus {
outline: 0;
}
#remote #url {
width: 400px;
margin-bottom: 2px;
}
#remote #imageSelect {
width: 100px;
display: inline-block;
background: #FFF;
border: 1px solid #EEE;
line-height: 26px;
text-align: center;
color: #333;
text-decoration: none;
border-radius: 3px;
vertical-align: top;
}
#remote #width,
#remote #height {
width: 30px;
margin-left: 2px;
margin-right: 2px;
text-align: center;
}
#remote #border,
#remote #vhSpace,
#remote #title {
width: 180px;
margin-right: 5px;
}
#remote #lock {
display: inline-block;
vertical-align: middle;
}
#remote #lockicon {
zoom: 1;
_display: inline;
display: inline-block;
width: 20px;
height: 20px;
background: url("../../themes/default/images/lock.gif") -13px -13px no-repeat;
vertical-align: middle;
}
#remote #preview {
clear: both;
width: 260px;
height: 240px;
z-index: 9999;
margin-top: 10px;
background-color: #eee;
overflow: hidden;
}
/* 上传图片 */
.tabbody #upload.panel {
width: 0;
height: 0;
overflow: hidden;
position: absolute !important;
clip: rect(1px, 1px, 1px, 1px);
background: #fff;
display: block;
}
.tabbody #upload.panel.focus {
width: 100%;
height: 346px;
display: block;
clip: auto;
}
#upload .queueList {
margin: 0;
width: 100%;
height: 100%;
position: absolute;
overflow: hidden;
}
#upload p {
margin: 0;
}
.element-invisible {
width: 0 !important;
height: 0 !important;
border: 0;
padding: 0;
margin: 0;
overflow: hidden;
position: absolute !important;
clip: rect(1px, 1px, 1px, 1px);
}
#upload .placeholder {
margin: 10px;
border: 2px dashed #e6e6e6;
*border: 0px dashed #e6e6e6;
height: 172px;
padding-top: 150px;
text-align: center;
background: url(./images/image.png) center 70px no-repeat;
color: #cccccc;
font-size: 18px;
position: relative;
top: 0;
*top: 10px;
}
#upload .placeholder .webuploader-pick {
font-size: 18px;
background: #00b7ee;
border-radius: 3px;
line-height: 44px;
padding: 0 30px;
*width: 120px;
color: #fff;
display: inline-block;
margin: 0 auto 20px auto;
cursor: pointer;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
}
#upload .placeholder .webuploader-pick-hover {
background: #00a2d4;
}
#filePickerContainer {
text-align: center;
}
#upload .placeholder .flashTip {
color: #666666;
font-size: 12px;
position: absolute;
width: 100%;
text-align: center;
bottom: 20px;
}
#upload .placeholder .flashTip a {
color: #0785d1;
text-decoration: none;
}
#upload .placeholder .flashTip a:hover {
text-decoration: underline;
}
#upload .placeholder.webuploader-dnd-over {
border-color: #999999;
}
#upload .filelist {
list-style: none;
margin: 0;
padding: 0;
overflow-x: hidden;
overflow-y: auto;
position: relative;
height: 300px;
}
#upload .filelist:after {
content: '';
display: block;
width: 0;
height: 0;
overflow: hidden;
clear: both;
position: relative;
}
#upload .filelist li {
width: 113px;
height: 113px;
background: url(./images/bg.png);
text-align: center;
margin: 9px 0 0 9px;
*margin: 6px 0 0 6px;
position: relative;
display: block;
float: left;
overflow: hidden;
font-size: 12px;
}
#upload .filelist li p.log {
position: relative;
top: -45px;
}
#upload .filelist li p.title {
position: absolute;
top: 0;
left: 0;
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
top: 5px;
text-indent: 5px;
text-align: left;
}
#upload .filelist li p.progress {
position: absolute;
width: 100%;
bottom: 0;
left: 0;
height: 8px;
overflow: hidden;
z-index: 50;
margin: 0;
border-radius: 0;
background: none;
-webkit-box-shadow: 0 0 0;
}
#upload .filelist li p.progress span {
display: none;
overflow: hidden;
width: 0;
height: 100%;
background: #1483d8 url(./images/progress.png) repeat-x;
-webit-transition: width 200ms linear;
-moz-transition: width 200ms linear;
-o-transition: width 200ms linear;
-ms-transition: width 200ms linear;
transition: width 200ms linear;
-webkit-animation: progressmove 2s linear infinite;
-moz-animation: progressmove 2s linear infinite;
-o-animation: progressmove 2s linear infinite;
-ms-animation: progressmove 2s linear infinite;
animation: progressmove 2s linear infinite;
-webkit-transform: translateZ(0);
}
@-webkit-keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
@-moz-keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
@keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
#upload .filelist li p.imgWrap {
position: relative;
z-index: 2;
line-height: 113px;
vertical-align: middle;
overflow: hidden;
width: 113px;
height: 113px;
-webkit-transform-origin: 50% 50%;
-moz-transform-origin: 50% 50%;
-o-transform-origin: 50% 50%;
-ms-transform-origin: 50% 50%;
transform-origin: 50% 50%;
-webit-transition: 200ms ease-out;
-moz-transition: 200ms ease-out;
-o-transition: 200ms ease-out;
-ms-transition: 200ms ease-out;
transition: 200ms ease-out;
}
#upload .filelist li img {
width: 100%;
}
#upload .filelist li p.error {
background: #f43838;
color: #fff;
position: absolute;
bottom: 0;
left: 0;
height: 28px;
line-height: 28px;
width: 100%;
z-index: 100;
display: none;
}
#upload .filelist li .success {
display: block;
position: absolute;
left: 0;
bottom: 0;
height: 40px;
width: 100%;
z-index: 200;
background: url(./images/success.png) no-repeat right bottom;
background: url(./images/success.gif) no-repeat right bottom \9;
}
#upload .filelist li.filePickerBlock {
width: 113px;
height: 113px;
background: url(./images/image.png) no-repeat center 12px;
border: 1px solid #eeeeee;
border-radius: 0;
}
#upload .filelist li.filePickerBlock div.webuploader-pick {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
opacity: 0;
background: none;
font-size: 0;
}
#upload .filelist div.file-panel {
position: absolute;
height: 0;
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0;
background: rgba(0, 0, 0, 0.5);
width: 100%;
top: 0;
left: 0;
overflow: hidden;
z-index: 300;
}
#upload .filelist div.file-panel span {
width: 24px;
height: 24px;
display: inline;
float: right;
text-indent: -9999px;
overflow: hidden;
background: url(./images/icons.png) no-repeat;
background: url(./images/icons.gif) no-repeat \9;
margin: 5px 1px 1px;
cursor: pointer;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#upload .filelist div.file-panel span.rotateLeft {
display: none;
background-position: 0 -24px;
}
#upload .filelist div.file-panel span.rotateLeft:hover {
background-position: 0 0;
}
#upload .filelist div.file-panel span.rotateRight {
display: none;
background-position: -24px -24px;
}
#upload .filelist div.file-panel span.rotateRight:hover {
background-position: -24px 0;
}
#upload .filelist div.file-panel span.cancel {
background-position: -48px -24px;
}
#upload .filelist div.file-panel span.cancel:hover {
background-position: -48px 0;
}
#upload .statusBar {
height: 45px;
border-bottom: 1px solid #dadada;
margin: 0 10px;
padding: 0;
line-height: 45px;
vertical-align: middle;
position: relative;
}
#upload .statusBar .progress {
border: 1px solid #1483d8;
width: 198px;
background: #fff;
height: 18px;
position: absolute;
top: 12px;
display: none;
text-align: center;
line-height: 18px;
color: #6dbfff;
margin: 0 10px 0 0;
}
#upload .statusBar .progress span.percentage {
width: 0;
height: 100%;
left: 0;
top: 0;
background: #1483d8;
position: absolute;
}
#upload .statusBar .progress span.text {
position: relative;
z-index: 10;
}
#upload .statusBar .info {
display: inline-block;
font-size: 14px;
color: #666666;
}
#upload .statusBar .btns {
position: absolute;
top: 7px;
right: 0;
line-height: 30px;
}
#filePickerBtn {
display: inline-block;
float: left;
}
#upload .statusBar .btns .webuploader-pick,
#upload .statusBar .btns .uploadBtn,
#upload .statusBar .btns .uploadBtn.state-uploading,
#upload .statusBar .btns .uploadBtn.state-paused {
background: #ffffff;
border: 1px solid #cfcfcf;
color: #565656;
padding: 0 18px;
display: inline-block;
border-radius: 3px;
margin-left: 10px;
cursor: pointer;
font-size: 14px;
float: left;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#upload .statusBar .btns .webuploader-pick-hover,
#upload .statusBar .btns .uploadBtn:hover,
#upload .statusBar .btns .uploadBtn.state-uploading:hover,
#upload .statusBar .btns .uploadBtn.state-paused:hover {
background: #f0f0f0;
}
#upload .statusBar .btns .uploadBtn,
#upload .statusBar .btns .uploadBtn.state-paused {
background: #00b7ee;
color: #fff;
border-color: transparent;
}
#upload .statusBar .btns .uploadBtn:hover,
#upload .statusBar .btns .uploadBtn.state-paused:hover {
background: #00a2d4;
}
#upload .statusBar .btns .uploadBtn.disabled {
pointer-events: none;
filter: alpha(opacity=60);
-moz-opacity: 0.6;
-khtml-opacity: 0.6;
opacity: 0.6;
}
/* 图片管理样式 */
#online {
width: 100%;
height: 336px;
padding: 10px 0 0 0;
}
#online #imageList {
width: 100%;
height: 100%;
overflow-x: hidden;
overflow-y: auto;
position: relative;
}
#online ul {
display: block;
list-style: none;
margin: 0;
padding: 0;
}
#online li {
float: left;
display: block;
list-style: none;
padding: 0;
width: 113px;
height: 113px;
margin: 0 0 9px 9px;
*margin: 0 0 6px 6px;
background-color: #eee;
overflow: hidden;
cursor: pointer;
position: relative;
}
#online li.clearFloat {
float: none;
clear: both;
display: block;
width: 0;
height: 0;
margin: 0;
padding: 0;
}
#online li img {
cursor: pointer;
}
#online li .icon {
cursor: pointer;
width: 113px;
height: 113px;
position: absolute;
top: 0;
left: 0;
z-index: 2;
border: 0;
background-repeat: no-repeat;
}
#online li .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
}
#online li.selected .icon {
background-image: url(images/success.png);
background-image: url(images/success.gif) \9;
background-position: 75px 75px;
}
#online li.selected .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
background-position: 72px 72px;
}

@ -0,0 +1,125 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>ueditor图片对话框</title>
<script type="text/javascript" src="../internal.js?aea0c61c"></script>
<!-- jquery -->
<script type="text/javascript" src="../../third-party/jquery-1.10.2.js?628072e7"></script>
<!-- webuploader -->
<script src="../../third-party/webuploader/webuploader.js?e4f02d82"></script>
<link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css?0057c5c7">
<!-- image dialog -->
<link rel="stylesheet" href="image.css?fc461d7b" type="text/css"/>
</head>
<body>
<div class="wrapper">
<div id="tabhead" class="tabhead">
<span class="tab focus" data-content-id="remote"><var id="lang_tab_remote"></var></span>
<span style="display:none;" class="tab" data-content-id="upload"><var id="lang_tab_upload"></var></span>
<span style="display:none;" class="tab" data-content-id="online"><var id="lang_tab_online"></var></span>
</div>
<div class="alignBar">
<label class="algnLabel"><var id="lang_input_align"></var></label>
<span id="alignIcon">
<span id="noneAlign" class="none-align focus" data-align="none"></span>
<span id="leftAlign" class="left-align" data-align="left"></span>
<span id="rightAlign" class="right-align" data-align="right"></span>
<span id="centerAlign" class="center-align" data-align="center"></span>
</span>
<input id="align" name="align" type="hidden" value="none"/>
</div>
<div id="tabbody" class="tabbody">
<!-- 远程图片 -->
<div id="remote" class="panel">
<div class="top">
<div class="row">
<label for="url"><var id="lang_input_url"></var></label>
<span><input class="text" id="url" type="text"/></span>
<a href="javascript:;" id="imageSelect" style="display:none;">选择图片</a>
</div>
</div>
<div class="left">
<div class="row">
<label><var id="lang_input_size"></var></label>
<span><var id="lang_input_width">&nbsp;&nbsp;</var><input class="text" type="text"
id="width"/>px </span>
<span><var id="lang_input_height">&nbsp;&nbsp;</var><input class="text" type="text" id="height"/>px </span>
<span><input id="lock" type="checkbox" disabled="disabled"><span id="lockicon"></span></span>
</div>
<div class="row">
<label><var id="lang_input_border"></var></label>
<span><input class="text" type="text" id="border"/>px </span>
</div>
<div class="row">
<label><var id="lang_input_vhspace"></var></label>
<span><input class="text" type="text" id="vhSpace"/>px </span>
</div>
<div class="row">
<label><var id="lang_input_title"></var></label>
<span><input class="text" type="text" id="title"/></span>
</div>
</div>
<div class="right">
<div id="preview"></div>
</div>
</div>
<!-- 上传图片 -->
<div id="upload" class="panel focus">
<div id="queueList" class="queueList">
<div class="statusBar element-invisible">
<div class="progress">
<span class="text">0%</span>
<span class="percentage"></span>
</div>
<div class="info"></div>
<div class="btns">
<div id="filePickerBtn"></div>
<div class="uploadBtn"><var id="lang_start_upload"></var></div>
</div>
</div>
<div id="dndArea" class="placeholder">
<div class="filePickerContainer">
<div id="filePickerReady"></div>
</div>
</div>
<ul class="filelist element-invisible">
<li id="filePickerBlock" class="filePickerBlock"></li>
</ul>
</div>
</div>
<!-- 在线图片 -->
<div id="online" class="panel">
<div id="imageList"><var id="lang_imgLoading"></var></div>
</div>
<!-- 搜索图片 -->
<div id="search" class="panel">
<div class="searchBar">
<input id="searchTxt" class="searchTxt text" type="text"/>
<select id="searchType" class="searchType">
<option value="&s=4&z=0"></option>
<option value="&s=1&z=19"></option>
<option value="&s=2&z=0"></option>
<option value="&s=3&z=0"></option>
</select>
<input id="searchReset" type="button"/>
<input id="searchBtn" type="button"/>
</div>
<div id="searchList" class="searchList">
<ul id="searchListUl"></ul>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="image.js?41835e90"></script>
</body>
</html>

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 453 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -0,0 +1,135 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<script type="text/javascript" src="../internal.js?aea0c61c"></script>
<link rel="stylesheet" href="../../themes/default/dialog.css?963f161c">
<style type="text/css">
.warp {
width: 320px;
height: 200px;
margin-left: 5px;
padding: 20px 0 0 15px;
position: relative;
}
#url {
width: 290px;
margin-bottom: 2px;
margin-left: -6px;
margin-left: -2px \9;
*margin-left: 0;
_margin-left: 0;
}
.format span {
display: inline-block;
width: 58px;
text-align: left;
zoom: 1;
}
table td {
padding: 5px 0;
}
#align {
width: 65px;
height: 23px;
line-height: 22px;
}
</style>
</head>
<body>
<div class="warp">
<table width="300" cellpadding="0" cellspacing="0">
<tr>
<td colspan="2" class="format">
<span><var id="lang_input_address"></var></span>
<input style="width:200px" id="url" type="text" value=""/>
</td>
</tr>
<tr>
<td colspan="2" class="format"><span><var id="lang_input_width"></var></span><input style="width:200px"
type="text" id="width"/>
px
</td>
</tr>
<tr>
<td colspan="2" class="format"><span><var id="lang_input_height"></var></span><input style="width:200px"
type="text"
id="height"/> px
</td>
</tr>
<tr>
<td><span><var id="lang_input_isScroll"></var></span><input type="checkbox" id="scroll"/></td>
<td><span><var id="lang_input_frameborder"></var></span><input type="checkbox" id="frameborder"/></td>
</tr>
<tr>
<td colspan="2"><span><var id="lang_input_alignMode"></var></span>
<select id="align">
<option value=""></option>
<option value="left"></option>
<option value="right"></option>
</select>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
var iframe = editor._iframe;
if (iframe) {
$G("url").value = iframe.getAttribute("src") || "";
$G("width").value = iframe.getAttribute("width") || iframe.style.width.replace("px", "") || "";
$G("height").value = iframe.getAttribute("height") || iframe.style.height.replace("px", "") || "";
$G("scroll").checked = (iframe.getAttribute("scrolling") == "yes") ? true : false;
$G("frameborder").checked = (iframe.getAttribute("frameborder") == "1") ? true : false;
$G("align").value = iframe.align ? iframe.align : "";
}
function queding() {
var url = $G("url").value.replace(/^\s*|\s*$/ig, ""),
width = $G("width").value,
height = $G("height").value,
scroll = $G("scroll"),
frameborder = $G("frameborder"),
float = $G("align").value,
newIframe = editor.document.createElement("iframe"),
div;
if (!url) {
alert(lang.enterAddress);
return false;
}
newIframe.setAttribute("src", /http:\/\/|https:\/\//ig.test(url) ? url : "http://" + url);
/^[1-9]+[.]?\d*$/g.test(width) ? newIframe.setAttribute("width", width) : "";
/^[1-9]+[.]?\d*$/g.test(height) ? newIframe.setAttribute("height", height) : "";
scroll.checked ? newIframe.setAttribute("scrolling", "yes") : newIframe.setAttribute("scrolling", "no");
frameborder.checked ? newIframe.setAttribute("frameborder", "1", 0) : newIframe.setAttribute("frameborder", "0", 0);
float ? newIframe.setAttribute("align", float) : newIframe.setAttribute("align", "");
if (iframe) {
iframe.parentNode.insertBefore(newIframe, iframe);
domUtils.remove(iframe);
} else {
div = editor.document.createElement("div");
div.appendChild(newIframe);
editor.execCommand("inserthtml", div.innerHTML);
}
editor._iframe = null;
dialog.close();
}
dialog.onok = queding;
$G("url").onkeydown = function (evt) {
evt = evt || event;
if (evt.keyCode == 13) {
queding();
}
};
$focus($G("url"));
</script>
</body>
</html>

@ -0,0 +1,81 @@
(function () {
var parent = window.parent;
//dialog对象
dialog = parent.$EDITORUI[window.frameElement.id.replace(/_iframe$/, '')];
//当前打开dialog的编辑器实例
editor = dialog.editor;
UE = parent.UE;
domUtils = UE.dom.domUtils;
utils = UE.utils;
browser = UE.browser;
ajax = UE.ajax;
$G = function (id) {
return document.getElementById(id)
};
//focus元素
$focus = function (node) {
setTimeout(function () {
if (browser.ie) {
var r = node.createTextRange();
r.collapse(false);
r.select();
} else {
node.focus()
}
}, 0)
};
utils.loadFile(document, {
href: editor.options.themePath + editor.options.theme + "/dialogbase.css?cache=" + Math.random(),
tag: "link",
type: "text/css",
rel: "stylesheet"
});
lang = editor.getLang(dialog.className.split("-")[2]);
if (lang) {
domUtils.on(window, 'load', function () {
var langImgPath = editor.options.langPath + editor.options.lang + "/images/";
//针对静态资源
for (var i in lang["static"]) {
var dom = $G(i);
if (!dom) continue;
var tagName = dom.tagName,
content = lang["static"][i];
if (content.src) {
//clone
content = utils.extend({}, content, false);
content.src = langImgPath + content.src;
}
if (content.style) {
content = utils.extend({}, content, false);
content.style = content.style.replace(/url\s*\(/g, "url(" + langImgPath)
}
switch (tagName.toLowerCase()) {
case "var":
dom.parentNode.replaceChild(document.createTextNode(content), dom);
break;
case "select":
var ops = dom.options;
for (var j = 0, oj; oj = ops[j];) {
oj.innerHTML = content.options[j++];
}
for (var p in content) {
p != "options" && dom.setAttribute(p, content[p]);
}
break;
default :
domUtils.setAttributes(dom, content);
}
}
});
}
})();

@ -0,0 +1,155 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script type="text/javascript" src="../internal.js?aea0c61c"></script>
<style type="text/css">
* {
margin: 0;
padding: 0;
color: #838383;
}
table {
font-size: 12px;
margin: 10px;
line-height: 36px;
width: 100%;
}
.txt {
box-sizing: border-box;
width: 90%;
height: 30px;
line-height: 30px;
border: 1px solid #d7d7d7;
border-radius: 3px;
padding: 0 5px;
outline: none;
}
</style>
</head>
<body>
<div style="padding:10px;">
<table>
<tr>
<td><label for="text"> <var id="lang_input_text"></var></label></td>
<td><input class="txt" id="text" type="text" disabled="true"/></td>
</tr>
<tr>
<td><label for="href"> <var id="lang_input_url"></var></label></td>
<td><input class="txt" id="href" type="text"/></td>
</tr>
<tr>
<td><label for="title"> <var id="lang_input_title"></var></label></td>
<td><input class="txt" id="title" type="text"/></td>
</tr>
<tr>
<td colspan="2">
<label for="target"><var id="lang_input_target"></var></label>
<input id="target" type="checkbox"/>
</td>
</tr>
<tr>
<td colspan="2" id="msg"></td>
</tr>
</table>
</div>
<script type="text/javascript">
editor.setOpt('allowLinkProtocols', ['http:', 'https:', '#', '/', 'ftp:', 'mailto:', 'tel:']);
var allowLinkProtocols = editor.getOpt('allowLinkProtocols');
var range = editor.selection.getRange(),
link = range.collapsed ? editor.queryCommandValue("link") : editor.selection.getStart(),
url,
text = $G('text'),
rangeLink = domUtils.findParentByTagName(range.getCommonAncestor(), 'a', true),
orgText;
link = domUtils.findParentByTagName(link, "a", true);
if (link) {
url = utils.html(link.getAttribute('_href') || link.getAttribute('href', 2));
if (rangeLink === link && !link.getElementsByTagName('img').length) {
text.removeAttribute('disabled');
orgText = text.value = link[browser.ie ? 'innerText' : 'textContent'];
} else {
text.setAttribute('disabled', 'true');
text.value = lang.validLink;
}
} else {
if (range.collapsed) {
text.removeAttribute('disabled');
text.value = '';
} else {
text.setAttribute('disabled', 'true');
text.value = lang.validLink;
}
}
$G("title").value = url ? link.title : "";
$G("href").value = url ? url : '';
$G("target").checked = url && link.target == "_blank" ? true : false;
$focus($G("href"));
function handleDialogOk() {
var href = $G('href').value.replace(/^\s+|\s+$/g, '');
if (href) {
if (!hrefStartWith(href, allowLinkProtocols)) {
href = "http://" + href;
}
var obj = {
'href': href,
'target': $G("target").checked ? "_blank" : '_self',
'title': $G("title").value.replace(/^\s+|\s+$/g, ''),
'_href': href
};
//修改链接内容的情况太特殊了,所以先做到这里了
//todo:情况多的时候,做到command里
if (orgText && text.value != orgText) {
link[browser.ie ? 'innerText' : 'textContent'] = obj.textValue = text.value;
range.selectNode(link).select()
}
if (range.collapsed) {
obj.textValue = text.value;
}
editor.execCommand('link', utils.clearEmptyAttrs(obj));
dialog.close();
}
}
dialog.onok = handleDialogOk;
$G('href').onkeydown = $G('title').onkeydown = function (evt) {
evt = evt || window.event;
if (evt.keyCode == 13) {
handleDialogOk();
return false;
}
};
$G('href').onblur = function () {
if (!hrefStartWith(this.value, allowLinkProtocols)) {
$G("msg").innerHTML = "<span style='color: red'>" + lang.httpPrompt + "</span>";
} else {
$G("msg").innerHTML = "";
}
};
function hrefStartWith(href, arr) {
href = href.replace(/^\s+|\s+$/g, '');
for (var i = 0, ai; ai = arr[i++];) {
if (href.indexOf(ai) == 0) {
return true;
}
}
return false;
}
</script>
</body>
</html>

@ -0,0 +1,45 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style>
html, body {
height: 100%;
width: 100%;
padding: 0;
margin: 0;
}
#preview {
width: 100%;
height: 100%;
padding: 0;
margin: 0;
}
#preview * {
font-family: sans-serif;
font-size: 16px;
}
</style>
<script type="text/javascript" src="../internal.js?aea0c61c"></script>
<script src="../../ueditor.parse.js?8e3d12c6"></script>
<title></title>
</head>
<body class="view">
<div id="preview" style="margin:8px">
</div>
</body>
<script>
document.getElementById('preview').innerHTML = editor.getContent();
uParse('#preview', {
rootPath: '../../',
chartContainerHeight: 500
})
dialog.oncancel = function () {
document.getElementById('preview').innerHTML = '';
}
</script>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 628 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 608 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 516 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 657 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 536 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 775 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 511 B

@ -0,0 +1,324 @@
/*common
*/
body {
margin: 0;
}
table {
width: 100%;
}
table td {
padding: 2px 4px;
vertical-align: middle;
}
a {
text-decoration: none;
}
em {
font-style: normal;
}
.border_style1 {
border: 1px solid #ccc;
border-radius: 5px;
box-shadow: 2px 2px 5px #d3d6da;
}
/*module
*/
.main {
margin: 8px;
overflow: hidden;
}
.hot {
float: left;
height: 335px;
}
.drawBoard {
position: relative;
cursor: crosshair;
}
.brushBorad {
position: absolute;
left: 0;
top: 0;
z-index: 998;
}
.picBoard {
border: none;
text-align: center;
line-height: 300px;
cursor: default;
}
.operateBar {
margin-top: 10px;
font-size: 12px;
text-align: center;
}
.operateBar span {
margin-left: 10px;
}
.drawToolbar {
float: right;
width: 110px;
height: 300px;
overflow: hidden;
}
.colorBar {
margin-top: 10px;
font-size: 12px;
text-align: center;
}
.colorBar a {
display: block;
width: 10px;
height: 10px;
border: 1px solid #1006F1;
border-radius: 3px;
box-shadow: 2px 2px 5px #d3d6da;
opacity: 0.3
}
.sectionBar {
margin-top: 15px;
font-size: 12px;
text-align: center;
}
.sectionBar a {
display: inline-block;
width: 10px;
height: 12px;
color: #888;
text-indent: -999px;
opacity: 0.3
}
.size1 {
background: url('images/size.png') 1px center no-repeat;
}
.size2 {
background: url('images/size.png') -10px center no-repeat;
}
.size3 {
background: url('images/size.png') -22px center no-repeat;
}
.size4 {
background: url('images/size.png') -35px center no-repeat;
}
.addImgH {
position: relative;
}
.addImgH_form {
position: absolute;
left: 18px;
top: -1px;
width: 75px;
height: 21px;
opacity: 0;
cursor: pointer;
}
.addImgH_form input {
width: 100%;
}
/*scrawl遮罩层
*/
.maskLayerNull {
display: none;
}
.maskLayer {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0.7;
background-color: #fff;
text-align: center;
font-weight: bold;
line-height: 300px;
z-index: 1000;
}
/*btn state
*/
.previousStepH .icon {
display: inline-block;
width: 16px;
height: 16px;
background-image: url('images/undoH.png');
cursor: pointer;
}
.previousStepH .text {
color: #888;
cursor: pointer;
}
.previousStep .icon {
display: inline-block;
width: 16px;
height: 16px;
background-image: url('images/undo.png');
cursor: default;
}
.previousStep .text {
color: #ccc;
cursor: default;
}
.nextStepH .icon {
display: inline-block;
width: 16px;
height: 16px;
background-image: url('images/redoH.png');
cursor: pointer;
}
.nextStepH .text {
color: #888;
cursor: pointer;
}
.nextStep .icon {
display: inline-block;
width: 16px;
height: 16px;
background-image: url('images/redo.png');
cursor: default;
}
.nextStep .text {
color: #ccc;
cursor: default;
}
.clearBoardH .icon {
display: inline-block;
width: 16px;
height: 16px;
background-image: url('images/emptyH.png');
cursor: pointer;
}
.clearBoardH .text {
color: #888;
cursor: pointer;
}
.clearBoard .icon {
display: inline-block;
width: 16px;
height: 16px;
background-image: url('images/empty.png');
cursor: default;
}
.clearBoard .text {
color: #ccc;
cursor: default;
}
.scaleBoardH .icon {
display: inline-block;
width: 16px;
height: 16px;
background-image: url('images/scaleH.png');
cursor: pointer;
}
.scaleBoardH .text {
color: #888;
cursor: pointer;
}
.scaleBoard .icon {
display: inline-block;
width: 16px;
height: 16px;
background-image: url('images/scale.png');
cursor: default;
}
.scaleBoard .text {
color: #ccc;
cursor: default;
}
.removeImgH .icon {
display: inline-block;
width: 16px;
height: 16px;
background-image: url('images/delimgH.png');
cursor: pointer;
}
.removeImgH .text {
color: #888;
cursor: pointer;
}
.removeImg .icon {
display: inline-block;
width: 16px;
height: 16px;
background-image: url('images/delimg.png');
cursor: default;
}
.removeImg .text {
color: #ccc;
cursor: default;
}
.addImgH .icon {
vertical-align: top;
display: inline-block;
width: 16px;
height: 16px;
background-image: url('images/addimg.png')
}
.addImgH .text {
color: #888;
cursor: pointer;
}
/*icon
*/
.brushIcon {
display: inline-block;
width: 16px;
height: 16px;
background-image: url('images/brush.png')
}
.eraserIcon {
display: inline-block;
width: 16px;
height: 16px;
background-image: url('images/eraser.png')
}

@ -0,0 +1,95 @@
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="robots" content="noindex, nofollow"/>
<script type="text/javascript" src="../internal.js?aea0c61c"></script>
<link rel="stylesheet" type="text/css" href="scrawl.css?5bdd07f3">
</head>
<body>
<div class="main" id="J_wrap">
<div class="hot">
<div class="drawBoard border_style1">
<canvas id="J_brushBoard" class="brushBorad" width="360" height="300"></canvas>
<div id="J_picBoard" class="picBoard" style="width: 360px;height: 300px"></div>
</div>
<div id="J_operateBar" class="operateBar">
<span id="J_previousStep" class="previousStep">
<em class="icon"></em>
<em class="text"><var id="lang_input_previousStep"></var></em>
</span>
<span id="J_nextStep" class="nextStep">
<em class="icon"></em>
<em class="text"><var id="lang_input_nextsStep"></var></em>
</span>
<span id="J_clearBoard" class="clearBoard">
<em class="icon"></em>
<em class="text"><var id="lang_input_clear"></var></em>
</span>
<span id="J_sacleBoard" class="scaleBoard">
<em class="icon"></em>
<em class="text"><var id="lang_input_ScalePic"></var></em>
</span>
</div>
</div>
<div class="drawToolbar border_style1">
<div id="J_colorBar" class="colorBar"></div>
<div id="J_brushBar" class="sectionBar">
<em class="brushIcon"></em>
<a href="javascript:void(0)" class="size1">1</a>
<a href="javascript:void(0)" class="size2">3</a>
<a href="javascript:void(0)" class="size3">5</a>
<a href="javascript:void(0)" class="size4">7</a>
</div>
<div id="J_eraserBar" class="sectionBar">
<em class="eraserIcon"></em>
<a href="javascript:void(0)" class="size1">1</a>
<a href="javascript:void(0)" class="size2">3</a>
<a href="javascript:void(0)" class="size3">5</a>
<a href="javascript:void(0)" class="size4">7</a>
</div>
<div class="sectionBar">
<div id="J_addImg" class="addImgH">
<em class="icon"></em>
<em class="text"><var id="lang_input_addPic"></var></em>
<form method="post" id="fileForm" enctype="multipart/form-data" class="addImgH_form" target="up">
<input type="file" name="upfile" id="J_imgTxt"
accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp"/>
</form>
<iframe name="up" style="display: none"></iframe>
</div>
</div>
<div class="sectionBar">
<span id="J_removeImg" class="removeImg">
<em class="icon"></em>
<em class="text"><var id="lang_input_removePic"></var></em>
</span>
</div>
</div>
</div>
<div id="J_maskLayer" class="maskLayerNull"></div>
<script type="text/javascript" src="scrawl.js?ee947940"></script>
<script type="text/javascript">
var settings = {
drawBrushSize: 3, //画笔初始大小
drawBrushColor: "#4bacc6", //画笔初始颜色
colorList: ['c00000', 'ff0000', 'ffc000', 'ffff00', '92d050', '00b050', '00b0f0', '0070c0', '002060', '7030a0', 'ffffff',
'000000', 'eeece1', '1f497d', '4f81bd', 'c0504d', '9bbb59', '8064a2', '4bacc6', 'f79646'], //画笔选择颜色
saveNum: 10 //撤销次数
};
var scrawlObj = new scrawl(settings);
scrawlObj.isCancelScrawl = false;
dialog.onok = function () {
exec(scrawlObj);
return false;
};
dialog.oncancel = function () {
scrawlObj.isCancelScrawl = true;
};
</script>
</body>
</html>

@ -0,0 +1,682 @@
/**
* Created with JetBrains PhpStorm.
* User: xuheng
* Date: 12-5-22
* Time: 上午11:38
* To change this template use File | Settings | File Templates.
*/
var scrawl = function (options) {
options && this.initOptions(options);
};
(function () {
var canvas = $G("J_brushBoard"),
context = canvas.getContext('2d'),
drawStep = [], //undo redo存储
drawStepIndex = 0; //undo redo指针
scrawl.prototype = {
isScrawl: false, //是否涂鸦
brushWidth: -1, //画笔粗细
brushColor: "", //画笔颜色
initOptions: function (options) {
var me = this;
me.originalState(options);//初始页面状态
me._buildToolbarColor(options.colorList);//动态生成颜色选择集合
me._addBoardListener(options.saveNum);//添加画板处理
me._addOPerateListener(options.saveNum);//添加undo redo clearBoard处理
me._addColorBarListener();//添加颜色选择处理
me._addBrushBarListener();//添加画笔大小处理
me._addEraserBarListener();//添加橡皮大小处理
me._addAddImgListener();//添加增添背景图片处理
me._addRemoveImgListenter();//删除背景图片处理
me._addScalePicListenter();//添加缩放处理
me._addClearSelectionListenter();//添加清楚选中状态处理
me._originalColorSelect(options.drawBrushColor);//初始化颜色选中
me._originalBrushSelect(options.drawBrushSize);//初始化画笔选中
me._clearSelection();//清楚选中状态
},
originalState: function (options) {
var me = this;
me.brushWidth = options.drawBrushSize;//同步画笔粗细
me.brushColor = options.drawBrushColor;//同步画笔颜色
context.lineWidth = me.brushWidth;//初始画笔大小
context.strokeStyle = me.brushColor;//初始画笔颜色
context.fillStyle = "transparent";//初始画布背景颜色
context.lineCap = "round";//去除锯齿
context.fill();
},
_buildToolbarColor: function (colorList) {
var tmp = null, arr = [];
arr.push("<table id='J_colorList'>");
for (var i = 0, color; color = colorList[i++];) {
if ((i - 1) % 5 == 0) {
if (i != 1) {
arr.push("</tr>");
}
arr.push("<tr>");
}
tmp = '#' + color;
arr.push("<td><a title='" + tmp + "' href='javascript:void(0)' style='background-color:" + tmp + "'></a></td>");
}
arr.push("</tr></table>");
$G("J_colorBar").innerHTML = arr.join("");
},
_addBoardListener: function (saveNum) {
var me = this,
margin = 0,
startX = -1,
startY = -1,
isMouseDown = false,
isMouseMove = false,
isMouseUp = false,
buttonPress = 0, button, flag = '';
margin = parseInt(domUtils.getComputedStyle($G("J_wrap"), "margin-left"));
drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height));
drawStepIndex += 1;
domUtils.on(canvas, ["mousedown", "mousemove", "mouseup", "mouseout"], function (e) {
button = browser.webkit ? e.which : buttonPress;
switch (e.type) {
case 'mousedown':
buttonPress = 1;
flag = 1;
isMouseDown = true;
isMouseUp = false;
isMouseMove = false;
me.isScrawl = true;
startX = e.clientX - margin;//10为外边距总和
startY = e.clientY - margin;
context.beginPath();
break;
case 'mousemove' :
if (!flag && button == 0) {
return;
}
if (!flag && button) {
startX = e.clientX - margin;//10为外边距总和
startY = e.clientY - margin;
context.beginPath();
flag = 1;
}
if (isMouseUp || !isMouseDown) {
return;
}
var endX = e.clientX - margin,
endY = e.clientY - margin;
context.moveTo(startX, startY);
context.lineTo(endX, endY);
context.stroke();
startX = endX;
startY = endY;
isMouseMove = true;
break;
case 'mouseup':
buttonPress = 0;
if (!isMouseDown) return;
if (!isMouseMove) {
context.arc(startX, startY, context.lineWidth, 0, Math.PI * 2, false);
context.fillStyle = context.strokeStyle;
context.fill();
}
context.closePath();
me._saveOPerate(saveNum);
isMouseDown = false;
isMouseMove = false;
isMouseUp = true;
startX = -1;
startY = -1;
break;
case 'mouseout':
flag = '';
buttonPress = 0;
if (button == 1) return;
context.closePath();
break;
}
});
},
_addOPerateListener: function (saveNum) {
var me = this;
domUtils.on($G("J_previousStep"), "click", function () {
if (drawStepIndex > 1) {
drawStepIndex -= 1;
context.clearRect(0, 0, context.canvas.width, context.canvas.height);
context.putImageData(drawStep[drawStepIndex - 1], 0, 0);
me.btn2Highlight("J_nextStep");
drawStepIndex == 1 && me.btn2disable("J_previousStep");
}
});
domUtils.on($G("J_nextStep"), "click", function () {
if (drawStepIndex > 0 && drawStepIndex < drawStep.length) {
context.clearRect(0, 0, context.canvas.width, context.canvas.height);
context.putImageData(drawStep[drawStepIndex], 0, 0);
drawStepIndex += 1;
me.btn2Highlight("J_previousStep");
drawStepIndex == drawStep.length && me.btn2disable("J_nextStep");
}
});
domUtils.on($G("J_clearBoard"), "click", function () {
context.clearRect(0, 0, context.canvas.width, context.canvas.height);
drawStep = [];
me._saveOPerate(saveNum);
drawStepIndex = 1;
me.isScrawl = false;
me.btn2disable("J_previousStep");
me.btn2disable("J_nextStep");
me.btn2disable("J_clearBoard");
});
},
_addColorBarListener: function () {
var me = this;
domUtils.on($G("J_colorBar"), "click", function (e) {
var target = me.getTarget(e),
color = target.title;
if (!!color) {
me._addColorSelect(target);
me.brushColor = color;
context.globalCompositeOperation = "source-over";
context.lineWidth = me.brushWidth;
context.strokeStyle = color;
}
});
},
_addBrushBarListener: function () {
var me = this;
domUtils.on($G("J_brushBar"), "click", function (e) {
var target = me.getTarget(e),
size = browser.ie ? target.innerText : target.text;
if (!!size) {
me._addBESelect(target);
context.globalCompositeOperation = "source-over";
context.lineWidth = parseInt(size);
context.strokeStyle = me.brushColor;
me.brushWidth = context.lineWidth;
}
});
},
_addEraserBarListener: function () {
var me = this;
domUtils.on($G("J_eraserBar"), "click", function (e) {
var target = me.getTarget(e),
size = browser.ie ? target.innerText : target.text;
if (!!size) {
me._addBESelect(target);
context.lineWidth = parseInt(size);
context.globalCompositeOperation = "destination-out";
context.strokeStyle = "#FFF";
}
});
},
_addAddImgListener: function () {
var file = $G("J_imgTxt");
if (!window.FileReader) {
$G("J_addImg").style.display = 'none';
$G("J_removeImg").style.display = 'none';
$G("J_sacleBoard").style.display = 'none';
}
domUtils.on(file, "change", function (e) {
var frm = file.parentNode;
addMaskLayer(lang.backgroundUploading);
var target = e.target || e.srcElement,
reader = new FileReader();
reader.onload = function (evt) {
var target = evt.target || evt.srcElement;
ue_callback(target.result, 'SUCCESS');
};
reader.readAsDataURL(target.files[0]);
frm.reset();
});
},
_addRemoveImgListenter: function () {
var me = this;
domUtils.on($G("J_removeImg"), "click", function () {
$G("J_picBoard").innerHTML = "";
me.btn2disable("J_removeImg");
me.btn2disable("J_sacleBoard");
});
},
_addScalePicListenter: function () {
domUtils.on($G("J_sacleBoard"), "click", function () {
var picBoard = $G("J_picBoard"),
scaleCon = $G("J_scaleCon"),
img = picBoard.children[0];
if (img) {
if (!scaleCon) {
picBoard.style.cssText = "position:relative;z-index:999;" + picBoard.style.cssText;
img.style.cssText = "position: absolute;top:" + (canvas.height - img.height) / 2 + "px;left:" + (canvas.width - img.width) / 2 + "px;";
var scale = new ScaleBoy();
picBoard.appendChild(scale.init());
scale.startScale(img);
} else {
if (scaleCon.style.visibility == "visible") {
scaleCon.style.visibility = "hidden";
picBoard.style.position = "";
picBoard.style.zIndex = "";
} else {
scaleCon.style.visibility = "visible";
picBoard.style.cssText += "position:relative;z-index:999";
}
}
}
});
},
_addClearSelectionListenter: function () {
var doc = document;
domUtils.on(doc, 'mousemove', function (e) {
if (browser.ie && browser.version < 11)
doc.selection.clear();
else
window.getSelection().removeAllRanges();
});
},
_clearSelection: function () {
var list = ["J_operateBar", "J_colorBar", "J_brushBar", "J_eraserBar", "J_picBoard"];
for (var i = 0, group; group = list[i++];) {
domUtils.unSelectable($G(group));
}
},
_saveOPerate: function (saveNum) {
var me = this;
if (drawStep.length <= saveNum) {
if (drawStepIndex < drawStep.length) {
me.btn2disable("J_nextStep");
drawStep.splice(drawStepIndex);
}
drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height));
drawStepIndex = drawStep.length;
} else {
drawStep.shift();
drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height));
drawStepIndex = drawStep.length;
}
me.btn2Highlight("J_previousStep");
me.btn2Highlight("J_clearBoard");
},
_originalColorSelect: function (title) {
var colorList = $G("J_colorList").getElementsByTagName("td");
for (var j = 0, cell; cell = colorList[j++];) {
if (cell.children[0].title.toLowerCase() == title) {
cell.children[0].style.opacity = 1;
}
}
},
_originalBrushSelect: function (text) {
var brushList = $G("J_brushBar").children;
for (var i = 0, ele; ele = brushList[i++];) {
if (ele.tagName.toLowerCase() == "a") {
var size = browser.ie ? ele.innerText : ele.text;
if (size.toLowerCase() == text) {
ele.style.opacity = 1;
}
}
}
},
_addColorSelect: function (target) {
var me = this,
colorList = $G("J_colorList").getElementsByTagName("td"),
eraserList = $G("J_eraserBar").children,
brushList = $G("J_brushBar").children;
for (var i = 0, cell; cell = colorList[i++];) {
cell.children[0].style.opacity = 0.3;
}
for (var k = 0, ele; ele = brushList[k++];) {
if (ele.tagName.toLowerCase() == "a") {
ele.style.opacity = 0.3;
var size = browser.ie ? ele.innerText : ele.text;
if (size.toLowerCase() == this.brushWidth) {
ele.style.opacity = 1;
}
}
}
for (var j = 0, node; node = eraserList[j++];) {
if (node.tagName.toLowerCase() == "a") {
node.style.opacity = 0.3;
}
}
target.style.opacity = 1;
target.blur();
},
_addBESelect: function (target) {
var brushList = $G("J_brushBar").children;
var eraserList = $G("J_eraserBar").children;
for (var i = 0, ele; ele = brushList[i++];) {
if (ele.tagName.toLowerCase() == "a") {
ele.style.opacity = 0.3;
}
}
for (var j = 0, node; node = eraserList[j++];) {
if (node.tagName.toLowerCase() == "a") {
node.style.opacity = 0.3;
}
}
target.style.opacity = 1;
target.blur();
},
getCanvasData: function () {
var picContainer = $G("J_picBoard"),
img = picContainer.children[0];
if (img) {
var x, y;
if (img.style.position == "absolute") {
x = parseInt(img.style.left);
y = parseInt(img.style.top);
} else {
x = (picContainer.offsetWidth - img.width) / 2;
y = (picContainer.offsetHeight - img.height) / 2;
}
context.globalCompositeOperation = "destination-over";
context.drawImage(img, x, y, img.width, img.height);
} else {
context.globalCompositeOperation = "destination-atop";
context.fillStyle = "#fff";//重置画布背景白色
context.fillRect(0, 0, canvas.width, canvas.height);
}
try {
return canvas.toDataURL("image/png").substring(22);
} catch (e) {
return "";
}
},
btn2Highlight: function (id) {
var cur = $G(id);
cur.className.indexOf("H") == -1 && (cur.className += "H");
},
btn2disable: function (id) {
var cur = $G(id);
cur.className.indexOf("H") != -1 && (cur.className = cur.className.replace("H", ""));
},
getTarget: function (evt) {
return evt.target || evt.srcElement;
}
};
})();
var ScaleBoy = function () {
this.dom = null;
this.scalingElement = null;
};
(function () {
function _appendStyle() {
var doc = document,
head = doc.getElementsByTagName('head')[0],
style = doc.createElement('style'),
cssText = '.scale{visibility:hidden;cursor:move;position:absolute;left:0;top:0;width:100px;height:50px;background-color:#fff;font-size:0;line-height:0;opacity:.4;filter:Alpha(opacity=40);}'
+ '.scale span{position:absolute;left:0;top:0;width:6px;height:6px;background-color:#006DAE;}'
+ '.scale .hand0, .scale .hand7{cursor:nw-resize;}'
+ '.scale .hand1, .scale .hand6{left:50%;margin-left:-3px;cursor:n-resize;}'
+ '.scale .hand2, .scale .hand4, .scale .hand7{left:100%;margin-left:-6px;}'
+ '.scale .hand3, .scale .hand4{top:50%;margin-top:-3px;cursor:w-resize;}'
+ '.scale .hand5, .scale .hand6, .scale .hand7{margin-top:-6px;top:100%;}'
+ '.scale .hand2, .scale .hand5{cursor:ne-resize;}';
style.type = 'text/css';
try {
style.appendChild(doc.createTextNode(cssText));
} catch (e) {
style.styleSheet.cssText = cssText;
}
head.appendChild(style);
}
function _getDom() {
var doc = document,
hand,
arr = [],
scale = doc.createElement('div');
scale.id = 'J_scaleCon';
scale.className = 'scale';
for (var i = 0; i < 8; i++) {
arr.push("<span class='hand" + i + "'></span>");
}
scale.innerHTML = arr.join("");
return scale;
}
var rect = [
//[left, top, width, height]
[1, 1, -1, -1],
[0, 1, 0, -1],
[0, 1, 1, -1],
[1, 0, -1, 0],
[0, 0, 1, 0],
[1, 0, -1, 1],
[0, 0, 0, 1],
[0, 0, 1, 1]
];
ScaleBoy.prototype = {
init: function () {
_appendStyle();
var me = this,
scale = me.dom = _getDom();
me.scaleMousemove.fp = me;
domUtils.on(scale, 'mousedown', function (e) {
var target = e.target || e.srcElement;
me.start = {x: e.clientX, y: e.clientY};
if (target.className.indexOf('hand') != -1) {
me.dir = target.className.replace('hand', '');
}
domUtils.on(document.body, 'mousemove', me.scaleMousemove);
e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true;
});
domUtils.on(document.body, 'mouseup', function (e) {
if (me.start) {
domUtils.un(document.body, 'mousemove', me.scaleMousemove);
if (me.moved) {
me.updateScaledElement({
position: {x: scale.style.left, y: scale.style.top},
size: {w: scale.style.width, h: scale.style.height}
});
}
delete me.start;
delete me.moved;
delete me.dir;
}
});
return scale;
},
startScale: function (objElement) {
var me = this, Idom = me.dom;
Idom.style.cssText = 'visibility:visible;top:' + objElement.style.top + ';left:' + objElement.style.left + ';width:' + objElement.offsetWidth + 'px;height:' + objElement.offsetHeight + 'px;';
me.scalingElement = objElement;
},
updateScaledElement: function (objStyle) {
var cur = this.scalingElement,
pos = objStyle.position,
size = objStyle.size;
if (pos) {
typeof pos.x != 'undefined' && (cur.style.left = pos.x);
typeof pos.y != 'undefined' && (cur.style.top = pos.y);
}
if (size) {
size.w && (cur.style.width = size.w);
size.h && (cur.style.height = size.h);
}
},
updateStyleByDir: function (dir, offset) {
var me = this,
dom = me.dom, tmp;
rect['def'] = [1, 1, 0, 0];
if (rect[dir][0] != 0) {
tmp = parseInt(dom.style.left) + offset.x;
dom.style.left = me._validScaledProp('left', tmp) + 'px';
}
if (rect[dir][1] != 0) {
tmp = parseInt(dom.style.top) + offset.y;
dom.style.top = me._validScaledProp('top', tmp) + 'px';
}
if (rect[dir][2] != 0) {
tmp = dom.clientWidth + rect[dir][2] * offset.x;
dom.style.width = me._validScaledProp('width', tmp) + 'px';
}
if (rect[dir][3] != 0) {
tmp = dom.clientHeight + rect[dir][3] * offset.y;
dom.style.height = me._validScaledProp('height', tmp) + 'px';
}
if (dir === 'def') {
me.updateScaledElement({position: {x: dom.style.left, y: dom.style.top}});
}
},
scaleMousemove: function (e) {
var me = arguments.callee.fp,
start = me.start,
dir = me.dir || 'def',
offset = {x: e.clientX - start.x, y: e.clientY - start.y};
me.updateStyleByDir(dir, offset);
arguments.callee.fp.start = {x: e.clientX, y: e.clientY};
arguments.callee.fp.moved = 1;
},
_validScaledProp: function (prop, value) {
var ele = this.dom,
wrap = $G("J_picBoard");
value = isNaN(value) ? 0 : value;
switch (prop) {
case 'left':
return value < 0 ? 0 : (value + ele.clientWidth) > wrap.clientWidth ? wrap.clientWidth - ele.clientWidth : value;
case 'top':
return value < 0 ? 0 : (value + ele.clientHeight) > wrap.clientHeight ? wrap.clientHeight - ele.clientHeight : value;
case 'width':
return value <= 0 ? 1 : (value + ele.offsetLeft) > wrap.clientWidth ? wrap.clientWidth - ele.offsetLeft : value;
case 'height':
return value <= 0 ? 1 : (value + ele.offsetTop) > wrap.clientHeight ? wrap.clientHeight - ele.offsetTop : value;
}
}
};
})();
//后台回调
function ue_callback(url, state) {
var doc = document,
picBorard = $G("J_picBoard"),
img = doc.createElement("img");
//图片缩放
function scale(img, max, oWidth, oHeight) {
var width = 0, height = 0, percent, ow = img.width || oWidth, oh = img.height || oHeight;
if (ow > max || oh > max) {
if (ow >= oh) {
if (width = ow - max) {
percent = (width / ow).toFixed(2);
img.height = oh - oh * percent;
img.width = max;
}
} else {
if (height = oh - max) {
percent = (height / oh).toFixed(2);
img.width = ow - ow * percent;
img.height = max;
}
}
}
}
//移除遮罩层
removeMaskLayer();
//状态响应
if (state == "SUCCESS") {
picBorard.innerHTML = "";
img.onload = function () {
scale(this, 300);
picBorard.appendChild(img);
var obj = new scrawl();
obj.btn2Highlight("J_removeImg");
//trace 2457
obj.btn2Highlight("J_sacleBoard");
};
img.src = url;
} else {
alert(state);
}
}
//去掉遮罩层
function removeMaskLayer() {
var maskLayer = $G("J_maskLayer");
maskLayer.className = "maskLayerNull";
maskLayer.innerHTML = "";
dialog.buttons[0].setDisabled(false);
}
//添加遮罩层
function addMaskLayer(html) {
var maskLayer = $G("J_maskLayer");
dialog.buttons[0].setDisabled(true);
maskLayer.className = "maskLayer";
maskLayer.innerHTML = html;
}
//执行确认按钮方法
function exec(scrawlObj) {
if (scrawlObj.isScrawl) {
addMaskLayer(lang.scrawlUpLoading);
var base64 = scrawlObj.getCanvasData();
if (!!base64) {
var options = {
timeout: 100000,
headers: editor.options.serverHeaders || {},
onsuccess: function (xhr) {
if (!scrawlObj.isCancelScrawl) {
var responseObj;
responseObj = eval("(" + xhr.responseText + ")");
if (responseObj.state === "SUCCESS") {
var imgObj = {},
url = editor.options.scrawlUrlPrefix + responseObj.url;
imgObj.src = url;
imgObj._src = url;
imgObj.alt = responseObj.original || '';
editor.execCommand("insertImage", imgObj);
dialog.close();
// 触发上传涂鸦事件
editor.fireEvent("uploadsuccess", {
res: responseObj,
type: 'scrawl'
});
} else {
alert(responseObj.state);
}
}
},
onerror: function () {
alert(lang.imageError);
dialog.close();
}
};
options[editor.getOpt('scrawlFieldName')] = base64;
var actionUrl = editor.getActionUrl(editor.getOpt('scrawlActionName')),
params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?' : '&') + params);
ajax.request(url, options);
}
} else {
addMaskLayer(lang.noScarwl + "&nbsp;&nbsp;&nbsp;<input type='button' value='" + lang.continueBtn + "' onclick='removeMaskLayer()'/>");
}
}

@ -0,0 +1,144 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<script type="text/javascript" src="../internal.js?aea0c61c"></script>
<style type="text/css">
.warpper {
position: relative;
width: 380px;
height: 100%;
margin: 10px auto;
}
.tabbody {
height: 160px;
}
.tabbody table {
width: 100%;
border-collapse: separate;
border-spacing: 3px;
line-height: 36px;
}
.tabbody .panel {
width: 373px;
height: 100%;
padding-left: 5px;
position: absolute;
background-color: #fff;
}
.tabbody input.int {
width: 190px;
height: 30px;
border: 1px solid #d7d7d7;
line-height: 21px;
border-radius: 3px;
outline: none;
padding: 0 5px;
}
.tabbody input.btn {
text-align: center;
line-height: 28px;
text-decoration: none;
height: 30px;
border: 1px solid #ccc;
background: #FFF;
border-radius: 3px;
padding: 0 5px;
font-size: 12px;
cursor: pointer;
}
</style>
</head>
<body>
<div class="warpper" id="searchtab">
<div id="head" class="tabhead">
<span tabsrc="find" class="focus"><var id="lang_tab_search"></var></span>
<span tabsrc="replace"><var id="lang_tab_replace"></var></span>
</div>
<div class="tabbody">
<div class="panel" id="find">
<table>
<tr>
<td width="80"><var id="lang_search1"></var>:</td>
<td><input id="findtxt" type="text" class="int"/></td>
</tr>
<!--<tr>-->
<!--<td colspan="2"><span style="color:red"><var id="lang_searchReg"></var></span></td>-->
<!--</tr>-->
<tr>
<td><var id="lang_case_sensitive1"></var></td>
<td>
<input id="matchCase" type="checkbox"/>
</td>
</tr>
<tr>
<td colspan="2">
<input id="nextFindBtn" type="button" class="btn"/>
<input id="preFindBtn" type="button" class="btn"/>
</td>
</tr>
<tr>
<td colspan="2">
&nbsp;
</td>
</tr>
<tr>
<td colspan="2">
<span id="search-msg" style="color:red"></span>
</td>
</tr>
</table>
</div>
<div class="panel" id="replace">
<table>
<tr>
<td width="80"><var id="lang_search2"></var>:</td>
<td><input id="findtxt1" type="text" class="int"/></td>
</tr>
<!--<tr>-->
<!--<td colspan="2"><span style="color:red"><var id="lang_searchReg1"></var></span></td>-->
<!--</tr>-->
<tr>
<td><var id="lang_replace"></var>:</td>
<td><input id="replacetxt" type="text" class="int"/></td>
</tr>
<tr>
<td><var id="lang_case_sensitive2"></var></td>
<td>
<input id="matchCase1" type="checkbox"/>
</td>
</tr>
<tr>
<td colspan="2">
<input id="nextReplaceBtn" type="button" class="btn"/>
<input id="preReplaceBtn" type="button" class="btn"/>
<input id="repalceBtn" type="button" class="btn"/>
<input id="repalceAllBtn" type="button" class="btn"/>
</td>
</tr>
<tr>
<td colspan="2">
&nbsp;
</td>
</tr>
<tr>
<td colspan="2">
<span id="replace-msg" style="color:red"></span>
</td>
</tr>
</table>
</div>
</div>
</div>
<script type="text/javascript" src="searchreplace.js?2c3cf2d3"></script>
</body>
</html>

@ -0,0 +1,174 @@
/**
* Created with JetBrains PhpStorm.
* User: xuheng
* Date: 12-9-26
* Time: 下午12:29
* To change this template use File | Settings | File Templates.
*/
//清空上次查选的痕迹
editor.firstForSR = 0;
editor.currentRangeForSR = null;
//给tab注册切换事件
/**
* tab点击处理事件
* @param tabHeads
* @param tabBodys
* @param obj
*/
function clickHandler(tabHeads, tabBodys, obj) {
//head样式更改
for (var k = 0, len = tabHeads.length; k < len; k++) {
tabHeads[k].className = "";
}
obj.className = "focus";
//body显隐
var tabSrc = obj.getAttribute("tabSrc");
for (var j = 0, length = tabBodys.length; j < length; j++) {
var body = tabBodys[j],
id = body.getAttribute("id");
if (id != tabSrc) {
body.style.zIndex = 1;
} else {
body.style.zIndex = 200;
}
}
}
/**
* TAB切换
* @param tabParentId tab的父节点ID或者对象本身
*/
function switchTab(tabParentId) {
var tabElements = $G(tabParentId).children,
tabHeads = tabElements[0].children,
tabBodys = tabElements[1].children;
for (var i = 0, length = tabHeads.length; i < length; i++) {
var head = tabHeads[i];
if (head.className === "focus") clickHandler(tabHeads, tabBodys, head);
head.onclick = function () {
clickHandler(tabHeads, tabBodys, this);
}
}
}
$G('searchtab').onmousedown = function () {
$G('search-msg').innerHTML = '';
$G('replace-msg').innerHTML = ''
}
//是否区分大小写
function getMatchCase(id) {
return $G(id).checked ? true : false;
}
//查找
$G("nextFindBtn").onclick = function (txt, dir, mcase) {
var findtxt = $G("findtxt").value, obj;
if (!findtxt) {
return false;
}
obj = {
searchStr: findtxt,
dir: 1,
casesensitive: getMatchCase("matchCase")
};
if (!frCommond(obj)) {
var bk = editor.selection.getRange().createBookmark();
$G('search-msg').innerHTML = lang.getEnd;
editor.selection.getRange().moveToBookmark(bk).select();
}
};
$G("nextReplaceBtn").onclick = function (txt, dir, mcase) {
var findtxt = $G("findtxt1").value, obj;
if (!findtxt) {
return false;
}
obj = {
searchStr: findtxt,
dir: 1,
casesensitive: getMatchCase("matchCase1")
};
frCommond(obj);
};
$G("preFindBtn").onclick = function (txt, dir, mcase) {
var findtxt = $G("findtxt").value, obj;
if (!findtxt) {
return false;
}
obj = {
searchStr: findtxt,
dir: -1,
casesensitive: getMatchCase("matchCase")
};
if (!frCommond(obj)) {
$G('search-msg').innerHTML = lang.getStart;
}
};
$G("preReplaceBtn").onclick = function (txt, dir, mcase) {
var findtxt = $G("findtxt1").value, obj;
if (!findtxt) {
return false;
}
obj = {
searchStr: findtxt,
dir: -1,
casesensitive: getMatchCase("matchCase1")
};
frCommond(obj);
};
//替换
$G("repalceBtn").onclick = function () {
editor.trigger('clearLastSearchResult');
var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj,
replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, "");
if (!findtxt) {
return false;
}
if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) {
return false;
}
obj = {
searchStr: findtxt,
dir: 1,
casesensitive: getMatchCase("matchCase1"),
replaceStr: replacetxt
};
frCommond(obj);
};
//全部替换
$G("repalceAllBtn").onclick = function () {
var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj,
replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, "");
if (!findtxt) {
return false;
}
if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) {
return false;
}
obj = {
searchStr: findtxt,
casesensitive: getMatchCase("matchCase1"),
replaceStr: replacetxt,
all: true
};
var num = frCommond(obj);
if (num) {
$G('replace-msg').innerHTML = lang.countMsg.replace("{#count}", num);
}
};
//执行
var frCommond = function (obj) {
return editor.execCommand("searchreplace", obj);
};
switchTab("searchtab");
dialog.onclose = function () {
editor.trigger('clearLastSearchResult')
};

@ -0,0 +1,42 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script type="text/javascript" src="../internal.js?aea0c61c"></script>
<style type="text/css">
html, body {
overflow: hidden;
}
#specharsTab {
width: 97%;
margin: 10px auto;
zoom: 1;
position: relative
}
.tabbody {
height: 447px;
}
.tabbody span {
margin: 5px 3px;
text-align: center;
display: inline-block;
width: 40px;
height: 16px;
line-height: 16px;
cursor: pointer;
}
</style>
</head>
<body>
<div id="specharsTab">
<div id="tabHeads" class="tabhead"></div>
<div id="tabBodys" class="tabbody"></div>
</div>
<script type="text/javascript" src="spechars.js?f474d0a8"></script>
</body>
</html>

@ -0,0 +1,86 @@
/**
* Created with JetBrains PhpStorm.
* User: xuheng
* Date: 12-9-26
* Time: 下午1:09
* To change this template use File | Settings | File Templates.
*/
var charsContent = [
{
name: "tsfh",
title: lang.tsfh,
content: toArray("、,。,·,ˉ,ˇ,¨,〃,々,—,~,‖,…,‘,’,“,”,〔,〕,〈,〉,《,》,「,」,『,』,〖,〗,【,】,±,×,÷,∶,∧,∨,∑,∏,∪,∩,∈,∷,√,⊥,∥,∠,⌒,⊙,∫,∮,≡,≌,≈,∽,∝,≠,≮,≯,≤,≥,∞,∵,∴,♂,♀,°,′,″,℃,$,¤,¢,£,‰,§,№,☆,★,○,●,◎,◇,◆,□,■,△,▲,※,→,←,↑,↓,〓,〡,〢,〣,〤,〥,〦,〧,〨,〩,㊣,㎎,㎏,㎜,㎝,㎞,㎡,㏄,㏎,㏑,㏒,㏕,︰,¬,¦,℡,ˊ,ˋ,˙,–,―,‥,‵,℅,℉,↖,↗,↘,↙,∕,∟,∣,≒,≦,≧,⊿,═,║,╒,╓,╔,╕,╖,╗,╘,╙,╚,╛,╜,╝,╞,╟,╠,╡,╢,╣,╤,╥,╦,╧,╨,╩,╪,╫,╬,╭,╮,╯,╰,╱,╲,╳,▁,▂,▃,▄,▅,▆,▇,<EFBFBD>,█,▉,▊,▋,▌,▍,▎,▏,▓,▔,▕,▼,▽,◢,◣,◤,◥,☉,⊕,〒,〝,〞")
},
{name: "lmsz", title: lang.lmsz, content: toArray("ⅰ,ⅱ,ⅲ,ⅳ,ⅴ,ⅵ,ⅶ,ⅷ,ⅸ,ⅹ,Ⅰ,Ⅱ,Ⅲ,Ⅳ,Ⅴ,Ⅵ,Ⅶ,Ⅷ,Ⅸ,Ⅹ,Ⅺ,Ⅻ")},
{
name: "szfh",
title: lang.szfh,
content: toArray("⒈,⒉,⒊,⒋,⒌,⒍,⒎,⒏,⒐,⒑,⒒,⒓,⒔,⒕,⒖,⒗,⒘,⒙,⒚,⒛,⑴,⑵,⑶,⑷,⑸,⑹,⑺,⑻,⑼,⑽,⑾,⑿,⒀,⒁,⒂,⒃,⒄,⒅,⒆,⒇,①,②,③,④,⑤,⑥,⑦,⑧,⑨,⑩,㈠,㈡,㈢,㈣,㈤,㈥,㈦,㈧,㈨,㈩")
},
{
name: "rwfh",
title: lang.rwfh,
content: toArray("ぁ,あ,ぃ,い,ぅ,う,ぇ,え,ぉ,お,か,が,き,ぎ,く,ぐ,け,げ,こ,ご,さ,ざ,し,じ,す,ず,せ,ぜ,そ,ぞ,た,だ,ち,ぢ,っ,つ,づ,て,で,と,ど,な,に,ぬ,ね,の,は,ば,ぱ,ひ,び,ぴ,ふ,ぶ,ぷ,へ,べ,ぺ,ほ,ぼ,ぽ,ま,み,む,め,も,ゃ,や,ゅ,ゆ,ょ,よ,ら,り,る,れ,ろ,ゎ,わ,ゐ,ゑ,を,ん,ァ,ア,ィ,イ,ゥ,ウ,ェ,エ,ォ,オ,カ,ガ,キ,ギ,ク,グ,ケ,ゲ,コ,ゴ,サ,ザ,シ,ジ,ス,ズ,セ,ゼ,ソ,ゾ,タ,ダ,チ,ヂ,ッ,ツ,ヅ,テ,デ,ト,ド,ナ,ニ,ヌ,ネ,ノ,ハ,バ,パ,ヒ,ビ,ピ,フ,ブ,プ,ヘ,ベ,ペ,ホ,ボ,ポ,マ,ミ,ム,メ,モ,ャ,ヤ,ュ,ユ,ョ,ヨ,ラ,リ,ル,レ,ロ,ヮ,ワ,ヰ,ヱ,ヲ,ン,ヴ,ヵ,ヶ")
},
{
name: "xlzm",
title: lang.xlzm,
content: toArray("Α,Β,Γ,Δ,Ε,Ζ,Η,Θ,Ι,Κ,Λ,Μ,Ν,Ξ,Ο,Π,Ρ,Σ,Τ,Υ,Φ,Χ,Ψ,Ω,α,β,γ,δ,ε,ζ,η,θ,ι,κ,λ,μ,ν,ξ,ο,π,ρ,σ,τ,υ,φ,χ,ψ,ω")
},
{
name: "ewzm",
title: lang.ewzm,
content: toArray("А,Б,В,Г,Д,Е,Ё,Ж,З,И,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ъ,Ы,Ь,Э,Ю,Я,а,б,в,г,д,е,ё,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ъ,ы,ь,э,ю,я")
},
{name: "pyzm", title: lang.pyzm, content: toArray("ā,á,ǎ,à,ē,é,ě,è,ī,í,ǐ,ì,ō,ó,ǒ,ò,ū,ú,ǔ,ù,ǖ,ǘ,ǚ,ǜ,ü")},
{
name: "yyyb",
title: lang.yyyb,
content: toArray("i:,i,e,æ,ʌ,ə:,ə,u:,u,ɔ:,ɔ,a:,ei,ai,ɔi,əu,au,iə,εə,uə,p,t,k,b,d,g,f,s,ʃ,θ,h,v,z,ʒ,ð,tʃ,tr,ts,dʒ,dr,dz,m,n,ŋ,l,r,w,j,")
},
{
name: "zyzf",
title: lang.zyzf,
content: toArray("ㄅ,ㄆ,ㄇ,ㄈ,ㄉ,ㄊ,ㄋ,ㄌ,ㄍ,ㄎ,ㄏ,ㄐ,ㄑ,ㄒ,ㄓ,ㄔ,ㄕ,ㄖ,ㄗ,ㄘ,ㄙ,ㄚ,ㄛ,ㄜ,ㄝ,ㄞ,ㄟ,ㄠ,ㄡ,ㄢ,ㄣ,ㄤ,ㄥ,ㄦ,ㄧ,ㄨ")
}
];
(function createTab(content) {
for (var i = 0, ci; ci = content[i++];) {
var span = document.createElement("span");
span.setAttribute("tabSrc", ci.name);
span.innerHTML = ci.title;
if (i == 1) span.className = "focus";
domUtils.on(span, "click", function () {
var tmps = $G("tabHeads").children;
for (var k = 0, sk; sk = tmps[k++];) {
sk.className = "";
}
tmps = $G("tabBodys").children;
for (var k = 0, sk; sk = tmps[k++];) {
sk.style.display = "none";
}
this.className = "focus";
$G(this.getAttribute("tabSrc")).style.display = "";
});
$G("tabHeads").appendChild(span);
domUtils.insertAfter(span, document.createTextNode("\n"));
var div = document.createElement("div");
div.id = ci.name;
div.style.display = (i == 1) ? "" : "none";
var cons = ci.content;
for (var j = 0, con; con = cons[j++];) {
var charSpan = document.createElement("span");
charSpan.innerHTML = con;
domUtils.on(charSpan, "click", function () {
editor.execCommand("insertHTML", this.innerHTML);
dialog.close();
});
div.appendChild(charSpan);
}
$G("tabBodys").appendChild(div);
}
})(charsContent);
function toArray(str) {
return str.split(",");
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 B

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

Loading…
Cancel
Save