fileUploader.min.js 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765
  1. !
  2. function(a, b) {
  3. "function" == typeof define && define.amd ? define(["jquery", "underscore", "webuploader", "jquery.jplayer", "bootstrap", "filestyle"],
  4. function(c, d, e) {
  5. return a.fileUploader = b(c, d, e)
  6. }) : "object" == typeof module && "object" == typeof module.exports ? module.exports = b(require("jquery"), require("underscore"), require("webuploader"), require("jquery.jplayer"), require("bootstrap"), require("filestyle")) : a.fileUploader = b(jQuery, underscore, WebUploader)
  7. } (window,
  8. function(a, b, c) {
  9. var d = {
  10. defaultoptions: {
  11. direct: !1,
  12. global: !1,
  13. dest_dir: "",
  14. callback: null,
  15. type: "image",
  16. mode: "",
  17. multiple: !0,
  18. allowUploadVideo: !0,
  19. fileSizeLimit: !1,
  20. uploader: {}
  21. },
  22. uploader: {},
  23. show: function(a, b) {
  24. return this.init(a, b)
  25. },
  26. init: function(b, c) {
  27. var d = this;
  28. if (d.options = a.extend({},
  29. d.defaultoptions, c), d.options.callback = b, this.options.isWechat) {
  30. if (c.account_error) return util.message("公众号号没有上传素材的权限", "", "info"),
  31. !1
  32. } else this.options.global ? this.options.global = "global": this.options.global = "",
  33. document.cookie = "__fileupload_type=" + escape(this.options.type),
  34. document.cookie = "__fileupload_dest_dir=" + escape(this.options.dest_dir),
  35. document.cookie = "__fileupload_global=" + escape(this.options.global);
  36. return a("#modal-webuploader").remove(),
  37. 0 == a("#modal-webuploader").length && a(document.body).append(d.buildHtml().mainDialog),
  38. d.modalobj = a("#modal-webuploader"),
  39. d.modalobj.modal("show"),
  40. d.modalobj.on("shown.bs.modal",
  41. function() {
  42. if (!a(this).data("init")) {
  43. switch (d.options.type) {
  44. case "image":
  45. case "thumb":
  46. d.options.isWechat || d.initRemote(),
  47. d.initLocal();
  48. break;
  49. case "audio":
  50. d.initLocalAudio();
  51. break;
  52. case "voice":
  53. d.initLocalVoice();
  54. break;
  55. case "video":
  56. d.options.isWechat || d.initVideoRemote(),
  57. d.options.allowUploadVideo && d.initLocalVideo()
  58. }
  59. d.options.allowUploadVideo && d["init" + d.options.type.substring(0, 1).toUpperCase() + d.options.type.substring(1) + "Uploader"]()
  60. }
  61. }),
  62. d.modalobj
  63. },
  64. initUploader: function(b) {
  65. function e(e) {
  66. var f = a('<li id="' + e.id + '"><p class="title"' + ("audio" == b || "voice" == b ? 'style="top:40px;"': "") + ">" + e.name + '</p><p class="imgWrap"' + ("audio" == b || "voice" == b ? 'style="top:30px;"': "") + "></p></li>"),
  67. g = a('<div class="file-panel"><span class="cancel">删除</span></div>').appendTo(f),
  68. h = f.find("p.progress span"),
  69. i = f.find("p.imgWrap"),
  70. j = a('<p class="error"></p>'),
  71. k = function(a) {
  72. switch (a) {
  73. case "exceed_size":
  74. text = "文件大小超出";
  75. break;
  76. case "interrupt":
  77. text = "上传暂停";
  78. break;
  79. default:
  80. text = "上传失败,请重试"
  81. }
  82. j.text(text).appendTo(f)
  83. };
  84. "invalid" === e.getStatus() ? k(e.statusText) : ("image" == b ? (i.text("预览中"), d.makeThumb(e,
  85. function(b, c) {
  86. if (b) return void i.text("不能预览");
  87. var d = a('<img src="' + c + '">');
  88. i.empty().append(d)
  89. },
  90. thumbnailWidth, thumbnailHeight)) : i.text(c.formatSize(e.size) + " kb"), percentages[e.id] = [e.size, 0], e.rotation = 0),
  91. e.on("statuschange",
  92. function(a, c) {
  93. "progress" === c ? h.hide().width(0) : "queued" === c && (f.off("mouseenter mouseleave"), g.remove()),
  94. "error" === a || "invalid" === a ? (k(e.statusText), percentages[e.id][1] = 1) : "interrupt" === a ? k("interrupt") : "queued" === a ? percentages[e.id][1] = 0 : "progress" === a && (j.remove(), "image" == b && h.css("display", "block")),
  95. f.removeClass("state-" + c).addClass("state-" + a)
  96. }),
  97. f.on("mouseenter",
  98. function() {
  99. g.stop().animate({
  100. height: 30
  101. })
  102. }),
  103. f.on("mouseleave",
  104. function() {
  105. g.stop().animate({
  106. height: 0
  107. })
  108. }),
  109. g.on("click", "span",
  110. function() {
  111. var b, c = a(this).index();
  112. switch (c) {
  113. case 0:
  114. return void d.removeFile(e);
  115. case 1:
  116. e.rotation += 90;
  117. break;
  118. case 2:
  119. e.rotation -= 90
  120. }
  121. supportTransition ? (b = "rotate(" + e.rotation + "deg)", i.css({
  122. "-webkit-transform": b,
  123. "-mos-transform": b,
  124. "-o-transform": b,
  125. transform: b
  126. })) : i.css("filter", "progid:DXImageTransform.Microsoft.BasicImage(rotation=" + ~~ (e.rotation / 90 % 4 + 4) % 4 + ")")
  127. }),
  128. p.options.multiple && r.find(".fileinput-button").show(),
  129. f.insertBefore(r.find(".fileinput-button"))
  130. }
  131. function f(b) {
  132. var c = a("#" + b.id);
  133. delete percentages[b.id],
  134. g(),
  135. c.off().find(".file-panel").off().end().remove()
  136. }
  137. function g() {
  138. var b, c = 0,
  139. d = 0,
  140. e = w.children();
  141. a.each(percentages,
  142. function(a, b) {
  143. d += b[0],
  144. c += b[0] * b[1]
  145. }),
  146. b = d ? c / d: 0,
  147. e.eq(0).text(Math.round(100 * b) + "%"),
  148. e.eq(1).css("width", Math.round(100 * b) + "%"),
  149. h()
  150. }
  151. function h() {
  152. var a, b = "";
  153. if ("ready" === state) {
  154. if (p.options.isWechat) {
  155. if ("" == p.options.mode) var e = p.modalobj.find(".nav-pills li.active").attr("data-mode");
  156. else var e = p.options.mode;
  157. p.options.flag || (d.option("server", d.option("server") + "&mode=" + e + "&types=" + p.options.type), p.options.flag = 1)
  158. }
  159. b = "选中" + fileCount + typeUnit + j + ",共" + c.formatSize(fileSize) + "。"
  160. } else "confirm" === state ? (a = d.getStats(), a.uploadFailNum && (b = "已上传" + a.successNum + typeUnit + j + "," + a.uploadFailNum + typeUnit + j + '上传失败,<a class="retry" href="#">重新上传</a>失败' + j + '或<a class="ignore" href="#">忽略</a>')) : (a = d.getStats(), b = "共" + fileCount + typeUnit + "(" + c.formatSize(fileSize) + "),已上传" + a.successNum + typeUnit, a.uploadFailNum && (b += ",失败" + a.uploadFailNum + typeUnit));
  161. t.html(b)
  162. }
  163. function i(b) {
  164. var c;
  165. if (b !== state) {
  166. switch (u.removeClass("state-" + state), u.addClass("state-" + b), state = b, state) {
  167. case "pedding":
  168. v.removeClass("element-invisible"),
  169. r.hide(),
  170. d.refresh();
  171. break;
  172. case "ready":
  173. v.addClass("element-invisible"),
  174. p.options.isWechat && "video" == p.options.type && a("#upload form").removeClass("hide"),
  175. r.show(),
  176. d.refresh();
  177. break;
  178. case "uploading":
  179. w.show(),
  180. u.text("暂停上传");
  181. break;
  182. case "paused":
  183. w.show(),
  184. u.text("继续上传");
  185. break;
  186. case "confirm":
  187. if (w.hide(), u.text("开始上传").addClass("disabled"), c = d.getStats(), c.successNum && !c.uploadFailNum) return void i("finish");
  188. break;
  189. case "finish":
  190. if (u.removeClass("disabled"), c = d.getStats(), c.successNum) {
  191. if (d.uploadedFiles.length > 0) return p.finish(d.uploadedFiles),
  192. void d.resetUploader()
  193. } else state = "done",
  194. location.reload()
  195. }
  196. h()
  197. }
  198. }
  199. var j, k, l, m, n, o, p = this;
  200. switch (b) {
  201. case "image":
  202. j = "图片",
  203. typeUnit = "张",
  204. k = {
  205. title: "Images",
  206. extensions: "gif,jpg,jpeg,bmp,png,ico",
  207. mimeTypes: "image/*"
  208. },
  209. l = 30,
  210. m = 5242880,
  211. n = l * m,
  212. o = p.options.isWechat ? {
  213. quality: 80,
  214. preserveHeaders: !0,
  215. noCompressIfLarger: !0,
  216. compressSize: 1048576
  217. }: !1;
  218. break;
  219. case "audio":
  220. case "voice":
  221. j = "音频",
  222. typeUnit = "个",
  223. k = {
  224. title: "Audios",
  225. extensions: "mp3,wma,wav,amr",
  226. mimeTypes: "audio/*"
  227. },
  228. l = 30,
  229. m = 6291456,
  230. n = l * m,
  231. o = !1,
  232. p.options.isWechat && (l = 5, "temp" == p.options.mode ? (k.extensions = "mp3", m = 2097152, n = 10485760) : (m = 5242880, n = 26214400));
  233. break;
  234. case "video":
  235. j = "视频",
  236. typeUnit = "个",
  237. k = {
  238. title: "Video",
  239. extensions: "mpeg,mp4",
  240. mimeTypes: "video/*"
  241. },
  242. l = 30,
  243. m = 20971520,
  244. n = l * m,
  245. o = !1,
  246. p.options.isWechat && (l = 5, "temp" == p.options.mode ? (k.extensions = "mp4", m = 10485760, n = 52428800) : (m = 20971520, n = 104857600))
  247. }
  248. p.options.isWechat ? (p.options.flag = 0, p.modalobj.find("#li_upload_perm a").html("上传永久" + j), p.modalobj.find("#li_upload_temp a").html("上传临时" + j + "(保留3天)")) : p.modalobj.find("#li_upload a").html("上传" + j),
  249. p.modalobj.find(".modal-body").append(this.buildHtml().uploaderDialog);
  250. var q = a("#uploader"),
  251. r = a('<ul class="filelist"><li class="fileinput-button js-add-image" id="filePicker2" style="display:none;background:#fff!important;border:solid 1px #ebebeb;display:flex;"> <a href="javascript:;" class="fileinput-button-icon">+</a></li></ul>').appendTo(q.find(".queueList")),
  252. s = q.find(".statusBar"),
  253. t = s.find(".info"),
  254. u = q.find(".uploadBtn"),
  255. v = q.find(".placeholder"),
  256. w = s.find(".progress").hide();
  257. q.find(".btn-primary");
  258. fileCount = 0,
  259. fileSize = 0,
  260. ratio = window.devicePixelRatio || 1,
  261. thumbnailWidth = 110 * ratio,
  262. thumbnailHeight = 110 * ratio,
  263. state = "pedding",
  264. percentages = {},
  265. supportTransition = function() {
  266. var a = document.createElement("p").style,
  267. b = "transition" in a || "WebkitTransition" in a || "MozTransition" in a || "msTransition" in a || "OTransition" in a;
  268. return a = null,
  269. b
  270. } (),
  271. d;
  272. var x = {
  273. pick: {
  274. id: "#filePicker",
  275. label: "点击选择" + j,
  276. multiple: !0
  277. },
  278. dnd: "#dndArea",
  279. paste: "#uploader",
  280. swf: "./resource/componets/webuploader/Uploader.swf",
  281. server: p.options.isWechat ? "./index.php?c=utility&a=wechat_file&do=upload": "./index.php?c=utility&a=file&do=upload&upload_type=" + b,
  282. compress: o,
  283. accept: k,
  284. fileNumLimit: l,
  285. fileSizeLimit: n,
  286. fileSingleSizeLimit: m,
  287. threads:1
  288. };
  289. x = a.extend({},
  290. x, p.options.uploader),
  291. x.pick.multiple = p.options.multiple,
  292. x.isWechat = p.options.isWechat,
  293. x.type = p.options.type,
  294. "audio" == b || "voice" == b ? p.options.isWechat ? a("#dndArea p").html("临时语音只支持amr/mp3格式,大小不超过为2M,长度不超过60秒<br>永久语音只支持mp3/wma/wav/amr格式,大小不超过为5M,长度不超过60秒") : a("#dndArea p").html("最大支持 " + c.formatSize(x.fileSingleSizeLimit) + " MB 以内的语音 (" + x.accept.extensions + " 格式)") : "video" == b && (p.options.isWechat ? a("#dndArea p").html("临时视频只支持mp4格式,大小不超过为10M<br>永久视频只支持rm/rmvb/wmv/avi/mpg/mpeg/mp4格式,大小不超过为20M") : a("#dndArea p").html("最大支持 " + c.formatSize(x.fileSingleSizeLimit) + " MB 以内的视频 (" + x.accept.extensions + " 格式)")),
  295. p.options.fileSizeLimit && (x.fileSizeLimit = p.options.fileSizeLimit),
  296. console.dir(x),
  297. d = c.create(x),
  298. d.uploadedFiles = [],
  299. d.addButton({
  300. id: "#filePicker2",
  301. innerHTML:`<div style="color:#ebebeb;font-size:48px;line-height:96px;">+</div>`,
  302. label: "+",
  303. multiple: p.options.multiple
  304. }),
  305. k = 0,
  306. d.resetUploader = function() {
  307. if (fileCount = 0, fileSize = 0, k = 0, d.uploadedFiles = [], a.each(d.getFiles(),
  308. function(a, b) {
  309. f(b)
  310. }), p.options.isWechat) {
  311. p.options.video && (a("#upload :text[name='title']").val(""), a("#upload :text[name='introduction']").val("")),
  312. g(),
  313. d.reset(),
  314. d.refresh(),
  315. a("#dndArea").removeClass("element-invisible"),
  316. a("#uploader").find(".filelist").empty(),
  317. a("#filePicker").find(".webuploader-pick").next().css({
  318. left: "190px"
  319. });
  320. var b = a("#uploader").find(".statusBar");
  321. b.find(".info").empty(),
  322. b.find(".accept").empty(),
  323. b.hide()
  324. } else d.refresh(),
  325. d.reset(),
  326. u.removeClass("disabled"),
  327. i("pedding")
  328. },
  329. d.onUploadProgress = function(b, c) {
  330. var d = a("#" + b.id),
  331. e = d.find(".progress span");
  332. e.css("width", 100 * c + "%"),
  333. percentages[b.id][1] = c,
  334. fileid = b.id,
  335. g()
  336. },
  337. d.onFileQueued = function(a) {
  338. fileCount++,
  339. fileSize += a.size,
  340. 1 === fileCount && (v.addClass("element-invisible"), s.show()),
  341. e(a),
  342. i("ready"),
  343. g()
  344. },
  345. d.onFileDequeued = function(a) {
  346. fileCount--,
  347. fileSize -= a.size,
  348. fileCount || i("pedding"),
  349. f(a),
  350. g()
  351. },
  352. d.on("all",
  353. function(a) {
  354. switch (a) {
  355. case "uploadFinished":
  356. i("confirm");
  357. break;
  358. case "startUpload":
  359. i("uploading");
  360. break;
  361. case "stopUpload":
  362. i("paused")
  363. }
  364. }),
  365. d.on("uploadSuccess",
  366. function(b, c) {
  367. return c.message ? (alert(c.message), void d.resetUploader()) : void((c.attachment || c.media_id) && (k++, d.uploadedFiles.push(c), a("#" + b.id).append('<span class="success" style="line-height: 50px;">' + c.width + "x" + c.height + "</span>"), a(".accept").text("成功上传 " + k + " " + typeUnit + j)))
  368. }),
  369. d.onError = function(a) {
  370. return "Q_EXCEED_SIZE_LIMIT" == a ? void alert("错误信息: " + j + "大于 " + c.formatSize(x.fileSizeLimit) + " 无法上传.") : "F_DUPLICATE" == a ? void alert("错误信息: 不能重复上传" + j + ".") : void alert("Eroor: " + a)
  371. },
  372. u.on("click",
  373. function() {
  374. if (a(this).hasClass("disabled")) return ! 1;
  375. if ("pedding" != state && d.options.isWechat && "video" == d.options.type) {
  376. var b = a('#upload :text[name="title"]').val(),
  377. c = a('#upload textarea[name="introduction"]').val();
  378. if (!b) return util.message("视频标题不能为空"),
  379. !1;
  380. if (!c) return util.message("视频描述不能为空"),
  381. !1;
  382. d.option("formData", {
  383. title: b,
  384. introduction: c
  385. })
  386. }
  387. "ready" === state ? d.upload() : "paused" === state ? d.upload() : "uploading" === state && d.stop()
  388. }),
  389. t.on("click", ".retry",
  390. function() {
  391. d.retry()
  392. }),
  393. t.on("click", ".ignore",
  394. function() {}),
  395. u.addClass("state-" + state),
  396. g()
  397. },
  398. initImageUploader: function() {
  399. this.initUploader("image")
  400. },
  401. initAudioUploader: function() {
  402. this.initUploader("audio")
  403. },
  404. initVoiceUploader: function() {
  405. this.initUploader("voice")
  406. },
  407. initVideoUploader: function() {
  408. this.initUploader("video")
  409. },
  410. initRemote: function() {
  411. var b = this;
  412. b.modalobj.find("#li_network").removeClass("hide"),
  413. b.modalobj.find(".modal-body").append(b.buildHtml().remoteDialog),
  414. b.modalobj.find(".btn-primary").click(function() {
  415. var c = b.modalobj.find("#networkurl").val();
  416. c.length > 0 && "image" == b.options.type && a.getJSON("./index.php?c=utility&a=file&do=fetch", {
  417. url: c
  418. },
  419. function(a) {
  420. a.message && alert(a.message),
  421. a && (b.finish([a]), a = {})
  422. })
  423. })
  424. },
  425. initVideoRemote: function() {
  426. function b(b) {
  427. if (b) {
  428. var e = c(b);
  429. e = d(e),
  430. a("#preview").html('<div style="position:absolute;top:0;margin:0;padding:120px 50px;width:100%;height:100%;font-size:20px;"><span>只支持 腾讯,优酷,土豆视频,如无法预览视频,请前往视频网址处的分享区域,复制通用地址到编辑器内部!</span></div><iframe src="' + e + '" allowfullscreen="true" style="border:0;position:absolute;top:0;left:0;margin:0;padding:0;width:100%;height:100%;"></iframe>')
  431. }
  432. }
  433. function c(a) {
  434. if (!a) return "";
  435. var b, c;
  436. if (a.indexOf("v.qq.com") >= 0) {
  437. if (b = a.match(/vid\=([^\&]*)($|\&)/), b ? c = "http://v.qq.com/iframe/player.html?vid=" + b[1] + "&tiny=0&auto=0": (b = a.match(/\/([0-9a-zA-Z]+).html/), b && (c = "http://v.qq.com/iframe/player.html?vid=" + b[1] + "&tiny=0&auto=0")), !b) return
  438. } else if (a.indexOf("v.youku.com") >= 0) b = a.match(/id_(.*)\.html/),
  439. c = "http://player.youku.com/embed/" + b[1];
  440. else {
  441. if (! (a.indexOf("tudou.com") >= 0)) return;
  442. b = a.match(/\/([-\w]+)/g),
  443. b = b[b.length - 1].substring(1),
  444. c = "http://www.tudou.com/programs/view/html5embed.action?code=" + b
  445. }
  446. return c
  447. }
  448. function d(a, b) {
  449. return a ? a.replace(b || /[<">']/g,
  450. function(a) {
  451. return {
  452. "<": "&lt;",
  453. "&": "&amp;",
  454. '"': "&quot;",
  455. ">": "&gt;",
  456. "'": "&#39;"
  457. } [a]
  458. }) : ""
  459. }
  460. var e = this;
  461. e.modalobj.find("#li_network").removeClass("hide"),
  462. e.modalobj.find(".modal-body").append(e.buildHtml().remoteVideoDialog),
  463. e.modalobj.find("#networkurl").blur(function() {
  464. var c = a(this).val();
  465. c.length > 0 ? b(c) : a("#preview").html("")
  466. }),
  467. e.modalobj.find(".btn-primary").click(function() {
  468. var a = e.modalobj.find("#networkurl").val();
  469. if (a.length > 0 && "video" == e.options.type) {
  470. var b = c(a);
  471. b = d(b),
  472. e.finish([{
  473. url: b,
  474. isRemote: !0
  475. }])
  476. }
  477. })
  478. },
  479. initLocal: function() {
  480. var a = this;
  481. a.modalobj.find("#li_history_image").removeClass("hide"),
  482. a.modalobj.find(".modal-body").append(this.buildHtml().localDialog),
  483. a.localPage(1)
  484. },
  485. localPage: function(c) {
  486. var d = this;
  487. if (d.options.isWechat) var e = d.options.type,
  488. f = d.options.mode,
  489. g = "./index.php?c=utility&a=wechat_file&do=browser",
  490. h = {
  491. page: c,
  492. type: e,
  493. mode: f,
  494. psize: 32
  495. };
  496. else var i = d.modalobj.find("#select-year .btn-info").data("id"),
  497. j = d.modalobj.find("#select-month .btn-info").data("id"),
  498. g = "./index.php?c=utility&a=file&do=image&local=local&group_id=-999",
  499. h = {
  500. page: c,
  501. year: i,
  502. month: j,
  503. psize: 32
  504. };
  505. var k = d.modalobj.find("#history_image");
  506. return a.getJSON(g, h,
  507. function(c) {
  508. c = c.message.message,
  509. k.find(".history-content").css("text-align", "center").html('<i class="fa fa-spinner fa-pulse fa-5x"></i>'),
  510. k.find("#image-list-pager").html(""),
  511. b.isEmpty(c.items) ? k.find(".history-content").css("text-align", "left").html('<i class="fa fa-info-circle"></i> 暂无数据') : (k.data("attachment", c.items),
  512. k.find(".history-content").empty(),
  513. k.find(".history-content").html(b.template(d.buildHtml().localDialogLi)(c)),
  514. k.find("#image-list-pager").html(c.pager),
  515. k.find(".pagination a").click(function() {
  516. d.localPage(a(this).attr("page"))
  517. }), k.find(".img-list li").click(function(b) {
  518. d.selectImage(a(b.target).parents("li"))
  519. }), d.options.isWechat ? d.weixinDeletefile() : d.deletefile())
  520. }),
  521. d.options.isWechat || d.modalobj.find(".btn-select").unbind("click").click(function() {
  522. return a(this).hasClass("btn-info") ? !1 : ("month" == a(this).data("type") && a(this).data("id") > 0 && (d.modalobj.find("#select-year .btn-info").data("id") || (d.modalobj.find("#select-year .btn-select").removeClass("btn-info"), d.modalobj.find("#select-year .btn-select").eq(1).addClass("btn-info"))), a(this).siblings().removeClass("btn-info"), a(this).addClass("btn-info"), void d.localPage(1))
  523. }),
  524. k.find(".btn-primary").unbind("click").click(function() {
  525. var b = [];
  526. k.find(".img-item-selected").each(function() {
  527. var dd = d.modalobj.find("#history_image").data("attachment");
  528. for (cc in dd) {
  529. if (dd[cc].id == a(this).attr("attachid")) {
  530. var ee = dd[cc];
  531. }
  532. };
  533. b.push(ee),
  534. a(this).removeClass("img-item-selected")
  535. }),
  536. d.finish(b)
  537. }),
  538. !1
  539. },
  540. deletefile: function() {
  541. var b = this;
  542. b.modalobj.find("#history_image .img-list li .btnClose").unbind().click(function() {
  543. var b = a(this),
  544. c = a(this).data("id");
  545. return c ? (a.post("./index.php?c=utility&a=file&do=delete", {
  546. id: c
  547. },
  548. function(a) {
  549. (b.parent().remove(), util.message("删除成功", "", "success"))
  550. }), !1) : !1
  551. })
  552. },
  553. weixinDeletefile: function() {
  554. var b = this;
  555. b.modalobj.find(".history .delete-file").off("click"),
  556. b.modalobj.find(".history .delete-file").on("click",
  557. function(b) {
  558. var c = a(this);
  559. if (confirm("确定要删除文件吗?")) {
  560. var d = a(this).parent().attr("attachid"),
  561. e = a(this).parent().attr("data-type");
  562. a.post("./index.php?c=utility&a=wechat_file&do=delete", {
  563. id: d
  564. },
  565. function(b) {
  566. var b = a.parseJSON(b);
  567. return b.error ? void("image" == e ? c.parent().remove() : "audio" != e && "voice" != e && "video" != e || c.parents("tr").remove()) : (util.message(b.message), !1)
  568. })
  569. }
  570. b.stopPropagation()
  571. })
  572. },
  573. selectImage: function(b) {
  574. var c = this;
  575. a(b).toggleClass("img-item-selected"),
  576. c.options.isWechat ? c.options.direct && c.modalobj.find("#history_image").find(".btn-primary").trigger("click") : c.options.multiple || c.modalobj.find("#history_image").find(".btn-primary").trigger("click")
  577. },
  578. initLocalAudio: function() {
  579. var a = this;
  580. a.modalobj.find("#li_history_audio").removeClass("hide"),
  581. a.modalobj.find(".modal-body").append(this.buildHtml().localAudioDialog),
  582. a.localAudioPage(1)
  583. },
  584. localAudioPage: function(c) {
  585. var d = this;
  586. if (d.options.isWechat) var e = d.options.type,
  587. f = d.options.mode,
  588. g = "./index.php?c=utility&a=wechat_file&do=browser",
  589. h = {
  590. page: c,
  591. type: e,
  592. mode: f,
  593. psize: 5
  594. };
  595. else var g = "./index.php?c=utility&a=file&do=local&type=audio&pagesize=5",
  596. h = {
  597. page: c
  598. };
  599. var i = d.modalobj.find("#history_audio");
  600. return a.getJSON(g, h,
  601. function(c) {
  602. c = c.message,
  603. i.find(".history-content").html('<i class="fa fa-spinner fa-pulse"></i>'),
  604. b.isEmpty(c.items) ? i.find(".history-content").css("text-align", "center").html('<i class="fa fa-info-circle"></i> 暂无数据') : (i.data("attachment", c.items), i.find(".history-content").empty(), i.find(".history-content").html(b.template(d.buildHtml()[d.options.isWechat ? "weixin_localAudioDialogLi": "localAudioDialogLi"])(c)), i.find("#image-list-pager").html(c.page), i.find(".pagination a").click(function() {
  605. d.localAudioPage(a(this).attr("page"))
  606. }), i.find(".js-btn-select").click(function(b) {
  607. a(b.target).toggleClass("btn-primary"),
  608. d.options.isWechat ? d.options.direct && d.modalobj.find("#history_audio").find(".modal-footer .btn-primary").trigger("click") : d.options.multiple || d.modalobj.find("#history_audio").find(".modal-footer .btn-primary").trigger("click")
  609. }), d.playAudio(), d.options.isWechat && d.weixinDeletefile())
  610. }),
  611. i.find(".modal-footer .btn-primary").unbind("click").click(function() {
  612. var b = [];
  613. i.find(".history-content .btn-primary").each(function() {
  614. b.push(d.modalobj.find("#history_audio").data("attachment")[a(this).attr("attachid")]),
  615. a(this).removeClass("btn-primary")
  616. }),
  617. d.finish(b)
  618. }),
  619. !1
  620. },
  621. playAudio: function() {
  622. var b = this,
  623. c = b.modalobj.find("#history_audio");
  624. a(".audio-player-play").click(function() {
  625. var b = a(this).attr("attach");
  626. if (b) {
  627. if (a("#player")[0]) var d = a("#player");
  628. else {
  629. var d = a('<div id="player"></div>');
  630. a(document.body).append(d)
  631. }
  632. d.data("control", a(this)),
  633. d.jPlayer({
  634. playing: function() {
  635. a(this).data("control").find("p").removeClass("fa-play").addClass("fa-stop")
  636. },
  637. pause: function(b) {
  638. a(this).data("control").find("p").removeClass("fa-stop").addClass("fa-play")
  639. },
  640. swfPath: "resource/components/jplayer",
  641. supplied: "mp3,wma,wav,amr",
  642. solution: "html, flash"
  643. }),
  644. d.jPlayer("setMedia", {
  645. mp3: a(this).attr("attach")
  646. }).jPlayer("play"),
  647. a(this).find("p").hasClass("fa-stop") ? d.jPlayer("stop") : (c.find(".fa-stop").removeClass("fa-stop").addClass("fa-play"), d.jPlayer("setMedia", {
  648. mp3: a(this).attr("attach")
  649. }).jPlayer("play"))
  650. }
  651. })
  652. },
  653. initLocalVoice: function() {
  654. this.initLocalAudio()
  655. },
  656. initLocalVideo: function() {
  657. var a = this;
  658. a.modalobj.find("#li_history_video").removeClass("hide"),
  659. a.modalobj.find(".modal-body").append(this.buildHtml().localVideoDialog),
  660. a.localVideoPage(1)
  661. },
  662. localVideoPage: function(c) {
  663. var d = this;
  664. if (d.options.isWechat) var e = d.options.type,
  665. f = "./index.php?c=utility&a=wechat_file&do=browser",
  666. g = {
  667. page: c,
  668. type: e,
  669. psize: 5
  670. };
  671. else var f = "./index.php?c=utility&a=file&do=video&local=local&type=video&pagesize=5",
  672. g = {
  673. page: c
  674. };
  675. var h = d.modalobj.find("#history_video");
  676. return a.getJSON(f, g,
  677. function(c) {
  678. c = c.message.message,
  679. b.isEmpty(c.items) ? c : c.items = d.foritem(c.items),
  680. h.find(".history-content").html('<i class="fa fa-spinner fa-pulse"></i>'),
  681. b.isEmpty(c.items) ? h.find(".history-content").css("text-align", "left").html('<i class="fa fa-info-circle"></i> 暂无数据') : (h.data("attachment", c.items), h.find(".history-content").empty(), h.find(".history-content").html(b.template(d.buildHtml()[d.options.isWechat ? "weixin_localVideoDialogLi": "localVideoDialogLi"])(c)), h.find("#image-list-pager").html(c.page), h.find(".pagination a").click(function() {
  682. d.localVideoPage(a(this).attr("pager"))
  683. }), h.find(".js-btn-select").click(function(b) {
  684. a(b.target).toggleClass("btn-primary"),
  685. d.options.isWechat ? d.options.direct && d.modalobj.find("#history_video").find(".modal-footer .btn-primary").trigger("click") : d.options.multiple || d.modalobj.find("#history_video").find(".modal-footer .btn-primary").trigger("click")
  686. }), d.deletevideofile())
  687. }),
  688. h.find(".modal-footer .btn-primary").unbind("click").click(function() {
  689. var b = [];
  690. h.find(".history-content .btn-primary").each(function() {
  691. var dd = d.modalobj.find("#history_video").data("attachment");
  692. for (cc in dd) {
  693. if (dd[cc].id == a(this).attr("attachid")) {
  694. var ee = dd[cc];
  695. }
  696. };
  697. b.push(ee),
  698. a(this).removeClass("btn-primary")
  699. }),
  700. d.finish(b)
  701. }),
  702. !1
  703. },
  704. deletevideofile: function() {
  705. var b = this;
  706. b.modalobj.find("#history_video .history-content td .delete-video-file").unbind().click(function() {
  707. if (confirm("确定要删除文件吗?")) {
  708. var b = a(this),
  709. c = a(this).data("id");
  710. return c ? (a.post("./index.php?c=utility&a=file&do=delete", {
  711. id: c
  712. },
  713. function(a) {
  714. (b.parents('tr').remove(), util.message("删除成功", "", "success"))
  715. }), !1) : !1
  716. }
  717. })
  718. },
  719. finish: function(b) {
  720. var c = this;
  721. a.isFunction(c.options.callback) && (0 == c.options.multiple ? c.options.callback(b[0]) : c.options.callback(b), c.modalobj.modal("hide"))
  722. },
  723. foritem: function(items) {
  724. var d = this;
  725. for (obj in items) {
  726. items[obj].createtime = d.getdate(items[obj].createtime)
  727. }
  728. return items
  729. },
  730. getdate: function(date) {
  731. var now = new Date(date * 1000),
  732. y = now.getFullYear(),
  733. m = now.getMonth() + 1,
  734. day = now.getDate();
  735. return y + "-" + (m < 10 ? "0" + m : m) + "-" + (day < 10 ? "0" + day : day) + " " + now.toTimeString().substr(0, 8)
  736. },
  737. buildHtml: function() {
  738. var a = {};
  739. var myDate = new Date();
  740. var abcd = '';
  741. for (var i = myDate.getFullYear(); i > 2012; i--) {
  742. abcd += '<a href="javascript:;" data-id="' + i + '" data-type="year" class="btn btn-default btn-select">' + i + '年</a>'
  743. }
  744. return a.mainDialog = '<div id="modal-webuploader" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">\n <div class="modal-dialog" style="width:45%">\n <div class="modal-content">\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>\n <ul class="nav nav-pills" role="tablist">\n <li id="li_upload" ' + (!this.options.isWechat && this.options.allowUploadVideo ? 'class="active"': 'class="hide"') + ' role="presentation"><a href="#upload" aria-controls="upload" role="tab" data-toggle="tab" onclick="$(\'#select\').hide();">上传</a></li>\n <li id="li_upload_perm" ' + (this.options.isWechat ? 'class="active"': 'class="hide"') + ' data-mode="perm" role="presentation"><a href="#upload" aria-controls="upload" role="tab" data-toggle="tab" onclick="$(\'#select\').hide();">上传</a></li>\n <li id="li_upload_temp" ' + (this.options.isWechat ? "": 'class="hide"') + 'data-mode="temp" role="presentation"><a href="#upload" aria-controls="upload" role="tab" data-toggle="tab" onclick="$(\'#select\').hide();">上传</a></li>\n <li id="li_network" ' + (this.options.allowUploadVideo ? 'class="hide"': 'class="active"') + ' role="presentation"><a href="#network" aria-controls="network" role="tab" data-toggle="tab" onclick="$(\'#select\').hide();">提取网络' + ("video" == this.options.type ? "视频": "图片") + '</a></li>\n <li id="li_history_image" class="hide" role="presentation"><a href="#history_image" aria-controls="history_image" role="tab" data-toggle="tab" onclick="$(\'#select\').show();">浏览图片</a></li>\n <li id="li_history_audio" class="hide" role="presentation"><a href="#history_audio" aria-controls="history_audio" role="tab" data-toggle="tab" onclick="$(\'#select\').hide();">浏览音频</a></li>\n <li id="li_history_video" class="hide" role="presentation"><a href="#history_video" aria-controls="history_video" role="tab" data-toggle="tab">浏览视频</a></li>\n </ul>\n </div>\n' + (this.options.isWechat ? "": ' <div id="select" style="display: none;margin:10px 0 -10px 15px; padding-left:7px;"> <div id="select-year" style="margin-bottom:10px;"> <div class="btn-group"> <a href="javascript:;" data-id="0" data-type="year" class="btn btn-default btn-info btn-select">不限</a> '+abcd+' </div> </div> <div id="select-month"> <div class="btn-group"> <a href="javascript:;" data-id="0" data-type="month" class="btn btn-default btn-info btn-select">不限</a> <a href="javascript:;" data-id="1" data-type="month" class="btn btn-default btn-select">1</a> <a href="javascript:;" data-id="2" data-type="month" class="btn btn-default btn-select">2</a> <a href="javascript:;" data-id="3" data-type="month" class="btn btn-default btn-select">3</a> <a href="javascript:;" data-id="4" data-type="month" class="btn btn-default btn-select">4</a> <a href="javascript:;" data-id="5" data-type="month" class="btn btn-default btn-select">5</a> <a href="javascript:;" data-id="6" data-type="month" class="btn btn-default btn-select">6</a> <a href="javascript:;" data-id="7" data-type="month" class="btn btn-default btn-select">7</a> <a href="javascript:;" data-id="8" data-type="month" class="btn btn-default btn-select">8</a> <a href="javascript:;" data-id="9" data-type="month" class="btn btn-default btn-select">9</a> <a href="javascript:;" data-id="10" data-type="month" class="btn btn-default btn-select">10</a> <a href="javascript:;" data-id="11" data-type="month" class="btn btn-default btn-select">11</a> <a href="javascript:;" data-id="12" data-type="month" class="btn btn-default btn-select">12</a> </div> </div> </div>') + ' <div class="modal-body tab-content " style="height:90%;"></div>\n </div>\n </div>\n</div>',
  745. a.uploaderDialog = '<div role="tabpanel" class="tab-pane upload active" id="upload">\n' + (this.options.isWechat && "video" == this.options.type ? '<form class="form-horizontal hide" style="padding-right:10px;"> <div class="form-group"> <label class="col-xs-12 col-sm-2 control-label">视频标题</label> <div class="col-sm-10"> <input type="text" name="title" class="form-control" placeholder="视频标题"> </div> </div> <div class="form-group"> <label class="col-xs-12 col-sm-2 control-label">视频描述</label> <div class="col-sm-10"> <textarea name="introduction" class="form-control" placeholder="视频描述"></textarea> </div> </div></form>': "") + ' <div id="uploader" class="uploader">\n <div class="queueList">\n <div id="dndArea" class="placeholder">\n <div id="filePicker">xx</div>\n' + (this.options.multiple ? '<p id="">或将照片拖到这里,单次最多可选' + (this.options.isWechat ? 5 : 30) + "张</p>\n": '<p id="">或将照片拖到这里</p>\n') + ' </div>\n </div>\n <div class="statusBar">\n <div class="infowrap">\n <div class="progress">\n <span class="text">0%</span>\n <span class="percentage"></span>\n </div>\n <div class="info"></div>\n <div class="accept"></div>\n </div>\n <div class="btns">\n <div class="uploadBtn btn btn-primary" style="margin-top: 4px;">确定使用</div>\n <div class="modal-button-upload" style="float: right; margin-left: 5px;">\n <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>\n </div>\n </div>\n </div>\n </div>\n</div>',
  746. a.remoteDialog = '<div role="tabpanel" class="tab-pane network" id="network">\n <div style="margin-top: 10px;">\n <form>\n <div class="form-group">\n <input type="url" class="form-control" id="networkurl" placeholder="请输入网络图片地址">\n <input type="hidden" name="network_attachment" value="" >\n <div id="network-img" class="network-img" style="background-image:url(\'{php echo tomedia(\'images/global/nopic.jpg\');}\')">\n <span class="network-img-sizeinfo" id="network-img-sizeinfo"></span>\n </div>\n </div>\n </form>\n </div>\n <div class="modal-footer">\n <button type="button" class="btn btn-primary">确认</button>\n <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>\n </div>\n</div>',
  747. a.remoteVideoDialog = '<div role="tabpanel" class="tab-pane network' + (this.options.allowUploadVideo ? " ": " active") + '" id="network">\n <div style="margin-top: 10px;">\n <form>\n <div class="form-group">\n <div style="margin: -10px 0 10px 0;">为了在微信中有更好的体验,推荐使用<a href="http://v.qq.com" target="_blank">腾讯视频</a></div>\n <input type="url" class="form-control" id="networkurl" placeholder="请输入网络视频地址">\n <div id="preview" ' +
  748. 'ccc;">\n </div>\n </div>\n </form>\n </div>\n <div class="modal-footer">\n <button type="button" class="btn btn-primary">确认</button>\n <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>\n </div>\n</div>',
  749. a.localDialog = '<div role="tabpanel" class="tab-pane history" id="history_image">\n <div class="history-content" style="height:100%"></div>\n <div class="modal-footer">\n <div style="float: left;">\n <nav id="image-list-pager">\n <ul class="pager" style="margin: 0;"></ul>\n </nav>\n </div>\n <div style="float: right;">\n <button ' + (this.options.multiple ? "": 'style="display:none;"') + ' type="button" class="btn btn-primary">确认</button>\n' + (this.options.multiple ? '<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>\n': "") + " </div>\n </div>\n</div>",
  750. a.localDialogLi = '<ul class="img-list clearfix">\n<%var items = _.sortBy(items, function(item) {return -item.id;});%><%_.each(items, function(item) {%> \n<li class="img-item" attachid="<%=item.id%>" title="<%=item.filename%>">\n <div class="img-container" style="background-image: url(\'<%=item.url%>\');">\n <div class="select-status"><span></span></div>\n </div>\n <div class="btnClose" data-id="<%=item.id%>"><a href=""><i class="fa fa-times"></i></a></div>\n</li>\n<%});%>\n</ul>',
  751. a.weixin_localDialogLi = '<ul class="img-list clearfix">\n<%_.each(items, function(item) {%> \n<li class="img-item" attachid="<%=item.id%>" data-type="image" title="<%=item.filename%>">\n <div class="btnClose delete-file"><a href="javascript:;"><i class="fa fa-times"></i></a></div> <div class="img-container" style="background-image: url(\'<%=item.url%>\');">\n <div class="select-status"><span></span></div>\n </div>\n</li>\n<%});%>\n</ul>',
  752. a.localAudioDialog = '<div role="tabpanel" class="tab-pane history" id="history_audio">\n <div style="height:100%">\n <table class="table table-hover">\n <thead class="navbar-inner">\n <tr>\n <th>标题</th>\n' + (this.options.isWechat ? ' <th style="width:30%;text-align:right">创建时间</th>\n <th style="width:30%;text-align:right">\n <div class="input-group input-group-sm hide">\n': ' <th style="width:20%;">创建时间</th>\n <th style="width:30%;">\n <div class="input-group input-group-sm">\n') + ' <input type="text" class="form-control">\n <span class="input-group-btn">\n <button class="btn btn-default" type="button"><i class="fa fa-search" style="font-size:12px; margin-top:0;"></i></button>\n </span>\n </div>\n </th>\n </tr>\n </thead>\n <tbody class="history-content">\n </tbody>\n </table></div>\n <div class="modal-footer">\n <div style="float: left;">\n <nav id="image-list-pager">\n <ul class="pager" style="margin: 0;"></ul>\n </nav>\n </div>\n <div style="float: right;">\n <button ' + (this.options.multiple ? "": 'style="display:none;"') + ' type="button" class="btn btn-primary">确认</button>\n' + (this.options.multiple ? '<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>\n': "") + " </div>\n </div>\n</div>",
  753. a.localAudioDialogLi = '<%var items = _.sortBy(items, function(item) {return -item.id;});%><%_.each(items, function(item) {%> \n<tr>\n <td><a href="#" title="<%=item.filename%>"><%=item.filename%></a></td>\n <td class="text-right"><%=item.createtime%></td>\n <td class="text-right">\n <span class="input-group-btn">\n <button class="btn btn-default audio-player-play" type="button" attach="<%=item.url%>"><p style="margin:0px;" class="fa fa-play"></p></button>\n <button attachid="<%=item.id%>" class="btn btn-default js-btn-select">选取</button>\n </span>\n </td>\n</tr>\n<%});%>\n',
  754. a.weixin_localAudioDialogLi = '<%var items = _.sortBy(items, function(item) {return -item.id;});%><%_.each(items, function(item) {%> \n<tr>\n <td><a href="<%=item.url%>" target="blank" title="<%=item.filename%>"><%=item.filename%></a></td>\n <td class="text-right"><%=item.createtime%></td>\n <td class="text-right">\n <span class="input-group-btn" attachid="<%=item.id%>" data-type="audio">\n <button class="btn btn-default audio-player-play" type="button" attach="<%=item.url%>"><p style="margin:0px;" class="fa fa-play"></p></button>\n <button class="btn btn-default delete-file">删除</button>\n <button attachid="<%=item.id%>" class="btn btn-default js-btn-select">选取</button>\n </span>\n </td>\n</tr>\n<%});%>\n',
  755. a.localVideoDialog = '<div role="tabpanel" class="tab-pane history" id="history_video">\n <div style="height:100%">\n <table class="table table-hover">\n <thead class="navbar-inner">\n <tr>\n <th>标题</th>\n <th style="width:30%;text-align:right">创建时间</th>\n <th style="width:30%;text-align:right">\n <div class="input-group input-group-sm hide">\n <input type="text" class="form-control">\n <span class="input-group-btn">\n <button class="btn btn-default" type="button"><i class="fa fa-search" style="font-size:12px; margin-top:0;"></i></button>\n </span>\n </div>\n </th>\n </tr>\n </thead>\n <tbody class="history-content">\n </tbody>\n </table></div>\n <div class="modal-footer">\n <div style="float: left;">\n <nav id="image-list-pager">\n <ul class="pager" style="margin: 0;"></ul>\n </nav>\n </div>\n <div style="float: right;">\n <button ' + (this.options.multiple ? "": 'style="display:none;"') + ' type="button" class="btn btn-primary">确认</button>\n' + (this.options.multiple ? '<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>\n': "") + " </div>\n </div>\n</div>",
  756. a.localVideoDialogLi = '<%var items = _.sortBy(items, function(item) {return -item.id;});%><%_.each(items, function(item) {%> \n<tr>\n <td><a href="#" title="<%=item.filename%>"><%=item.filename%></a></td>\n <td class="text-right"><%=item.createtime%></td>\n <td class="text-right">\n <span class="input-group-btn">\n <button data-id="<%=item.id%>" class="btn btn-default delete-video-file">删除</button>\n <button attachid="<%=item.id%>" class="btn btn-default js-btn-select">选取</button>\n </span>\n </td>\n</tr>\n<%});%>\n',
  757. a.weixin_localVideoDialogLi = '<%var items = _.sortBy(items, function(item) {return -item.id;});%><%_.each(items, function(item) {%> \n<tr>\n <td><a href="<%=item.url%>" target="blank" title="<%=item.filename%>"><%=item.filename%></a></td>\n <td class="text-right"><%=item.createtime%></td>\n <td class="text-right">\n <span class="input-group-btn" attachid="<%=item.id%>" data-type="audio">\n <button class="btn btn-default delete-file">删除</button>\n <button attachid="<%=item.id%>" class="btn btn-default js-btn-select">选取</button>\n </span>\n </td>\n</tr>\n<%});%>\n',
  758. a
  759. }
  760. };
  761. return d
  762. });