image.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. /**
  2. * @fileOverview
  3. *
  4. * 插入和管理图片
  5. *
  6. * @author: techird
  7. * @copyright: Baidu FEX, 2014
  8. */
  9. KityMinder.registerUI('ribbon/idea/image', function(minder) {
  10. var $attachment = minder.getUI('ribbon/idea/attachment');
  11. var $imageButtonMenu = new FUI.ButtonMenu({
  12. id: 'image-button-menu',
  13. text: minder.getLang('ui.image'),
  14. layout: 'bottom',
  15. buttons: [{}, {
  16. label: minder.getLang('ui.image')
  17. }],
  18. menu: {
  19. items: [minder.getLang('ui.removeimage')]
  20. }
  21. }).appendTo($attachment);
  22. $imageButtonMenu.bindCommandState(minder, 'image');
  23. var $imageDialog = new FUI.Dialog({
  24. width: 600,
  25. height: 600,
  26. prompt: true,
  27. className: 'image-dialog',
  28. caption: minder.getLang('ui.image')
  29. }).appendTo(document.getElementById('content-wrapper'));
  30. var $dialogBody = $($imageDialog.getBodyElement());
  31. // writed by yangxiaohu 2014-10-20
  32. var tabs = new FUI.Tabs( {
  33. buttons: [ "图片搜索", "插入图片" ]
  34. } );
  35. $dialogBody.html([
  36. '<div id="img_buttons"></div>',
  37. '<div id="img_panels"></div>'
  38. ].join(''));
  39. tabs.appendButtonTo( document.getElementById( 'img_buttons') );
  40. tabs.appendPanelTo( document.getElementById( 'img_panels'));
  41. tabs.getPanel(0).getContentElement().innerHTML = ['<div class="searchBar"><label>关键字:</label><input id="img_searchTxt" type="text" placeholder="请输入搜索关键词">',
  42. '<button id="img_searchBtn">百度一下</button></div>',
  43. '<div id="img_searchList"><ul id="img_searchListUl"></ul></div>'
  44. ].join('');
  45. tabs.getPanel(1).getContentElement().innerHTML = ['<p><label>图片地址:</label><input type="url" class="image-url fui-widget fui-selectable" /></p>',
  46. '<p><label>提示文本:</label><input type="text" class="image-title fui-widget fui-selectable" /></p>',
  47. '<img class="image-preview" src="" style="max-height: 200px;" />'].join('');
  48. //the content below is from xujinquan's ueditor
  49. /*搜索图片 */
  50. $G = function ( id ) {
  51. return document.getElementById( id )
  52. };
  53. function SearchImage() {
  54. this.init();
  55. }
  56. SearchImage.prototype = {
  57. lang: {
  58. searchRemind : '请输入搜索关键词',
  59. searchLoading : '图片加载中,请稍后……',
  60. searchRetry : '抱歉,没有找到图片!请重试一次!',
  61. },
  62. data: {
  63. imgUrl: '',
  64. imgTitle: '',
  65. },
  66. init: function () {
  67. this.initEvents();
  68. },
  69. initEvents: function(){
  70. var _this = this;
  71. /* 点击搜索按钮 */
  72. $('#img_searchBtn').on('click', function(){
  73. var key = $G('img_searchTxt').value;
  74. if(key && key != _this.lang.searchRemind) {
  75. _this.getImageData();
  76. }
  77. });
  78. /* 搜索框聚焦 */
  79. $('#img_searchTxt').on('focus', function(){
  80. var key = $G('img_searchTxt').value;
  81. if(key && key == _this.lang.searchRemind) {
  82. $G('img_searchTxt').value = '';
  83. }
  84. });
  85. /* 搜索框回车键搜索 */
  86. $('#img_searchTxt').on('keydown', function(e){
  87. var keyCode = e.keyCode || e.which;
  88. if (keyCode == 13) {
  89. $G('img_searchBtn').click();
  90. return false;
  91. }
  92. });
  93. /* 选中图片 */
  94. $('#img_searchList').on('click', function(e){
  95. var target = e.target || e.srcElement,
  96. $li = $(target).closest('li');
  97. _this.data.imgUrl = $li.find('img').attr('src');
  98. _this.data.imgTitle = $li.find('span').attr('title');
  99. $li.siblings('.selected').removeClass('selected');
  100. $li.addClass('selected');
  101. });
  102. },
  103. /* 改变图片大小 */
  104. scale: function (img, w, h) {
  105. var ow = img.width,
  106. oh = img.height;
  107. if (ow >= oh) {
  108. img.width = w * ow / oh;
  109. img.height = h;
  110. img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
  111. } else {
  112. img.width = w;
  113. img.height = h * oh / ow;
  114. img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
  115. }
  116. },
  117. getImageData: function(){
  118. var _this = this,
  119. key = $G('img_searchTxt').value,
  120. keepOriginName = '1';
  121. url = "http://image.baidu.com/i?ct=201326592&cl=2&lm=-1&st=-1&tn=baiduimagejson&istype=2&rn=3200&fm=index&pv=&word=" + key + "&ie=utf-8&oe=utf-8&keeporiginname=" + keepOriginName + "&" + +new Date;
  122. $G('img_searchListUl').innerHTML = _this.lang.searchLoading;
  123. $.ajax({url : url,
  124. dataType: 'jsonp',
  125. scriptCharset: 'GB18030',
  126. success:function(json){
  127. var list = [];
  128. if(json && json.data) {
  129. for(var i = 0; i < json.data.length; i++) {
  130. if(json.data[i].objURL) {
  131. list.push({
  132. title: json.data[i].fromPageTitleEnc,
  133. src: json.data[i].objURL,
  134. url: json.data[i].fromURL
  135. });
  136. }
  137. }
  138. }
  139. _this.setList(list);
  140. },
  141. error:function(){
  142. $G('img_searchListUl').innerHTML = _this.lang.searchRetry;
  143. }
  144. });
  145. },
  146. /* 添加图片到列表界面上 */
  147. setList: function (list) {
  148. var i, item, p, img, title, _this = this,
  149. listUl = $G('img_searchListUl');
  150. listUl.innerHTML = '';
  151. if(list.length) {
  152. for (i = 0; i < list.length; i++) {
  153. item = document.createElement('li');
  154. img = document.createElement('img');
  155. title = document.createElement('span');
  156. img.setAttribute('src', list[i].src);
  157. title.innerHTML = list[i].title;
  158. item.appendChild(img);
  159. item.appendChild(title);
  160. listUl.appendChild(item);
  161. img.onerror = function() {
  162. $(this).closest('li').remove();
  163. };
  164. }
  165. } else {
  166. listUl.innerHTML = _this.lang.searchRetry;
  167. }
  168. },
  169. getInsertList: function () {
  170. var child,
  171. src,
  172. align = getAlign(),
  173. list = [],
  174. items = $G('img_searchListUl').children;
  175. for(var i = 0; i < items.length; i++) {
  176. child = items[i].firstChild && items[i].firstChild.firstChild;
  177. if(child.tagName && child.tagName.toLowerCase() == 'img' && $(items[i]).hasClass('selected')) {
  178. src = child.src;
  179. list.push({
  180. src: src,
  181. _src: src,
  182. alt: src.substr(src.lastIndexOf('/') + 1),
  183. floatStyle: align
  184. });
  185. }
  186. }
  187. return list;
  188. }
  189. };
  190. var searchImage = new SearchImage();
  191. // the end content writed by yangxiaohu
  192. var $url = $dialogBody.find('.image-url');
  193. var $title = $dialogBody.find('.image-title');
  194. var $preview = $dialogBody.find('.image-preview');
  195. var $errorMsg = $('<span class="validate-error"></span>');
  196. $imageDialog.on('ok', function() {
  197. var index = tabs.getSelectedIndex();
  198. switch(index) {
  199. case 1:
  200. minder.execCommand('image', $url.val(), $title.val());
  201. break;
  202. case 0:
  203. minder.execCommand('image', searchImage.data.imgUrl, searchImage.data.imgTitle);
  204. break;
  205. }
  206. });
  207. $imageDialog.on('open', function() {
  208. var image = minder.queryCommandValue('image');
  209. $url.val(image.url);
  210. $title.val(image.title);
  211. $preview.attr('src', image.url || '');
  212. error(false);
  213. });
  214. function error(value) {
  215. if (value) {
  216. $url.addClass('validate-error');
  217. $errorMsg.text('图片无法加载');
  218. // $ok.disable();
  219. } else {
  220. $url.removeClass('validate-error');
  221. $errorMsg.text('');
  222. // $imageDialog.enable();
  223. }
  224. return value;
  225. }
  226. $url.after($errorMsg);
  227. $url.on('input', function() {
  228. var url = $url.val();
  229. if (/^https?\:\/\/(\w+\.)+\w+/.test(url)) {
  230. $preview.attr('src', url);
  231. error(false);
  232. // $imageDialog.disable();
  233. $preview.addClass('loading');
  234. } else {
  235. error(true);
  236. }
  237. });
  238. $preview.on('load', function() {
  239. error(false);
  240. $preview.removeClass('loading');
  241. }).on('error', function() {
  242. if ($preview.attr('src')) error(true);
  243. $preview.removeClass('loading');
  244. });
  245. $imageButtonMenu.on('buttonclick', function() {
  246. $imageDialog.open();
  247. $url[0].focus();
  248. });
  249. $imageButtonMenu.on('select', function() {
  250. minder.execCommand('removeimage');
  251. });
  252. return $imageButtonMenu;
  253. });