').html(lang.errorNotSupport)).hide();
- return;
- } else if (!editor.getOpt('videoActionName')) {
- $('#filePickerReady').after($('
').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('videoFieldName'),
- duplicate: true,
- fileSingleSizeLimit: fileMaxSize,
- compress: false
- });
- uploader.addButton({
- id: '#filePickerBlock'
- });
- uploader.addButton({
- id: '#filePickerBtn',
- label: lang.uploadAddFile
- });
-
- setState('pedding');
-
- // 当有文件添加进来时执行,负责view的创建
- function addFile(file) {
- var $li = $('
' +
- '' + file.name + '
' +
- '
' +
- '
' +
- ' '),
-
- $btns = $('
' +
- '' + lang.uploadDelete + ' ' +
- '' + lang.uploadTurnRight + ' ' +
- '' + lang.uploadTurnLeft + '
').appendTo($li),
- $prgress = $li.find('p.progress span'),
- $wrap = $li.find('p.imgWrap'),
- $info = $('
').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('
' +
- '
' + file.name + ' ');
- } 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 = $('
');
- $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参数
- 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);
- if (json.state == 'SUCCESS') {
- uploadVideoList.push({
- 'url': json.url,
- 'type': json.type,
- 'original':json.original
- });
- $file.append('
');
- } 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, file) {
- if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') {
- addFile(file);
- }
- });
- 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();
- }
- };
-
-})();
diff --git a/www/js/ueditor/lang/en/en.js b/www/js/ueditor/lang/en/en.js
deleted file mode 100644
index e72143693c..0000000000
--- a/www/js/ueditor/lang/en/en.js
+++ /dev/null
@@ -1,684 +0,0 @@
-/**
- * Created with JetBrains PhpStorm.
- * User: taoqili
- * Date: 12-6-12
- * Time: 下午6:57
- * To change this template use File | Settings | File Templates.
- */
-UE.I18N['en'] = {
- 'labelMap':{
- 'anchor':'Anchor', 'undo':'Undo', 'redo':'Redo', 'bold':'Bold', 'indent':'Indent', 'snapscreen':'SnapScreen',
- 'italic':'Italic', 'underline':'Underline', 'strikethrough':'Strikethrough', 'subscript':'SubScript','fontborder':'text border',
- 'superscript':'SuperScript', 'formatmatch':'Format Match', 'source':'Source', 'blockquote':'BlockQuote',
- 'pasteplain':'PastePlain', 'selectall':'SelectAll', 'print':'Print', 'preview':'Preview',
- 'horizontal':'Horizontal', 'removeformat':'RemoveFormat', 'time':'Time', 'date':'Date',
- 'unlink':'Unlink', 'insertrow':'InsertRow', 'insertcol':'InsertCol', 'mergeright':'MergeRight', 'mergedown':'MergeDown',
- 'deleterow':'DeleteRow', 'deletecol':'DeleteCol', 'splittorows':'SplitToRows','insertcode':'code',
- 'splittocols':'SplitToCols', 'splittocells':'SplitToCells','deletecaption':'DeleteCaption','inserttitle':'InsertTitle',
- 'mergecells':'MergeCells', 'deletetable':'DeleteTable', 'cleardoc':'Clear', 'insertparagraphbeforetable':"InsertParagraphBeforeTable",
- 'fontfamily':'Family', 'fontsize':'Size', 'paragraph':'Paragraph','simpleupload':'Single Image','insertimage':'Multi Image','edittable':'Edit Table', 'edittd':'Edit Td','link':'Link',
- 'emotion':'Emotion', 'spechars':'Spechars', 'searchreplace':'SearchReplace', 'map':'BaiduMap', 'gmap':'GoogleMap',
- 'insertvideo':'Video', 'help':'Help', 'justifyleft':'JustifyLeft', 'justifyright':'JustifyRight', 'justifycenter':'JustifyCenter',
- 'justifyjustify':'Justify', 'forecolor':'FontColor', 'backcolor':'BackColor', 'insertorderedlist':'OL',
- 'insertunorderedlist':'UL', 'fullscreen':'FullScreen', 'directionalityltr':'EnterFromLeft', 'directionalityrtl':'EnterFromRight',
- 'rowspacingtop':'RowSpacingTop', 'rowspacingbottom':'RowSpacingBottom', 'pagebreak':'PageBreak', 'insertframe':'Iframe', 'imagenone':'Default',
- 'imageleft':'ImageLeft', 'imageright':'ImageRight', 'attachment':'Attachment', 'imagecenter':'ImageCenter', 'wordimage':'WordImage',
- 'lineheight':'LineHeight','edittip':'EditTip','customstyle':'CustomStyle', 'scrawl':'Scrawl', 'autotypeset':'AutoTypeset',
- 'webapp':'WebAPP', 'touppercase':'UpperCase', 'tolowercase':'LowerCase','template':'Template','background':'Background','inserttable':'InsertTable',
- 'music':'Music', 'charts': 'charts','drafts': 'Load from Drafts'
- },
- 'insertorderedlist':{
- 'num':'1,2,3...',
- 'num1':'1),2),3)...',
- 'num2':'(1),(2),(3)...',
- 'cn':'一,二,三....',
- 'cn1':'一),二),三)....',
- 'cn2':'(一),(二),(三)....',
- 'decimal':'1,2,3...',
- 'lower-alpha':'a,b,c...',
- 'lower-roman':'i,ii,iii...',
- 'upper-alpha':'A,B,C...',
- 'upper-roman':'I,II,III...'
- },
- 'insertunorderedlist':{
- 'circle':'○ Circle',
- 'disc':'● Circle dot',
- 'square':'■ Rectangle ',
- 'dash' :'- Dash',
- 'dot' : '。dot'
- },
- 'paragraph':{'p':'Paragraph', 'h1':'Title 1', 'h2':'Title 2', 'h3':'Title 3', 'h4':'Title 4', 'h5':'Title 5', 'h6':'Title 6'},
- 'fontfamily':{
- 'songti':'Sim Sun',
- 'kaiti':'Sim Kai',
- 'heiti':'Sim Hei',
- 'lishu':'Sim Li',
- 'yahei': 'Microsoft YaHei',
- 'andaleMono':'Andale Mono',
- 'arial': 'Arial',
- 'arialBlack':'Arial Black',
- 'comicSansMs':'Comic Sans MS',
- 'impact':'Impact',
- 'timesNewRoman':'Times New Roman'
- },
- 'customstyle':{
- 'tc':'Title center',
- 'tl':'Title left',
- 'im':'Important',
- 'hi':'Highlight'
- },
- 'autoupload': {
- 'exceedSizeError': 'File Size Exceed',
- 'exceedTypeError': 'File Type Not Allow',
- 'jsonEncodeError': 'Server Return Format Error',
- 'loading':"loading...",
- 'loadError':"load error",
- 'errorLoadConfig': 'Server config not loaded, upload can not work.',
- },
- 'simpleupload':{
- 'exceedSizeError': 'File Size Exceed',
- 'exceedTypeError': 'File Type Not Allow',
- 'jsonEncodeError': 'Server Return Format Error',
- 'loading':"loading...",
- 'loadError':"load error",
- 'errorLoadConfig': 'Server config not loaded, upload can not work.',
- },
- 'elementPathTip':"Path",
- 'wordCountTip':"Word Count",
- 'wordCountMsg':'{#count} characters entered,{#leave} left. ',
- 'wordOverFlowMsg':'
The number of characters has exceeded allowable maximum values, the server may refuse to save! ',
- 'ok':"OK",
- 'cancel':"Cancel",
- 'closeDialog':"closeDialog",
- 'tableDrag':"You must import the file uiUtils.js before drag! ",
- 'autofloatMsg':"The plugin AutoFloat depends on EditorUI!",
- 'loadconfigError': 'Get server config error.',
- 'loadconfigFormatError': 'Server config format error.',
- 'loadconfigHttpError': 'Get server config http error.',
- 'snapScreen_plugin':{
- 'browserMsg':"Only IE supported!",
- 'callBackErrorMsg':"The callback data is wrong,please check the config!",
- 'uploadErrorMsg':"Upload error,please check your server environment! "
- },
- 'insertcode':{
- 'as3':'ActionScript 3',
- 'bash':'Bash/Shell',
- 'cpp':'C/C++',
- 'css':'CSS',
- 'cf':'ColdFusion',
- 'c#':'C#',
- 'delphi':'Delphi',
- 'diff':'Diff',
- 'erlang':'Erlang',
- 'groovy':'Groovy',
- 'html':'HTML',
- 'java':'Java',
- 'jfx':'JavaFX',
- 'js':'JavaScript',
- 'pl':'Perl',
- 'php':'PHP',
- 'plain':'Plain Text',
- 'ps':'PowerShell',
- 'python':'Python',
- 'ruby':'Ruby',
- 'scala':'Scala',
- 'sql':'SQL',
- 'vb':'Visual Basic',
- 'xml':'XML'
- },
- 'confirmClear':"Do you confirm to clear the Document?",
- 'contextMenu':{
- 'delete':"Delete",
- 'selectall':"Select all",
- 'deletecode':"Delete Code",
- 'cleardoc':"Clear Document",
- 'confirmclear':"Do you confirm to clear the Document?",
- 'unlink':"Unlink",
- 'paragraph':"Paragraph",
- 'edittable':"Table property",
- 'aligncell':'Align cell',
- 'aligntable':'Table alignment',
- 'tableleft':'Left float',
- 'tablecenter':'Center',
- 'tableright':'Right float',
- 'aligntd':'Cell alignment',
- 'edittd':"Cell property",
- 'setbordervisible':'set table edge visible',
- 'table':"Table",
- 'justifyleft':'Justify Left',
- 'justifyright':'Justify Right',
- 'justifycenter':'Justify Center',
- 'justifyjustify':'Default',
- 'deletetable':"Delete table",
- 'insertparagraphbefore':"InsertedBeforeLine",
- 'insertparagraphafter':'InsertedAfterLine',
- 'inserttable':'Insert table',
- 'insertcaption':'Insert caption',
- 'deletecaption':'Delete Caption',
- 'inserttitle':'Insert Title',
- 'deletetitle':'Delete Title',
- 'inserttitlecol':'Insert Title Col',
- 'deletetitlecol':'Delete Title Col',
- 'averageDiseRow':'AverageDise Row',
- 'averageDisCol':'AverageDis Col',
- 'deleterow':"Delete row",
- 'deletecol':"Delete col",
- 'insertrow':"Insert row",
- 'insertcol':"Insert col",
- 'insertrownext':'Insert Row Next',
- 'insertcolnext':'Insert Col Next',
- 'mergeright':"Merge right",
- 'mergeleft':"Merge left",
- 'mergedown':"Merge down",
- 'mergecells':"Merge cells",
- 'splittocells':"Split to cells",
- 'splittocols':"Split to Cols",
- 'splittorows':"Split to Rows",
- 'tablesort':'Table sorting',
- 'enablesort':'Sorting Enable',
- 'disablesort':'Sorting Disable',
- 'reversecurrent':'Reverse current',
- 'orderbyasc':'Order By ASCII',
- 'reversebyasc':'Reverse By ASCII',
- 'orderbynum':'Order By Num',
- 'reversebynum':'Reverse By Num',
- 'borderbk':'Border shading',
- 'setcolor':'interlaced color',
- 'unsetcolor':'Cancel interlacedcolor',
- 'setbackground':'Background interlaced',
- 'unsetbackground':'Cancel Bk interlaced',
- 'redandblue':'Blue and red',
- 'threecolorgradient':'Three-color gradient',
- 'copy':"Copy(Ctrl + c)",
- 'copymsg':"Browser does not support. Please use 'Ctrl + c' instead!",
- 'paste':"Paste(Ctrl + v)",
- 'pastemsg':"Browser does not support. Please use 'Ctrl + v' instead!"
- },
- 'copymsg': "Browser does not support. Please use 'Ctrl + c' instead!",
- 'pastemsg': "Browser does not support. Please use 'Ctrl + v' instead!",
- 'anthorMsg':"Link",
- 'clearColor':'Clear',
- 'standardColor':'Standard color',
- 'themeColor':'Theme color',
- 'property':'Property',
- 'default':'Default',
- 'modify':'Modify',
- 'justifyleft':'Justify Left',
- 'justifyright':'Justify Right',
- 'justifycenter':'Justify Center',
- 'justify':'Default',
- 'clear':'Clear',
- 'anchorMsg':'Anchor',
- 'delete':'Delete',
- 'clickToUpload':"Click to upload",
- 'unset':'Language hasn\'t been set!',
- 't_row':'row',
- 't_col':'col',
- 'pasteOpt':'Paste Option',
- 'pasteSourceFormat':"Keep Source Formatting",
- 'tagFormat':'Keep tag',
- 'pasteTextFormat':'Keep Text only',
- 'more':'More',
- 'autoTypeSet':{
- 'mergeLine':"Merge empty line",
- 'delLine':"Del empty line",
- 'removeFormat':"Remove format",
- 'indent':"Indent",
- 'alignment':"Alignment",
- 'imageFloat':"Image float",
- 'removeFontsize':"Remove font size",
- 'removeFontFamily':"Remove fontFamily",
- 'removeHtml':"Remove redundant HTML code",
- 'pasteFilter':"Paste filter",
- 'run':"Done",
- 'symbol':'Symbol Conversion',
- 'bdc2sb':'Full-width to Half-width',
- 'tobdc':'Half-width to Full-width'
- },
-
- 'background':{
- 'static':{
- 'lang_background_normal':'Normal',
- 'lang_background_local':'Online',
- 'lang_background_set':'Background Set',
- 'lang_background_none':'No Background',
- 'lang_background_colored':'Colored Background',
- 'lang_background_color':'Color Set',
- 'lang_background_netimg':'Net-Image',
- 'lang_background_align':'Align Type',
- 'lang_background_position':'Position',
- 'repeatType':{'options':["Center", "Repeat-x", "Repeat-y", "Tile","Custom"]}
- },
- 'noUploadImage':"No pictures has been uploaded!",
- 'toggleSelect':'Change the active state by click!\n Image Size: '
- },
- //===============dialog i18N=======================
- 'insertimage':{
- 'static':{
- 'lang_tab_remote':"Insert",
- 'lang_tab_upload':"Local",
- 'lang_tab_online':"Manager",
- 'lang_tab_search':"Search",
- 'lang_input_url':"Address:",
- 'lang_input_size':"Size:",
- 'lang_input_width':"Width",
- 'lang_input_height':"Height",
- 'lang_input_border':"Border:",
- 'lang_input_vhspace':"Margins:",
- 'lang_input_title':"Title:",
- 'lang_input_align':'Image Float Style:',
- 'lang_imgLoading':"Loading...",
- 'lang_start_upload':"Start Upload",
- 'lock':{'title':"Lock rate"},
- 'searchType':{'title':"ImageType", 'options':["News", "Wallpaper", "emotions", "photo"]},
- 'searchTxt':{'value':"Enter the search keyword!"},
- 'searchBtn':{'value':"Search"},
- 'searchReset':{'value':"Clear"},
- 'noneAlign':{'title':'None Float'},
- 'leftAlign':{'title':'Left Float'},
- 'rightAlign':{'title':'Right Float'},
- 'centerAlign':{'title':'Center In A Line'}
- },
- 'uploadSelectFile':'Select File',
- 'uploadAddFile':'Add File',
- 'uploadStart':'Start Upload',
- 'uploadPause':'Pause Upload',
- 'uploadContinue':'Continue Upload',
- 'uploadRetry':'Retry Upload',
- 'uploadDelete':'Delete',
- 'uploadTurnLeft':'Turn Left',
- 'uploadTurnRight':'Turn Right',
- 'uploadPreview':'Doing Preview',
- 'uploadNoPreview':'Can Not Preview',
- 'updateStatusReady': 'Selected _ pictures, total _KB.',
- 'updateStatusConfirm': '_ uploaded successfully and _ upload failed',
- 'updateStatusFinish': 'Total _ pictures (_KB), _ uploaded successfully',
- 'updateStatusError': ' and _ upload failed',
- 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',
- 'errorLoadConfig': 'Server config not loaded, upload can not work.',
- 'errorExceedSize':'File Size Exceed',
- 'errorFileType':'File Type Not Allow',
- 'errorInterrupt':'File Upload Interrupted',
- 'errorUploadRetry':'Upload Error, Please Retry.',
- 'errorHttp':'Http Error',
- 'errorServerUpload':'Server Result Error.',
- 'remoteLockError':"Cannot Lock the Proportion between width and height",
- 'numError':"Please enter the correct Num. e.g 123,400",
- 'imageUrlError':"The image format may be wrong!",
- 'imageLoadError':"Error,please check the network or URL!",
- 'searchRemind':"Enter the search keyword!",
- 'searchLoading':"Image is loading,please wait...",
- 'searchRetry':" Sorry,can't find the image,please try again!"
- },
- 'attachment':{
- 'static':{
- 'lang_tab_upload': 'Upload',
- 'lang_tab_online': 'Online',
- 'lang_start_upload':"Start upload",
- 'lang_drop_remind':"You can drop files here, a single maximum of 300 files"
- },
- 'uploadSelectFile':'Select File',
- 'uploadAddFile':'Add File',
- 'uploadStart':'Start Upload',
- 'uploadPause':'Pause Upload',
- 'uploadContinue':'Continue Upload',
- 'uploadRetry':'Retry Upload',
- 'uploadDelete':'Delete',
- 'uploadTurnLeft':'Turn Left',
- 'uploadTurnRight':'Turn Right',
- 'uploadPreview':'Doing Preview',
- 'updateStatusReady': 'Selected _ files, total _KB.',
- 'updateStatusConfirm': '_ uploaded successfully and _ upload failed',
- 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully',
- 'updateStatusError': ' and _ upload failed',
- 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',
- 'errorLoadConfig': 'Server config not loaded, upload can not work.',
- 'errorExceedSize':'File Size Exceed',
- 'errorFileType':'File Type Not Allow',
- 'errorInterrupt':'File Upload Interrupted',
- 'errorUploadRetry':'Upload Error, Please Retry.',
- 'errorHttp':'Http Error',
- 'errorServerUpload':'Server Result Error.'
- },
-
- 'insertvideo':{
- 'static':{
- 'lang_tab_insertV':"Video",
- 'lang_tab_searchV':"Search",
- 'lang_tab_uploadV':"Upload",
- 'lang_video_url':" URL ",
- 'lang_video_size':"Video Size",
- 'lang_videoW':"Width",
- 'lang_videoH':"Height",
- 'lang_alignment':"Alignment",
- 'videoSearchTxt':{'value':"Enter the search keyword!"},
- 'videoType':{'options':["All", "Hot", "Entertainment", "Funny", "Sports", "Science", "variety"]},
- 'videoSearchBtn':{'value':"Search in Baidu"},
- 'videoSearchReset':{'value':"Clear result"},
-
- 'lang_input_fileStatus':' No file uploaded!',
- 'startUpload':{'style':"background:url(upload.png) no-repeat;"},
-
- 'lang_upload_size':"Video Size",
- 'lang_upload_width':"Width",
- 'lang_upload_height':"Height",
- 'lang_upload_alignment':"Alignment",
- 'lang_format_advice':"Recommends mp4 format."
- },
- 'numError':"Please enter the correct Num. e.g 123,400",
- 'floatLeft':"Float left",
- 'floatRight':"Float right",
- 'default':"Default",
- 'block':"Display in block",
- 'urlError':"The video url format may be wrong!",
- 'loading':" The video is loading, please wait…",
- 'clickToSelect':"Click to select",
- 'goToSource':'Visit source video ',
- 'noVideo':" Sorry,can't find the video,please try again!",
-
- 'browseFiles':'Open files',
- 'uploadSuccess':'Upload Successful!',
- 'delSuccessFile':'Remove from the success of the queue',
- 'delFailSaveFile':'Remove the save failed file',
- 'statusPrompt':' file(s) uploaded! ',
- 'flashVersionError':'The current Flash version is too low, please update FlashPlayer,then try again!',
- 'flashLoadingError':'The Flash failed loading! Please check the path or network state',
- 'fileUploadReady':'Wait for uploading...',
- 'delUploadQueue':'Remove from the uploading queue ',
- 'limitPrompt1':'Can not choose more than single',
- 'limitPrompt2':'file(s)!Please choose again!',
- 'delFailFile':'Remove failure file',
- 'fileSizeLimit':'File size exceeds the limit!',
- 'emptyFile':'Can not upload an empty file!',
- 'fileTypeError':'File type error!',
- 'unknownError':'Unknown error!',
- 'fileUploading':'Uploading,please wait...',
- 'cancelUpload':'Cancel upload',
- 'netError':'Network error',
- 'failUpload':'Upload failed',
- 'serverIOError':'Server IO error!',
- 'noAuthority':'No Permission!',
- 'fileNumLimit':'Upload limit to the number',
- 'failCheck':'Authentication fails, the upload is skipped!',
- 'fileCanceling':'Cancel, please wait...',
- 'stopUploading':'Upload has stopped...',
-
- 'uploadSelectFile':'Select File',
- 'uploadAddFile':'Add File',
- 'uploadStart':'Start Upload',
- 'uploadPause':'Pause Upload',
- 'uploadContinue':'Continue Upload',
- 'uploadRetry':'Retry Upload',
- 'uploadDelete':'Delete',
- 'uploadTurnLeft':'Turn Left',
- 'uploadTurnRight':'Turn Right',
- 'uploadPreview':'Doing Preview',
- 'updateStatusReady': 'Selected _ files, total _KB.',
- 'updateStatusConfirm': '_ uploaded successfully and _ upload failed',
- 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully',
- 'updateStatusError': ' and _ upload failed',
- 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',
- 'errorLoadConfig': 'Server config not loaded, upload can not work.',
- 'errorExceedSize':'File Size Exceed',
- 'errorFileType':'File Type Not Allow',
- 'errorInterrupt':'File Upload Interrupted',
- 'errorUploadRetry':'Upload Error, Please Retry.',
- 'errorHttp':'Http Error',
- 'errorServerUpload':'Server Result Error.'
- },
- 'webapp':{
- 'tip1':"This function provided by Baidu APP,please apply for baidu APPKey webmaster first!",
- 'tip2':"And then open the file ueditor.config.js to set it! ",
- 'applyFor':"APPLY FOR",
- 'anthorApi':"Baidu API"
- },
- 'template':{
- 'static':{
- 'lang_template_bkcolor':'Background Color',
- 'lang_template_clear' : 'Keep Content',
- 'lang_template_select':'Select Template'
- },
- 'blank':"Blank",
- 'blog':"Blog",
- 'resume':"Resume",
- 'richText':"Rich Text",
- 'scrPapers':"Scientific Papers"
- },
- scrawl:{
- 'static':{
- 'lang_input_previousStep':"Previous",
- 'lang_input_nextsStep':"Next",
- 'lang_input_clear':'Clear',
- 'lang_input_addPic':'AddImage',
- 'lang_input_ScalePic':'ScaleImage',
- 'lang_input_removePic':'RemoveImage',
- 'J_imgTxt':{title:'Add background image'}
- },
- 'noScarwl':"No paint, a white paper...",
- 'scrawlUpLoading':"Image is uploading, please wait...",
- 'continueBtn':"Try again",
- 'imageError':"Image failed to load!",
- 'backgroundUploading':'Image is uploading,please wait...'
- },
- 'music':{
- 'static':{
- 'lang_input_tips':"Input singer/song/album, search you interested in music!",
- 'J_searchBtn':{value:'Search songs'}
- },
- 'emptyTxt':'Not search to the relevant music results, please change a keyword try.',
- 'chapter':'Songs',
- 'singer':'Singer',
- 'special':'Album',
- 'listenTest':'Audition'
- },
- anchor:{
- 'static':{
- 'lang_input_anchorName':'Anchor Name:'
- }
- },
- 'charts':{
- 'static':{
- 'lang_data_source':'Data source:',
- 'lang_chart_format': 'Chart format:',
- 'lang_data_align': 'Align',
- 'lang_chart_align_same': 'Consistent with the X-axis Y-axis',
- 'lang_chart_align_reverse': 'X-axis Y-axis opposite',
- 'lang_chart_title': 'Title',
- 'lang_chart_main_title': 'main title:',
- 'lang_chart_sub_title': 'sub title:',
- 'lang_chart_x_title': 'X-axis title:',
- 'lang_chart_y_title': 'Y-axis title:',
- 'lang_chart_tip': 'Prompt',
- 'lang_cahrt_tip_prefix': 'prefix:',
- 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀',
- 'lang_chart_data_unit': 'Unit',
- 'lang_chart_data_unit_title': 'unit:',
- 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃',
- 'lang_chart_type': 'Chart type:',
- 'lang_prev_btn': 'Previous',
- 'lang_next_btn': 'Next'
- }
- },
- emotion:{
- 'static':{
- 'lang_input_choice':'Choice',
- 'lang_input_Tuzki':'Tuzki',
- 'lang_input_lvdouwa':'LvDouWa',
- 'lang_input_BOBO':'BOBO',
- 'lang_input_babyCat':'BabyCat',
- 'lang_input_bubble':'Bubble',
- 'lang_input_youa':'YouA'
- }
- },
- gmap:{
- 'static':{
- 'lang_input_address':'Address:',
- 'lang_input_search':'Search',
- 'address':{value:"Beijing"}
- },
- searchError:'Unable to locate the address!'
- },
- help:{
- 'static':{
- 'lang_input_about':'About',
- 'lang_input_shortcuts':'Shortcuts',
- 'lang_input_introduction':"UEditor is developed by Baidu Co.ltd. It is lightweight, customizable , focusing on user experience and etc. , UEditor is based on open source BSD license , allowing free use and redistribution.",
- 'lang_Txt_shortcuts':'Shortcuts',
- 'lang_Txt_func':'Function',
- 'lang_Txt_bold':'Bold',
- 'lang_Txt_copy':'Copy',
- 'lang_Txt_cut':'Cut',
- 'lang_Txt_Paste':'Paste',
- 'lang_Txt_undo':'Undo',
- 'lang_Txt_redo':'Redo',
- 'lang_Txt_italic':'Italic',
- 'lang_Txt_underline':'Underline',
- 'lang_Txt_selectAll':'Select All',
- 'lang_Txt_visualEnter':'Submit',
- 'lang_Txt_fullscreen':'Fullscreen'
- }
- },
- insertframe:{
- 'static':{
- 'lang_input_address':'Address:',
- 'lang_input_width':'Width:',
- 'lang_input_height':'height:',
- 'lang_input_isScroll':'Enable scrollbars:',
- 'lang_input_frameborder':'Show frame border:',
- 'lang_input_alignMode':'Alignment:',
- 'align':{title:"Alignment", options:["Default", "Left", "Right", "Center"]}
- },
- 'enterAddress':'Please enter an address!'
- },
- link:{
- 'static':{
- 'lang_input_text':'Text:',
- 'lang_input_url':'URL:',
- 'lang_input_title':'Title:',
- 'lang_input_target':'open in new window:'
- },
- 'validLink':'Supports only effective when a link is selected',
- 'httpPrompt':'The hyperlink you enter should start with "http|https|ftp://"!'
- },
- map:{
- 'static':{
- lang_city:"City",
- lang_address:"Address",
- city:{value:"Beijing"},
- lang_search:"Search",
- lang_dynamicmap:"Dynamic map"
- },
- cityMsg:"Please enter the city name!",
- errorMsg:"Can't find the place!"
- },
- searchreplace:{
- 'static':{
- lang_tab_search:"Search",
- lang_tab_replace:"Replace",
- lang_search1:"Search",
- lang_search2:"Search",
- lang_replace:"Replace",
- lang_searchReg:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"',
- lang_searchReg1:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"',
- lang_case_sensitive1:"Case sense",
- lang_case_sensitive2:"Case sense",
- nextFindBtn:{value:"Next"},
- preFindBtn:{value:"Preview"},
- nextReplaceBtn:{value:"Next"},
- preReplaceBtn:{value:"Preview"},
- repalceBtn:{value:"Replace"},
- repalceAllBtn:{value:"Replace all"}
- },
- getEnd:"Has the search to the bottom!",
- getStart:"Has the search to the top!",
- countMsg:"Altogether replaced {#count} character(s)!"
- },
- snapscreen:{
- 'static':{
- lang_showMsg:"You should install the UEditor screenshots program first!",
- lang_download:"Download!",
- lang_step1:"Step1:Download the program and then run it",
- lang_step2:"Step2:After complete install,try to click the button again"
- }
- },
- spechars:{
- 'static':{},
- tsfh:"Special",
- lmsz:"Roman",
- szfh:"Numeral",
- rwfh:"Japanese",
- xlzm:"The Greek",
- ewzm:"Russian",
- pyzm:"Phonetic",
- yyyb:"English",
- zyzf:"Others"
- },
- 'edittable':{
- 'static':{
- 'lang_tableStyle':'Table style',
- 'lang_insertCaption':'Add table header row',
- 'lang_insertTitle':'Add table title row',
- 'lang_insertTitleCol':'Add table title col',
- 'lang_tableSize':'Automatically adjust table size',
- 'lang_autoSizeContent':'Adaptive by form text',
- 'lang_orderbycontent':"Table of contents sortable",
- 'lang_autoSizePage':'Page width adaptive',
- 'lang_example':'Example',
- 'lang_borderStyle':'Table Border',
- 'lang_color':'Color:'
- },
- captionName:'Caption',
- titleName:'Title',
- cellsName:'text',
- errorMsg:'There are merged cells, can not sort.'
- },
- 'edittip':{
- 'static':{
- lang_delRow:'Delete entire row',
- lang_delCol:'Delete entire col'
- }
- },
- 'edittd':{
- 'static':{
- lang_tdBkColor:'Background Color:'
- }
- },
- 'formula':{
- 'static':{
- }
- },
- wordimage:{
- 'static':{
- lang_resave:"The re-save step",
- uploadBtn:{src:"upload.png", alt:"Upload"},
- clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"},
- lang_step:" 1. Click top button to copy the url and then open the dialog to paste it. 2. Open after choose photos uploaded process."
- },
- fileType:"Image",
- flashError:"Flash initialization failed!",
- netError:"Network error! Please try again!",
- copySuccess:"URL has been copied!",
-
- 'flashI18n':{
- lang:encodeURI( '{"UploadingState":"totalNum: ${a},uploadComplete: ${b}", "BeforeUpload":"waitingNum: ${a}", "ExceedSize":"Size exceed${a}", "ErrorInPreview":"Preview failed", "DefaultDescription":"Description", "LoadingImage":"Loading..."}' ),
- uploadingTF:encodeURI( '{"font":"Arial", "size":12, "color":"0x000", "bold":"true", "italic":"false", "underline":"false"}' ),
- imageTF:encodeURI( '{"font":"Arial", "size":11, "color":"red", "bold":"false", "italic":"false", "underline":"false"}' ),
- textEncoding:"utf-8",
- addImageSkinURL:"addImage.png",
- allDeleteBtnUpSkinURL:"allDeleteBtnUpSkin.png",
- allDeleteBtnHoverSkinURL:"allDeleteBtnHoverSkin.png",
- rotateLeftBtnEnableSkinURL:"rotateLeftEnable.png",
- rotateLeftBtnDisableSkinURL:"rotateLeftDisable.png",
- rotateRightBtnEnableSkinURL:"rotateRightEnable.png",
- rotateRightBtnDisableSkinURL:"rotateRightDisable.png",
- deleteBtnEnableSkinURL:"deleteEnable.png",
- deleteBtnDisableSkinURL:"deleteDisable.png",
- backgroundURL:'',
- listBackgroundURL:'',
- buttonURL:'button.png'
- }
- },
- 'autosave': {
- 'success':'Local conservation success'
- }
-};
diff --git a/www/js/ueditor/lang/en/images/addimage.png b/www/js/ueditor/lang/en/images/addimage.png
deleted file mode 100644
index 3a2fd17121..0000000000
Binary files a/www/js/ueditor/lang/en/images/addimage.png and /dev/null differ
diff --git a/www/js/ueditor/lang/en/images/alldeletebtnhoverskin.png b/www/js/ueditor/lang/en/images/alldeletebtnhoverskin.png
deleted file mode 100644
index 355eeabbd8..0000000000
Binary files a/www/js/ueditor/lang/en/images/alldeletebtnhoverskin.png and /dev/null differ
diff --git a/www/js/ueditor/lang/en/images/alldeletebtnupskin.png b/www/js/ueditor/lang/en/images/alldeletebtnupskin.png
deleted file mode 100644
index 61658ce6f1..0000000000
Binary files a/www/js/ueditor/lang/en/images/alldeletebtnupskin.png and /dev/null differ
diff --git a/www/js/ueditor/lang/en/images/background.png b/www/js/ueditor/lang/en/images/background.png
deleted file mode 100644
index d5bf5fdd8a..0000000000
Binary files a/www/js/ueditor/lang/en/images/background.png and /dev/null differ
diff --git a/www/js/ueditor/lang/en/images/button.png b/www/js/ueditor/lang/en/images/button.png
deleted file mode 100644
index 098874cb1f..0000000000
Binary files a/www/js/ueditor/lang/en/images/button.png and /dev/null differ
diff --git a/www/js/ueditor/lang/en/images/copy.png b/www/js/ueditor/lang/en/images/copy.png
deleted file mode 100644
index f982e8bcbc..0000000000
Binary files a/www/js/ueditor/lang/en/images/copy.png and /dev/null differ
diff --git a/www/js/ueditor/lang/en/images/deletedisable.png b/www/js/ueditor/lang/en/images/deletedisable.png
deleted file mode 100644
index c8ee75094f..0000000000
Binary files a/www/js/ueditor/lang/en/images/deletedisable.png and /dev/null differ
diff --git a/www/js/ueditor/lang/en/images/deleteenable.png b/www/js/ueditor/lang/en/images/deleteenable.png
deleted file mode 100644
index 26acc88356..0000000000
Binary files a/www/js/ueditor/lang/en/images/deleteenable.png and /dev/null differ
diff --git a/www/js/ueditor/lang/en/images/listbackground.png b/www/js/ueditor/lang/en/images/listbackground.png
deleted file mode 100644
index 4f82ccd88f..0000000000
Binary files a/www/js/ueditor/lang/en/images/listbackground.png and /dev/null differ
diff --git a/www/js/ueditor/lang/en/images/localimage.png b/www/js/ueditor/lang/en/images/localimage.png
deleted file mode 100644
index 12c8e6aefa..0000000000
Binary files a/www/js/ueditor/lang/en/images/localimage.png and /dev/null differ
diff --git a/www/js/ueditor/lang/en/images/music.png b/www/js/ueditor/lang/en/images/music.png
deleted file mode 100644
index 2f495fe92f..0000000000
Binary files a/www/js/ueditor/lang/en/images/music.png and /dev/null differ
diff --git a/www/js/ueditor/lang/en/images/rotateleftdisable.png b/www/js/ueditor/lang/en/images/rotateleftdisable.png
deleted file mode 100644
index 741526e0d5..0000000000
Binary files a/www/js/ueditor/lang/en/images/rotateleftdisable.png and /dev/null differ
diff --git a/www/js/ueditor/lang/en/images/rotateleftenable.png b/www/js/ueditor/lang/en/images/rotateleftenable.png
deleted file mode 100644
index e164ddbd62..0000000000
Binary files a/www/js/ueditor/lang/en/images/rotateleftenable.png and /dev/null differ
diff --git a/www/js/ueditor/lang/en/images/rotaterightdisable.png b/www/js/ueditor/lang/en/images/rotaterightdisable.png
deleted file mode 100644
index 5a78c26062..0000000000
Binary files a/www/js/ueditor/lang/en/images/rotaterightdisable.png and /dev/null differ
diff --git a/www/js/ueditor/lang/en/images/rotaterightenable.png b/www/js/ueditor/lang/en/images/rotaterightenable.png
deleted file mode 100644
index d768531fca..0000000000
Binary files a/www/js/ueditor/lang/en/images/rotaterightenable.png and /dev/null differ
diff --git a/www/js/ueditor/lang/en/images/upload.png b/www/js/ueditor/lang/en/images/upload.png
deleted file mode 100644
index 7bb15b3d6d..0000000000
Binary files a/www/js/ueditor/lang/en/images/upload.png and /dev/null differ
diff --git a/www/js/ueditor/lang/fr/ancien-en.js b/www/js/ueditor/lang/fr/ancien-en.js
deleted file mode 100644
index e72143693c..0000000000
--- a/www/js/ueditor/lang/fr/ancien-en.js
+++ /dev/null
@@ -1,684 +0,0 @@
-/**
- * Created with JetBrains PhpStorm.
- * User: taoqili
- * Date: 12-6-12
- * Time: 下午6:57
- * To change this template use File | Settings | File Templates.
- */
-UE.I18N['en'] = {
- 'labelMap':{
- 'anchor':'Anchor', 'undo':'Undo', 'redo':'Redo', 'bold':'Bold', 'indent':'Indent', 'snapscreen':'SnapScreen',
- 'italic':'Italic', 'underline':'Underline', 'strikethrough':'Strikethrough', 'subscript':'SubScript','fontborder':'text border',
- 'superscript':'SuperScript', 'formatmatch':'Format Match', 'source':'Source', 'blockquote':'BlockQuote',
- 'pasteplain':'PastePlain', 'selectall':'SelectAll', 'print':'Print', 'preview':'Preview',
- 'horizontal':'Horizontal', 'removeformat':'RemoveFormat', 'time':'Time', 'date':'Date',
- 'unlink':'Unlink', 'insertrow':'InsertRow', 'insertcol':'InsertCol', 'mergeright':'MergeRight', 'mergedown':'MergeDown',
- 'deleterow':'DeleteRow', 'deletecol':'DeleteCol', 'splittorows':'SplitToRows','insertcode':'code',
- 'splittocols':'SplitToCols', 'splittocells':'SplitToCells','deletecaption':'DeleteCaption','inserttitle':'InsertTitle',
- 'mergecells':'MergeCells', 'deletetable':'DeleteTable', 'cleardoc':'Clear', 'insertparagraphbeforetable':"InsertParagraphBeforeTable",
- 'fontfamily':'Family', 'fontsize':'Size', 'paragraph':'Paragraph','simpleupload':'Single Image','insertimage':'Multi Image','edittable':'Edit Table', 'edittd':'Edit Td','link':'Link',
- 'emotion':'Emotion', 'spechars':'Spechars', 'searchreplace':'SearchReplace', 'map':'BaiduMap', 'gmap':'GoogleMap',
- 'insertvideo':'Video', 'help':'Help', 'justifyleft':'JustifyLeft', 'justifyright':'JustifyRight', 'justifycenter':'JustifyCenter',
- 'justifyjustify':'Justify', 'forecolor':'FontColor', 'backcolor':'BackColor', 'insertorderedlist':'OL',
- 'insertunorderedlist':'UL', 'fullscreen':'FullScreen', 'directionalityltr':'EnterFromLeft', 'directionalityrtl':'EnterFromRight',
- 'rowspacingtop':'RowSpacingTop', 'rowspacingbottom':'RowSpacingBottom', 'pagebreak':'PageBreak', 'insertframe':'Iframe', 'imagenone':'Default',
- 'imageleft':'ImageLeft', 'imageright':'ImageRight', 'attachment':'Attachment', 'imagecenter':'ImageCenter', 'wordimage':'WordImage',
- 'lineheight':'LineHeight','edittip':'EditTip','customstyle':'CustomStyle', 'scrawl':'Scrawl', 'autotypeset':'AutoTypeset',
- 'webapp':'WebAPP', 'touppercase':'UpperCase', 'tolowercase':'LowerCase','template':'Template','background':'Background','inserttable':'InsertTable',
- 'music':'Music', 'charts': 'charts','drafts': 'Load from Drafts'
- },
- 'insertorderedlist':{
- 'num':'1,2,3...',
- 'num1':'1),2),3)...',
- 'num2':'(1),(2),(3)...',
- 'cn':'一,二,三....',
- 'cn1':'一),二),三)....',
- 'cn2':'(一),(二),(三)....',
- 'decimal':'1,2,3...',
- 'lower-alpha':'a,b,c...',
- 'lower-roman':'i,ii,iii...',
- 'upper-alpha':'A,B,C...',
- 'upper-roman':'I,II,III...'
- },
- 'insertunorderedlist':{
- 'circle':'○ Circle',
- 'disc':'● Circle dot',
- 'square':'■ Rectangle ',
- 'dash' :'- Dash',
- 'dot' : '。dot'
- },
- 'paragraph':{'p':'Paragraph', 'h1':'Title 1', 'h2':'Title 2', 'h3':'Title 3', 'h4':'Title 4', 'h5':'Title 5', 'h6':'Title 6'},
- 'fontfamily':{
- 'songti':'Sim Sun',
- 'kaiti':'Sim Kai',
- 'heiti':'Sim Hei',
- 'lishu':'Sim Li',
- 'yahei': 'Microsoft YaHei',
- 'andaleMono':'Andale Mono',
- 'arial': 'Arial',
- 'arialBlack':'Arial Black',
- 'comicSansMs':'Comic Sans MS',
- 'impact':'Impact',
- 'timesNewRoman':'Times New Roman'
- },
- 'customstyle':{
- 'tc':'Title center',
- 'tl':'Title left',
- 'im':'Important',
- 'hi':'Highlight'
- },
- 'autoupload': {
- 'exceedSizeError': 'File Size Exceed',
- 'exceedTypeError': 'File Type Not Allow',
- 'jsonEncodeError': 'Server Return Format Error',
- 'loading':"loading...",
- 'loadError':"load error",
- 'errorLoadConfig': 'Server config not loaded, upload can not work.',
- },
- 'simpleupload':{
- 'exceedSizeError': 'File Size Exceed',
- 'exceedTypeError': 'File Type Not Allow',
- 'jsonEncodeError': 'Server Return Format Error',
- 'loading':"loading...",
- 'loadError':"load error",
- 'errorLoadConfig': 'Server config not loaded, upload can not work.',
- },
- 'elementPathTip':"Path",
- 'wordCountTip':"Word Count",
- 'wordCountMsg':'{#count} characters entered,{#leave} left. ',
- 'wordOverFlowMsg':'
The number of characters has exceeded allowable maximum values, the server may refuse to save! ',
- 'ok':"OK",
- 'cancel':"Cancel",
- 'closeDialog':"closeDialog",
- 'tableDrag':"You must import the file uiUtils.js before drag! ",
- 'autofloatMsg':"The plugin AutoFloat depends on EditorUI!",
- 'loadconfigError': 'Get server config error.',
- 'loadconfigFormatError': 'Server config format error.',
- 'loadconfigHttpError': 'Get server config http error.',
- 'snapScreen_plugin':{
- 'browserMsg':"Only IE supported!",
- 'callBackErrorMsg':"The callback data is wrong,please check the config!",
- 'uploadErrorMsg':"Upload error,please check your server environment! "
- },
- 'insertcode':{
- 'as3':'ActionScript 3',
- 'bash':'Bash/Shell',
- 'cpp':'C/C++',
- 'css':'CSS',
- 'cf':'ColdFusion',
- 'c#':'C#',
- 'delphi':'Delphi',
- 'diff':'Diff',
- 'erlang':'Erlang',
- 'groovy':'Groovy',
- 'html':'HTML',
- 'java':'Java',
- 'jfx':'JavaFX',
- 'js':'JavaScript',
- 'pl':'Perl',
- 'php':'PHP',
- 'plain':'Plain Text',
- 'ps':'PowerShell',
- 'python':'Python',
- 'ruby':'Ruby',
- 'scala':'Scala',
- 'sql':'SQL',
- 'vb':'Visual Basic',
- 'xml':'XML'
- },
- 'confirmClear':"Do you confirm to clear the Document?",
- 'contextMenu':{
- 'delete':"Delete",
- 'selectall':"Select all",
- 'deletecode':"Delete Code",
- 'cleardoc':"Clear Document",
- 'confirmclear':"Do you confirm to clear the Document?",
- 'unlink':"Unlink",
- 'paragraph':"Paragraph",
- 'edittable':"Table property",
- 'aligncell':'Align cell',
- 'aligntable':'Table alignment',
- 'tableleft':'Left float',
- 'tablecenter':'Center',
- 'tableright':'Right float',
- 'aligntd':'Cell alignment',
- 'edittd':"Cell property",
- 'setbordervisible':'set table edge visible',
- 'table':"Table",
- 'justifyleft':'Justify Left',
- 'justifyright':'Justify Right',
- 'justifycenter':'Justify Center',
- 'justifyjustify':'Default',
- 'deletetable':"Delete table",
- 'insertparagraphbefore':"InsertedBeforeLine",
- 'insertparagraphafter':'InsertedAfterLine',
- 'inserttable':'Insert table',
- 'insertcaption':'Insert caption',
- 'deletecaption':'Delete Caption',
- 'inserttitle':'Insert Title',
- 'deletetitle':'Delete Title',
- 'inserttitlecol':'Insert Title Col',
- 'deletetitlecol':'Delete Title Col',
- 'averageDiseRow':'AverageDise Row',
- 'averageDisCol':'AverageDis Col',
- 'deleterow':"Delete row",
- 'deletecol':"Delete col",
- 'insertrow':"Insert row",
- 'insertcol':"Insert col",
- 'insertrownext':'Insert Row Next',
- 'insertcolnext':'Insert Col Next',
- 'mergeright':"Merge right",
- 'mergeleft':"Merge left",
- 'mergedown':"Merge down",
- 'mergecells':"Merge cells",
- 'splittocells':"Split to cells",
- 'splittocols':"Split to Cols",
- 'splittorows':"Split to Rows",
- 'tablesort':'Table sorting',
- 'enablesort':'Sorting Enable',
- 'disablesort':'Sorting Disable',
- 'reversecurrent':'Reverse current',
- 'orderbyasc':'Order By ASCII',
- 'reversebyasc':'Reverse By ASCII',
- 'orderbynum':'Order By Num',
- 'reversebynum':'Reverse By Num',
- 'borderbk':'Border shading',
- 'setcolor':'interlaced color',
- 'unsetcolor':'Cancel interlacedcolor',
- 'setbackground':'Background interlaced',
- 'unsetbackground':'Cancel Bk interlaced',
- 'redandblue':'Blue and red',
- 'threecolorgradient':'Three-color gradient',
- 'copy':"Copy(Ctrl + c)",
- 'copymsg':"Browser does not support. Please use 'Ctrl + c' instead!",
- 'paste':"Paste(Ctrl + v)",
- 'pastemsg':"Browser does not support. Please use 'Ctrl + v' instead!"
- },
- 'copymsg': "Browser does not support. Please use 'Ctrl + c' instead!",
- 'pastemsg': "Browser does not support. Please use 'Ctrl + v' instead!",
- 'anthorMsg':"Link",
- 'clearColor':'Clear',
- 'standardColor':'Standard color',
- 'themeColor':'Theme color',
- 'property':'Property',
- 'default':'Default',
- 'modify':'Modify',
- 'justifyleft':'Justify Left',
- 'justifyright':'Justify Right',
- 'justifycenter':'Justify Center',
- 'justify':'Default',
- 'clear':'Clear',
- 'anchorMsg':'Anchor',
- 'delete':'Delete',
- 'clickToUpload':"Click to upload",
- 'unset':'Language hasn\'t been set!',
- 't_row':'row',
- 't_col':'col',
- 'pasteOpt':'Paste Option',
- 'pasteSourceFormat':"Keep Source Formatting",
- 'tagFormat':'Keep tag',
- 'pasteTextFormat':'Keep Text only',
- 'more':'More',
- 'autoTypeSet':{
- 'mergeLine':"Merge empty line",
- 'delLine':"Del empty line",
- 'removeFormat':"Remove format",
- 'indent':"Indent",
- 'alignment':"Alignment",
- 'imageFloat':"Image float",
- 'removeFontsize':"Remove font size",
- 'removeFontFamily':"Remove fontFamily",
- 'removeHtml':"Remove redundant HTML code",
- 'pasteFilter':"Paste filter",
- 'run':"Done",
- 'symbol':'Symbol Conversion',
- 'bdc2sb':'Full-width to Half-width',
- 'tobdc':'Half-width to Full-width'
- },
-
- 'background':{
- 'static':{
- 'lang_background_normal':'Normal',
- 'lang_background_local':'Online',
- 'lang_background_set':'Background Set',
- 'lang_background_none':'No Background',
- 'lang_background_colored':'Colored Background',
- 'lang_background_color':'Color Set',
- 'lang_background_netimg':'Net-Image',
- 'lang_background_align':'Align Type',
- 'lang_background_position':'Position',
- 'repeatType':{'options':["Center", "Repeat-x", "Repeat-y", "Tile","Custom"]}
- },
- 'noUploadImage':"No pictures has been uploaded!",
- 'toggleSelect':'Change the active state by click!\n Image Size: '
- },
- //===============dialog i18N=======================
- 'insertimage':{
- 'static':{
- 'lang_tab_remote':"Insert",
- 'lang_tab_upload':"Local",
- 'lang_tab_online':"Manager",
- 'lang_tab_search':"Search",
- 'lang_input_url':"Address:",
- 'lang_input_size':"Size:",
- 'lang_input_width':"Width",
- 'lang_input_height':"Height",
- 'lang_input_border':"Border:",
- 'lang_input_vhspace':"Margins:",
- 'lang_input_title':"Title:",
- 'lang_input_align':'Image Float Style:',
- 'lang_imgLoading':"Loading...",
- 'lang_start_upload':"Start Upload",
- 'lock':{'title':"Lock rate"},
- 'searchType':{'title':"ImageType", 'options':["News", "Wallpaper", "emotions", "photo"]},
- 'searchTxt':{'value':"Enter the search keyword!"},
- 'searchBtn':{'value':"Search"},
- 'searchReset':{'value':"Clear"},
- 'noneAlign':{'title':'None Float'},
- 'leftAlign':{'title':'Left Float'},
- 'rightAlign':{'title':'Right Float'},
- 'centerAlign':{'title':'Center In A Line'}
- },
- 'uploadSelectFile':'Select File',
- 'uploadAddFile':'Add File',
- 'uploadStart':'Start Upload',
- 'uploadPause':'Pause Upload',
- 'uploadContinue':'Continue Upload',
- 'uploadRetry':'Retry Upload',
- 'uploadDelete':'Delete',
- 'uploadTurnLeft':'Turn Left',
- 'uploadTurnRight':'Turn Right',
- 'uploadPreview':'Doing Preview',
- 'uploadNoPreview':'Can Not Preview',
- 'updateStatusReady': 'Selected _ pictures, total _KB.',
- 'updateStatusConfirm': '_ uploaded successfully and _ upload failed',
- 'updateStatusFinish': 'Total _ pictures (_KB), _ uploaded successfully',
- 'updateStatusError': ' and _ upload failed',
- 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',
- 'errorLoadConfig': 'Server config not loaded, upload can not work.',
- 'errorExceedSize':'File Size Exceed',
- 'errorFileType':'File Type Not Allow',
- 'errorInterrupt':'File Upload Interrupted',
- 'errorUploadRetry':'Upload Error, Please Retry.',
- 'errorHttp':'Http Error',
- 'errorServerUpload':'Server Result Error.',
- 'remoteLockError':"Cannot Lock the Proportion between width and height",
- 'numError':"Please enter the correct Num. e.g 123,400",
- 'imageUrlError':"The image format may be wrong!",
- 'imageLoadError':"Error,please check the network or URL!",
- 'searchRemind':"Enter the search keyword!",
- 'searchLoading':"Image is loading,please wait...",
- 'searchRetry':" Sorry,can't find the image,please try again!"
- },
- 'attachment':{
- 'static':{
- 'lang_tab_upload': 'Upload',
- 'lang_tab_online': 'Online',
- 'lang_start_upload':"Start upload",
- 'lang_drop_remind':"You can drop files here, a single maximum of 300 files"
- },
- 'uploadSelectFile':'Select File',
- 'uploadAddFile':'Add File',
- 'uploadStart':'Start Upload',
- 'uploadPause':'Pause Upload',
- 'uploadContinue':'Continue Upload',
- 'uploadRetry':'Retry Upload',
- 'uploadDelete':'Delete',
- 'uploadTurnLeft':'Turn Left',
- 'uploadTurnRight':'Turn Right',
- 'uploadPreview':'Doing Preview',
- 'updateStatusReady': 'Selected _ files, total _KB.',
- 'updateStatusConfirm': '_ uploaded successfully and _ upload failed',
- 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully',
- 'updateStatusError': ' and _ upload failed',
- 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',
- 'errorLoadConfig': 'Server config not loaded, upload can not work.',
- 'errorExceedSize':'File Size Exceed',
- 'errorFileType':'File Type Not Allow',
- 'errorInterrupt':'File Upload Interrupted',
- 'errorUploadRetry':'Upload Error, Please Retry.',
- 'errorHttp':'Http Error',
- 'errorServerUpload':'Server Result Error.'
- },
-
- 'insertvideo':{
- 'static':{
- 'lang_tab_insertV':"Video",
- 'lang_tab_searchV':"Search",
- 'lang_tab_uploadV':"Upload",
- 'lang_video_url':" URL ",
- 'lang_video_size':"Video Size",
- 'lang_videoW':"Width",
- 'lang_videoH':"Height",
- 'lang_alignment':"Alignment",
- 'videoSearchTxt':{'value':"Enter the search keyword!"},
- 'videoType':{'options':["All", "Hot", "Entertainment", "Funny", "Sports", "Science", "variety"]},
- 'videoSearchBtn':{'value':"Search in Baidu"},
- 'videoSearchReset':{'value':"Clear result"},
-
- 'lang_input_fileStatus':' No file uploaded!',
- 'startUpload':{'style':"background:url(upload.png) no-repeat;"},
-
- 'lang_upload_size':"Video Size",
- 'lang_upload_width':"Width",
- 'lang_upload_height':"Height",
- 'lang_upload_alignment':"Alignment",
- 'lang_format_advice':"Recommends mp4 format."
- },
- 'numError':"Please enter the correct Num. e.g 123,400",
- 'floatLeft':"Float left",
- 'floatRight':"Float right",
- 'default':"Default",
- 'block':"Display in block",
- 'urlError':"The video url format may be wrong!",
- 'loading':" The video is loading, please wait…",
- 'clickToSelect':"Click to select",
- 'goToSource':'Visit source video ',
- 'noVideo':" Sorry,can't find the video,please try again!",
-
- 'browseFiles':'Open files',
- 'uploadSuccess':'Upload Successful!',
- 'delSuccessFile':'Remove from the success of the queue',
- 'delFailSaveFile':'Remove the save failed file',
- 'statusPrompt':' file(s) uploaded! ',
- 'flashVersionError':'The current Flash version is too low, please update FlashPlayer,then try again!',
- 'flashLoadingError':'The Flash failed loading! Please check the path or network state',
- 'fileUploadReady':'Wait for uploading...',
- 'delUploadQueue':'Remove from the uploading queue ',
- 'limitPrompt1':'Can not choose more than single',
- 'limitPrompt2':'file(s)!Please choose again!',
- 'delFailFile':'Remove failure file',
- 'fileSizeLimit':'File size exceeds the limit!',
- 'emptyFile':'Can not upload an empty file!',
- 'fileTypeError':'File type error!',
- 'unknownError':'Unknown error!',
- 'fileUploading':'Uploading,please wait...',
- 'cancelUpload':'Cancel upload',
- 'netError':'Network error',
- 'failUpload':'Upload failed',
- 'serverIOError':'Server IO error!',
- 'noAuthority':'No Permission!',
- 'fileNumLimit':'Upload limit to the number',
- 'failCheck':'Authentication fails, the upload is skipped!',
- 'fileCanceling':'Cancel, please wait...',
- 'stopUploading':'Upload has stopped...',
-
- 'uploadSelectFile':'Select File',
- 'uploadAddFile':'Add File',
- 'uploadStart':'Start Upload',
- 'uploadPause':'Pause Upload',
- 'uploadContinue':'Continue Upload',
- 'uploadRetry':'Retry Upload',
- 'uploadDelete':'Delete',
- 'uploadTurnLeft':'Turn Left',
- 'uploadTurnRight':'Turn Right',
- 'uploadPreview':'Doing Preview',
- 'updateStatusReady': 'Selected _ files, total _KB.',
- 'updateStatusConfirm': '_ uploaded successfully and _ upload failed',
- 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully',
- 'updateStatusError': ' and _ upload failed',
- 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',
- 'errorLoadConfig': 'Server config not loaded, upload can not work.',
- 'errorExceedSize':'File Size Exceed',
- 'errorFileType':'File Type Not Allow',
- 'errorInterrupt':'File Upload Interrupted',
- 'errorUploadRetry':'Upload Error, Please Retry.',
- 'errorHttp':'Http Error',
- 'errorServerUpload':'Server Result Error.'
- },
- 'webapp':{
- 'tip1':"This function provided by Baidu APP,please apply for baidu APPKey webmaster first!",
- 'tip2':"And then open the file ueditor.config.js to set it! ",
- 'applyFor':"APPLY FOR",
- 'anthorApi':"Baidu API"
- },
- 'template':{
- 'static':{
- 'lang_template_bkcolor':'Background Color',
- 'lang_template_clear' : 'Keep Content',
- 'lang_template_select':'Select Template'
- },
- 'blank':"Blank",
- 'blog':"Blog",
- 'resume':"Resume",
- 'richText':"Rich Text",
- 'scrPapers':"Scientific Papers"
- },
- scrawl:{
- 'static':{
- 'lang_input_previousStep':"Previous",
- 'lang_input_nextsStep':"Next",
- 'lang_input_clear':'Clear',
- 'lang_input_addPic':'AddImage',
- 'lang_input_ScalePic':'ScaleImage',
- 'lang_input_removePic':'RemoveImage',
- 'J_imgTxt':{title:'Add background image'}
- },
- 'noScarwl':"No paint, a white paper...",
- 'scrawlUpLoading':"Image is uploading, please wait...",
- 'continueBtn':"Try again",
- 'imageError':"Image failed to load!",
- 'backgroundUploading':'Image is uploading,please wait...'
- },
- 'music':{
- 'static':{
- 'lang_input_tips':"Input singer/song/album, search you interested in music!",
- 'J_searchBtn':{value:'Search songs'}
- },
- 'emptyTxt':'Not search to the relevant music results, please change a keyword try.',
- 'chapter':'Songs',
- 'singer':'Singer',
- 'special':'Album',
- 'listenTest':'Audition'
- },
- anchor:{
- 'static':{
- 'lang_input_anchorName':'Anchor Name:'
- }
- },
- 'charts':{
- 'static':{
- 'lang_data_source':'Data source:',
- 'lang_chart_format': 'Chart format:',
- 'lang_data_align': 'Align',
- 'lang_chart_align_same': 'Consistent with the X-axis Y-axis',
- 'lang_chart_align_reverse': 'X-axis Y-axis opposite',
- 'lang_chart_title': 'Title',
- 'lang_chart_main_title': 'main title:',
- 'lang_chart_sub_title': 'sub title:',
- 'lang_chart_x_title': 'X-axis title:',
- 'lang_chart_y_title': 'Y-axis title:',
- 'lang_chart_tip': 'Prompt',
- 'lang_cahrt_tip_prefix': 'prefix:',
- 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀',
- 'lang_chart_data_unit': 'Unit',
- 'lang_chart_data_unit_title': 'unit:',
- 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃',
- 'lang_chart_type': 'Chart type:',
- 'lang_prev_btn': 'Previous',
- 'lang_next_btn': 'Next'
- }
- },
- emotion:{
- 'static':{
- 'lang_input_choice':'Choice',
- 'lang_input_Tuzki':'Tuzki',
- 'lang_input_lvdouwa':'LvDouWa',
- 'lang_input_BOBO':'BOBO',
- 'lang_input_babyCat':'BabyCat',
- 'lang_input_bubble':'Bubble',
- 'lang_input_youa':'YouA'
- }
- },
- gmap:{
- 'static':{
- 'lang_input_address':'Address:',
- 'lang_input_search':'Search',
- 'address':{value:"Beijing"}
- },
- searchError:'Unable to locate the address!'
- },
- help:{
- 'static':{
- 'lang_input_about':'About',
- 'lang_input_shortcuts':'Shortcuts',
- 'lang_input_introduction':"UEditor is developed by Baidu Co.ltd. It is lightweight, customizable , focusing on user experience and etc. , UEditor is based on open source BSD license , allowing free use and redistribution.",
- 'lang_Txt_shortcuts':'Shortcuts',
- 'lang_Txt_func':'Function',
- 'lang_Txt_bold':'Bold',
- 'lang_Txt_copy':'Copy',
- 'lang_Txt_cut':'Cut',
- 'lang_Txt_Paste':'Paste',
- 'lang_Txt_undo':'Undo',
- 'lang_Txt_redo':'Redo',
- 'lang_Txt_italic':'Italic',
- 'lang_Txt_underline':'Underline',
- 'lang_Txt_selectAll':'Select All',
- 'lang_Txt_visualEnter':'Submit',
- 'lang_Txt_fullscreen':'Fullscreen'
- }
- },
- insertframe:{
- 'static':{
- 'lang_input_address':'Address:',
- 'lang_input_width':'Width:',
- 'lang_input_height':'height:',
- 'lang_input_isScroll':'Enable scrollbars:',
- 'lang_input_frameborder':'Show frame border:',
- 'lang_input_alignMode':'Alignment:',
- 'align':{title:"Alignment", options:["Default", "Left", "Right", "Center"]}
- },
- 'enterAddress':'Please enter an address!'
- },
- link:{
- 'static':{
- 'lang_input_text':'Text:',
- 'lang_input_url':'URL:',
- 'lang_input_title':'Title:',
- 'lang_input_target':'open in new window:'
- },
- 'validLink':'Supports only effective when a link is selected',
- 'httpPrompt':'The hyperlink you enter should start with "http|https|ftp://"!'
- },
- map:{
- 'static':{
- lang_city:"City",
- lang_address:"Address",
- city:{value:"Beijing"},
- lang_search:"Search",
- lang_dynamicmap:"Dynamic map"
- },
- cityMsg:"Please enter the city name!",
- errorMsg:"Can't find the place!"
- },
- searchreplace:{
- 'static':{
- lang_tab_search:"Search",
- lang_tab_replace:"Replace",
- lang_search1:"Search",
- lang_search2:"Search",
- lang_replace:"Replace",
- lang_searchReg:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"',
- lang_searchReg1:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"',
- lang_case_sensitive1:"Case sense",
- lang_case_sensitive2:"Case sense",
- nextFindBtn:{value:"Next"},
- preFindBtn:{value:"Preview"},
- nextReplaceBtn:{value:"Next"},
- preReplaceBtn:{value:"Preview"},
- repalceBtn:{value:"Replace"},
- repalceAllBtn:{value:"Replace all"}
- },
- getEnd:"Has the search to the bottom!",
- getStart:"Has the search to the top!",
- countMsg:"Altogether replaced {#count} character(s)!"
- },
- snapscreen:{
- 'static':{
- lang_showMsg:"You should install the UEditor screenshots program first!",
- lang_download:"Download!",
- lang_step1:"Step1:Download the program and then run it",
- lang_step2:"Step2:After complete install,try to click the button again"
- }
- },
- spechars:{
- 'static':{},
- tsfh:"Special",
- lmsz:"Roman",
- szfh:"Numeral",
- rwfh:"Japanese",
- xlzm:"The Greek",
- ewzm:"Russian",
- pyzm:"Phonetic",
- yyyb:"English",
- zyzf:"Others"
- },
- 'edittable':{
- 'static':{
- 'lang_tableStyle':'Table style',
- 'lang_insertCaption':'Add table header row',
- 'lang_insertTitle':'Add table title row',
- 'lang_insertTitleCol':'Add table title col',
- 'lang_tableSize':'Automatically adjust table size',
- 'lang_autoSizeContent':'Adaptive by form text',
- 'lang_orderbycontent':"Table of contents sortable",
- 'lang_autoSizePage':'Page width adaptive',
- 'lang_example':'Example',
- 'lang_borderStyle':'Table Border',
- 'lang_color':'Color:'
- },
- captionName:'Caption',
- titleName:'Title',
- cellsName:'text',
- errorMsg:'There are merged cells, can not sort.'
- },
- 'edittip':{
- 'static':{
- lang_delRow:'Delete entire row',
- lang_delCol:'Delete entire col'
- }
- },
- 'edittd':{
- 'static':{
- lang_tdBkColor:'Background Color:'
- }
- },
- 'formula':{
- 'static':{
- }
- },
- wordimage:{
- 'static':{
- lang_resave:"The re-save step",
- uploadBtn:{src:"upload.png", alt:"Upload"},
- clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"},
- lang_step:" 1. Click top button to copy the url and then open the dialog to paste it. 2. Open after choose photos uploaded process."
- },
- fileType:"Image",
- flashError:"Flash initialization failed!",
- netError:"Network error! Please try again!",
- copySuccess:"URL has been copied!",
-
- 'flashI18n':{
- lang:encodeURI( '{"UploadingState":"totalNum: ${a},uploadComplete: ${b}", "BeforeUpload":"waitingNum: ${a}", "ExceedSize":"Size exceed${a}", "ErrorInPreview":"Preview failed", "DefaultDescription":"Description", "LoadingImage":"Loading..."}' ),
- uploadingTF:encodeURI( '{"font":"Arial", "size":12, "color":"0x000", "bold":"true", "italic":"false", "underline":"false"}' ),
- imageTF:encodeURI( '{"font":"Arial", "size":11, "color":"red", "bold":"false", "italic":"false", "underline":"false"}' ),
- textEncoding:"utf-8",
- addImageSkinURL:"addImage.png",
- allDeleteBtnUpSkinURL:"allDeleteBtnUpSkin.png",
- allDeleteBtnHoverSkinURL:"allDeleteBtnHoverSkin.png",
- rotateLeftBtnEnableSkinURL:"rotateLeftEnable.png",
- rotateLeftBtnDisableSkinURL:"rotateLeftDisable.png",
- rotateRightBtnEnableSkinURL:"rotateRightEnable.png",
- rotateRightBtnDisableSkinURL:"rotateRightDisable.png",
- deleteBtnEnableSkinURL:"deleteEnable.png",
- deleteBtnDisableSkinURL:"deleteDisable.png",
- backgroundURL:'',
- listBackgroundURL:'',
- buttonURL:'button.png'
- }
- },
- 'autosave': {
- 'success':'Local conservation success'
- }
-};
diff --git a/www/js/ueditor/lang/fr/fr.js b/www/js/ueditor/lang/fr/fr.js
deleted file mode 100644
index 21b48dd7ae..0000000000
--- a/www/js/ueditor/lang/fr/fr.js
+++ /dev/null
@@ -1,684 +0,0 @@
-/**
- * Created with JetBrains PhpStorm.
- * User: taoqili
- * Date: 12-6-12
- * Time: 下午6:57
- * To change this template use File | Settings | File Templates.
- */
-UE.I18N['en'] = {
- 'labelMap':{
- 'anchor':'Ancre', 'undo':'Annuler', 'redo':'Refaire', 'bold':'Gras', 'indent':'Indente', 'snapscreen':'copie d\'écran',
- 'italic':'Italique', 'underline':'Souligné', 'strikethrough':'Barré', 'subscript':'Indice','fontborder':'Bordure de texte',
- 'superscript':'Exposant', 'formatmatch':'Format Match', 'source':'Source', 'blockquote':'Citation',
- 'pasteplain':'PastePlain', 'selectall':'SelectAll', 'print':'Print', 'preview':'Preview',
- 'horizontal':'Horizontal', 'removeformat':'RemoveFormat', 'time':'Heure', 'date':'Date',
- 'unlink':'Décrocher', 'insertrow':'InsertRow', 'insertcol':'InsertCol', 'mergeright':'MergeRight', 'mergedown':'MergeDown',
- 'deleterow':'DeleteRow', 'deletecol':'DeleteCol', 'splittorows':'SplitToRows','insertcode':'code',
- 'splittocols':'SplitToCols', 'splittocells':'SplitToCells','deletecaption':'DeleteCaption','inserttitle':'InsertTitle',
- 'mergecells':'MergeCells', 'deletetable':'DeleteTable', 'cleardoc':'Clear', 'insertparagraphbeforetable':"InsertParagraphBeforeTable",
- 'fontfamily':'Family', 'fontsize':'Size', 'paragraph':'Paragraph','simpleupload':'Single Image','insertimage':'Multi Image','edittable':'Edit Table', 'edittd':'Edit Td','link':'Link',
- 'emotion':'Emotion', 'spechars':'Spechars', 'searchreplace':'SearchReplace', 'map':'BaiduMap', 'gmap':'GoogleMap',
- 'insertvideo':'Video', 'help':'Help', 'justifyleft':'JustifyLeft', 'justifyright':'JustifyRight', 'justifycenter':'JustifyCenter',
- 'justifyjustify':'Justify', 'forecolor':'FontColor', 'backcolor':'BackColor', 'insertorderedlist':'OL',
- 'insertunorderedlist':'UL', 'fullscreen':'FullScreen', 'directionalityltr':'EnterFromLeft', 'directionalityrtl':'EnterFromRight',
- 'rowspacingtop':'RowSpacingTop', 'rowspacingbottom':'RowSpacingBottom', 'pagebreak':'PageBreak', 'insertframe':'Iframe', 'imagenone':'Default',
- 'imageleft':'ImageLeft', 'imageright':'ImageRight', 'attachment':'Attachment', 'imagecenter':'ImageCenter', 'wordimage':'WordImage',
- 'lineheight':'LineHeight','edittip':'EditTip','customstyle':'CustomStyle', 'scrawl':'Scrawl', 'autotypeset':'AutoTypeset',
- 'webapp':'WebAPP', 'touppercase':'UpperCase', 'tolowercase':'LowerCase','template':'Template','background':'Background','inserttable':'InsertTable',
- 'music':'Music', 'charts': 'charts','drafts': 'Load from Drafts'
- },
- 'insertorderedlist':{
- 'num':'1,2,3...',
- 'num1':'1),2),3)...',
- 'num2':'(1),(2),(3)...',
- 'cn':'一,二,三....',
- 'cn1':'一),二),三)....',
- 'cn2':'(一),(二),(三)....',
- 'decimal':'1,2,3...',
- 'lower-alpha':'a,b,c...',
- 'lower-roman':'i,ii,iii...',
- 'upper-alpha':'A,B,C...',
- 'upper-roman':'I,II,III...'
- },
- 'insertunorderedlist':{
- 'circle':'○ Circle',
- 'disc':'● Circle dot',
- 'square':'■ Rectangle ',
- 'dash' :'- Dash',
- 'dot' : '。dot'
- },
- 'paragraph':{'p':'Paragraph', 'h1':'Title 1', 'h2':'Title 2', 'h3':'Title 3', 'h4':'Title 4', 'h5':'Title 5', 'h6':'Title 6'},
- 'fontfamily':{
- 'songti':'Sim Sun',
- 'kaiti':'Sim Kai',
- 'heiti':'Sim Hei',
- 'lishu':'Sim Li',
- 'yahei': 'Microsoft YaHei',
- 'andaleMono':'Andale Mono',
- 'arial': 'Arial',
- 'arialBlack':'Arial Black',
- 'comicSansMs':'Comic Sans MS',
- 'impact':'Impact',
- 'timesNewRoman':'Times New Roman'
- },
- 'customstyle':{
- 'tc':'Title center',
- 'tl':'Title left',
- 'im':'Important',
- 'hi':'Highlight'
- },
- 'autoupload': {
- 'exceedSizeError': 'Taille du fichier excessive',
- 'exceedTypeError': 'Type de fichier non autorisé',
- 'jsonEncodeError': 'Erreur de format retournée par le serveur',
- 'loading':"chargement...",
- 'loadError':"erreur de chargement",
- 'errorLoadConfig': 'configuration du serveur non chargée, upload impossible.',
- },
- 'simpleupload':{
- 'exceedSizeError': 'Taille du fichier excessive',
- 'exceedTypeError': 'Type de fichier non autorisé',
- 'jsonEncodeError': 'Erreur de format retournée par le serveur',
- 'loading':"chargement...",
- 'loadError':"erreur de chargement",
- 'errorLoadConfig': 'configuration du serveur non chargée, upload impossible.',
- },
- 'elementPathTip':"Path",
- 'wordCountTip':"Word Count",
- 'wordCountMsg':'{#count} caractères saisis, reste {#leave}. ',
- 'wordOverFlowMsg':'
Le nombre de caractères a dépasser le nombre maximum autorisé, le serveur peut refuser de sauvegarder ! ',
- 'ok':"OK",
- 'cancel':"Annuler",
- 'closeDialog':"closeDialog",
- 'tableDrag':"You must import the file uiUtils.js before drag! ",
- 'autofloatMsg':"The plugin AutoFloat depends on EditorUI!",
- 'loadconfigError': 'erreur de configuration du serveur.',
- 'loadconfigFormatError': 'Erreur de format de configuration du serveur.',
- 'loadconfigHttpError': 'erreur de configuration http du serveur.',
- 'snapScreen_plugin':{
- 'browserMsg':"Seulement IE est supporté !",
- 'callBackErrorMsg':"Données de callback erronnées, vérifiez la configuration !",
- 'uploadErrorMsg':"erreur d\'Upload, vérifier les paramètres d\'environnement du serveur !"
- },
- 'insertcode':{
- 'as3':'ActionScript 3',
- 'bash':'Bash/Shell',
- 'cpp':'C/C++',
- 'css':'CSS',
- 'cf':'ColdFusion',
- 'c#':'C#',
- 'delphi':'Delphi',
- 'diff':'Diff',
- 'erlang':'Erlang',
- 'groovy':'Groovy',
- 'html':'HTML',
- 'java':'Java',
- 'jfx':'JavaFX',
- 'js':'JavaScript',
- 'pl':'Perl',
- 'php':'PHP',
- 'plain':'Plain Text',
- 'ps':'PowerShell',
- 'python':'Python',
- 'ruby':'Ruby',
- 'scala':'Scala',
- 'sql':'SQL',
- 'vb':'Visual Basic',
- 'xml':'XML'
- },
- 'confirmClear':"Voulez-vous vraiment effacer le document ?",
- 'contextMenu':{
- 'delete':"Supprimer",
- 'selectall':"Tout sélectionner",
- 'deletecode':"Supprimer le Code",
- 'cleardoc':"Effacer le document",
- 'confirmclear':"Voulez-vous vraiment effacer le document ?",
- 'unlink':"Décrocher",
- 'paragraph':"Paragraphe",
- 'edittable':"Propriétés de la Table",
- 'aligncell':'Aligner les cellules',
- 'aligntable':'Alignement de la Table',
- 'tableleft':'à gauche',
- 'tablecenter':'au centre',
- 'tableright':'à droite',
- 'aligntd':'alignement de la cellule',
- 'edittd':"propriétés de la cellule",
- 'setbordervisible':'bords visibles',
- 'table':"Table",
- 'justifyleft':'Justifier à gauche',
- 'justifyright':'Justifier à droite',
- 'justifycenter':'Justifier au centre',
- 'justifyjustify':'Défaut',
- 'deletetable':"Supprimer la table",
- 'insertparagraphbefore':"InsertedBeforeLine",
- 'insertparagraphafter':'InsertedAfterLine',
- 'inserttable':'Insérer une table',
- 'insertcaption':'Insérer une légende',
- 'deletecaption':'Supprimer la légende',
- 'inserttitle':'Insérer un Titre',
- 'deletetitle':'Supprimer le Titre',
- 'inserttitlecol':'Insert Title Col',
- 'deletetitlecol':'Delete Title Col',
- 'averageDiseRow':'AverageDise Row',
- 'averageDisCol':'AverageDis Col',
- 'deleterow':"Delete row",
- 'deletecol':"Delete col",
- 'insertrow':"Insert row",
- 'insertcol':"Insert col",
- 'insertrownext':'Insert Row Next',
- 'insertcolnext':'Insert Col Next',
- 'mergeright':"Merge right",
- 'mergeleft':"Merge left",
- 'mergedown':"Merge down",
- 'mergecells':"Merge cells",
- 'splittocells':"Split to cells",
- 'splittocols':"Split to Cols",
- 'splittorows':"Split to Rows",
- 'tablesort':'Table sorting',
- 'enablesort':'Sorting Enable',
- 'disablesort':'Sorting Disable',
- 'reversecurrent':'Reverse current',
- 'orderbyasc':'Order By ASCII',
- 'reversebyasc':'Reverse By ASCII',
- 'orderbynum':'Order By Num',
- 'reversebynum':'Reverse By Num',
- 'borderbk':'Border shading',
- 'setcolor':'interlaced color',
- 'unsetcolor':'Cancel interlacedcolor',
- 'setbackground':'Background interlaced',
- 'unsetbackground':'Cancel Bk interlaced',
- 'redandblue':'Blue and red',
- 'threecolorgradient':'Three-color gradient',
- 'copy':"Copy(Ctrl + c)",
- 'copymsg':"Browser does not support. Please use 'Ctrl + c' instead!",
- 'paste':"Paste(Ctrl + v)",
- 'pastemsg':"Browser does not support. Please use 'Ctrl + v' instead!"
- },
- 'copymsg': "Browser does not support. Please use 'Ctrl + c' instead!",
- 'pastemsg': "Browser does not support. Please use 'Ctrl + v' instead!",
- 'anthorMsg':"Link",
- 'clearColor':'Clear',
- 'standardColor':'Standard color',
- 'themeColor':'Theme color',
- 'property':'Property',
- 'default':'Default',
- 'modify':'Modify',
- 'justifyleft':'Justify Left',
- 'justifyright':'Justify Right',
- 'justifycenter':'Justify Center',
- 'justify':'Default',
- 'clear':'Clear',
- 'anchorMsg':'Anchor',
- 'delete':'Delete',
- 'clickToUpload':"Click to upload",
- 'unset':'Language hasn\'t been set!',
- 't_row':'row',
- 't_col':'col',
- 'pasteOpt':'Paste Option',
- 'pasteSourceFormat':"Keep Source Formatting",
- 'tagFormat':'Keep tag',
- 'pasteTextFormat':'Keep Text only',
- 'more':'More',
- 'autoTypeSet':{
- 'mergeLine':"Merge empty line",
- 'delLine':"Del empty line",
- 'removeFormat':"Remove format",
- 'indent':"Indent",
- 'alignment':"Alignment",
- 'imageFloat':"Image float",
- 'removeFontsize':"Remove font size",
- 'removeFontFamily':"Remove fontFamily",
- 'removeHtml':"Remove redundant HTML code",
- 'pasteFilter':"Paste filter",
- 'run':"Done",
- 'symbol':'Symbol Conversion',
- 'bdc2sb':'Full-width to Half-width',
- 'tobdc':'Half-width to Full-width'
- },
-
- 'background':{
- 'static':{
- 'lang_background_normal':'Normal',
- 'lang_background_local':'Online',
- 'lang_background_set':'Background Set',
- 'lang_background_none':'No Background',
- 'lang_background_colored':'Colored Background',
- 'lang_background_color':'Color Set',
- 'lang_background_netimg':'Net-Image',
- 'lang_background_align':'Align Type',
- 'lang_background_position':'Position',
- 'repeatType':{'options':["Center", "Repeat-x", "Repeat-y", "Tile","Custom"]}
- },
- 'noUploadImage':"No pictures has been uploaded!",
- 'toggleSelect':'Change the active state by click!\n Image Size: '
- },
- //===============dialog i18N=======================
- 'insertimage':{
- 'static':{
- 'lang_tab_remote':"Insert",
- 'lang_tab_upload':"Local",
- 'lang_tab_online':"Manager",
- 'lang_tab_search':"Search",
- 'lang_input_url':"Address:",
- 'lang_input_size':"Size:",
- 'lang_input_width':"Width",
- 'lang_input_height':"Height",
- 'lang_input_border':"Border:",
- 'lang_input_vhspace':"Margins:",
- 'lang_input_title':"Title:",
- 'lang_input_align':'Image Float Style:',
- 'lang_imgLoading':"Loading...",
- 'lang_start_upload':"Start Upload",
- 'lock':{'title':"Lock rate"},
- 'searchType':{'title':"ImageType", 'options':["News", "Wallpaper", "emotions", "photo"]},
- 'searchTxt':{'value':"Enter the search keyword!"},
- 'searchBtn':{'value':"Search"},
- 'searchReset':{'value':"Clear"},
- 'noneAlign':{'title':'None Float'},
- 'leftAlign':{'title':'Left Float'},
- 'rightAlign':{'title':'Right Float'},
- 'centerAlign':{'title':'Center In A Line'}
- },
- 'uploadSelectFile':'Select File',
- 'uploadAddFile':'Add File',
- 'uploadStart':'Start Upload',
- 'uploadPause':'Pause Upload',
- 'uploadContinue':'Continue Upload',
- 'uploadRetry':'Retry Upload',
- 'uploadDelete':'Delete',
- 'uploadTurnLeft':'Turn Left',
- 'uploadTurnRight':'Turn Right',
- 'uploadPreview':'Doing Preview',
- 'uploadNoPreview':'Can Not Preview',
- 'updateStatusReady': 'Selected _ pictures, total _KB.',
- 'updateStatusConfirm': '_ uploaded successfully and _ upload failed',
- 'updateStatusFinish': 'Total _ pictures (_KB), _ uploaded successfully',
- 'updateStatusError': ' and _ upload failed',
- 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',
- 'errorLoadConfig': 'Server config not loaded, upload can not work.',
- 'errorExceedSize':'File Size Exceed',
- 'errorFileType':'File Type Not Allow',
- 'errorInterrupt':'File Upload Interrupted',
- 'errorUploadRetry':'Upload Error, Please Retry.',
- 'errorHttp':'Http Error',
- 'errorServerUpload':'Server Result Error.',
- 'remoteLockError':"Cannot Lock the Proportion between width and height",
- 'numError':"Please enter the correct Num. e.g 123,400",
- 'imageUrlError':"The image format may be wrong!",
- 'imageLoadError':"Error,please check the network or URL!",
- 'searchRemind':"Enter the search keyword!",
- 'searchLoading':"Image is loading,please wait...",
- 'searchRetry':" Sorry,can't find the image,please try again!"
- },
- 'attachment':{
- 'static':{
- 'lang_tab_upload': 'Upload',
- 'lang_tab_online': 'Online',
- 'lang_start_upload':"Start upload",
- 'lang_drop_remind':"You can drop files here, a single maximum of 300 files"
- },
- 'uploadSelectFile':'Select File',
- 'uploadAddFile':'Add File',
- 'uploadStart':'Start Upload',
- 'uploadPause':'Pause Upload',
- 'uploadContinue':'Continue Upload',
- 'uploadRetry':'Retry Upload',
- 'uploadDelete':'Delete',
- 'uploadTurnLeft':'Turn Left',
- 'uploadTurnRight':'Turn Right',
- 'uploadPreview':'Doing Preview',
- 'updateStatusReady': 'Selected _ files, total _KB.',
- 'updateStatusConfirm': '_ uploaded successfully and _ upload failed',
- 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully',
- 'updateStatusError': ' and _ upload failed',
- 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',
- 'errorLoadConfig': 'Server config not loaded, upload can not work.',
- 'errorExceedSize':'File Size Exceed',
- 'errorFileType':'File Type Not Allow',
- 'errorInterrupt':'File Upload Interrupted',
- 'errorUploadRetry':'Upload Error, Please Retry.',
- 'errorHttp':'Http Error',
- 'errorServerUpload':'Server Result Error.'
- },
-
- 'insertvideo':{
- 'static':{
- 'lang_tab_insertV':"Video",
- 'lang_tab_searchV':"Search",
- 'lang_tab_uploadV':"Upload",
- 'lang_video_url':" URL ",
- 'lang_video_size':"Video Size",
- 'lang_videoW':"Width",
- 'lang_videoH':"Height",
- 'lang_alignment':"Alignment",
- 'videoSearchTxt':{'value':"Enter the search keyword!"},
- 'videoType':{'options':["All", "Hot", "Divertissement", "Drole", "Sports", "Science", "Economique", "Politique", "variety"]},
- 'videoSearchBtn':{'value':"Search in Google"},
- 'videoSearchReset':{'value':"Clear result"},
-
- 'lang_input_fileStatus':' No file uploaded!',
- 'startUpload':{'style':"background:url(upload.png) no-repeat;"},
-
- 'lang_upload_size':"Video Size",
- 'lang_upload_width':"Width",
- 'lang_upload_height':"Height",
- 'lang_upload_alignment':"Alignment",
- 'lang_format_advice':"Recommends mp4 format."
- },
- 'numError':"Please enter the correct Num. e.g 123,400",
- 'floatLeft':"Float left",
- 'floatRight':"Float right",
- 'default':"Default",
- 'block':"Display in block",
- 'urlError':"The video url format may be wrong!",
- 'loading':" The video is loading, please wait…",
- 'clickToSelect':"Click to select",
- 'goToSource':'Visit source video ',
- 'noVideo':" Sorry,can't find the video,please try again!",
-
- 'browseFiles':'Open files',
- 'uploadSuccess':'Upload Successful!',
- 'delSuccessFile':'Remove from the success of the queue',
- 'delFailSaveFile':'Remove the save failed file',
- 'statusPrompt':' file(s) uploaded! ',
- 'flashVersionError':'The current Flash version is too low, please update FlashPlayer,then try again!',
- 'flashLoadingError':'The Flash failed loading! Please check the path or network state',
- 'fileUploadReady':'Wait for uploading...',
- 'delUploadQueue':'Remove from the uploading queue ',
- 'limitPrompt1':'Can not choose more than single',
- 'limitPrompt2':'file(s)!Please choose again!',
- 'delFailFile':'Remove failure file',
- 'fileSizeLimit':'File size exceeds the limit!',
- 'emptyFile':'Can not upload an empty file!',
- 'fileTypeError':'File type error!',
- 'unknownError':'Unknown error!',
- 'fileUploading':'Uploading,please wait...',
- 'cancelUpload':'Cancel upload',
- 'netError':'Network error',
- 'failUpload':'Upload failed',
- 'serverIOError':'Server IO error!',
- 'noAuthority':'No Permission!',
- 'fileNumLimit':'Upload limit to the number',
- 'failCheck':'Authentication fails, the upload is skipped!',
- 'fileCanceling':'Cancel, please wait...',
- 'stopUploading':'Upload has stopped...',
-
- 'uploadSelectFile':'Select File',
- 'uploadAddFile':'Add File',
- 'uploadStart':'Start Upload',
- 'uploadPause':'Pause Upload',
- 'uploadContinue':'Continue Upload',
- 'uploadRetry':'Retry Upload',
- 'uploadDelete':'Delete',
- 'uploadTurnLeft':'Turn Left',
- 'uploadTurnRight':'Turn Right',
- 'uploadPreview':'Doing Preview',
- 'updateStatusReady': 'Selected _ files, total _KB.',
- 'updateStatusConfirm': '_ uploaded successfully and _ upload failed',
- 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully',
- 'updateStatusError': ' and _ upload failed',
- 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',
- 'errorLoadConfig': 'Server config not loaded, upload can not work.',
- 'errorExceedSize':'File Size Exceed',
- 'errorFileType':'File Type Not Allow',
- 'errorInterrupt':'File Upload Interrupted',
- 'errorUploadRetry':'Upload Error, Please Retry.',
- 'errorHttp':'Http Error',
- 'errorServerUpload':'Server Result Error.'
- },
- 'webapp':{
- 'tip1':"This function provided by Baidu APP,please apply for baidu APPKey webmaster first!",
- 'tip2':"And then open the file ueditor.config.js to set it! ",
- 'applyFor':"APPLY FOR",
- 'anthorApi':"Baidu API"
- },
- 'template':{
- 'static':{
- 'lang_template_bkcolor':'Background Color',
- 'lang_template_clear' : 'Keep Content',
- 'lang_template_select':'Select Template'
- },
- 'blank':"Blank",
- 'blog':"Blog",
- 'resume':"Resume",
- 'richText':"Rich Text",
- 'scrPapers':"Scientific Papers"
- },
- scrawl:{
- 'static':{
- 'lang_input_previousStep':"Previous",
- 'lang_input_nextsStep':"Next",
- 'lang_input_clear':'Clear',
- 'lang_input_addPic':'AddImage',
- 'lang_input_ScalePic':'ScaleImage',
- 'lang_input_removePic':'RemoveImage',
- 'J_imgTxt':{title:'Add background image'}
- },
- 'noScarwl':"No paint, a white paper...",
- 'scrawlUpLoading':"Image is uploading, please wait...",
- 'continueBtn':"Try again",
- 'imageError':"Image failed to load!",
- 'backgroundUploading':'Image is uploading,please wait...'
- },
- 'music':{
- 'static':{
- 'lang_input_tips':"Input singer/song/album, search you interested in music!",
- 'J_searchBtn':{value:'Search songs'}
- },
- 'emptyTxt':'Not search to the relevant music results, please change a keyword try.',
- 'chapter':'Songs',
- 'singer':'Singer',
- 'special':'Album',
- 'listenTest':'Audition'
- },
- anchor:{
- 'static':{
- 'lang_input_anchorName':'Anchor Name:'
- }
- },
- 'charts':{
- 'static':{
- 'lang_data_source':'Data source:',
- 'lang_chart_format': 'Chart format:',
- 'lang_data_align': 'Align',
- 'lang_chart_align_same': 'Consistent with the X-axis Y-axis',
- 'lang_chart_align_reverse': 'X-axis Y-axis opposite',
- 'lang_chart_title': 'Title',
- 'lang_chart_main_title': 'main title:',
- 'lang_chart_sub_title': 'sub title:',
- 'lang_chart_x_title': 'X-axis title:',
- 'lang_chart_y_title': 'Y-axis title:',
- 'lang_chart_tip': 'Prompt',
- 'lang_cahrt_tip_prefix': 'prefix:',
- 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀',
- 'lang_chart_data_unit': 'Unit',
- 'lang_chart_data_unit_title': 'unit:',
- 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃',
- 'lang_chart_type': 'Chart type:',
- 'lang_prev_btn': 'Previous',
- 'lang_next_btn': 'Next'
- }
- },
- emotion:{
- 'static':{
- 'lang_input_choice':'Choice',
- 'lang_input_Tuzki':'Tuzki',
- 'lang_input_lvdouwa':'LvDouWa',
- 'lang_input_BOBO':'BOBO',
- 'lang_input_babyCat':'BabyCat',
- 'lang_input_bubble':'Bubble',
- 'lang_input_youa':'YouA'
- }
- },
- gmap:{
- 'static':{
- 'lang_input_address':'Adresse:',
- 'lang_input_search':'Search',
- 'address':{value:"Paris"}
- },
- searchError:'Unable to locate the address!'
- },
- help:{
- 'static':{
- 'lang_input_about':'About',
- 'lang_input_shortcuts':'Shortcuts',
- 'lang_input_introduction':"UEditor is developed by Baidu Co.ltd. It is lightweight, customizable , focusing on user experience and etc. , UEditor is based on open source BSD license , allowing free use and redistribution.",
- 'lang_Txt_shortcuts':'Shortcuts',
- 'lang_Txt_func':'Function',
- 'lang_Txt_bold':'Bold',
- 'lang_Txt_copy':'Copy',
- 'lang_Txt_cut':'Cut',
- 'lang_Txt_Paste':'Paste',
- 'lang_Txt_undo':'Undo',
- 'lang_Txt_redo':'Redo',
- 'lang_Txt_italic':'Italic',
- 'lang_Txt_underline':'Underline',
- 'lang_Txt_selectAll':'Select All',
- 'lang_Txt_visualEnter':'Submit',
- 'lang_Txt_fullscreen':'Fullscreen'
- }
- },
- insertframe:{
- 'static':{
- 'lang_input_address':'Address:',
- 'lang_input_width':'Width:',
- 'lang_input_height':'height:',
- 'lang_input_isScroll':'Enable scrollbars:',
- 'lang_input_frameborder':'Show frame border:',
- 'lang_input_alignMode':'Alignment:',
- 'align':{title:"Alignment", options:["Default", "Left", "Right", "Center"]}
- },
- 'enterAddress':'Please enter an address!'
- },
- link:{
- 'static':{
- 'lang_input_text':'Text:',
- 'lang_input_url':'URL:',
- 'lang_input_title':'Title:',
- 'lang_input_target':'open in new window:'
- },
- 'validLink':'Supports only effective when a link is selected',
- 'httpPrompt':'The hyperlink you enter should start with "http|https|ftp://"!'
- },
- map:{
- 'static':{
- lang_city:"City",
- lang_address:"Adresse",
- city:{value:"Paris"},
- lang_search:"Search",
- lang_dynamicmap:"Dynamic map"
- },
- cityMsg:"Please enter the city name!",
- errorMsg:"Can't find the place!"
- },
- searchreplace:{
- 'static':{
- lang_tab_search:"Search",
- lang_tab_replace:"Replace",
- lang_search1:"Search",
- lang_search2:"Search",
- lang_replace:"Replace",
- lang_searchReg:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"',
- lang_searchReg1:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"',
- lang_case_sensitive1:"Case sense",
- lang_case_sensitive2:"Case sense",
- nextFindBtn:{value:"Next"},
- preFindBtn:{value:"Preview"},
- nextReplaceBtn:{value:"Next"},
- preReplaceBtn:{value:"Preview"},
- repalceBtn:{value:"Replace"},
- repalceAllBtn:{value:"Replace all"}
- },
- getEnd:"Has the search to the bottom!",
- getStart:"Has the search to the top!",
- countMsg:"Altogether replaced {#count} character(s)!"
- },
- snapscreen:{
- 'static':{
- lang_showMsg:"You should install the UEditor screenshots program first!",
- lang_download:"Download!",
- lang_step1:"Step1:Download the program and then run it",
- lang_step2:"Step2:After complete install,try to click the button again"
- }
- },
- spechars:{
- 'static':{},
- tsfh:"Special",
- lmsz:"Roman",
- szfh:"Numeral",
- rwfh:"Japanese",
- xlzm:"The Greek",
- ewzm:"Russian",
- pyzm:"Phonetic",
- yyyb:"English",
- zyzf:"Others"
- },
- 'edittable':{
- 'static':{
- 'lang_tableStyle':'Table style',
- 'lang_insertCaption':'Add table header row',
- 'lang_insertTitle':'Add table title row',
- 'lang_insertTitleCol':'Add table title col',
- 'lang_tableSize':'Automatically adjust table size',
- 'lang_autoSizeContent':'Adaptive by form text',
- 'lang_orderbycontent':"Table of contents sortable",
- 'lang_autoSizePage':'Page width adaptive',
- 'lang_example':'Example',
- 'lang_borderStyle':'Table Border',
- 'lang_color':'Color:'
- },
- captionName:'Caption',
- titleName:'Title',
- cellsName:'text',
- errorMsg:'There are merged cells, can not sort.'
- },
- 'edittip':{
- 'static':{
- lang_delRow:'Delete entire row',
- lang_delCol:'Delete entire col'
- }
- },
- 'edittd':{
- 'static':{
- lang_tdBkColor:'Background Color:'
- }
- },
- 'formula':{
- 'static':{
- }
- },
- wordimage:{
- 'static':{
- lang_resave:"The re-save step",
- uploadBtn:{src:"upload.png", alt:"Upload"},
- clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"},
- lang_step:" 1. Click top button to copy the url and then open the dialog to paste it. 2. Open after choose photos uploaded process."
- },
- fileType:"Image",
- flashError:"Flash initialization failed!",
- netError:"Network error! Please try again!",
- copySuccess:"URL has been copied!",
-
- 'flashI18n':{
- lang:encodeURI( '{"UploadingState":"totalNum: ${a},uploadComplete: ${b}", "BeforeUpload":"waitingNum: ${a}", "ExceedSize":"Size exceed${a}", "ErrorInPreview":"Preview failed", "DefaultDescription":"Description", "LoadingImage":"Loading..."}' ),
- uploadingTF:encodeURI( '{"font":"Arial", "size":12, "color":"0x000", "bold":"true", "italic":"false", "underline":"false"}' ),
- imageTF:encodeURI( '{"font":"Arial", "size":11, "color":"red", "bold":"false", "italic":"false", "underline":"false"}' ),
- textEncoding:"utf-8",
- addImageSkinURL:"addImage.png",
- allDeleteBtnUpSkinURL:"allDeleteBtnUpSkin.png",
- allDeleteBtnHoverSkinURL:"allDeleteBtnHoverSkin.png",
- rotateLeftBtnEnableSkinURL:"rotateLeftEnable.png",
- rotateLeftBtnDisableSkinURL:"rotateLeftDisable.png",
- rotateRightBtnEnableSkinURL:"rotateRightEnable.png",
- rotateRightBtnDisableSkinURL:"rotateRightDisable.png",
- deleteBtnEnableSkinURL:"deleteEnable.png",
- deleteBtnDisableSkinURL:"deleteDisable.png",
- backgroundURL:'',
- listBackgroundURL:'',
- buttonURL:'button.png'
- }
- },
- 'autosave': {
- 'success':'Local conservation success'
- }
-};
diff --git a/www/js/ueditor/lang/fr/images/addimage.png b/www/js/ueditor/lang/fr/images/addimage.png
deleted file mode 100644
index 3a2fd17121..0000000000
Binary files a/www/js/ueditor/lang/fr/images/addimage.png and /dev/null differ
diff --git a/www/js/ueditor/lang/fr/images/alldeletebtnhoverskin.png b/www/js/ueditor/lang/fr/images/alldeletebtnhoverskin.png
deleted file mode 100644
index 355eeabbd8..0000000000
Binary files a/www/js/ueditor/lang/fr/images/alldeletebtnhoverskin.png and /dev/null differ
diff --git a/www/js/ueditor/lang/fr/images/alldeletebtnupskin.png b/www/js/ueditor/lang/fr/images/alldeletebtnupskin.png
deleted file mode 100644
index 61658ce6f1..0000000000
Binary files a/www/js/ueditor/lang/fr/images/alldeletebtnupskin.png and /dev/null differ
diff --git a/www/js/ueditor/lang/fr/images/background.png b/www/js/ueditor/lang/fr/images/background.png
deleted file mode 100644
index d5bf5fdd8a..0000000000
Binary files a/www/js/ueditor/lang/fr/images/background.png and /dev/null differ
diff --git a/www/js/ueditor/lang/fr/images/button.png b/www/js/ueditor/lang/fr/images/button.png
deleted file mode 100644
index 098874cb1f..0000000000
Binary files a/www/js/ueditor/lang/fr/images/button.png and /dev/null differ
diff --git a/www/js/ueditor/lang/fr/images/copy.png b/www/js/ueditor/lang/fr/images/copy.png
deleted file mode 100644
index f982e8bcbc..0000000000
Binary files a/www/js/ueditor/lang/fr/images/copy.png and /dev/null differ
diff --git a/www/js/ueditor/lang/fr/images/deletedisable.png b/www/js/ueditor/lang/fr/images/deletedisable.png
deleted file mode 100644
index c8ee75094f..0000000000
Binary files a/www/js/ueditor/lang/fr/images/deletedisable.png and /dev/null differ
diff --git a/www/js/ueditor/lang/fr/images/deleteenable.png b/www/js/ueditor/lang/fr/images/deleteenable.png
deleted file mode 100644
index 26acc88356..0000000000
Binary files a/www/js/ueditor/lang/fr/images/deleteenable.png and /dev/null differ
diff --git a/www/js/ueditor/lang/fr/images/listbackground.png b/www/js/ueditor/lang/fr/images/listbackground.png
deleted file mode 100644
index 4f82ccd88f..0000000000
Binary files a/www/js/ueditor/lang/fr/images/listbackground.png and /dev/null differ
diff --git a/www/js/ueditor/lang/fr/images/localimage.png b/www/js/ueditor/lang/fr/images/localimage.png
deleted file mode 100644
index 12c8e6aefa..0000000000
Binary files a/www/js/ueditor/lang/fr/images/localimage.png and /dev/null differ
diff --git a/www/js/ueditor/lang/fr/images/music.png b/www/js/ueditor/lang/fr/images/music.png
deleted file mode 100644
index 2f495fe92f..0000000000
Binary files a/www/js/ueditor/lang/fr/images/music.png and /dev/null differ
diff --git a/www/js/ueditor/lang/fr/images/rotateleftdisable.png b/www/js/ueditor/lang/fr/images/rotateleftdisable.png
deleted file mode 100644
index 741526e0d5..0000000000
Binary files a/www/js/ueditor/lang/fr/images/rotateleftdisable.png and /dev/null differ
diff --git a/www/js/ueditor/lang/fr/images/rotateleftenable.png b/www/js/ueditor/lang/fr/images/rotateleftenable.png
deleted file mode 100644
index e164ddbd62..0000000000
Binary files a/www/js/ueditor/lang/fr/images/rotateleftenable.png and /dev/null differ
diff --git a/www/js/ueditor/lang/fr/images/rotaterightdisable.png b/www/js/ueditor/lang/fr/images/rotaterightdisable.png
deleted file mode 100644
index 5a78c26062..0000000000
Binary files a/www/js/ueditor/lang/fr/images/rotaterightdisable.png and /dev/null differ
diff --git a/www/js/ueditor/lang/fr/images/rotaterightenable.png b/www/js/ueditor/lang/fr/images/rotaterightenable.png
deleted file mode 100644
index d768531fca..0000000000
Binary files a/www/js/ueditor/lang/fr/images/rotaterightenable.png and /dev/null differ
diff --git a/www/js/ueditor/lang/fr/images/upload.png b/www/js/ueditor/lang/fr/images/upload.png
deleted file mode 100644
index 7bb15b3d6d..0000000000
Binary files a/www/js/ueditor/lang/fr/images/upload.png and /dev/null differ
diff --git a/www/js/ueditor/lang/zh-cn/images/copy.png b/www/js/ueditor/lang/zh-cn/images/copy.png
deleted file mode 100644
index b2536aac72..0000000000
Binary files a/www/js/ueditor/lang/zh-cn/images/copy.png and /dev/null differ
diff --git a/www/js/ueditor/lang/zh-cn/images/localimage.png b/www/js/ueditor/lang/zh-cn/images/localimage.png
deleted file mode 100644
index 7303c36431..0000000000
Binary files a/www/js/ueditor/lang/zh-cn/images/localimage.png and /dev/null differ
diff --git a/www/js/ueditor/lang/zh-cn/images/music.png b/www/js/ueditor/lang/zh-cn/images/music.png
deleted file mode 100644
index 354edebc34..0000000000
Binary files a/www/js/ueditor/lang/zh-cn/images/music.png and /dev/null differ
diff --git a/www/js/ueditor/lang/zh-cn/images/upload.png b/www/js/ueditor/lang/zh-cn/images/upload.png
deleted file mode 100644
index 08d4d92682..0000000000
Binary files a/www/js/ueditor/lang/zh-cn/images/upload.png and /dev/null differ
diff --git a/www/js/ueditor/lang/zh-cn/zh-cn.js b/www/js/ueditor/lang/zh-cn/zh-cn.js
deleted file mode 100644
index 10ff151628..0000000000
--- a/www/js/ueditor/lang/zh-cn/zh-cn.js
+++ /dev/null
@@ -1,669 +0,0 @@
-/**
- * Created with JetBrains PhpStorm.
- * User: taoqili
- * Date: 12-6-12
- * Time: 下午5:02
- * To change this template use File | Settings | File Templates.
- */
-UE.I18N['zh-cn'] = {
- 'labelMap':{
- 'anchor':'锚点', 'undo':'撤销', 'redo':'重做', 'bold':'加粗', 'indent':'首行缩进', 'snapscreen':'截图',
- 'italic':'斜体', 'underline':'下划线', 'strikethrough':'删除线', 'subscript':'下标','fontborder':'字符边框',
- 'superscript':'上标', 'formatmatch':'格式刷', 'source':'源代码', 'blockquote':'引用',
- 'pasteplain':'纯文本粘贴模式', 'selectall':'全选', 'print':'打印', 'preview':'预览',
- 'horizontal':'分隔线', 'removeformat':'清除格式', 'time':'时间', 'date':'日期',
- 'unlink':'取消链接', 'insertrow':'前插入行', 'insertcol':'前插入列', 'mergeright':'右合并单元格', 'mergedown':'下合并单元格',
- 'deleterow':'删除行', 'deletecol':'删除列', 'splittorows':'拆分成行',
- 'splittocols':'拆分成列', 'splittocells':'完全拆分单元格','deletecaption':'删除表格标题','inserttitle':'插入标题',
- 'mergecells':'合并多个单元格', 'deletetable':'删除表格', 'cleardoc':'清空文档','insertparagraphbeforetable':"表格前插入行",'insertcode':'代码语言',
- 'fontfamily':'字体', 'fontsize':'字号', 'paragraph':'段落格式', 'simpleupload':'单图上传', 'insertimage':'多图上传','edittable':'表格属性','edittd':'单元格属性', 'link':'超链接',
- 'emotion':'表情', 'spechars':'特殊字符', 'searchreplace':'查询替换', 'map':'Baidu地图', 'gmap':'Google地图',
- 'insertvideo':'视频', 'help':'帮助', 'justifyleft':'居左对齐', 'justifyright':'居右对齐', 'justifycenter':'居中对齐',
- 'justifyjustify':'两端对齐', 'forecolor':'字体颜色', 'backcolor':'背景色', 'insertorderedlist':'有序列表',
- 'insertunorderedlist':'无序列表', 'fullscreen':'全屏', 'directionalityltr':'从左向右输入', 'directionalityrtl':'从右向左输入',
- 'rowspacingtop':'段前距', 'rowspacingbottom':'段后距', 'pagebreak':'分页', 'insertframe':'插入Iframe', 'imagenone':'默认',
- 'imageleft':'左浮动', 'imageright':'右浮动', 'attachment':'附件', 'imagecenter':'居中', 'wordimage':'图片转存',
- 'lineheight':'行间距','edittip' :'编辑提示','customstyle':'自定义标题', 'autotypeset':'自动排版',
- 'webapp':'百度应用','touppercase':'字母大写', 'tolowercase':'字母小写','background':'背景','template':'模板','scrawl':'涂鸦',
- 'music':'音乐','inserttable':'插入表格','drafts': '从草稿箱加载', 'charts': '图表'
- },
- 'insertorderedlist':{
- 'num':'1,2,3...',
- 'num1':'1),2),3)...',
- 'num2':'(1),(2),(3)...',
- 'cn':'一,二,三....',
- 'cn1':'一),二),三)....',
- 'cn2':'(一),(二),(三)....',
- 'decimal':'1,2,3...',
- 'lower-alpha':'a,b,c...',
- 'lower-roman':'i,ii,iii...',
- 'upper-alpha':'A,B,C...',
- 'upper-roman':'I,II,III...'
- },
- 'insertunorderedlist':{
- 'circle':'○ 大圆圈',
- 'disc':'● 小黑点',
- 'square':'■ 小方块 ',
- 'dash' :'— 破折号',
- 'dot':' 。 小圆圈'
- },
- 'paragraph':{'p':'段落', 'h1':'标题 1', 'h2':'标题 2', 'h3':'标题 3', 'h4':'标题 4', 'h5':'标题 5', 'h6':'标题 6'},
- 'fontfamily':{
- 'songti':'宋体',
- 'kaiti':'楷体',
- 'heiti':'黑体',
- 'lishu':'隶书',
- 'yahei':'微软雅黑',
- 'andaleMono':'andale mono',
- 'arial': 'arial',
- 'arialBlack':'arial black',
- 'comicSansMs':'comic sans ms',
- 'impact':'impact',
- 'timesNewRoman':'times new roman'
- },
- 'customstyle':{
- 'tc':'标题居中',
- 'tl':'标题居左',
- 'im':'强调',
- 'hi':'明显强调'
- },
- 'autoupload': {
- 'exceedSizeError': '文件大小超出限制',
- 'exceedTypeError': '文件格式不允许',
- 'jsonEncodeError': '服务器返回格式错误',
- 'loading':"正在上传...",
- 'loadError':"上传错误",
- 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!'
- },
- 'simpleupload':{
- 'exceedSizeError': '文件大小超出限制',
- 'exceedTypeError': '文件格式不允许',
- 'jsonEncodeError': '服务器返回格式错误',
- 'loading':"正在上传...",
- 'loadError':"上传错误",
- 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!'
- },
- 'elementPathTip':"元素路径",
- 'wordCountTip':"字数统计",
- 'wordCountMsg':'当前已输入{#count}个字符, 您还可以输入{#leave}个字符。 ',
- 'wordOverFlowMsg':'
字数超出最大允许值,服务器可能拒绝保存! ',
- 'ok':"确认",
- 'cancel':"取消",
- 'closeDialog':"关闭对话框",
- 'tableDrag':"表格拖动必须引入uiUtils.js文件!",
- 'autofloatMsg':"工具栏浮动依赖编辑器UI,您首先需要引入UI文件!",
- 'loadconfigError': '获取后台配置项请求出错,上传功能将不能正常使用!',
- 'loadconfigFormatError': '后台配置项返回格式出错,上传功能将不能正常使用!',
- 'loadconfigHttpError': '请求后台配置项http错误,上传功能将不能正常使用!',
- 'snapScreen_plugin':{
- 'browserMsg':"仅支持IE浏览器!",
- 'callBackErrorMsg':"服务器返回数据有误,请检查配置项之后重试。",
- 'uploadErrorMsg':"截图上传失败,请检查服务器端环境! "
- },
- 'insertcode':{
- 'as3':'ActionScript 3',
- 'bash':'Bash/Shell',
- 'cpp':'C/C++',
- 'css':'CSS',
- 'cf':'ColdFusion',
- 'c#':'C#',
- 'delphi':'Delphi',
- 'diff':'Diff',
- 'erlang':'Erlang',
- 'groovy':'Groovy',
- 'html':'HTML',
- 'java':'Java',
- 'jfx':'JavaFX',
- 'js':'JavaScript',
- 'pl':'Perl',
- 'php':'PHP',
- 'plain':'Plain Text',
- 'ps':'PowerShell',
- 'python':'Python',
- 'ruby':'Ruby',
- 'scala':'Scala',
- 'sql':'SQL',
- 'vb':'Visual Basic',
- 'xml':'XML'
- },
- 'confirmClear':"确定清空当前文档么?",
- 'contextMenu':{
- 'delete':"删除",
- 'selectall':"全选",
- 'deletecode':"删除代码",
- 'cleardoc':"清空文档",
- 'confirmclear':"确定清空当前文档么?",
- 'unlink':"删除超链接",
- 'paragraph':"段落格式",
- 'edittable':"表格属性",
- 'aligntd':"单元格对齐方式",
- 'aligntable':'表格对齐方式',
- 'tableleft':'左浮动',
- 'tablecenter':'居中显示',
- 'tableright':'右浮动',
- 'edittd':"单元格属性",
- 'setbordervisible':'设置表格边线可见',
- 'justifyleft':'左对齐',
- 'justifyright':'右对齐',
- 'justifycenter':'居中对齐',
- 'justifyjustify':'两端对齐',
- 'table':"表格",
- 'inserttable':'插入表格',
- 'deletetable':"删除表格",
- 'insertparagraphbefore':"前插入段落",
- 'insertparagraphafter':'后插入段落',
- 'deleterow':"删除当前行",
- 'deletecol':"删除当前列",
- 'insertrow':"前插入行",
- 'insertcol':"左插入列",
- 'insertrownext':'后插入行',
- 'insertcolnext':'右插入列',
- 'insertcaption':'插入表格名称',
- 'deletecaption':'删除表格名称',
- 'inserttitle':'插入表格标题行',
- 'deletetitle':'删除表格标题行',
- 'inserttitlecol':'插入表格标题列',
- 'deletetitlecol':'删除表格标题列',
- 'averageDiseRow':'平均分布各行',
- 'averageDisCol':'平均分布各列',
- 'mergeright':"向右合并",
- 'mergeleft':"向左合并",
- 'mergedown':"向下合并",
- 'mergecells':"合并单元格",
- 'splittocells':"完全拆分单元格",
- 'splittocols':"拆分成列",
- 'splittorows':"拆分成行",
- 'tablesort':'表格排序',
- 'enablesort':'设置表格可排序',
- 'disablesort':'取消表格可排序',
- 'reversecurrent':'逆序当前',
- 'orderbyasc':'按ASCII字符升序',
- 'reversebyasc':'按ASCII字符降序',
- 'orderbynum':'按数值大小升序',
- 'reversebynum':'按数值大小降序',
- 'borderbk':'边框底纹',
- 'setcolor':'表格隔行变色',
- 'unsetcolor':'取消表格隔行变色',
- 'setbackground':'选区背景隔行',
- 'unsetbackground':'取消选区背景',
- 'redandblue':'红蓝相间',
- 'threecolorgradient':'三色渐变',
- 'copy':"复制(Ctrl + c)",
- 'copymsg': "浏览器不支持,请使用 'Ctrl + c'",
- 'paste':"粘贴(Ctrl + v)",
- 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'"
- },
- 'copymsg': "浏览器不支持,请使用 'Ctrl + c'",
- 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'",
- 'anthorMsg':"链接",
- 'clearColor':'清空颜色',
- 'standardColor':'标准颜色',
- 'themeColor':'主题颜色',
- 'property':'属性',
- 'default':'默认',
- 'modify':'修改',
- 'justifyleft':'左对齐',
- 'justifyright':'右对齐',
- 'justifycenter':'居中',
- 'justify':'默认',
- 'clear':'清除',
- 'anchorMsg':'锚点',
- 'delete':'删除',
- 'clickToUpload':"点击上传",
- 'unset':'尚未设置语言文件',
- 't_row':'行',
- 't_col':'列',
- 'more':'更多',
- 'pasteOpt':'粘贴选项',
- 'pasteSourceFormat':"保留源格式",
- 'tagFormat':'只保留标签',
- 'pasteTextFormat':'只保留文本',
- 'autoTypeSet':{
- 'mergeLine':"合并空行",
- 'delLine':"清除空行",
- 'removeFormat':"清除格式",
- 'indent':"首行缩进",
- 'alignment':"对齐方式",
- 'imageFloat':"图片浮动",
- 'removeFontsize':"清除字号",
- 'removeFontFamily':"清除字体",
- 'removeHtml':"清除冗余HTML代码",
- 'pasteFilter':"粘贴过滤",
- 'run':"执行",
- 'symbol':'符号转换',
- 'bdc2sb':'全角转半角',
- 'tobdc':'半角转全角'
- },
-
- 'background':{
- 'static':{
- 'lang_background_normal':'背景设置',
- 'lang_background_local':'在线图片',
- 'lang_background_set':'选项',
- 'lang_background_none':'无背景色',
- 'lang_background_colored':'有背景色',
- 'lang_background_color':'颜色设置',
- 'lang_background_netimg':'网络图片',
- 'lang_background_align':'对齐方式',
- 'lang_background_position':'精确定位',
- 'repeatType':{'options':["居中", "横向重复", "纵向重复", "平铺","自定义"]}
-
- },
- 'noUploadImage':"当前未上传过任何图片!",
- 'toggleSelect':"单击可切换选中状态\n原图尺寸: "
- },
- //===============dialog i18N=======================
- 'insertimage':{
- 'static':{
- 'lang_tab_remote':"插入图片", //节点
- 'lang_tab_upload':"本地上传",
- 'lang_tab_online':"在线管理",
- 'lang_tab_search':"图片搜索",
- 'lang_input_url':"地 址:",
- 'lang_input_size':"大 小:",
- 'lang_input_width':"宽度",
- 'lang_input_height':"高度",
- 'lang_input_border':"边 框:",
- 'lang_input_vhspace':"边 距:",
- 'lang_input_title':"描 述:",
- 'lang_input_align':'图片浮动方式:',
- 'lang_imgLoading':" 图片加载中……",
- 'lang_start_upload':"开始上传",
- 'lock':{'title':"锁定宽高比例"}, //属性
- 'searchType':{'title':"图片类型", 'options':["新闻", "壁纸", "表情", "头像"]}, //select的option
- 'searchTxt':{'value':"请输入搜索关键词"},
- 'searchBtn':{'value':"百度一下"},
- 'searchReset':{'value':"清空搜索"},
- 'noneAlign':{'title':'无浮动'},
- 'leftAlign':{'title':'左浮动'},
- 'rightAlign':{'title':'右浮动'},
- 'centerAlign':{'title':'居中独占一行'}
- },
- 'uploadSelectFile':'点击选择图片',
- 'uploadAddFile':'继续添加',
- 'uploadStart':'开始上传',
- 'uploadPause':'暂停上传',
- 'uploadContinue':'继续上传',
- 'uploadRetry':'重试上传',
- 'uploadDelete':'删除',
- 'uploadTurnLeft':'向左旋转',
- 'uploadTurnRight':'向右旋转',
- 'uploadPreview':'预览中',
- 'uploadNoPreview':'不能预览',
- 'updateStatusReady': '选中_张图片,共_KB。',
- 'updateStatusConfirm': '已成功上传_张照片,_张照片上传失败',
- 'updateStatusFinish': '共_张(_KB),_张上传成功',
- 'updateStatusError': ',_张上传失败。',
- 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。',
- 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
- 'errorExceedSize':'文件大小超出',
- 'errorFileType':'文件格式不允许',
- 'errorInterrupt':'文件传输中断',
- 'errorUploadRetry':'上传失败,请重试',
- 'errorHttp':'http请求错误',
- 'errorServerUpload':'服务器返回出错',
- 'remoteLockError':"宽高不正确,不能所定比例",
- 'numError':"请输入正确的长度或者宽度值!例如:123,400",
- 'imageUrlError':"不允许的图片格式或者图片域!",
- 'imageLoadError':"图片加载失败!请检查链接地址或网络状态!",
- 'searchRemind':"请输入搜索关键词",
- 'searchLoading':"图片加载中,请稍后……",
- 'searchRetry':" :( ,抱歉,没有找到图片!请重试一次!"
- },
- 'attachment':{
- 'static':{
- 'lang_tab_upload': '上传附件',
- 'lang_tab_online': '在线附件',
- 'lang_start_upload':"开始上传",
- 'lang_drop_remind':"可以将文件拖到这里,单次最多可选100个文件"
- },
- 'uploadSelectFile':'点击选择文件',
- 'uploadAddFile':'继续添加',
- 'uploadStart':'开始上传',
- 'uploadPause':'暂停上传',
- 'uploadContinue':'继续上传',
- 'uploadRetry':'重试上传',
- 'uploadDelete':'删除',
- 'uploadTurnLeft':'向左旋转',
- 'uploadTurnRight':'向右旋转',
- 'uploadPreview':'预览中',
- 'updateStatusReady': '选中_个文件,共_KB。',
- 'updateStatusConfirm': '已成功上传_个文件,_个文件上传失败',
- 'updateStatusFinish': '共_个(_KB),_个上传成功',
- 'updateStatusError': ',_张上传失败。',
- 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。',
- 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
- 'errorExceedSize':'文件大小超出',
- 'errorFileType':'文件格式不允许',
- 'errorInterrupt':'文件传输中断',
- 'errorUploadRetry':'上传失败,请重试',
- 'errorHttp':'http请求错误',
- 'errorServerUpload':'服务器返回出错'
- },
- 'insertvideo':{
- 'static':{
- 'lang_tab_insertV':"插入视频",
- 'lang_tab_searchV':"搜索视频",
- 'lang_tab_uploadV':"上传视频",
- 'lang_video_url':"视频网址",
- 'lang_video_size':"视频尺寸",
- 'lang_videoW':"宽度",
- 'lang_videoH':"高度",
- 'lang_alignment':"对齐方式",
- 'videoSearchTxt':{'value':"请输入搜索关键字!"},
- 'videoType':{'options':["全部", "热门", "娱乐", "搞笑", "体育", "科技", "综艺"]},
- 'videoSearchBtn':{'value':"百度一下"},
- 'videoSearchReset':{'value':"清空结果"},
-
- 'lang_input_fileStatus':' 当前未上传文件',
- 'startUpload':{'style':"background:url(upload.png) no-repeat;"},
-
- 'lang_upload_size':"视频尺寸",
- 'lang_upload_width':"宽度",
- 'lang_upload_height':"高度",
- 'lang_upload_alignment':"对齐方式",
- 'lang_format_advice':"建议使用mp4格式."
-
- },
- 'numError':"请输入正确的数值,如123,400",
- 'floatLeft':"左浮动",
- 'floatRight':"右浮动",
- '"default"':"默认",
- 'block':"独占一行",
- 'urlError':"输入的视频地址有误,请检查后再试!",
- 'loading':" 视频加载中,请等待……",
- 'clickToSelect':"点击选中",
- 'goToSource':'访问源视频',
- 'noVideo':" 抱歉,找不到对应的视频,请重试!",
-
- 'browseFiles':'浏览文件',
- 'uploadSuccess':'上传成功!',
- 'delSuccessFile':'从成功队列中移除',
- 'delFailSaveFile':'移除保存失败文件',
- 'statusPrompt':' 个文件已上传! ',
- 'flashVersionError':'当前Flash版本过低,请更新FlashPlayer后重试!',
- 'flashLoadingError':'Flash加载失败!请检查路径或网络状态',
- 'fileUploadReady':'等待上传……',
- 'delUploadQueue':'从上传队列中移除',
- 'limitPrompt1':'单次不能选择超过',
- 'limitPrompt2':'个文件!请重新选择!',
- 'delFailFile':'移除失败文件',
- 'fileSizeLimit':'文件大小超出限制!',
- 'emptyFile':'空文件无法上传!',
- 'fileTypeError':'文件类型不允许!',
- 'unknownError':'未知错误!',
- 'fileUploading':'上传中,请等待……',
- 'cancelUpload':'取消上传',
- 'netError':'网络错误',
- 'failUpload':'上传失败!',
- 'serverIOError':'服务器IO错误!',
- 'noAuthority':'无权限!',
- 'fileNumLimit':'上传个数限制',
- 'failCheck':'验证失败,本次上传被跳过!',
- 'fileCanceling':'取消中,请等待……',
- 'stopUploading':'上传已停止……',
-
- 'uploadSelectFile':'点击选择文件',
- 'uploadAddFile':'继续添加',
- 'uploadStart':'开始上传',
- 'uploadPause':'暂停上传',
- 'uploadContinue':'继续上传',
- 'uploadRetry':'重试上传',
- 'uploadDelete':'删除',
- 'uploadTurnLeft':'向左旋转',
- 'uploadTurnRight':'向右旋转',
- 'uploadPreview':'预览中',
- 'updateStatusReady': '选中_个文件,共_KB。',
- 'updateStatusConfirm': '成功上传_个,_个失败',
- 'updateStatusFinish': '共_个(_KB),_个成功上传',
- 'updateStatusError': ',_张上传失败。',
- 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。',
- 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
- 'errorExceedSize':'文件大小超出',
- 'errorFileType':'文件格式不允许',
- 'errorInterrupt':'文件传输中断',
- 'errorUploadRetry':'上传失败,请重试',
- 'errorHttp':'http请求错误',
- 'errorServerUpload':'服务器返回出错'
- },
- 'webapp':{
- 'tip1':"本功能由百度APP提供,如看到此页面,请各位站长首先申请百度APPKey!",
- 'tip2':"申请完成之后请至ueditor.config.js中配置获得的appkey! ",
- 'applyFor':"点此申请",
- 'anthorApi':"百度API"
- },
- 'template':{
- 'static':{
- 'lang_template_bkcolor':'背景颜色',
- 'lang_template_clear' : '保留原有内容',
- 'lang_template_select' : '选择模板'
- },
- 'blank':"空白文档",
- 'blog':"博客文章",
- 'resume':"个人简历",
- 'richText':"图文混排",
- 'sciPapers':"科技论文"
-
-
- },
- 'scrawl':{
- 'static':{
- 'lang_input_previousStep':"上一步",
- 'lang_input_nextsStep':"下一步",
- 'lang_input_clear':'清空',
- 'lang_input_addPic':'添加背景',
- 'lang_input_ScalePic':'缩放背景',
- 'lang_input_removePic':'删除背景',
- 'J_imgTxt':{title:'添加背景图片'}
- },
- 'noScarwl':"尚未作画,白纸一张~",
- 'scrawlUpLoading':"涂鸦上传中,别急哦~",
- 'continueBtn':"继续",
- 'imageError':"糟糕,图片读取失败了!",
- 'backgroundUploading':'背景图片上传中,别急哦~'
- },
- 'music':{
- 'static':{
- 'lang_input_tips':"输入歌手/歌曲/专辑,搜索您感兴趣的音乐!",
- 'J_searchBtn':{value:'搜索歌曲'}
- },
- 'emptyTxt':'未搜索到相关音乐结果,请换一个关键词试试。',
- 'chapter':'歌曲',
- 'singer':'歌手',
- 'special':'专辑',
- 'listenTest':'试听'
- },
- 'anchor':{
- 'static':{
- 'lang_input_anchorName':'锚点名字:'
- }
- },
- 'charts':{
- 'static':{
- 'lang_data_source':'数据源:',
- 'lang_chart_format': '图表格式:',
- 'lang_data_align': '数据对齐方式',
- 'lang_chart_align_same': '数据源与图表X轴Y轴一致',
- 'lang_chart_align_reverse': '数据源与图表X轴Y轴相反',
- 'lang_chart_title': '图表标题',
- 'lang_chart_main_title': '主标题:',
- 'lang_chart_sub_title': '子标题:',
- 'lang_chart_x_title': 'X轴标题:',
- 'lang_chart_y_title': 'Y轴标题:',
- 'lang_chart_tip': '提示文字',
- 'lang_cahrt_tip_prefix': '提示文字前缀:',
- 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀',
- 'lang_chart_data_unit': '数据单位',
- 'lang_chart_data_unit_title': '单位:',
- 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃',
- 'lang_chart_type': '图表类型:',
- 'lang_prev_btn': '上一个',
- 'lang_next_btn': '下一个'
- }
- },
- 'emotion':{
- 'static':{
- 'lang_input_choice':'精选',
- 'lang_input_Tuzki':'兔斯基',
- 'lang_input_BOBO':'BOBO',
- 'lang_input_lvdouwa':'绿豆蛙',
- 'lang_input_babyCat':'baby猫',
- 'lang_input_bubble':'泡泡',
- 'lang_input_youa':'有啊'
- }
- },
- 'gmap':{
- 'static':{
- 'lang_input_address':'地址',
- 'lang_input_search':'搜索',
- 'address':{value:"北京"}
- },
- searchError:'无法定位到该地址!'
- },
- 'help':{
- 'static':{
- 'lang_input_about':'关于UEditor',
- 'lang_input_shortcuts':'快捷键',
- 'lang_input_introduction':'UEditor是由百度web前端研发部开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点。开源基于BSD协议,允许自由使用和修改代码。',
- 'lang_Txt_shortcuts':'快捷键',
- 'lang_Txt_func':'功能',
- 'lang_Txt_bold':'给选中字设置为加粗',
- 'lang_Txt_copy':'复制选中内容',
- 'lang_Txt_cut':'剪切选中内容',
- 'lang_Txt_Paste':'粘贴',
- 'lang_Txt_undo':'重新执行上次操作',
- 'lang_Txt_redo':'撤销上一次操作',
- 'lang_Txt_italic':'给选中字设置为斜体',
- 'lang_Txt_underline':'给选中字加下划线',
- 'lang_Txt_selectAll':'全部选中',
- 'lang_Txt_visualEnter':'软回车',
- 'lang_Txt_fullscreen':'全屏'
- }
- },
- 'insertframe':{
- 'static':{
- 'lang_input_address':'地址:',
- 'lang_input_width':'宽度:',
- 'lang_input_height':'高度:',
- 'lang_input_isScroll':'允许滚动条:',
- 'lang_input_frameborder':'显示框架边框:',
- 'lang_input_alignMode':'对齐方式:',
- 'align':{title:"对齐方式", options:["默认", "左对齐", "右对齐", "居中"]}
- },
- 'enterAddress':'请输入地址!'
- },
- 'link':{
- 'static':{
- 'lang_input_text':'文本内容:',
- 'lang_input_url':'链接地址:',
- 'lang_input_title':'标题:',
- 'lang_input_target':'是否在新窗口打开:'
- },
- 'validLink':'只支持选中一个链接时生效',
- 'httpPrompt':'您输入的超链接中不包含http等协议名称,默认将为您添加http://前缀'
- },
- 'map':{
- 'static':{
- lang_city:"城市",
- lang_address:"地址",
- city:{value:"北京"},
- lang_search:"搜索",
- lang_dynamicmap:"插入动态地图"
- },
- cityMsg:"请选择城市",
- errorMsg:"抱歉,找不到该位置!"
- },
- 'searchreplace':{
- 'static':{
- lang_tab_search:"查找",
- lang_tab_replace:"替换",
- lang_search1:"查找",
- lang_search2:"查找",
- lang_replace:"替换",
- lang_searchReg:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”',
- lang_searchReg1:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”',
- lang_case_sensitive1:"区分大小写",
- lang_case_sensitive2:"区分大小写",
- nextFindBtn:{value:"下一个"},
- preFindBtn:{value:"上一个"},
- nextReplaceBtn:{value:"下一个"},
- preReplaceBtn:{value:"上一个"},
- repalceBtn:{value:"替换"},
- repalceAllBtn:{value:"全部替换"}
- },
- getEnd:"已经搜索到文章末尾!",
- getStart:"已经搜索到文章头部",
- countMsg:"总共替换了{#count}处!"
- },
- 'snapscreen':{
- 'static':{
- lang_showMsg:"截图功能需要首先安装UEditor截图插件! ",
- lang_download:"点此下载",
- lang_step1:"第一步,下载UEditor截图插件并运行安装。",
- lang_step2:"第二步,插件安装完成后即可使用,如不生效,请重启浏览器后再试!"
- }
- },
- 'spechars':{
- 'static':{},
- tsfh:"特殊字符",
- lmsz:"罗马字符",
- szfh:"数学字符",
- rwfh:"日文字符",
- xlzm:"希腊字母",
- ewzm:"俄文字符",
- pyzm:"拼音字母",
- yyyb:"英语音标",
- zyzf:"其他"
- },
- 'edittable':{
- 'static':{
- 'lang_tableStyle':'表格样式',
- 'lang_insertCaption':'添加表格名称行',
- 'lang_insertTitle':'添加表格标题行',
- 'lang_insertTitleCol':'添加表格标题列',
- 'lang_orderbycontent':"使表格内容可排序",
- 'lang_tableSize':'自动调整表格尺寸',
- 'lang_autoSizeContent':'按表格文字自适应',
- 'lang_autoSizePage':'按页面宽度自适应',
- 'lang_example':'示例',
- 'lang_borderStyle':'表格边框',
- 'lang_color':'颜色:'
- },
- captionName:'表格名称',
- titleName:'标题',
- cellsName:'内容',
- errorMsg:'有合并单元格,不可排序'
- },
- 'edittip':{
- 'static':{
- lang_delRow:'删除整行',
- lang_delCol:'删除整列'
- }
- },
- 'edittd':{
- 'static':{
- lang_tdBkColor:'背景颜色:'
- }
- },
- 'formula':{
- 'static':{
- }
- },
- 'wordimage':{
- 'static':{
- lang_resave:"转存步骤",
- uploadBtn:{src:"upload.png",alt:"上传"},
- clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"},
- lang_step:"1、点击顶部复制按钮,将地址复制到剪贴板;2、点击添加照片按钮,在弹出的对话框中使用Ctrl+V粘贴地址;3、点击打开后选择图片上传流程。"
- },
- 'fileType':"图片",
- 'flashError':"FLASH初始化失败,请检查FLASH插件是否正确安装!",
- 'netError':"网络连接错误,请重试!",
- 'copySuccess':"图片地址已经复制!",
- 'flashI18n':{} //留空默认中文
- },
- 'autosave': {
- 'saving':'保存中...',
- 'success':'本地保存成功'
- }
-};
diff --git a/www/js/ueditor/lang/zh-tw/images/copy.png b/www/js/ueditor/lang/zh-tw/images/copy.png
deleted file mode 100644
index b2536aac72..0000000000
Binary files a/www/js/ueditor/lang/zh-tw/images/copy.png and /dev/null differ
diff --git a/www/js/ueditor/lang/zh-tw/images/localimage.png b/www/js/ueditor/lang/zh-tw/images/localimage.png
deleted file mode 100644
index 7303c36431..0000000000
Binary files a/www/js/ueditor/lang/zh-tw/images/localimage.png and /dev/null differ
diff --git a/www/js/ueditor/lang/zh-tw/images/music.png b/www/js/ueditor/lang/zh-tw/images/music.png
deleted file mode 100644
index 354edebc34..0000000000
Binary files a/www/js/ueditor/lang/zh-tw/images/music.png and /dev/null differ
diff --git a/www/js/ueditor/lang/zh-tw/images/upload.png b/www/js/ueditor/lang/zh-tw/images/upload.png
deleted file mode 100644
index 08d4d92682..0000000000
Binary files a/www/js/ueditor/lang/zh-tw/images/upload.png and /dev/null differ
diff --git a/www/js/ueditor/lang/zh-tw/zh-tw.js b/www/js/ueditor/lang/zh-tw/zh-tw.js
deleted file mode 100644
index 6d60711da0..0000000000
--- a/www/js/ueditor/lang/zh-tw/zh-tw.js
+++ /dev/null
@@ -1,669 +0,0 @@
-/**
- * Created with JetBrains PhpStorm.
- * User: taoqili
- * Date: 12-6-12
- * Time: 下午5:02
- * To change this template use File | Settings | File Templates.
- */
-UE.I18N['zh-tw'] = {
- 'labelMap':{
- 'anchor':'錨點', 'undo':'撤銷', 'redo':'重做', 'bold':'加粗', 'indent':'首行縮進', 'snapscreen':'截圖',
- 'italic':'斜體', 'underline':'下劃線', 'strikethrough':'刪除綫', 'subscript':'下標','fontborder':'字元邊框',
- 'superscript':'上標', 'formatmatch':'格式刷', 'source':'原始碼', 'blockquote':'引用',
- 'pasteplain':'純文字檔案粘貼模式', 'selectall':'全選', 'print':'打印', 'preview':'預覽',
- 'horizontal':'分隔綫', 'removeformat':'清除格式', 'time':'時間', 'date':'日期',
- 'unlink':'取消連結', 'insertrow':'前插入行', 'insertcol':'前插入列', 'mergeright':'右合併單元格', 'mergedown':'下合併單元格',
- 'deleterow':'刪除行', 'deletecol':'刪除列', 'splittorows':'拆分成行',
- 'splittocols':'拆分成列', 'splittocells':'完全拆分單元格','deletecaption':'刪除表格標題','inserttitle':'插入標題',
- 'mergecells':'合併多個單元格', 'deletetable':'刪除表格', 'cleardoc':'清空文檔','insertparagraphbeforetable':"表格前插入行",'insertcode':'代碼語言',
- 'fontfamily':'字型', 'fontsize':'字型大小', 'paragraph':'段落格式', 'simpleupload':'單圖上傳', 'insertimage':'多圖上傳','edittable':'表格屬性','edittd':'單元格屬性', 'link':'超連結',
- 'emotion':'表情', 'spechars':'特殊字元', 'searchreplace':'查詢替換', 'map':'Baidu地圖', 'gmap':'Google地圖',
- 'insertvideo':'視頻', 'help':'幫助', 'justifyleft':'居左對齊', 'justifyright':'居右對齊', 'justifycenter':'居中對齊',
- 'justifyjustify':'兩端對齊', 'forecolor':'字型顏色', 'backcolor':'背景色', 'insertorderedlist':'有序列表',
- 'insertunorderedlist':'無序列表', 'fullscreen':'全屏', 'directionalityltr':'從左向右輸入', 'directionalityrtl':'從右向左輸入',
- 'rowspacingtop':'段前距', 'rowspacingbottom':'段後距', 'pagebreak':'分頁', 'insertframe':'插入Iframe', 'imagenone':'預設',
- 'imageleft':'左浮動', 'imageright':'右浮動', 'attachment':'附件', 'imagecenter':'居中', 'wordimage':'圖片轉存',
- 'lineheight':'行間距','edittip' :'編輯提示','customstyle':'自定義標題', 'autotypeset':'自動排版',
- 'webapp':'百度應用','touppercase':'字母大寫', 'tolowercase':'字母小寫','background':'背景','template':'模板','scrawl':'塗鴉',
- 'music':'音樂','inserttable':'插入表格','drafts': '從草稿箱加載', 'charts': '圖表'
- },
- 'insertorderedlist':{
- 'num':'1,2,3...',
- 'num1':'1),2),3)...',
- 'num2':'(1),(2),(3)...',
- 'cn':'一,二,三....',
- 'cn1':'一),二),三)....',
- 'cn2':'(一),(二),(三)....',
- 'decimal':'1,2,3...',
- 'lower-alpha':'a,b,c...',
- 'lower-roman':'i,ii,iii...',
- 'upper-alpha':'A,B,C...',
- 'upper-roman':'I,II,III...'
- },
- 'insertunorderedlist':{
- 'circle':'○ 大圓圈',
- 'disc':'● 小黑點',
- 'square':'■ 小方塊 ',
- 'dash' :'— 破折號',
- 'dot':' 。 小圓圈'
- },
- 'paragraph':{'p':'段落', 'h1':'標題 1', 'h2':'標題 2', 'h3':'標題 3', 'h4':'標題 4', 'h5':'標題 5', 'h6':'標題 6'},
- 'fontfamily':{
- 'songti':'宋體',
- 'kaiti':'楷體',
- 'heiti':'黑體',
- 'lishu':'隷書',
- 'yahei':'微軟雅黑',
- 'andaleMono':'andale mono',
- 'arial': 'arial',
- 'arialBlack':'arial black',
- 'comicSansMs':'comic sans ms',
- 'impact':'impact',
- 'timesNewRoman':'times new roman'
- },
- 'customstyle':{
- 'tc':'標題居中',
- 'tl':'標題居左',
- 'im':'強調',
- 'hi':'明顯強調'
- },
- 'autoupload': {
- 'exceedSizeError': '檔案大小超出限制',
- 'exceedTypeError': '檔案格式不允許',
- 'jsonEncodeError': '伺服器返回格式錯誤',
- 'loading':"正在上傳...",
- 'loadError':"上傳錯誤",
- 'errorLoadConfig': '後端配置項沒有正常加載,上傳插件不能正常使用!'
- },
- 'simpleupload':{
- 'exceedSizeError': '檔案大小超出限制',
- 'exceedTypeError': '檔案格式不允許',
- 'jsonEncodeError': '伺服器返回格式錯誤',
- 'loading':"正在上傳...",
- 'loadError':"上傳錯誤",
- 'errorLoadConfig': '後端配置項沒有正常加載,上傳插件不能正常使用!'
- },
- 'elementPathTip':"元素路徑",
- 'wordCountTip':"字數統計",
- 'wordCountMsg':'當前已輸入{#count}個字元, 您還可以輸入{#leave}個字元。 ',
- 'wordOverFlowMsg':'
字數超出最大允許值,伺服器可能拒絶保存! ',
- 'ok':"確認",
- 'cancel':"取消",
- 'closeDialog':"關閉對話框",
- 'tableDrag':"表格拖動必須引入uiUtils.js檔案!",
- 'autofloatMsg':"工具欄浮動依賴編輯器UI,您首先需要引入UI檔案!",
- 'loadconfigError': '獲取後台配置項請求出錯,上傳功能將不能正常使用!',
- 'loadconfigFormatError': '後台配置項返回格式出錯,上傳功能將不能正常使用!',
- 'loadconfigHttpError': '請求後台配置項http錯誤,上傳功能將不能正常使用!',
- 'snapScreen_plugin':{
- 'browserMsg':"僅支持IE瀏覽器!",
- 'callBackErrorMsg':"伺服器返回數據有誤,請檢查配置項之後重試。",
- 'uploadErrorMsg':"截圖上傳失敗,請檢查伺服器端環境! "
- },
- 'insertcode':{
- 'as3':'ActionScript 3',
- 'bash':'Bash/Shell',
- 'cpp':'C/C++',
- 'css':'CSS',
- 'cf':'ColdFusion',
- 'c#':'C#',
- 'delphi':'Delphi',
- 'diff':'Diff',
- 'erlang':'Erlang',
- 'groovy':'Groovy',
- 'html':'HTML',
- 'java':'Java',
- 'jfx':'JavaFX',
- 'js':'JavaScript',
- 'pl':'Perl',
- 'php':'PHP',
- 'plain':'Plain Text',
- 'ps':'PowerShell',
- 'python':'Python',
- 'ruby':'Ruby',
- 'scala':'Scala',
- 'sql':'SQL',
- 'vb':'Visual Basic',
- 'xml':'XML'
- },
- 'confirmClear':"確定清空當前文檔麼?",
- 'contextMenu':{
- 'delete':"刪除",
- 'selectall':"全選",
- 'deletecode':"刪除代碼",
- 'cleardoc':"清空文檔",
- 'confirmclear':"確定清空當前文檔麼?",
- 'unlink':"刪除超連結",
- 'paragraph':"段落格式",
- 'edittable':"表格屬性",
- 'aligntd':"單元格對齊方式",
- 'aligntable':'表格對齊方式',
- 'tableleft':'左浮動',
- 'tablecenter':'居中顯示',
- 'tableright':'右浮動',
- 'edittd':"單元格屬性",
- 'setbordervisible':'設置表格邊線可見',
- 'justifyleft':'左對齊',
- 'justifyright':'右對齊',
- 'justifycenter':'居中對齊',
- 'justifyjustify':'兩端對齊',
- 'table':"表格",
- 'inserttable':'插入表格',
- 'deletetable':"刪除表格",
- 'insertparagraphbefore':"前插入段落",
- 'insertparagraphafter':'後插入段落',
- 'deleterow':"刪除當前行",
- 'deletecol':"刪除當前列",
- 'insertrow':"前插入行",
- 'insertcol':"左插入列",
- 'insertrownext':'後插入行',
- 'insertcolnext':'右插入列',
- 'insertcaption':'插入表格名稱',
- 'deletecaption':'刪除表格名稱',
- 'inserttitle':'插入表格標題行',
- 'deletetitle':'刪除表格標題行',
- 'inserttitlecol':'插入表格標題列',
- 'deletetitlecol':'刪除表格標題列',
- 'averageDiseRow':'平均分佈各行',
- 'averageDisCol':'平均分佈各列',
- 'mergeright':"向右合併",
- 'mergeleft':"向左合併",
- 'mergedown':"向下合併",
- 'mergecells':"合併單元格",
- 'splittocells':"完全拆分單元格",
- 'splittocols':"拆分成列",
- 'splittorows':"拆分成行",
- 'tablesort':'表格排序',
- 'enablesort':'設置表格可排序',
- 'disablesort':'取消表格可排序',
- 'reversecurrent':'逆序當前',
- 'orderbyasc':'按ASCII字元升序',
- 'reversebyasc':'按ASCII字元降序',
- 'orderbynum':'按數值大小升序',
- 'reversebynum':'按數值大小降序',
- 'borderbk':'邊框底紋',
- 'setcolor':'表格隔行變色',
- 'unsetcolor':'取消表格隔行變色',
- 'setbackground':'選區背景隔行',
- 'unsetbackground':'取消選區背景',
- 'redandblue':'紅藍相間',
- 'threecolorgradient':'三色漸變',
- 'copy':"複製(Ctrl + c)",
- 'copymsg': "瀏覽器不支持,請使用 'Ctrl + c'",
- 'paste':"粘貼(Ctrl + v)",
- 'pastemsg': "瀏覽器不支持,請使用 'Ctrl + v'"
- },
- 'copymsg': "瀏覽器不支持,請使用 'Ctrl + c'",
- 'pastemsg': "瀏覽器不支持,請使用 'Ctrl + v'",
- 'anthorMsg':"連結",
- 'clearColor':'清空顏色',
- 'standardColor':'標準顏色',
- 'themeColor':'主題顏色',
- 'property':'屬性',
- 'default':'預設',
- 'modify':'修改',
- 'justifyleft':'左對齊',
- 'justifyright':'右對齊',
- 'justifycenter':'居中',
- 'justify':'預設',
- 'clear':'清除',
- 'anchorMsg':'錨點',
- 'delete':'刪除',
- 'clickToUpload':"點擊上傳",
- 'unset':'尚未設置語言檔案',
- 't_row':'行',
- 't_col':'列',
- 'more':'更多',
- 'pasteOpt':'粘貼選項',
- 'pasteSourceFormat':"保留源格式",
- 'tagFormat':'只保留標籤',
- 'pasteTextFormat':'只保留文本',
- 'autoTypeSet':{
- 'mergeLine':"合併空行",
- 'delLine':"清除空行",
- 'removeFormat':"清除格式",
- 'indent':"首行縮進",
- 'alignment':"對齊方式",
- 'imageFloat':"圖片浮動",
- 'removeFontsize':"清除字型大小",
- 'removeFontFamily':"清除字型",
- 'removeHtml':"清除冗餘HTML代碼",
- 'pasteFilter':"粘貼過濾",
- 'run':"執行",
- 'symbol':'符號轉換',
- 'bdc2sb':'全形轉半形',
- 'tobdc':'半形轉全形'
- },
-
- 'background':{
- 'static':{
- 'lang_background_normal':'背景設置',
- 'lang_background_local':'在線圖片',
- 'lang_background_set':'選項',
- 'lang_background_none':'無背景色',
- 'lang_background_colored':'有背景色',
- 'lang_background_color':'顏色設置',
- 'lang_background_netimg':'網絡圖片',
- 'lang_background_align':'對齊方式',
- 'lang_background_position':'精確定位',
- 'repeatType':{'options':["居中", "橫向重複", "縱向重複", "平鋪","自定義"]}
-
- },
- 'noUploadImage':"當前未上傳過任何圖片!",
- 'toggleSelect':"單擊可切換選中狀態\n原圖尺寸: "
- },
- //===============dialog i18N=======================
- 'insertimage':{
- 'static':{
- 'lang_tab_remote':"插入圖片", //節點
- 'lang_tab_upload':"本地上傳",
- 'lang_tab_online':"在線管理",
- 'lang_tab_search':"圖片搜索",
- 'lang_input_url':"地 址:",
- 'lang_input_size':"大 小:",
- 'lang_input_width':"寬度",
- 'lang_input_height':"高度",
- 'lang_input_border':"邊 框:",
- 'lang_input_vhspace':"邊 距:",
- 'lang_input_title':"描 述:",
- 'lang_input_align':'圖片浮動方式:',
- 'lang_imgLoading':" 圖片加載中……",
- 'lang_start_upload':"開始上傳",
- 'lock':{'title':"鎖定寬高比例"}, //屬性
- 'searchType':{'title':"圖片類型", 'options':["新聞", "壁紙", "表情", "頭像"]}, //select的option
- 'searchTxt':{'value':"請輸入搜索關鍵詞"},
- 'searchBtn':{'value':"百度一下"},
- 'searchReset':{'value':"清空搜索"},
- 'noneAlign':{'title':'無浮動'},
- 'leftAlign':{'title':'左浮動'},
- 'rightAlign':{'title':'右浮動'},
- 'centerAlign':{'title':'居中獨占一行'}
- },
- 'uploadSelectFile':'點擊選擇圖片',
- 'uploadAddFile':'繼續添加',
- 'uploadStart':'開始上傳',
- 'uploadPause':'暫停上傳',
- 'uploadContinue':'繼續上傳',
- 'uploadRetry':'重試上傳',
- 'uploadDelete':'刪除',
- 'uploadTurnLeft':'向左旋轉',
- 'uploadTurnRight':'向右旋轉',
- 'uploadPreview':'預覽中',
- 'uploadNoPreview':'不能預覽',
- 'updateStatusReady': '選中_張圖片,共_KB。',
- 'updateStatusConfirm': '已成功上傳_張照片,_張照片上傳失敗',
- 'updateStatusFinish': '共_張(_KB),_張上傳成功',
- 'updateStatusError': ',_張上傳失敗。',
- 'errorNotSupport': 'WebUploader 不支持您的瀏覽器!如果你使用的是IE瀏覽器,請嘗試升級 flash 播放器。',
- 'errorLoadConfig': '後端配置項沒有正常加載,上傳插件不能正常使用!',
- 'errorExceedSize':'檔案大小超出',
- 'errorFileType':'檔案格式不允許',
- 'errorInterrupt':'檔案傳輸中斷',
- 'errorUploadRetry':'上傳失敗,請重試',
- 'errorHttp':'http請求錯誤',
- 'errorServerUpload':'伺服器返回出錯',
- 'remoteLockError':"寬高不正確,不能所定比例",
- 'numError':"請輸入正確的長度或者寬度值!例如:123,400",
- 'imageUrlError':"不允許的圖片格式或者圖片域!",
- 'imageLoadError':"圖片加載失敗!請檢查連結地址或網絡狀態!",
- 'searchRemind':"請輸入搜索關鍵詞",
- 'searchLoading':"圖片加載中,請稍後……",
- 'searchRetry':" :( ,抱歉,沒有找到圖片!請重試一次!"
- },
- 'attachment':{
- 'static':{
- 'lang_tab_upload': '上傳附件',
- 'lang_tab_online': '在綫附件',
- 'lang_start_upload':"開始上傳",
- 'lang_drop_remind':"可以將檔案拖到這裡,單次最多可選100個檔案"
- },
- 'uploadSelectFile':'點擊選擇檔案',
- 'uploadAddFile':'繼續添加',
- 'uploadStart':'開始上傳',
- 'uploadPause':'暫停上傳',
- 'uploadContinue':'繼續上傳',
- 'uploadRetry':'重試上傳',
- 'uploadDelete':'刪除',
- 'uploadTurnLeft':'向左旋轉',
- 'uploadTurnRight':'向右旋轉',
- 'uploadPreview':'預覽中',
- 'updateStatusReady': '選中_個檔案,共_KB。',
- 'updateStatusConfirm': '已成功上傳_個檔案,_個檔案上傳失敗',
- 'updateStatusFinish': '共_個(_KB),_個上傳成功',
- 'updateStatusError': ',_張上傳失敗。',
- 'errorNotSupport': 'WebUploader 不支持您的瀏覽器!如果你使用的是IE瀏覽器,請嘗試升級 flash 播放器。',
- 'errorLoadConfig': '後端配置項沒有正常加載,上傳插件不能正常使用!',
- 'errorExceedSize':'檔案大小超出',
- 'errorFileType':'檔案格式不允許',
- 'errorInterrupt':'檔案傳輸中斷',
- 'errorUploadRetry':'上傳失敗,請重試',
- 'errorHttp':'http請求錯誤',
- 'errorServerUpload':'伺服器返回出錯'
- },
- 'insertvideo':{
- 'static':{
- 'lang_tab_insertV':"插入視頻",
- 'lang_tab_searchV':"搜索視頻",
- 'lang_tab_uploadV':"上傳視頻",
- 'lang_video_url':"視頻網址",
- 'lang_video_size':"視頻尺寸",
- 'lang_videoW':"寬度",
- 'lang_videoH':"高度",
- 'lang_alignment':"對齊方式",
- 'videoSearchTxt':{'value':"請輸入搜索關鍵字!"},
- 'videoType':{'options':["全部", "熱門", "娛樂", "搞笑", "體育", "科技", "綜藝"]},
- 'videoSearchBtn':{'value':"百度一下"},
- 'videoSearchReset':{'value':"清空結果"},
-
- 'lang_input_fileStatus':' 當前未上傳檔案',
- 'startUpload':{'style':"background:url(upload.png) no-repeat;"},
-
- 'lang_upload_size':"視頻尺寸",
- 'lang_upload_width':"寬度",
- 'lang_upload_height':"高度",
- 'lang_upload_alignment':"對齊方式",
- 'lang_format_advice':"建議使用mp4格式."
-
- },
- 'numError':"請輸入正確的數值,如123,400",
- 'floatLeft':"左浮動",
- 'floatRight':"右浮動",
- '"default"':"預設",
- 'block':"獨占一行",
- 'urlError':"輸入的視頻地址有誤,請檢查後再試!",
- 'loading':" 視頻加載中,請等待……",
- 'clickToSelect':"點擊選中",
- 'goToSource':'訪問源視頻',
- 'noVideo':" 抱歉,找不到對應的視頻,請重試!",
-
- 'browseFiles':'瀏覽檔案',
- 'uploadSuccess':'上傳成功!',
- 'delSuccessFile':'從成功隊列中移除',
- 'delFailSaveFile':'移除保存失敗檔案',
- 'statusPrompt':' 個檔案已上傳! ',
- 'flashVersionError':'當前Flash版本過低,請更新FlashPlayer後重試!',
- 'flashLoadingError':'Flash加載失敗!請檢查路徑或網絡狀態',
- 'fileUploadReady':'等待上傳……',
- 'delUploadQueue':'從上傳隊列中移除',
- 'limitPrompt1':'單次不能選擇超過',
- 'limitPrompt2':'個檔案!請重新選擇!',
- 'delFailFile':'移除失敗檔案',
- 'fileSizeLimit':'檔案大小超出限制!',
- 'emptyFile':'空檔案無法上傳!',
- 'fileTypeError':'檔案類型不允許!',
- 'unknownError':'未知錯誤!',
- 'fileUploading':'上傳中,請等待……',
- 'cancelUpload':'取消上傳',
- 'netError':'網絡錯誤',
- 'failUpload':'上傳失敗!',
- 'serverIOError':'伺服器IO錯誤!',
- 'noAuthority':'無權限!',
- 'fileNumLimit':'上傳個數限制',
- 'failCheck':'驗證失敗,本次上傳被跳過!',
- 'fileCanceling':'取消中,請等待……',
- 'stopUploading':'上傳已停止……',
-
- 'uploadSelectFile':'點擊選擇檔案',
- 'uploadAddFile':'繼續添加',
- 'uploadStart':'開始上傳',
- 'uploadPause':'暫停上傳',
- 'uploadContinue':'繼續上傳',
- 'uploadRetry':'重試上傳',
- 'uploadDelete':'刪除',
- 'uploadTurnLeft':'向左旋轉',
- 'uploadTurnRight':'向右旋轉',
- 'uploadPreview':'預覽中',
- 'updateStatusReady': '選中_個檔案,共_KB。',
- 'updateStatusConfirm': '成功上傳_個,_個失敗',
- 'updateStatusFinish': '共_個(_KB),_個成功上傳',
- 'updateStatusError': ',_張上傳失敗。',
- 'errorNotSupport': 'WebUploader 不支持您的瀏覽器!如果你使用的是IE瀏覽器,請嘗試升級 flash 播放器。',
- 'errorLoadConfig': '後端配置項沒有正常加載,上傳插件不能正常使用!',
- 'errorExceedSize':'檔案大小超出',
- 'errorFileType':'檔案格式不允許',
- 'errorInterrupt':'檔案傳輸中斷',
- 'errorUploadRetry':'上傳失敗,請重試',
- 'errorHttp':'http請求錯誤',
- 'errorServerUpload':'伺服器返回出錯'
- },
- 'webapp':{
- 'tip1':"本功能由百度APP提供,如看到此頁面,請各位站長首先申請百度APPKey!",
- 'tip2':"申請完成之後請至ueditor.config.js中配置獲得的appkey! ",
- 'applyFor':"點此申請",
- 'anthorApi':"百度API"
- },
- 'template':{
- 'static':{
- 'lang_template_bkcolor':'背景顏色',
- 'lang_template_clear' : '保留原有內容',
- 'lang_template_select' : '選擇模板'
- },
- 'blank':"空白文檔",
- 'blog':"博客文章",
- 'resume':"個人簡歷",
- 'richText':"圖文混排",
- 'sciPapers':"科技論文"
-
-
- },
- 'scrawl':{
- 'static':{
- 'lang_input_previousStep':"上一步",
- 'lang_input_nextsStep':"下一步",
- 'lang_input_clear':'清空',
- 'lang_input_addPic':'添加背景',
- 'lang_input_ScalePic':'縮放背景',
- 'lang_input_removePic':'刪除背景',
- 'J_imgTxt':{title:'添加背景圖片'}
- },
- 'noScarwl':"尚未作畫,白紙一張~",
- 'scrawlUpLoading':"塗鴉上傳中,別急哦~",
- 'continueBtn':"繼續",
- 'imageError':"糟糕,圖片讀取失敗了!",
- 'backgroundUploading':'背景圖片上傳中,別急哦~'
- },
- 'music':{
- 'static':{
- 'lang_input_tips':"輸入歌手/歌曲/專輯,搜索您感興趣的音樂!",
- 'J_searchBtn':{value:'搜索歌曲'}
- },
- 'emptyTxt':'未搜索到相關音樂結果,請換一個關鍵詞試試。',
- 'chapter':'歌曲',
- 'singer':'歌手',
- 'special':'專輯',
- 'listenTest':'試聽'
- },
- 'anchor':{
- 'static':{
- 'lang_input_anchorName':'錨點名字:'
- }
- },
- 'charts':{
- 'static':{
- 'lang_data_source':'數據源:',
- 'lang_chart_format': '圖表格式:',
- 'lang_data_align': '數據對齊方式',
- 'lang_chart_align_same': '數據源與圖表X軸Y軸一致',
- 'lang_chart_align_reverse': '數據源與圖表X軸Y軸相反',
- 'lang_chart_title': '圖表標題',
- 'lang_chart_main_title': '主標題:',
- 'lang_chart_sub_title': '子標題:',
- 'lang_chart_x_title': 'X軸標題:',
- 'lang_chart_y_title': 'Y軸標題:',
- 'lang_chart_tip': '提示文字',
- 'lang_cahrt_tip_prefix': '提示文字首碼:',
- 'lang_cahrt_tip_description': '僅餅圖有效, 當滑鼠移動到餅圖中相應的塊上時,提示框內的文字的首碼',
- 'lang_chart_data_unit': '數據單位',
- 'lang_chart_data_unit_title': '單位:',
- 'lang_chart_data_unit_description': '顯示在每個數據點上的數據的單位, 比如: 溫度的單位 ℃',
- 'lang_chart_type': '圖表類型:',
- 'lang_prev_btn': '上一個',
- 'lang_next_btn': '下一個'
- }
- },
- 'emotion':{
- 'static':{
- 'lang_input_choice':'精選',
- 'lang_input_Tuzki':'兔斯基',
- 'lang_input_BOBO':'BOBO',
- 'lang_input_lvdouwa':'綠豆蛙',
- 'lang_input_babyCat':'baby貓',
- 'lang_input_bubble':'泡泡',
- 'lang_input_youa':'有啊'
- }
- },
- 'gmap':{
- 'static':{
- 'lang_input_address':'地址',
- 'lang_input_search':'搜索',
- 'address':{value:"北京"}
- },
- searchError:'無法定位到該地址!'
- },
- 'help':{
- 'static':{
- 'lang_input_about':'關於UEditor',
- 'lang_input_shortcuts':'快捷鍵',
- 'lang_input_introduction':'UEditor是由百度web前端研發部開發的所見即所得富文本web編輯器,具有輕量,可定製,注重用戶體驗等特點。開源基于BSD協議,允許自由使用和修改代碼。',
- 'lang_Txt_shortcuts':'快捷鍵',
- 'lang_Txt_func':'功能',
- 'lang_Txt_bold':'給選中字設置為加粗',
- 'lang_Txt_copy':'複製選中內容',
- 'lang_Txt_cut':'剪切選中內容',
- 'lang_Txt_Paste':'粘貼',
- 'lang_Txt_undo':'重新執行上次操作',
- 'lang_Txt_redo':'撤銷上一次操作',
- 'lang_Txt_italic':'給選中字設置為斜體',
- 'lang_Txt_underline':'給選中字加下劃線',
- 'lang_Txt_selectAll':'全部選中',
- 'lang_Txt_visualEnter':'軟回車',
- 'lang_Txt_fullscreen':'全屏'
- }
- },
- 'insertframe':{
- 'static':{
- 'lang_input_address':'地址:',
- 'lang_input_width':'寬度:',
- 'lang_input_height':'高度:',
- 'lang_input_isScroll':'允許捲動條:',
- 'lang_input_frameborder':'顯示框架邊框:',
- 'lang_input_alignMode':'對齊方式:',
- 'align':{title:"對齊方式", options:["預設", "左對齊", "右對齊", "居中"]}
- },
- 'enterAddress':'請輸入地址!'
- },
- 'link':{
- 'static':{
- 'lang_input_text':'文本內容:',
- 'lang_input_url':'連結地址:',
- 'lang_input_title':'標題:',
- 'lang_input_target':'是否在新窗口打開:'
- },
- 'validLink':'只支持選中一個連結時生效',
- 'httpPrompt':'您輸入的超連結中不包含http等協議名稱,預設將為您添加http://首碼'
- },
- 'map':{
- 'static':{
- lang_city:"城市",
- lang_address:"地址",
- city:{value:"北京"},
- lang_search:"搜索",
- lang_dynamicmap:"插入動態地圖"
- },
- cityMsg:"請選擇城市",
- errorMsg:"抱歉,找不到該位置!"
- },
- 'searchreplace':{
- 'static':{
- lang_tab_search:"查找",
- lang_tab_replace:"替換",
- lang_search1:"查找",
- lang_search2:"查找",
- lang_replace:"替換",
- lang_searchReg:'支持正則表達式,添加前後斜杠標示為正則表達式,例如“/表達式/”',
- lang_searchReg1:'支持正則表達式,添加前後斜杠標示為正則表達式,例如“/表達式/”',
- lang_case_sensitive1:"區分大小寫",
- lang_case_sensitive2:"區分大小寫",
- nextFindBtn:{value:"下一個"},
- preFindBtn:{value:"上一個"},
- nextReplaceBtn:{value:"下一個"},
- preReplaceBtn:{value:"上一個"},
- repalceBtn:{value:"替換"},
- repalceAllBtn:{value:"全部替換"}
- },
- getEnd:"已經搜索到文章末尾!",
- getStart:"已經搜索到文章頭部",
- countMsg:"總共替換了{#count}處!"
- },
- 'snapscreen':{
- 'static':{
- lang_showMsg:"截圖功能需要首先安裝UEditor截圖插件! ",
- lang_download:"點此下載",
- lang_step1:"第一步,下載UEditor截圖插件並運行安裝。",
- lang_step2:"第二步,插件安裝完成後即可使用,如不生效,請重啟瀏覽器後再試!"
- }
- },
- 'spechars':{
- 'static':{},
- tsfh:"特殊字元",
- lmsz:"羅馬字元",
- szfh:"數學字元",
- rwfh:"日文字元",
- xlzm:"希臘字母",
- ewzm:"俄文字元",
- pyzm:"拼音字母",
- yyyb:"英語音標",
- zyzf:"其他"
- },
- 'edittable':{
- 'static':{
- 'lang_tableStyle':'表格樣式',
- 'lang_insertCaption':'添加表格名稱行',
- 'lang_insertTitle':'添加表格標題行',
- 'lang_insertTitleCol':'添加表格標題列',
- 'lang_orderbycontent':"使表格內容可排序",
- 'lang_tableSize':'自動調整表格尺寸',
- 'lang_autoSizeContent':'按表格文字自適應',
- 'lang_autoSizePage':'按頁面寬度自適應',
- 'lang_example':'示例',
- 'lang_borderStyle':'表格邊框',
- 'lang_color':'顏色:'
- },
- captionName:'表格名稱',
- titleName:'標題',
- cellsName:'內容',
- errorMsg:'有合併單元格,不可排序'
- },
- 'edittip':{
- 'static':{
- lang_delRow:'刪除整行',
- lang_delCol:'刪除整列'
- }
- },
- 'edittd':{
- 'static':{
- lang_tdBkColor:'背景顏色:'
- }
- },
- 'formula':{
- 'static':{
- }
- },
- 'wordimage':{
- 'static':{
- lang_resave:"轉存步驟",
- uploadBtn:{src:"upload.png",alt:"上傳"},
- clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"},
- lang_step:"1、點擊頂部複製按鈕,將地址複製到剪貼板;2、點擊添加照片按鈕,在彈出的對話框中使用Ctrl+V粘貼地址;3、點擊打開後選擇圖片上傳流程。"
- },
- 'fileType':"圖片",
- 'flashError':"FLASH初始化失敗,請檢查FLASH插件是否正確安裝!",
- 'netError':"網絡連接錯誤,請重試!",
- 'copySuccess':"圖片地址已經複製!",
- 'flashI18n':{} //留空預設中文
- },
- 'autosave': {
- 'saving':'保存中...',
- 'success':'本地保存成功'
- }
-};
diff --git a/www/js/ueditor/themes/default/css/ueditor.css b/www/js/ueditor/themes/default/css/ueditor.css
deleted file mode 100644
index db8f49ed42..0000000000
--- a/www/js/ueditor/themes/default/css/ueditor.css
+++ /dev/null
@@ -1,1604 +0,0 @@
-/*基础UI构建
-*/
-/* common layer */
-.edui-default .edui-box {
- padding: 0;
- margin: 0;
- overflow: hidden;
- border: none;
- }
-.edui-default a.edui-box {
- display: block;
- color: black;
- text-decoration: none;
- }
-.edui-default a.edui-box:hover {
- text-decoration: none;
- }
-.edui-default a.edui-box:active {
- text-decoration: none;
- }
-.edui-default table.edui-box {
- border-collapse: collapse;
- }
-.edui-default ul.edui-box {
- list-style-type: none;
- }
-div.edui-box {
- position: relative;
- display: inline-block !important;
- vertical-align: top;
- }
-.edui-default .edui-clearfix {
- zoom: 1;
- }
-.edui-default .edui-clearfix:after {
- display: block;
- clear: both;
- content: '\20';
- }
-* html div.edui-box {
- display: inline !important;
- }
-*:first-child + html div.edui-box {
- display: inline !important;
- }
-/* control layout */
-.edui-default .edui-button-body,
-.edui-splitbutton-body,
-.edui-menubutton-body,
-.edui-combox-body {
- position: relative;
- }
-.edui-default .edui-popup {
- position: absolute;
- -webkit-user-select: none;
- -moz-user-select: none;
- }
-.edui-default .edui-popup .edui-shadow {
- position: absolute;
- z-index: -1;
- }
-.edui-default .edui-popup .edui-bordereraser {
- position: absolute;
- overflow: hidden;
- }
-.edui-default .edui-tablepicker .edui-canvas {
- position: relative;
- }
-.edui-default .edui-tablepicker .edui-canvas .edui-overlay {
- position: absolute;
- }
-.edui-default .edui-dialog-modalmask,
-.edui-dialog-dragmask {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- }
-.edui-default .edui-toolbar {
- position: relative;
- }
-/*
- * default theme
- */
-.edui-default .edui-label {
- cursor: default;
- }
-.edui-default span.edui-clickable {
- color: blue;
- text-decoration: underline;
- cursor: pointer;
- }
-.edui-default span.edui-unclickable {
- color: gray;
- cursor: default;
- }
-/* 工具栏 */
-.edui-default .edui-toolbar {
- width: auto;
- height: auto;
- padding: 1px;
- overflow: hidden;
- cursor: default;
- /*全屏下单独一行不占位*/
- zoom: 1;
- -webkit-user-select: none;
- -moz-user-select: none;
- }
-.edui-default .edui-toolbar .edui-button,
-.edui-default .edui-toolbar .edui-splitbutton,
-.edui-default .edui-toolbar .edui-menubutton,
-.edui-default .edui-toolbar .edui-combox {
- margin: 1px;
- }
-/*UI工具栏、编辑区域、底部*/
-.edui-default .edui-editor {
- position: relative;
- overflow: visible;
- background-color: white;
- border: 1px solid #d4d4d4;
- border-radius: 0;
- }
-.edui-editor div {
- width: auto;
- height: auto;
- }
-.edui-default .edui-editor-toolbarbox {
- position: relative;
- zoom: 1;
- border-top-left-radius: 0;
- border-top-right-radius: 0;
- }
-.edui-default .edui-editor-toolbarboxouter {
- background-color: #fafafa;
- background-repeat: repeat-x;
- border-bottom: 1px solid #d4d4d4;
-
- *zoom: 1;
- }
-.edui-default .edui-editor-toolbarboxinner {
- padding: 2px;
- }
-.edui-default .edui-editor-iframeholder {
- position: relative;
- }
-.edui-default .edui-editor-bottomContainer {
- overflow: hidden;
- }
-.edui-default .edui-editor-bottomContainer table {
- width: 100%;
- height: 0;
- overflow: hidden;
- border-spacing: 0;
- }
-.edui-default .edui-editor-bottomContainer td {
- font-family: Arial, Helvetica, Tahoma, Verdana, Sans-Serif;
- font-size: 12px;
- line-height: 20px;
- white-space: nowrap;
- border-top: 1px solid #ccc;
- }
-.edui-default .edui-editor-wordcount {
- margin-right: 5px;
- color: #aaa;
- text-align: right;
- }
-.edui-default .edui-editor-scale {
- width: 12px;
- }
-.edui-default .edui-editor-scale .edui-editor-icon {
- float: right;
- width: 100%;
- height: 12px;
- margin-top: 10px;
- cursor: se-resize;
- background: url(../images/scale.png) no-repeat;
- }
-.edui-default .edui-editor-breadcrumb {
- margin: 2px 0 0 3px;
- }
-.edui-default .edui-editor-breadcrumb span {
- color: blue;
- text-decoration: underline;
- cursor: pointer;
- }
-.edui-default .edui-toolbar .edui-for-fullscreen {
- float: right;
- }
-.edui-default .edui-bubble .edui-popup-content {
- padding: 5px;
- font-family: "宋体";
- font-size: 10pt;
- background-color: #fff6d9;
- border: 1px solid #dcac6c;
- }
-.edui-default .edui-editor-toolbarmsg {
- position: absolute;
- bottom: -25px;
- left: 0;
- z-index: 1009;
- width: 99.9%;
- background-color: #fff6d9;
- border-bottom: 1px solid #ccc;
- }
-.edui-default .edui-editor-toolbarmsg-upload {
- position: absolute;
- top: 5px;
- left: 350px;
- width: 100px;
- height: 16px;
- font-size: 14px;
- line-height: 16px;
- color: blue;
- cursor: pointer;
- }
-.edui-default .edui-editor-toolbarmsg-label {
- padding: 4px;
- font-size: 12px;
- line-height: 16px;
- }
-.edui-default .edui-editor-toolbarmsg-close {
- float: right;
- width: 20px;
- height: 16px;
- line-height: 16px;
- color: red;
- cursor: pointer;
- }
-.edui-default .edui-list .edui-bordereraser {
- display: none;
- }
-.edui-default .edui-listitem {
- padding: 1px;
- white-space: nowrap;
- }
-.edui-default .edui-list .edui-state-hover {
- position: relative;
- padding: 0;
- background-color: #fff5d4;
- border: 1px solid #dcac6c;
- }
-.edui-default .edui-for-fontfamily .edui-listitem-label {
- min-width: 130px;
- height: 22px;
- padding-left: 5px;
- font-size: 12px;
- line-height: 22px;
-
- _width: 120px;
- }
-.edui-default .edui-for-insertcode .edui-listitem-label {
- min-width: 120px;
- height: 22px;
- padding-left: 5px;
- font-size: 12px;
- line-height: 22px;
-
- _width: 120px;
- }
-.edui-default .edui-for-underline .edui-listitem-label {
- min-width: 120px;
- padding: 3px 5px;
- font-size: 12px;
-
- _width: 120px;
- }
-.edui-default .edui-for-fontsize .edui-listitem-label {
- min-width: 120px;
- padding: 3px 5px;
-
- _width: 120px;
- }
-.edui-default .edui-for-paragraph .edui-listitem-label {
- min-width: 200px;
- padding: 2px 5px;
-
- _width: 200px;
- }
-.edui-default .edui-for-rowspacingtop .edui-listitem-label,
-.edui-default .edui-for-rowspacingbottom .edui-listitem-label {
- min-width: 53px;
- padding: 2px 5px;
-
- _width: 53px;
- }
-.edui-default .edui-for-lineheight .edui-listitem-label {
- min-width: 53px;
- padding: 2px 5px;
-
- _width: 53px;
- }
-.edui-default .edui-for-customstyle .edui-listitem-label {
- width: 200px !important;
- min-width: 200px;
- padding: 2px 5px;
-
- _width: 200px;
- }
-/* 可选中按钮弹出菜单*/
-.edui-default .edui-menu {
- z-index: 3000;
- }
-.edui-default .edui-menu .edui-popup-content {
- padding: 3px;
- }
-.edui-default .edui-menu-body {
- min-width: 170px;
- background: url("../images/sparator_v.png") repeat-y 25px;
-
- _width: 150px;
- }
-.edui-default .edui-menuitem {
- height: 20px;
- vertical-align: top;
- cursor: default;
- }
-.edui-default .edui-menuitem .edui-icon {
- width: 20px !important;
- height: 20px !important;
- background: url(../images/icons.png) 0 -4000px;
- background: url(../images/icons.gif) 0 -4000px\9;
- }
-.edui-default .edui-menuitem .edui-label {
- height: 20px;
- padding-left: 10px;
- font-size: 12px;
- line-height: 20px;
- }
-.edui-default .edui-state-checked .edui-menuitem-body {
- background: url("../images/icons-all.gif") no-repeat 6px -205px;
- }
-.edui-default .edui-state-disabled .edui-menuitem-label {
- color: gray;
- }
-/*不可选中菜单按钮 */
-.edui-default .edui-toolbar .edui-combox-body .edui-button-body {
- width: 60px;
- height: 20px;
- padding-left: 5px;
- margin: 0 3px 0 0;
- font-size: 12px;
- line-height: 20px;
- white-space: nowrap;
- }
-.edui-default .edui-toolbar .edui-combox-body .edui-arrow {
- width: 9px;
- height: 20px;
- background: url(../images/icons.png) -741px 0;
-
- _background: url(../images/icons.gif) -741px 0;
- }
-.edui-default .edui-toolbar .edui-combox .edui-combox-body {
- background-color: white;
- border: 1px solid #ccc;
- border-radius: 2px;
-
- -webkit-border-radius: 2px;
- -moz-border-radius: 2px;
- }
-.edui-default .edui-toolbar .edui-combox-body .edui-splitborder {
- display: none;
- }
-.edui-default .edui-toolbar .edui-combox-body .edui-arrow {
- border-left: 1px solid #ccc;
- }
-.edui-default .edui-toolbar .edui-state-hover .edui-combox-body {
- background-color: #fff5d4;
- border: 1px solid #dcac6c;
- }
-.edui-default .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow {
- border-left: 1px solid #dcac6c;
- }
-.edui-default .edui-toolbar .edui-state-checked .edui-combox-body {
- background-color: #ffe69f;
- border: 1px solid #dcac6c;
- }
-.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow {
- border-left: 1px solid #dcac6c;
- }
-.edui-toolbar .edui-state-disabled .edui-combox-body {
- background-color: #f0f0ee;
- filter: alpha(opacity=30);
- opacity: .3;
- }
-.edui-toolbar .edui-state-opened .edui-combox-body {
- background-color: white;
- border: 1px solid gray;
- }
-/*普通按钮样式及状态*/
-.edui-default .edui-toolbar .edui-button .edui-icon,
-.edui-default .edui-toolbar .edui-menubutton .edui-icon,
-.edui-default .edui-toolbar .edui-splitbutton .edui-icon {
- width: 20px !important;
- height: 20px !important;
- background-image: url(../images/icons.png);
- background-image: url(../images/icons.gif) \9;
- }
-.edui-default .edui-toolbar .edui-button .edui-button-wrap {
- position: relative;
- padding: 1px;
- }
-.edui-default .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap {
- padding: 0;
- background-color: #fff5d4;
- border: 1px solid #dcac6c;
- }
-.edui-default .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap {
- padding: 0;
- background-color: #ffe69f;
- border: 1px solid #dcac6c;
- border-radius: 2px;
-
- -webkit-border-radius: 2px;
- -moz-border-radius: 2px;
- }
-.edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap {
- padding: 0;
- background-color: #fff;
- border: 1px solid gray;
- }
-.edui-default .edui-toolbar .edui-state-disabled .edui-label {
- color: #ccc;
- }
-.edui-default .edui-toolbar .edui-state-disabled .edui-icon {
- filter: alpha(opacity=30);
- opacity: .3;
- }
-/* toolbar icons */
-.edui-default .edui-for-undo .edui-icon {
- background-position: -160px 0;
- }
-.edui-default .edui-for-redo .edui-icon {
- background-position: -100px 0;
- }
-.edui-default .edui-for-bold .edui-icon {
- background-position: 0 0;
- }
-.edui-default .edui-for-italic .edui-icon {
- background-position: -60px 0;
- }
-.edui-default .edui-for-fontborder .edui-icon {
- background-position: -160px -40px;
- }
-.edui-default .edui-for-underline .edui-icon {
- background-position: -140px 0;
- }
-.edui-default .edui-for-strikethrough .edui-icon {
- background-position: -120px 0;
- }
-.edui-default .edui-for-subscript .edui-icon {
- background-position: -600px 0;
- }
-.edui-default .edui-for-superscript .edui-icon {
- background-position: -620px 0;
- }
-.edui-default .edui-for-blockquote .edui-icon {
- background-position: -220px 0;
- }
-.edui-default .edui-for-forecolor .edui-icon {
- background-position: -720px 0;
- }
-.edui-default .edui-for-backcolor .edui-icon {
- background-position: -760px 0;
- }
-.edui-default .edui-for-inserttable .edui-icon {
- background-position: -580px -20px;
- }
-.edui-default .edui-for-autotypeset .edui-icon {
- background-position: -640px -40px;
- }
-.edui-default .edui-for-justifyleft .edui-icon {
- background-position: -460px 0;
- }
-.edui-default .edui-for-justifycenter .edui-icon {
- background-position: -420px 0;
- }
-.edui-default .edui-for-justifyright .edui-icon {
- background-position: -480px 0;
- }
-.edui-default .edui-for-justifyjustify .edui-icon {
- background-position: -440px 0;
- }
-.edui-default .edui-for-insertorderedlist .edui-icon {
- background-position: -80px 0;
- }
-.edui-default .edui-for-insertunorderedlist .edui-icon {
- background-position: -20px 0;
- }
-.edui-default .edui-for-lineheight .edui-icon {
- background-position: -725px -40px;
- }
-.edui-default .edui-for-rowspacingbottom .edui-icon {
- background-position: -745px -40px;
- }
-.edui-default .edui-for-rowspacingtop .edui-icon {
- background-position: -765px -40px;
- }
-.edui-default .edui-for-horizontal .edui-icon {
- background-position: -360px 0;
- }
-.edui-default .edui-for-link .edui-icon {
- background-position: -500px 0;
- }
-.edui-default .edui-for-code .edui-icon {
- background-position: -440px -40px;
- }
-.edui-default .edui-for-insertimage .edui-icon {
- background-position: -726px -77px;
- }
-.edui-default .edui-for-insertframe .edui-icon {
- background-position: -240px -40px;
- }
-.edui-default .edui-for-emoticon .edui-icon {
- background-position: -60px -20px;
- }
-.edui-default .edui-for-spechars .edui-icon {
- background-position: -240px 0;
- }
-.edui-default .edui-for-help .edui-icon {
- background-position: -340px 0;
- }
-.edui-default .edui-for-print .edui-icon {
- background-position: -440px -20px;
- }
-.edui-default .edui-for-preview .edui-icon {
- background-position: -420px -20px;
- }
-.edui-default .edui-for-selectall .edui-icon {
- background-position: -400px -20px;
- }
-.edui-default .edui-for-searchreplace .edui-icon {
- background-position: -520px -20px;
- }
-.edui-default .edui-for-map .edui-icon {
- background-position: -40px -40px;
- }
-.edui-default .edui-for-gmap .edui-icon {
- background-position: -260px -40px;
- }
-.edui-default .edui-for-insertvideo .edui-icon {
- background-position: -320px -20px;
- }
-.edui-default .edui-for-time .edui-icon {
- background-position: -160px -20px;
- }
-.edui-default .edui-for-date .edui-icon {
- background-position: -140px -20px;
- }
-.edui-default .edui-for-cut .edui-icon {
- background-position: -680px 0;
- }
-.edui-default .edui-for-copy .edui-icon {
- background-position: -700px 0;
- }
-.edui-default .edui-for-paste .edui-icon {
- background-position: -560px 0;
- }
-.edui-default .edui-for-formatmatch .edui-icon {
- background-position: -40px 0;
- }
-.edui-default .edui-for-pasteplain .edui-icon {
- background-position: -360px -20px;
- }
-.edui-default .edui-for-directionalityltr .edui-icon {
- background-position: -20px -20px;
- }
-.edui-default .edui-for-directionalityrtl .edui-icon {
- background-position: -40px -20px;
- }
-.edui-default .edui-for-source .edui-icon {
- background-position: -261px 0;
- }
-.edui-default .edui-for-removeformat .edui-icon {
- background-position: -580px 0;
- }
-.edui-default .edui-for-unlink .edui-icon {
- background-position: -640px 0;
- }
-.edui-default .edui-for-touppercase .edui-icon {
- background-position: -786px 0;
- }
-.edui-default .edui-for-tolowercase .edui-icon {
- background-position: -806px 0;
- }
-.edui-default .edui-for-insertrow .edui-icon {
- background-position: -478px -76px;
- }
-.edui-default .edui-for-insertrownext .edui-icon {
- background-position: -498px -76px;
- }
-.edui-default .edui-for-insertcol .edui-icon {
- background-position: -455px -76px;
- }
-.edui-default .edui-for-insertcolnext .edui-icon {
- background-position: -429px -76px;
- }
-.edui-default .edui-for-mergeright .edui-icon {
- background-position: -60px -40px;
- }
-.edui-default .edui-for-mergedown .edui-icon {
- background-position: -80px -40px;
- }
-.edui-default .edui-for-splittorows .edui-icon {
- background-position: -100px -40px;
- }
-.edui-default .edui-for-splittocols .edui-icon {
- background-position: -120px -40px;
- }
-.edui-default .edui-for-insertparagraphbeforetable .edui-icon {
- background-position: -140px -40px;
- }
-.edui-default .edui-for-deleterow .edui-icon {
- background-position: -660px -20px;
- }
-.edui-default .edui-for-deletecol .edui-icon {
- background-position: -640px -20px;
- }
-.edui-default .edui-for-splittocells .edui-icon {
- background-position: -800px -20px;
- }
-.edui-default .edui-for-mergecells .edui-icon {
- background-position: -760px -20px;
- }
-.edui-default .edui-for-deletetable .edui-icon {
- background-position: -620px -20px;
- }
-.edui-default .edui-for-cleardoc .edui-icon {
- background-position: -520px 0;
- }
-.edui-default .edui-for-fullscreen .edui-icon {
- background-position: -100px -20px;
- }
-.edui-default .edui-for-anchor .edui-icon {
- background-position: -200px 0;
- }
-.edui-default .edui-for-pagebreak .edui-icon {
- background-position: -460px -40px;
- }
-.edui-default .edui-for-imagenone .edui-icon {
- background-position: -480px -40px;
- }
-.edui-default .edui-for-imageleft .edui-icon {
- background-position: -500px -40px;
- }
-.edui-default .edui-for-wordimage .edui-icon {
- background-position: -660px -40px;
- }
-.edui-default .edui-for-imageright .edui-icon {
- background-position: -520px -40px;
- }
-.edui-default .edui-for-imagecenter .edui-icon {
- background-position: -540px -40px;
- }
-.edui-default .edui-for-indent .edui-icon {
- background-position: -400px 0;
- }
-.edui-default .edui-for-outdent .edui-icon {
- background-position: -540px 0;
- }
-.edui-default .edui-for-webapp .edui-icon {
- background-position: -601px -40px;
- }
-.edui-default .edui-for-table .edui-icon {
- background-position: -580px -20px;
- }
-.edui-default .edui-for-edittable .edui-icon {
- background-position: -420px -40px;
- }
-.edui-default .edui-for-template .edui-icon {
- background-position: -339px -40px;
- }
-.edui-default .edui-for-delete .edui-icon {
- background-position: -360px -40px;
- }
-.edui-default .edui-for-attachment .edui-icon {
- background-position: -620px -40px;
- }
-.edui-default .edui-for-edittd .edui-icon {
- background-position: -700px -40px;
- }
-.edui-default .edui-for-snapscreen .edui-icon {
- background-position: -581px -40px;
- }
-.edui-default .edui-for-scrawl .edui-icon {
- background-position: -801px -41px;
- }
-.edui-default .edui-for-background .edui-icon {
- background-position: -680px -40px;
- }
-.edui-default .edui-for-music .edui-icon {
- background-position: -18px -40px;
- }
-.edui-default .edui-for-formula .edui-icon {
- background-position: -200px -40px;
- }
-.edui-default .edui-for-aligntd .edui-icon {
- background-position: -236px -76px;
- }
-.edui-default .edui-for-insertparagraphtrue .edui-icon {
- background-position: -625px -76px;
- }
-.edui-default .edui-for-insertparagraph .edui-icon {
- background-position: -602px -76px;
- }
-.edui-default .edui-for-insertcaption .edui-icon {
- background-position: -336px -76px;
- }
-.edui-default .edui-for-deletecaption .edui-icon {
- background-position: -362px -76px;
- }
-.edui-default .edui-for-inserttitle .edui-icon {
- background-position: -286px -76px;
- }
-.edui-default .edui-for-deletetitle .edui-icon {
- background-position: -311px -76px;
- }
-.edui-default .edui-for-aligntable .edui-icon {
- background-position: -440px 0;
- }
-.edui-default .edui-for-tablealignment-left .edui-icon {
- background-position: -460px 0;
- }
-.edui-default .edui-for-tablealignment-center .edui-icon {
- background-position: -420px 0;
- }
-.edui-default .edui-for-tablealignment-right .edui-icon {
- background-position: -480px 0;
- }
-.edui-default .edui-for-drafts .edui-icon {
- background-position: -560px 0;
- }
-.edui-default .edui-for-charts .edui-icon {
- background: url(../images/charts.png ) no-repeat 2px 3px !important;
- }
-.edui-default .edui-for-inserttitlecol .edui-icon {
- background-position: -673px -76px;
- }
-.edui-default .edui-for-deletetitlecol .edui-icon {
- background-position: -698px -76px;
- }
-.edui-default .edui-for-simpleupload .edui-icon {
- background-position: -380px 0;
- }
-/*splitbutton*/
-.edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow,
-.edui-default .edui-toolbar .edui-menubutton-body .edui-arrow {
- width: 9px;
- height: 20px;
- background: url(../images/icons.png) -741px 0;
-
- _background: url(../images/icons.gif) -741px 0;
- }
-.edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body,
-.edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body {
- padding: 1px;
- }
-.edui-default .edui-toolbar .edui-splitborder {
- width: 1px;
- height: 20px;
- }
-.edui-default .edui-toolbar .edui-state-hover .edui-splitborder {
- width: 1px;
- border-left: 0 solid #dcac6c;
- }
-.edui-default .edui-toolbar .edui-state-active .edui-splitborder {
- width: 0;
- border-left: 1px solid gray;
- }
-.edui-default .edui-toolbar .edui-state-opened .edui-splitborder {
- width: 1px;
- border: 0;
- }
-.edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body,
-.edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body {
- padding: 0;
- background-color: #fff5d4;
- border: 1px solid #dcac6c;
- }
-.edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body,
-.edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body {
- padding: 0;
- background-color: #ffe69f;
- border: 1px solid #dcac6c;
- }
-.edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body,
-.edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body {
- padding: 0;
- background-color: #fff;
- border: 1px solid gray;
- }
-.edui-default .edui-state-disabled .edui-arrow {
- filter: alpha(opacity=30);
- opacity: .3;
- }
-.edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body,
-.edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body {
- padding: 0;
- background-color: white;
- border: 1px solid gray;
- }
-.edui-default .edui-for-insertorderedlist .edui-bordereraser,
-.edui-default .edui-for-lineheight .edui-bordereraser,
-.edui-default .edui-for-rowspacingtop .edui-bordereraser,
-.edui-default .edui-for-rowspacingbottom .edui-bordereraser,
-.edui-default .edui-for-insertunorderedlist .edui-bordereraser {
- background-color: white;
- }
-/* 解决嵌套导致的图标问题 */
-.edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon,
-.edui-default .edui-for-lineheight .edui-popup-body .edui-icon,
-.edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon,
-.edui-default .edui-for-rowspacingbottom .edui-popup-body .edui-icon,
-.edui-default .edui-for-insertunorderedlist .edui-popup-body .edui-icon {
- /*background-position: 0 -40px;*/
- background-image: none ;
- }
-/* 弹出菜单 */
-.edui-default .edui-popup {
- z-index: 3000;
- width: auto;
- height: auto;
- background-color: #fff;
- }
-.edui-default .edui-popup .edui-shadow {
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- }
-.edui-default .edui-popup-content {
- padding: 5px;
- background: #fff;
- -webkit-background-clip: padding-box;
- background-clip: padding-box;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, .2);
- border-radius: 0;
- -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
- box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
-
- *border-right-width: 2px;
- *border-bottom-width: 2px;
- }
-.edui-default .edui-popup .edui-bordereraser {
- height: 3px;
- background-color: white;
- }
-.edui-default .edui-menu .edui-bordereraser {
- height: 3px;
- }
-.edui-default .edui-anchor-topleft .edui-bordereraser {
- top: -2px;
- left: 1px;
- }
-.edui-default .edui-anchor-topright .edui-bordereraser {
- top: -2px;
- right: 1px;
- }
-.edui-default .edui-anchor-bottomleft .edui-bordereraser {
- bottom: -6px;
- left: 0;
- height: 7px;
- border-right: 1px solid gray;
- border-left: 1px solid gray;
- }
-.edui-default .edui-anchor-bottomright .edui-bordereraser {
- right: 0;
- bottom: -6px;
- height: 7px;
- border-right: 1px solid gray;
- border-left: 1px solid gray;
- }
-.edui-popup div {
- width: auto;
- height: auto;
- }
-.edui-default .edui-editor-messageholder {
- position: absolute;
- top: 28px;
- right: 3px;
- display: block;
- width: 150px;
- height: auto;
- padding: 0;
- margin: 0;
- border: 0;
- }
-.edui-default .edui-message {
- position: relative;
- min-height: 10px;
- padding: 0;
- margin-bottom: 3px;
- text-shadow: 0 1px 0 rgba(255, 255, 255, .5);
- }
-.edui-default .edui-message-body {
- padding: 8px 15px 8px 8px;
- color: #c09853;
- background-color: #fcf8e3;
- border: 1px solid #fbeed5;
- border-radius: 0;
- }
-.edui-default .edui-message-type-info {
- color: #3a87ad;
- background-color: #d9edf7;
- border-color: #bce8f1;
- }
-.edui-default .edui-message-type-success {
- color: #468847;
- background-color: #dff0d8;
- border-color: #d6e9c6;
- }
-.edui-default .edui-message-type-danger,
-.edui-default .edui-message-type-error {
- color: #b94a48;
- background-color: #f2dede;
- border-color: #eed3d7;
- }
-.edui-default .edui-message .edui-message-closer {
- position: absolute;
- top: 0;
- right: 0;
- display: block;
- float: right;
- width: 16px;
- height: 16px;
- padding: 0;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 20px;
- font-weight: bold;
- line-height: 16px;
- color: #999;
- text-shadow: 0 1px 0 #fff;
- cursor: pointer;
- background: transparent;
- border: 0;
- }
-.edui-default .edui-message .edui-message-content {
- font-size: 10pt;
- word-break: normal;
- word-wrap: break-word;
- }
-/* 弹出对话框按钮和对话框大小 */
-.edui-default .edui-dialog {
- position: absolute;
- z-index: 2000;
- }
-.edui-dialog div {
- width: auto;
- }
-.edui-default .edui-dialog-wrap {
- margin-right: 6px;
- margin-bottom: 6px;
- }
-.edui-default .edui-dialog-fullscreen-flag {
- margin-right: 0;
- margin-bottom: 0;
- }
-.edui-default .edui-dialog-body {
- position: relative;
- padding: 2px 0 0 2px;
-
- _zoom: 1;
- }
-.edui-default .edui-dialog-fullscreen-flag .edui-dialog-body {
- padding: 0;
- }
-.edui-default .edui-dialog-shadow {
- position: absolute;
- top: 0;
- left: 0;
- z-index: -1;
- width: 100%;
- height: 100%;
- background-color: #fff;
- -webkit-background-clip: padding-box;
- background-clip: padding-box;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, .2);
- border-radius: 6px;
- -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
- box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
-
- *border-right-width: 2px;
- *border-bottom-width: 2px;
- }
-.edui-default .edui-dialog-foot {
- background-color: white;
- }
-.edui-default .edui-dialog-titlebar {
- position: relative;
- min-height: 24px;
- padding: 8px 10px;
- line-height: 24px;
- cursor: move;
- border-bottom: 1px solid #e5e5e5;
- }
-.edui-default .edui-dialog-caption {
- padding-left: 5px;
- font-size: 12px;
- font-weight: bold;
- line-height: 26px;
- }
-.edui-default .edui-dialog-draghandle {
- height: 26px;
- }
-.edui-default .edui-dialog-closebutton {
- position: absolute !important;
- top: 4px;
- right: 3px;
- }
-.edui-default .edui-dialog-closebutton .edui-button-body {
- width: 30px;
- height: 30px;
- font-size: 19.5px;
- font-weight: 700;
- line-height: 30px;
- color: #000;
- text-align: center;
- text-shadow: 0 1px 0 #fff;
- cursor: pointer;
- filter: alpha(opacity=20);
- opacity: .2;
- }
-.edui-default .edui-dialog-closebutton .edui-button-body:before {
- content: '×';
- }
-.edui-default .edui-dialog-closebutton .edui-button-body:hover {
- filter: alpha(opacity=70);
- opacity: .7;
- }
-.edui-default .edui-dialog-foot {
- height: 40px;
- }
-.edui-default .edui-dialog-buttons {
- position: absolute;
- right: 0;
- }
-.edui-default .edui-dialog-buttons .edui-button {
- margin-right: 10px;
- }
-.edui-default .edui-dialog-buttons .edui-button .edui-button-body {
- width: 96px;
- height: 24px;
- font-size: 12px;
- line-height: 24px;
- text-align: center;
- cursor: default;
- background-color: #f2f2f2;
- border: 1px solid #bfbfbf;
- border-radius: 0;
- }
-.edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body {
- background-color: #dedede;
- border-color: #a1a1a1;
- -webkit-box-shadow: 0 2px 1px rgba(0, 0, 0, .1);
- box-shadow: 0 2px 1px rgba(0, 0, 0, .1);
- }
-.edui-default .edui-dialog iframe {
- padding: 0;
- margin: 0;
- vertical-align: top;
- border: 0;
- }
-.edui-default .edui-dialog-modalmask {
- position: absolute;
- background-color: #ccc;
- filter: alpha(opacity=30);
- opacity: .3;
- /*z-index: 1999;*/
- }
-.edui-default .edui-dialog-dragmask {
- position: absolute;
- cursor: move;
- /*z-index: 2001;*/
- background-color: transparent;
- }
-.edui-default .edui-dialog-content {
- position: relative;
- }
-.edui-default .dialogcontmask {
- position: absolute;
- display: block;
- width: 100%;
- height: 100%;
- cursor: move;
- visibility: hidden;
- filter: alpha(opacity=0);
- opacity: 0;
- }
-/*link-dialog*/
-.edui-default .edui-for-link .edui-dialog-content {
- width: 420px;
- height: 200px;
- overflow: hidden;
- }
-/*background-dialog*/
-.edui-default .edui-for-background .edui-dialog-content {
- width: 440px;
- height: 280px;
- overflow: hidden;
- }
-/*template-dialog*/
-.edui-default .edui-for-template .edui-dialog-content {
- width: 630px;
- height: 390px;
- overflow: hidden;
- }
-/*scrawl-dialog*/
-.edui-default .edui-for-scrawl .edui-dialog-content {
- width: 515px;
- height: 360px;
-
- *width: 506px;
- }
-/*spechars-dialog*/
-.edui-default .edui-for-spechars .edui-dialog-content {
- width: 620px;
- height: 500px;
-
- *width: 630px;
- *height: 570px;
- }
-/*image-dialog*/
-.edui-default .edui-for-insertimage .edui-dialog-content {
- width: 650px;
- height: 400px;
- overflow: hidden;
- }
-/*webapp-dialog*/
-.edui-default .edui-for-webapp .edui-dialog-content {
- width: 560px;
- height: 450px;
- overflow: hidden;
-
- _width: 565px;
- }
-/*image-insertframe*/
-.edui-default .edui-for-insertframe .edui-dialog-content {
- width: 350px;
- height: 200px;
- overflow: hidden;
- }
-/*wordImage-dialog*/
-.edui-default .edui-for-wordimage .edui-dialog-content {
- width: 620px;
- height: 380px;
- overflow: hidden;
- }
-/*attachment-dialog*/
-.edui-default .edui-for-attachment .edui-dialog-content {
- width: 650px;
- height: 400px;
- overflow: hidden;
- }
-/*map-dialog*/
-.edui-default .edui-for-map .edui-dialog-content {
- width: 550px;
- height: 400px;
- }
-/*gmap-dialog*/
-.edui-default .edui-for-gmap .edui-dialog-content {
- width: 550px;
- height: 400px;
- }
-/*video-dialog*/
-.edui-default .edui-for-insertvideo .edui-dialog-content {
- width: 590px;
- height: 390px;
- }
-/*anchor-dialog*/
-.edui-default .edui-for-anchor .edui-dialog-content {
- width: 320px;
- height: 60px;
- overflow: hidden;
- }
-/*searchreplace-dialog*/
-.edui-default .edui-for-searchreplace .edui-dialog-content {
- width: 400px;
- height: 220px;
- }
-/*help-dialog*/
-.edui-default .edui-for-help .edui-dialog-content {
- width: 400px;
- height: 420px;
- }
-/*edittable-dialog*/
-.edui-default .edui-for-edittable .edui-dialog-content {
- width: 540px;
- height: 335px;
-
- _width: 590px;
- }
-/*edittip-dialog*/
-.edui-default .edui-for-edittip .edui-dialog-content {
- width: 225px;
- height: 60px;
- }
-/*edittd-dialog*/
-.edui-default .edui-for-edittd .edui-dialog-content {
- width: 240px;
- height: 50px;
- }
-/*snapscreen-dialog*/
-.edui-default .edui-for-snapscreen .edui-dialog-content {
- width: 400px;
- height: 220px;
- }
-/*music-dialog*/
-.edui-default .edui-for-music .edui-dialog-content {
- width: 515px;
- height: 360px;
- }
-/*段落弹出菜单*/
-.edui-default .edui-for-paragraph .edui-listitem-label {
- font-family: Tahoma, Verdana, Arial, Helvetica;
- }
-.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p {
- font-size: 22px;
- line-height: 27px;
- }
-.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1 {
- font-size: 32px;
- font-weight: bolder;
- line-height: 36px;
- }
-.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2 {
- font-size: 27px;
- font-weight: bolder;
- line-height: 29px;
- }
-.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3 {
- font-size: 19px;
- font-weight: bolder;
- line-height: 23px;
- }
-.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4 {
- font-size: 16px;
- font-weight: bolder;
- line-height: 19px;
- }
-.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5 {
- font-size: 13px;
- font-weight: bolder;
- line-height: 16px;
- }
-.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6 {
- font-size: 12px;
- font-weight: bolder;
- line-height: 14px;
- }
-/* 表格弹出菜单 */
-.edui-default .edui-for-inserttable .edui-splitborder {
- display: none;
- }
-.edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow {
- width: 0;
- }
-.edui-default .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder {
- border-left: 1px solid transparent;
- }
-.edui-default .edui-tablepicker .edui-infoarea {
- width: 220px;
- height: 14px;
- margin-bottom: 3px;
- clear: both;
- font-size: 12px;
- line-height: 14px;
- }
-.edui-default .edui-tablepicker .edui-infoarea .edui-label {
- float: left;
- }
-.edui-default .edui-dialog-buttons .edui-label {
- line-height: 24px;
- }
-.edui-default .edui-tablepicker .edui-infoarea .edui-clickable {
- float: right;
- }
-.edui-default .edui-tablepicker .edui-pickarea {
- width: 220px;
- height: 220px;
- background: url("../images/unhighlighted.gif") repeat;
- }
-.edui-default .edui-tablepicker .edui-pickarea .edui-overlay {
- background: url("../images/highlighted.gif") repeat;
- }
-/* 颜色弹出菜单 */
-.edui-default .edui-colorpicker-topbar {
- width: 200px;
- height: 27px;
- /*border-bottom: 1px gray dashed;*/
- }
-.edui-default .edui-colorpicker-preview {
- float: left;
- width: 128px;
- height: 20px;
- margin-left: 1px;
- border: 1px inset black;
- }
-.edui-default .edui-colorpicker-nocolor {
- float: right;
- height: 14px;
- padding: 3px 5px;
- margin-right: 1px;
- font-size: 12px;
- line-height: 14px;
- cursor: pointer;
- border: 1px solid #333;
- }
-.edui-default .edui-colorpicker-tablefirstrow {
- height: 30px;
- }
-.edui-default .edui-colorpicker-colorcell {
- display: block;
- width: 14px;
- height: 14px;
- margin: 0;
- cursor: pointer;
- }
-.edui-default .edui-colorpicker-colorcell:hover {
- width: 14px;
- height: 14px;
- margin: 0;
- }
-.edui-default .edui-colorpicker-advbtn {
- display: block;
- height: 20px;
- text-align: center;
- cursor: pointer;
- }
-.arrow_down {
- background: white url('../images/arrow_down.png') no-repeat center;
- }
-.arrow_up {
- background: white url('../images/arrow_up.png') no-repeat center;
- }
-/*高级的样式*/
-.edui-colorpicker-adv {
- position: relative;
- display: none;
- height: 180px;
- overflow: hidden;
- }
-.edui-colorpicker-plant,
-.edui-colorpicker-hue {
- border: solid 1px #666;
- }
-.edui-colorpicker-pad {
- position: absolute;
- top: 13px;
- left: 14px;
- width: 150px;
- height: 150px;
- overflow: hidden;
- cursor: crosshair;
- background: red;
- }
-.edui-colorpicker-cover {
- position: absolute;
- top: 0;
- left: 0;
- width: 150px;
- height: 150px;
- background: url("../images/tangram-colorpicker.png") -160px -200px;
- }
-.edui-colorpicker-padDot {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 1000;
- width: 11px;
- height: 11px;
- overflow: hidden;
- background: url(../images/tangram-colorpicker.png) 0 -200px repeat-x;
- }
-.edui-colorpicker-sliderMain {
- position: absolute;
- top: 13px;
- left: 171px;
- width: 19px;
- height: 152px;
- background: url(../images/tangram-colorpicker.png) -179px -12px no-repeat;
- }
-.edui-colorpicker-slider {
- width: 100%;
- height: 100%;
- cursor: pointer;
- }
-.edui-colorpicker-thumb {
- position: absolute;
- top: 0;
- right: -1px;
- left: -1px;
- height: 3px;
- cursor: pointer;
- background: white;
- border: 1px solid black;
- opacity: .8;
- }
-/*自动排版弹出菜单*/
-.edui-default .edui-autotypesetpicker .edui-autotypesetpicker-body {
- margin-bottom: 3px;
- clear: both;
- font-size: 12px;
- }
-.edui-default .edui-autotypesetpicker-body table {
- border-spacing: 2px;
- border-collapse: separate;
- }
-.edui-default .edui-autotypesetpicker-body td {
- font-size: 12px;
- word-wrap: break-word;
- }
-.edui-default .edui-autotypesetpicker-body td input {
- margin: 3px 3px 3px 4px;
-
- *margin: 1px 0 0 0;
- }
-/*自动排版弹出菜单*/
-.edui-default .edui-cellalignpicker .edui-cellalignpicker-body {
- width: 70px;
- font-size: 12px;
- cursor: default;
- }
-.edui-default .edui-cellalignpicker-body table {
- border-spacing: 0;
- border-collapse: separate;
- }
-.edui-default .edui-cellalignpicker-body td {
- padding: 1px;
- }
-.edui-default .edui-cellalignpicker-body .edui-icon {
- width: 20px;
- height: 20px;
- padding: 1px;
- background-image: url(../images/table-cell-align.png);
- }
-.edui-default .edui-cellalignpicker-body .edui-left {
- background-position: 0 0;
- }
-.edui-default .edui-cellalignpicker-body .edui-center {
- background-position: -25px 0;
- }
-.edui-default .edui-cellalignpicker-body .edui-right {
- background-position: -51px 0;
- }
-.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left {
- background-position: -73px 0;
- }
-.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center {
- background-position: -98px 0;
- }
-.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right {
- background-position: -124px 0;
- }
-.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left {
- background-color: #f1f4f5;
- background-position: -146px 0;
- }
-.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center {
- background-position: -245px 0;
- }
-.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right {
- background-position: -271px 0;
- }
-/*分隔线*/
-.edui-default .edui-toolbar .edui-separator {
- width: 2px;
- height: 20px;
- margin: 2px 4px 2px 3px;
- background: url(../images/icons.png) -181px 0;
- background: url(../images/icons.gif) -181px 0 \9;
- }
-/*颜色按钮 */
-.edui-default .edui-toolbar .edui-colorbutton .edui-colorlump {
- position: absolute;
- bottom: 1px;
- left: 1px;
- width: 18px;
- height: 4px;
- overflow: hidden;
- }
-/*表情按钮及弹出菜单*/
-/*去除了表情的下拉箭头*/
-.edui-default .edui-for-emotion .edui-icon {
- background-position: -60px -20px;
- }
-.edui-default .edui-for-emotion .edui-popup-content iframe {
- width: 514px;
- height: 380px;
- overflow: hidden;
- }
-.edui-default .edui-for-emotion .edui-popup-content {
- position: relative;
- z-index: 555;
- }
-.edui-default .edui-for-emotion .edui-splitborder {
- display: none;
- }
-.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow {
- width: 0;
- }
-.edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder {
- border-left: 1px solid transparent;
- }
-/*contextmenu*/
-.edui-default .edui-hassubmenu .edui-arrow {
- float: right;
- width: 20px;
- height: 20px;
- background: url("../images/icons-all.gif") no-repeat 10px -233px;
- }
-.edui-default .edui-menu-body .edui-menuitem {
- padding: 1px;
- }
-.edui-default .edui-menuseparator {
- height: 1px;
- margin: 2px 0;
- overflow: hidden;
- }
-.edui-default .edui-menuseparator-inner {
- margin-right: 1px;
- margin-left: 29px;
- border-bottom: 1px solid #e2e3e3;
- }
-.edui-default .edui-menu-body .edui-state-hover {
- padding: 0 !important;
- background-color: #fff5d4;
- border: 1px solid #dcac6c;
- }
-/*弹出菜单*/
-.edui-default .edui-shortcutmenu {
- width: 190px;
- height: 50px;
- padding: 2px;
- background-color: #fff;
- border: 1px solid #ccc;
- border-radius: 0;
- }
-/*粘贴弹出菜单*/
-.edui-default .edui-wordpastepop .edui-popup-content {
- width: 54px;
- height: 21px;
- padding: 0;
- border: none;
- }
-.edui-default .edui-pasteicon {
- width: 100%;
- height: 100%;
- background-image: url('../images/wordpaste.png');
- background-position: 0 0;
- }
-.edui-default .edui-pasteicon.edui-state-opened {
- background-position: 0 -34px;
- }
-.edui-default .edui-pastecontainer {
- position: relative;
- width: 97px;
- visibility: hidden;
- background: #fff;
- border: 1px solid #ccc;
- }
-.edui-default .edui-pastecontainer .edui-title {
- height: 25px;
- padding-left: 5px;
- font-size: 12px;
- font-weight: bold;
- line-height: 25px;
- background: #f8f8ff;
- }
-.edui-default .edui-pastecontainer .edui-button {
- margin: 3px 0;
- overflow: hidden;
- }
-.edui-default .edui-pastecontainer .edui-button .edui-richtxticon,
-.edui-default .edui-pastecontainer .edui-button .edui-tagicon,
-.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon {
- float: left;
- width: 29px;
- height: 29px;
- margin-left: 5px;
- cursor: pointer;
- background-image: url('../images/wordpaste.png');
- background-repeat: no-repeat;
- }
-.edui-default .edui-pastecontainer .edui-button .edui-richtxticon {
- margin-left: 0;
- background-position: -109px 0;
- }
-.edui-default .edui-pastecontainer .edui-button .edui-tagicon {
- background-position: -148px 1px;
- }
-.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon {
- background-position: -72px 0;
- }
-.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon {
- background-position: -109px -34px;
- }
-.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon {
- background-position: -148px -34px;
- }
-.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon {
- background-position: -72px -34px;
- }
diff --git a/www/js/ueditor/themes/default/css/ueditor.min.css b/www/js/ueditor/themes/default/css/ueditor.min.css
deleted file mode 100644
index 9e65a8085c..0000000000
--- a/www/js/ueditor/themes/default/css/ueditor.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.edui-default .edui-box{padding:0;margin:0;overflow:hidden;border:none}.edui-default a.edui-box{display:block;color:#000;text-decoration:none}.edui-default a.edui-box:hover{text-decoration:none}.edui-default a.edui-box:active{text-decoration:none}.edui-default table.edui-box{border-collapse:collapse}.edui-default ul.edui-box{list-style-type:none}div.edui-box{position:relative;display:inline-block!important;vertical-align:top}.edui-default .edui-clearfix{zoom:1}.edui-default .edui-clearfix:after{display:block;clear:both;content:'\20'}* html div.edui-box{display:inline!important}.edui-combox-body,.edui-default .edui-button-body,.edui-menubutton-body,.edui-splitbutton-body{position:relative}.edui-default .edui-popup{position:absolute;-webkit-user-select:none;-moz-user-select:none}.edui-default .edui-popup .edui-shadow{position:absolute;z-index:-1}.edui-default .edui-popup .edui-bordereraser{position:absolute;overflow:hidden}.edui-default .edui-tablepicker .edui-canvas{position:relative}.edui-default .edui-tablepicker .edui-canvas .edui-overlay{position:absolute}.edui-default .edui-dialog-modalmask,.edui-dialog-dragmask{position:absolute;top:0;left:0;width:100%;height:100%}.edui-default .edui-toolbar{position:relative}.edui-default .edui-label{cursor:default}.edui-default span.edui-clickable{color:#00f;text-decoration:underline;cursor:pointer}.edui-default span.edui-unclickable{color:gray;cursor:default}.edui-default .edui-toolbar{width:auto;height:auto;padding:1px;overflow:hidden;cursor:default;zoom:1;-webkit-user-select:none;-moz-user-select:none}.edui-default .edui-toolbar .edui-button,.edui-default .edui-toolbar .edui-combox,.edui-default .edui-toolbar .edui-menubutton,.edui-default .edui-toolbar .edui-splitbutton{margin:1px}.edui-default .edui-editor{position:relative;overflow:visible;background-color:#fff;border:1px solid #d4d4d4;border-radius:0}.edui-editor div{width:auto;height:auto}.edui-default .edui-editor-toolbarbox{position:relative;zoom:1;border-top-left-radius:0;border-top-right-radius:0}.edui-default .edui-editor-toolbarboxouter{background-color:#fafafa;background-repeat:repeat-x;border-bottom:1px solid #d4d4d4;*zoom:1}.edui-default .edui-editor-toolbarboxinner{padding:2px}.edui-default .edui-editor-iframeholder{position:relative}.edui-default .edui-editor-bottomContainer{overflow:hidden}.edui-default .edui-editor-bottomContainer table{width:100%;height:0;overflow:hidden;border-spacing:0}.edui-default .edui-editor-bottomContainer td{font-family:Arial,Helvetica,Tahoma,Verdana,Sans-Serif;font-size:12px;line-height:20px;white-space:nowrap;border-top:1px solid #ccc}.edui-default .edui-editor-wordcount{margin-right:5px;color:#aaa;text-align:right}.edui-default .edui-editor-scale{width:12px}.edui-default .edui-editor-scale .edui-editor-icon{float:right;width:100%;height:12px;margin-top:10px;cursor:se-resize;background:url(../images/scale.png) no-repeat}.edui-default .edui-editor-breadcrumb{margin:2px 0 0 3px}.edui-default .edui-editor-breadcrumb span{color:#00f;text-decoration:underline;cursor:pointer}.edui-default .edui-toolbar .edui-for-fullscreen{float:right}.edui-default .edui-bubble .edui-popup-content{padding:5px;font-family:"宋体";font-size:10pt;background-color:#fff6d9;border:1px solid #dcac6c}.edui-default .edui-editor-toolbarmsg{position:absolute;bottom:-25px;left:0;z-index:1009;width:99.9%;background-color:#fff6d9;border-bottom:1px solid #ccc}.edui-default .edui-editor-toolbarmsg-upload{position:absolute;top:5px;left:350px;width:100px;height:16px;font-size:14px;line-height:16px;color:#00f;cursor:pointer}.edui-default .edui-editor-toolbarmsg-label{padding:4px;font-size:12px;line-height:16px}.edui-default .edui-editor-toolbarmsg-close{float:right;width:20px;height:16px;line-height:16px;color:red;cursor:pointer}.edui-default .edui-list .edui-bordereraser{display:none}.edui-default .edui-listitem{padding:1px;white-space:nowrap}.edui-default .edui-list .edui-state-hover{position:relative;padding:0;background-color:#fff5d4;border:1px solid #dcac6c}.edui-default .edui-for-fontfamily .edui-listitem-label{min-width:130px;height:22px;padding-left:5px;font-size:12px;line-height:22px;_width:120px}.edui-default .edui-for-insertcode .edui-listitem-label{min-width:120px;height:22px;padding-left:5px;font-size:12px;line-height:22px;_width:120px}.edui-default .edui-for-underline .edui-listitem-label{min-width:120px;padding:3px 5px;font-size:12px;_width:120px}.edui-default .edui-for-fontsize .edui-listitem-label{min-width:120px;padding:3px 5px;_width:120px}.edui-default .edui-for-paragraph .edui-listitem-label{min-width:200px;padding:2px 5px;_width:200px}.edui-default .edui-for-rowspacingbottom .edui-listitem-label,.edui-default .edui-for-rowspacingtop .edui-listitem-label{min-width:53px;padding:2px 5px;_width:53px}.edui-default .edui-for-lineheight .edui-listitem-label{min-width:53px;padding:2px 5px;_width:53px}.edui-default .edui-for-customstyle .edui-listitem-label{width:200px!important;min-width:200px;padding:2px 5px;_width:200px}.edui-default .edui-menu{z-index:3000}.edui-default .edui-menu .edui-popup-content{padding:3px}.edui-default .edui-menu-body{min-width:170px;background:url(../images/sparator_v.png) repeat-y 25px;_width:150px}.edui-default .edui-menuitem{height:20px;vertical-align:top;cursor:default}.edui-default .edui-menuitem .edui-icon{width:20px!important;height:20px!important;background:url(../images/icons.png) 0 -4000px;background:url(../images/icons.gif) 0 -4000px\9}.edui-default .edui-menuitem .edui-label{height:20px;padding-left:10px;font-size:12px;line-height:20px}.edui-default .edui-state-checked .edui-menuitem-body{background:url(../images/icons-all.gif) no-repeat 6px -205px}.edui-default .edui-state-disabled .edui-menuitem-label{color:gray}.edui-default .edui-toolbar .edui-combox-body .edui-button-body{width:60px;height:20px;padding-left:5px;margin:0 3px 0 0;font-size:12px;line-height:20px;white-space:nowrap}.edui-default .edui-toolbar .edui-combox-body .edui-arrow{width:9px;height:20px;background:url(../images/icons.png) -741px 0;_background:url(../images/icons.gif) -741px 0}.edui-default .edui-toolbar .edui-combox .edui-combox-body{background-color:#fff;border:1px solid #ccc;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px}.edui-default .edui-toolbar .edui-combox-body .edui-splitborder{display:none}.edui-default .edui-toolbar .edui-combox-body .edui-arrow{border-left:1px solid #ccc}.edui-default .edui-toolbar .edui-state-hover .edui-combox-body{background-color:#fff5d4;border:1px solid #dcac6c}.edui-default .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow{border-left:1px solid #dcac6c}.edui-default .edui-toolbar .edui-state-checked .edui-combox-body{background-color:#ffe69f;border:1px solid #dcac6c}.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow{border-left:1px solid #dcac6c}.edui-toolbar .edui-state-disabled .edui-combox-body{background-color:#f0f0ee;filter:alpha(opacity=30);opacity:.3}.edui-toolbar .edui-state-opened .edui-combox-body{background-color:#fff;border:1px solid gray}.edui-default .edui-toolbar .edui-button .edui-icon,.edui-default .edui-toolbar .edui-menubutton .edui-icon,.edui-default .edui-toolbar .edui-splitbutton .edui-icon{width:20px!important;height:20px!important;background-image:url(../images/icons.png);background-image:url(../images/icons.gif)\9}.edui-default .edui-toolbar .edui-button .edui-button-wrap{position:relative;padding:1px}.edui-default .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap{padding:0;background-color:#fff5d4;border:1px solid #dcac6c}.edui-default .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap{padding:0;background-color:#ffe69f;border:1px solid #dcac6c;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px}.edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap{padding:0;background-color:#fff;border:1px solid gray}.edui-default .edui-toolbar .edui-state-disabled .edui-label{color:#ccc}.edui-default .edui-toolbar .edui-state-disabled .edui-icon{filter:alpha(opacity=30);opacity:.3}.edui-default .edui-for-undo .edui-icon{background-position:-160px 0}.edui-default .edui-for-redo .edui-icon{background-position:-100px 0}.edui-default .edui-for-bold .edui-icon{background-position:0 0}.edui-default .edui-for-italic .edui-icon{background-position:-60px 0}.edui-default .edui-for-fontborder .edui-icon{background-position:-160px -40px}.edui-default .edui-for-underline .edui-icon{background-position:-140px 0}.edui-default .edui-for-strikethrough .edui-icon{background-position:-120px 0}.edui-default .edui-for-subscript .edui-icon{background-position:-600px 0}.edui-default .edui-for-superscript .edui-icon{background-position:-620px 0}.edui-default .edui-for-blockquote .edui-icon{background-position:-220px 0}.edui-default .edui-for-forecolor .edui-icon{background-position:-720px 0}.edui-default .edui-for-backcolor .edui-icon{background-position:-760px 0}.edui-default .edui-for-inserttable .edui-icon{background-position:-580px -20px}.edui-default .edui-for-autotypeset .edui-icon{background-position:-640px -40px}.edui-default .edui-for-justifyleft .edui-icon{background-position:-460px 0}.edui-default .edui-for-justifycenter .edui-icon{background-position:-420px 0}.edui-default .edui-for-justifyright .edui-icon{background-position:-480px 0}.edui-default .edui-for-justifyjustify .edui-icon{background-position:-440px 0}.edui-default .edui-for-insertorderedlist .edui-icon{background-position:-80px 0}.edui-default .edui-for-insertunorderedlist .edui-icon{background-position:-20px 0}.edui-default .edui-for-lineheight .edui-icon{background-position:-725px -40px}.edui-default .edui-for-rowspacingbottom .edui-icon{background-position:-745px -40px}.edui-default .edui-for-rowspacingtop .edui-icon{background-position:-765px -40px}.edui-default .edui-for-horizontal .edui-icon{background-position:-360px 0}.edui-default .edui-for-link .edui-icon{background-position:-500px 0}.edui-default .edui-for-code .edui-icon{background-position:-440px -40px}.edui-default .edui-for-insertimage .edui-icon{background-position:-726px -77px}.edui-default .edui-for-insertframe .edui-icon{background-position:-240px -40px}.edui-default .edui-for-emoticon .edui-icon{background-position:-60px -20px}.edui-default .edui-for-spechars .edui-icon{background-position:-240px 0}.edui-default .edui-for-help .edui-icon{background-position:-340px 0}.edui-default .edui-for-print .edui-icon{background-position:-440px -20px}.edui-default .edui-for-preview .edui-icon{background-position:-420px -20px}.edui-default .edui-for-selectall .edui-icon{background-position:-400px -20px}.edui-default .edui-for-searchreplace .edui-icon{background-position:-520px -20px}.edui-default .edui-for-map .edui-icon{background-position:-40px -40px}.edui-default .edui-for-gmap .edui-icon{background-position:-260px -40px}.edui-default .edui-for-insertvideo .edui-icon{background-position:-320px -20px}.edui-default .edui-for-time .edui-icon{background-position:-160px -20px}.edui-default .edui-for-date .edui-icon{background-position:-140px -20px}.edui-default .edui-for-cut .edui-icon{background-position:-680px 0}.edui-default .edui-for-copy .edui-icon{background-position:-700px 0}.edui-default .edui-for-paste .edui-icon{background-position:-560px 0}.edui-default .edui-for-formatmatch .edui-icon{background-position:-40px 0}.edui-default .edui-for-pasteplain .edui-icon{background-position:-360px -20px}.edui-default .edui-for-directionalityltr .edui-icon{background-position:-20px -20px}.edui-default .edui-for-directionalityrtl .edui-icon{background-position:-40px -20px}.edui-default .edui-for-source .edui-icon{background-position:-261px 0}.edui-default .edui-for-removeformat .edui-icon{background-position:-580px 0}.edui-default .edui-for-unlink .edui-icon{background-position:-640px 0}.edui-default .edui-for-touppercase .edui-icon{background-position:-786px 0}.edui-default .edui-for-tolowercase .edui-icon{background-position:-806px 0}.edui-default .edui-for-insertrow .edui-icon{background-position:-478px -76px}.edui-default .edui-for-insertrownext .edui-icon{background-position:-498px -76px}.edui-default .edui-for-insertcol .edui-icon{background-position:-455px -76px}.edui-default .edui-for-insertcolnext .edui-icon{background-position:-429px -76px}.edui-default .edui-for-mergeright .edui-icon{background-position:-60px -40px}.edui-default .edui-for-mergedown .edui-icon{background-position:-80px -40px}.edui-default .edui-for-splittorows .edui-icon{background-position:-100px -40px}.edui-default .edui-for-splittocols .edui-icon{background-position:-120px -40px}.edui-default .edui-for-insertparagraphbeforetable .edui-icon{background-position:-140px -40px}.edui-default .edui-for-deleterow .edui-icon{background-position:-660px -20px}.edui-default .edui-for-deletecol .edui-icon{background-position:-640px -20px}.edui-default .edui-for-splittocells .edui-icon{background-position:-800px -20px}.edui-default .edui-for-mergecells .edui-icon{background-position:-760px -20px}.edui-default .edui-for-deletetable .edui-icon{background-position:-620px -20px}.edui-default .edui-for-cleardoc .edui-icon{background-position:-520px 0}.edui-default .edui-for-fullscreen .edui-icon{background-position:-100px -20px}.edui-default .edui-for-anchor .edui-icon{background-position:-200px 0}.edui-default .edui-for-pagebreak .edui-icon{background-position:-460px -40px}.edui-default .edui-for-imagenone .edui-icon{background-position:-480px -40px}.edui-default .edui-for-imageleft .edui-icon{background-position:-500px -40px}.edui-default .edui-for-wordimage .edui-icon{background-position:-660px -40px}.edui-default .edui-for-imageright .edui-icon{background-position:-520px -40px}.edui-default .edui-for-imagecenter .edui-icon{background-position:-540px -40px}.edui-default .edui-for-indent .edui-icon{background-position:-400px 0}.edui-default .edui-for-outdent .edui-icon{background-position:-540px 0}.edui-default .edui-for-webapp .edui-icon{background-position:-601px -40px}.edui-default .edui-for-table .edui-icon{background-position:-580px -20px}.edui-default .edui-for-edittable .edui-icon{background-position:-420px -40px}.edui-default .edui-for-template .edui-icon{background-position:-339px -40px}.edui-default .edui-for-delete .edui-icon{background-position:-360px -40px}.edui-default .edui-for-attachment .edui-icon{background-position:-620px -40px}.edui-default .edui-for-edittd .edui-icon{background-position:-700px -40px}.edui-default .edui-for-snapscreen .edui-icon{background-position:-581px -40px}.edui-default .edui-for-scrawl .edui-icon{background-position:-801px -41px}.edui-default .edui-for-background .edui-icon{background-position:-680px -40px}.edui-default .edui-for-music .edui-icon{background-position:-18px -40px}.edui-default .edui-for-formula .edui-icon{background-position:-200px -40px}.edui-default .edui-for-aligntd .edui-icon{background-position:-236px -76px}.edui-default .edui-for-insertparagraphtrue .edui-icon{background-position:-625px -76px}.edui-default .edui-for-insertparagraph .edui-icon{background-position:-602px -76px}.edui-default .edui-for-insertcaption .edui-icon{background-position:-336px -76px}.edui-default .edui-for-deletecaption .edui-icon{background-position:-362px -76px}.edui-default .edui-for-inserttitle .edui-icon{background-position:-286px -76px}.edui-default .edui-for-deletetitle .edui-icon{background-position:-311px -76px}.edui-default .edui-for-aligntable .edui-icon{background-position:-440px 0}.edui-default .edui-for-tablealignment-left .edui-icon{background-position:-460px 0}.edui-default .edui-for-tablealignment-center .edui-icon{background-position:-420px 0}.edui-default .edui-for-tablealignment-right .edui-icon{background-position:-480px 0}.edui-default .edui-for-drafts .edui-icon{background-position:-560px 0}.edui-default .edui-for-charts .edui-icon{background:url(../images/charts.png) no-repeat 2px 3px!important}.edui-default .edui-for-inserttitlecol .edui-icon{background-position:-673px -76px}.edui-default .edui-for-deletetitlecol .edui-icon{background-position:-698px -76px}.edui-default .edui-for-simpleupload .edui-icon{background-position:-380px 0}.edui-default .edui-toolbar .edui-menubutton-body .edui-arrow,.edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow{width:9px;height:20px;background:url(../images/icons.png) -741px 0;_background:url(../images/icons.gif) -741px 0}.edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body,.edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body{padding:1px}.edui-default .edui-toolbar .edui-splitborder{width:1px;height:20px}.edui-default .edui-toolbar .edui-state-hover .edui-splitborder{width:1px;border-left:0 solid #dcac6c}.edui-default .edui-toolbar .edui-state-active .edui-splitborder{width:0;border-left:1px solid gray}.edui-default .edui-toolbar .edui-state-opened .edui-splitborder{width:1px;border:0}.edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body,.edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body{padding:0;background-color:#fff5d4;border:1px solid #dcac6c}.edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body,.edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body{padding:0;background-color:#ffe69f;border:1px solid #dcac6c}.edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body,.edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body{padding:0;background-color:#fff;border:1px solid gray}.edui-default .edui-state-disabled .edui-arrow{filter:alpha(opacity=30);opacity:.3}.edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body,.edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body{padding:0;background-color:#fff;border:1px solid gray}.edui-default .edui-for-insertorderedlist .edui-bordereraser,.edui-default .edui-for-insertunorderedlist .edui-bordereraser,.edui-default .edui-for-lineheight .edui-bordereraser,.edui-default .edui-for-rowspacingbottom .edui-bordereraser,.edui-default .edui-for-rowspacingtop .edui-bordereraser{background-color:#fff}.edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon,.edui-default .edui-for-insertunorderedlist .edui-popup-body .edui-icon,.edui-default .edui-for-lineheight .edui-popup-body .edui-icon,.edui-default .edui-for-rowspacingbottom .edui-popup-body .edui-icon,.edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon{background-image:none}.edui-default .edui-popup{z-index:3000;width:auto;height:auto;background-color:#fff}.edui-default .edui-popup .edui-shadow{top:0;left:0;width:100%;height:100%}.edui-default .edui-popup-content{padding:5px;background:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);*border-right-width:2px;*border-bottom-width:2px}.edui-default .edui-popup .edui-bordereraser{height:3px;background-color:#fff}.edui-default .edui-menu .edui-bordereraser{height:3px}.edui-default .edui-anchor-topleft .edui-bordereraser{top:-2px;left:1px}.edui-default .edui-anchor-topright .edui-bordereraser{top:-2px;right:1px}.edui-default .edui-anchor-bottomleft .edui-bordereraser{bottom:-6px;left:0;height:7px;border-right:1px solid gray;border-left:1px solid gray}.edui-default .edui-anchor-bottomright .edui-bordereraser{right:0;bottom:-6px;height:7px;border-right:1px solid gray;border-left:1px solid gray}.edui-popup div{width:auto;height:auto}.edui-default .edui-editor-messageholder{position:absolute;top:28px;right:3px;display:block;width:150px;height:auto;padding:0;margin:0;border:0}.edui-default .edui-message{position:relative;min-height:10px;padding:0;margin-bottom:3px;text-shadow:0 1px 0 rgba(255,255,255,.5)}.edui-default .edui-message-body{padding:8px 15px 8px 8px;color:#c09853;background-color:#fcf8e3;border:1px solid #fbeed5;border-radius:0}.edui-default .edui-message-type-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.edui-default .edui-message-type-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.edui-default .edui-message-type-danger,.edui-default .edui-message-type-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.edui-default .edui-message .edui-message-closer{position:absolute;top:0;right:0;display:block;float:right;width:16px;height:16px;padding:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:20px;font-weight:700;line-height:16px;color:#999;text-shadow:0 1px 0 #fff;cursor:pointer;background:0 0;border:0}.edui-default .edui-message .edui-message-content{font-size:10pt;word-break:normal;word-wrap:break-word}.edui-default .edui-dialog{position:absolute;z-index:2000}.edui-dialog div{width:auto}.edui-default .edui-dialog-wrap{margin-right:6px;margin-bottom:6px}.edui-default .edui-dialog-fullscreen-flag{margin-right:0;margin-bottom:0}.edui-default .edui-dialog-body{position:relative;padding:2px 0 0 2px;_zoom:1}.edui-default .edui-dialog-fullscreen-flag .edui-dialog-body{padding:0}.edui-default .edui-dialog-shadow{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);*border-right-width:2px;*border-bottom-width:2px}.edui-default .edui-dialog-foot{background-color:#fff}.edui-default .edui-dialog-titlebar{position:relative;min-height:24px;padding:8px 10px;line-height:24px;cursor:move;border-bottom:1px solid #e5e5e5}.edui-default .edui-dialog-caption{padding-left:5px;font-size:12px;font-weight:700;line-height:26px}.edui-default .edui-dialog-draghandle{height:26px}.edui-default .edui-dialog-closebutton{position:absolute!important;top:4px;right:3px}.edui-default .edui-dialog-closebutton .edui-button-body{width:30px;height:30px;font-size:19.5px;font-weight:700;line-height:30px;color:#000;text-align:center;text-shadow:0 1px 0 #fff;cursor:pointer;filter:alpha(opacity=20);opacity:.2}.edui-default .edui-dialog-closebutton .edui-button-body:before{content:'×'}.edui-default .edui-dialog-closebutton .edui-button-body:hover{filter:alpha(opacity=70);opacity:.7}.edui-default .edui-dialog-foot{height:40px}.edui-default .edui-dialog-buttons{position:absolute;right:0}.edui-default .edui-dialog-buttons .edui-button{margin-right:10px}.edui-default .edui-dialog-buttons .edui-button .edui-button-body{width:96px;height:24px;font-size:12px;line-height:24px;text-align:center;cursor:default;background-color:#f2f2f2;border:1px solid #bfbfbf;border-radius:0}.edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body{background-color:#dedede;border-color:#a1a1a1;-webkit-box-shadow:0 2px 1px rgba(0,0,0,.1);box-shadow:0 2px 1px rgba(0,0,0,.1)}.edui-default .edui-dialog iframe{padding:0;margin:0;vertical-align:top;border:0}.edui-default .edui-dialog-modalmask{position:absolute;background-color:#ccc;filter:alpha(opacity=30);opacity:.3}.edui-default .edui-dialog-dragmask{position:absolute;cursor:move;background-color:transparent}.edui-default .edui-dialog-content{position:relative}.edui-default .dialogcontmask{position:absolute;display:block;width:100%;height:100%;cursor:move;visibility:hidden;filter:alpha(opacity=0);opacity:0}.edui-default .edui-for-link .edui-dialog-content{width:420px;height:200px;overflow:hidden}.edui-default .edui-for-background .edui-dialog-content{width:440px;height:280px;overflow:hidden}.edui-default .edui-for-template .edui-dialog-content{width:630px;height:390px;overflow:hidden}.edui-default .edui-for-scrawl .edui-dialog-content{width:515px;height:360px;*width:506px}.edui-default .edui-for-spechars .edui-dialog-content{width:620px;height:500px;*width:630px;*height:570px}.edui-default .edui-for-insertimage .edui-dialog-content{width:650px;height:400px;overflow:hidden}.edui-default .edui-for-webapp .edui-dialog-content{width:560px;height:450px;overflow:hidden;_width:565px}.edui-default .edui-for-insertframe .edui-dialog-content{width:350px;height:200px;overflow:hidden}.edui-default .edui-for-wordimage .edui-dialog-content{width:620px;height:380px;overflow:hidden}.edui-default .edui-for-attachment .edui-dialog-content{width:650px;height:400px;overflow:hidden}.edui-default .edui-for-map .edui-dialog-content{width:550px;height:400px}.edui-default .edui-for-gmap .edui-dialog-content{width:550px;height:400px}.edui-default .edui-for-insertvideo .edui-dialog-content{width:590px;height:390px}.edui-default .edui-for-anchor .edui-dialog-content{width:320px;height:60px;overflow:hidden}.edui-default .edui-for-searchreplace .edui-dialog-content{width:400px;height:220px}.edui-default .edui-for-help .edui-dialog-content{width:400px;height:420px}.edui-default .edui-for-edittable .edui-dialog-content{width:540px;height:335px;_width:590px}.edui-default .edui-for-edittip .edui-dialog-content{width:225px;height:60px}.edui-default .edui-for-edittd .edui-dialog-content{width:240px;height:50px}.edui-default .edui-for-snapscreen .edui-dialog-content{width:400px;height:220px}.edui-default .edui-for-music .edui-dialog-content{width:515px;height:360px}.edui-default .edui-for-paragraph .edui-listitem-label{font-family:Tahoma,Verdana,Arial,Helvetica}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p{font-size:22px;line-height:27px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1{font-size:32px;font-weight:bolder;line-height:36px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2{font-size:27px;font-weight:bolder;line-height:29px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3{font-size:19px;font-weight:bolder;line-height:23px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4{font-size:16px;font-weight:bolder;line-height:19px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5{font-size:13px;font-weight:bolder;line-height:16px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6{font-size:12px;font-weight:bolder;line-height:14px}.edui-default .edui-for-inserttable .edui-splitborder{display:none}.edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow{width:0}.edui-default .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder{border-left:1px solid transparent}.edui-default .edui-tablepicker .edui-infoarea{width:220px;height:14px;margin-bottom:3px;clear:both;font-size:12px;line-height:14px}.edui-default .edui-tablepicker .edui-infoarea .edui-label{float:left}.edui-default .edui-dialog-buttons .edui-label{line-height:24px}.edui-default .edui-tablepicker .edui-infoarea .edui-clickable{float:right}.edui-default .edui-tablepicker .edui-pickarea{width:220px;height:220px;background:url(../images/unhighlighted.gif) repeat}.edui-default .edui-tablepicker .edui-pickarea .edui-overlay{background:url(../images/highlighted.gif) repeat}.edui-default .edui-colorpicker-topbar{width:200px;height:27px}.edui-default .edui-colorpicker-preview{float:left;width:128px;height:20px;margin-left:1px;border:1px inset #000}.edui-default .edui-colorpicker-nocolor{float:right;height:14px;padding:3px 5px;margin-right:1px;font-size:12px;line-height:14px;cursor:pointer;border:1px solid #333}.edui-default .edui-colorpicker-tablefirstrow{height:30px}.edui-default .edui-colorpicker-colorcell{display:block;width:14px;height:14px;margin:0;cursor:pointer}.edui-default .edui-colorpicker-colorcell:hover{width:14px;height:14px;margin:0}.edui-default .edui-colorpicker-advbtn{display:block;height:20px;text-align:center;cursor:pointer}.arrow_down{background:#fff url(../images/arrow_down.png) no-repeat center}.arrow_up{background:#fff url(../images/arrow_up.png) no-repeat center}.edui-colorpicker-adv{position:relative;display:none;height:180px;overflow:hidden}.edui-colorpicker-hue,.edui-colorpicker-plant{border:solid 1px #666}.edui-colorpicker-pad{position:absolute;top:13px;left:14px;width:150px;height:150px;overflow:hidden;cursor:crosshair;background:red}.edui-colorpicker-cover{position:absolute;top:0;left:0;width:150px;height:150px;background:url(../images/tangram-colorpicker.png) -160px -200px}.edui-colorpicker-padDot{position:absolute;top:0;left:0;z-index:1000;width:11px;height:11px;overflow:hidden;background:url(../images/tangram-colorpicker.png) 0 -200px repeat-x}.edui-colorpicker-sliderMain{position:absolute;top:13px;left:171px;width:19px;height:152px;background:url(../images/tangram-colorpicker.png) -179px -12px no-repeat}.edui-colorpicker-slider{width:100%;height:100%;cursor:pointer}.edui-colorpicker-thumb{position:absolute;top:0;right:-1px;left:-1px;height:3px;cursor:pointer;background:#fff;border:1px solid #000;opacity:.8}.edui-default .edui-autotypesetpicker .edui-autotypesetpicker-body{margin-bottom:3px;clear:both;font-size:12px}.edui-default .edui-autotypesetpicker-body table{border-spacing:2px;border-collapse:separate}.edui-default .edui-autotypesetpicker-body td{font-size:12px;word-wrap:break-word}.edui-default .edui-autotypesetpicker-body td input{margin:3px 3px 3px 4px;*margin:1px 0 0 0}.edui-default .edui-cellalignpicker .edui-cellalignpicker-body{width:70px;font-size:12px;cursor:default}.edui-default .edui-cellalignpicker-body table{border-spacing:0;border-collapse:separate}.edui-default .edui-cellalignpicker-body td{padding:1px}.edui-default .edui-cellalignpicker-body .edui-icon{width:20px;height:20px;padding:1px;background-image:url(../images/table-cell-align.png)}.edui-default .edui-cellalignpicker-body .edui-left{background-position:0 0}.edui-default .edui-cellalignpicker-body .edui-center{background-position:-25px 0}.edui-default .edui-cellalignpicker-body .edui-right{background-position:-51px 0}.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left{background-position:-73px 0}.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center{background-position:-98px 0}.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right{background-position:-124px 0}.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left{background-color:#f1f4f5;background-position:-146px 0}.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center{background-position:-245px 0}.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right{background-position:-271px 0}.edui-default .edui-toolbar .edui-separator{width:2px;height:20px;margin:2px 4px 2px 3px;background:url(../images/icons.png) -181px 0;background:url(../images/icons.gif) -181px 0\9}.edui-default .edui-toolbar .edui-colorbutton .edui-colorlump{position:absolute;bottom:1px;left:1px;width:18px;height:4px;overflow:hidden}.edui-default .edui-for-emotion .edui-icon{background-position:-60px -20px}.edui-default .edui-for-emotion .edui-popup-content iframe{width:514px;height:380px;overflow:hidden}.edui-default .edui-for-emotion .edui-popup-content{position:relative;z-index:555}.edui-default .edui-for-emotion .edui-splitborder{display:none}.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow{width:0}.edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder{border-left:1px solid transparent}.edui-default .edui-hassubmenu .edui-arrow{float:right;width:20px;height:20px;background:url(../images/icons-all.gif) no-repeat 10px -233px}.edui-default .edui-menu-body .edui-menuitem{padding:1px}.edui-default .edui-menuseparator{height:1px;margin:2px 0;overflow:hidden}.edui-default .edui-menuseparator-inner{margin-right:1px;margin-left:29px;border-bottom:1px solid #e2e3e3}.edui-default .edui-menu-body .edui-state-hover{padding:0!important;background-color:#fff5d4;border:1px solid #dcac6c}.edui-default .edui-shortcutmenu{width:190px;height:50px;padding:2px;background-color:#fff;border:1px solid #ccc;border-radius:0}.edui-default .edui-wordpastepop .edui-popup-content{width:54px;height:21px;padding:0;border:none}.edui-default .edui-pasteicon{width:100%;height:100%;background-image:url(../images/wordpaste.png);background-position:0 0}.edui-default .edui-pasteicon.edui-state-opened{background-position:0 -34px}.edui-default .edui-pastecontainer{position:relative;width:97px;visibility:hidden;background:#fff;border:1px solid #ccc}.edui-default .edui-pastecontainer .edui-title{height:25px;padding-left:5px;font-size:12px;font-weight:700;line-height:25px;background:#f8f8ff}.edui-default .edui-pastecontainer .edui-button{margin:3px 0;overflow:hidden}.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon,.edui-default .edui-pastecontainer .edui-button .edui-richtxticon,.edui-default .edui-pastecontainer .edui-button .edui-tagicon{float:left;width:29px;height:29px;margin-left:5px;cursor:pointer;background-image:url(../images/wordpaste.png);background-repeat:no-repeat}.edui-default .edui-pastecontainer .edui-button .edui-richtxticon{margin-left:0;background-position:-109px 0}.edui-default .edui-pastecontainer .edui-button .edui-tagicon{background-position:-148px 1px}.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon{background-position:-72px 0}.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon{background-position:-109px -34px}.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{background-position:-148px -34px}.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{background-position:-72px -34px}
\ No newline at end of file
diff --git a/www/js/ueditor/themes/default/dialogbase.css b/www/js/ueditor/themes/default/dialogbase.css
deleted file mode 100644
index ea712666a3..0000000000
--- a/www/js/ueditor/themes/default/dialogbase.css
+++ /dev/null
@@ -1,100 +0,0 @@
-/*弹出对话框页面样式组件
-*/
-
-/*reset
-*/
-html, body, div, span, applet, object, iframe,
-h1, h2, h3, h4, h5, h6, p, blockquote, pre,
-a, abbr, acronym, address, big, cite, code,
-del, dfn, em, font, img, ins, kbd, q, s, samp,
-small, strike, strong, sub, sup, tt, var,
-b, u, i, center,
-dl, dt, dd, ol, ul, li,
-fieldset, form, label, legend,
-table, caption, tbody, tfoot, thead, tr, th, td {
- margin: 0;
- padding: 0;
- outline: 0;
- font-size: 100%;
-}
-
-body {
- line-height: 1;
-}
-
-ol, ul {
- list-style: none;
-}
-
-blockquote, q {
- quotes: none;
-}
-
-ins {
- text-decoration: none;
-}
-
-del {
- text-decoration: line-through;
-}
-
-table {
- border-collapse: collapse;
- border-spacing: 0;
-}
-
-/*module
-*/
-body {
- background-color: #fff;
- font: 12px/1.5 sans-serif, "宋体", "Arial Narrow", HELVETICA;
- color: #646464;
-}
-
-/*tab*/
-.tabhead {
- position: relative;
- z-index: 10;
-}
-
-.tabhead span {
- display: inline-block;
- padding: 0 5px;
- height: 30px;
- border: 1px solid #ccc;
- background: url("images/dialog-title-bg.png") repeat-x;
- text-align: center;
- line-height: 30px;
- cursor: pointer;
- *margin-right: 5px;
-}
-
-.tabhead span.focus {
- height: 31px;
- border-bottom: none;
- background: #fff;
-}
-
-.tabbody {
- position: relative;
- top: -1px;
- margin: 0 auto;
- border: 1px solid #ccc;
-}
-
-/*button*/
-a.button {
- display: block;
- text-align: center;
- line-height: 24px;
- text-decoration: none;
- height: 24px;
- width: 95px;
- border: 0;
- color: #838383;
- background: url(../../themes/default/images/icons-all.gif) no-repeat;
-}
-
-a.button:hover {
- background-position: 0 -30px;
-}
\ No newline at end of file
diff --git a/www/js/ueditor/themes/default/images/anchor.gif b/www/js/ueditor/themes/default/images/anchor.gif
deleted file mode 100644
index 5aa797b224..0000000000
Binary files a/www/js/ueditor/themes/default/images/anchor.gif and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/arrow.png b/www/js/ueditor/themes/default/images/arrow.png
deleted file mode 100644
index d9008866ba..0000000000
Binary files a/www/js/ueditor/themes/default/images/arrow.png and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/arrow_down.png b/www/js/ueditor/themes/default/images/arrow_down.png
deleted file mode 100644
index e9257e83b0..0000000000
Binary files a/www/js/ueditor/themes/default/images/arrow_down.png and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/arrow_up.png b/www/js/ueditor/themes/default/images/arrow_up.png
deleted file mode 100644
index 74277af1e6..0000000000
Binary files a/www/js/ueditor/themes/default/images/arrow_up.png and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/button-bg.gif b/www/js/ueditor/themes/default/images/button-bg.gif
deleted file mode 100644
index ec7fa2eabf..0000000000
Binary files a/www/js/ueditor/themes/default/images/button-bg.gif and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/cancelbutton.gif b/www/js/ueditor/themes/default/images/cancelbutton.gif
deleted file mode 100644
index df4bc2c06d..0000000000
Binary files a/www/js/ueditor/themes/default/images/cancelbutton.gif and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/charts.png b/www/js/ueditor/themes/default/images/charts.png
deleted file mode 100644
index 713965cc4c..0000000000
Binary files a/www/js/ueditor/themes/default/images/charts.png and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/cursor_h.gif b/www/js/ueditor/themes/default/images/cursor_h.gif
deleted file mode 100644
index d7c3e7e9eb..0000000000
Binary files a/www/js/ueditor/themes/default/images/cursor_h.gif and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/cursor_h.png b/www/js/ueditor/themes/default/images/cursor_h.png
deleted file mode 100644
index 2088fc2407..0000000000
Binary files a/www/js/ueditor/themes/default/images/cursor_h.png and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/cursor_v.gif b/www/js/ueditor/themes/default/images/cursor_v.gif
deleted file mode 100644
index bb508db552..0000000000
Binary files a/www/js/ueditor/themes/default/images/cursor_v.gif and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/cursor_v.png b/www/js/ueditor/themes/default/images/cursor_v.png
deleted file mode 100644
index 6f39ca3d84..0000000000
Binary files a/www/js/ueditor/themes/default/images/cursor_v.png and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/dialog-title-bg.png b/www/js/ueditor/themes/default/images/dialog-title-bg.png
deleted file mode 100644
index f744f267f7..0000000000
Binary files a/www/js/ueditor/themes/default/images/dialog-title-bg.png and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/filescan.png b/www/js/ueditor/themes/default/images/filescan.png
deleted file mode 100644
index 1d27158869..0000000000
Binary files a/www/js/ueditor/themes/default/images/filescan.png and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/highlighted.gif b/www/js/ueditor/themes/default/images/highlighted.gif
deleted file mode 100644
index 9272b4915a..0000000000
Binary files a/www/js/ueditor/themes/default/images/highlighted.gif and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/icons-all.gif b/www/js/ueditor/themes/default/images/icons-all.gif
deleted file mode 100644
index 21915e59de..0000000000
Binary files a/www/js/ueditor/themes/default/images/icons-all.gif and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/icons.gif b/www/js/ueditor/themes/default/images/icons.gif
deleted file mode 100644
index 7abd30a1c6..0000000000
Binary files a/www/js/ueditor/themes/default/images/icons.gif and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/icons.png b/www/js/ueditor/themes/default/images/icons.png
deleted file mode 100644
index c015e3aac9..0000000000
Binary files a/www/js/ueditor/themes/default/images/icons.png and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/loaderror.png b/www/js/ueditor/themes/default/images/loaderror.png
deleted file mode 100644
index 35ff333645..0000000000
Binary files a/www/js/ueditor/themes/default/images/loaderror.png and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/loading.gif b/www/js/ueditor/themes/default/images/loading.gif
deleted file mode 100644
index b713e27dfb..0000000000
Binary files a/www/js/ueditor/themes/default/images/loading.gif and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/lock.gif b/www/js/ueditor/themes/default/images/lock.gif
deleted file mode 100644
index b4e6d7822a..0000000000
Binary files a/www/js/ueditor/themes/default/images/lock.gif and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/neweditor-tab-bg.png b/www/js/ueditor/themes/default/images/neweditor-tab-bg.png
deleted file mode 100644
index 8f398b0958..0000000000
Binary files a/www/js/ueditor/themes/default/images/neweditor-tab-bg.png and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/pagebreak.gif b/www/js/ueditor/themes/default/images/pagebreak.gif
deleted file mode 100644
index 8d1cffd64a..0000000000
Binary files a/www/js/ueditor/themes/default/images/pagebreak.gif and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/scale.png b/www/js/ueditor/themes/default/images/scale.png
deleted file mode 100644
index f45adb5857..0000000000
Binary files a/www/js/ueditor/themes/default/images/scale.png and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/sortable.png b/www/js/ueditor/themes/default/images/sortable.png
deleted file mode 100644
index 1bca649698..0000000000
Binary files a/www/js/ueditor/themes/default/images/sortable.png and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/spacer.gif b/www/js/ueditor/themes/default/images/spacer.gif
deleted file mode 100644
index 5bfd67a2d6..0000000000
Binary files a/www/js/ueditor/themes/default/images/spacer.gif and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/sparator_v.png b/www/js/ueditor/themes/default/images/sparator_v.png
deleted file mode 100644
index 8cf5662da8..0000000000
Binary files a/www/js/ueditor/themes/default/images/sparator_v.png and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/table-cell-align.png b/www/js/ueditor/themes/default/images/table-cell-align.png
deleted file mode 100644
index ddf42853ea..0000000000
Binary files a/www/js/ueditor/themes/default/images/table-cell-align.png and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/tangram-colorpicker.png b/www/js/ueditor/themes/default/images/tangram-colorpicker.png
deleted file mode 100644
index 738e500cfc..0000000000
Binary files a/www/js/ueditor/themes/default/images/tangram-colorpicker.png and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/toolbar_bg.png b/www/js/ueditor/themes/default/images/toolbar_bg.png
deleted file mode 100644
index 7ab685f423..0000000000
Binary files a/www/js/ueditor/themes/default/images/toolbar_bg.png and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/unhighlighted.gif b/www/js/ueditor/themes/default/images/unhighlighted.gif
deleted file mode 100644
index 7ad0b67ae6..0000000000
Binary files a/www/js/ueditor/themes/default/images/unhighlighted.gif and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/upload.png b/www/js/ueditor/themes/default/images/upload.png
deleted file mode 100644
index 08d4d92682..0000000000
Binary files a/www/js/ueditor/themes/default/images/upload.png and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/videologo.gif b/www/js/ueditor/themes/default/images/videologo.gif
deleted file mode 100644
index 555af7417d..0000000000
Binary files a/www/js/ueditor/themes/default/images/videologo.gif and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/word.gif b/www/js/ueditor/themes/default/images/word.gif
deleted file mode 100644
index 9ef5d09b7b..0000000000
Binary files a/www/js/ueditor/themes/default/images/word.gif and /dev/null differ
diff --git a/www/js/ueditor/themes/default/images/wordpaste.png b/www/js/ueditor/themes/default/images/wordpaste.png
deleted file mode 100644
index 936775810b..0000000000
Binary files a/www/js/ueditor/themes/default/images/wordpaste.png and /dev/null differ
diff --git a/www/js/ueditor/themes/iframe.css b/www/js/ueditor/themes/iframe.css
deleted file mode 100644
index 729bef22c7..0000000000
--- a/www/js/ueditor/themes/iframe.css
+++ /dev/null
@@ -1,2 +0,0 @@
-/*可以在这里添加你自己的css*/
-body{font-family:'宋体';font-size:13px;}
diff --git a/www/js/ueditor/third-party/codemirror/codemirror.css b/www/js/ueditor/third-party/codemirror/codemirror.css
deleted file mode 100644
index 461ae195ac..0000000000
--- a/www/js/ueditor/third-party/codemirror/codemirror.css
+++ /dev/null
@@ -1,104 +0,0 @@
-.CodeMirror {
- line-height: 1em;
- font-family: monospace;
-}
-
-.CodeMirror-scroll {
- overflow: auto;
- height: 300px;
- /* This is needed to prevent an IE[67] bug where the scrolled content
- is visible outside of the scrolling box. */
- position: relative;
-}
-
-.CodeMirror-gutter {
- position: absolute; left: 0; top: 0;
- z-index: 10;
- background-color: #f7f7f7;
- border-right: 1px solid #eee;
- min-width: 2em;
- height: 100%;
-}
-.CodeMirror-gutter-text {
- color: #aaa;
- text-align: right;
- padding: .4em .2em .4em .4em;
- white-space: pre !important;
-}
-.CodeMirror-lines {
- padding: .4em;
-}
-
-.CodeMirror pre {
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- -o-border-radius: 0;
- border-radius: 0;
- border-width: 0; margin: 0; padding: 0; background: transparent;
- font-family: inherit;
- font-size: inherit;
- padding: 0; margin: 0;
- white-space: pre;
- word-wrap: normal;
-}
-
-.CodeMirror-wrap pre {
- word-wrap: break-word;
- white-space: pre-wrap;
-}
-.CodeMirror-wrap .CodeMirror-scroll {
- overflow-x: hidden;
-}
-
-.CodeMirror textarea {
- outline: none !important;
-}
-
-.CodeMirror pre.CodeMirror-cursor {
- z-index: 10;
- position: absolute;
- visibility: hidden;
- border-left: 1px solid black;
-}
-.CodeMirror-focused pre.CodeMirror-cursor {
- visibility: visible;
-}
-
-span.CodeMirror-selected { background: #d9d9d9; }
-.CodeMirror-focused span.CodeMirror-selected { background: #d2dcf8; }
-
-.CodeMirror-searching {background: #ffa;}
-
-/* Default theme */
-
-.cm-s-default span.cm-keyword {color: #708;}
-.cm-s-default span.cm-atom {color: #219;}
-.cm-s-default span.cm-number {color: #164;}
-.cm-s-default span.cm-def {color: #00f;}
-.cm-s-default span.cm-variable {color: black;}
-.cm-s-default span.cm-variable-2 {color: #05a;}
-.cm-s-default span.cm-variable-3 {color: #085;}
-.cm-s-default span.cm-property {color: black;}
-.cm-s-default span.cm-operator {color: black;}
-.cm-s-default span.cm-comment {color: #a50;}
-.cm-s-default span.cm-string {color: #a11;}
-.cm-s-default span.cm-string-2 {color: #f50;}
-.cm-s-default span.cm-meta {color: #555;}
-.cm-s-default span.cm-error {color: #f00;}
-.cm-s-default span.cm-qualifier {color: #555;}
-.cm-s-default span.cm-builtin {color: #30a;}
-.cm-s-default span.cm-bracket {color: #cc7;}
-.cm-s-default span.cm-tag {color: #170;}
-.cm-s-default span.cm-attribute {color: #00c;}
-.cm-s-default span.cm-header {color: #a0a;}
-.cm-s-default span.cm-quote {color: #090;}
-.cm-s-default span.cm-hr {color: #999;}
-.cm-s-default span.cm-link {color: #00c;}
-
-span.cm-header, span.cm-strong {font-weight: bold;}
-span.cm-em {font-style: italic;}
-span.cm-emstrong {font-style: italic; font-weight: bold;}
-span.cm-link {text-decoration: underline;}
-
-div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
-div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
diff --git a/www/js/ueditor/third-party/codemirror/codemirror.js b/www/js/ueditor/third-party/codemirror/codemirror.js
deleted file mode 100644
index 083f2421b2..0000000000
--- a/www/js/ueditor/third-party/codemirror/codemirror.js
+++ /dev/null
@@ -1,3581 +0,0 @@
-// CodeMirror version 2.2
-//
-// All functions that need access to the editor's state live inside
-// the CodeMirror function. Below that, at the bottom of the file,
-// some utilities are defined.
-
-// CodeMirror is the only global var we claim
-var CodeMirror = (function() {
- // This is the function that produces an editor instance. It's
- // closure is used to store the editor state.
- function CodeMirror(place, givenOptions) {
- // Determine effective options based on given values and defaults.
- var options = {}, defaults = CodeMirror.defaults;
- for (var opt in defaults)
- if (defaults.hasOwnProperty(opt))
- options[opt] = (givenOptions && givenOptions.hasOwnProperty(opt) ? givenOptions : defaults)[opt];
-
- var targetDocument = options["document"];
- // The element in which the editor lives.
- var wrapper = targetDocument.createElement("div");
- wrapper.className = "CodeMirror" + (options.lineWrapping ? " CodeMirror-wrap" : "");
- // This mess creates the base DOM structure for the editor.
- wrapper.innerHTML =
- '
' + // Wraps and hides input textarea
- '
' +
- '
';
- if (place.appendChild) place.appendChild(wrapper); else place(wrapper);
- // I've never seen more elegant code in my life.
- var inputDiv = wrapper.firstChild, input = inputDiv.firstChild,
- scroller = wrapper.lastChild, code = scroller.firstChild,
- mover = code.firstChild, gutter = mover.firstChild, gutterText = gutter.firstChild,
- lineSpace = gutter.nextSibling.firstChild, measure = lineSpace.firstChild,
- cursor = measure.nextSibling, lineDiv = cursor.nextSibling;
- themeChanged();
- // Needed to hide big blue blinking cursor on Mobile Safari
- if (/AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent)) input.style.width = "0px";
- if (!webkit) lineSpace.draggable = true;
- if (options.tabindex != null) input.tabIndex = options.tabindex;
- if (!options.gutter && !options.lineNumbers) gutter.style.display = "none";
-
- // Check for problem with IE innerHTML not working when we have a
- // P (or similar) parent node.
- try { stringWidth("x"); }
- catch (e) {
- if (e.message.match(/runtime/i))
- e = new Error("A CodeMirror inside a P-style element does not work in Internet Explorer. (innerHTML bug)");
- throw e;
- }
-
- // Delayed object wrap timeouts, making sure only one is active. blinker holds an interval.
- var poll = new Delayed(), highlight = new Delayed(), blinker;
-
- // mode holds a mode API object. doc is the tree of Line objects,
- // work an array of lines that should be parsed, and history the
- // undo history (instance of History constructor).
- var mode, doc = new BranchChunk([new LeafChunk([new Line("")])]), work, focused;
- loadMode();
- // The selection. These are always maintained to point at valid
- // positions. Inverted is used to remember that the user is
- // selecting bottom-to-top.
- var sel = {from: {line: 0, ch: 0}, to: {line: 0, ch: 0}, inverted: false};
- // Selection-related flags. shiftSelecting obviously tracks
- // whether the user is holding shift.
- var shiftSelecting, lastClick, lastDoubleClick, draggingText, overwrite = false;
- // Variables used by startOperation/endOperation to track what
- // happened during the operation.
- var updateInput, userSelChange, changes, textChanged, selectionChanged, leaveInputAlone,
- gutterDirty, callbacks;
- // Current visible range (may be bigger than the view window).
- var displayOffset = 0, showingFrom = 0, showingTo = 0, lastSizeC = 0;
- // bracketHighlighted is used to remember that a backet has been
- // marked.
- var bracketHighlighted;
- // Tracks the maximum line length so that the horizontal scrollbar
- // can be kept static when scrolling.
- var maxLine = "", maxWidth, tabText = computeTabText();
-
- // Initialize the content.
- operation(function(){setValue(options.value || ""); updateInput = false;})();
- var history = new History();
-
- // Register our event handlers.
- connect(scroller, "mousedown", operation(onMouseDown));
- connect(scroller, "dblclick", operation(onDoubleClick));
- connect(lineSpace, "dragstart", onDragStart);
- connect(lineSpace, "selectstart", e_preventDefault);
- // Gecko browsers fire contextmenu *after* opening the menu, at
- // which point we can't mess with it anymore. Context menu is
- // handled in onMouseDown for Gecko.
- if (!gecko) connect(scroller, "contextmenu", onContextMenu);
- connect(scroller, "scroll", function() {
- updateDisplay([]);
- if (options.fixedGutter) gutter.style.left = scroller.scrollLeft + "px";
- if (options.onScroll) options.onScroll(instance);
- });
- connect(window, "resize", function() {updateDisplay(true);});
- connect(input, "keyup", operation(onKeyUp));
- connect(input, "input", fastPoll);
- connect(input, "keydown", operation(onKeyDown));
- connect(input, "keypress", operation(onKeyPress));
- connect(input, "focus", onFocus);
- connect(input, "blur", onBlur);
-
- connect(scroller, "dragenter", e_stop);
- connect(scroller, "dragover", e_stop);
- connect(scroller, "drop", operation(onDrop));
- connect(scroller, "paste", function(){focusInput(); fastPoll();});
- connect(input, "paste", fastPoll);
- connect(input, "cut", operation(function(){replaceSelection("");}));
-
- // IE throws unspecified error in certain cases, when
- // trying to access activeElement before onload
- var hasFocus; try { hasFocus = (targetDocument.activeElement == input); } catch(e) { }
- if (hasFocus) setTimeout(onFocus, 20);
- else onBlur();
-
- function isLine(l) {return l >= 0 && l < doc.size;}
- // The instance object that we'll return. Mostly calls out to
- // local functions in the CodeMirror function. Some do some extra
- // range checking and/or clipping. operation is used to wrap the
- // call so that changes it makes are tracked, and the display is
- // updated afterwards.
- var instance = wrapper.CodeMirror = {
- getValue: getValue,
- setValue: operation(setValue),
- getSelection: getSelection,
- replaceSelection: operation(replaceSelection),
- focus: function(){focusInput(); onFocus(); fastPoll();},
- setOption: function(option, value) {
- var oldVal = options[option];
- options[option] = value;
- if (option == "mode" || option == "indentUnit") loadMode();
- else if (option == "readOnly" && value) {onBlur(); input.blur();}
- else if (option == "theme") themeChanged();
- else if (option == "lineWrapping" && oldVal != value) operation(wrappingChanged)();
- else if (option == "tabSize") operation(tabsChanged)();
- if (option == "lineNumbers" || option == "gutter" || option == "firstLineNumber" || option == "theme")
- operation(gutterChanged)();
- },
- getOption: function(option) {return options[option];},
- undo: operation(undo),
- redo: operation(redo),
- indentLine: operation(function(n, dir) {
- if (isLine(n)) indentLine(n, dir == null ? "smart" : dir ? "add" : "subtract");
- }),
- indentSelection: operation(indentSelected),
- historySize: function() {return {undo: history.done.length, redo: history.undone.length};},
- clearHistory: function() {history = new History();},
- matchBrackets: operation(function(){matchBrackets(true);}),
- getTokenAt: operation(function(pos) {
- pos = clipPos(pos);
- return getLine(pos.line).getTokenAt(mode, getStateBefore(pos.line), pos.ch);
- }),
- getStateAfter: function(line) {
- line = clipLine(line == null ? doc.size - 1: line);
- return getStateBefore(line + 1);
- },
- cursorCoords: function(start){
- if (start == null) start = sel.inverted;
- return pageCoords(start ? sel.from : sel.to);
- },
- charCoords: function(pos){return pageCoords(clipPos(pos));},
- coordsChar: function(coords) {
- var off = eltOffset(lineSpace);
- return coordsChar(coords.x - off.left, coords.y - off.top);
- },
- markText: operation(markText),
- setBookmark: setBookmark,
- setMarker: operation(addGutterMarker),
- clearMarker: operation(removeGutterMarker),
- setLineClass: operation(setLineClass),
- hideLine: operation(function(h) {return setLineHidden(h, true);}),
- showLine: operation(function(h) {return setLineHidden(h, false);}),
- onDeleteLine: function(line, f) {
- if (typeof line == "number") {
- if (!isLine(line)) return null;
- line = getLine(line);
- }
- (line.handlers || (line.handlers = [])).push(f);
- return line;
- },
- lineInfo: lineInfo,
- addWidget: function(pos, node, scroll, vert, horiz) {
- pos = localCoords(clipPos(pos));
- var top = pos.yBot, left = pos.x;
- node.style.position = "absolute";
- code.appendChild(node);
- if (vert == "over") top = pos.y;
- else if (vert == "near") {
- var vspace = Math.max(scroller.offsetHeight, doc.height * textHeight()),
- hspace = Math.max(code.clientWidth, lineSpace.clientWidth) - paddingLeft();
- if (pos.yBot + node.offsetHeight > vspace && pos.y > node.offsetHeight)
- top = pos.y - node.offsetHeight;
- if (left + node.offsetWidth > hspace)
- left = hspace - node.offsetWidth;
- }
- node.style.top = (top + paddingTop()) + "px";
- node.style.left = node.style.right = "";
- if (horiz == "right") {
- left = code.clientWidth - node.offsetWidth;
- node.style.right = "0px";
- } else {
- if (horiz == "left") left = 0;
- else if (horiz == "middle") left = (code.clientWidth - node.offsetWidth) / 2;
- node.style.left = (left + paddingLeft()) + "px";
- }
- if (scroll)
- scrollIntoView(left, top, left + node.offsetWidth, top + node.offsetHeight);
- },
-
- lineCount: function() {return doc.size;},
- clipPos: clipPos,
- getCursor: function(start) {
- if (start == null) start = sel.inverted;
- return copyPos(start ? sel.from : sel.to);
- },
- somethingSelected: function() {return !posEq(sel.from, sel.to);},
- setCursor: operation(function(line, ch, user) {
- if (ch == null && typeof line.line == "number") setCursor(line.line, line.ch, user);
- else setCursor(line, ch, user);
- }),
- setSelection: operation(function(from, to, user) {
- (user ? setSelectionUser : setSelection)(clipPos(from), clipPos(to || from));
- }),
- getLine: function(line) {if (isLine(line)) return getLine(line).text;},
- getLineHandle: function(line) {if (isLine(line)) return getLine(line);},
- setLine: operation(function(line, text) {
- if (isLine(line)) replaceRange(text, {line: line, ch: 0}, {line: line, ch: getLine(line).text.length});
- }),
- removeLine: operation(function(line) {
- if (isLine(line)) replaceRange("", {line: line, ch: 0}, clipPos({line: line+1, ch: 0}));
- }),
- replaceRange: operation(replaceRange),
- getRange: function(from, to) {return getRange(clipPos(from), clipPos(to));},
-
- execCommand: function(cmd) {return commands[cmd](instance);},
- // Stuff used by commands, probably not much use to outside code.
- moveH: operation(moveH),
- deleteH: operation(deleteH),
- moveV: operation(moveV),
- toggleOverwrite: function() {overwrite = !overwrite;},
-
- posFromIndex: function(off) {
- var lineNo = 0, ch;
- doc.iter(0, doc.size, function(line) {
- var sz = line.text.length + 1;
- if (sz > off) { ch = off; return true; }
- off -= sz;
- ++lineNo;
- });
- return clipPos({line: lineNo, ch: ch});
- },
- indexFromPos: function (coords) {
- if (coords.line < 0 || coords.ch < 0) return 0;
- var index = coords.ch;
- doc.iter(0, coords.line, function (line) {
- index += line.text.length + 1;
- });
- return index;
- },
-
- operation: function(f){return operation(f)();},
- refresh: function(){updateDisplay(true);},
- getInputField: function(){return input;},
- getWrapperElement: function(){return wrapper;},
- getScrollerElement: function(){return scroller;},
- getGutterElement: function(){return gutter;}
- };
-
- function getLine(n) { return getLineAt(doc, n); }
- function updateLineHeight(line, height) {
- gutterDirty = true;
- var diff = height - line.height;
- for (var n = line; n; n = n.parent) n.height += diff;
- }
-
- function setValue(code) {
- var top = {line: 0, ch: 0};
- updateLines(top, {line: doc.size - 1, ch: getLine(doc.size-1).text.length},
- splitLines(code), top, top);
- updateInput = true;
- }
- function getValue(code) {
- var text = [];
- doc.iter(0, doc.size, function(line) { text.push(line.text); });
- return text.join("\n");
- }
-
- function onMouseDown(e) {
- setShift(e.shiftKey);
- // Check whether this is a click in a widget
- for (var n = e_target(e); n != wrapper; n = n.parentNode)
- if (n.parentNode == code && n != mover) return;
-
- // See if this is a click in the gutter
- for (var n = e_target(e); n != wrapper; n = n.parentNode)
- if (n.parentNode == gutterText) {
- if (options.onGutterClick)
- options.onGutterClick(instance, indexOf(gutterText.childNodes, n) + showingFrom, e);
- return e_preventDefault(e);
- }
-
- var start = posFromMouse(e);
-
- switch (e_button(e)) {
- case 3:
- if (gecko && !mac) onContextMenu(e);
- return;
- case 2:
- if (start) setCursor(start.line, start.ch, true);
- return;
- }
- // For button 1, if it was clicked inside the editor
- // (posFromMouse returning non-null), we have to adjust the
- // selection.
- if (!start) {if (e_target(e) == scroller) e_preventDefault(e); return;}
-
- if (!focused) onFocus();
-
- var now = +new Date;
- if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) {
- e_preventDefault(e);
- setTimeout(focusInput, 20);
- return selectLine(start.line);
- } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) {
- lastDoubleClick = {time: now, pos: start};
- e_preventDefault(e);
- return selectWordAt(start);
- } else { lastClick = {time: now, pos: start}; }
-
- var last = start, going;
- if (dragAndDrop && !posEq(sel.from, sel.to) &&
- !posLess(start, sel.from) && !posLess(sel.to, start)) {
- // Let the drag handler handle this.
- if (webkit) lineSpace.draggable = true;
- var up = connect(targetDocument, "mouseup", operation(function(e2) {
- if (webkit) lineSpace.draggable = false;
- draggingText = false;
- up();
- if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {
- e_preventDefault(e2);
- setCursor(start.line, start.ch, true);
- focusInput();
- }
- }), true);
- draggingText = true;
- return;
- }
- e_preventDefault(e);
- setCursor(start.line, start.ch, true);
-
- function extend(e) {
- var cur = posFromMouse(e, true);
- if (cur && !posEq(cur, last)) {
- if (!focused) onFocus();
- last = cur;
- setSelectionUser(start, cur);
- updateInput = false;
- var visible = visibleLines();
- if (cur.line >= visible.to || cur.line < visible.from)
- going = setTimeout(operation(function(){extend(e);}), 150);
- }
- }
-
- var move = connect(targetDocument, "mousemove", operation(function(e) {
- clearTimeout(going);
- e_preventDefault(e);
- extend(e);
- }), true);
- var up = connect(targetDocument, "mouseup", operation(function(e) {
- clearTimeout(going);
- var cur = posFromMouse(e);
- if (cur) setSelectionUser(start, cur);
- e_preventDefault(e);
- focusInput();
- updateInput = true;
- move(); up();
- }), true);
- }
- function onDoubleClick(e) {
- for (var n = e_target(e); n != wrapper; n = n.parentNode)
- if (n.parentNode == gutterText) return e_preventDefault(e);
- var start = posFromMouse(e);
- if (!start) return;
- lastDoubleClick = {time: +new Date, pos: start};
- e_preventDefault(e);
- selectWordAt(start);
- }
- function onDrop(e) {
- e.preventDefault();
- var pos = posFromMouse(e, true), files = e.dataTransfer.files;
- if (!pos || options.readOnly) return;
- if (files && files.length && window.FileReader && window.File) {
- function loadFile(file, i) {
- var reader = new FileReader;
- reader.onload = function() {
- text[i] = reader.result;
- if (++read == n) {
- pos = clipPos(pos);
- operation(function() {
- var end = replaceRange(text.join(""), pos, pos);
- setSelectionUser(pos, end);
- })();
- }
- };
- reader.readAsText(file);
- }
- var n = files.length, text = Array(n), read = 0;
- for (var i = 0; i < n; ++i) loadFile(files[i], i);
- }
- else {
- try {
- var text = e.dataTransfer.getData("Text");
- if (text) {
- var end = replaceRange(text, pos, pos);
- var curFrom = sel.from, curTo = sel.to;
- setSelectionUser(pos, end);
- if (draggingText) replaceRange("", curFrom, curTo);
- focusInput();
- }
- }
- catch(e){}
- }
- }
- function onDragStart(e) {
- var txt = getSelection();
- // This will reset escapeElement
- htmlEscape(txt);
- e.dataTransfer.setDragImage(escapeElement, 0, 0);
- e.dataTransfer.setData("Text", txt);
- }
- function handleKeyBinding(e) {
- var name = keyNames[e.keyCode], next = keyMap[options.keyMap].auto, bound, dropShift;
- if (name == null || e.altGraphKey) {
- if (next) options.keyMap = next;
- return null;
- }
- if (e.altKey) name = "Alt-" + name;
- if (e.ctrlKey) name = "Ctrl-" + name;
- if (e.metaKey) name = "Cmd-" + name;
- if (e.shiftKey && (bound = lookupKey("Shift-" + name, options.extraKeys, options.keyMap))) {
- dropShift = true;
- } else {
- bound = lookupKey(name, options.extraKeys, options.keyMap);
- }
- if (typeof bound == "string") {
- if (commands.propertyIsEnumerable(bound)) bound = commands[bound];
- else bound = null;
- }
- if (next && (bound || !isModifierKey(e))) options.keyMap = next;
- if (!bound) return false;
- if (dropShift) {
- var prevShift = shiftSelecting;
- shiftSelecting = null;
- bound(instance);
- shiftSelecting = prevShift;
- } else bound(instance);
- e_preventDefault(e);
- return true;
- }
- var lastStoppedKey = null;
- function onKeyDown(e) {
- if (!focused) onFocus();
- var code = e.keyCode;
- // IE does strange things with escape.
- if (ie && code == 27) { e.returnValue = false; }
- setShift(code == 16 || e.shiftKey);
- // First give onKeyEvent option a chance to handle this.
- if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;
- var handled = handleKeyBinding(e);
- if (window.opera) {
- lastStoppedKey = handled ? e.keyCode : null;
- // Opera has no cut event... we try to at least catch the key combo
- if (!handled && (mac ? e.metaKey : e.ctrlKey) && e.keyCode == 88)
- replaceSelection("");
- }
- }
- function onKeyPress(e) {
- if (window.opera && e.keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}
- if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;
- if (window.opera && !e.which && handleKeyBinding(e)) return;
- if (options.electricChars && mode.electricChars) {
- var ch = String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode);
- if (mode.electricChars.indexOf(ch) > -1)
- setTimeout(operation(function() {indentLine(sel.to.line, "smart");}), 75);
- }
- fastPoll();
- }
- function onKeyUp(e) {
- if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;
- if (e.keyCode == 16) shiftSelecting = null;
- }
-
- function onFocus() {
- if (options.readOnly) return;
- if (!focused) {
- if (options.onFocus) options.onFocus(instance);
- focused = true;
- if (wrapper.className.search(/\bCodeMirror-focused\b/) == -1)
- wrapper.className += " CodeMirror-focused";
- if (!leaveInputAlone) resetInput(true);
- }
- slowPoll();
- restartBlink();
- }
- function onBlur() {
- if (focused) {
- if (options.onBlur) options.onBlur(instance);
- focused = false;
- wrapper.className = wrapper.className.replace(" CodeMirror-focused", "");
- }
- clearInterval(blinker);
- setTimeout(function() {if (!focused) shiftSelecting = null;}, 150);
- }
-
- // Replace the range from from to to by the strings in newText.
- // Afterwards, set the selection to selFrom, selTo.
- function updateLines(from, to, newText, selFrom, selTo) {
- if (history) {
- var old = [];
- doc.iter(from.line, to.line + 1, function(line) { old.push(line.text); });
- history.addChange(from.line, newText.length, old);
- while (history.done.length > options.undoDepth) history.done.shift();
- }
- updateLinesNoUndo(from, to, newText, selFrom, selTo);
- }
- function unredoHelper(from, to) {
- var change = from.pop();
- if (change) {
- var replaced = [], end = change.start + change.added;
- doc.iter(change.start, end, function(line) { replaced.push(line.text); });
- to.push({start: change.start, added: change.old.length, old: replaced});
- var pos = clipPos({line: change.start + change.old.length - 1,
- ch: editEnd(replaced[replaced.length-1], change.old[change.old.length-1])});
- updateLinesNoUndo({line: change.start, ch: 0}, {line: end - 1, ch: getLine(end-1).text.length}, change.old, pos, pos);
- updateInput = true;
- }
- }
- function undo() {unredoHelper(history.done, history.undone);}
- function redo() {unredoHelper(history.undone, history.done);}
-
- function updateLinesNoUndo(from, to, newText, selFrom, selTo) {
- var recomputeMaxLength = false, maxLineLength = maxLine.length;
- if (!options.lineWrapping)
- doc.iter(from.line, to.line, function(line) {
- if (line.text.length == maxLineLength) {recomputeMaxLength = true; return true;}
- });
- if (from.line != to.line || newText.length > 1) gutterDirty = true;
-
- var nlines = to.line - from.line, firstLine = getLine(from.line), lastLine = getLine(to.line);
- // First adjust the line structure, taking some care to leave highlighting intact.
- if (from.ch == 0 && to.ch == 0 && newText[newText.length - 1] == "") {
- // This is a whole-line replace. Treated specially to make
- // sure line objects move the way they are supposed to.
- var added = [], prevLine = null;
- if (from.line) {
- prevLine = getLine(from.line - 1);
- prevLine.fixMarkEnds(lastLine);
- } else lastLine.fixMarkStarts();
- for (var i = 0, e = newText.length - 1; i < e; ++i)
- added.push(Line.inheritMarks(newText[i], prevLine));
- if (nlines) doc.remove(from.line, nlines, callbacks);
- if (added.length) doc.insert(from.line, added);
- } else if (firstLine == lastLine) {
- if (newText.length == 1)
- firstLine.replace(from.ch, to.ch, newText[0]);
- else {
- lastLine = firstLine.split(to.ch, newText[newText.length-1]);
- firstLine.replace(from.ch, null, newText[0]);
- firstLine.fixMarkEnds(lastLine);
- var added = [];
- for (var i = 1, e = newText.length - 1; i < e; ++i)
- added.push(Line.inheritMarks(newText[i], firstLine));
- added.push(lastLine);
- doc.insert(from.line + 1, added);
- }
- } else if (newText.length == 1) {
- firstLine.replace(from.ch, null, newText[0]);
- lastLine.replace(null, to.ch, "");
- firstLine.append(lastLine);
- doc.remove(from.line + 1, nlines, callbacks);
- } else {
- var added = [];
- firstLine.replace(from.ch, null, newText[0]);
- lastLine.replace(null, to.ch, newText[newText.length-1]);
- firstLine.fixMarkEnds(lastLine);
- for (var i = 1, e = newText.length - 1; i < e; ++i)
- added.push(Line.inheritMarks(newText[i], firstLine));
- if (nlines > 1) doc.remove(from.line + 1, nlines - 1, callbacks);
- doc.insert(from.line + 1, added);
- }
- if (options.lineWrapping) {
- var perLine = scroller.clientWidth / charWidth() - 3;
- doc.iter(from.line, from.line + newText.length, function(line) {
- if (line.hidden) return;
- var guess = Math.ceil(line.text.length / perLine) || 1;
- if (guess != line.height) updateLineHeight(line, guess);
- });
- } else {
- doc.iter(from.line, i + newText.length, function(line) {
- var l = line.text;
- if (l.length > maxLineLength) {
- maxLine = l; maxLineLength = l.length; maxWidth = null;
- recomputeMaxLength = false;
- }
- });
- if (recomputeMaxLength) {
- maxLineLength = 0; maxLine = ""; maxWidth = null;
- doc.iter(0, doc.size, function(line) {
- var l = line.text;
- if (l.length > maxLineLength) {
- maxLineLength = l.length; maxLine = l;
- }
- });
- }
- }
-
- // Add these lines to the work array, so that they will be
- // highlighted. Adjust work lines if lines were added/removed.
- var newWork = [], lendiff = newText.length - nlines - 1;
- for (var i = 0, l = work.length; i < l; ++i) {
- var task = work[i];
- if (task < from.line) newWork.push(task);
- else if (task > to.line) newWork.push(task + lendiff);
- }
- var hlEnd = from.line + Math.min(newText.length, 500);
- highlightLines(from.line, hlEnd);
- newWork.push(hlEnd);
- work = newWork;
- startWorker(100);
- // Remember that these lines changed, for updating the display
- changes.push({from: from.line, to: to.line + 1, diff: lendiff});
- var changeObj = {from: from, to: to, text: newText};
- if (textChanged) {
- for (var cur = textChanged; cur.next; cur = cur.next) {}
- cur.next = changeObj;
- } else textChanged = changeObj;
-
- // Update the selection
- function updateLine(n) {return n <= Math.min(to.line, to.line + lendiff) ? n : n + lendiff;}
- setSelection(selFrom, selTo, updateLine(sel.from.line), updateLine(sel.to.line));
-
- // Make sure the scroll-size div has the correct height.
- code.style.height = (doc.height * textHeight() + 2 * paddingTop()) + "px";
- }
-
- function replaceRange(code, from, to) {
- from = clipPos(from);
- if (!to) to = from; else to = clipPos(to);
- code = splitLines(code);
- function adjustPos(pos) {
- if (posLess(pos, from)) return pos;
- if (!posLess(to, pos)) return end;
- var line = pos.line + code.length - (to.line - from.line) - 1;
- var ch = pos.ch;
- if (pos.line == to.line)
- ch += code[code.length-1].length - (to.ch - (to.line == from.line ? from.ch : 0));
- return {line: line, ch: ch};
- }
- var end;
- replaceRange1(code, from, to, function(end1) {
- end = end1;
- return {from: adjustPos(sel.from), to: adjustPos(sel.to)};
- });
- return end;
- }
- function replaceSelection(code, collapse) {
- replaceRange1(splitLines(code), sel.from, sel.to, function(end) {
- if (collapse == "end") return {from: end, to: end};
- else if (collapse == "start") return {from: sel.from, to: sel.from};
- else return {from: sel.from, to: end};
- });
- }
- function replaceRange1(code, from, to, computeSel) {
- var endch = code.length == 1 ? code[0].length + from.ch : code[code.length-1].length;
- var newSel = computeSel({line: from.line + code.length - 1, ch: endch});
- updateLines(from, to, code, newSel.from, newSel.to);
- }
-
- function getRange(from, to) {
- var l1 = from.line, l2 = to.line;
- if (l1 == l2) return getLine(l1).text.slice(from.ch, to.ch);
- var code = [getLine(l1).text.slice(from.ch)];
- doc.iter(l1 + 1, l2, function(line) { code.push(line.text); });
- code.push(getLine(l2).text.slice(0, to.ch));
- return code.join("\n");
- }
- function getSelection() {
- return getRange(sel.from, sel.to);
- }
-
- var pollingFast = false; // Ensures slowPoll doesn't cancel fastPoll
- function slowPoll() {
- if (pollingFast) return;
- poll.set(options.pollInterval, function() {
- startOperation();
- readInput();
- if (focused) slowPoll();
- endOperation();
- });
- }
- function fastPoll() {
- var missed = false;
- pollingFast = true;
- function p() {
- startOperation();
- var changed = readInput();
- if (!changed && !missed) {missed = true; poll.set(60, p);}
- else {pollingFast = false; slowPoll();}
- endOperation();
- }
- poll.set(20, p);
- }
-
- // Previnput is a hack to work with IME. If we reset the textarea
- // on every change, that breaks IME. So we look for changes
- // compared to the previous content instead. (Modern browsers have
- // events that indicate IME taking place, but these are not widely
- // supported or compatible enough yet to rely on.)
- var prevInput = "";
- function readInput() {
- if (leaveInputAlone || !focused || hasSelection(input)) return false;
- var text = input.value;
- if (text == prevInput) return false;
- shiftSelecting = null;
- var same = 0, l = Math.min(prevInput.length, text.length);
- while (same < l && prevInput[same] == text[same]) ++same;
- if (same < prevInput.length)
- sel.from = {line: sel.from.line, ch: sel.from.ch - (prevInput.length - same)};
- else if (overwrite && posEq(sel.from, sel.to))
- sel.to = {line: sel.to.line, ch: Math.min(getLine(sel.to.line).text.length, sel.to.ch + (text.length - same))};
- replaceSelection(text.slice(same), "end");
- prevInput = text;
- return true;
- }
- function resetInput(user) {
- if (!posEq(sel.from, sel.to)) {
- prevInput = "";
- input.value = getSelection();
- input.select();
- } else if (user) prevInput = input.value = "";
- }
-
- function focusInput() {
- if (!options.readOnly) input.focus();
- }
-
- function scrollEditorIntoView() {
- if (!cursor.getBoundingClientRect) return;
- var rect = cursor.getBoundingClientRect();
- // IE returns bogus coordinates when the instance sits inside of an iframe and the cursor is hidden
- if (ie && rect.top == rect.bottom) return;
- var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight);
- if (rect.top < 0 || rect.bottom > winH) cursor.scrollIntoView();
- }
- function scrollCursorIntoView() {
- var cursor = localCoords(sel.inverted ? sel.from : sel.to);
- var x = options.lineWrapping ? Math.min(cursor.x, lineSpace.offsetWidth) : cursor.x;
- return scrollIntoView(x, cursor.y, x, cursor.yBot);
- }
- function scrollIntoView(x1, y1, x2, y2) {
- var pl = paddingLeft(), pt = paddingTop(), lh = textHeight();
- y1 += pt; y2 += pt; x1 += pl; x2 += pl;
- var screen = scroller.clientHeight, screentop = scroller.scrollTop, scrolled = false, result = true;
- if (y1 < screentop) {scroller.scrollTop = Math.max(0, y1 - 2*lh); scrolled = true;}
- else if (y2 > screentop + screen) {scroller.scrollTop = y2 + lh - screen; scrolled = true;}
-
- var screenw = scroller.clientWidth, screenleft = scroller.scrollLeft;
- var gutterw = options.fixedGutter ? gutter.clientWidth : 0;
- if (x1 < screenleft + gutterw) {
- if (x1 < 50) x1 = 0;
- scroller.scrollLeft = Math.max(0, x1 - 10 - gutterw);
- scrolled = true;
- }
- else if (x2 > screenw + screenleft - 3) {
- scroller.scrollLeft = x2 + 10 - screenw;
- scrolled = true;
- if (x2 > code.clientWidth) result = false;
- }
- if (scrolled && options.onScroll) options.onScroll(instance);
- return result;
- }
-
- function visibleLines() {
- var lh = textHeight(), top = scroller.scrollTop - paddingTop();
- var from_height = Math.max(0, Math.floor(top / lh));
- var to_height = Math.ceil((top + scroller.clientHeight) / lh);
- return {from: lineAtHeight(doc, from_height),
- to: lineAtHeight(doc, to_height)};
- }
- // Uses a set of changes plus the current scroll position to
- // determine which DOM updates have to be made, and makes the
- // updates.
- function updateDisplay(changes, suppressCallback) {
- if (!scroller.clientWidth) {
- showingFrom = showingTo = displayOffset = 0;
- return;
- }
- // Compute the new visible window
- var visible = visibleLines();
- // Bail out if the visible area is already rendered and nothing changed.
- if (changes !== true && changes.length == 0 && visible.from >= showingFrom && visible.to <= showingTo) return;
- var from = Math.max(visible.from - 100, 0), to = Math.min(doc.size, visible.to + 100);
- if (showingFrom < from && from - showingFrom < 20) from = showingFrom;
- if (showingTo > to && showingTo - to < 20) to = Math.min(doc.size, showingTo);
-
- // Create a range of theoretically intact lines, and punch holes
- // in that using the change info.
- var intact = changes === true ? [] :
- computeIntact([{from: showingFrom, to: showingTo, domStart: 0}], changes);
- // Clip off the parts that won't be visible
- var intactLines = 0;
- for (var i = 0; i < intact.length; ++i) {
- var range = intact[i];
- if (range.from < from) {range.domStart += (from - range.from); range.from = from;}
- if (range.to > to) range.to = to;
- if (range.from >= range.to) intact.splice(i--, 1);
- else intactLines += range.to - range.from;
- }
- if (intactLines == to - from) return;
- intact.sort(function(a, b) {return a.domStart - b.domStart;});
-
- var th = textHeight(), gutterDisplay = gutter.style.display;
- lineDiv.style.display = gutter.style.display = "none";
- patchDisplay(from, to, intact);
- lineDiv.style.display = "";
-
- // Position the mover div to align with the lines it's supposed
- // to be showing (which will cover the visible display)
- var different = from != showingFrom || to != showingTo || lastSizeC != scroller.clientHeight + th;
- // This is just a bogus formula that detects when the editor is
- // resized or the font size changes.
- if (different) lastSizeC = scroller.clientHeight + th;
- showingFrom = from; showingTo = to;
- displayOffset = heightAtLine(doc, from);
- mover.style.top = (displayOffset * th) + "px";
- code.style.height = (doc.height * th + 2 * paddingTop()) + "px";
-
- // Since this is all rather error prone, it is honoured with the
- // only assertion in the whole file.
- if (lineDiv.childNodes.length != showingTo - showingFrom)
- throw new Error("BAD PATCH! " + JSON.stringify(intact) + " size=" + (showingTo - showingFrom) +
- " nodes=" + lineDiv.childNodes.length);
-
- if (options.lineWrapping) {
- maxWidth = scroller.clientWidth;
- var curNode = lineDiv.firstChild;
- doc.iter(showingFrom, showingTo, function(line) {
- if (!line.hidden) {
- var height = Math.round(curNode.offsetHeight / th) || 1;
- if (line.height != height) {updateLineHeight(line, height); gutterDirty = true;}
- }
- curNode = curNode.nextSibling;
- });
- } else {
- if (maxWidth == null) maxWidth = stringWidth(maxLine);
- if (maxWidth > scroller.clientWidth) {
- lineSpace.style.width = maxWidth + "px";
- // Needed to prevent odd wrapping/hiding of widgets placed in here.
- code.style.width = "";
- code.style.width = scroller.scrollWidth + "px";
- } else {
- lineSpace.style.width = code.style.width = "";
- }
- }
- gutter.style.display = gutterDisplay;
- if (different || gutterDirty) updateGutter();
- updateCursor();
- if (!suppressCallback && options.onUpdate) options.onUpdate(instance);
- return true;
- }
-
- function computeIntact(intact, changes) {
- for (var i = 0, l = changes.length || 0; i < l; ++i) {
- var change = changes[i], intact2 = [], diff = change.diff || 0;
- for (var j = 0, l2 = intact.length; j < l2; ++j) {
- var range = intact[j];
- if (change.to <= range.from && change.diff)
- intact2.push({from: range.from + diff, to: range.to + diff,
- domStart: range.domStart});
- else if (change.to <= range.from || change.from >= range.to)
- intact2.push(range);
- else {
- if (change.from > range.from)
- intact2.push({from: range.from, to: change.from, domStart: range.domStart});
- if (change.to < range.to)
- intact2.push({from: change.to + diff, to: range.to + diff,
- domStart: range.domStart + (change.to - range.from)});
- }
- }
- intact = intact2;
- }
- return intact;
- }
-
- function patchDisplay(from, to, intact) {
- // The first pass removes the DOM nodes that aren't intact.
- if (!intact.length) lineDiv.innerHTML = "";
- else {
- function killNode(node) {
- var tmp = node.nextSibling;
- node.parentNode.removeChild(node);
- return tmp;
- }
- var domPos = 0, curNode = lineDiv.firstChild, n;
- for (var i = 0; i < intact.length; ++i) {
- var cur = intact[i];
- while (cur.domStart > domPos) {curNode = killNode(curNode); domPos++;}
- for (var j = 0, e = cur.to - cur.from; j < e; ++j) {curNode = curNode.nextSibling; domPos++;}
- }
- while (curNode) curNode = killNode(curNode);
- }
- // This pass fills in the lines that actually changed.
- var nextIntact = intact.shift(), curNode = lineDiv.firstChild, j = from;
- var sfrom = sel.from.line, sto = sel.to.line, inSel = sfrom < from && sto >= from;
- var scratch = targetDocument.createElement("div"), newElt;
- doc.iter(from, to, function(line) {
- var ch1 = null, ch2 = null;
- if (inSel) {
- ch1 = 0;
- if (sto == j) {inSel = false; ch2 = sel.to.ch;}
- } else if (sfrom == j) {
- if (sto == j) {ch1 = sel.from.ch; ch2 = sel.to.ch;}
- else {inSel = true; ch1 = sel.from.ch;}
- }
- if (nextIntact && nextIntact.to == j) nextIntact = intact.shift();
- if (!nextIntact || nextIntact.from > j) {
- if (line.hidden) scratch.innerHTML = "
";
- else scratch.innerHTML = line.getHTML(ch1, ch2, true, tabText);
- lineDiv.insertBefore(scratch.firstChild, curNode);
- } else {
- curNode = curNode.nextSibling;
- }
- ++j;
- });
- }
-
- function updateGutter() {
- if (!options.gutter && !options.lineNumbers) return;
- var hText = mover.offsetHeight, hEditor = scroller.clientHeight;
- gutter.style.height = (hText - hEditor < 2 ? hEditor : hText) + "px";
- var html = [], i = showingFrom;
- doc.iter(showingFrom, Math.max(showingTo, showingFrom + 1), function(line) {
- if (line.hidden) {
- html.push("
");
- } else {
- var marker = line.gutterMarker;
- var text = options.lineNumbers ? i + options.firstLineNumber : null;
- if (marker && marker.text)
- text = marker.text.replace("%N%", text != null ? text : "");
- else if (text == null)
- text = "\u00a0";
- html.push((marker && marker.style ? '
' : ""), text);
- for (var j = 1; j < line.height; ++j) html.push(" ");
- html.push(" ");
- }
- ++i;
- });
- gutter.style.display = "none";
- gutterText.innerHTML = html.join("");
- var minwidth = String(doc.size).length, firstNode = gutterText.firstChild, val = eltText(firstNode), pad = "";
- while (val.length + pad.length < minwidth) pad += "\u00a0";
- if (pad) firstNode.insertBefore(targetDocument.createTextNode(pad), firstNode.firstChild);
- gutter.style.display = "";
- lineSpace.style.marginLeft = gutter.offsetWidth + "px";
- gutterDirty = false;
- }
- function updateCursor() {
- var head = sel.inverted ? sel.from : sel.to, lh = textHeight();
- var pos = localCoords(head, true);
- var wrapOff = eltOffset(wrapper), lineOff = eltOffset(lineDiv);
- inputDiv.style.top = (pos.y + lineOff.top - wrapOff.top) + "px";
- inputDiv.style.left = (pos.x + lineOff.left - wrapOff.left) + "px";
- if (posEq(sel.from, sel.to)) {
- cursor.style.top = pos.y + "px";
- cursor.style.left = (options.lineWrapping ? Math.min(pos.x, lineSpace.offsetWidth) : pos.x) + "px";
- cursor.style.display = "";
- }
- else cursor.style.display = "none";
- }
-
- function setShift(val) {
- if (val) shiftSelecting = shiftSelecting || (sel.inverted ? sel.to : sel.from);
- else shiftSelecting = null;
- }
- function setSelectionUser(from, to) {
- var sh = shiftSelecting && clipPos(shiftSelecting);
- if (sh) {
- if (posLess(sh, from)) from = sh;
- else if (posLess(to, sh)) to = sh;
- }
- setSelection(from, to);
- userSelChange = true;
- }
- // Update the selection. Last two args are only used by
- // updateLines, since they have to be expressed in the line
- // numbers before the update.
- function setSelection(from, to, oldFrom, oldTo) {
- goalColumn = null;
- if (oldFrom == null) {oldFrom = sel.from.line; oldTo = sel.to.line;}
- if (posEq(sel.from, from) && posEq(sel.to, to)) return;
- if (posLess(to, from)) {var tmp = to; to = from; from = tmp;}
-
- // Skip over hidden lines.
- if (from.line != oldFrom) from = skipHidden(from, oldFrom, sel.from.ch);
- if (to.line != oldTo) to = skipHidden(to, oldTo, sel.to.ch);
-
- if (posEq(from, to)) sel.inverted = false;
- else if (posEq(from, sel.to)) sel.inverted = false;
- else if (posEq(to, sel.from)) sel.inverted = true;
-
- // Some ugly logic used to only mark the lines that actually did
- // see a change in selection as changed, rather than the whole
- // selected range.
- if (posEq(from, to)) {
- if (!posEq(sel.from, sel.to))
- changes.push({from: oldFrom, to: oldTo + 1});
- }
- else if (posEq(sel.from, sel.to)) {
- changes.push({from: from.line, to: to.line + 1});
- }
- else {
- if (!posEq(from, sel.from)) {
- if (from.line < oldFrom)
- changes.push({from: from.line, to: Math.min(to.line, oldFrom) + 1});
- else
- changes.push({from: oldFrom, to: Math.min(oldTo, from.line) + 1});
- }
- if (!posEq(to, sel.to)) {
- if (to.line < oldTo)
- changes.push({from: Math.max(oldFrom, from.line), to: oldTo + 1});
- else
- changes.push({from: Math.max(from.line, oldTo), to: to.line + 1});
- }
- }
- sel.from = from; sel.to = to;
- selectionChanged = true;
- }
- function skipHidden(pos, oldLine, oldCh) {
- function getNonHidden(dir) {
- var lNo = pos.line + dir, end = dir == 1 ? doc.size : -1;
- while (lNo != end) {
- var line = getLine(lNo);
- if (!line.hidden) {
- var ch = pos.ch;
- if (ch > oldCh || ch > line.text.length) ch = line.text.length;
- return {line: lNo, ch: ch};
- }
- lNo += dir;
- }
- }
- var line = getLine(pos.line);
- if (!line.hidden) return pos;
- if (pos.line >= oldLine) return getNonHidden(1) || getNonHidden(-1);
- else return getNonHidden(-1) || getNonHidden(1);
- }
- function setCursor(line, ch, user) {
- var pos = clipPos({line: line, ch: ch || 0});
- (user ? setSelectionUser : setSelection)(pos, pos);
- }
-
- function clipLine(n) {return Math.max(0, Math.min(n, doc.size-1));}
- function clipPos(pos) {
- if (pos.line < 0) return {line: 0, ch: 0};
- if (pos.line >= doc.size) return {line: doc.size-1, ch: getLine(doc.size-1).text.length};
- var ch = pos.ch, linelen = getLine(pos.line).text.length;
- if (ch == null || ch > linelen) return {line: pos.line, ch: linelen};
- else if (ch < 0) return {line: pos.line, ch: 0};
- else return pos;
- }
-
- function findPosH(dir, unit) {
- var end = sel.inverted ? sel.from : sel.to, line = end.line, ch = end.ch;
- var lineObj = getLine(line);
- function findNextLine() {
- for (var l = line + dir, e = dir < 0 ? -1 : doc.size; l != e; l += dir) {
- var lo = getLine(l);
- if (!lo.hidden) { line = l; lineObj = lo; return true; }
- }
- }
- function moveOnce(boundToLine) {
- if (ch == (dir < 0 ? 0 : lineObj.text.length)) {
- if (!boundToLine && findNextLine()) ch = dir < 0 ? lineObj.text.length : 0;
- else return false;
- } else ch += dir;
- return true;
- }
- if (unit == "char") moveOnce();
- else if (unit == "column") moveOnce(true);
- else if (unit == "word") {
- var sawWord = false;
- for (;;) {
- if (dir < 0) if (!moveOnce()) break;
- if (isWordChar(lineObj.text.charAt(ch))) sawWord = true;
- else if (sawWord) {if (dir < 0) {dir = 1; moveOnce();} break;}
- if (dir > 0) if (!moveOnce()) break;
- }
- }
- return {line: line, ch: ch};
- }
- function moveH(dir, unit) {
- var pos = dir < 0 ? sel.from : sel.to;
- if (shiftSelecting || posEq(sel.from, sel.to)) pos = findPosH(dir, unit);
- setCursor(pos.line, pos.ch, true);
- }
- function deleteH(dir, unit) {
- if (!posEq(sel.from, sel.to)) replaceRange("", sel.from, sel.to);
- else if (dir < 0) replaceRange("", findPosH(dir, unit), sel.to);
- else replaceRange("", sel.from, findPosH(dir, unit));
- userSelChange = true;
- }
- var goalColumn = null;
- function moveV(dir, unit) {
- var dist = 0, pos = localCoords(sel.inverted ? sel.from : sel.to, true);
- if (goalColumn != null) pos.x = goalColumn;
- if (unit == "page") dist = scroller.clientHeight;
- else if (unit == "line") dist = textHeight();
- var target = coordsChar(pos.x, pos.y + dist * dir + 2);
- setCursor(target.line, target.ch, true);
- goalColumn = pos.x;
- }
-
- function selectWordAt(pos) {
- var line = getLine(pos.line).text;
- var start = pos.ch, end = pos.ch;
- while (start > 0 && isWordChar(line.charAt(start - 1))) --start;
- while (end < line.length && isWordChar(line.charAt(end))) ++end;
- setSelectionUser({line: pos.line, ch: start}, {line: pos.line, ch: end});
- }
- function selectLine(line) {
- setSelectionUser({line: line, ch: 0}, {line: line, ch: getLine(line).text.length});
- }
- function indentSelected(mode) {
- if (posEq(sel.from, sel.to)) return indentLine(sel.from.line, mode);
- var e = sel.to.line - (sel.to.ch ? 0 : 1);
- for (var i = sel.from.line; i <= e; ++i) indentLine(i, mode);
- }
-
- function indentLine(n, how) {
- if (!how) how = "add";
- if (how == "smart") {
- if (!mode.indent) how = "prev";
- else var state = getStateBefore(n);
- }
-
- var line = getLine(n), curSpace = line.indentation(options.tabSize),
- curSpaceString = line.text.match(/^\s*/)[0], indentation;
- if (how == "prev") {
- if (n) indentation = getLine(n-1).indentation(options.tabSize);
- else indentation = 0;
- }
- else if (how == "smart") indentation = mode.indent(state, line.text.slice(curSpaceString.length), line.text);
- else if (how == "add") indentation = curSpace + options.indentUnit;
- else if (how == "subtract") indentation = curSpace - options.indentUnit;
- indentation = Math.max(0, indentation);
- var diff = indentation - curSpace;
-
- if (!diff) {
- if (sel.from.line != n && sel.to.line != n) return;
- var indentString = curSpaceString;
- }
- else {
- var indentString = "", pos = 0;
- if (options.indentWithTabs)
- for (var i = Math.floor(indentation / options.tabSize); i; --i) {pos += options.tabSize; indentString += "\t";}
- while (pos < indentation) {++pos; indentString += " ";}
- }
-
- replaceRange(indentString, {line: n, ch: 0}, {line: n, ch: curSpaceString.length});
- }
-
- function loadMode() {
- mode = CodeMirror.getMode(options, options.mode);
- doc.iter(0, doc.size, function(line) { line.stateAfter = null; });
- work = [0];
- startWorker();
- }
- function gutterChanged() {
- var visible = options.gutter || options.lineNumbers;
- gutter.style.display = visible ? "" : "none";
- if (visible) gutterDirty = true;
- else lineDiv.parentNode.style.marginLeft = 0;
- }
- function wrappingChanged(from, to) {
- if (options.lineWrapping) {
- wrapper.className += " CodeMirror-wrap";
- var perLine = scroller.clientWidth / charWidth() - 3;
- doc.iter(0, doc.size, function(line) {
- if (line.hidden) return;
- var guess = Math.ceil(line.text.length / perLine) || 1;
- if (guess != 1) updateLineHeight(line, guess);
- });
- lineSpace.style.width = code.style.width = "";
- } else {
- wrapper.className = wrapper.className.replace(" CodeMirror-wrap", "");
- maxWidth = null; maxLine = "";
- doc.iter(0, doc.size, function(line) {
- if (line.height != 1 && !line.hidden) updateLineHeight(line, 1);
- if (line.text.length > maxLine.length) maxLine = line.text;
- });
- }
- changes.push({from: 0, to: doc.size});
- }
- function computeTabText() {
- for (var str = '', i = 0; i < options.tabSize; ++i) str += " ";
- return str + " ";
- }
- function tabsChanged() {
- tabText = computeTabText();
- updateDisplay(true);
- }
- function themeChanged() {
- scroller.className = scroller.className.replace(/\s*cm-s-\w+/g, "") +
- options.theme.replace(/(^|\s)\s*/g, " cm-s-");
- }
-
- function TextMarker() { this.set = []; }
- TextMarker.prototype.clear = operation(function() {
- var min = Infinity, max = -Infinity;
- for (var i = 0, e = this.set.length; i < e; ++i) {
- var line = this.set[i], mk = line.marked;
- if (!mk || !line.parent) continue;
- var lineN = lineNo(line);
- min = Math.min(min, lineN); max = Math.max(max, lineN);
- for (var j = 0; j < mk.length; ++j)
- if (mk[j].set == this.set) mk.splice(j--, 1);
- }
- if (min != Infinity)
- changes.push({from: min, to: max + 1});
- });
- TextMarker.prototype.find = function() {
- var from, to;
- for (var i = 0, e = this.set.length; i < e; ++i) {
- var line = this.set[i], mk = line.marked;
- for (var j = 0; j < mk.length; ++j) {
- var mark = mk[j];
- if (mark.set == this.set) {
- if (mark.from != null || mark.to != null) {
- var found = lineNo(line);
- if (found != null) {
- if (mark.from != null) from = {line: found, ch: mark.from};
- if (mark.to != null) to = {line: found, ch: mark.to};
- }
- }
- }
- }
- }
- return {from: from, to: to};
- };
-
- function markText(from, to, className) {
- from = clipPos(from); to = clipPos(to);
- var tm = new TextMarker();
- function add(line, from, to, className) {
- getLine(line).addMark(new MarkedText(from, to, className, tm.set));
- }
- if (from.line == to.line) add(from.line, from.ch, to.ch, className);
- else {
- add(from.line, from.ch, null, className);
- for (var i = from.line + 1, e = to.line; i < e; ++i)
- add(i, null, null, className);
- add(to.line, null, to.ch, className);
- }
- changes.push({from: from.line, to: to.line + 1});
- return tm;
- }
-
- function setBookmark(pos) {
- pos = clipPos(pos);
- var bm = new Bookmark(pos.ch);
- getLine(pos.line).addMark(bm);
- return bm;
- }
-
- function addGutterMarker(line, text, className) {
- if (typeof line == "number") line = getLine(clipLine(line));
- line.gutterMarker = {text: text, style: className};
- gutterDirty = true;
- return line;
- }
- function removeGutterMarker(line) {
- if (typeof line == "number") line = getLine(clipLine(line));
- line.gutterMarker = null;
- gutterDirty = true;
- }
-
- function changeLine(handle, op) {
- var no = handle, line = handle;
- if (typeof handle == "number") line = getLine(clipLine(handle));
- else no = lineNo(handle);
- if (no == null) return null;
- if (op(line, no)) changes.push({from: no, to: no + 1});
- else return null;
- return line;
- }
- function setLineClass(handle, className) {
- return changeLine(handle, function(line) {
- if (line.className != className) {
- line.className = className;
- return true;
- }
- });
- }
- function setLineHidden(handle, hidden) {
- return changeLine(handle, function(line, no) {
- if (line.hidden != hidden) {
- line.hidden = hidden;
- updateLineHeight(line, hidden ? 0 : 1);
- if (hidden && (sel.from.line == no || sel.to.line == no))
- setSelection(skipHidden(sel.from, sel.from.line, sel.from.ch),
- skipHidden(sel.to, sel.to.line, sel.to.ch));
- return (gutterDirty = true);
- }
- });
- }
-
- function lineInfo(line) {
- if (typeof line == "number") {
- if (!isLine(line)) return null;
- var n = line;
- line = getLine(line);
- if (!line) return null;
- }
- else {
- var n = lineNo(line);
- if (n == null) return null;
- }
- var marker = line.gutterMarker;
- return {line: n, handle: line, text: line.text, markerText: marker && marker.text,
- markerClass: marker && marker.style, lineClass: line.className};
- }
-
- function stringWidth(str) {
- measure.innerHTML = "x ";
- measure.firstChild.firstChild.firstChild.nodeValue = str;
- return measure.firstChild.firstChild.offsetWidth || 10;
- }
- // These are used to go from pixel positions to character
- // positions, taking varying character widths into account.
- function charFromX(line, x) {
- if (x <= 0) return 0;
- var lineObj = getLine(line), text = lineObj.text;
- function getX(len) {
- measure.innerHTML = "" + lineObj.getHTML(null, null, false, tabText, len) + " ";
- return measure.firstChild.firstChild.offsetWidth;
- }
- var from = 0, fromX = 0, to = text.length, toX;
- // Guess a suitable upper bound for our search.
- var estimated = Math.min(to, Math.ceil(x / charWidth()));
- for (;;) {
- var estX = getX(estimated);
- if (estX <= x && estimated < to) estimated = Math.min(to, Math.ceil(estimated * 1.2));
- else {toX = estX; to = estimated; break;}
- }
- if (x > toX) return to;
- // Try to guess a suitable lower bound as well.
- estimated = Math.floor(to * 0.8); estX = getX(estimated);
- if (estX < x) {from = estimated; fromX = estX;}
- // Do a binary search between these bounds.
- for (;;) {
- if (to - from <= 1) return (toX - x > x - fromX) ? from : to;
- var middle = Math.ceil((from + to) / 2), middleX = getX(middle);
- if (middleX > x) {to = middle; toX = middleX;}
- else {from = middle; fromX = middleX;}
- }
- }
-
- var tempId = Math.floor(Math.random() * 0xffffff).toString(16);
- function measureLine(line, ch) {
- var extra = "";
- // Include extra text at the end to make sure the measured line is wrapped in the right way.
- if (options.lineWrapping) {
- var end = line.text.indexOf(" ", ch + 2);
- extra = htmlEscape(line.text.slice(ch + 1, end < 0 ? line.text.length : end + (ie ? 5 : 0)));
- }
- measure.innerHTML = "" + line.getHTML(null, null, false, tabText, ch) +
- '' + htmlEscape(line.text.charAt(ch) || " ") + " " +
- extra + " ";
- var elt = document.getElementById("CodeMirror-temp-" + tempId);
- var top = elt.offsetTop, left = elt.offsetLeft;
- // Older IEs report zero offsets for spans directly after a wrap
- if (ie && ch && top == 0 && left == 0) {
- var backup = document.createElement("span");
- backup.innerHTML = "x";
- elt.parentNode.insertBefore(backup, elt.nextSibling);
- top = backup.offsetTop;
- }
- return {top: top, left: left};
- }
- function localCoords(pos, inLineWrap) {
- var x, lh = textHeight(), y = lh * (heightAtLine(doc, pos.line) - (inLineWrap ? displayOffset : 0));
- if (pos.ch == 0) x = 0;
- else {
- var sp = measureLine(getLine(pos.line), pos.ch);
- x = sp.left;
- if (options.lineWrapping) y += Math.max(0, sp.top);
- }
- return {x: x, y: y, yBot: y + lh};
- }
- // Coords must be lineSpace-local
- function coordsChar(x, y) {
- if (y < 0) y = 0;
- var th = textHeight(), cw = charWidth(), heightPos = displayOffset + Math.floor(y / th);
- var lineNo = lineAtHeight(doc, heightPos);
- if (lineNo >= doc.size) return {line: doc.size - 1, ch: getLine(doc.size - 1).text.length};
- var lineObj = getLine(lineNo), text = lineObj.text;
- var tw = options.lineWrapping, innerOff = tw ? heightPos - heightAtLine(doc, lineNo) : 0;
- if (x <= 0 && innerOff == 0) return {line: lineNo, ch: 0};
- function getX(len) {
- var sp = measureLine(lineObj, len);
- if (tw) {
- var off = Math.round(sp.top / th);
- return Math.max(0, sp.left + (off - innerOff) * scroller.clientWidth);
- }
- return sp.left;
- }
- var from = 0, fromX = 0, to = text.length, toX;
- // Guess a suitable upper bound for our search.
- var estimated = Math.min(to, Math.ceil((x + innerOff * scroller.clientWidth * .9) / cw));
- for (;;) {
- var estX = getX(estimated);
- if (estX <= x && estimated < to) estimated = Math.min(to, Math.ceil(estimated * 1.2));
- else {toX = estX; to = estimated; break;}
- }
- if (x > toX) return {line: lineNo, ch: to};
- // Try to guess a suitable lower bound as well.
- estimated = Math.floor(to * 0.8); estX = getX(estimated);
- if (estX < x) {from = estimated; fromX = estX;}
- // Do a binary search between these bounds.
- for (;;) {
- if (to - from <= 1) return {line: lineNo, ch: (toX - x > x - fromX) ? from : to};
- var middle = Math.ceil((from + to) / 2), middleX = getX(middle);
- if (middleX > x) {to = middle; toX = middleX;}
- else {from = middle; fromX = middleX;}
- }
- }
- function pageCoords(pos) {
- var local = localCoords(pos, true), off = eltOffset(lineSpace);
- return {x: off.left + local.x, y: off.top + local.y, yBot: off.top + local.yBot};
- }
-
- var cachedHeight, cachedHeightFor, measureText;
- function textHeight() {
- if (measureText == null) {
- measureText = "";
- for (var i = 0; i < 49; ++i) measureText += "x ";
- measureText += "x ";
- }
- var offsetHeight = lineDiv.clientHeight;
- if (offsetHeight == cachedHeightFor) return cachedHeight;
- cachedHeightFor = offsetHeight;
- measure.innerHTML = measureText;
- cachedHeight = measure.firstChild.offsetHeight / 50 || 1;
- measure.innerHTML = "";
- return cachedHeight;
- }
- var cachedWidth, cachedWidthFor = 0;
- function charWidth() {
- if (scroller.clientWidth == cachedWidthFor) return cachedWidth;
- cachedWidthFor = scroller.clientWidth;
- return (cachedWidth = stringWidth("x"));
- }
- function paddingTop() {return lineSpace.offsetTop;}
- function paddingLeft() {return lineSpace.offsetLeft;}
-
- function posFromMouse(e, liberal) {
- var offW = eltOffset(scroller, true), x, y;
- // Fails unpredictably on IE[67] when mouse is dragged around quickly.
- try { x = e.clientX; y = e.clientY; } catch (e) { return null; }
- // This is a mess of a heuristic to try and determine whether a
- // scroll-bar was clicked or not, and to return null if one was
- // (and !liberal).
- if (!liberal && (x - offW.left > scroller.clientWidth || y - offW.top > scroller.clientHeight))
- return null;
- var offL = eltOffset(lineSpace, true);
- return coordsChar(x - offL.left, y - offL.top);
- }
- function onContextMenu(e) {
- var pos = posFromMouse(e);
- if (!pos || window.opera) return; // Opera is difficult.
- if (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to))
- operation(setCursor)(pos.line, pos.ch);
-
- var oldCSS = input.style.cssText;
- inputDiv.style.position = "absolute";
- input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) +
- "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: white; " +
- "border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";
- leaveInputAlone = true;
- var val = input.value = getSelection();
- focusInput();
- input.select();
- function rehide() {
- var newVal = splitLines(input.value).join("\n");
- if (newVal != val) operation(replaceSelection)(newVal, "end");
- inputDiv.style.position = "relative";
- input.style.cssText = oldCSS;
- leaveInputAlone = false;
- resetInput(true);
- slowPoll();
- }
-
- if (gecko) {
- e_stop(e);
- var mouseup = connect(window, "mouseup", function() {
- mouseup();
- setTimeout(rehide, 20);
- }, true);
- }
- else {
- setTimeout(rehide, 50);
- }
- }
-
- // Cursor-blinking
- function restartBlink() {
- clearInterval(blinker);
- var on = true;
- cursor.style.visibility = "";
- blinker = setInterval(function() {
- cursor.style.visibility = (on = !on) ? "" : "hidden";
- }, 650);
- }
-
- var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"};
- function matchBrackets(autoclear) {
- var head = sel.inverted ? sel.from : sel.to, line = getLine(head.line), pos = head.ch - 1;
- var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];
- if (!match) return;
- var ch = match.charAt(0), forward = match.charAt(1) == ">", d = forward ? 1 : -1, st = line.styles;
- for (var off = pos + 1, i = 0, e = st.length; i < e; i+=2)
- if ((off -= st[i].length) <= 0) {var style = st[i+1]; break;}
-
- var stack = [line.text.charAt(pos)], re = /[(){}[\]]/;
- function scan(line, from, to) {
- if (!line.text) return;
- var st = line.styles, pos = forward ? 0 : line.text.length - 1, cur;
- for (var i = forward ? 0 : st.length - 2, e = forward ? st.length : -2; i != e; i += 2*d) {
- var text = st[i];
- if (st[i+1] != null && st[i+1] != style) {pos += d * text.length; continue;}
- for (var j = forward ? 0 : text.length - 1, te = forward ? text.length : -1; j != te; j += d, pos+=d) {
- if (pos >= from && pos < to && re.test(cur = text.charAt(j))) {
- var match = matching[cur];
- if (match.charAt(1) == ">" == forward) stack.push(cur);
- else if (stack.pop() != match.charAt(0)) return {pos: pos, match: false};
- else if (!stack.length) return {pos: pos, match: true};
- }
- }
- }
- }
- for (var i = head.line, e = forward ? Math.min(i + 100, doc.size) : Math.max(-1, i - 100); i != e; i+=d) {
- var line = getLine(i), first = i == head.line;
- var found = scan(line, first && forward ? pos + 1 : 0, first && !forward ? pos : line.text.length);
- if (found) break;
- }
- if (!found) found = {pos: null, match: false};
- var style = found.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
- var one = markText({line: head.line, ch: pos}, {line: head.line, ch: pos+1}, style),
- two = found.pos != null && markText({line: i, ch: found.pos}, {line: i, ch: found.pos + 1}, style);
- var clear = operation(function(){one.clear(); two && two.clear();});
- if (autoclear) setTimeout(clear, 800);
- else bracketHighlighted = clear;
- }
-
- // Finds the line to start with when starting a parse. Tries to
- // find a line with a stateAfter, so that it can start with a
- // valid state. If that fails, it returns the line with the
- // smallest indentation, which tends to need the least context to
- // parse correctly.
- function findStartLine(n) {
- var minindent, minline;
- for (var search = n, lim = n - 40; search > lim; --search) {
- if (search == 0) return 0;
- var line = getLine(search-1);
- if (line.stateAfter) return search;
- var indented = line.indentation(options.tabSize);
- if (minline == null || minindent > indented) {
- minline = search - 1;
- minindent = indented;
- }
- }
- return minline;
- }
- function getStateBefore(n) {
- var start = findStartLine(n), state = start && getLine(start-1).stateAfter;
- if (!state) state = startState(mode);
- else state = copyState(mode, state);
- doc.iter(start, n, function(line) {
- line.highlight(mode, state, options.tabSize);
- line.stateAfter = copyState(mode, state);
- });
- if (start < n) changes.push({from: start, to: n});
- if (n < doc.size && !getLine(n).stateAfter) work.push(n);
- return state;
- }
- function highlightLines(start, end) {
- var state = getStateBefore(start);
- doc.iter(start, end, function(line) {
- line.highlight(mode, state, options.tabSize);
- line.stateAfter = copyState(mode, state);
- });
- }
- function highlightWorker() {
- var end = +new Date + options.workTime;
- var foundWork = work.length;
- while (work.length) {
- if (!getLine(showingFrom).stateAfter) var task = showingFrom;
- else var task = work.pop();
- if (task >= doc.size) continue;
- var start = findStartLine(task), state = start && getLine(start-1).stateAfter;
- if (state) state = copyState(mode, state);
- else state = startState(mode);
-
- var unchanged = 0, compare = mode.compareStates, realChange = false,
- i = start, bail = false;
- doc.iter(i, doc.size, function(line) {
- var hadState = line.stateAfter;
- if (+new Date > end) {
- work.push(i);
- startWorker(options.workDelay);
- if (realChange) changes.push({from: task, to: i + 1});
- return (bail = true);
- }
- var changed = line.highlight(mode, state, options.tabSize);
- if (changed) realChange = true;
- line.stateAfter = copyState(mode, state);
- if (compare) {
- if (hadState && compare(hadState, state)) return true;
- } else {
- if (changed !== false || !hadState) unchanged = 0;
- else if (++unchanged > 3 && (!mode.indent || mode.indent(hadState, "") == mode.indent(state, "")))
- return true;
- }
- ++i;
- });
- if (bail) return;
- if (realChange) changes.push({from: task, to: i + 1});
- }
- if (foundWork && options.onHighlightComplete)
- options.onHighlightComplete(instance);
- }
- function startWorker(time) {
- if (!work.length) return;
- highlight.set(time, operation(highlightWorker));
- }
-
- // Operations are used to wrap changes in such a way that each
- // change won't have to update the cursor and display (which would
- // be awkward, slow, and error-prone), but instead updates are
- // batched and then all combined and executed at once.
- function startOperation() {
- updateInput = userSelChange = textChanged = null;
- changes = []; selectionChanged = false; callbacks = [];
- }
- function endOperation() {
- var reScroll = false, updated;
- if (selectionChanged) reScroll = !scrollCursorIntoView();
- if (changes.length) updated = updateDisplay(changes, true);
- else {
- if (selectionChanged) updateCursor();
- if (gutterDirty) updateGutter();
- }
- if (reScroll) scrollCursorIntoView();
- if (selectionChanged) {scrollEditorIntoView(); restartBlink();}
-
- if (focused && !leaveInputAlone &&
- (updateInput === true || (updateInput !== false && selectionChanged)))
- resetInput(userSelChange);
-
- if (selectionChanged && options.matchBrackets)
- setTimeout(operation(function() {
- if (bracketHighlighted) {bracketHighlighted(); bracketHighlighted = null;}
- if (posEq(sel.from, sel.to)) matchBrackets(false);
- }), 20);
- var tc = textChanged, cbs = callbacks; // these can be reset by callbacks
- if (selectionChanged && options.onCursorActivity)
- options.onCursorActivity(instance);
- if (tc && options.onChange && instance)
- options.onChange(instance, tc);
- for (var i = 0; i < cbs.length; ++i) cbs[i](instance);
- if (updated && options.onUpdate) options.onUpdate(instance);
- }
- var nestedOperation = 0;
- function operation(f) {
- return function() {
- if (!nestedOperation++) startOperation();
- try {var result = f.apply(this, arguments);}
- finally {if (!--nestedOperation) endOperation();}
- return result;
- };
- }
-
- for (var ext in extensions)
- if (extensions.propertyIsEnumerable(ext) &&
- !instance.propertyIsEnumerable(ext))
- instance[ext] = extensions[ext];
- return instance;
- } // (end of function CodeMirror)
-
- // The default configuration options.
- CodeMirror.defaults = {
- value: "",
- mode: null,
- theme: "default",
- indentUnit: 2,
- indentWithTabs: false,
- tabSize: 4,
- keyMap: "default",
- extraKeys: null,
- electricChars: true,
- onKeyEvent: null,
- lineWrapping: false,
- lineNumbers: false,
- gutter: false,
- fixedGutter: false,
- firstLineNumber: 1,
- readOnly: false,
- onChange: null,
- onCursorActivity: null,
- onGutterClick: null,
- onHighlightComplete: null,
- onUpdate: null,
- onFocus: null, onBlur: null, onScroll: null,
- matchBrackets: false,
- workTime: 100,
- workDelay: 200,
- pollInterval: 100,
- undoDepth: 40,
- tabindex: null,
- document: window.document
- };
-
- var mac = /Mac/.test(navigator.platform);
- var win = /Win/.test(navigator.platform);
-
- // Known modes, by name and by MIME
- var modes = {}, mimeModes = {};
- CodeMirror.defineMode = function(name, mode) {
- if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name;
- modes[name] = mode;
- };
- CodeMirror.defineMIME = function(mime, spec) {
- mimeModes[mime] = spec;
- };
- CodeMirror.getMode = function(options, spec) {
- if (typeof spec == "string" && mimeModes.hasOwnProperty(spec))
- spec = mimeModes[spec];
- if (typeof spec == "string")
- var mname = spec, config = {};
- else if (spec != null)
- var mname = spec.name, config = spec;
- var mfactory = modes[mname];
- if (!mfactory) {
- if (window.console) console.warn("No mode " + mname + " found, falling back to plain text.");
- return CodeMirror.getMode(options, "text/plain");
- }
- return mfactory(options, config || {});
- };
- CodeMirror.listModes = function() {
- var list = [];
- for (var m in modes)
- if (modes.propertyIsEnumerable(m)) list.push(m);
- return list;
- };
- CodeMirror.listMIMEs = function() {
- var list = [];
- for (var m in mimeModes)
- if (mimeModes.propertyIsEnumerable(m)) list.push({mime: m, mode: mimeModes[m]});
- return list;
- };
-
- var extensions = CodeMirror.extensions = {};
- CodeMirror.defineExtension = function(name, func) {
- extensions[name] = func;
- };
-
- var commands = CodeMirror.commands = {
- selectAll: function(cm) {cm.setSelection({line: 0, ch: 0}, {line: cm.lineCount() - 1});},
- killLine: function(cm) {
- var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to);
- if (!sel && cm.getLine(from.line).length == from.ch) cm.replaceRange("", from, {line: from.line + 1, ch: 0});
- else cm.replaceRange("", from, sel ? to : {line: from.line});
- },
- deleteLine: function(cm) {var l = cm.getCursor().line; cm.replaceRange("", {line: l, ch: 0}, {line: l});},
- undo: function(cm) {cm.undo();},
- redo: function(cm) {cm.redo();},
- goDocStart: function(cm) {cm.setCursor(0, 0, true);},
- goDocEnd: function(cm) {cm.setSelection({line: cm.lineCount() - 1}, null, true);},
- goLineStart: function(cm) {cm.setCursor(cm.getCursor().line, 0, true);},
- goLineStartSmart: function(cm) {
- var cur = cm.getCursor();
- var text = cm.getLine(cur.line), firstNonWS = Math.max(0, text.search(/\S/));
- cm.setCursor(cur.line, cur.ch <= firstNonWS && cur.ch ? 0 : firstNonWS, true);
- },
- goLineEnd: function(cm) {cm.setSelection({line: cm.getCursor().line}, null, true);},
- goLineUp: function(cm) {cm.moveV(-1, "line");},
- goLineDown: function(cm) {cm.moveV(1, "line");},
- goPageUp: function(cm) {cm.moveV(-1, "page");},
- goPageDown: function(cm) {cm.moveV(1, "page");},
- goCharLeft: function(cm) {cm.moveH(-1, "char");},
- goCharRight: function(cm) {cm.moveH(1, "char");},
- goColumnLeft: function(cm) {cm.moveH(-1, "column");},
- goColumnRight: function(cm) {cm.moveH(1, "column");},
- goWordLeft: function(cm) {cm.moveH(-1, "word");},
- goWordRight: function(cm) {cm.moveH(1, "word");},
- delCharLeft: function(cm) {cm.deleteH(-1, "char");},
- delCharRight: function(cm) {cm.deleteH(1, "char");},
- delWordLeft: function(cm) {cm.deleteH(-1, "word");},
- delWordRight: function(cm) {cm.deleteH(1, "word");},
- indentAuto: function(cm) {cm.indentSelection("smart");},
- indentMore: function(cm) {cm.indentSelection("add");},
- indentLess: function(cm) {cm.indentSelection("subtract");},
- insertTab: function(cm) {cm.replaceSelection("\t", "end");},
- transposeChars: function(cm) {
- var cur = cm.getCursor(), line = cm.getLine(cur.line);
- if (cur.ch > 0 && cur.ch < line.length - 1)
- cm.replaceRange(line.charAt(cur.ch) + line.charAt(cur.ch - 1),
- {line: cur.line, ch: cur.ch - 1}, {line: cur.line, ch: cur.ch + 1});
- },
- newlineAndIndent: function(cm) {
- cm.replaceSelection("\n", "end");
- cm.indentLine(cm.getCursor().line);
- },
- toggleOverwrite: function(cm) {cm.toggleOverwrite();}
- };
-
- var keyMap = CodeMirror.keyMap = {};
- keyMap.basic = {
- "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",
- "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",
- "Delete": "delCharRight", "Backspace": "delCharLeft", "Tab": "indentMore", "Shift-Tab": "indentLess",
- "Enter": "newlineAndIndent", "Insert": "toggleOverwrite"
- };
- // Note that the save and find-related commands aren't defined by
- // default. Unknown commands are simply ignored.
- keyMap.pcDefault = {
- "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
- "Ctrl-Home": "goDocStart", "Alt-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd",
- "Ctrl-Left": "goWordLeft", "Ctrl-Right": "goWordRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
- "Ctrl-Backspace": "delWordLeft", "Ctrl-Delete": "delWordRight", "Ctrl-S": "save", "Ctrl-F": "find",
- "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
- fallthrough: "basic"
- };
- keyMap.macDefault = {
- "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
- "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goWordLeft",
- "Alt-Right": "goWordRight", "Cmd-Left": "goLineStart", "Cmd-Right": "goLineEnd", "Alt-Backspace": "delWordLeft",
- "Ctrl-Alt-Backspace": "delWordRight", "Alt-Delete": "delWordRight", "Cmd-S": "save", "Cmd-F": "find",
- "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
- fallthrough: ["basic", "emacsy"]
- };
- keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;
- keyMap.emacsy = {
- "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
- "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
- "Ctrl-V": "goPageUp", "Shift-Ctrl-V": "goPageDown", "Ctrl-D": "delCharRight", "Ctrl-H": "delCharLeft",
- "Alt-D": "delWordRight", "Alt-Backspace": "delWordLeft", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars"
- };
-
- function lookupKey(name, extraMap, map) {
- function lookup(name, map, ft) {
- var found = map[name];
- if (found != null) return found;
- if (ft == null) ft = map.fallthrough;
- if (ft == null) return map.catchall;
- if (typeof ft == "string") return lookup(name, keyMap[ft]);
- for (var i = 0, e = ft.length; i < e; ++i) {
- found = lookup(name, keyMap[ft[i]]);
- if (found != null) return found;
- }
- return null;
- }
- return extraMap ? lookup(name, extraMap, map) : lookup(name, keyMap[map]);
- }
- function isModifierKey(event) {
- var name = keyNames[event.keyCode];
- return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod";
- }
-
- CodeMirror.fromTextArea = function(textarea, options) {
- if (!options) options = {};
- options.value = textarea.value;
- if (!options.tabindex && textarea.tabindex)
- options.tabindex = textarea.tabindex;
-
- function save() {textarea.value = instance.getValue();}
- if (textarea.form) {
- // Deplorable hack to make the submit method do the right thing.
- var rmSubmit = connect(textarea.form, "submit", save, true);
- if (typeof textarea.form.submit == "function") {
- var realSubmit = textarea.form.submit;
- function wrappedSubmit() {
- save();
- textarea.form.submit = realSubmit;
- textarea.form.submit();
- textarea.form.submit = wrappedSubmit;
- }
- textarea.form.submit = wrappedSubmit;
- }
- }
-
- textarea.style.display = "none";
- var instance = CodeMirror(function(node) {
- textarea.parentNode.insertBefore(node, textarea.nextSibling);
- }, options);
- instance.save = save;
- instance.getTextArea = function() { return textarea; };
- instance.toTextArea = function() {
- save();
- textarea.parentNode.removeChild(instance.getWrapperElement());
- textarea.style.display = "";
- if (textarea.form) {
- rmSubmit();
- if (typeof textarea.form.submit == "function")
- textarea.form.submit = realSubmit;
- }
- };
- return instance;
- };
-
- // Utility functions for working with state. Exported because modes
- // sometimes need to do this.
- function copyState(mode, state) {
- if (state === true) return state;
- if (mode.copyState) return mode.copyState(state);
- var nstate = {};
- for (var n in state) {
- var val = state[n];
- if (val instanceof Array) val = val.concat([]);
- nstate[n] = val;
- }
- return nstate;
- }
- CodeMirror.copyState = copyState;
- function startState(mode, a1, a2) {
- return mode.startState ? mode.startState(a1, a2) : true;
- }
- CodeMirror.startState = startState;
-
- // The character stream used by a mode's parser.
- function StringStream(string, tabSize) {
- this.pos = this.start = 0;
- this.string = string;
- this.tabSize = tabSize || 8;
- }
- StringStream.prototype = {
- eol: function() {return this.pos >= this.string.length;},
- sol: function() {return this.pos == 0;},
- peek: function() {return this.string.charAt(this.pos);},
- next: function() {
- if (this.pos < this.string.length)
- return this.string.charAt(this.pos++);
- },
- eat: function(match) {
- var ch = this.string.charAt(this.pos);
- if (typeof match == "string") var ok = ch == match;
- else var ok = ch && (match.test ? match.test(ch) : match(ch));
- if (ok) {++this.pos; return ch;}
- },
- eatWhile: function(match) {
- var start = this.pos;
- while (this.eat(match)){}
- return this.pos > start;
- },
- eatSpace: function() {
- var start = this.pos;
- while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;
- return this.pos > start;
- },
- skipToEnd: function() {this.pos = this.string.length;},
- skipTo: function(ch) {
- var found = this.string.indexOf(ch, this.pos);
- if (found > -1) {this.pos = found; return true;}
- },
- backUp: function(n) {this.pos -= n;},
- column: function() {return countColumn(this.string, this.start, this.tabSize);},
- indentation: function() {return countColumn(this.string, null, this.tabSize);},
- match: function(pattern, consume, caseInsensitive) {
- if (typeof pattern == "string") {
- function cased(str) {return caseInsensitive ? str.toLowerCase() : str;}
- if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {
- if (consume !== false) this.pos += pattern.length;
- return true;
- }
- }
- else {
- var match = this.string.slice(this.pos).match(pattern);
- if (match && consume !== false) this.pos += match[0].length;
- return match;
- }
- },
- current: function(){return this.string.slice(this.start, this.pos);}
- };
- CodeMirror.StringStream = StringStream;
-
- function MarkedText(from, to, className, set) {
- this.from = from; this.to = to; this.style = className; this.set = set;
- }
- MarkedText.prototype = {
- attach: function(line) { this.set.push(line); },
- detach: function(line) {
- var ix = indexOf(this.set, line);
- if (ix > -1) this.set.splice(ix, 1);
- },
- split: function(pos, lenBefore) {
- if (this.to <= pos && this.to != null) return null;
- var from = this.from < pos || this.from == null ? null : this.from - pos + lenBefore;
- var to = this.to == null ? null : this.to - pos + lenBefore;
- return new MarkedText(from, to, this.style, this.set);
- },
- dup: function() { return new MarkedText(null, null, this.style, this.set); },
- clipTo: function(fromOpen, from, toOpen, to, diff) {
- if (this.from != null && this.from >= from)
- this.from = Math.max(to, this.from) + diff;
- if (this.to != null && this.to > from)
- this.to = to < this.to ? this.to + diff : from;
- if (fromOpen && to > this.from && (to < this.to || this.to == null))
- this.from = null;
- if (toOpen && (from < this.to || this.to == null) && (from > this.from || this.from == null))
- this.to = null;
- },
- isDead: function() { return this.from != null && this.to != null && this.from >= this.to; },
- sameSet: function(x) { return this.set == x.set; }
- };
-
- function Bookmark(pos) {
- this.from = pos; this.to = pos; this.line = null;
- }
- Bookmark.prototype = {
- attach: function(line) { this.line = line; },
- detach: function(line) { if (this.line == line) this.line = null; },
- split: function(pos, lenBefore) {
- if (pos < this.from) {
- this.from = this.to = (this.from - pos) + lenBefore;
- return this;
- }
- },
- isDead: function() { return this.from > this.to; },
- clipTo: function(fromOpen, from, toOpen, to, diff) {
- if ((fromOpen || from < this.from) && (toOpen || to > this.to)) {
- this.from = 0; this.to = -1;
- } else if (this.from > from) {
- this.from = this.to = Math.max(to, this.from) + diff;
- }
- },
- sameSet: function(x) { return false; },
- find: function() {
- if (!this.line || !this.line.parent) return null;
- return {line: lineNo(this.line), ch: this.from};
- },
- clear: function() {
- if (this.line) {
- var found = indexOf(this.line.marked, this);
- if (found != -1) this.line.marked.splice(found, 1);
- this.line = null;
- }
- }
- };
-
- // Line objects. These hold state related to a line, including
- // highlighting info (the styles array).
- function Line(text, styles) {
- this.styles = styles || [text, null];
- this.text = text;
- this.height = 1;
- this.marked = this.gutterMarker = this.className = this.handlers = null;
- this.stateAfter = this.parent = this.hidden = null;
- }
- Line.inheritMarks = function(text, orig) {
- var ln = new Line(text), mk = orig && orig.marked;
- if (mk) {
- for (var i = 0; i < mk.length; ++i) {
- if (mk[i].to == null && mk[i].style) {
- var newmk = ln.marked || (ln.marked = []), mark = mk[i];
- var nmark = mark.dup(); newmk.push(nmark); nmark.attach(ln);
- }
- }
- }
- return ln;
- }
- Line.prototype = {
- // Replace a piece of a line, keeping the styles around it intact.
- replace: function(from, to_, text) {
- var st = [], mk = this.marked, to = to_ == null ? this.text.length : to_;
- copyStyles(0, from, this.styles, st);
- if (text) st.push(text, null);
- copyStyles(to, this.text.length, this.styles, st);
- this.styles = st;
- this.text = this.text.slice(0, from) + text + this.text.slice(to);
- this.stateAfter = null;
- if (mk) {
- var diff = text.length - (to - from);
- for (var i = 0, mark = mk[i]; i < mk.length; ++i) {
- mark.clipTo(from == null, from || 0, to_ == null, to, diff);
- if (mark.isDead()) {mark.detach(this); mk.splice(i--, 1);}
- }
- }
- },
- // Split a part off a line, keeping styles and markers intact.
- split: function(pos, textBefore) {
- var st = [textBefore, null], mk = this.marked;
- copyStyles(pos, this.text.length, this.styles, st);
- var taken = new Line(textBefore + this.text.slice(pos), st);
- if (mk) {
- for (var i = 0; i < mk.length; ++i) {
- var mark = mk[i];
- var newmark = mark.split(pos, textBefore.length);
- if (newmark) {
- if (!taken.marked) taken.marked = [];
- taken.marked.push(newmark); newmark.attach(taken);
- }
- }
- }
- return taken;
- },
- append: function(line) {
- var mylen = this.text.length, mk = line.marked, mymk = this.marked;
- this.text += line.text;
- copyStyles(0, line.text.length, line.styles, this.styles);
- if (mymk) {
- for (var i = 0; i < mymk.length; ++i)
- if (mymk[i].to == null) mymk[i].to = mylen;
- }
- if (mk && mk.length) {
- if (!mymk) this.marked = mymk = [];
- outer: for (var i = 0; i < mk.length; ++i) {
- var mark = mk[i];
- if (!mark.from) {
- for (var j = 0; j < mymk.length; ++j) {
- var mymark = mymk[j];
- if (mymark.to == mylen && mymark.sameSet(mark)) {
- mymark.to = mark.to == null ? null : mark.to + mylen;
- if (mymark.isDead()) {
- mymark.detach(this);
- mk.splice(i--, 1);
- }
- continue outer;
- }
- }
- }
- mymk.push(mark);
- mark.attach(this);
- mark.from += mylen;
- if (mark.to != null) mark.to += mylen;
- }
- }
- },
- fixMarkEnds: function(other) {
- var mk = this.marked, omk = other.marked;
- if (!mk) return;
- for (var i = 0; i < mk.length; ++i) {
- var mark = mk[i], close = mark.to == null;
- if (close && omk) {
- for (var j = 0; j < omk.length; ++j)
- if (omk[j].sameSet(mark)) {close = false; break;}
- }
- if (close) mark.to = this.text.length;
- }
- },
- fixMarkStarts: function() {
- var mk = this.marked;
- if (!mk) return;
- for (var i = 0; i < mk.length; ++i)
- if (mk[i].from == null) mk[i].from = 0;
- },
- addMark: function(mark) {
- mark.attach(this);
- if (this.marked == null) this.marked = [];
- this.marked.push(mark);
- this.marked.sort(function(a, b){return (a.from || 0) - (b.from || 0);});
- },
- // Run the given mode's parser over a line, update the styles
- // array, which contains alternating fragments of text and CSS
- // classes.
- highlight: function(mode, state, tabSize) {
- var stream = new StringStream(this.text, tabSize), st = this.styles, pos = 0;
- var changed = false, curWord = st[0], prevWord;
- if (this.text == "" && mode.blankLine) mode.blankLine(state);
- while (!stream.eol()) {
- var style = mode.token(stream, state);
- var substr = this.text.slice(stream.start, stream.pos);
- stream.start = stream.pos;
- if (pos && st[pos-1] == style)
- st[pos-2] += substr;
- else if (substr) {
- if (!changed && (st[pos+1] != style || (pos && st[pos-2] != prevWord))) changed = true;
- st[pos++] = substr; st[pos++] = style;
- prevWord = curWord; curWord = st[pos];
- }
- // Give up when line is ridiculously long
- if (stream.pos > 5000) {
- st[pos++] = this.text.slice(stream.pos); st[pos++] = null;
- break;
- }
- }
- if (st.length != pos) {st.length = pos; changed = true;}
- if (pos && st[pos-2] != prevWord) changed = true;
- // Short lines with simple highlights return null, and are
- // counted as changed by the driver because they are likely to
- // highlight the same way in various contexts.
- return changed || (st.length < 5 && this.text.length < 10 ? null : false);
- },
- // Fetch the parser token for a given character. Useful for hacks
- // that want to inspect the mode state (say, for completion).
- getTokenAt: function(mode, state, ch) {
- var txt = this.text, stream = new StringStream(txt);
- while (stream.pos < ch && !stream.eol()) {
- stream.start = stream.pos;
- var style = mode.token(stream, state);
- }
- return {start: stream.start,
- end: stream.pos,
- string: stream.current(),
- className: style || null,
- state: state};
- },
- indentation: function(tabSize) {return countColumn(this.text, null, tabSize);},
- // Produces an HTML fragment for the line, taking selection,
- // marking, and highlighting into account.
- getHTML: function(sfrom, sto, includePre, tabText, endAt) {
- var html = [], first = true;
- if (includePre)
- html.push(this.className ? '': "");
- function span(text, style) {
- if (!text) return;
- // Work around a bug where, in some compat modes, IE ignores leading spaces
- if (first && ie && text.charAt(0) == " ") text = "\u00a0" + text.slice(1);
- first = false;
- if (style) html.push('', htmlEscape(text).replace(/\t/g, tabText), " ");
- else html.push(htmlEscape(text).replace(/\t/g, tabText));
- }
- var st = this.styles, allText = this.text, marked = this.marked;
- if (sfrom == sto) sfrom = null;
- var len = allText.length;
- if (endAt != null) len = Math.min(endAt, len);
-
- if (!allText && endAt == null)
- span(" ", sfrom != null && sto == null ? "CodeMirror-selected" : null);
- else if (!marked && sfrom == null)
- for (var i = 0, ch = 0; ch < len; i+=2) {
- var str = st[i], style = st[i+1], l = str.length;
- if (ch + l > len) str = str.slice(0, len - ch);
- ch += l;
- span(str, style && "cm-" + style);
- }
- else {
- var pos = 0, i = 0, text = "", style, sg = 0;
- var markpos = -1, mark = null;
- function nextMark() {
- if (marked) {
- markpos += 1;
- mark = (markpos < marked.length) ? marked[markpos] : null;
- }
- }
- nextMark();
- while (pos < len) {
- var upto = len;
- var extraStyle = "";
- if (sfrom != null) {
- if (sfrom > pos) upto = sfrom;
- else if (sto == null || sto > pos) {
- extraStyle = " CodeMirror-selected";
- if (sto != null) upto = Math.min(upto, sto);
- }
- }
- while (mark && mark.to != null && mark.to <= pos) nextMark();
- if (mark) {
- if (mark.from > pos) upto = Math.min(upto, mark.from);
- else {
- extraStyle += " " + mark.style;
- if (mark.to != null) upto = Math.min(upto, mark.to);
- }
- }
- for (;;) {
- var end = pos + text.length;
- var appliedStyle = style;
- if (extraStyle) appliedStyle = style ? style + extraStyle : extraStyle;
- span(end > upto ? text.slice(0, upto - pos) : text, appliedStyle);
- if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}
- pos = end;
- text = st[i++]; style = "cm-" + st[i++];
- }
- }
- if (sfrom != null && sto == null) span(" ", "CodeMirror-selected");
- }
- if (includePre) html.push(" ");
- return html.join("");
- },
- cleanUp: function() {
- this.parent = null;
- if (this.marked)
- for (var i = 0, e = this.marked.length; i < e; ++i) this.marked[i].detach(this);
- }
- };
- // Utility used by replace and split above
- function copyStyles(from, to, source, dest) {
- for (var i = 0, pos = 0, state = 0; pos < to; i+=2) {
- var part = source[i], end = pos + part.length;
- if (state == 0) {
- if (end > from) dest.push(part.slice(from - pos, Math.min(part.length, to - pos)), source[i+1]);
- if (end >= from) state = 1;
- }
- else if (state == 1) {
- if (end > to) dest.push(part.slice(0, to - pos), source[i+1]);
- else dest.push(part, source[i+1]);
- }
- pos = end;
- }
- }
-
- // Data structure that holds the sequence of lines.
- function LeafChunk(lines) {
- this.lines = lines;
- this.parent = null;
- for (var i = 0, e = lines.length, height = 0; i < e; ++i) {
- lines[i].parent = this;
- height += lines[i].height;
- }
- this.height = height;
- }
- LeafChunk.prototype = {
- chunkSize: function() { return this.lines.length; },
- remove: function(at, n, callbacks) {
- for (var i = at, e = at + n; i < e; ++i) {
- var line = this.lines[i];
- this.height -= line.height;
- line.cleanUp();
- if (line.handlers)
- for (var j = 0; j < line.handlers.length; ++j) callbacks.push(line.handlers[j]);
- }
- this.lines.splice(at, n);
- },
- collapse: function(lines) {
- lines.splice.apply(lines, [lines.length, 0].concat(this.lines));
- },
- insertHeight: function(at, lines, height) {
- this.height += height;
- this.lines.splice.apply(this.lines, [at, 0].concat(lines));
- for (var i = 0, e = lines.length; i < e; ++i) lines[i].parent = this;
- },
- iterN: function(at, n, op) {
- for (var e = at + n; at < e; ++at)
- if (op(this.lines[at])) return true;
- }
- };
- function BranchChunk(children) {
- this.children = children;
- var size = 0, height = 0;
- for (var i = 0, e = children.length; i < e; ++i) {
- var ch = children[i];
- size += ch.chunkSize(); height += ch.height;
- ch.parent = this;
- }
- this.size = size;
- this.height = height;
- this.parent = null;
- }
- BranchChunk.prototype = {
- chunkSize: function() { return this.size; },
- remove: function(at, n, callbacks) {
- this.size -= n;
- for (var i = 0; i < this.children.length; ++i) {
- var child = this.children[i], sz = child.chunkSize();
- if (at < sz) {
- var rm = Math.min(n, sz - at), oldHeight = child.height;
- child.remove(at, rm, callbacks);
- this.height -= oldHeight - child.height;
- if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }
- if ((n -= rm) == 0) break;
- at = 0;
- } else at -= sz;
- }
- if (this.size - n < 25) {
- var lines = [];
- this.collapse(lines);
- this.children = [new LeafChunk(lines)];
- }
- },
- collapse: function(lines) {
- for (var i = 0, e = this.children.length; i < e; ++i) this.children[i].collapse(lines);
- },
- insert: function(at, lines) {
- var height = 0;
- for (var i = 0, e = lines.length; i < e; ++i) height += lines[i].height;
- this.insertHeight(at, lines, height);
- },
- insertHeight: function(at, lines, height) {
- this.size += lines.length;
- this.height += height;
- for (var i = 0, e = this.children.length; i < e; ++i) {
- var child = this.children[i], sz = child.chunkSize();
- if (at <= sz) {
- child.insertHeight(at, lines, height);
- if (child.lines && child.lines.length > 50) {
- while (child.lines.length > 50) {
- var spilled = child.lines.splice(child.lines.length - 25, 25);
- var newleaf = new LeafChunk(spilled);
- child.height -= newleaf.height;
- this.children.splice(i + 1, 0, newleaf);
- newleaf.parent = this;
- }
- this.maybeSpill();
- }
- break;
- }
- at -= sz;
- }
- },
- maybeSpill: function() {
- if (this.children.length <= 10) return;
- var me = this;
- do {
- var spilled = me.children.splice(me.children.length - 5, 5);
- var sibling = new BranchChunk(spilled);
- if (!me.parent) { // Become the parent node
- var copy = new BranchChunk(me.children);
- copy.parent = me;
- me.children = [copy, sibling];
- me = copy;
- } else {
- me.size -= sibling.size;
- me.height -= sibling.height;
- var myIndex = indexOf(me.parent.children, me);
- me.parent.children.splice(myIndex + 1, 0, sibling);
- }
- sibling.parent = me.parent;
- } while (me.children.length > 10);
- me.parent.maybeSpill();
- },
- iter: function(from, to, op) { this.iterN(from, to - from, op); },
- iterN: function(at, n, op) {
- for (var i = 0, e = this.children.length; i < e; ++i) {
- var child = this.children[i], sz = child.chunkSize();
- if (at < sz) {
- var used = Math.min(n, sz - at);
- if (child.iterN(at, used, op)) return true;
- if ((n -= used) == 0) break;
- at = 0;
- } else at -= sz;
- }
- }
- };
-
- function getLineAt(chunk, n) {
- while (!chunk.lines) {
- for (var i = 0;; ++i) {
- var child = chunk.children[i], sz = child.chunkSize();
- if (n < sz) { chunk = child; break; }
- n -= sz;
- }
- }
- return chunk.lines[n];
- }
- function lineNo(line) {
- if (line.parent == null) return null;
- var cur = line.parent, no = indexOf(cur.lines, line);
- for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
- for (var i = 0, e = chunk.children.length; ; ++i) {
- if (chunk.children[i] == cur) break;
- no += chunk.children[i].chunkSize();
- }
- }
- return no;
- }
- function lineAtHeight(chunk, h) {
- var n = 0;
- outer: do {
- for (var i = 0, e = chunk.children.length; i < e; ++i) {
- var child = chunk.children[i], ch = child.height;
- if (h < ch) { chunk = child; continue outer; }
- h -= ch;
- n += child.chunkSize();
- }
- return n;
- } while (!chunk.lines);
- for (var i = 0, e = chunk.lines.length; i < e; ++i) {
- var line = chunk.lines[i], lh = line.height;
- if (h < lh) break;
- h -= lh;
- }
- return n + i;
- }
- function heightAtLine(chunk, n) {
- var h = 0;
- outer: do {
- for (var i = 0, e = chunk.children.length; i < e; ++i) {
- var child = chunk.children[i], sz = child.chunkSize();
- if (n < sz) { chunk = child; continue outer; }
- n -= sz;
- h += child.height;
- }
- return h;
- } while (!chunk.lines);
- for (var i = 0; i < n; ++i) h += chunk.lines[i].height;
- return h;
- }
-
- // The history object 'chunks' changes that are made close together
- // and at almost the same time into bigger undoable units.
- function History() {
- this.time = 0;
- this.done = []; this.undone = [];
- }
- History.prototype = {
- addChange: function(start, added, old) {
- this.undone.length = 0;
- var time = +new Date, last = this.done[this.done.length - 1];
- if (time - this.time > 400 || !last ||
- last.start > start + added || last.start + last.added < start - last.added + last.old.length)
- this.done.push({start: start, added: added, old: old});
- else {
- var oldoff = 0;
- if (start < last.start) {
- for (var i = last.start - start - 1; i >= 0; --i)
- last.old.unshift(old[i]);
- last.added += last.start - start;
- last.start = start;
- }
- else if (last.start < start) {
- oldoff = start - last.start;
- added += oldoff;
- }
- for (var i = last.added - oldoff, e = old.length; i < e; ++i)
- last.old.push(old[i]);
- if (last.added < added) last.added = added;
- }
- this.time = time;
- }
- };
-
- function stopMethod() {e_stop(this);}
- // Ensure an event has a stop method.
- function addStop(event) {
- if (!event.stop) event.stop = stopMethod;
- return event;
- }
-
- function e_preventDefault(e) {
- if (e.preventDefault) e.preventDefault();
- else e.returnValue = false;
- }
- function e_stopPropagation(e) {
- if (e.stopPropagation) e.stopPropagation();
- else e.cancelBubble = true;
- }
- function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
- CodeMirror.e_stop = e_stop;
- CodeMirror.e_preventDefault = e_preventDefault;
- CodeMirror.e_stopPropagation = e_stopPropagation;
-
- function e_target(e) {return e.target || e.srcElement;}
- function e_button(e) {
- if (e.which) return e.which;
- else if (e.button & 1) return 1;
- else if (e.button & 2) return 3;
- else if (e.button & 4) return 2;
- }
-
- // Event handler registration. If disconnect is true, it'll return a
- // function that unregisters the handler.
- function connect(node, type, handler, disconnect) {
- if (typeof node.addEventListener == "function") {
- node.addEventListener(type, handler, false);
- if (disconnect) return function() {node.removeEventListener(type, handler, false);};
- }
- else {
- var wrapHandler = function(event) {handler(event || window.event);};
- node.attachEvent("on" + type, wrapHandler);
- if (disconnect) return function() {node.detachEvent("on" + type, wrapHandler);};
- }
- }
- CodeMirror.connect = connect;
-
- function Delayed() {this.id = null;}
- Delayed.prototype = {set: function(ms, f) {clearTimeout(this.id); this.id = setTimeout(f, ms);}};
-
- // Detect drag-and-drop
- var dragAndDrop = function() {
- // IE8 has ondragstart and ondrop properties, but doesn't seem to
- // actually support ondragstart the way it's supposed to work.
- if (/MSIE [1-8]\b/.test(navigator.userAgent)) return false;
- var div = document.createElement('div');
- return "draggable" in div;
- }();
-
- var gecko = /gecko\/\d{7}/i.test(navigator.userAgent);
- var ie = /MSIE \d/.test(navigator.userAgent);
- var webkit = /WebKit\//.test(navigator.userAgent);
-
- var lineSep = "\n";
- // Feature-detect whether newlines in textareas are converted to \r\n
- (function () {
- var te = document.createElement("textarea");
- te.value = "foo\nbar";
- if (te.value.indexOf("\r") > -1) lineSep = "\r\n";
- }());
-
- // Counts the column offset in a string, taking tabs into account.
- // Used mostly to find indentation.
- function countColumn(string, end, tabSize) {
- if (end == null) {
- end = string.search(/[^\s\u00a0]/);
- if (end == -1) end = string.length;
- }
- for (var i = 0, n = 0; i < end; ++i) {
- if (string.charAt(i) == "\t") n += tabSize - (n % tabSize);
- else ++n;
- }
- return n;
- }
-
- function computedStyle(elt) {
- if (elt.currentStyle) return elt.currentStyle;
- return window.getComputedStyle(elt, null);
- }
-
- // Find the position of an element by following the offsetParent chain.
- // If screen==true, it returns screen (rather than page) coordinates.
- function eltOffset(node, screen) {
- var bod = node.ownerDocument.body;
- var x = 0, y = 0, skipBody = false;
- for (var n = node; n; n = n.offsetParent) {
- var ol = n.offsetLeft, ot = n.offsetTop;
- // Firefox reports weird inverted offsets when the body has a border.
- if (n == bod) { x += Math.abs(ol); y += Math.abs(ot); }
- else { x += ol, y += ot; }
- if (screen && computedStyle(n).position == "fixed")
- skipBody = true;
- }
- var e = screen && !skipBody ? null : bod;
- for (var n = node.parentNode; n != e; n = n.parentNode)
- if (n.scrollLeft != null) { x -= n.scrollLeft; y -= n.scrollTop;}
- return {left: x, top: y};
- }
- // Use the faster and saner getBoundingClientRect method when possible.
- if (document.documentElement.getBoundingClientRect != null) eltOffset = function(node, screen) {
- // Take the parts of bounding client rect that we are interested in so we are able to edit if need be,
- // since the returned value cannot be changed externally (they are kept in sync as the element moves within the page)
- try { var box = node.getBoundingClientRect(); box = { top: box.top, left: box.left }; }
- catch(e) { box = {top: 0, left: 0}; }
- if (!screen) {
- // Get the toplevel scroll, working around browser differences.
- if (window.pageYOffset == null) {
- var t = document.documentElement || document.body.parentNode;
- if (t.scrollTop == null) t = document.body;
- box.top += t.scrollTop; box.left += t.scrollLeft;
- } else {
- box.top += window.pageYOffset; box.left += window.pageXOffset;
- }
- }
- return box;
- };
-
- // Get a node's text content.
- function eltText(node) {
- return node.textContent || node.innerText || node.nodeValue || "";
- }
-
- // Operations on {line, ch} objects.
- function posEq(a, b) {return a.line == b.line && a.ch == b.ch;}
- function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);}
- function copyPos(x) {return {line: x.line, ch: x.ch};}
-
- var escapeElement = document.createElement("pre");
- function htmlEscape(str) {
- escapeElement.textContent = str;
- return escapeElement.innerHTML;
- }
- // Recent (late 2011) Opera betas insert bogus newlines at the start
- // of the textContent, so we strip those.
- if (htmlEscape("a") == "\na")
- htmlEscape = function(str) {
- escapeElement.textContent = str;
- return escapeElement.innerHTML.slice(1);
- };
- // Some IEs don't preserve tabs through innerHTML
- else if (htmlEscape("\t") != "\t")
- htmlEscape = function(str) {
- escapeElement.innerHTML = "";
- escapeElement.appendChild(document.createTextNode(str));
- return escapeElement.innerHTML;
- };
- CodeMirror.htmlEscape = htmlEscape;
-
- // Used to position the cursor after an undo/redo by finding the
- // last edited character.
- function editEnd(from, to) {
- if (!to) return from ? from.length : 0;
- if (!from) return to.length;
- for (var i = from.length, j = to.length; i >= 0 && j >= 0; --i, --j)
- if (from.charAt(i) != to.charAt(j)) break;
- return j + 1;
- }
-
- function indexOf(collection, elt) {
- if (collection.indexOf) return collection.indexOf(elt);
- for (var i = 0, e = collection.length; i < e; ++i)
- if (collection[i] == elt) return i;
- return -1;
- }
- function isWordChar(ch) {
- return /\w/.test(ch) || ch.toUpperCase() != ch.toLowerCase();
- }
-
- // See if "".split is the broken IE version, if so, provide an
- // alternative way to split lines.
- var splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) {
- var pos = 0, nl, result = [];
- while ((nl = string.indexOf("\n", pos)) > -1) {
- result.push(string.slice(pos, string.charAt(nl-1) == "\r" ? nl - 1 : nl));
- pos = nl + 1;
- }
- result.push(string.slice(pos));
- return result;
- } : function(string){return string.split(/\r?\n/);};
- CodeMirror.splitLines = splitLines;
-
- var hasSelection = window.getSelection ? function(te) {
- try { return te.selectionStart != te.selectionEnd; }
- catch(e) { return false; }
- } : function(te) {
- try {var range = te.ownerDocument.selection.createRange();}
- catch(e) {}
- if (!range || range.parentElement() != te) return false;
- return range.compareEndPoints("StartToEnd", range) != 0;
- };
-
- CodeMirror.defineMode("null", function() {
- return {token: function(stream) {stream.skipToEnd();}};
- });
- CodeMirror.defineMIME("text/plain", "null");
-
- var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
- 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
- 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
- 46: "Delete", 59: ";", 91: "Mod", 92: "Mod", 93: "Mod", 186: ";", 187: "=", 188: ",",
- 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", 221: "]", 222: "'", 63276: "PageUp",
- 63277: "PageDown", 63275: "End", 63273: "Home", 63234: "Left", 63232: "Up", 63235: "Right",
- 63233: "Down", 63302: "Insert", 63272: "Delete"};
- CodeMirror.keyNames = keyNames;
- (function() {
- // Number keys
- for (var i = 0; i < 10; i++) keyNames[i + 48] = String(i);
- // Alphabetic keys
- for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);
- // Function keys
- for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i;
- })();
-
- return CodeMirror;
-})();
-CodeMirror.defineMode("xml", function(config, parserConfig) {
- var indentUnit = config.indentUnit;
- var Kludges = parserConfig.htmlMode ? {
- autoSelfClosers: {"br": true, "img": true, "hr": true, "link": true, "input": true,
- "meta": true, "col": true, "frame": true, "base": true, "area": true},
- doNotIndent: {"pre": true},
- allowUnquoted: true
- } : {autoSelfClosers: {}, doNotIndent: {}, allowUnquoted: false};
- var alignCDATA = parserConfig.alignCDATA;
-
- // Return variables for tokenizers
- var tagName, type;
-
- function inText(stream, state) {
- function chain(parser) {
- state.tokenize = parser;
- return parser(stream, state);
- }
-
- var ch = stream.next();
- if (ch == "<") {
- if (stream.eat("!")) {
- if (stream.eat("[")) {
- if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>"));
- else return null;
- }
- else if (stream.match("--")) return chain(inBlock("comment", "-->"));
- else if (stream.match("DOCTYPE", true, true)) {
- stream.eatWhile(/[\w\._\-]/);
- return chain(doctype(1));
- }
- else return null;
- }
- else if (stream.eat("?")) {
- stream.eatWhile(/[\w\._\-]/);
- state.tokenize = inBlock("meta", "?>");
- return "meta";
- }
- else {
- type = stream.eat("/") ? "closeTag" : "openTag";
- stream.eatSpace();
- tagName = "";
- var c;
- while ((c = stream.eat(/[^\s\u00a0=<>\"\'\/?]/))) tagName += c;
- state.tokenize = inTag;
- return "tag";
- }
- }
- else if (ch == "&") {
- stream.eatWhile(/[^;]/);
- stream.eat(";");
- return "atom";
- }
- else {
- stream.eatWhile(/[^&<]/);
- return null;
- }
- }
-
- function inTag(stream, state) {
- var ch = stream.next();
- if (ch == ">" || (ch == "/" && stream.eat(">"))) {
- state.tokenize = inText;
- type = ch == ">" ? "endTag" : "selfcloseTag";
- return "tag";
- }
- else if (ch == "=") {
- type = "equals";
- return null;
- }
- else if (/[\'\"]/.test(ch)) {
- state.tokenize = inAttribute(ch);
- return state.tokenize(stream, state);
- }
- else {
- stream.eatWhile(/[^\s\u00a0=<>\"\'\/?]/);
- return "word";
- }
- }
-
- function inAttribute(quote) {
- return function(stream, state) {
- while (!stream.eol()) {
- if (stream.next() == quote) {
- state.tokenize = inTag;
- break;
- }
- }
- return "string";
- };
- }
-
- function inBlock(style, terminator) {
- return function(stream, state) {
- while (!stream.eol()) {
- if (stream.match(terminator)) {
- state.tokenize = inText;
- break;
- }
- stream.next();
- }
- return style;
- };
- }
- function doctype(depth) {
- return function(stream, state) {
- var ch;
- while ((ch = stream.next()) != null) {
- if (ch == "<") {
- state.tokenize = doctype(depth + 1);
- return state.tokenize(stream, state);
- } else if (ch == ">") {
- if (depth == 1) {
- state.tokenize = inText;
- break;
- } else {
- state.tokenize = doctype(depth - 1);
- return state.tokenize(stream, state);
- }
- }
- }
- return "meta";
- };
- }
-
- var curState, setStyle;
- function pass() {
- for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]);
- }
- function cont() {
- pass.apply(null, arguments);
- return true;
- }
-
- function pushContext(tagName, startOfLine) {
- var noIndent = Kludges.doNotIndent.hasOwnProperty(tagName) || (curState.context && curState.context.noIndent);
- curState.context = {
- prev: curState.context,
- tagName: tagName,
- indent: curState.indented,
- startOfLine: startOfLine,
- noIndent: noIndent
- };
- }
- function popContext() {
- if (curState.context) curState.context = curState.context.prev;
- }
-
- function element(type) {
- if (type == "openTag") {
- curState.tagName = tagName;
- return cont(attributes, endtag(curState.startOfLine));
- } else if (type == "closeTag") {
- var err = false;
- if (curState.context) {
- err = curState.context.tagName != tagName;
- } else {
- err = true;
- }
- if (err) setStyle = "error";
- return cont(endclosetag(err));
- }
- return cont();
- }
- function endtag(startOfLine) {
- return function(type) {
- if (type == "selfcloseTag" ||
- (type == "endTag" && Kludges.autoSelfClosers.hasOwnProperty(curState.tagName.toLowerCase())))
- return cont();
- if (type == "endTag") {pushContext(curState.tagName, startOfLine); return cont();}
- return cont();
- };
- }
- function endclosetag(err) {
- return function(type) {
- if (err) setStyle = "error";
- if (type == "endTag") { popContext(); return cont(); }
- setStyle = "error";
- return cont(arguments.callee);
- }
- }
-
- function attributes(type) {
- if (type == "word") {setStyle = "attribute"; return cont(attributes);}
- if (type == "equals") return cont(attvalue, attributes);
- if (type == "string") {setStyle = "error"; return cont(attributes);}
- return pass();
- }
- function attvalue(type) {
- if (type == "word" && Kludges.allowUnquoted) {setStyle = "string"; return cont();}
- if (type == "string") return cont(attvaluemaybe);
- return pass();
- }
- function attvaluemaybe(type) {
- if (type == "string") return cont(attvaluemaybe);
- else return pass();
- }
-
- return {
- startState: function() {
- return {tokenize: inText, cc: [], indented: 0, startOfLine: true, tagName: null, context: null};
- },
-
- token: function(stream, state) {
- if (stream.sol()) {
- state.startOfLine = true;
- state.indented = stream.indentation();
- }
- if (stream.eatSpace()) return null;
-
- setStyle = type = tagName = null;
- var style = state.tokenize(stream, state);
- state.type = type;
- if ((style || type) && style != "comment") {
- curState = state;
- while (true) {
- var comb = state.cc.pop() || element;
- if (comb(type || style)) break;
- }
- }
- state.startOfLine = false;
- return setStyle || style;
- },
-
- indent: function(state, textAfter, fullLine) {
- var context = state.context;
- if ((state.tokenize != inTag && state.tokenize != inText) ||
- context && context.noIndent)
- return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0;
- if (alignCDATA && /!?|]/;
-
- function chain(stream, state, f) {
- state.tokenize = f;
- return f(stream, state);
- }
-
- function nextUntilUnescaped(stream, end) {
- var escaped = false, next;
- while ((next = stream.next()) != null) {
- if (next == end && !escaped)
- return false;
- escaped = !escaped && next == "\\";
- }
- return escaped;
- }
-
- // Used as scratch variables to communicate multiple values without
- // consing up tons of objects.
- var type, content;
- function ret(tp, style, cont) {
- type = tp; content = cont;
- return style;
- }
-
- function jsTokenBase(stream, state) {
- var ch = stream.next();
- if (ch == '"' || ch == "'")
- return chain(stream, state, jsTokenString(ch));
- else if (/[\[\]{}\(\),;\:\.]/.test(ch))
- return ret(ch);
- else if (ch == "0" && stream.eat(/x/i)) {
- stream.eatWhile(/[\da-f]/i);
- return ret("number", "number");
- }
- else if (/\d/.test(ch)) {
- stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);
- return ret("number", "number");
- }
- else if (ch == "/") {
- if (stream.eat("*")) {
- return chain(stream, state, jsTokenComment);
- }
- else if (stream.eat("/")) {
- stream.skipToEnd();
- return ret("comment", "comment");
- }
- else if (state.reAllowed) {
- nextUntilUnescaped(stream, "/");
- stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla
- return ret("regexp", "string");
- }
- else {
- stream.eatWhile(isOperatorChar);
- return ret("operator", null, stream.current());
- }
- }
- else if (ch == "#") {
- stream.skipToEnd();
- return ret("error", "error");
- }
- else if (isOperatorChar.test(ch)) {
- stream.eatWhile(isOperatorChar);
- return ret("operator", null, stream.current());
- }
- else {
- stream.eatWhile(/[\w\$_]/);
- var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
- return (known && state.kwAllowed) ? ret(known.type, known.style, word) :
- ret("variable", "variable", word);
- }
- }
-
- function jsTokenString(quote) {
- return function(stream, state) {
- if (!nextUntilUnescaped(stream, quote))
- state.tokenize = jsTokenBase;
- return ret("string", "string");
- };
- }
-
- function jsTokenComment(stream, state) {
- var maybeEnd = false, ch;
- while (ch = stream.next()) {
- if (ch == "/" && maybeEnd) {
- state.tokenize = jsTokenBase;
- break;
- }
- maybeEnd = (ch == "*");
- }
- return ret("comment", "comment");
- }
-
- // Parser
-
- var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true};
-
- function JSLexical(indented, column, type, align, prev, info) {
- this.indented = indented;
- this.column = column;
- this.type = type;
- this.prev = prev;
- this.info = info;
- if (align != null) this.align = align;
- }
-
- function inScope(state, varname) {
- for (var v = state.localVars; v; v = v.next)
- if (v.name == varname) return true;
- }
-
- function parseJS(state, style, type, content, stream) {
- var cc = state.cc;
- // Communicate our context to the combinators.
- // (Less wasteful than consing up a hundred closures on every call.)
- cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;
-
- if (!state.lexical.hasOwnProperty("align"))
- state.lexical.align = true;
-
- while(true) {
- var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;
- if (combinator(type, content)) {
- while(cc.length && cc[cc.length - 1].lex)
- cc.pop()();
- if (cx.marked) return cx.marked;
- if (type == "variable" && inScope(state, content)) return "variable-2";
- return style;
- }
- }
- }
-
- // Combinator utils
-
- var cx = {state: null, column: null, marked: null, cc: null};
- function pass() {
- for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
- }
- function cont() {
- pass.apply(null, arguments);
- return true;
- }
- function register(varname) {
- var state = cx.state;
- if (state.context) {
- cx.marked = "def";
- for (var v = state.localVars; v; v = v.next)
- if (v.name == varname) return;
- state.localVars = {name: varname, next: state.localVars};
- }
- }
-
- // Combinators
-
- var defaultVars = {name: "this", next: {name: "arguments"}};
- function pushcontext() {
- if (!cx.state.context) cx.state.localVars = defaultVars;
- cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
- }
- function popcontext() {
- cx.state.localVars = cx.state.context.vars;
- cx.state.context = cx.state.context.prev;
- }
- function pushlex(type, info) {
- var result = function() {
- var state = cx.state;
- state.lexical = new JSLexical(state.indented, cx.stream.column(), type, null, state.lexical, info)
- };
- result.lex = true;
- return result;
- }
- function poplex() {
- var state = cx.state;
- if (state.lexical.prev) {
- if (state.lexical.type == ")")
- state.indented = state.lexical.indented;
- state.lexical = state.lexical.prev;
- }
- }
- poplex.lex = true;
-
- function expect(wanted) {
- return function expecting(type) {
- if (type == wanted) return cont();
- else if (wanted == ";") return pass();
- else return cont(arguments.callee);
- };
- }
-
- function statement(type) {
- if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex);
- if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);
- if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
- if (type == "{") return cont(pushlex("}"), block, poplex);
- if (type == ";") return cont();
- if (type == "function") return cont(functiondef);
- if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"),
- poplex, statement, poplex);
- if (type == "variable") return cont(pushlex("stat"), maybelabel);
- if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
- block, poplex, poplex);
- if (type == "case") return cont(expression, expect(":"));
- if (type == "default") return cont(expect(":"));
- if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
- statement, poplex, popcontext);
- return pass(pushlex("stat"), expression, expect(";"), poplex);
- }
- function expression(type) {
- if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator);
- if (type == "function") return cont(functiondef);
- if (type == "keyword c") return cont(maybeexpression);
- if (type == "(") return cont(pushlex(")"), expression, expect(")"), poplex, maybeoperator);
- if (type == "operator") return cont(expression);
- if (type == "[") return cont(pushlex("]"), commasep(expression, "]"), poplex, maybeoperator);
- if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator);
- return cont();
- }
- function maybeexpression(type) {
- if (type.match(/[;\}\)\],]/)) return pass();
- return pass(expression);
- }
-
- function maybeoperator(type, value) {
- if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator);
- if (type == "operator") return cont(expression);
- if (type == ";") return;
- if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator);
- if (type == ".") return cont(property, maybeoperator);
- if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator);
- }
- function maybelabel(type) {
- if (type == ":") return cont(poplex, statement);
- return pass(maybeoperator, expect(";"), poplex);
- }
- function property(type) {
- if (type == "variable") {cx.marked = "property"; return cont();}
- }
- function objprop(type) {
- if (type == "variable") cx.marked = "property";
- if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression);
- }
- function commasep(what, end) {
- function proceed(type) {
- if (type == ",") return cont(what, proceed);
- if (type == end) return cont();
- return cont(expect(end));
- }
- return function commaSeparated(type) {
- if (type == end) return cont();
- else return pass(what, proceed);
- };
- }
- function block(type) {
- if (type == "}") return cont();
- return pass(statement, block);
- }
- function vardef1(type, value) {
- if (type == "variable"){register(value); return cont(vardef2);}
- return cont();
- }
- function vardef2(type, value) {
- if (value == "=") return cont(expression, vardef2);
- if (type == ",") return cont(vardef1);
- }
- function forspec1(type) {
- if (type == "var") return cont(vardef1, forspec2);
- if (type == ";") return pass(forspec2);
- if (type == "variable") return cont(formaybein);
- return pass(forspec2);
- }
- function formaybein(type, value) {
- if (value == "in") return cont(expression);
- return cont(maybeoperator, forspec2);
- }
- function forspec2(type, value) {
- if (type == ";") return cont(forspec3);
- if (value == "in") return cont(expression);
- return cont(expression, expect(";"), forspec3);
- }
- function forspec3(type) {
- if (type != ")") cont(expression);
- }
- function functiondef(type, value) {
- if (type == "variable") {register(value); return cont(functiondef);}
- if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, statement, popcontext);
- }
- function funarg(type, value) {
- if (type == "variable") {register(value); return cont();}
- }
-
- // Interface
-
- return {
- startState: function(basecolumn) {
- return {
- tokenize: jsTokenBase,
- reAllowed: true,
- kwAllowed: true,
- cc: [],
- lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
- localVars: null,
- context: null,
- indented: 0
- };
- },
-
- token: function(stream, state) {
- if (stream.sol()) {
- if (!state.lexical.hasOwnProperty("align"))
- state.lexical.align = false;
- state.indented = stream.indentation();
- }
- if (stream.eatSpace()) return null;
- var style = state.tokenize(stream, state);
- if (type == "comment") return style;
- state.reAllowed = type == "operator" || type == "keyword c" || type.match(/^[\[{}\(,;:]$/);
- state.kwAllowed = type != '.';
- return parseJS(state, style, type, content, stream);
- },
-
- indent: function(state, textAfter) {
- if (state.tokenize != jsTokenBase) return 0;
- var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical,
- type = lexical.type, closing = firstChar == type;
- if (type == "vardef") return lexical.indented + 4;
- else if (type == "form" && firstChar == "{") return lexical.indented;
- else if (type == "stat" || type == "form") return lexical.indented + indentUnit;
- else if (lexical.info == "switch" && !closing)
- return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
- else if (lexical.align) return lexical.column + (closing ? 0 : 1);
- else return lexical.indented + (closing ? 0 : indentUnit);
- },
-
- electricChars: ":{}"
- };
-});
-
-CodeMirror.defineMIME("text/javascript", "javascript");
-CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
-
-CodeMirror.defineMode("css", function(config) {
- var indentUnit = config.indentUnit, type;
- function ret(style, tp) {type = tp; return style;}
-
- function tokenBase(stream, state) {
- var ch = stream.next();
- if (ch == "@") {stream.eatWhile(/[\w\\\-]/); return ret("meta", stream.current());}
- else if (ch == "/" && stream.eat("*")) {
- state.tokenize = tokenCComment;
- return tokenCComment(stream, state);
- }
- else if (ch == "<" && stream.eat("!")) {
- state.tokenize = tokenSGMLComment;
- return tokenSGMLComment(stream, state);
- }
- else if (ch == "=") ret(null, "compare");
- else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare");
- else if (ch == "\"" || ch == "'") {
- state.tokenize = tokenString(ch);
- return state.tokenize(stream, state);
- }
- else if (ch == "#") {
- stream.eatWhile(/[\w\\\-]/);
- return ret("atom", "hash");
- }
- else if (ch == "!") {
- stream.match(/^\s*\w*/);
- return ret("keyword", "important");
- }
- else if (/\d/.test(ch)) {
- stream.eatWhile(/[\w.%]/);
- return ret("number", "unit");
- }
- else if (/[,.+>*\/]/.test(ch)) {
- return ret(null, "select-op");
- }
- else if (/[;{}:\[\]]/.test(ch)) {
- return ret(null, ch);
- }
- else {
- stream.eatWhile(/[\w\\\-]/);
- return ret("variable", "variable");
- }
- }
-
- function tokenCComment(stream, state) {
- var maybeEnd = false, ch;
- while ((ch = stream.next()) != null) {
- if (maybeEnd && ch == "/") {
- state.tokenize = tokenBase;
- break;
- }
- maybeEnd = (ch == "*");
- }
- return ret("comment", "comment");
- }
-
- function tokenSGMLComment(stream, state) {
- var dashes = 0, ch;
- while ((ch = stream.next()) != null) {
- if (dashes >= 2 && ch == ">") {
- state.tokenize = tokenBase;
- break;
- }
- dashes = (ch == "-") ? dashes + 1 : 0;
- }
- return ret("comment", "comment");
- }
-
- function tokenString(quote) {
- return function(stream, state) {
- var escaped = false, ch;
- while ((ch = stream.next()) != null) {
- if (ch == quote && !escaped)
- break;
- escaped = !escaped && ch == "\\";
- }
- if (!escaped) state.tokenize = tokenBase;
- return ret("string", "string");
- };
- }
-
- return {
- startState: function(base) {
- return {tokenize: tokenBase,
- baseIndent: base || 0,
- stack: []};
- },
-
- token: function(stream, state) {
- if (stream.eatSpace()) return null;
- var style = state.tokenize(stream, state);
-
- var context = state.stack[state.stack.length-1];
- if (type == "hash" && context == "rule") style = "atom";
- else if (style == "variable") {
- if (context == "rule") style = "number";
- else if (!context || context == "@media{") style = "tag";
- }
-
- if (context == "rule" && /^[\{\};]$/.test(type))
- state.stack.pop();
- if (type == "{") {
- if (context == "@media") state.stack[state.stack.length-1] = "@media{";
- else state.stack.push("{");
- }
- else if (type == "}") state.stack.pop();
- else if (type == "@media") state.stack.push("@media");
- else if (context == "{" && type != "comment") state.stack.push("rule");
- return style;
- },
-
- indent: function(state, textAfter) {
- var n = state.stack.length;
- if (/^\}/.test(textAfter))
- n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1;
- return state.baseIndent + n * indentUnit;
- },
-
- electricChars: "}"
- };
-});
-
-CodeMirror.defineMIME("text/css", "css");
-CodeMirror.defineMode("htmlmixed", function(config, parserConfig) {
- var htmlMode = CodeMirror.getMode(config, {name: "xml", htmlMode: true});
- var jsMode = CodeMirror.getMode(config, "javascript");
- var cssMode = CodeMirror.getMode(config, "css");
-
- function html(stream, state) {
- var style = htmlMode.token(stream, state.htmlState);
- if (style == "tag" && stream.current() == ">" && state.htmlState.context) {
- if (/^script$/i.test(state.htmlState.context.tagName)) {
- state.token = javascript;
- state.localState = jsMode.startState(htmlMode.indent(state.htmlState, ""));
- state.mode = "javascript";
- }
- else if (/^style$/i.test(state.htmlState.context.tagName)) {
- state.token = css;
- state.localState = cssMode.startState(htmlMode.indent(state.htmlState, ""));
- state.mode = "css";
- }
- }
- return style;
- }
- function maybeBackup(stream, pat, style) {
- var cur = stream.current();
- var close = cur.search(pat);
- if (close > -1) stream.backUp(cur.length - close);
- return style;
- }
- function javascript(stream, state) {
- if (stream.match(/^<\/\s*script\s*>/i, false)) {
- state.token = html;
- state.curState = null;
- state.mode = "html";
- return html(stream, state);
- }
- return maybeBackup(stream, /<\/\s*script\s*>/,
- jsMode.token(stream, state.localState));
- }
- function css(stream, state) {
- if (stream.match(/^<\/\s*style\s*>/i, false)) {
- state.token = html;
- state.localState = null;
- state.mode = "html";
- return html(stream, state);
- }
- return maybeBackup(stream, /<\/\s*style\s*>/,
- cssMode.token(stream, state.localState));
- }
-
- return {
- startState: function() {
- var state = htmlMode.startState();
- return {token: html, localState: null, mode: "html", htmlState: state};
- },
-
- copyState: function(state) {
- if (state.localState)
- var local = CodeMirror.copyState(state.token == css ? cssMode : jsMode, state.localState);
- return {token: state.token, localState: local, mode: state.mode,
- htmlState: CodeMirror.copyState(htmlMode, state.htmlState)};
- },
-
- token: function(stream, state) {
- return state.token(stream, state);
- },
-
- indent: function(state, textAfter) {
- if (state.token == html || /^\s*<\//.test(textAfter))
- return htmlMode.indent(state.htmlState, textAfter);
- else if (state.token == javascript)
- return jsMode.indent(state.localState, textAfter);
- else
- return cssMode.indent(state.localState, textAfter);
- },
-
- compareStates: function(a, b) {
- return htmlMode.compareStates(a.htmlState, b.htmlState);
- },
-
- electricChars: "/{}:"
- }
-});
-
-CodeMirror.defineMIME("text/html", "htmlmixed");
diff --git a/www/js/ueditor/third-party/jquery-1.10.2.min.js b/www/js/ueditor/third-party/jquery-1.10.2.min.js
deleted file mode 100644
index da4170647d..0000000000
--- a/www/js/ueditor/third-party/jquery-1.10.2.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
-//@ sourceMappingURL=jquery-1.10.2.min.map
-*/
-(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="
",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML=" ",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML=" ","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML=" ",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" a ",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
-}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/
\s*$/g,At={option:[1,""," "],legend:[1,""," "],area:[1,""," "],param:[1,""," "],thead:[1,""],tr:[2,""],col:[2,""],td:[3,""],_default:x.support.htmlSerialize?[0,"",""]:[1,"X","
"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
-u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write(""),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
diff --git a/www/js/ueditor/third-party/webuploader/Uploader.swf b/www/js/ueditor/third-party/webuploader/Uploader.swf
deleted file mode 100644
index 7c37835094..0000000000
Binary files a/www/js/ueditor/third-party/webuploader/Uploader.swf and /dev/null differ
diff --git a/www/js/ueditor/third-party/webuploader/webuploader.css b/www/js/ueditor/third-party/webuploader/webuploader.css
deleted file mode 100644
index 12f451f800..0000000000
--- a/www/js/ueditor/third-party/webuploader/webuploader.css
+++ /dev/null
@@ -1,28 +0,0 @@
-.webuploader-container {
- position: relative;
-}
-.webuploader-element-invisible {
- position: absolute !important;
- clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
- clip: rect(1px,1px,1px,1px);
-}
-.webuploader-pick {
- position: relative;
- display: inline-block;
- cursor: pointer;
- background: #00b7ee;
- padding: 10px 15px;
- color: #fff;
- text-align: center;
- border-radius: 3px;
- overflow: hidden;
-}
-.webuploader-pick-hover {
- background: #00a2d4;
-}
-
-.webuploader-pick-disable {
- opacity: 0.6;
- pointer-events:none;
-}
-
diff --git a/www/js/ueditor/third-party/webuploader/webuploader.custom.js b/www/js/ueditor/third-party/webuploader/webuploader.custom.js
deleted file mode 100644
index 583a0b8240..0000000000
--- a/www/js/ueditor/third-party/webuploader/webuploader.custom.js
+++ /dev/null
@@ -1,5670 +0,0 @@
-/*! WebUploader 0.1.2 */
-
-
-/**
- * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
- *
- * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
- */
-(function( root, factory ) {
- var modules = {},
-
- // 内部require, 简单不完全实现。
- // https://github.com/amdjs/amdjs-api/wiki/require
- _require = function( deps, callback ) {
- var args, len, i;
-
- // 如果deps不是数组,则直接返回指定module
- if ( typeof deps === 'string' ) {
- return getModule( deps );
- } else {
- args = [];
- for( len = deps.length, i = 0; i < len; i++ ) {
- args.push( getModule( deps[ i ] ) );
- }
-
- return callback.apply( null, args );
- }
- },
-
- // 内部define,暂时不支持不指定id.
- _define = function( id, deps, factory ) {
- if ( arguments.length === 2 ) {
- factory = deps;
- deps = null;
- }
-
- _require( deps || [], function() {
- setModule( id, factory, arguments );
- });
- },
-
- // 设置module, 兼容CommonJs写法。
- setModule = function( id, factory, args ) {
- var module = {
- exports: factory
- },
- returned;
-
- if ( typeof factory === 'function' ) {
- args.length || (args = [ _require, module.exports, module ]);
- returned = factory.apply( null, args );
- returned !== undefined && (module.exports = returned);
- }
-
- modules[ id ] = module.exports;
- },
-
- // 根据id获取module
- getModule = function( id ) {
- var module = modules[ id ] || root[ id ];
-
- if ( !module ) {
- throw new Error( '`' + id + '` is undefined' );
- }
-
- return module;
- },
-
- // 将所有modules,将路径ids装换成对象。
- exportsTo = function( obj ) {
- var key, host, parts, part, last, ucFirst;
-
- // make the first character upper case.
- ucFirst = function( str ) {
- return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
- };
-
- for ( key in modules ) {
- host = obj;
-
- if ( !modules.hasOwnProperty( key ) ) {
- continue;
- }
-
- parts = key.split('/');
- last = ucFirst( parts.pop() );
-
- while( (part = ucFirst( parts.shift() )) ) {
- host[ part ] = host[ part ] || {};
- host = host[ part ];
- }
-
- host[ last ] = modules[ key ];
- }
- },
-
- exports = factory( root, _define, _require ),
- origin;
-
- // exports every module.
- exportsTo( exports );
-
- if ( typeof module === 'object' && typeof module.exports === 'object' ) {
-
- // For CommonJS and CommonJS-like environments where a proper window is present,
- module.exports = exports;
- } else if ( typeof define === 'function' && define.amd ) {
-
- // Allow using this built library as an AMD module
- // in another project. That other project will only
- // see this AMD call, not the internal modules in
- // the closure below.
- define([], exports );
- } else {
-
- // Browser globals case. Just assign the
- // result to a property on the global.
- origin = root.WebUploader;
- root.WebUploader = exports;
- root.WebUploader.noConflict = function() {
- root.WebUploader = origin;
- };
- }
-})( this, function( window, define, require ) {
-
-
- /**
- * @fileOverview jQuery or Zepto
- */
- define('dollar-third',[],function() {
- return window.jQuery || window.Zepto;
- });
- /**
- * @fileOverview Dom 操作相关
- */
- define('dollar',[
- 'dollar-third'
- ], function( _ ) {
- return _;
- });
- /**
- * @fileOverview 使用jQuery的Promise
- */
- define('promise-third',[
- 'dollar'
- ], function( $ ) {
- return {
- Deferred: $.Deferred,
- when: $.when,
-
- isPromise: function( anything ) {
- return anything && typeof anything.then === 'function';
- }
- };
- });
- /**
- * @fileOverview Promise/A+
- */
- define('promise',[
- 'promise-third'
- ], function( _ ) {
- return _;
- });
- /**
- * @fileOverview 基础类方法。
- */
-
- /**
- * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
- *
- * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
- * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
- *
- * * module `base`:WebUploader.Base
- * * module `file`: WebUploader.File
- * * module `lib/dnd`: WebUploader.Lib.Dnd
- * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
- *
- *
- * 以下文档将可能省略`WebUploader`前缀。
- * @module WebUploader
- * @title WebUploader API文档
- */
- define('base',[
- 'dollar',
- 'promise'
- ], function( $, promise ) {
-
- var noop = function() {},
- call = Function.call;
-
- // http://jsperf.com/uncurrythis
- // 反科里化
- function uncurryThis( fn ) {
- return function() {
- return call.apply( fn, arguments );
- };
- }
-
- function bindFn( fn, context ) {
- return function() {
- return fn.apply( context, arguments );
- };
- }
-
- function createObject( proto ) {
- var f;
-
- if ( Object.create ) {
- return Object.create( proto );
- } else {
- f = function() {};
- f.prototype = proto;
- return new f();
- }
- }
-
-
- /**
- * 基础类,提供一些简单常用的方法。
- * @class Base
- */
- return {
-
- /**
- * @property {String} version 当前版本号。
- */
- version: '0.1.2',
-
- /**
- * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
- */
- $: $,
-
- Deferred: promise.Deferred,
-
- isPromise: promise.isPromise,
-
- when: promise.when,
-
- /**
- * @description 简单的浏览器检查结果。
- *
- * * `webkit` webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
- * * `chrome` chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
- * * `ie` ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
- * * `firefox` firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
- * * `safari` safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
- * * `opera` opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
- *
- * @property {Object} [browser]
- */
- browser: (function( ua ) {
- var ret = {},
- webkit = ua.match( /WebKit\/([\d.]+)/ ),
- chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
- ua.match( /CriOS\/([\d.]+)/ ),
-
- ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
- ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i),
- firefox = ua.match( /Firefox\/([\d.]+)/ ),
- safari = ua.match( /Safari\/([\d.]+)/ ),
- opera = ua.match( /OPR\/([\d.]+)/ );
-
- webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
- chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
- ie && (ret.ie = parseFloat( ie[ 1 ] ));
- firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
- safari && (ret.safari = parseFloat( safari[ 1 ] ));
- opera && (ret.opera = parseFloat( opera[ 1 ] ));
-
- return ret;
- })( navigator.userAgent ),
-
- /**
- * @description 操作系统检查结果。
- *
- * * `android` 如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
- * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
- * @property {Object} [os]
- */
- os: (function( ua ) {
- var ret = {},
-
- // osx = !!ua.match( /\(Macintosh\; Intel / ),
- android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
- ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
-
- // osx && (ret.osx = true);
- android && (ret.android = parseFloat( android[ 1 ] ));
- ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
-
- return ret;
- })( navigator.userAgent ),
-
- /**
- * 实现类与类之间的继承。
- * @method inherits
- * @grammar Base.inherits( super ) => child
- * @grammar Base.inherits( super, protos ) => child
- * @grammar Base.inherits( super, protos, statics ) => child
- * @param {Class} super 父类
- * @param {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
- * @param {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
- * @param {Object} [statics] 静态属性或方法。
- * @return {Class} 返回子类。
- * @example
- * function Person() {
- * console.log( 'Super' );
- * }
- * Person.prototype.hello = function() {
- * console.log( 'hello' );
- * };
- *
- * var Manager = Base.inherits( Person, {
- * world: function() {
- * console.log( 'World' );
- * }
- * });
- *
- * // 因为没有指定构造器,父类的构造器将会执行。
- * var instance = new Manager(); // => Super
- *
- * // 继承子父类的方法
- * instance.hello(); // => hello
- * instance.world(); // => World
- *
- * // 子类的__super__属性指向父类
- * console.log( Manager.__super__ === Person ); // => true
- */
- inherits: function( Super, protos, staticProtos ) {
- var child;
-
- if ( typeof protos === 'function' ) {
- child = protos;
- protos = null;
- } else if ( protos && protos.hasOwnProperty('constructor') ) {
- child = protos.constructor;
- } else {
- child = function() {
- return Super.apply( this, arguments );
- };
- }
-
- // 复制静态方法
- $.extend( true, child, Super, staticProtos || {} );
-
- /* jshint camelcase: false */
-
- // 让子类的__super__属性指向父类。
- child.__super__ = Super.prototype;
-
- // 构建原型,添加原型方法或属性。
- // 暂时用Object.create实现。
- child.prototype = createObject( Super.prototype );
- protos && $.extend( true, child.prototype, protos );
-
- return child;
- },
-
- /**
- * 一个不做任何事情的方法。可以用来赋值给默认的callback.
- * @method noop
- */
- noop: noop,
-
- /**
- * 返回一个新的方法,此方法将已指定的`context`来执行。
- * @grammar Base.bindFn( fn, context ) => Function
- * @method bindFn
- * @example
- * var doSomething = function() {
- * console.log( this.name );
- * },
- * obj = {
- * name: 'Object Name'
- * },
- * aliasFn = Base.bind( doSomething, obj );
- *
- * aliasFn(); // => Object Name
- *
- */
- bindFn: bindFn,
-
- /**
- * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。
- * @grammar Base.log( args... ) => undefined
- * @method log
- */
- log: (function() {
- if ( window.console ) {
- return bindFn( console.log, console );
- }
- return noop;
- })(),
-
- nextTick: (function() {
-
- return function( cb ) {
- setTimeout( cb, 1 );
- };
-
- // @bug 当浏览器不在当前窗口时就停了。
- // var next = window.requestAnimationFrame ||
- // window.webkitRequestAnimationFrame ||
- // window.mozRequestAnimationFrame ||
- // function( cb ) {
- // window.setTimeout( cb, 1000 / 60 );
- // };
-
- // // fix: Uncaught TypeError: Illegal invocation
- // return bindFn( next, window );
- })(),
-
- /**
- * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
- * 将用来将非数组对象转化成数组对象。
- * @grammar Base.slice( target, start[, end] ) => Array
- * @method slice
- * @example
- * function doSomthing() {
- * var args = Base.slice( arguments, 1 );
- * console.log( args );
- * }
- *
- * doSomthing( 'ignored', 'arg2', 'arg3' ); // => Array ["arg2", "arg3"]
- */
- slice: uncurryThis( [].slice ),
-
- /**
- * 生成唯一的ID
- * @method guid
- * @grammar Base.guid() => String
- * @grammar Base.guid( prefx ) => String
- */
- guid: (function() {
- var counter = 0;
-
- return function( prefix ) {
- var guid = (+new Date()).toString( 32 ),
- i = 0;
-
- for ( ; i < 5; i++ ) {
- guid += Math.floor( Math.random() * 65535 ).toString( 32 );
- }
-
- return (prefix || 'wu_') + guid + (counter++).toString( 32 );
- };
- })(),
-
- /**
- * 格式化文件大小, 输出成带单位的字符串
- * @method formatSize
- * @grammar Base.formatSize( size ) => String
- * @grammar Base.formatSize( size, pointLength ) => String
- * @grammar Base.formatSize( size, pointLength, units ) => String
- * @param {Number} size 文件大小
- * @param {Number} [pointLength=2] 精确到的小数点数。
- * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
- * @example
- * console.log( Base.formatSize( 100 ) ); // => 100B
- * console.log( Base.formatSize( 1024 ) ); // => 1.00K
- * console.log( Base.formatSize( 1024, 0 ) ); // => 1K
- * console.log( Base.formatSize( 1024 * 1024 ) ); // => 1.00M
- * console.log( Base.formatSize( 1024 * 1024 * 1024 ) ); // => 1.00G
- * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) ); // => 1024MB
- */
- formatSize: function( size, pointLength, units ) {
- var unit;
-
- units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
-
- while ( (unit = units.shift()) && size > 1024 ) {
- size = size / 1024;
- }
-
- return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
- unit;
- }
- };
- });
- /**
- * 事件处理类,可以独立使用,也可以扩展给对象使用。
- * @fileOverview Mediator
- */
- define('mediator',[
- 'base'
- ], function( Base ) {
- var $ = Base.$,
- slice = [].slice,
- separator = /\s+/,
- protos;
-
- // 根据条件过滤出事件handlers.
- function findHandlers( arr, name, callback, context ) {
- return $.grep( arr, function( handler ) {
- return handler &&
- (!name || handler.e === name) &&
- (!callback || handler.cb === callback ||
- handler.cb._cb === callback) &&
- (!context || handler.ctx === context);
- });
- }
-
- function eachEvent( events, callback, iterator ) {
- // 不支持对象,只支持多个event用空格隔开
- $.each( (events || '').split( separator ), function( _, key ) {
- iterator( key, callback );
- });
- }
-
- function triggerHanders( events, args ) {
- var stoped = false,
- i = -1,
- len = events.length,
- handler;
-
- while ( ++i < len ) {
- handler = events[ i ];
-
- if ( handler.cb.apply( handler.ctx2, args ) === false ) {
- stoped = true;
- break;
- }
- }
-
- return !stoped;
- }
-
- protos = {
-
- /**
- * 绑定事件。
- *
- * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
- * ```javascript
- * var obj = {};
- *
- * // 使得obj有事件行为
- * Mediator.installTo( obj );
- *
- * obj.on( 'testa', function( arg1, arg2 ) {
- * console.log( arg1, arg2 ); // => 'arg1', 'arg2'
- * });
- *
- * obj.trigger( 'testa', 'arg1', 'arg2' );
- * ```
- *
- * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
- * 切会影响到`trigger`方法的返回值,为`false`。
- *
- * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
- * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
- * ```javascript
- * obj.on( 'all', function( type, arg1, arg2 ) {
- * console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
- * });
- * ```
- *
- * @method on
- * @grammar on( name, callback[, context] ) => self
- * @param {String} name 事件名,支持多个事件用空格隔开
- * @param {Function} callback 事件处理器
- * @param {Object} [context] 事件处理器的上下文。
- * @return {self} 返回自身,方便链式
- * @chainable
- * @class Mediator
- */
- on: function( name, callback, context ) {
- var me = this,
- set;
-
- if ( !callback ) {
- return this;
- }
-
- set = this._events || (this._events = []);
-
- eachEvent( name, callback, function( name, callback ) {
- var handler = { e: name };
-
- handler.cb = callback;
- handler.ctx = context;
- handler.ctx2 = context || me;
- handler.id = set.length;
-
- set.push( handler );
- });
-
- return this;
- },
-
- /**
- * 绑定事件,且当handler执行完后,自动解除绑定。
- * @method once
- * @grammar once( name, callback[, context] ) => self
- * @param {String} name 事件名
- * @param {Function} callback 事件处理器
- * @param {Object} [context] 事件处理器的上下文。
- * @return {self} 返回自身,方便链式
- * @chainable
- */
- once: function( name, callback, context ) {
- var me = this;
-
- if ( !callback ) {
- return me;
- }
-
- eachEvent( name, callback, function( name, callback ) {
- var once = function() {
- me.off( name, once );
- return callback.apply( context || me, arguments );
- };
-
- once._cb = callback;
- me.on( name, once, context );
- });
-
- return me;
- },
-
- /**
- * 解除事件绑定
- * @method off
- * @grammar off( [name[, callback[, context] ] ] ) => self
- * @param {String} [name] 事件名
- * @param {Function} [callback] 事件处理器
- * @param {Object} [context] 事件处理器的上下文。
- * @return {self} 返回自身,方便链式
- * @chainable
- */
- off: function( name, cb, ctx ) {
- var events = this._events;
-
- if ( !events ) {
- return this;
- }
-
- if ( !name && !cb && !ctx ) {
- this._events = [];
- return this;
- }
-
- eachEvent( name, cb, function( name, cb ) {
- $.each( findHandlers( events, name, cb, ctx ), function() {
- delete events[ this.id ];
- });
- });
-
- return this;
- },
-
- /**
- * 触发事件
- * @method trigger
- * @grammar trigger( name[, args...] ) => self
- * @param {String} type 事件名
- * @param {*} [...] 任意参数
- * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
- */
- trigger: function( type ) {
- var args, events, allEvents;
-
- if ( !this._events || !type ) {
- return this;
- }
-
- args = slice.call( arguments, 1 );
- events = findHandlers( this._events, type );
- allEvents = findHandlers( this._events, 'all' );
-
- return triggerHanders( events, args ) &&
- triggerHanders( allEvents, arguments );
- }
- };
-
- /**
- * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
- * 主要目的是负责模块与模块之间的合作,降低耦合度。
- *
- * @class Mediator
- */
- return $.extend({
-
- /**
- * 可以通过这个接口,使任何对象具备事件功能。
- * @method installTo
- * @param {Object} obj 需要具备事件行为的对象。
- * @return {Object} 返回obj.
- */
- installTo: function( obj ) {
- return $.extend( obj, protos );
- }
-
- }, protos );
- });
- /**
- * @fileOverview Uploader上传类
- */
- define('uploader',[
- 'base',
- 'mediator'
- ], function( Base, Mediator ) {
-
- var $ = Base.$;
-
- /**
- * 上传入口类。
- * @class Uploader
- * @constructor
- * @grammar new Uploader( opts ) => Uploader
- * @example
- * var uploader = WebUploader.Uploader({
- * swf: 'path_of_swf/Uploader.swf',
- *
- * // 开起分片上传。
- * chunked: true
- * });
- */
- function Uploader( opts ) {
- this.options = $.extend( true, {}, Uploader.options, opts );
- this._init( this.options );
- }
-
- // default Options
- // widgets中有相应扩展
- Uploader.options = {};
- Mediator.installTo( Uploader.prototype );
-
- // 批量添加纯命令式方法。
- $.each({
- upload: 'start-upload',
- stop: 'stop-upload',
- getFile: 'get-file',
- getFiles: 'get-files',
- addFile: 'add-file',
- addFiles: 'add-file',
- sort: 'sort-files',
- removeFile: 'remove-file',
- skipFile: 'skip-file',
- retry: 'retry',
- isInProgress: 'is-in-progress',
- makeThumb: 'make-thumb',
- getDimension: 'get-dimension',
- addButton: 'add-btn',
- getRuntimeType: 'get-runtime-type',
- refresh: 'refresh',
- disable: 'disable',
- enable: 'enable',
- reset: 'reset'
- }, function( fn, command ) {
- Uploader.prototype[ fn ] = function() {
- return this.request( command, arguments );
- };
- });
-
- $.extend( Uploader.prototype, {
- state: 'pending',
-
- _init: function( opts ) {
- var me = this;
-
- me.request( 'init', opts, function() {
- me.state = 'ready';
- me.trigger('ready');
- });
- },
-
- /**
- * 获取或者设置Uploader配置项。
- * @method option
- * @grammar option( key ) => *
- * @grammar option( key, val ) => self
- * @example
- *
- * // 初始状态图片上传前不会压缩
- * var uploader = new WebUploader.Uploader({
- * resize: null;
- * });
- *
- * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
- * uploader.options( 'resize', {
- * width: 1600,
- * height: 1600
- * });
- */
- option: function( key, val ) {
- var opts = this.options;
-
- // setter
- if ( arguments.length > 1 ) {
-
- if ( $.isPlainObject( val ) &&
- $.isPlainObject( opts[ key ] ) ) {
- $.extend( opts[ key ], val );
- } else {
- opts[ key ] = val;
- }
-
- } else { // getter
- return key ? opts[ key ] : opts;
- }
- },
-
- /**
- * 获取文件统计信息。返回一个包含一下信息的对象。
- * * `successNum` 上传成功的文件数
- * * `uploadFailNum` 上传失败的文件数
- * * `cancelNum` 被删除的文件数
- * * `invalidNum` 无效的文件数
- * * `queueNum` 还在队列中的文件数
- * @method getStats
- * @grammar getStats() => Object
- */
- getStats: function() {
- // return this._mgr.getStats.apply( this._mgr, arguments );
- var stats = this.request('get-stats');
-
- return {
- successNum: stats.numOfSuccess,
-
- // who care?
- // queueFailNum: 0,
- cancelNum: stats.numOfCancel,
- invalidNum: stats.numOfInvalid,
- uploadFailNum: stats.numOfUploadFailed,
- queueNum: stats.numOfQueue
- };
- },
-
- // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
- trigger: function( type/*, args...*/ ) {
- var args = [].slice.call( arguments, 1 ),
- opts = this.options,
- name = 'on' + type.substring( 0, 1 ).toUpperCase() +
- type.substring( 1 );
-
- if (
- // 调用通过on方法注册的handler.
- Mediator.trigger.apply( this, arguments ) === false ||
-
- // 调用opts.onEvent
- $.isFunction( opts[ name ] ) &&
- opts[ name ].apply( this, args ) === false ||
-
- // 调用this.onEvent
- $.isFunction( this[ name ] ) &&
- this[ name ].apply( this, args ) === false ||
-
- // 广播所有uploader的事件。
- Mediator.trigger.apply( Mediator,
- [ this, type ].concat( args ) ) === false ) {
-
- return false;
- }
-
- return true;
- },
-
- // widgets/widget.js将补充此方法的详细文档。
- request: Base.noop
- });
-
- /**
- * 创建Uploader实例,等同于new Uploader( opts );
- * @method create
- * @class Base
- * @static
- * @grammar Base.create( opts ) => Uploader
- */
- Base.create = Uploader.create = function( opts ) {
- return new Uploader( opts );
- };
-
- // 暴露Uploader,可以通过它来扩展业务逻辑。
- Base.Uploader = Uploader;
-
- return Uploader;
- });
- /**
- * @fileOverview Runtime管理器,负责Runtime的选择, 连接
- */
- define('runtime/runtime',[
- 'base',
- 'mediator'
- ], function( Base, Mediator ) {
-
- var $ = Base.$,
- factories = {},
-
- // 获取对象的第一个key
- getFirstKey = function( obj ) {
- for ( var key in obj ) {
- if ( obj.hasOwnProperty( key ) ) {
- return key;
- }
- }
- return null;
- };
-
- // 接口类。
- function Runtime( options ) {
- this.options = $.extend({
- container: document.body
- }, options );
- this.uid = Base.guid('rt_');
- }
-
- $.extend( Runtime.prototype, {
-
- getContainer: function() {
- var opts = this.options,
- parent, container;
-
- if ( this._container ) {
- return this._container;
- }
-
- parent = $( opts.container || document.body );
- container = $( document.createElement('div') );
-
- container.attr( 'id', 'rt_' + this.uid );
- container.css({
- position: 'absolute',
- top: '0px',
- left: '0px',
- width: '1px',
- height: '1px',
- overflow: 'hidden'
- });
-
- parent.append( container );
- parent.addClass('webuploader-container');
- this._container = container;
- return container;
- },
-
- init: Base.noop,
- exec: Base.noop,
-
- destroy: function() {
- if ( this._container ) {
- this._container.parentNode.removeChild( this.__container );
- }
-
- this.off();
- }
- });
-
- Runtime.orders = 'html5,flash';
-
-
- /**
- * 添加Runtime实现。
- * @param {String} type 类型
- * @param {Runtime} factory 具体Runtime实现。
- */
- Runtime.addRuntime = function( type, factory ) {
- factories[ type ] = factory;
- };
-
- Runtime.hasRuntime = function( type ) {
- return !!(type ? factories[ type ] : getFirstKey( factories ));
- };
-
- Runtime.create = function( opts, orders ) {
- var type, runtime;
-
- orders = orders || Runtime.orders;
- $.each( orders.split( /\s*,\s*/g ), function() {
- if ( factories[ this ] ) {
- type = this;
- return false;
- }
- });
-
- type = type || getFirstKey( factories );
-
- if ( !type ) {
- throw new Error('Runtime Error');
- }
-
- runtime = new factories[ type ]( opts );
- return runtime;
- };
-
- Mediator.installTo( Runtime.prototype );
- return Runtime;
- });
-
- /**
- * @fileOverview Runtime管理器,负责Runtime的选择, 连接
- */
- define('runtime/client',[
- 'base',
- 'mediator',
- 'runtime/runtime'
- ], function( Base, Mediator, Runtime ) {
-
- var cache;
-
- cache = (function() {
- var obj = {};
-
- return {
- add: function( runtime ) {
- obj[ runtime.uid ] = runtime;
- },
-
- get: function( ruid, standalone ) {
- var i;
-
- if ( ruid ) {
- return obj[ ruid ];
- }
-
- for ( i in obj ) {
- // 有些类型不能重用,比如filepicker.
- if ( standalone && obj[ i ].__standalone ) {
- continue;
- }
-
- return obj[ i ];
- }
-
- return null;
- },
-
- remove: function( runtime ) {
- delete obj[ runtime.uid ];
- }
- };
- })();
-
- function RuntimeClient( component, standalone ) {
- var deferred = Base.Deferred(),
- runtime;
-
- this.uid = Base.guid('client_');
-
- // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
- this.runtimeReady = function( cb ) {
- return deferred.done( cb );
- };
-
- this.connectRuntime = function( opts, cb ) {
-
- // already connected.
- if ( runtime ) {
- throw new Error('already connected!');
- }
-
- deferred.done( cb );
-
- if ( typeof opts === 'string' && cache.get( opts ) ) {
- runtime = cache.get( opts );
- }
-
- // 像filePicker只能独立存在,不能公用。
- runtime = runtime || cache.get( null, standalone );
-
- // 需要创建
- if ( !runtime ) {
- runtime = Runtime.create( opts, opts.runtimeOrder );
- runtime.__promise = deferred.promise();
- runtime.once( 'ready', deferred.resolve );
- runtime.init();
- cache.add( runtime );
- runtime.__client = 1;
- } else {
- // 来自cache
- Base.$.extend( runtime.options, opts );
- runtime.__promise.then( deferred.resolve );
- runtime.__client++;
- }
-
- standalone && (runtime.__standalone = standalone);
- return runtime;
- };
-
- this.getRuntime = function() {
- return runtime;
- };
-
- this.disconnectRuntime = function() {
- if ( !runtime ) {
- return;
- }
-
- runtime.__client--;
-
- if ( runtime.__client <= 0 ) {
- cache.remove( runtime );
- delete runtime.__promise;
- runtime.destroy();
- }
-
- runtime = null;
- };
-
- this.exec = function() {
- if ( !runtime ) {
- return;
- }
-
- var args = Base.slice( arguments );
- component && args.unshift( component );
-
- return runtime.exec.apply( this, args );
- };
-
- this.getRuid = function() {
- return runtime && runtime.uid;
- };
-
- this.destroy = (function( destroy ) {
- return function() {
- destroy && destroy.apply( this, arguments );
- this.trigger('destroy');
- this.off();
- this.exec('destroy');
- this.disconnectRuntime();
- };
- })( this.destroy );
- }
-
- Mediator.installTo( RuntimeClient.prototype );
- return RuntimeClient;
- });
- /**
- * @fileOverview Blob
- */
- define('lib/blob',[
- 'base',
- 'runtime/client'
- ], function( Base, RuntimeClient ) {
-
- function Blob( ruid, source ) {
- var me = this;
-
- me.source = source;
- me.ruid = ruid;
-
- RuntimeClient.call( me, 'Blob' );
-
- this.uid = source.uid || this.uid;
- this.type = source.type || '';
- this.size = source.size || 0;
-
- if ( ruid ) {
- me.connectRuntime( ruid );
- }
- }
-
- Base.inherits( RuntimeClient, {
- constructor: Blob,
-
- slice: function( start, end ) {
- return this.exec( 'slice', start, end );
- },
-
- getSource: function() {
- return this.source;
- }
- });
-
- return Blob;
- });
- /**
- * 为了统一化Flash的File和HTML5的File而存在。
- * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
- * @fileOverview File
- */
- define('lib/file',[
- 'base',
- 'lib/blob'
- ], function( Base, Blob ) {
-
- var uid = 1,
- rExt = /\.([^.]+)$/;
-
- function File( ruid, file ) {
- var ext;
-
- Blob.apply( this, arguments );
- this.name = file.name || ('untitled' + uid++);
- ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
-
- // todo 支持其他类型文件的转换。
-
- // 如果有mimetype, 但是文件名里面没有找出后缀规律
- if ( !ext && this.type ) {
- ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?
- RegExp.$1.toLowerCase() : '';
- this.name += '.' + ext;
- }
-
- // 如果没有指定mimetype, 但是知道文件后缀。
- if ( !this.type && ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {
- this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);
- }
-
- this.ext = ext;
- this.lastModifiedDate = file.lastModifiedDate ||
- (new Date()).toLocaleString();
- }
-
- return Base.inherits( Blob, File );
- });
-
- /**
- * @fileOverview 错误信息
- */
- define('lib/filepicker',[
- 'base',
- 'runtime/client',
- 'lib/file'
- ], function( Base, RuntimeClent, File ) {
-
- var $ = Base.$;
-
- function FilePicker( opts ) {
- opts = this.options = $.extend({}, FilePicker.options, opts );
-
- opts.container = $( opts.id );
-
- if ( !opts.container.length ) {
- throw new Error('按钮指定错误');
- }
-
- opts.innerHTML = opts.innerHTML || opts.label ||
- opts.container.html() || '';
-
- opts.button = $( opts.button || document.createElement('div') );
- opts.button.html( opts.innerHTML );
- opts.container.html( opts.button );
-
- RuntimeClent.call( this, 'FilePicker', true );
- }
-
- FilePicker.options = {
- button: null,
- container: null,
- label: null,
- innerHTML: null,
- multiple: true,
- accept: null,
- name: 'file'
- };
-
- Base.inherits( RuntimeClent, {
- constructor: FilePicker,
-
- init: function() {
- var me = this,
- opts = me.options,
- button = opts.button;
-
- button.addClass('webuploader-pick');
-
- me.on( 'all', function( type ) {
- var files;
-
- switch ( type ) {
- case 'mouseenter':
- button.addClass('webuploader-pick-hover');
- break;
-
- case 'mouseleave':
- button.removeClass('webuploader-pick-hover');
- break;
-
- case 'change':
- files = me.exec('getFiles');
- me.trigger( 'select', $.map( files, function( file ) {
- file = new File( me.getRuid(), file );
-
- // 记录来源。
- file._refer = opts.container;
- return file;
- }), opts.container );
- break;
- }
- });
-
- me.connectRuntime( opts, function() {
- me.refresh();
- me.exec( 'init', opts );
- me.trigger('ready');
- });
-
- $( window ).on( 'resize', function() {
- me.refresh();
- });
- },
-
- refresh: function() {
- var shimContainer = this.getRuntime().getContainer(),
- button = this.options.button,
- width = button.outerWidth ?
- button.outerWidth() : button.width(),
-
- height = button.outerHeight ?
- button.outerHeight() : button.height(),
-
- pos = button.offset();
-
- width && height && shimContainer.css({
- bottom: 'auto',
- right: 'auto',
- width: width + 'px',
- height: height + 'px'
- }).offset( pos );
- },
-
- enable: function() {
- var btn = this.options.button;
-
- btn.removeClass('webuploader-pick-disable');
- this.refresh();
- },
-
- disable: function() {
- var btn = this.options.button;
-
- this.getRuntime().getContainer().css({
- top: '-99999px'
- });
-
- btn.addClass('webuploader-pick-disable');
- },
-
- destroy: function() {
- if ( this.runtime ) {
- this.exec('destroy');
- this.disconnectRuntime();
- }
- }
- });
-
- return FilePicker;
- });
-
- /**
- * @fileOverview 组件基类。
- */
- define('widgets/widget',[
- 'base',
- 'uploader'
- ], function( Base, Uploader ) {
-
- var $ = Base.$,
- _init = Uploader.prototype._init,
- IGNORE = {},
- widgetClass = [];
-
- function isArrayLike( obj ) {
- if ( !obj ) {
- return false;
- }
-
- var length = obj.length,
- type = $.type( obj );
-
- if ( obj.nodeType === 1 && length ) {
- return true;
- }
-
- return type === 'array' || type !== 'function' && type !== 'string' &&
- (length === 0 || typeof length === 'number' && length > 0 &&
- (length - 1) in obj);
- }
-
- function Widget( uploader ) {
- this.owner = uploader;
- this.options = uploader.options;
- }
-
- $.extend( Widget.prototype, {
-
- init: Base.noop,
-
- // 类Backbone的事件监听声明,监听uploader实例上的事件
- // widget直接无法监听事件,事件只能通过uploader来传递
- invoke: function( apiName, args ) {
-
- /*
- {
- 'make-thumb': 'makeThumb'
- }
- */
- var map = this.responseMap;
-
- // 如果无API响应声明则忽略
- if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
- !$.isFunction( this[ map[ apiName ] ] ) ) {
-
- return IGNORE;
- }
-
- return this[ map[ apiName ] ].apply( this, args );
-
- },
-
- /**
- * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
- * @method request
- * @grammar request( command, args ) => * | Promise
- * @grammar request( command, args, callback ) => Promise
- * @for Uploader
- */
- request: function() {
- return this.owner.request.apply( this.owner, arguments );
- }
- });
-
- // 扩展Uploader.
- $.extend( Uploader.prototype, {
-
- // 覆写_init用来初始化widgets
- _init: function() {
- var me = this,
- widgets = me._widgets = [];
-
- $.each( widgetClass, function( _, klass ) {
- widgets.push( new klass( me ) );
- });
-
- return _init.apply( me, arguments );
- },
-
- request: function( apiName, args, callback ) {
- var i = 0,
- widgets = this._widgets,
- len = widgets.length,
- rlts = [],
- dfds = [],
- widget, rlt, promise, key;
-
- args = isArrayLike( args ) ? args : [ args ];
-
- for ( ; i < len; i++ ) {
- widget = widgets[ i ];
- rlt = widget.invoke( apiName, args );
-
- if ( rlt !== IGNORE ) {
-
- // Deferred对象
- if ( Base.isPromise( rlt ) ) {
- dfds.push( rlt );
- } else {
- rlts.push( rlt );
- }
- }
- }
-
- // 如果有callback,则用异步方式。
- if ( callback || dfds.length ) {
- promise = Base.when.apply( Base, dfds );
- key = promise.pipe ? 'pipe' : 'then';
-
- // 很重要不能删除。删除了会死循环。
- // 保证执行顺序。让callback总是在下一个tick中执行。
- return promise[ key ](function() {
- var deferred = Base.Deferred(),
- args = arguments;
-
- setTimeout(function() {
- deferred.resolve.apply( deferred, args );
- }, 1 );
-
- return deferred.promise();
- })[ key ]( callback || Base.noop );
- } else {
- return rlts[ 0 ];
- }
- }
- });
-
- /**
- * 添加组件
- * @param {object} widgetProto 组件原型,构造函数通过constructor属性定义
- * @param {object} responseMap API名称与函数实现的映射
- * @example
- * Uploader.register( {
- * init: function( options ) {},
- * makeThumb: function() {}
- * }, {
- * 'make-thumb': 'makeThumb'
- * } );
- */
- Uploader.register = Widget.register = function( responseMap, widgetProto ) {
- var map = { init: 'init' },
- klass;
-
- if ( arguments.length === 1 ) {
- widgetProto = responseMap;
- widgetProto.responseMap = map;
- } else {
- widgetProto.responseMap = $.extend( map, responseMap );
- }
-
- klass = Base.inherits( Widget, widgetProto );
- widgetClass.push( klass );
-
- return klass;
- };
-
- return Widget;
- });
- /**
- * @fileOverview 文件选择相关
- */
- define('widgets/filepicker',[
- 'base',
- 'uploader',
- 'lib/filepicker',
- 'widgets/widget'
- ], function( Base, Uploader, FilePicker ) {
- var $ = Base.$;
-
- $.extend( Uploader.options, {
-
- /**
- * @property {Selector | Object} [pick=undefined]
- * @namespace options
- * @for Uploader
- * @description 指定选择文件的按钮容器,不指定则不创建按钮。
- *
- * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。
- * * `label` {String} 请采用 `innerHTML` 代替
- * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
- * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
- */
- pick: null,
-
- /**
- * @property {Arroy} [accept=null]
- * @namespace options
- * @for Uploader
- * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
- *
- * * `title` {String} 文字描述
- * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
- * * `mimeTypes` {String} 多个用逗号分割。
- *
- * 如:
- *
- * ```
- * {
- * title: 'Images',
- * extensions: 'gif,jpg,jpeg,bmp,png',
- * mimeTypes: 'image/*'
- * }
- * ```
- */
- accept: null/*{
- title: 'Images',
- extensions: 'gif,jpg,jpeg,bmp,png',
- mimeTypes: 'image/*'
- }*/
- });
-
- return Uploader.register({
- 'add-btn': 'addButton',
- refresh: 'refresh',
- disable: 'disable',
- enable: 'enable'
- }, {
-
- init: function( opts ) {
- this.pickers = [];
- return opts.pick && this.addButton( opts.pick );
- },
-
- refresh: function() {
- $.each( this.pickers, function() {
- this.refresh();
- });
- },
-
- /**
- * @method addButton
- * @for Uploader
- * @grammar addButton( pick ) => Promise
- * @description
- * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
- * @example
- * uploader.addButton({
- * id: '#btnContainer',
- * innerHTML: '选择文件'
- * });
- */
- addButton: function( pick ) {
- var me = this,
- opts = me.options,
- accept = opts.accept,
- options, picker, deferred;
-
- if ( !pick ) {
- return;
- }
-
- deferred = Base.Deferred();
- $.isPlainObject( pick ) || (pick = {
- id: pick
- });
-
- options = $.extend({}, pick, {
- accept: $.isPlainObject( accept ) ? [ accept ] : accept,
- swf: opts.swf,
- runtimeOrder: opts.runtimeOrder
- });
-
- picker = new FilePicker( options );
-
- picker.once( 'ready', deferred.resolve );
- picker.on( 'select', function( files ) {
- me.owner.request( 'add-file', [ files ]);
- });
- picker.init();
-
- this.pickers.push( picker );
-
- return deferred.promise();
- },
-
- disable: function() {
- $.each( this.pickers, function() {
- this.disable();
- });
- },
-
- enable: function() {
- $.each( this.pickers, function() {
- this.enable();
- });
- }
- });
- });
- /**
- * @fileOverview Image
- */
- define('lib/image',[
- 'base',
- 'runtime/client',
- 'lib/blob'
- ], function( Base, RuntimeClient, Blob ) {
- var $ = Base.$;
-
- // 构造器。
- function Image( opts ) {
- this.options = $.extend({}, Image.options, opts );
- RuntimeClient.call( this, 'Image' );
-
- this.on( 'load', function() {
- this._info = this.exec('info');
- this._meta = this.exec('meta');
- });
- }
-
- // 默认选项。
- Image.options = {
-
- // 默认的图片处理质量
- quality: 90,
-
- // 是否裁剪
- crop: false,
-
- // 是否保留头部信息
- preserveHeaders: true,
-
- // 是否允许放大。
- allowMagnify: true
- };
-
- // 继承RuntimeClient.
- Base.inherits( RuntimeClient, {
- constructor: Image,
-
- info: function( val ) {
-
- // setter
- if ( val ) {
- this._info = val;
- return this;
- }
-
- // getter
- return this._info;
- },
-
- meta: function( val ) {
-
- // setter
- if ( val ) {
- this._meta = val;
- return this;
- }
-
- // getter
- return this._meta;
- },
-
- loadFromBlob: function( blob ) {
- var me = this,
- ruid = blob.getRuid();
-
- this.connectRuntime( ruid, function() {
- me.exec( 'init', me.options );
- me.exec( 'loadFromBlob', blob );
- });
- },
-
- resize: function() {
- var args = Base.slice( arguments );
- return this.exec.apply( this, [ 'resize' ].concat( args ) );
- },
-
- getAsDataUrl: function( type ) {
- return this.exec( 'getAsDataUrl', type );
- },
-
- getAsBlob: function( type ) {
- var blob = this.exec( 'getAsBlob', type );
-
- return new Blob( this.getRuid(), blob );
- }
- });
-
- return Image;
- });
- /**
- * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
- */
- define('widgets/image',[
- 'base',
- 'uploader',
- 'lib/image',
- 'widgets/widget'
- ], function( Base, Uploader, Image ) {
-
- var $ = Base.$,
- throttle;
-
- // 根据要处理的文件大小来节流,一次不能处理太多,会卡。
- throttle = (function( max ) {
- var occupied = 0,
- waiting = [],
- tick = function() {
- var item;
-
- while ( waiting.length && occupied < max ) {
- item = waiting.shift();
- occupied += item[ 0 ];
- item[ 1 ]();
- }
- };
-
- return function( emiter, size, cb ) {
- waiting.push([ size, cb ]);
- emiter.once( 'destroy', function() {
- occupied -= size;
- setTimeout( tick, 1 );
- });
- setTimeout( tick, 1 );
- };
- })( 5 * 1024 * 1024 );
-
- $.extend( Uploader.options, {
-
- /**
- * @property {Object} [thumb]
- * @namespace options
- * @for Uploader
- * @description 配置生成缩略图的选项。
- *
- * 默认为:
- *
- * ```javascript
- * {
- * width: 110,
- * height: 110,
- *
- * // 图片质量,只有type为`image/jpeg`的时候才有效。
- * quality: 70,
- *
- * // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
- * allowMagnify: true,
- *
- * // 是否允许裁剪。
- * crop: true,
- *
- * // 是否保留头部meta信息。
- * preserveHeaders: false,
- *
- * // 为空的话则保留原有图片格式。
- * // 否则强制转换成指定的类型。
- * type: 'image/jpeg'
- * }
- * ```
- */
- thumb: {
- width: 110,
- height: 110,
- quality: 70,
- allowMagnify: true,
- crop: true,
- preserveHeaders: false,
-
- // 为空的话则保留原有图片格式。
- // 否则强制转换成指定的类型。
- // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
- // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
- type: 'image/jpeg'
- },
-
- /**
- * @property {Object} [compress]
- * @namespace options
- * @for Uploader
- * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。
- *
- * 默认为:
- *
- * ```javascript
- * {
- * width: 1600,
- * height: 1600,
- *
- * // 图片质量,只有type为`image/jpeg`的时候才有效。
- * quality: 90,
- *
- * // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
- * allowMagnify: false,
- *
- * // 是否允许裁剪。
- * crop: false,
- *
- * // 是否保留头部meta信息。
- * preserveHeaders: true
- * }
- * ```
- */
- compress: {
- width: 1600,
- height: 1600,
- quality: 90,
- allowMagnify: false,
- crop: false,
- preserveHeaders: true
- }
- });
-
- return Uploader.register({
- 'make-thumb': 'makeThumb',
- 'before-send-file': 'compressImage'
- }, {
-
-
- /**
- * 生成缩略图,此过程为异步,所以需要传入`callback`。
- * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
- *
- * `callback`中可以接收到两个参数。
- * * 第一个为error,如果生成缩略图有错误,此error将为真。
- * * 第二个为ret, 缩略图的Data URL值。
- *
- * **注意**
- * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。
- *
- *
- * @method makeThumb
- * @grammar makeThumb( file, callback ) => undefined
- * @grammar makeThumb( file, callback, width, height ) => undefined
- * @for Uploader
- * @example
- *
- * uploader.on( 'fileQueued', function( file ) {
- * var $li = ...;
- *
- * uploader.makeThumb( file, function( error, ret ) {
- * if ( error ) {
- * $li.text('预览错误');
- * } else {
- * $li.append('
');
- * }
- * });
- *
- * });
- */
- makeThumb: function( file, cb, width, height ) {
- var opts, image;
-
- file = this.request( 'get-file', file );
-
- // 只预览图片格式。
- if ( !file.type.match( /^image/ ) ) {
- cb( true );
- return;
- }
-
- opts = $.extend({}, this.options.thumb );
-
- // 如果传入的是object.
- if ( $.isPlainObject( width ) ) {
- opts = $.extend( opts, width );
- width = null;
- }
-
- width = width || opts.width;
- height = height || opts.height;
-
- image = new Image( opts );
-
- image.once( 'load', function() {
- file._info = file._info || image.info();
- file._meta = file._meta || image.meta();
- image.resize( width, height );
- });
-
- image.once( 'complete', function() {
- cb( false, image.getAsDataUrl( opts.type ) );
- image.destroy();
- });
-
- image.once( 'error', function() {
- cb( true );
- image.destroy();
- });
-
- throttle( image, file.source.size, function() {
- file._info && image.info( file._info );
- file._meta && image.meta( file._meta );
- image.loadFromBlob( file.source );
- });
- },
-
- compressImage: function( file ) {
- var opts = this.options.compress || this.options.resize,
- compressSize = opts && opts.compressSize || 300 * 1024,
- image, deferred;
-
- file = this.request( 'get-file', file );
-
- // 只预览图片格式。
- if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||
- file.size < compressSize ||
- file._compressed ) {
- return;
- }
-
- opts = $.extend({}, opts );
- deferred = Base.Deferred();
-
- image = new Image( opts );
-
- deferred.always(function() {
- image.destroy();
- image = null;
- });
- image.once( 'error', deferred.reject );
- image.once( 'load', function() {
- file._info = file._info || image.info();
- file._meta = file._meta || image.meta();
- image.resize( opts.width, opts.height );
- });
-
- image.once( 'complete', function() {
- var blob, size;
-
- // 移动端 UC / qq 浏览器的无图模式下
- // ctx.getImageData 处理大图的时候会报 Exception
- // INDEX_SIZE_ERR: DOM Exception 1
- try {
- blob = image.getAsBlob( opts.type );
-
- size = file.size;
-
- // 如果压缩后,比原来还大则不用压缩后的。
- if ( blob.size < size ) {
- // file.source.destroy && file.source.destroy();
- file.source = blob;
- file.size = blob.size;
-
- file.trigger( 'resize', blob.size, size );
- }
-
- // 标记,避免重复压缩。
- file._compressed = true;
- deferred.resolve();
- } catch ( e ) {
- // 出错了直接继续,让其上传原始图片
- deferred.resolve();
- }
- });
-
- file._info && image.info( file._info );
- file._meta && image.meta( file._meta );
-
- image.loadFromBlob( file.source );
- return deferred.promise();
- }
- });
- });
- /**
- * @fileOverview 文件属性封装
- */
- define('file',[
- 'base',
- 'mediator'
- ], function( Base, Mediator ) {
-
- var $ = Base.$,
- idPrefix = 'WU_FILE_',
- idSuffix = 0,
- rExt = /\.([^.]+)$/,
- statusMap = {};
-
- function gid() {
- return idPrefix + idSuffix++;
- }
-
- /**
- * 文件类
- * @class File
- * @constructor 构造函数
- * @grammar new File( source ) => File
- * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
- */
- function WUFile( source ) {
-
- /**
- * 文件名,包括扩展名(后缀)
- * @property name
- * @type {string}
- */
- this.name = source.name || 'Untitled';
-
- /**
- * 文件体积(字节)
- * @property size
- * @type {uint}
- * @default 0
- */
- this.size = source.size || 0;
-
- /**
- * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
- * @property type
- * @type {string}
- * @default 'application'
- */
- this.type = source.type || 'application';
-
- /**
- * 文件最后修改日期
- * @property lastModifiedDate
- * @type {int}
- * @default 当前时间戳
- */
- this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
-
- /**
- * 文件ID,每个对象具有唯一ID,与文件名无关
- * @property id
- * @type {string}
- */
- this.id = gid();
-
- /**
- * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
- * @property ext
- * @type {string}
- */
- this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
-
-
- /**
- * 状态文字说明。在不同的status语境下有不同的用途。
- * @property statusText
- * @type {string}
- */
- this.statusText = '';
-
- // 存储文件状态,防止通过属性直接修改
- statusMap[ this.id ] = WUFile.Status.INITED;
-
- this.source = source;
- this.loaded = 0;
-
- this.on( 'error', function( msg ) {
- this.setStatus( WUFile.Status.ERROR, msg );
- });
- }
-
- $.extend( WUFile.prototype, {
-
- /**
- * 设置状态,状态变化时会触发`change`事件。
- * @method setStatus
- * @grammar setStatus( status[, statusText] );
- * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
- * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
- */
- setStatus: function( status, text ) {
-
- var prevStatus = statusMap[ this.id ];
-
- typeof text !== 'undefined' && (this.statusText = text);
-
- if ( status !== prevStatus ) {
- statusMap[ this.id ] = status;
- /**
- * 文件状态变化
- * @event statuschange
- */
- this.trigger( 'statuschange', status, prevStatus );
- }
-
- },
-
- /**
- * 获取文件状态
- * @return {File.Status}
- * @example
- 文件状态具体包括以下几种类型:
- {
- // 初始化
- INITED: 0,
- // 已入队列
- QUEUED: 1,
- // 正在上传
- PROGRESS: 2,
- // 上传出错
- ERROR: 3,
- // 上传成功
- COMPLETE: 4,
- // 上传取消
- CANCELLED: 5
- }
- */
- getStatus: function() {
- return statusMap[ this.id ];
- },
-
- /**
- * 获取文件原始信息。
- * @return {*}
- */
- getSource: function() {
- return this.source;
- },
-
- destory: function() {
- delete statusMap[ this.id ];
- }
- });
-
- Mediator.installTo( WUFile.prototype );
-
- /**
- * 文件状态值,具体包括以下几种类型:
- * * `inited` 初始状态
- * * `queued` 已经进入队列, 等待上传
- * * `progress` 上传中
- * * `complete` 上传完成。
- * * `error` 上传出错,可重试
- * * `interrupt` 上传中断,可续传。
- * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
- * * `cancelled` 文件被移除。
- * @property {Object} Status
- * @namespace File
- * @class File
- * @static
- */
- WUFile.Status = {
- INITED: 'inited', // 初始状态
- QUEUED: 'queued', // 已经进入队列, 等待上传
- PROGRESS: 'progress', // 上传中
- ERROR: 'error', // 上传出错,可重试
- COMPLETE: 'complete', // 上传完成。
- CANCELLED: 'cancelled', // 上传取消。
- INTERRUPT: 'interrupt', // 上传中断,可续传。
- INVALID: 'invalid' // 文件不合格,不能重试上传。
- };
-
- return WUFile;
- });
-
- /**
- * @fileOverview 文件队列
- */
- define('queue',[
- 'base',
- 'mediator',
- 'file'
- ], function( Base, Mediator, WUFile ) {
-
- var $ = Base.$,
- STATUS = WUFile.Status;
-
- /**
- * 文件队列, 用来存储各个状态中的文件。
- * @class Queue
- * @extends Mediator
- */
- function Queue() {
-
- /**
- * 统计文件数。
- * * `numOfQueue` 队列中的文件数。
- * * `numOfSuccess` 上传成功的文件数
- * * `numOfCancel` 被移除的文件数
- * * `numOfProgress` 正在上传中的文件数
- * * `numOfUploadFailed` 上传错误的文件数。
- * * `numOfInvalid` 无效的文件数。
- * @property {Object} stats
- */
- this.stats = {
- numOfQueue: 0,
- numOfSuccess: 0,
- numOfCancel: 0,
- numOfProgress: 0,
- numOfUploadFailed: 0,
- numOfInvalid: 0
- };
-
- // 上传队列,仅包括等待上传的文件
- this._queue = [];
-
- // 存储所有文件
- this._map = {};
- }
-
- $.extend( Queue.prototype, {
-
- /**
- * 将新文件加入对队列尾部
- *
- * @method append
- * @param {File} file 文件对象
- */
- append: function( file ) {
- this._queue.push( file );
- this._fileAdded( file );
- return this;
- },
-
- /**
- * 将新文件加入对队列头部
- *
- * @method prepend
- * @param {File} file 文件对象
- */
- prepend: function( file ) {
- this._queue.unshift( file );
- this._fileAdded( file );
- return this;
- },
-
- /**
- * 获取文件对象
- *
- * @method getFile
- * @param {String} fileId 文件ID
- * @return {File}
- */
- getFile: function( fileId ) {
- if ( typeof fileId !== 'string' ) {
- return fileId;
- }
- return this._map[ fileId ];
- },
-
- /**
- * 从队列中取出一个指定状态的文件。
- * @grammar fetch( status ) => File
- * @method fetch
- * @param {String} status [文件状态值](#WebUploader:File:File.Status)
- * @return {File} [File](#WebUploader:File)
- */
- fetch: function( status ) {
- var len = this._queue.length,
- i, file;
-
- status = status || STATUS.QUEUED;
-
- for ( i = 0; i < len; i++ ) {
- file = this._queue[ i ];
-
- if ( status === file.getStatus() ) {
- return file;
- }
- }
-
- return null;
- },
-
- /**
- * 对队列进行排序,能够控制文件上传顺序。
- * @grammar sort( fn ) => undefined
- * @method sort
- * @param {Function} fn 排序方法
- */
- sort: function( fn ) {
- if ( typeof fn === 'function' ) {
- this._queue.sort( fn );
- }
- },
-
- /**
- * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
- * @grammar getFiles( [status1[, status2 ...]] ) => Array
- * @method getFiles
- * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
- */
- getFiles: function() {
- var sts = [].slice.call( arguments, 0 ),
- ret = [],
- i = 0,
- len = this._queue.length,
- file;
-
- for ( ; i < len; i++ ) {
- file = this._queue[ i ];
-
- if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
- continue;
- }
-
- ret.push( file );
- }
-
- return ret;
- },
-
- _fileAdded: function( file ) {
- var me = this,
- existing = this._map[ file.id ];
-
- if ( !existing ) {
- this._map[ file.id ] = file;
-
- file.on( 'statuschange', function( cur, pre ) {
- me._onFileStatusChange( cur, pre );
- });
- }
-
- file.setStatus( STATUS.QUEUED );
- },
-
- _onFileStatusChange: function( curStatus, preStatus ) {
- var stats = this.stats;
-
- switch ( preStatus ) {
- case STATUS.PROGRESS:
- stats.numOfProgress--;
- break;
-
- case STATUS.QUEUED:
- stats.numOfQueue --;
- break;
-
- case STATUS.ERROR:
- stats.numOfUploadFailed--;
- break;
-
- case STATUS.INVALID:
- stats.numOfInvalid--;
- break;
- }
-
- switch ( curStatus ) {
- case STATUS.QUEUED:
- stats.numOfQueue++;
- break;
-
- case STATUS.PROGRESS:
- stats.numOfProgress++;
- break;
-
- case STATUS.ERROR:
- stats.numOfUploadFailed++;
- break;
-
- case STATUS.COMPLETE:
- stats.numOfSuccess++;
- break;
-
- case STATUS.CANCELLED:
- stats.numOfCancel++;
- break;
-
- case STATUS.INVALID:
- stats.numOfInvalid++;
- break;
- }
- }
-
- });
-
- Mediator.installTo( Queue.prototype );
-
- return Queue;
- });
- /**
- * @fileOverview 队列
- */
- define('widgets/queue',[
- 'base',
- 'uploader',
- 'queue',
- 'file',
- 'lib/file',
- 'runtime/client',
- 'widgets/widget'
- ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
-
- var $ = Base.$,
- rExt = /\.\w+$/,
- Status = WUFile.Status;
-
- return Uploader.register({
- 'sort-files': 'sortFiles',
- 'add-file': 'addFiles',
- 'get-file': 'getFile',
- 'fetch-file': 'fetchFile',
- 'get-stats': 'getStats',
- 'get-files': 'getFiles',
- 'remove-file': 'removeFile',
- 'retry': 'retry',
- 'reset': 'reset',
- 'accept-file': 'acceptFile'
- }, {
-
- init: function( opts ) {
- var me = this,
- deferred, len, i, item, arr, accept, runtime;
-
- if ( $.isPlainObject( opts.accept ) ) {
- opts.accept = [ opts.accept ];
- }
-
- // accept中的中生成匹配正则。
- if ( opts.accept ) {
- arr = [];
-
- for ( i = 0, len = opts.accept.length; i < len; i++ ) {
- item = opts.accept[ i ].extensions;
- item && arr.push( item );
- }
-
- if ( arr.length ) {
- accept = '\\.' + arr.join(',')
- .replace( /,/g, '$|\\.' )
- .replace( /\*/g, '.*' ) + '$';
- }
-
- me.accept = new RegExp( accept, 'i' );
- }
-
- me.queue = new Queue();
- me.stats = me.queue.stats;
-
- // 如果当前不是html5运行时,那就算了。
- // 不执行后续操作
- if ( this.request('predict-runtime-type') !== 'html5' ) {
- return;
- }
-
- // 创建一个 html5 运行时的 placeholder
- // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
- deferred = Base.Deferred();
- runtime = new RuntimeClient('Placeholder');
- runtime.connectRuntime({
- runtimeOrder: 'html5'
- }, function() {
- me._ruid = runtime.getRuid();
- deferred.resolve();
- });
- return deferred.promise();
- },
-
-
- // 为了支持外部直接添加一个原生File对象。
- _wrapFile: function( file ) {
- if ( !(file instanceof WUFile) ) {
-
- if ( !(file instanceof File) ) {
- if ( !this._ruid ) {
- throw new Error('Can\'t add external files.');
- }
- file = new File( this._ruid, file );
- }
-
- file = new WUFile( file );
- }
-
- return file;
- },
-
- // 判断文件是否可以被加入队列
- acceptFile: function( file ) {
- var invalid = !file || file.size < 6 || this.accept &&
-
- // 如果名字中有后缀,才做后缀白名单处理。
- rExt.exec( file.name ) && !this.accept.test( file.name );
-
- return !invalid;
- },
-
-
- /**
- * @event beforeFileQueued
- * @param {File} file File对象
- * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
- * @for Uploader
- */
-
- /**
- * @event fileQueued
- * @param {File} file File对象
- * @description 当文件被加入队列以后触发。
- * @for Uploader
- */
-
- _addFile: function( file ) {
- var me = this;
-
- file = me._wrapFile( file );
-
- // 不过类型判断允许不允许,先派送 `beforeFileQueued`
- if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
- return;
- }
-
- // 类型不匹配,则派送错误事件,并返回。
- if ( !me.acceptFile( file ) ) {
- me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
- return;
- }
-
- me.queue.append( file );
- me.owner.trigger( 'fileQueued', file );
- return file;
- },
-
- getFile: function( fileId ) {
- return this.queue.getFile( fileId );
- },
-
- /**
- * @event filesQueued
- * @param {File} files 数组,内容为原始File(lib/File)对象。
- * @description 当一批文件添加进队列以后触发。
- * @for Uploader
- */
-
- /**
- * @method addFiles
- * @grammar addFiles( file ) => undefined
- * @grammar addFiles( [file1, file2 ...] ) => undefined
- * @param {Array of File or File} [files] Files 对象 数组
- * @description 添加文件到队列
- * @for Uploader
- */
- addFiles: function( files ) {
- var me = this;
-
- if ( !files.length ) {
- files = [ files ];
- }
-
- files = $.map( files, function( file ) {
- return me._addFile( file );
- });
-
- me.owner.trigger( 'filesQueued', files );
-
- if ( me.options.auto ) {
- me.request('start-upload');
- }
- },
-
- getStats: function() {
- return this.stats;
- },
-
- /**
- * @event fileDequeued
- * @param {File} file File对象
- * @description 当文件被移除队列后触发。
- * @for Uploader
- */
-
- /**
- * @method removeFile
- * @grammar removeFile( file ) => undefined
- * @grammar removeFile( id ) => undefined
- * @param {File|id} file File对象或这File对象的id
- * @description 移除某一文件。
- * @for Uploader
- * @example
- *
- * $li.on('click', '.remove-this', function() {
- * uploader.removeFile( file );
- * })
- */
- removeFile: function( file ) {
- var me = this;
-
- file = file.id ? file : me.queue.getFile( file );
-
- file.setStatus( Status.CANCELLED );
- me.owner.trigger( 'fileDequeued', file );
- },
-
- /**
- * @method getFiles
- * @grammar getFiles() => Array
- * @grammar getFiles( status1, status2, status... ) => Array
- * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
- * @for Uploader
- * @example
- * console.log( uploader.getFiles() ); // => all files
- * console.log( uploader.getFiles('error') ) // => all error files.
- */
- getFiles: function() {
- return this.queue.getFiles.apply( this.queue, arguments );
- },
-
- fetchFile: function() {
- return this.queue.fetch.apply( this.queue, arguments );
- },
-
- /**
- * @method retry
- * @grammar retry() => undefined
- * @grammar retry( file ) => undefined
- * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
- * @for Uploader
- * @example
- * function retry() {
- * uploader.retry();
- * }
- */
- retry: function( file, noForceStart ) {
- var me = this,
- files, i, len;
-
- if ( file ) {
- file = file.id ? file : me.queue.getFile( file );
- file.setStatus( Status.QUEUED );
- noForceStart || me.request('start-upload');
- return;
- }
-
- files = me.queue.getFiles( Status.ERROR );
- i = 0;
- len = files.length;
-
- for ( ; i < len; i++ ) {
- file = files[ i ];
- file.setStatus( Status.QUEUED );
- }
-
- me.request('start-upload');
- },
-
- /**
- * @method sort
- * @grammar sort( fn ) => undefined
- * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
- * @for Uploader
- */
- sortFiles: function() {
- return this.queue.sort.apply( this.queue, arguments );
- },
-
- /**
- * @method reset
- * @grammar reset() => undefined
- * @description 重置uploader。目前只重置了队列。
- * @for Uploader
- * @example
- * uploader.reset();
- */
- reset: function() {
- this.queue = new Queue();
- this.stats = this.queue.stats;
- }
- });
-
- });
- /**
- * @fileOverview 添加获取Runtime相关信息的方法。
- */
- define('widgets/runtime',[
- 'uploader',
- 'runtime/runtime',
- 'widgets/widget'
- ], function( Uploader, Runtime ) {
-
- Uploader.support = function() {
- return Runtime.hasRuntime.apply( Runtime, arguments );
- };
-
- return Uploader.register({
- 'predict-runtime-type': 'predictRuntmeType'
- }, {
-
- init: function() {
- if ( !this.predictRuntmeType() ) {
- throw Error('Runtime Error');
- }
- },
-
- /**
- * 预测Uploader将采用哪个`Runtime`
- * @grammar predictRuntmeType() => String
- * @method predictRuntmeType
- * @for Uploader
- */
- predictRuntmeType: function() {
- var orders = this.options.runtimeOrder || Runtime.orders,
- type = this.type,
- i, len;
-
- if ( !type ) {
- orders = orders.split( /\s*,\s*/g );
-
- for ( i = 0, len = orders.length; i < len; i++ ) {
- if ( Runtime.hasRuntime( orders[ i ] ) ) {
- this.type = type = orders[ i ];
- break;
- }
- }
- }
-
- return type;
- }
- });
- });
- /**
- * @fileOverview Transport
- */
- define('lib/transport',[
- 'base',
- 'runtime/client',
- 'mediator'
- ], function( Base, RuntimeClient, Mediator ) {
-
- var $ = Base.$;
-
- function Transport( opts ) {
- var me = this;
-
- opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
- RuntimeClient.call( this, 'Transport' );
-
- this._blob = null;
- this._formData = opts.formData || {};
- this._headers = opts.headers || {};
-
- this.on( 'progress', this._timeout );
- this.on( 'load error', function() {
- me.trigger( 'progress', 1 );
- clearTimeout( me._timer );
- });
- }
-
- Transport.options = {
- server: '',
- method: 'POST',
-
- // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
- withCredentials: false,
- fileVal: 'file',
- timeout: 2 * 60 * 1000, // 2分钟
- formData: {},
- headers: {},
- sendAsBinary: false
- };
-
- $.extend( Transport.prototype, {
-
- // 添加Blob, 只能添加一次,最后一次有效。
- appendBlob: function( key, blob, filename ) {
- var me = this,
- opts = me.options;
-
- if ( me.getRuid() ) {
- me.disconnectRuntime();
- }
-
- // 连接到blob归属的同一个runtime.
- me.connectRuntime( blob.ruid, function() {
- me.exec('init');
- });
-
- me._blob = blob;
- opts.fileVal = key || opts.fileVal;
- opts.filename = filename || opts.filename;
- },
-
- // 添加其他字段
- append: function( key, value ) {
- if ( typeof key === 'object' ) {
- $.extend( this._formData, key );
- } else {
- this._formData[ key ] = value;
- }
- },
-
- setRequestHeader: function( key, value ) {
- if ( typeof key === 'object' ) {
- $.extend( this._headers, key );
- } else {
- this._headers[ key ] = value;
- }
- },
-
- send: function( method ) {
- this.exec( 'send', method );
- this._timeout();
- },
-
- abort: function() {
- clearTimeout( this._timer );
- return this.exec('abort');
- },
-
- destroy: function() {
- this.trigger('destroy');
- this.off();
- this.exec('destroy');
- this.disconnectRuntime();
- },
-
- getResponse: function() {
- return this.exec('getResponse');
- },
-
- getResponseAsJson: function() {
- return this.exec('getResponseAsJson');
- },
-
- getStatus: function() {
- return this.exec('getStatus');
- },
-
- _timeout: function() {
- var me = this,
- duration = me.options.timeout;
-
- if ( !duration ) {
- return;
- }
-
- clearTimeout( me._timer );
- me._timer = setTimeout(function() {
- me.abort();
- me.trigger( 'error', 'timeout' );
- }, duration );
- }
-
- });
-
- // 让Transport具备事件功能。
- Mediator.installTo( Transport.prototype );
-
- return Transport;
- });
- /**
- * @fileOverview 负责文件上传相关。
- */
- define('widgets/upload',[
- 'base',
- 'uploader',
- 'file',
- 'lib/transport',
- 'widgets/widget'
- ], function( Base, Uploader, WUFile, Transport ) {
-
- var $ = Base.$,
- isPromise = Base.isPromise,
- Status = WUFile.Status;
-
- // 添加默认配置项
- $.extend( Uploader.options, {
-
-
- /**
- * @property {Boolean} [prepareNextFile=false]
- * @namespace options
- * @for Uploader
- * @description 是否允许在文件传输时提前把下一个文件准备好。
- * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
- * 如果能提前在当前文件传输期处理,可以节省总体耗时。
- */
- prepareNextFile: false,
-
- /**
- * @property {Boolean} [chunked=false]
- * @namespace options
- * @for Uploader
- * @description 是否要分片处理大文件上传。
- */
- chunked: false,
-
- /**
- * @property {Boolean} [chunkSize=5242880]
- * @namespace options
- * @for Uploader
- * @description 如果要分片,分多大一片? 默认大小为5M.
- */
- chunkSize: 5 * 1024 * 1024,
-
- /**
- * @property {Boolean} [chunkRetry=2]
- * @namespace options
- * @for Uploader
- * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
- */
- chunkRetry: 2,
-
- /**
- * @property {Boolean} [threads=3]
- * @namespace options
- * @for Uploader
- * @description 上传并发数。允许同时最大上传进程数。
- */
- threads: 3,
-
-
- /**
- * @property {Object} [formData]
- * @namespace options
- * @for Uploader
- * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
- */
- formData: null
-
- /**
- * @property {Object} [fileVal='file']
- * @namespace options
- * @for Uploader
- * @description 设置文件上传域的name。
- */
-
- /**
- * @property {Object} [method='POST']
- * @namespace options
- * @for Uploader
- * @description 文件上传方式,`POST`或者`GET`。
- */
-
- /**
- * @property {Object} [sendAsBinary=false]
- * @namespace options
- * @for Uploader
- * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
- * 其他参数在$_GET数组中。
- */
- });
-
- // 负责将文件切片。
- function CuteFile( file, chunkSize ) {
- var pending = [],
- blob = file.source,
- total = blob.size,
- chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
- start = 0,
- index = 0,
- len;
-
- while ( index < chunks ) {
- len = Math.min( chunkSize, total - start );
-
- pending.push({
- file: file,
- start: start,
- end: chunkSize ? (start + len) : total,
- total: total,
- chunks: chunks,
- chunk: index++
- });
- start += len;
- }
-
- file.blocks = pending.concat();
- file.remaning = pending.length;
-
- return {
- file: file,
-
- has: function() {
- return !!pending.length;
- },
-
- fetch: function() {
- return pending.shift();
- }
- };
- }
-
- Uploader.register({
- 'start-upload': 'start',
- 'stop-upload': 'stop',
- 'skip-file': 'skipFile',
- 'is-in-progress': 'isInProgress'
- }, {
-
- init: function() {
- var owner = this.owner;
-
- this.runing = false;
-
- // 记录当前正在传的数据,跟threads相关
- this.pool = [];
-
- // 缓存即将上传的文件。
- this.pending = [];
-
- // 跟踪还有多少分片没有完成上传。
- this.remaning = 0;
- this.__tick = Base.bindFn( this._tick, this );
-
- owner.on( 'uploadComplete', function( file ) {
- // 把其他块取消了。
- file.blocks && $.each( file.blocks, function( _, v ) {
- v.transport && (v.transport.abort(), v.transport.destroy());
- delete v.transport;
- });
-
- delete file.blocks;
- delete file.remaning;
- });
- },
-
- /**
- * @event startUpload
- * @description 当开始上传流程时触发。
- * @for Uploader
- */
-
- /**
- * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
- * @grammar upload() => undefined
- * @method upload
- * @for Uploader
- */
- start: function() {
- var me = this;
-
- // 移出invalid的文件
- $.each( me.request( 'get-files', Status.INVALID ), function() {
- me.request( 'remove-file', this );
- });
-
- if ( me.runing ) {
- return;
- }
-
- me.runing = true;
-
- // 如果有暂停的,则续传
- $.each( me.pool, function( _, v ) {
- var file = v.file;
-
- if ( file.getStatus() === Status.INTERRUPT ) {
- file.setStatus( Status.PROGRESS );
- me._trigged = false;
- v.transport && v.transport.send();
- }
- });
-
- me._trigged = false;
- me.owner.trigger('startUpload');
- Base.nextTick( me.__tick );
- },
-
- /**
- * @event stopUpload
- * @description 当开始上传流程暂停时触发。
- * @for Uploader
- */
-
- /**
- * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
- * @grammar stop() => undefined
- * @grammar stop( true ) => undefined
- * @method stop
- * @for Uploader
- */
- stop: function( interrupt ) {
- var me = this;
-
- if ( me.runing === false ) {
- return;
- }
-
- me.runing = false;
-
- interrupt && $.each( me.pool, function( _, v ) {
- v.transport && v.transport.abort();
- v.file.setStatus( Status.INTERRUPT );
- });
-
- me.owner.trigger('stopUpload');
- },
-
- /**
- * 判断`Uplaode`r是否正在上传中。
- * @grammar isInProgress() => Boolean
- * @method isInProgress
- * @for Uploader
- */
- isInProgress: function() {
- return !!this.runing;
- },
-
- getStats: function() {
- return this.request('get-stats');
- },
-
- /**
- * 掉过一个文件上传,直接标记指定文件为已上传状态。
- * @grammar skipFile( file ) => undefined
- * @method skipFile
- * @for Uploader
- */
- skipFile: function( file, status ) {
- file = this.request( 'get-file', file );
-
- file.setStatus( status || Status.COMPLETE );
- file.skipped = true;
-
- // 如果正在上传。
- file.blocks && $.each( file.blocks, function( _, v ) {
- var _tr = v.transport;
-
- if ( _tr ) {
- _tr.abort();
- _tr.destroy();
- delete v.transport;
- }
- });
-
- this.owner.trigger( 'uploadSkip', file );
- },
-
- /**
- * @event uploadFinished
- * @description 当所有文件上传结束时触发。
- * @for Uploader
- */
- _tick: function() {
- var me = this,
- opts = me.options,
- fn, val;
-
- // 上一个promise还没有结束,则等待完成后再执行。
- if ( me._promise ) {
- return me._promise.always( me.__tick );
- }
-
- // 还有位置,且还有文件要处理的话。
- if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
- me._trigged = false;
-
- fn = function( val ) {
- me._promise = null;
-
- // 有可能是reject过来的,所以要检测val的类型。
- val && val.file && me._startSend( val );
- Base.nextTick( me.__tick );
- };
-
- me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
-
- // 没有要上传的了,且没有正在传输的了。
- } else if ( !me.remaning && !me.getStats().numOfQueue ) {
- me.runing = false;
-
- me._trigged || Base.nextTick(function() {
- me.owner.trigger('uploadFinished');
- });
- me._trigged = true;
- }
- },
-
- _nextBlock: function() {
- var me = this,
- act = me._act,
- opts = me.options,
- next, done;
-
- // 如果当前文件还有没有需要传输的,则直接返回剩下的。
- if ( act && act.has() &&
- act.file.getStatus() === Status.PROGRESS ) {
-
- // 是否提前准备下一个文件
- if ( opts.prepareNextFile && !me.pending.length ) {
- me._prepareNextFile();
- }
-
- return act.fetch();
-
- // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
- } else if ( me.runing ) {
-
- // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
- if ( !me.pending.length && me.getStats().numOfQueue ) {
- me._prepareNextFile();
- }
-
- next = me.pending.shift();
- done = function( file ) {
- if ( !file ) {
- return null;
- }
-
- act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
- me._act = act;
- return act.fetch();
- };
-
- // 文件可能还在prepare中,也有可能已经完全准备好了。
- return isPromise( next ) ?
- next[ next.pipe ? 'pipe' : 'then']( done ) :
- done( next );
- }
- },
-
-
- /**
- * @event uploadStart
- * @param {File} file File对象
- * @description 某个文件开始上传前触发,一个文件只会触发一次。
- * @for Uploader
- */
- _prepareNextFile: function() {
- var me = this,
- file = me.request('fetch-file'),
- pending = me.pending,
- promise;
-
- if ( file ) {
- promise = me.request( 'before-send-file', file, function() {
-
- // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
- if ( file.getStatus() === Status.QUEUED ) {
- me.owner.trigger( 'uploadStart', file );
- file.setStatus( Status.PROGRESS );
- return file;
- }
-
- return me._finishFile( file );
- });
-
- // 如果还在pending中,则替换成文件本身。
- promise.done(function() {
- var idx = $.inArray( promise, pending );
-
- ~idx && pending.splice( idx, 1, file );
- });
-
- // befeore-send-file的钩子就有错误发生。
- promise.fail(function( reason ) {
- file.setStatus( Status.ERROR, reason );
- me.owner.trigger( 'uploadError', file, reason );
- me.owner.trigger( 'uploadComplete', file );
- });
-
- pending.push( promise );
- }
- },
-
- // 让出位置了,可以让其他分片开始上传
- _popBlock: function( block ) {
- var idx = $.inArray( block, this.pool );
-
- this.pool.splice( idx, 1 );
- block.file.remaning--;
- this.remaning--;
- },
-
- // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
- _startSend: function( block ) {
- var me = this,
- file = block.file,
- promise;
-
- me.pool.push( block );
- me.remaning++;
-
- // 如果没有分片,则直接使用原始的。
- // 不会丢失content-type信息。
- block.blob = block.chunks === 1 ? file.source :
- file.source.slice( block.start, block.end );
-
- // hook, 每个分片发送之前可能要做些异步的事情。
- promise = me.request( 'before-send', block, function() {
-
- // 有可能文件已经上传出错了,所以不需要再传输了。
- if ( file.getStatus() === Status.PROGRESS ) {
- me._doSend( block );
- } else {
- me._popBlock( block );
- Base.nextTick( me.__tick );
- }
- });
-
- // 如果为fail了,则跳过此分片。
- promise.fail(function() {
- if ( file.remaning === 1 ) {
- me._finishFile( file ).always(function() {
- block.percentage = 1;
- me._popBlock( block );
- me.owner.trigger( 'uploadComplete', file );
- Base.nextTick( me.__tick );
- });
- } else {
- block.percentage = 1;
- me._popBlock( block );
- Base.nextTick( me.__tick );
- }
- });
- },
-
-
- /**
- * @event uploadBeforeSend
- * @param {Object} object
- * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
- * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
- * @for Uploader
- */
-
- /**
- * @event uploadAccept
- * @param {Object} object
- * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
- * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
- * @for Uploader
- */
-
- /**
- * @event uploadProgress
- * @param {File} file File对象
- * @param {Number} percentage 上传进度
- * @description 上传过程中触发,携带上传进度。
- * @for Uploader
- */
-
-
- /**
- * @event uploadError
- * @param {File} file File对象
- * @param {String} reason 出错的code
- * @description 当文件上传出错时触发。
- * @for Uploader
- */
-
- /**
- * @event uploadSuccess
- * @param {File} file File对象
- * @param {Object} response 服务端返回的数据
- * @description 当文件上传成功时触发。
- * @for Uploader
- */
-
- /**
- * @event uploadComplete
- * @param {File} [file] File对象
- * @description 不管成功或者失败,文件上传完成时触发。
- * @for Uploader
- */
-
- // 做上传操作。
- _doSend: function( block ) {
- var me = this,
- owner = me.owner,
- opts = me.options,
- file = block.file,
- tr = new Transport( opts ),
- data = $.extend({}, opts.formData ),
- headers = $.extend({}, opts.headers ),
- requestAccept, ret;
-
- block.transport = tr;
-
- tr.on( 'destroy', function() {
- delete block.transport;
- me._popBlock( block );
- Base.nextTick( me.__tick );
- });
-
- // 广播上传进度。以文件为单位。
- tr.on( 'progress', function( percentage ) {
- var totalPercent = 0,
- uploaded = 0;
-
- // 可能没有abort掉,progress还是执行进来了。
- // if ( !file.blocks ) {
- // return;
- // }
-
- totalPercent = block.percentage = percentage;
-
- if ( block.chunks > 1 ) { // 计算文件的整体速度。
- $.each( file.blocks, function( _, v ) {
- uploaded += (v.percentage || 0) * (v.end - v.start);
- });
-
- totalPercent = uploaded / file.size;
- }
-
- owner.trigger( 'uploadProgress', file, totalPercent || 0 );
- });
-
- // 用来询问,是否返回的结果是有错误的。
- requestAccept = function( reject ) {
- var fn;
-
- ret = tr.getResponseAsJson() || {};
- ret._raw = tr.getResponse();
- fn = function( value ) {
- reject = value;
- };
-
- // 服务端响应了,不代表成功了,询问是否响应正确。
- if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
- reject = reject || 'server';
- }
-
- return reject;
- };
-
- // 尝试重试,然后广播文件上传出错。
- tr.on( 'error', function( type, flag ) {
- block.retried = block.retried || 0;
-
- // 自动重试
- if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
- block.retried < opts.chunkRetry ) {
-
- block.retried++;
- tr.send();
-
- } else {
-
- // http status 500 ~ 600
- if ( !flag && type === 'server' ) {
- type = requestAccept( type );
- }
-
- file.setStatus( Status.ERROR, type );
- owner.trigger( 'uploadError', file, type );
- owner.trigger( 'uploadComplete', file );
- }
- });
-
- // 上传成功
- tr.on( 'load', function() {
- var reason;
-
- // 如果非预期,转向上传出错。
- if ( (reason = requestAccept()) ) {
- tr.trigger( 'error', reason, true );
- return;
- }
-
- // 全部上传完成。
- if ( file.remaning === 1 ) {
- me._finishFile( file, ret );
- } else {
- tr.destroy();
- }
- });
-
- // 配置默认的上传字段。
- data = $.extend( data, {
- id: file.id,
- name: file.name,
- type: file.type,
- lastModifiedDate: file.lastModifiedDate,
- size: file.size
- });
-
- block.chunks > 1 && $.extend( data, {
- chunks: block.chunks,
- chunk: block.chunk
- });
-
- // 在发送之间可以添加字段什么的。。。
- // 如果默认的字段不够使用,可以通过监听此事件来扩展
- owner.trigger( 'uploadBeforeSend', block, data, headers );
-
- // 开始发送。
- tr.appendBlob( opts.fileVal, block.blob, file.name );
- tr.append( data );
- tr.setRequestHeader( headers );
- tr.send();
- },
-
- // 完成上传。
- _finishFile: function( file, ret, hds ) {
- var owner = this.owner;
-
- return owner
- .request( 'after-send-file', arguments, function() {
- file.setStatus( Status.COMPLETE );
- owner.trigger( 'uploadSuccess', file, ret, hds );
- })
- .fail(function( reason ) {
-
- // 如果外部已经标记为invalid什么的,不再改状态。
- if ( file.getStatus() === Status.PROGRESS ) {
- file.setStatus( Status.ERROR, reason );
- }
-
- owner.trigger( 'uploadError', file, reason );
- })
- .always(function() {
- owner.trigger( 'uploadComplete', file );
- });
- }
-
- });
- });
- /**
- * @fileOverview Runtime管理器,负责Runtime的选择, 连接
- */
- define('runtime/compbase',[],function() {
-
- function CompBase( owner, runtime ) {
-
- this.owner = owner;
- this.options = owner.options;
-
- this.getRuntime = function() {
- return runtime;
- };
-
- this.getRuid = function() {
- return runtime.uid;
- };
-
- this.trigger = function() {
- return owner.trigger.apply( owner, arguments );
- };
- }
-
- return CompBase;
- });
- /**
- * @fileOverview Html5Runtime
- */
- define('runtime/html5/runtime',[
- 'base',
- 'runtime/runtime',
- 'runtime/compbase'
- ], function( Base, Runtime, CompBase ) {
-
- var type = 'html5',
- components = {};
-
- function Html5Runtime() {
- var pool = {},
- me = this,
- destory = this.destory;
-
- Runtime.apply( me, arguments );
- me.type = type;
-
-
- // 这个方法的调用者,实际上是RuntimeClient
- me.exec = function( comp, fn/*, args...*/) {
- var client = this,
- uid = client.uid,
- args = Base.slice( arguments, 2 ),
- instance;
-
- if ( components[ comp ] ) {
- instance = pool[ uid ] = pool[ uid ] ||
- new components[ comp ]( client, me );
-
- if ( instance[ fn ] ) {
- return instance[ fn ].apply( instance, args );
- }
- }
- };
-
- me.destory = function() {
- // @todo 删除池子中的所有实例
- return destory && destory.apply( this, arguments );
- };
- }
-
- Base.inherits( Runtime, {
- constructor: Html5Runtime,
-
- // 不需要连接其他程序,直接执行callback
- init: function() {
- var me = this;
- setTimeout(function() {
- me.trigger('ready');
- }, 1 );
- }
-
- });
-
- // 注册Components
- Html5Runtime.register = function( name, component ) {
- var klass = components[ name ] = Base.inherits( CompBase, component );
- return klass;
- };
-
- // 注册html5运行时。
- // 只有在支持的前提下注册。
- if ( window.Blob && window.FileReader && window.DataView ) {
- Runtime.addRuntime( type, Html5Runtime );
- }
-
- return Html5Runtime;
- });
- /**
- * @fileOverview Blob Html实现
- */
- define('runtime/html5/blob',[
- 'runtime/html5/runtime',
- 'lib/blob'
- ], function( Html5Runtime, Blob ) {
-
- return Html5Runtime.register( 'Blob', {
- slice: function( start, end ) {
- var blob = this.owner.source,
- slice = blob.slice || blob.webkitSlice || blob.mozSlice;
-
- blob = slice.call( blob, start, end );
-
- return new Blob( this.getRuid(), blob );
- }
- });
- });
- /**
- * @fileOverview FilePicker
- */
- define('runtime/html5/filepicker',[
- 'base',
- 'runtime/html5/runtime'
- ], function( Base, Html5Runtime ) {
-
- var $ = Base.$;
-
- return Html5Runtime.register( 'FilePicker', {
- init: function() {
- var container = this.getRuntime().getContainer(),
- me = this,
- owner = me.owner,
- opts = me.options,
- lable = $( document.createElement('label') ),
- input = $( document.createElement('input') ),
- arr, i, len, mouseHandler;
-
- input.attr( 'type', 'file' );
- input.attr( 'name', opts.name );
- input.addClass('webuploader-element-invisible');
-
- lable.on( 'click', function() {
- input.trigger('click');
- });
-
- lable.css({
- opacity: 0,
- width: '100%',
- height: '100%',
- display: 'block',
- cursor: 'pointer',
- background: '#ffffff'
- });
-
- if ( opts.multiple ) {
- input.attr( 'multiple', 'multiple' );
- }
-
- // @todo Firefox不支持单独指定后缀
- if ( opts.accept && opts.accept.length > 0 ) {
- arr = [];
-
- for ( i = 0, len = opts.accept.length; i < len; i++ ) {
- arr.push( opts.accept[ i ].mimeTypes );
- }
-
- input.attr( 'accept', arr.join(',') );
- }
-
- container.append( input );
- container.append( lable );
-
- mouseHandler = function( e ) {
- owner.trigger( e.type );
- };
-
- input.on( 'change', function( e ) {
- var fn = arguments.callee,
- clone;
-
- me.files = e.target.files;
-
- // reset input
- clone = this.cloneNode( true );
- this.parentNode.replaceChild( clone, this );
-
- input.off();
- input = $( clone ).on( 'change', fn )
- .on( 'mouseenter mouseleave', mouseHandler );
-
- owner.trigger('change');
- });
-
- lable.on( 'mouseenter mouseleave', mouseHandler );
-
- },
-
-
- getFiles: function() {
- return this.files;
- },
-
- destroy: function() {
- // todo
- }
- });
- });
- /**
- * Terms:
- *
- * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
- * @fileOverview Image控件
- */
- define('runtime/html5/util',[
- 'base'
- ], function( Base ) {
-
- var urlAPI = window.createObjectURL && window ||
- window.URL && URL.revokeObjectURL && URL ||
- window.webkitURL,
- createObjectURL = Base.noop,
- revokeObjectURL = createObjectURL;
-
- if ( urlAPI ) {
-
- // 更安全的方式调用,比如android里面就能把context改成其他的对象。
- createObjectURL = function() {
- return urlAPI.createObjectURL.apply( urlAPI, arguments );
- };
-
- revokeObjectURL = function() {
- return urlAPI.revokeObjectURL.apply( urlAPI, arguments );
- };
- }
-
- return {
- createObjectURL: createObjectURL,
- revokeObjectURL: revokeObjectURL,
-
- dataURL2Blob: function( dataURI ) {
- var byteStr, intArray, ab, i, mimetype, parts;
-
- parts = dataURI.split(',');
-
- if ( ~parts[ 0 ].indexOf('base64') ) {
- byteStr = atob( parts[ 1 ] );
- } else {
- byteStr = decodeURIComponent( parts[ 1 ] );
- }
-
- ab = new ArrayBuffer( byteStr.length );
- intArray = new Uint8Array( ab );
-
- for ( i = 0; i < byteStr.length; i++ ) {
- intArray[ i ] = byteStr.charCodeAt( i );
- }
-
- mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ];
-
- return this.arrayBufferToBlob( ab, mimetype );
- },
-
- dataURL2ArrayBuffer: function( dataURI ) {
- var byteStr, intArray, i, parts;
-
- parts = dataURI.split(',');
-
- if ( ~parts[ 0 ].indexOf('base64') ) {
- byteStr = atob( parts[ 1 ] );
- } else {
- byteStr = decodeURIComponent( parts[ 1 ] );
- }
-
- intArray = new Uint8Array( byteStr.length );
-
- for ( i = 0; i < byteStr.length; i++ ) {
- intArray[ i ] = byteStr.charCodeAt( i );
- }
-
- return intArray.buffer;
- },
-
- arrayBufferToBlob: function( buffer, type ) {
- var builder = window.BlobBuilder || window.WebKitBlobBuilder,
- bb;
-
- // android不支持直接new Blob, 只能借助blobbuilder.
- if ( builder ) {
- bb = new builder();
- bb.append( buffer );
- return bb.getBlob( type );
- }
-
- return new Blob([ buffer ], type ? { type: type } : {} );
- },
-
- // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg.
- // 你得到的结果是png.
- canvasToDataUrl: function( canvas, type, quality ) {
- return canvas.toDataURL( type, quality / 100 );
- },
-
- // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
- parseMeta: function( blob, callback ) {
- callback( false, {});
- },
-
- // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
- updateImageHead: function( data ) {
- return data;
- }
- };
- });
- /**
- * Terms:
- *
- * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
- * @fileOverview Image控件
- */
- define('runtime/html5/imagemeta',[
- 'runtime/html5/util'
- ], function( Util ) {
-
- var api;
-
- api = {
- parsers: {
- 0xffe1: []
- },
-
- maxMetaDataSize: 262144,
-
- parse: function( blob, cb ) {
- var me = this,
- fr = new FileReader();
-
- fr.onload = function() {
- cb( false, me._parse( this.result ) );
- fr = fr.onload = fr.onerror = null;
- };
-
- fr.onerror = function( e ) {
- cb( e.message );
- fr = fr.onload = fr.onerror = null;
- };
-
- blob = blob.slice( 0, me.maxMetaDataSize );
- fr.readAsArrayBuffer( blob.getSource() );
- },
-
- _parse: function( buffer, noParse ) {
- if ( buffer.byteLength < 6 ) {
- return;
- }
-
- var dataview = new DataView( buffer ),
- offset = 2,
- maxOffset = dataview.byteLength - 4,
- headLength = offset,
- ret = {},
- markerBytes, markerLength, parsers, i;
-
- if ( dataview.getUint16( 0 ) === 0xffd8 ) {
-
- while ( offset < maxOffset ) {
- markerBytes = dataview.getUint16( offset );
-
- if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef ||
- markerBytes === 0xfffe ) {
-
- markerLength = dataview.getUint16( offset + 2 ) + 2;
-
- if ( offset + markerLength > dataview.byteLength ) {
- break;
- }
-
- parsers = api.parsers[ markerBytes ];
-
- if ( !noParse && parsers ) {
- for ( i = 0; i < parsers.length; i += 1 ) {
- parsers[ i ].call( api, dataview, offset,
- markerLength, ret );
- }
- }
-
- offset += markerLength;
- headLength = offset;
- } else {
- break;
- }
- }
-
- if ( headLength > 6 ) {
- if ( buffer.slice ) {
- ret.imageHead = buffer.slice( 2, headLength );
- } else {
- // Workaround for IE10, which does not yet
- // support ArrayBuffer.slice:
- ret.imageHead = new Uint8Array( buffer )
- .subarray( 2, headLength );
- }
- }
- }
-
- return ret;
- },
-
- updateImageHead: function( buffer, head ) {
- var data = this._parse( buffer, true ),
- buf1, buf2, bodyoffset;
-
-
- bodyoffset = 2;
- if ( data.imageHead ) {
- bodyoffset = 2 + data.imageHead.byteLength;
- }
-
- if ( buffer.slice ) {
- buf2 = buffer.slice( bodyoffset );
- } else {
- buf2 = new Uint8Array( buffer ).subarray( bodyoffset );
- }
-
- buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength );
-
- buf1[ 0 ] = 0xFF;
- buf1[ 1 ] = 0xD8;
- buf1.set( new Uint8Array( head ), 2 );
- buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 );
-
- return buf1.buffer;
- }
- };
-
- Util.parseMeta = function() {
- return api.parse.apply( api, arguments );
- };
-
- Util.updateImageHead = function() {
- return api.updateImageHead.apply( api, arguments );
- };
-
- return api;
- });
- /**
- * 代码来自于:https://github.com/blueimp/JavaScript-Load-Image
- * 暂时项目中只用了orientation.
- *
- * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail.
- * @fileOverview EXIF解析
- */
-
- // Sample
- // ====================================
- // Make : Apple
- // Model : iPhone 4S
- // Orientation : 1
- // XResolution : 72 [72/1]
- // YResolution : 72 [72/1]
- // ResolutionUnit : 2
- // Software : QuickTime 7.7.1
- // DateTime : 2013:09:01 22:53:55
- // ExifIFDPointer : 190
- // ExposureTime : 0.058823529411764705 [1/17]
- // FNumber : 2.4 [12/5]
- // ExposureProgram : Normal program
- // ISOSpeedRatings : 800
- // ExifVersion : 0220
- // DateTimeOriginal : 2013:09:01 22:52:51
- // DateTimeDigitized : 2013:09:01 22:52:51
- // ComponentsConfiguration : YCbCr
- // ShutterSpeedValue : 4.058893515764426
- // ApertureValue : 2.5260688216892597 [4845/1918]
- // BrightnessValue : -0.3126686601998395
- // MeteringMode : Pattern
- // Flash : Flash did not fire, compulsory flash mode
- // FocalLength : 4.28 [107/25]
- // SubjectArea : [4 values]
- // FlashpixVersion : 0100
- // ColorSpace : 1
- // PixelXDimension : 2448
- // PixelYDimension : 3264
- // SensingMethod : One-chip color area sensor
- // ExposureMode : 0
- // WhiteBalance : Auto white balance
- // FocalLengthIn35mmFilm : 35
- // SceneCaptureType : Standard
- define('runtime/html5/imagemeta/exif',[
- 'base',
- 'runtime/html5/imagemeta'
- ], function( Base, ImageMeta ) {
-
- var EXIF = {};
-
- EXIF.ExifMap = function() {
- return this;
- };
-
- EXIF.ExifMap.prototype.map = {
- 'Orientation': 0x0112
- };
-
- EXIF.ExifMap.prototype.get = function( id ) {
- return this[ id ] || this[ this.map[ id ] ];
- };
-
- EXIF.exifTagTypes = {
- // byte, 8-bit unsigned int:
- 1: {
- getValue: function( dataView, dataOffset ) {
- return dataView.getUint8( dataOffset );
- },
- size: 1
- },
-
- // ascii, 8-bit byte:
- 2: {
- getValue: function( dataView, dataOffset ) {
- return String.fromCharCode( dataView.getUint8( dataOffset ) );
- },
- size: 1,
- ascii: true
- },
-
- // short, 16 bit int:
- 3: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getUint16( dataOffset, littleEndian );
- },
- size: 2
- },
-
- // long, 32 bit int:
- 4: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getUint32( dataOffset, littleEndian );
- },
- size: 4
- },
-
- // rational = two long values,
- // first is numerator, second is denominator:
- 5: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getUint32( dataOffset, littleEndian ) /
- dataView.getUint32( dataOffset + 4, littleEndian );
- },
- size: 8
- },
-
- // slong, 32 bit signed int:
- 9: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getInt32( dataOffset, littleEndian );
- },
- size: 4
- },
-
- // srational, two slongs, first is numerator, second is denominator:
- 10: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getInt32( dataOffset, littleEndian ) /
- dataView.getInt32( dataOffset + 4, littleEndian );
- },
- size: 8
- }
- };
-
- // undefined, 8-bit byte, value depending on field:
- EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ];
-
- EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length,
- littleEndian ) {
-
- var tagType = EXIF.exifTagTypes[ type ],
- tagSize, dataOffset, values, i, str, c;
-
- if ( !tagType ) {
- Base.log('Invalid Exif data: Invalid tag type.');
- return;
- }
-
- tagSize = tagType.size * length;
-
- // Determine if the value is contained in the dataOffset bytes,
- // or if the value at the dataOffset is a pointer to the actual data:
- dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8,
- littleEndian ) : (offset + 8);
-
- if ( dataOffset + tagSize > dataView.byteLength ) {
- Base.log('Invalid Exif data: Invalid data offset.');
- return;
- }
-
- if ( length === 1 ) {
- return tagType.getValue( dataView, dataOffset, littleEndian );
- }
-
- values = [];
-
- for ( i = 0; i < length; i += 1 ) {
- values[ i ] = tagType.getValue( dataView,
- dataOffset + i * tagType.size, littleEndian );
- }
-
- if ( tagType.ascii ) {
- str = '';
-
- // Concatenate the chars:
- for ( i = 0; i < values.length; i += 1 ) {
- c = values[ i ];
-
- // Ignore the terminating NULL byte(s):
- if ( c === '\u0000' ) {
- break;
- }
- str += c;
- }
-
- return str;
- }
- return values;
- };
-
- EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian,
- data ) {
-
- var tag = dataView.getUint16( offset, littleEndian );
- data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset,
- dataView.getUint16( offset + 2, littleEndian ), // tag type
- dataView.getUint32( offset + 4, littleEndian ), // tag length
- littleEndian );
- };
-
- EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset,
- littleEndian, data ) {
-
- var tagsNumber, dirEndOffset, i;
-
- if ( dirOffset + 6 > dataView.byteLength ) {
- Base.log('Invalid Exif data: Invalid directory offset.');
- return;
- }
-
- tagsNumber = dataView.getUint16( dirOffset, littleEndian );
- dirEndOffset = dirOffset + 2 + 12 * tagsNumber;
-
- if ( dirEndOffset + 4 > dataView.byteLength ) {
- Base.log('Invalid Exif data: Invalid directory size.');
- return;
- }
-
- for ( i = 0; i < tagsNumber; i += 1 ) {
- this.parseExifTag( dataView, tiffOffset,
- dirOffset + 2 + 12 * i, // tag offset
- littleEndian, data );
- }
-
- // Return the offset to the next directory:
- return dataView.getUint32( dirEndOffset, littleEndian );
- };
-
- // EXIF.getExifThumbnail = function(dataView, offset, length) {
- // var hexData,
- // i,
- // b;
- // if (!length || offset + length > dataView.byteLength) {
- // Base.log('Invalid Exif data: Invalid thumbnail data.');
- // return;
- // }
- // hexData = [];
- // for (i = 0; i < length; i += 1) {
- // b = dataView.getUint8(offset + i);
- // hexData.push((b < 16 ? '0' : '') + b.toString(16));
- // }
- // return 'data:image/jpeg,%' + hexData.join('%');
- // };
-
- EXIF.parseExifData = function( dataView, offset, length, data ) {
-
- var tiffOffset = offset + 10,
- littleEndian, dirOffset;
-
- // Check for the ASCII code for "Exif" (0x45786966):
- if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) {
- // No Exif data, might be XMP data instead
- return;
- }
- if ( tiffOffset + 8 > dataView.byteLength ) {
- Base.log('Invalid Exif data: Invalid segment size.');
- return;
- }
-
- // Check for the two null bytes:
- if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) {
- Base.log('Invalid Exif data: Missing byte alignment offset.');
- return;
- }
-
- // Check the byte alignment:
- switch ( dataView.getUint16( tiffOffset ) ) {
- case 0x4949:
- littleEndian = true;
- break;
-
- case 0x4D4D:
- littleEndian = false;
- break;
-
- default:
- Base.log('Invalid Exif data: Invalid byte alignment marker.');
- return;
- }
-
- // Check for the TIFF tag marker (0x002A):
- if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) {
- Base.log('Invalid Exif data: Missing TIFF marker.');
- return;
- }
-
- // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:
- dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian );
- // Create the exif object to store the tags:
- data.exif = new EXIF.ExifMap();
- // Parse the tags of the main image directory and retrieve the
- // offset to the next directory, usually the thumbnail directory:
- dirOffset = EXIF.parseExifTags( dataView, tiffOffset,
- tiffOffset + dirOffset, littleEndian, data );
-
- // 尝试读取缩略图
- // if ( dirOffset ) {
- // thumbnailData = {exif: {}};
- // dirOffset = EXIF.parseExifTags(
- // dataView,
- // tiffOffset,
- // tiffOffset + dirOffset,
- // littleEndian,
- // thumbnailData
- // );
-
- // // Check for JPEG Thumbnail offset:
- // if (thumbnailData.exif[0x0201]) {
- // data.exif.Thumbnail = EXIF.getExifThumbnail(
- // dataView,
- // tiffOffset + thumbnailData.exif[0x0201],
- // thumbnailData.exif[0x0202] // Thumbnail data length
- // );
- // }
- // }
- };
-
- ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData );
- return EXIF;
- });
- /**
- * @fileOverview Image
- */
- define('runtime/html5/image',[
- 'base',
- 'runtime/html5/runtime',
- 'runtime/html5/util'
- ], function( Base, Html5Runtime, Util ) {
-
- var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';
-
- return Html5Runtime.register( 'Image', {
-
- // flag: 标记是否被修改过。
- modified: false,
-
- init: function() {
- var me = this,
- img = new Image();
-
- img.onload = function() {
-
- me._info = {
- type: me.type,
- width: this.width,
- height: this.height
- };
-
- // 读取meta信息。
- if ( !me._metas && 'image/jpeg' === me.type ) {
- Util.parseMeta( me._blob, function( error, ret ) {
- me._metas = ret;
- me.owner.trigger('load');
- });
- } else {
- me.owner.trigger('load');
- }
- };
-
- img.onerror = function() {
- me.owner.trigger('error');
- };
-
- me._img = img;
- },
-
- loadFromBlob: function( blob ) {
- var me = this,
- img = me._img;
-
- me._blob = blob;
- me.type = blob.type;
- img.src = Util.createObjectURL( blob.getSource() );
- me.owner.once( 'load', function() {
- Util.revokeObjectURL( img.src );
- });
- },
-
- resize: function( width, height ) {
- var canvas = this._canvas ||
- (this._canvas = document.createElement('canvas'));
-
- this._resize( this._img, canvas, width, height );
- this._blob = null; // 没用了,可以删掉了。
- this.modified = true;
- this.owner.trigger('complete');
- },
-
- getAsBlob: function( type ) {
- var blob = this._blob,
- opts = this.options,
- canvas;
-
- type = type || this.type;
-
- // blob需要重新生成。
- if ( this.modified || this.type !== type ) {
- canvas = this._canvas;
-
- if ( type === 'image/jpeg' ) {
-
- blob = Util.canvasToDataUrl( canvas, 'image/jpeg',
- opts.quality );
-
- if ( opts.preserveHeaders && this._metas &&
- this._metas.imageHead ) {
-
- blob = Util.dataURL2ArrayBuffer( blob );
- blob = Util.updateImageHead( blob,
- this._metas.imageHead );
- blob = Util.arrayBufferToBlob( blob, type );
- return blob;
- }
- } else {
- blob = Util.canvasToDataUrl( canvas, type );
- }
-
- blob = Util.dataURL2Blob( blob );
- }
-
- return blob;
- },
-
- getAsDataUrl: function( type ) {
- var opts = this.options;
-
- type = type || this.type;
-
- if ( type === 'image/jpeg' ) {
- return Util.canvasToDataUrl( this._canvas, type, opts.quality );
- } else {
- return this._canvas.toDataURL( type );
- }
- },
-
- getOrientation: function() {
- return this._metas && this._metas.exif &&
- this._metas.exif.get('Orientation') || 1;
- },
-
- info: function( val ) {
-
- // setter
- if ( val ) {
- this._info = val;
- return this;
- }
-
- // getter
- return this._info;
- },
-
- meta: function( val ) {
-
- // setter
- if ( val ) {
- this._meta = val;
- return this;
- }
-
- // getter
- return this._meta;
- },
-
- destroy: function() {
- var canvas = this._canvas;
- this._img.onload = null;
-
- if ( canvas ) {
- canvas.getContext('2d')
- .clearRect( 0, 0, canvas.width, canvas.height );
- canvas.width = canvas.height = 0;
- this._canvas = null;
- }
-
- // 释放内存。非常重要,否则释放不了image的内存。
- this._img.src = BLANK;
- this._img = this._blob = null;
- },
-
- _resize: function( img, cvs, width, height ) {
- var opts = this.options,
- naturalWidth = img.width,
- naturalHeight = img.height,
- orientation = this.getOrientation(),
- scale, w, h, x, y;
-
- // values that require 90 degree rotation
- if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
-
- // 交换width, height的值。
- width ^= height;
- height ^= width;
- width ^= height;
- }
-
- scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth,
- height / naturalHeight );
-
- // 不允许放大。
- opts.allowMagnify || (scale = Math.min( 1, scale ));
-
- w = naturalWidth * scale;
- h = naturalHeight * scale;
-
- if ( opts.crop ) {
- cvs.width = width;
- cvs.height = height;
- } else {
- cvs.width = w;
- cvs.height = h;
- }
-
- x = (cvs.width - w) / 2;
- y = (cvs.height - h) / 2;
-
- opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
-
- this._renderImageToCanvas( cvs, img, x, y, w, h );
- },
-
- _rotate2Orientaion: function( canvas, orientation ) {
- var width = canvas.width,
- height = canvas.height,
- ctx = canvas.getContext('2d');
-
- switch ( orientation ) {
- case 5:
- case 6:
- case 7:
- case 8:
- canvas.width = height;
- canvas.height = width;
- break;
- }
-
- switch ( orientation ) {
- case 2: // horizontal flip
- ctx.translate( width, 0 );
- ctx.scale( -1, 1 );
- break;
-
- case 3: // 180 rotate left
- ctx.translate( width, height );
- ctx.rotate( Math.PI );
- break;
-
- case 4: // vertical flip
- ctx.translate( 0, height );
- ctx.scale( 1, -1 );
- break;
-
- case 5: // vertical flip + 90 rotate right
- ctx.rotate( 0.5 * Math.PI );
- ctx.scale( 1, -1 );
- break;
-
- case 6: // 90 rotate right
- ctx.rotate( 0.5 * Math.PI );
- ctx.translate( 0, -height );
- break;
-
- case 7: // horizontal flip + 90 rotate right
- ctx.rotate( 0.5 * Math.PI );
- ctx.translate( width, -height );
- ctx.scale( -1, 1 );
- break;
-
- case 8: // 90 rotate left
- ctx.rotate( -0.5 * Math.PI );
- ctx.translate( -width, 0 );
- break;
- }
- },
-
- // https://github.com/stomita/ios-imagefile-megapixel/
- // blob/master/src/megapix-image.js
- _renderImageToCanvas: (function() {
-
- // 如果不是ios, 不需要这么复杂!
- if ( !Base.os.ios ) {
- return function( canvas, img, x, y, w, h ) {
- canvas.getContext('2d').drawImage( img, x, y, w, h );
- };
- }
-
- /**
- * Detecting vertical squash in loaded image.
- * Fixes a bug which squash image vertically while drawing into
- * canvas for some images.
- */
- function detectVerticalSquash( img, iw, ih ) {
- var canvas = document.createElement('canvas'),
- ctx = canvas.getContext('2d'),
- sy = 0,
- ey = ih,
- py = ih,
- data, alpha, ratio;
-
-
- canvas.width = 1;
- canvas.height = ih;
- ctx.drawImage( img, 0, 0 );
- data = ctx.getImageData( 0, 0, 1, ih ).data;
-
- // search image edge pixel position in case
- // it is squashed vertically.
- while ( py > sy ) {
- alpha = data[ (py - 1) * 4 + 3 ];
-
- if ( alpha === 0 ) {
- ey = py;
- } else {
- sy = py;
- }
-
- py = (ey + sy) >> 1;
- }
-
- ratio = (py / ih);
- return (ratio === 0) ? 1 : ratio;
- }
-
- // fix ie7 bug
- // http://stackoverflow.com/questions/11929099/
- // html5-canvas-drawimage-ratio-bug-ios
- if ( Base.os.ios >= 7 ) {
- return function( canvas, img, x, y, w, h ) {
- var iw = img.naturalWidth,
- ih = img.naturalHeight,
- vertSquashRatio = detectVerticalSquash( img, iw, ih );
-
- return canvas.getContext('2d').drawImage( img, 0, 0,
- iw * vertSquashRatio, ih * vertSquashRatio,
- x, y, w, h );
- };
- }
-
- /**
- * Detect subsampling in loaded image.
- * In iOS, larger images than 2M pixels may be
- * subsampled in rendering.
- */
- function detectSubsampling( img ) {
- var iw = img.naturalWidth,
- ih = img.naturalHeight,
- canvas, ctx;
-
- // subsampling may happen overmegapixel image
- if ( iw * ih > 1024 * 1024 ) {
- canvas = document.createElement('canvas');
- canvas.width = canvas.height = 1;
- ctx = canvas.getContext('2d');
- ctx.drawImage( img, -iw + 1, 0 );
-
- // subsampled image becomes half smaller in rendering size.
- // check alpha channel value to confirm image is covering
- // edge pixel or not. if alpha value is 0
- // image is not covering, hence subsampled.
- return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0;
- } else {
- return false;
- }
- }
-
-
- return function( canvas, img, x, y, width, height ) {
- var iw = img.naturalWidth,
- ih = img.naturalHeight,
- ctx = canvas.getContext('2d'),
- subsampled = detectSubsampling( img ),
- doSquash = this.type === 'image/jpeg',
- d = 1024,
- sy = 0,
- dy = 0,
- tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;
-
- if ( subsampled ) {
- iw /= 2;
- ih /= 2;
- }
-
- ctx.save();
- tmpCanvas = document.createElement('canvas');
- tmpCanvas.width = tmpCanvas.height = d;
-
- tmpCtx = tmpCanvas.getContext('2d');
- vertSquashRatio = doSquash ?
- detectVerticalSquash( img, iw, ih ) : 1;
-
- dw = Math.ceil( d * width / iw );
- dh = Math.ceil( d * height / ih / vertSquashRatio );
-
- while ( sy < ih ) {
- sx = 0;
- dx = 0;
- while ( sx < iw ) {
- tmpCtx.clearRect( 0, 0, d, d );
- tmpCtx.drawImage( img, -sx, -sy );
- ctx.drawImage( tmpCanvas, 0, 0, d, d,
- x + dx, y + dy, dw, dh );
- sx += d;
- dx += dw;
- }
- sy += d;
- dy += dh;
- }
- ctx.restore();
- tmpCanvas = tmpCtx = null;
- };
- })()
- });
- });
- /**
- * 这个方式性能不行,但是可以解决android里面的toDataUrl的bug
- * android里面toDataUrl('image/jpege')得到的结果却是png.
- *
- * 所以这里没辙,只能借助这个工具
- * @fileOverview jpeg encoder
- */
- define('runtime/html5/jpegencoder',[], function( require, exports, module ) {
-
- /*
- Copyright (c) 2008, Adobe Systems Incorporated
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the name of Adobe Systems Incorporated nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- /*
- JPEG encoder ported to JavaScript and optimized by Andreas Ritter, www.bytestrom.eu, 11/2009
-
- Basic GUI blocking jpeg encoder
- */
-
- function JPEGEncoder(quality) {
- var self = this;
- var fround = Math.round;
- var ffloor = Math.floor;
- var YTable = new Array(64);
- var UVTable = new Array(64);
- var fdtbl_Y = new Array(64);
- var fdtbl_UV = new Array(64);
- var YDC_HT;
- var UVDC_HT;
- var YAC_HT;
- var UVAC_HT;
-
- var bitcode = new Array(65535);
- var category = new Array(65535);
- var outputfDCTQuant = new Array(64);
- var DU = new Array(64);
- var byteout = [];
- var bytenew = 0;
- var bytepos = 7;
-
- var YDU = new Array(64);
- var UDU = new Array(64);
- var VDU = new Array(64);
- var clt = new Array(256);
- var RGB_YUV_TABLE = new Array(2048);
- var currentQuality;
-
- var ZigZag = [
- 0, 1, 5, 6,14,15,27,28,
- 2, 4, 7,13,16,26,29,42,
- 3, 8,12,17,25,30,41,43,
- 9,11,18,24,31,40,44,53,
- 10,19,23,32,39,45,52,54,
- 20,22,33,38,46,51,55,60,
- 21,34,37,47,50,56,59,61,
- 35,36,48,49,57,58,62,63
- ];
-
- var std_dc_luminance_nrcodes = [0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0];
- var std_dc_luminance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
- var std_ac_luminance_nrcodes = [0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d];
- var std_ac_luminance_values = [
- 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,
- 0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,
- 0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,
- 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,
- 0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,
- 0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
- 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,
- 0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
- 0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
- 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
- 0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
- 0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
- 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,
- 0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
- 0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,
- 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,
- 0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,
- 0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
- 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,
- 0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
- 0xf9,0xfa
- ];
-
- var std_dc_chrominance_nrcodes = [0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0];
- var std_dc_chrominance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
- var std_ac_chrominance_nrcodes = [0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77];
- var std_ac_chrominance_values = [
- 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,
- 0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,
- 0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
- 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,
- 0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,
- 0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
- 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,
- 0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,
- 0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,
- 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,
- 0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,
- 0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
- 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,
- 0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,
- 0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,
- 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,
- 0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,
- 0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
- 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,
- 0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
- 0xf9,0xfa
- ];
-
- function initQuantTables(sf){
- var YQT = [
- 16, 11, 10, 16, 24, 40, 51, 61,
- 12, 12, 14, 19, 26, 58, 60, 55,
- 14, 13, 16, 24, 40, 57, 69, 56,
- 14, 17, 22, 29, 51, 87, 80, 62,
- 18, 22, 37, 56, 68,109,103, 77,
- 24, 35, 55, 64, 81,104,113, 92,
- 49, 64, 78, 87,103,121,120,101,
- 72, 92, 95, 98,112,100,103, 99
- ];
-
- for (var i = 0; i < 64; i++) {
- var t = ffloor((YQT[i]*sf+50)/100);
- if (t < 1) {
- t = 1;
- } else if (t > 255) {
- t = 255;
- }
- YTable[ZigZag[i]] = t;
- }
- var UVQT = [
- 17, 18, 24, 47, 99, 99, 99, 99,
- 18, 21, 26, 66, 99, 99, 99, 99,
- 24, 26, 56, 99, 99, 99, 99, 99,
- 47, 66, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99
- ];
- for (var j = 0; j < 64; j++) {
- var u = ffloor((UVQT[j]*sf+50)/100);
- if (u < 1) {
- u = 1;
- } else if (u > 255) {
- u = 255;
- }
- UVTable[ZigZag[j]] = u;
- }
- var aasf = [
- 1.0, 1.387039845, 1.306562965, 1.175875602,
- 1.0, 0.785694958, 0.541196100, 0.275899379
- ];
- var k = 0;
- for (var row = 0; row < 8; row++)
- {
- for (var col = 0; col < 8; col++)
- {
- fdtbl_Y[k] = (1.0 / (YTable [ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
- fdtbl_UV[k] = (1.0 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
- k++;
- }
- }
- }
-
- function computeHuffmanTbl(nrcodes, std_table){
- var codevalue = 0;
- var pos_in_table = 0;
- var HT = new Array();
- for (var k = 1; k <= 16; k++) {
- for (var j = 1; j <= nrcodes[k]; j++) {
- HT[std_table[pos_in_table]] = [];
- HT[std_table[pos_in_table]][0] = codevalue;
- HT[std_table[pos_in_table]][1] = k;
- pos_in_table++;
- codevalue++;
- }
- codevalue*=2;
- }
- return HT;
- }
-
- function initHuffmanTbl()
- {
- YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values);
- UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values);
- YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values);
- UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values);
- }
-
- function initCategoryNumber()
- {
- var nrlower = 1;
- var nrupper = 2;
- for (var cat = 1; cat <= 15; cat++) {
- //Positive numbers
- for (var nr = nrlower; nr
>0] = 38470 * i;
- RGB_YUV_TABLE[(i+ 512)>>0] = 7471 * i + 0x8000;
- RGB_YUV_TABLE[(i+ 768)>>0] = -11059 * i;
- RGB_YUV_TABLE[(i+1024)>>0] = -21709 * i;
- RGB_YUV_TABLE[(i+1280)>>0] = 32768 * i + 0x807FFF;
- RGB_YUV_TABLE[(i+1536)>>0] = -27439 * i;
- RGB_YUV_TABLE[(i+1792)>>0] = - 5329 * i;
- }
- }
-
- // IO functions
- function writeBits(bs)
- {
- var value = bs[0];
- var posval = bs[1]-1;
- while ( posval >= 0 ) {
- if (value & (1 << posval) ) {
- bytenew |= (1 << bytepos);
- }
- posval--;
- bytepos--;
- if (bytepos < 0) {
- if (bytenew == 0xFF) {
- writeByte(0xFF);
- writeByte(0);
- }
- else {
- writeByte(bytenew);
- }
- bytepos=7;
- bytenew=0;
- }
- }
- }
-
- function writeByte(value)
- {
- byteout.push(clt[value]); // write char directly instead of converting later
- }
-
- function writeWord(value)
- {
- writeByte((value>>8)&0xFF);
- writeByte((value )&0xFF);
- }
-
- // DCT & quantization core
- function fDCTQuant(data, fdtbl)
- {
- var d0, d1, d2, d3, d4, d5, d6, d7;
- /* Pass 1: process rows. */
- var dataOff=0;
- var i;
- var I8 = 8;
- var I64 = 64;
- for (i=0; i 0.0) ? ((fDCTQuant + 0.5)|0) : ((fDCTQuant - 0.5)|0);
- //outputfDCTQuant[i] = fround(fDCTQuant);
-
- }
- return outputfDCTQuant;
- }
-
- function writeAPP0()
- {
- writeWord(0xFFE0); // marker
- writeWord(16); // length
- writeByte(0x4A); // J
- writeByte(0x46); // F
- writeByte(0x49); // I
- writeByte(0x46); // F
- writeByte(0); // = "JFIF",'\0'
- writeByte(1); // versionhi
- writeByte(1); // versionlo
- writeByte(0); // xyunits
- writeWord(1); // xdensity
- writeWord(1); // ydensity
- writeByte(0); // thumbnwidth
- writeByte(0); // thumbnheight
- }
-
- function writeSOF0(width, height)
- {
- writeWord(0xFFC0); // marker
- writeWord(17); // length, truecolor YUV JPG
- writeByte(8); // precision
- writeWord(height);
- writeWord(width);
- writeByte(3); // nrofcomponents
- writeByte(1); // IdY
- writeByte(0x11); // HVY
- writeByte(0); // QTY
- writeByte(2); // IdU
- writeByte(0x11); // HVU
- writeByte(1); // QTU
- writeByte(3); // IdV
- writeByte(0x11); // HVV
- writeByte(1); // QTV
- }
-
- function writeDQT()
- {
- writeWord(0xFFDB); // marker
- writeWord(132); // length
- writeByte(0);
- for (var i=0; i<64; i++) {
- writeByte(YTable[i]);
- }
- writeByte(1);
- for (var j=0; j<64; j++) {
- writeByte(UVTable[j]);
- }
- }
-
- function writeDHT()
- {
- writeWord(0xFFC4); // marker
- writeWord(0x01A2); // length
-
- writeByte(0); // HTYDCinfo
- for (var i=0; i<16; i++) {
- writeByte(std_dc_luminance_nrcodes[i+1]);
- }
- for (var j=0; j<=11; j++) {
- writeByte(std_dc_luminance_values[j]);
- }
-
- writeByte(0x10); // HTYACinfo
- for (var k=0; k<16; k++) {
- writeByte(std_ac_luminance_nrcodes[k+1]);
- }
- for (var l=0; l<=161; l++) {
- writeByte(std_ac_luminance_values[l]);
- }
-
- writeByte(1); // HTUDCinfo
- for (var m=0; m<16; m++) {
- writeByte(std_dc_chrominance_nrcodes[m+1]);
- }
- for (var n=0; n<=11; n++) {
- writeByte(std_dc_chrominance_values[n]);
- }
-
- writeByte(0x11); // HTUACinfo
- for (var o=0; o<16; o++) {
- writeByte(std_ac_chrominance_nrcodes[o+1]);
- }
- for (var p=0; p<=161; p++) {
- writeByte(std_ac_chrominance_values[p]);
- }
- }
-
- function writeSOS()
- {
- writeWord(0xFFDA); // marker
- writeWord(12); // length
- writeByte(3); // nrofcomponents
- writeByte(1); // IdY
- writeByte(0); // HTY
- writeByte(2); // IdU
- writeByte(0x11); // HTU
- writeByte(3); // IdV
- writeByte(0x11); // HTV
- writeByte(0); // Ss
- writeByte(0x3f); // Se
- writeByte(0); // Bf
- }
-
- function processDU(CDU, fdtbl, DC, HTDC, HTAC){
- var EOB = HTAC[0x00];
- var M16zeroes = HTAC[0xF0];
- var pos;
- var I16 = 16;
- var I63 = 63;
- var I64 = 64;
- var DU_DCT = fDCTQuant(CDU, fdtbl);
- //ZigZag reorder
- for (var j=0;j0)&&(DU[end0pos]==0); end0pos--) {};
- //end0pos = first element in reverse order !=0
- if ( end0pos == 0) {
- writeBits(EOB);
- return DC;
- }
- var i = 1;
- var lng;
- while ( i <= end0pos ) {
- var startpos = i;
- for (; (DU[i]==0) && (i<=end0pos); ++i) {}
- var nrzeroes = i-startpos;
- if ( nrzeroes >= I16 ) {
- lng = nrzeroes>>4;
- for (var nrmarker=1; nrmarker <= lng; ++nrmarker)
- writeBits(M16zeroes);
- nrzeroes = nrzeroes&0xF;
- }
- pos = 32767+DU[i];
- writeBits(HTAC[(nrzeroes<<4)+category[pos]]);
- writeBits(bitcode[pos]);
- i++;
- }
- if ( end0pos != I63 ) {
- writeBits(EOB);
- }
- return DC;
- }
-
- function initCharLookupTable(){
- var sfcc = String.fromCharCode;
- for(var i=0; i < 256; i++){ ///// ACHTUNG // 255
- clt[i] = sfcc(i);
- }
- }
-
- this.encode = function(image,quality) // image data object
- {
- // var time_start = new Date().getTime();
-
- if(quality) setQuality(quality);
-
- // Initialize bit writer
- byteout = new Array();
- bytenew=0;
- bytepos=7;
-
- // Add JPEG headers
- writeWord(0xFFD8); // SOI
- writeAPP0();
- writeDQT();
- writeSOF0(image.width,image.height);
- writeDHT();
- writeSOS();
-
-
- // Encode 8x8 macroblocks
- var DCY=0;
- var DCU=0;
- var DCV=0;
-
- bytenew=0;
- bytepos=7;
-
-
- this.encode.displayName = "_encode_";
-
- var imageData = image.data;
- var width = image.width;
- var height = image.height;
-
- var quadWidth = width*4;
- var tripleWidth = width*3;
-
- var x, y = 0;
- var r, g, b;
- var start,p, col,row,pos;
- while(y < height){
- x = 0;
- while(x < quadWidth){
- start = quadWidth * y + x;
- p = start;
- col = -1;
- row = 0;
-
- for(pos=0; pos < 64; pos++){
- row = pos >> 3;// /8
- col = ( pos & 7 ) * 4; // %8
- p = start + ( row * quadWidth ) + col;
-
- if(y+row >= height){ // padding bottom
- p-= (quadWidth*(y+1+row-height));
- }
-
- if(x+col >= quadWidth){ // padding right
- p-= ((x+col) - quadWidth +4)
- }
-
- r = imageData[ p++ ];
- g = imageData[ p++ ];
- b = imageData[ p++ ];
-
-
- /* // calculate YUV values dynamically
- YDU[pos]=((( 0.29900)*r+( 0.58700)*g+( 0.11400)*b))-128; //-0x80
- UDU[pos]=(((-0.16874)*r+(-0.33126)*g+( 0.50000)*b));
- VDU[pos]=((( 0.50000)*r+(-0.41869)*g+(-0.08131)*b));
- */
-
- // use lookup table (slightly faster)
- YDU[pos] = ((RGB_YUV_TABLE[r] + RGB_YUV_TABLE[(g + 256)>>0] + RGB_YUV_TABLE[(b + 512)>>0]) >> 16)-128;
- UDU[pos] = ((RGB_YUV_TABLE[(r + 768)>>0] + RGB_YUV_TABLE[(g + 1024)>>0] + RGB_YUV_TABLE[(b + 1280)>>0]) >> 16)-128;
- VDU[pos] = ((RGB_YUV_TABLE[(r + 1280)>>0] + RGB_YUV_TABLE[(g + 1536)>>0] + RGB_YUV_TABLE[(b + 1792)>>0]) >> 16)-128;
-
- }
-
- DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
- DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
- DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
- x+=32;
- }
- y+=8;
- }
-
-
- ////////////////////////////////////////////////////////////////
-
- // Do the bit alignment of the EOI marker
- if ( bytepos >= 0 ) {
- var fillbits = [];
- fillbits[1] = bytepos+1;
- fillbits[0] = (1<<(bytepos+1))-1;
- writeBits(fillbits);
- }
-
- writeWord(0xFFD9); //EOI
-
- var jpegDataUri = 'data:image/jpeg;base64,' + btoa(byteout.join(''));
-
- byteout = [];
-
- // benchmarking
- // var duration = new Date().getTime() - time_start;
- // console.log('Encoding time: '+ currentQuality + 'ms');
- //
-
- return jpegDataUri
- }
-
- function setQuality(quality){
- if (quality <= 0) {
- quality = 1;
- }
- if (quality > 100) {
- quality = 100;
- }
-
- if(currentQuality == quality) return // don't recalc if unchanged
-
- var sf = 0;
- if (quality < 50) {
- sf = Math.floor(5000 / quality);
- } else {
- sf = Math.floor(200 - quality*2);
- }
-
- initQuantTables(sf);
- currentQuality = quality;
- // console.log('Quality set to: '+quality +'%');
- }
-
- function init(){
- // var time_start = new Date().getTime();
- if(!quality) quality = 50;
- // Create tables
- initCharLookupTable()
- initHuffmanTbl();
- initCategoryNumber();
- initRGBYUVTable();
-
- setQuality(quality);
- // var duration = new Date().getTime() - time_start;
- // console.log('Initialization '+ duration + 'ms');
- }
-
- init();
-
- };
-
- JPEGEncoder.encode = function( data, quality ) {
- var encoder = new JPEGEncoder( quality );
-
- return encoder.encode( data );
- }
-
- return JPEGEncoder;
- });
- /**
- * @fileOverview Fix android canvas.toDataUrl bug.
- */
- define('runtime/html5/androidpatch',[
- 'runtime/html5/util',
- 'runtime/html5/jpegencoder',
- 'base'
- ], function( Util, encoder, Base ) {
- var origin = Util.canvasToDataUrl,
- supportJpeg;
-
- Util.canvasToDataUrl = function( canvas, type, quality ) {
- var ctx, w, h, fragement, parts;
-
- // 非android手机直接跳过。
- if ( !Base.os.android ) {
- return origin.apply( null, arguments );
- }
-
- // 检测是否canvas支持jpeg导出,根据数据格式来判断。
- // JPEG 前两位分别是:255, 216
- if ( type === 'image/jpeg' && typeof supportJpeg === 'undefined' ) {
- fragement = origin.apply( null, arguments );
-
- parts = fragement.split(',');
-
- if ( ~parts[ 0 ].indexOf('base64') ) {
- fragement = atob( parts[ 1 ] );
- } else {
- fragement = decodeURIComponent( parts[ 1 ] );
- }
-
- fragement = fragement.substring( 0, 2 );
-
- supportJpeg = fragement.charCodeAt( 0 ) === 255 &&
- fragement.charCodeAt( 1 ) === 216;
- }
-
- // 只有在android环境下才修复
- if ( type === 'image/jpeg' && !supportJpeg ) {
- w = canvas.width;
- h = canvas.height;
- ctx = canvas.getContext('2d');
-
- return encoder.encode( ctx.getImageData( 0, 0, w, h ), quality );
- }
-
- return origin.apply( null, arguments );
- };
- });
- /**
- * @fileOverview Transport
- * @todo 支持chunked传输,优势:
- * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
- * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
- */
- define('runtime/html5/transport',[
- 'base',
- 'runtime/html5/runtime'
- ], function( Base, Html5Runtime ) {
-
- var noop = Base.noop,
- $ = Base.$;
-
- return Html5Runtime.register( 'Transport', {
- init: function() {
- this._status = 0;
- this._response = null;
- },
-
- send: function() {
- var owner = this.owner,
- opts = this.options,
- xhr = this._initAjax(),
- blob = owner._blob,
- server = opts.server,
- formData, binary, fr;
-
- if ( opts.sendAsBinary ) {
- server += (/\?/.test( server ) ? '&' : '?') +
- $.param( owner._formData );
-
- binary = blob.getSource();
- } else {
- formData = new FormData();
- $.each( owner._formData, function( k, v ) {
- formData.append( k, v );
- });
-
- formData.append( opts.fileVal, blob.getSource(),
- opts.filename || owner._formData.name || '' );
- }
-
- if ( opts.withCredentials && 'withCredentials' in xhr ) {
- xhr.open( opts.method, server, true );
- xhr.withCredentials = true;
- } else {
- xhr.open( opts.method, server );
- }
-
- this._setRequestHeader( xhr, opts.headers );
-
- if ( binary ) {
- xhr.overrideMimeType('application/octet-stream');
-
- // android直接发送blob会导致服务端接收到的是空文件。
- // bug详情。
- // https://code.google.com/p/android/issues/detail?id=39882
- // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
- if ( Base.os.android ) {
- fr = new FileReader();
-
- fr.onload = function() {
- xhr.send( this.result );
- fr = fr.onload = null;
- };
-
- fr.readAsArrayBuffer( binary );
- } else {
- xhr.send( binary );
- }
- } else {
- xhr.send( formData );
- }
- },
-
- getResponse: function() {
- return this._response;
- },
-
- getResponseAsJson: function() {
- return this._parseJson( this._response );
- },
-
- getStatus: function() {
- return this._status;
- },
-
- abort: function() {
- var xhr = this._xhr;
-
- if ( xhr ) {
- xhr.upload.onprogress = noop;
- xhr.onreadystatechange = noop;
- xhr.abort();
-
- this._xhr = xhr = null;
- }
- },
-
- destroy: function() {
- this.abort();
- },
-
- _initAjax: function() {
- var me = this,
- xhr = new XMLHttpRequest(),
- opts = this.options;
-
- if ( opts.withCredentials && !('withCredentials' in xhr) &&
- typeof XDomainRequest !== 'undefined' ) {
- xhr = new XDomainRequest();
- }
-
- xhr.upload.onprogress = function( e ) {
- var percentage = 0;
-
- if ( e.lengthComputable ) {
- percentage = e.loaded / e.total;
- }
-
- return me.trigger( 'progress', percentage );
- };
-
- xhr.onreadystatechange = function() {
-
- if ( xhr.readyState !== 4 ) {
- return;
- }
-
- xhr.upload.onprogress = noop;
- xhr.onreadystatechange = noop;
- me._xhr = null;
- me._status = xhr.status;
-
- if ( xhr.status >= 200 && xhr.status < 300 ) {
- me._response = xhr.responseText;
- return me.trigger('load');
- } else if ( xhr.status >= 500 && xhr.status < 600 ) {
- me._response = xhr.responseText;
- return me.trigger( 'error', 'server' );
- }
-
-
- return me.trigger( 'error', me._status ? 'http' : 'abort' );
- };
-
- me._xhr = xhr;
- return xhr;
- },
-
- _setRequestHeader: function( xhr, headers ) {
- $.each( headers, function( key, val ) {
- xhr.setRequestHeader( key, val );
- });
- },
-
- _parseJson: function( str ) {
- var json;
-
- try {
- json = JSON.parse( str );
- } catch ( ex ) {
- json = {};
- }
-
- return json;
- }
- });
- });
- define('webuploader',[
- 'base',
- 'widgets/filepicker',
- 'widgets/image',
- 'widgets/queue',
- 'widgets/runtime',
- 'widgets/upload',
- 'runtime/html5/blob',
- 'runtime/html5/filepicker',
- 'runtime/html5/imagemeta/exif',
- 'runtime/html5/image',
- 'runtime/html5/androidpatch',
- 'runtime/html5/transport'
- ], function( Base ) {
- return Base;
- });
- return require('webuploader');
-});
diff --git a/www/js/ueditor/third-party/webuploader/webuploader.custom.min.js b/www/js/ueditor/third-party/webuploader/webuploader.custom.min.js
deleted file mode 100644
index 5c256b4594..0000000000
--- a/www/js/ueditor/third-party/webuploader/webuploader.custom.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* WebUploader 0.1.2 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}},j=b(a,f,e);i(j),"object"==typeof module&&"object"==typeof module.exports?module.exports=j:"function"==typeof define&&define.amd?define([],j):(c=a.WebUploader,a.WebUploader=j,a.WebUploader.noConflict=function(){a.WebUploader=c})}(this,function(a,b,c){return b("dollar-third",[],function(){return a.jQuery||a.Zepto}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.2",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return{successNum:a.numOfSuccess,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.parentNode.removeChild(this.__container),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,b.call(d,"Blob"),this.uid=c.uid||this.uid,this.type=c.type||"",this.size=c.size||0,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;b.apply(this,arguments),this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&this.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(this.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),!this.type&&~"jpg,jpeg,png,gif,bmp".indexOf(f)&&(this.type="image/"+("jpg"===f?"jpeg":f)),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString()}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var b=this,c=b.options,e=c.button;e.addClass("webuploader-pick"),b.on("all",function(a){var g;switch(a){case"mouseenter":e.addClass("webuploader-pick-hover");break;case"mouseleave":e.removeClass("webuploader-pick-hover");break;case"change":g=b.exec("getFiles"),b.trigger("select",f.map(g,function(a){return a=new d(b.getRuid(),a),a._refer=c.container,a}),c.container)}}),b.connectRuntime(c,function(){b.refresh(),b.exec("init",c),b.trigger("ready")}),f(a).on("resize",function(){b.refresh()})},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){this.runtime&&(this.exec("destroy"),this.disconnectRuntime())}}),e}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g={},h=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):g},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[];return e.each(h,function(c,d){b.push(new d(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,h,i,j,k=0,l=this._widgets,m=l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],h=f.invoke(b,d),h!==g&&(a.isPromise(h)?o.push(h):n.push(h));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return setTimeout(function(){b.resolve.apply(b,c)},1),b.promise()})[j](e||a.noop)):n[0]}}),b.register=d.register=function(b,c){var f,g={init:"init"};return 1===arguments.length?(c=b,c.responseMap=g):c.responseMap=e.extend(g,b),f=a.inherits(d,c),h.push(f),f},d}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({"add-btn":"addButton",refresh:"refresh",disable:"disable",enable:"enable"},{init:function(a){return this.pickers=[],a.pick&&this.addButton(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addButton:function(b){var e,f,g,h=this,i=h.options,j=i.accept;if(b)return g=a.Deferred(),d.isPlainObject(b)||(b={id:b}),e=d.extend({},b,{accept:d.isPlainObject(j)?[j]:j,swf:i.swf,runtimeOrder:i.runtimeOrder}),f=new c(e),f.once("ready",g.resolve),f.on("select",function(a){h.owner.request("add-file",[a])}),f.init(),this.pickers.push(f),g.promise()},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})}})}),b("lib/image",["base","runtime/client","lib/blob"],function(a,b,c){function d(a){this.options=e.extend({},d.options,a),b.call(this,"Image"),this.on("load",function(){this._info=this.exec("info"),this._meta=this.exec("meta")})}var e=a.$;return d.options={quality:90,crop:!1,preserveHeaders:!0,allowMagnify:!0},a.inherits(b,{constructor:d,info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},loadFromBlob:function(a){var b=this,c=a.getRuid();this.connectRuntime(c,function(){b.exec("init",b.options),b.exec("loadFromBlob",a)})},resize:function(){var b=a.slice(arguments);return this.exec.apply(this,["resize"].concat(b))},getAsDataUrl:function(a){return this.exec("getAsDataUrl",a)},getAsBlob:function(a){var b=this.exec("getAsBlob",a);return new c(this.getRuid(),b)}}),d}),b("widgets/image",["base","uploader","lib/image","widgets/widget"],function(a,b,c){var d,e=a.$;return d=function(a){var b=0,c=[],d=function(){for(var d;c.length&&a>b;)d=c.shift(),b+=d[0],d[1]()};return function(a,e,f){c.push([e,f]),a.once("destroy",function(){b-=e,setTimeout(d,1)}),setTimeout(d,1)}}(5242880),e.extend(b.options,{thumb:{width:110,height:110,quality:70,allowMagnify:!0,crop:!0,preserveHeaders:!1,type:"image/jpeg"},compress:{width:1600,height:1600,quality:90,allowMagnify:!1,crop:!1,preserveHeaders:!0}}),b.register({"make-thumb":"makeThumb","before-send-file":"compressImage"},{makeThumb:function(a,b,f,g){var h,i;return a=this.request("get-file",a),a.type.match(/^image/)?(h=e.extend({},this.options.thumb),e.isPlainObject(f)&&(h=e.extend(h,f),f=null),f=f||h.width,g=g||h.height,i=new c(h),i.once("load",function(){a._info=a._info||i.info(),a._meta=a._meta||i.meta(),i.resize(f,g)}),i.once("complete",function(){b(!1,i.getAsDataUrl(h.type)),i.destroy()}),i.once("error",function(){b(!0),i.destroy()}),void d(i,a.source.size,function(){a._info&&i.info(a._info),a._meta&&i.meta(a._meta),i.loadFromBlob(a.source)})):void b(!0)},compressImage:function(b){var d,f,g=this.options.compress||this.options.resize,h=g&&g.compressSize||307200;return b=this.request("get-file",b),!g||!~"image/jpeg,image/jpg".indexOf(b.type)||b.sizeb;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)})),a.setStatus(f.QUEUED)},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({"sort-files":"sortFiles","add-file":"addFiles","get-file":"getFile","fetch-file":"fetchFile","get-stats":"getStats","get-files":"getFiles","remove-file":"removeFile",retry:"retry",reset:"reset","accept-file":"acceptFile"},{init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||a.size<6||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFiles:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&b.request("start-upload")},getStats:function(){return this.stats},removeFile:function(a){var b=this;a=a.id?a:b.queue.getFile(a),a.setStatus(i.CANCELLED),b.owner.trigger("fileDequeued",a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.queue=new c,this.stats=this.queue.stats}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({"predict-runtime-type":"predictRuntmeType"},{init:function(){if(!this.predictRuntmeType())throw Error("Runtime Error")},predictRuntmeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){for(var c,d=[],e=a.source,f=e.size,g=b?Math.ceil(f/b):1,h=0,i=0;g>i;)c=Math.min(b,f-h),d.push({file:a,start:h,end:b?h+c:f,total:f,chunks:g,chunk:i++}),h+=c;return a.blocks=d.concat(),a.remaning=d.length,{file:a,has:function(){return!!d.length},fetch:function(){return d.shift()}}}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:null}),b.register({"start-upload":"start","stop-upload":"stop","skip-file":"skipFile","is-in-progress":"isInProgress"},{init:function(){var b=this.owner;this.runing=!1,this.pool=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},start:function(){var b=this;f.each(b.request("get-files",h.INVALID),function(){b.request("remove-file",this)}),b.runing||(b.runing=!0,f.each(b.pool,function(a,c){var d=c.file;d.getStatus()===h.INTERRUPT&&(d.setStatus(h.PROGRESS),b._trigged=!1,c.transport&&c.transport.send())}),b._trigged=!1,b.owner.trigger("startUpload"),a.nextTick(b.__tick))},stop:function(a){var b=this;b.runing!==!1&&(b.runing=!1,a&&f.each(b.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),b.owner.trigger("stopUpload"))},isInProgress:function(){return!!this.runing},getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length1&&(f.each(k.blocks,function(a,b){d+=(b.percentage||0)*(b.end-b.start)}),c=d/k.size),i.trigger("uploadProgress",k,c||0)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})}})}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destory;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destory=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=c(document.createElement("label")),k=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){}})}),b("runtime/html5/util",["base"],function(b){var c=a.createObjectURL&&a||a.URL&&URL.revokeObjectURL&&URL||a.webkitURL,d=b.noop,e=d;return c&&(d=function(){return c.createObjectURL.apply(c,arguments)},e=function(){return c.revokeObjectURL.apply(c,arguments)}),{createObjectURL:d,revokeObjectURL:e,dataURL2Blob:function(a){var b,c,d,e,f,g;for(g=a.split(","),b=~g[0].indexOf("base64")?atob(g[1]):decodeURIComponent(g[1]),d=new ArrayBuffer(b.length),c=new Uint8Array(d),e=0;ei&&(d=h.getUint16(i),d>=65504&&65519>=d||65534===d)&&(e=h.getUint16(i+2)+2,!(i+e>h.byteLength));){if(f=b.parsers[d],!c&&f)for(g=0;g6&&(l.imageHead=a.slice?a.slice(2,k):new Uint8Array(a).subarray(2,k))}return l}},updateImageHead:function(a,b){var c,d,e,f=this._parse(a,!0);return e=2,f.imageHead&&(e=2+f.imageHead.byteLength),d=a.slice?a.slice(e):new Uint8Array(a).subarray(e),c=new Uint8Array(b.byteLength+2+d.byteLength),c[0]=255,c[1]=216,c.set(new Uint8Array(b),2),c.set(new Uint8Array(d),b.byteLength+2),c.buffer}},a.parseMeta=function(){return b.parse.apply(b,arguments)},a.updateImageHead=function(){return b.updateImageHead.apply(b,arguments)},b}),b("runtime/html5/imagemeta/exif",["base","runtime/html5/imagemeta"],function(a,b){var c={};return c.ExifMap=function(){return this},c.ExifMap.prototype.map={Orientation:274},c.ExifMap.prototype.get=function(a){return this[a]||this[this.map[a]]},c.exifTagTypes={1:{getValue:function(a,b){return a.getUint8(b)},size:1},2:{getValue:function(a,b){return String.fromCharCode(a.getUint8(b))},size:1,ascii:!0},3:{getValue:function(a,b,c){return a.getUint16(b,c)},size:2},4:{getValue:function(a,b,c){return a.getUint32(b,c)
-},size:4},5:{getValue:function(a,b,c){return a.getUint32(b,c)/a.getUint32(b+4,c)},size:8},9:{getValue:function(a,b,c){return a.getInt32(b,c)},size:4},10:{getValue:function(a,b,c){return a.getInt32(b,c)/a.getInt32(b+4,c)},size:8}},c.exifTagTypes[7]=c.exifTagTypes[1],c.getExifValue=function(b,d,e,f,g,h){var i,j,k,l,m,n,o=c.exifTagTypes[f];if(!o)return void a.log("Invalid Exif data: Invalid tag type.");if(i=o.size*g,j=i>4?d+b.getUint32(e+8,h):e+8,j+i>b.byteLength)return void a.log("Invalid Exif data: Invalid data offset.");if(1===g)return o.getValue(b,j,h);for(k=[],l=0;g>l;l+=1)k[l]=o.getValue(b,j+l*o.size,h);if(o.ascii){for(m="",l=0;lb.byteLength)return void a.log("Invalid Exif data: Invalid directory offset.");if(g=b.getUint16(d,e),h=d+2+12*g,h+4>b.byteLength)return void a.log("Invalid Exif data: Invalid directory size.");for(i=0;g>i;i+=1)this.parseExifTag(b,c,d+2+12*i,e,f);return b.getUint32(h,e)},c.parseExifData=function(b,d,e,f){var g,h,i=d+10;if(1165519206===b.getUint32(d+4)){if(i+8>b.byteLength)return void a.log("Invalid Exif data: Invalid segment size.");if(0!==b.getUint16(d+8))return void a.log("Invalid Exif data: Missing byte alignment offset.");switch(b.getUint16(i)){case 18761:g=!0;break;case 19789:g=!1;break;default:return void a.log("Invalid Exif data: Invalid byte alignment marker.")}if(42!==b.getUint16(i+2,g))return void a.log("Invalid Exif data: Missing TIFF marker.");h=b.getUint32(i+4,g),f.exif=new c.ExifMap,h=c.parseExifTags(b,i,i+h,g,f)}},b.parsers[65505].push(c.parseExifData),c}),b("runtime/html5/image",["base","runtime/html5/runtime","runtime/html5/util"],function(a,b,c){var d="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D";return b.register("Image",{modified:!1,init:function(){var a=this,b=new Image;b.onload=function(){a._info={type:a.type,width:this.width,height:this.height},a._metas||"image/jpeg"!==a.type?a.owner.trigger("load"):c.parseMeta(a._blob,function(b,c){a._metas=c,a.owner.trigger("load")})},b.onerror=function(){a.owner.trigger("error")},a._img=b},loadFromBlob:function(a){var b=this,d=b._img;b._blob=a,b.type=a.type,d.src=c.createObjectURL(a.getSource()),b.owner.once("load",function(){c.revokeObjectURL(d.src)})},resize:function(a,b){var c=this._canvas||(this._canvas=document.createElement("canvas"));this._resize(this._img,c,a,b),this._blob=null,this.modified=!0,this.owner.trigger("complete")},getAsBlob:function(a){var b,d=this._blob,e=this.options;if(a=a||this.type,this.modified||this.type!==a){if(b=this._canvas,"image/jpeg"===a){if(d=c.canvasToDataUrl(b,"image/jpeg",e.quality),e.preserveHeaders&&this._metas&&this._metas.imageHead)return d=c.dataURL2ArrayBuffer(d),d=c.updateImageHead(d,this._metas.imageHead),d=c.arrayBufferToBlob(d,a)}else d=c.canvasToDataUrl(b,a);d=c.dataURL2Blob(d)}return d},getAsDataUrl:function(a){var b=this.options;return a=a||this.type,"image/jpeg"===a?c.canvasToDataUrl(this._canvas,a,b.quality):this._canvas.toDataURL(a)},getOrientation:function(){return this._metas&&this._metas.exif&&this._metas.exif.get("Orientation")||1},info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},destroy:function(){var a=this._canvas;this._img.onload=null,a&&(a.getContext("2d").clearRect(0,0,a.width,a.height),a.width=a.height=0,this._canvas=null),this._img.src=d,this._img=this._blob=null},_resize:function(a,b,c,d){var e,f,g,h,i,j=this.options,k=a.width,l=a.height,m=this.getOrientation();~[5,6,7,8].indexOf(m)&&(c^=d,d^=c,c^=d),e=Math[j.crop?"max":"min"](c/k,d/l),j.allowMagnify||(e=Math.min(1,e)),f=k*e,g=l*e,j.crop?(b.width=c,b.height=d):(b.width=f,b.height=g),h=(b.width-f)/2,i=(b.height-g)/2,j.preserveHeaders||this._rotate2Orientaion(b,m),this._renderImageToCanvas(b,a,h,i,f,g)},_rotate2Orientaion:function(a,b){var c=a.width,d=a.height,e=a.getContext("2d");switch(b){case 5:case 6:case 7:case 8:a.width=d,a.height=c}switch(b){case 2:e.translate(c,0),e.scale(-1,1);break;case 3:e.translate(c,d),e.rotate(Math.PI);break;case 4:e.translate(0,d),e.scale(1,-1);break;case 5:e.rotate(.5*Math.PI),e.scale(1,-1);break;case 6:e.rotate(.5*Math.PI),e.translate(0,-d);break;case 7:e.rotate(.5*Math.PI),e.translate(c,-d),e.scale(-1,1);break;case 8:e.rotate(-.5*Math.PI),e.translate(-c,0)}},_renderImageToCanvas:function(){function b(a,b,c){var d,e,f,g=document.createElement("canvas"),h=g.getContext("2d"),i=0,j=c,k=c;for(g.width=1,g.height=c,h.drawImage(a,0,0),d=h.getImageData(0,0,1,c).data;k>i;)e=d[4*(k-1)+3],0===e?j=k:i=k,k=j+i>>1;return f=k/c,0===f?1:f}function c(a){var b,c,d=a.naturalWidth,e=a.naturalHeight;return d*e>1048576?(b=document.createElement("canvas"),b.width=b.height=1,c=b.getContext("2d"),c.drawImage(a,-d+1,0),0===c.getImageData(0,0,1,1).data[3]):!1}return a.os.ios?a.os.ios>=7?function(a,c,d,e,f,g){var h=c.naturalWidth,i=c.naturalHeight,j=b(c,h,i);return a.getContext("2d").drawImage(c,0,0,h*j,i*j,d,e,f,g)}:function(a,d,e,f,g,h){var i,j,k,l,m,n,o,p=d.naturalWidth,q=d.naturalHeight,r=a.getContext("2d"),s=c(d),t="image/jpeg"===this.type,u=1024,v=0,w=0;for(s&&(p/=2,q/=2),r.save(),i=document.createElement("canvas"),i.width=i.height=u,j=i.getContext("2d"),k=t?b(d,p,q):1,l=Math.ceil(u*g/p),m=Math.ceil(u*h/q/k);q>v;){for(n=0,o=0;p>n;)j.clearRect(0,0,u,u),j.drawImage(d,-n,-v),r.drawImage(i,0,0,u,u,e+o,f+w,l,m),n+=u,o+=l;v+=u,w+=m}r.restore(),i=j=null}:function(a,b,c,d,e,f){a.getContext("2d").drawImage(b,c,d,e,f)}}()})}),b("runtime/html5/jpegencoder",[],function(){function a(a){function b(a){for(var b=[16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99],c=0;64>c;c++){var d=y((b[c]*a+50)/100);1>d?d=1:d>255&&(d=255),z[P[c]]=d}for(var e=[17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99],f=0;64>f;f++){var g=y((e[f]*a+50)/100);1>g?g=1:g>255&&(g=255),A[P[f]]=g}for(var h=[1,1.387039845,1.306562965,1.175875602,1,.785694958,.5411961,.275899379],i=0,j=0;8>j;j++)for(var k=0;8>k;k++)B[i]=1/(z[P[i]]*h[j]*h[k]*8),C[i]=1/(A[P[i]]*h[j]*h[k]*8),i++}function c(a,b){for(var c=0,d=0,e=new Array,f=1;16>=f;f++){for(var g=1;g<=a[f];g++)e[b[d]]=[],e[b[d]][0]=c,e[b[d]][1]=f,d++,c++;c*=2}return e}function d(){t=c(Q,R),u=c(U,V),v=c(S,T),w=c(W,X)}function e(){for(var a=1,b=2,c=1;15>=c;c++){for(var d=a;b>d;d++)E[32767+d]=c,D[32767+d]=[],D[32767+d][1]=c,D[32767+d][0]=d;for(var e=-(b-1);-a>=e;e++)E[32767+e]=c,D[32767+e]=[],D[32767+e][1]=c,D[32767+e][0]=b-1+e;a<<=1,b<<=1}}function f(){for(var a=0;256>a;a++)O[a]=19595*a,O[a+256>>0]=38470*a,O[a+512>>0]=7471*a+32768,O[a+768>>0]=-11059*a,O[a+1024>>0]=-21709*a,O[a+1280>>0]=32768*a+8421375,O[a+1536>>0]=-27439*a,O[a+1792>>0]=-5329*a}function g(a){for(var b=a[0],c=a[1]-1;c>=0;)b&1<J&&(255==I?(h(255),h(0)):h(I),J=7,I=0)}function h(a){H.push(N[a])}function i(a){h(a>>8&255),h(255&a)}function j(a,b){var c,d,e,f,g,h,i,j,k,l=0,m=8,n=64;for(k=0;m>k;++k){c=a[l],d=a[l+1],e=a[l+2],f=a[l+3],g=a[l+4],h=a[l+5],i=a[l+6],j=a[l+7];var o=c+j,p=c-j,q=d+i,r=d-i,s=e+h,t=e-h,u=f+g,v=f-g,w=o+u,x=o-u,y=q+s,z=q-s;a[l]=w+y,a[l+4]=w-y;var A=.707106781*(z+x);a[l+2]=x+A,a[l+6]=x-A,w=v+t,y=t+r,z=r+p;var B=.382683433*(w-z),C=.5411961*w+B,D=1.306562965*z+B,E=.707106781*y,G=p+E,H=p-E;a[l+5]=H+C,a[l+3]=H-C,a[l+1]=G+D,a[l+7]=G-D,l+=8}for(l=0,k=0;m>k;++k){c=a[l],d=a[l+8],e=a[l+16],f=a[l+24],g=a[l+32],h=a[l+40],i=a[l+48],j=a[l+56];var I=c+j,J=c-j,K=d+i,L=d-i,M=e+h,N=e-h,O=f+g,P=f-g,Q=I+O,R=I-O,S=K+M,T=K-M;a[l]=Q+S,a[l+32]=Q-S;var U=.707106781*(T+R);a[l+16]=R+U,a[l+48]=R-U,Q=P+N,S=N+L,T=L+J;var V=.382683433*(Q-T),W=.5411961*Q+V,X=1.306562965*T+V,Y=.707106781*S,Z=J+Y,$=J-Y;a[l+40]=$+W,a[l+24]=$-W,a[l+8]=Z+X,a[l+56]=Z-X,l++}var _;for(k=0;n>k;++k)_=a[k]*b[k],F[k]=_>0?_+.5|0:_-.5|0;return F}function k(){i(65504),i(16),h(74),h(70),h(73),h(70),h(0),h(1),h(1),h(0),i(1),i(1),h(0),h(0)}function l(a,b){i(65472),i(17),h(8),i(b),i(a),h(3),h(1),h(17),h(0),h(2),h(17),h(1),h(3),h(17),h(1)}function m(){i(65499),i(132),h(0);for(var a=0;64>a;a++)h(z[a]);h(1);for(var b=0;64>b;b++)h(A[b])}function n(){i(65476),i(418),h(0);for(var a=0;16>a;a++)h(Q[a+1]);for(var b=0;11>=b;b++)h(R[b]);h(16);for(var c=0;16>c;c++)h(S[c+1]);for(var d=0;161>=d;d++)h(T[d]);h(1);for(var e=0;16>e;e++)h(U[e+1]);for(var f=0;11>=f;f++)h(V[f]);h(17);for(var g=0;16>g;g++)h(W[g+1]);for(var j=0;161>=j;j++)h(X[j])}function o(){i(65498),i(12),h(3),h(1),h(0),h(2),h(17),h(3),h(17),h(0),h(63),h(0)}function p(a,b,c,d,e){for(var f,h=e[0],i=e[240],k=16,l=63,m=64,n=j(a,b),o=0;m>o;++o)G[P[o]]=n[o];var p=G[0]-c;c=G[0],0==p?g(d[0]):(f=32767+p,g(d[E[f]]),g(D[f]));for(var q=63;q>0&&0==G[q];q--);if(0==q)return g(h),c;for(var r,s=1;q>=s;){for(var t=s;0==G[s]&&q>=s;++s);var u=s-t;if(u>=k){r=u>>4;for(var v=1;r>=v;++v)g(i);u=15&u}f=32767+G[s],g(e[(u<<4)+E[f]]),g(D[f]),s++}return q!=l&&g(h),c}function q(){for(var a=String.fromCharCode,b=0;256>b;b++)N[b]=a(b)}function r(a){if(0>=a&&(a=1),a>100&&(a=100),x!=a){var c=0;c=Math.floor(50>a?5e3/a:200-2*a),b(c),x=a}}function s(){a||(a=50),q(),d(),e(),f(),r(a)}var t,u,v,w,x,y=(Math.round,Math.floor),z=new Array(64),A=new Array(64),B=new Array(64),C=new Array(64),D=new Array(65535),E=new Array(65535),F=new Array(64),G=new Array(64),H=[],I=0,J=7,K=new Array(64),L=new Array(64),M=new Array(64),N=new Array(256),O=new Array(2048),P=[0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63],Q=[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0],R=[0,1,2,3,4,5,6,7,8,9,10,11],S=[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125],T=[1,2,3,0,4,17,5,18,33,49,65,6,19,81,97,7,34,113,20,50,129,145,161,8,35,66,177,193,21,82,209,240,36,51,98,114,130,9,10,22,23,24,25,26,37,38,39,40,41,42,52,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,225,226,227,228,229,230,231,232,233,234,241,242,243,244,245,246,247,248,249,250],U=[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0],V=[0,1,2,3,4,5,6,7,8,9,10,11],W=[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,119],X=[0,1,2,3,17,4,5,33,49,6,18,65,81,7,97,113,19,34,50,129,8,20,66,145,161,177,193,9,35,51,82,240,21,98,114,209,10,22,36,52,225,37,241,23,24,25,26,38,39,40,41,42,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,130,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,226,227,228,229,230,231,232,233,234,242,243,244,245,246,247,248,249,250];this.encode=function(a,b){b&&r(b),H=new Array,I=0,J=7,i(65496),k(),m(),l(a.width,a.height),n(),o();var c=0,d=0,e=0;I=0,J=7,this.encode.displayName="_encode_";for(var f,h,j,q,s,x,y,z,A,D=a.data,E=a.width,F=a.height,G=4*E,N=0;F>N;){for(f=0;G>f;){for(s=G*N+f,x=s,y=-1,z=0,A=0;64>A;A++)z=A>>3,y=4*(7&A),x=s+z*G+y,N+z>=F&&(x-=G*(N+1+z-F)),f+y>=G&&(x-=f+y-G+4),h=D[x++],j=D[x++],q=D[x++],K[A]=(O[h]+O[j+256>>0]+O[q+512>>0]>>16)-128,L[A]=(O[h+768>>0]+O[j+1024>>0]+O[q+1280>>0]>>16)-128,M[A]=(O[h+1280>>0]+O[j+1536>>0]+O[q+1792>>0]>>16)-128;c=p(K,B,c,t,v),d=p(L,C,d,u,w),e=p(M,C,e,u,w),f+=32}N+=8}if(J>=0){var P=[];P[1]=J+1,P[0]=(1<=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("webuploader",["base","widgets/filepicker","widgets/image","widgets/queue","widgets/runtime","widgets/upload","runtime/html5/blob","runtime/html5/filepicker","runtime/html5/imagemeta/exif","runtime/html5/image","runtime/html5/androidpatch","runtime/html5/transport"],function(a){return a}),c("webuploader")});
\ No newline at end of file
diff --git a/www/js/ueditor/third-party/webuploader/webuploader.flashonly.js b/www/js/ueditor/third-party/webuploader/webuploader.flashonly.js
deleted file mode 100644
index 10f44969ff..0000000000
--- a/www/js/ueditor/third-party/webuploader/webuploader.flashonly.js
+++ /dev/null
@@ -1,4176 +0,0 @@
-/*! WebUploader 0.1.2 */
-
-
-/**
- * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
- *
- * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
- */
-(function( root, factory ) {
- var modules = {},
-
- // 内部require, 简单不完全实现。
- // https://github.com/amdjs/amdjs-api/wiki/require
- _require = function( deps, callback ) {
- var args, len, i;
-
- // 如果deps不是数组,则直接返回指定module
- if ( typeof deps === 'string' ) {
- return getModule( deps );
- } else {
- args = [];
- for( len = deps.length, i = 0; i < len; i++ ) {
- args.push( getModule( deps[ i ] ) );
- }
-
- return callback.apply( null, args );
- }
- },
-
- // 内部define,暂时不支持不指定id.
- _define = function( id, deps, factory ) {
- if ( arguments.length === 2 ) {
- factory = deps;
- deps = null;
- }
-
- _require( deps || [], function() {
- setModule( id, factory, arguments );
- });
- },
-
- // 设置module, 兼容CommonJs写法。
- setModule = function( id, factory, args ) {
- var module = {
- exports: factory
- },
- returned;
-
- if ( typeof factory === 'function' ) {
- args.length || (args = [ _require, module.exports, module ]);
- returned = factory.apply( null, args );
- returned !== undefined && (module.exports = returned);
- }
-
- modules[ id ] = module.exports;
- },
-
- // 根据id获取module
- getModule = function( id ) {
- var module = modules[ id ] || root[ id ];
-
- if ( !module ) {
- throw new Error( '`' + id + '` is undefined' );
- }
-
- return module;
- },
-
- // 将所有modules,将路径ids装换成对象。
- exportsTo = function( obj ) {
- var key, host, parts, part, last, ucFirst;
-
- // make the first character upper case.
- ucFirst = function( str ) {
- return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
- };
-
- for ( key in modules ) {
- host = obj;
-
- if ( !modules.hasOwnProperty( key ) ) {
- continue;
- }
-
- parts = key.split('/');
- last = ucFirst( parts.pop() );
-
- while( (part = ucFirst( parts.shift() )) ) {
- host[ part ] = host[ part ] || {};
- host = host[ part ];
- }
-
- host[ last ] = modules[ key ];
- }
- },
-
- exports = factory( root, _define, _require ),
- origin;
-
- // exports every module.
- exportsTo( exports );
-
- if ( typeof module === 'object' && typeof module.exports === 'object' ) {
-
- // For CommonJS and CommonJS-like environments where a proper window is present,
- module.exports = exports;
- } else if ( typeof define === 'function' && define.amd ) {
-
- // Allow using this built library as an AMD module
- // in another project. That other project will only
- // see this AMD call, not the internal modules in
- // the closure below.
- define([], exports );
- } else {
-
- // Browser globals case. Just assign the
- // result to a property on the global.
- origin = root.WebUploader;
- root.WebUploader = exports;
- root.WebUploader.noConflict = function() {
- root.WebUploader = origin;
- };
- }
-})( this, function( window, define, require ) {
-
-
- /**
- * @fileOverview jQuery or Zepto
- */
- define('dollar-third',[],function() {
- return window.jQuery || window.Zepto;
- });
- /**
- * @fileOverview Dom 操作相关
- */
- define('dollar',[
- 'dollar-third'
- ], function( _ ) {
- return _;
- });
- /**
- * @fileOverview 使用jQuery的Promise
- */
- define('promise-third',[
- 'dollar'
- ], function( $ ) {
- return {
- Deferred: $.Deferred,
- when: $.when,
-
- isPromise: function( anything ) {
- return anything && typeof anything.then === 'function';
- }
- };
- });
- /**
- * @fileOverview Promise/A+
- */
- define('promise',[
- 'promise-third'
- ], function( _ ) {
- return _;
- });
- /**
- * @fileOverview 基础类方法。
- */
-
- /**
- * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
- *
- * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
- * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
- *
- * * module `base`:WebUploader.Base
- * * module `file`: WebUploader.File
- * * module `lib/dnd`: WebUploader.Lib.Dnd
- * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
- *
- *
- * 以下文档将可能省略`WebUploader`前缀。
- * @module WebUploader
- * @title WebUploader API文档
- */
- define('base',[
- 'dollar',
- 'promise'
- ], function( $, promise ) {
-
- var noop = function() {},
- call = Function.call;
-
- // http://jsperf.com/uncurrythis
- // 反科里化
- function uncurryThis( fn ) {
- return function() {
- return call.apply( fn, arguments );
- };
- }
-
- function bindFn( fn, context ) {
- return function() {
- return fn.apply( context, arguments );
- };
- }
-
- function createObject( proto ) {
- var f;
-
- if ( Object.create ) {
- return Object.create( proto );
- } else {
- f = function() {};
- f.prototype = proto;
- return new f();
- }
- }
-
-
- /**
- * 基础类,提供一些简单常用的方法。
- * @class Base
- */
- return {
-
- /**
- * @property {String} version 当前版本号。
- */
- version: '0.1.2',
-
- /**
- * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
- */
- $: $,
-
- Deferred: promise.Deferred,
-
- isPromise: promise.isPromise,
-
- when: promise.when,
-
- /**
- * @description 简单的浏览器检查结果。
- *
- * * `webkit` webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
- * * `chrome` chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
- * * `ie` ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
- * * `firefox` firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
- * * `safari` safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
- * * `opera` opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
- *
- * @property {Object} [browser]
- */
- browser: (function( ua ) {
- var ret = {},
- webkit = ua.match( /WebKit\/([\d.]+)/ ),
- chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
- ua.match( /CriOS\/([\d.]+)/ ),
-
- ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
- ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i),
- firefox = ua.match( /Firefox\/([\d.]+)/ ),
- safari = ua.match( /Safari\/([\d.]+)/ ),
- opera = ua.match( /OPR\/([\d.]+)/ );
-
- webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
- chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
- ie && (ret.ie = parseFloat( ie[ 1 ] ));
- firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
- safari && (ret.safari = parseFloat( safari[ 1 ] ));
- opera && (ret.opera = parseFloat( opera[ 1 ] ));
-
- return ret;
- })( navigator.userAgent ),
-
- /**
- * @description 操作系统检查结果。
- *
- * * `android` 如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
- * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
- * @property {Object} [os]
- */
- os: (function( ua ) {
- var ret = {},
-
- // osx = !!ua.match( /\(Macintosh\; Intel / ),
- android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
- ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
-
- // osx && (ret.osx = true);
- android && (ret.android = parseFloat( android[ 1 ] ));
- ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
-
- return ret;
- })( navigator.userAgent ),
-
- /**
- * 实现类与类之间的继承。
- * @method inherits
- * @grammar Base.inherits( super ) => child
- * @grammar Base.inherits( super, protos ) => child
- * @grammar Base.inherits( super, protos, statics ) => child
- * @param {Class} super 父类
- * @param {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
- * @param {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
- * @param {Object} [statics] 静态属性或方法。
- * @return {Class} 返回子类。
- * @example
- * function Person() {
- * console.log( 'Super' );
- * }
- * Person.prototype.hello = function() {
- * console.log( 'hello' );
- * };
- *
- * var Manager = Base.inherits( Person, {
- * world: function() {
- * console.log( 'World' );
- * }
- * });
- *
- * // 因为没有指定构造器,父类的构造器将会执行。
- * var instance = new Manager(); // => Super
- *
- * // 继承子父类的方法
- * instance.hello(); // => hello
- * instance.world(); // => World
- *
- * // 子类的__super__属性指向父类
- * console.log( Manager.__super__ === Person ); // => true
- */
- inherits: function( Super, protos, staticProtos ) {
- var child;
-
- if ( typeof protos === 'function' ) {
- child = protos;
- protos = null;
- } else if ( protos && protos.hasOwnProperty('constructor') ) {
- child = protos.constructor;
- } else {
- child = function() {
- return Super.apply( this, arguments );
- };
- }
-
- // 复制静态方法
- $.extend( true, child, Super, staticProtos || {} );
-
- /* jshint camelcase: false */
-
- // 让子类的__super__属性指向父类。
- child.__super__ = Super.prototype;
-
- // 构建原型,添加原型方法或属性。
- // 暂时用Object.create实现。
- child.prototype = createObject( Super.prototype );
- protos && $.extend( true, child.prototype, protos );
-
- return child;
- },
-
- /**
- * 一个不做任何事情的方法。可以用来赋值给默认的callback.
- * @method noop
- */
- noop: noop,
-
- /**
- * 返回一个新的方法,此方法将已指定的`context`来执行。
- * @grammar Base.bindFn( fn, context ) => Function
- * @method bindFn
- * @example
- * var doSomething = function() {
- * console.log( this.name );
- * },
- * obj = {
- * name: 'Object Name'
- * },
- * aliasFn = Base.bind( doSomething, obj );
- *
- * aliasFn(); // => Object Name
- *
- */
- bindFn: bindFn,
-
- /**
- * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。
- * @grammar Base.log( args... ) => undefined
- * @method log
- */
- log: (function() {
- if ( window.console ) {
- return bindFn( console.log, console );
- }
- return noop;
- })(),
-
- nextTick: (function() {
-
- return function( cb ) {
- setTimeout( cb, 1 );
- };
-
- // @bug 当浏览器不在当前窗口时就停了。
- // var next = window.requestAnimationFrame ||
- // window.webkitRequestAnimationFrame ||
- // window.mozRequestAnimationFrame ||
- // function( cb ) {
- // window.setTimeout( cb, 1000 / 60 );
- // };
-
- // // fix: Uncaught TypeError: Illegal invocation
- // return bindFn( next, window );
- })(),
-
- /**
- * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
- * 将用来将非数组对象转化成数组对象。
- * @grammar Base.slice( target, start[, end] ) => Array
- * @method slice
- * @example
- * function doSomthing() {
- * var args = Base.slice( arguments, 1 );
- * console.log( args );
- * }
- *
- * doSomthing( 'ignored', 'arg2', 'arg3' ); // => Array ["arg2", "arg3"]
- */
- slice: uncurryThis( [].slice ),
-
- /**
- * 生成唯一的ID
- * @method guid
- * @grammar Base.guid() => String
- * @grammar Base.guid( prefx ) => String
- */
- guid: (function() {
- var counter = 0;
-
- return function( prefix ) {
- var guid = (+new Date()).toString( 32 ),
- i = 0;
-
- for ( ; i < 5; i++ ) {
- guid += Math.floor( Math.random() * 65535 ).toString( 32 );
- }
-
- return (prefix || 'wu_') + guid + (counter++).toString( 32 );
- };
- })(),
-
- /**
- * 格式化文件大小, 输出成带单位的字符串
- * @method formatSize
- * @grammar Base.formatSize( size ) => String
- * @grammar Base.formatSize( size, pointLength ) => String
- * @grammar Base.formatSize( size, pointLength, units ) => String
- * @param {Number} size 文件大小
- * @param {Number} [pointLength=2] 精确到的小数点数。
- * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
- * @example
- * console.log( Base.formatSize( 100 ) ); // => 100B
- * console.log( Base.formatSize( 1024 ) ); // => 1.00K
- * console.log( Base.formatSize( 1024, 0 ) ); // => 1K
- * console.log( Base.formatSize( 1024 * 1024 ) ); // => 1.00M
- * console.log( Base.formatSize( 1024 * 1024 * 1024 ) ); // => 1.00G
- * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) ); // => 1024MB
- */
- formatSize: function( size, pointLength, units ) {
- var unit;
-
- units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
-
- while ( (unit = units.shift()) && size > 1024 ) {
- size = size / 1024;
- }
-
- return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
- unit;
- }
- };
- });
- /**
- * 事件处理类,可以独立使用,也可以扩展给对象使用。
- * @fileOverview Mediator
- */
- define('mediator',[
- 'base'
- ], function( Base ) {
- var $ = Base.$,
- slice = [].slice,
- separator = /\s+/,
- protos;
-
- // 根据条件过滤出事件handlers.
- function findHandlers( arr, name, callback, context ) {
- return $.grep( arr, function( handler ) {
- return handler &&
- (!name || handler.e === name) &&
- (!callback || handler.cb === callback ||
- handler.cb._cb === callback) &&
- (!context || handler.ctx === context);
- });
- }
-
- function eachEvent( events, callback, iterator ) {
- // 不支持对象,只支持多个event用空格隔开
- $.each( (events || '').split( separator ), function( _, key ) {
- iterator( key, callback );
- });
- }
-
- function triggerHanders( events, args ) {
- var stoped = false,
- i = -1,
- len = events.length,
- handler;
-
- while ( ++i < len ) {
- handler = events[ i ];
-
- if ( handler.cb.apply( handler.ctx2, args ) === false ) {
- stoped = true;
- break;
- }
- }
-
- return !stoped;
- }
-
- protos = {
-
- /**
- * 绑定事件。
- *
- * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
- * ```javascript
- * var obj = {};
- *
- * // 使得obj有事件行为
- * Mediator.installTo( obj );
- *
- * obj.on( 'testa', function( arg1, arg2 ) {
- * console.log( arg1, arg2 ); // => 'arg1', 'arg2'
- * });
- *
- * obj.trigger( 'testa', 'arg1', 'arg2' );
- * ```
- *
- * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
- * 切会影响到`trigger`方法的返回值,为`false`。
- *
- * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
- * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
- * ```javascript
- * obj.on( 'all', function( type, arg1, arg2 ) {
- * console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
- * });
- * ```
- *
- * @method on
- * @grammar on( name, callback[, context] ) => self
- * @param {String} name 事件名,支持多个事件用空格隔开
- * @param {Function} callback 事件处理器
- * @param {Object} [context] 事件处理器的上下文。
- * @return {self} 返回自身,方便链式
- * @chainable
- * @class Mediator
- */
- on: function( name, callback, context ) {
- var me = this,
- set;
-
- if ( !callback ) {
- return this;
- }
-
- set = this._events || (this._events = []);
-
- eachEvent( name, callback, function( name, callback ) {
- var handler = { e: name };
-
- handler.cb = callback;
- handler.ctx = context;
- handler.ctx2 = context || me;
- handler.id = set.length;
-
- set.push( handler );
- });
-
- return this;
- },
-
- /**
- * 绑定事件,且当handler执行完后,自动解除绑定。
- * @method once
- * @grammar once( name, callback[, context] ) => self
- * @param {String} name 事件名
- * @param {Function} callback 事件处理器
- * @param {Object} [context] 事件处理器的上下文。
- * @return {self} 返回自身,方便链式
- * @chainable
- */
- once: function( name, callback, context ) {
- var me = this;
-
- if ( !callback ) {
- return me;
- }
-
- eachEvent( name, callback, function( name, callback ) {
- var once = function() {
- me.off( name, once );
- return callback.apply( context || me, arguments );
- };
-
- once._cb = callback;
- me.on( name, once, context );
- });
-
- return me;
- },
-
- /**
- * 解除事件绑定
- * @method off
- * @grammar off( [name[, callback[, context] ] ] ) => self
- * @param {String} [name] 事件名
- * @param {Function} [callback] 事件处理器
- * @param {Object} [context] 事件处理器的上下文。
- * @return {self} 返回自身,方便链式
- * @chainable
- */
- off: function( name, cb, ctx ) {
- var events = this._events;
-
- if ( !events ) {
- return this;
- }
-
- if ( !name && !cb && !ctx ) {
- this._events = [];
- return this;
- }
-
- eachEvent( name, cb, function( name, cb ) {
- $.each( findHandlers( events, name, cb, ctx ), function() {
- delete events[ this.id ];
- });
- });
-
- return this;
- },
-
- /**
- * 触发事件
- * @method trigger
- * @grammar trigger( name[, args...] ) => self
- * @param {String} type 事件名
- * @param {*} [...] 任意参数
- * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
- */
- trigger: function( type ) {
- var args, events, allEvents;
-
- if ( !this._events || !type ) {
- return this;
- }
-
- args = slice.call( arguments, 1 );
- events = findHandlers( this._events, type );
- allEvents = findHandlers( this._events, 'all' );
-
- return triggerHanders( events, args ) &&
- triggerHanders( allEvents, arguments );
- }
- };
-
- /**
- * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
- * 主要目的是负责模块与模块之间的合作,降低耦合度。
- *
- * @class Mediator
- */
- return $.extend({
-
- /**
- * 可以通过这个接口,使任何对象具备事件功能。
- * @method installTo
- * @param {Object} obj 需要具备事件行为的对象。
- * @return {Object} 返回obj.
- */
- installTo: function( obj ) {
- return $.extend( obj, protos );
- }
-
- }, protos );
- });
- /**
- * @fileOverview Uploader上传类
- */
- define('uploader',[
- 'base',
- 'mediator'
- ], function( Base, Mediator ) {
-
- var $ = Base.$;
-
- /**
- * 上传入口类。
- * @class Uploader
- * @constructor
- * @grammar new Uploader( opts ) => Uploader
- * @example
- * var uploader = WebUploader.Uploader({
- * swf: 'path_of_swf/Uploader.swf',
- *
- * // 开起分片上传。
- * chunked: true
- * });
- */
- function Uploader( opts ) {
- this.options = $.extend( true, {}, Uploader.options, opts );
- this._init( this.options );
- }
-
- // default Options
- // widgets中有相应扩展
- Uploader.options = {};
- Mediator.installTo( Uploader.prototype );
-
- // 批量添加纯命令式方法。
- $.each({
- upload: 'start-upload',
- stop: 'stop-upload',
- getFile: 'get-file',
- getFiles: 'get-files',
- addFile: 'add-file',
- addFiles: 'add-file',
- sort: 'sort-files',
- removeFile: 'remove-file',
- skipFile: 'skip-file',
- retry: 'retry',
- isInProgress: 'is-in-progress',
- makeThumb: 'make-thumb',
- getDimension: 'get-dimension',
- addButton: 'add-btn',
- getRuntimeType: 'get-runtime-type',
- refresh: 'refresh',
- disable: 'disable',
- enable: 'enable',
- reset: 'reset'
- }, function( fn, command ) {
- Uploader.prototype[ fn ] = function() {
- return this.request( command, arguments );
- };
- });
-
- $.extend( Uploader.prototype, {
- state: 'pending',
-
- _init: function( opts ) {
- var me = this;
-
- me.request( 'init', opts, function() {
- me.state = 'ready';
- me.trigger('ready');
- });
- },
-
- /**
- * 获取或者设置Uploader配置项。
- * @method option
- * @grammar option( key ) => *
- * @grammar option( key, val ) => self
- * @example
- *
- * // 初始状态图片上传前不会压缩
- * var uploader = new WebUploader.Uploader({
- * resize: null;
- * });
- *
- * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
- * uploader.options( 'resize', {
- * width: 1600,
- * height: 1600
- * });
- */
- option: function( key, val ) {
- var opts = this.options;
-
- // setter
- if ( arguments.length > 1 ) {
-
- if ( $.isPlainObject( val ) &&
- $.isPlainObject( opts[ key ] ) ) {
- $.extend( opts[ key ], val );
- } else {
- opts[ key ] = val;
- }
-
- } else { // getter
- return key ? opts[ key ] : opts;
- }
- },
-
- /**
- * 获取文件统计信息。返回一个包含一下信息的对象。
- * * `successNum` 上传成功的文件数
- * * `uploadFailNum` 上传失败的文件数
- * * `cancelNum` 被删除的文件数
- * * `invalidNum` 无效的文件数
- * * `queueNum` 还在队列中的文件数
- * @method getStats
- * @grammar getStats() => Object
- */
- getStats: function() {
- // return this._mgr.getStats.apply( this._mgr, arguments );
- var stats = this.request('get-stats');
-
- return {
- successNum: stats.numOfSuccess,
-
- // who care?
- // queueFailNum: 0,
- cancelNum: stats.numOfCancel,
- invalidNum: stats.numOfInvalid,
- uploadFailNum: stats.numOfUploadFailed,
- queueNum: stats.numOfQueue
- };
- },
-
- // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
- trigger: function( type/*, args...*/ ) {
- var args = [].slice.call( arguments, 1 ),
- opts = this.options,
- name = 'on' + type.substring( 0, 1 ).toUpperCase() +
- type.substring( 1 );
-
- if (
- // 调用通过on方法注册的handler.
- Mediator.trigger.apply( this, arguments ) === false ||
-
- // 调用opts.onEvent
- $.isFunction( opts[ name ] ) &&
- opts[ name ].apply( this, args ) === false ||
-
- // 调用this.onEvent
- $.isFunction( this[ name ] ) &&
- this[ name ].apply( this, args ) === false ||
-
- // 广播所有uploader的事件。
- Mediator.trigger.apply( Mediator,
- [ this, type ].concat( args ) ) === false ) {
-
- return false;
- }
-
- return true;
- },
-
- // widgets/widget.js将补充此方法的详细文档。
- request: Base.noop
- });
-
- /**
- * 创建Uploader实例,等同于new Uploader( opts );
- * @method create
- * @class Base
- * @static
- * @grammar Base.create( opts ) => Uploader
- */
- Base.create = Uploader.create = function( opts ) {
- return new Uploader( opts );
- };
-
- // 暴露Uploader,可以通过它来扩展业务逻辑。
- Base.Uploader = Uploader;
-
- return Uploader;
- });
- /**
- * @fileOverview Runtime管理器,负责Runtime的选择, 连接
- */
- define('runtime/runtime',[
- 'base',
- 'mediator'
- ], function( Base, Mediator ) {
-
- var $ = Base.$,
- factories = {},
-
- // 获取对象的第一个key
- getFirstKey = function( obj ) {
- for ( var key in obj ) {
- if ( obj.hasOwnProperty( key ) ) {
- return key;
- }
- }
- return null;
- };
-
- // 接口类。
- function Runtime( options ) {
- this.options = $.extend({
- container: document.body
- }, options );
- this.uid = Base.guid('rt_');
- }
-
- $.extend( Runtime.prototype, {
-
- getContainer: function() {
- var opts = this.options,
- parent, container;
-
- if ( this._container ) {
- return this._container;
- }
-
- parent = $( opts.container || document.body );
- container = $( document.createElement('div') );
-
- container.attr( 'id', 'rt_' + this.uid );
- container.css({
- position: 'absolute',
- top: '0px',
- left: '0px',
- width: '1px',
- height: '1px',
- overflow: 'hidden'
- });
-
- parent.append( container );
- parent.addClass('webuploader-container');
- this._container = container;
- return container;
- },
-
- init: Base.noop,
- exec: Base.noop,
-
- destroy: function() {
- if ( this._container ) {
- this._container.parentNode.removeChild( this.__container );
- }
-
- this.off();
- }
- });
-
- Runtime.orders = 'html5,flash';
-
-
- /**
- * 添加Runtime实现。
- * @param {String} type 类型
- * @param {Runtime} factory 具体Runtime实现。
- */
- Runtime.addRuntime = function( type, factory ) {
- factories[ type ] = factory;
- };
-
- Runtime.hasRuntime = function( type ) {
- return !!(type ? factories[ type ] : getFirstKey( factories ));
- };
-
- Runtime.create = function( opts, orders ) {
- var type, runtime;
-
- orders = orders || Runtime.orders;
- $.each( orders.split( /\s*,\s*/g ), function() {
- if ( factories[ this ] ) {
- type = this;
- return false;
- }
- });
-
- type = type || getFirstKey( factories );
-
- if ( !type ) {
- throw new Error('Runtime Error');
- }
-
- runtime = new factories[ type ]( opts );
- return runtime;
- };
-
- Mediator.installTo( Runtime.prototype );
- return Runtime;
- });
-
- /**
- * @fileOverview Runtime管理器,负责Runtime的选择, 连接
- */
- define('runtime/client',[
- 'base',
- 'mediator',
- 'runtime/runtime'
- ], function( Base, Mediator, Runtime ) {
-
- var cache;
-
- cache = (function() {
- var obj = {};
-
- return {
- add: function( runtime ) {
- obj[ runtime.uid ] = runtime;
- },
-
- get: function( ruid, standalone ) {
- var i;
-
- if ( ruid ) {
- return obj[ ruid ];
- }
-
- for ( i in obj ) {
- // 有些类型不能重用,比如filepicker.
- if ( standalone && obj[ i ].__standalone ) {
- continue;
- }
-
- return obj[ i ];
- }
-
- return null;
- },
-
- remove: function( runtime ) {
- delete obj[ runtime.uid ];
- }
- };
- })();
-
- function RuntimeClient( component, standalone ) {
- var deferred = Base.Deferred(),
- runtime;
-
- this.uid = Base.guid('client_');
-
- // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
- this.runtimeReady = function( cb ) {
- return deferred.done( cb );
- };
-
- this.connectRuntime = function( opts, cb ) {
-
- // already connected.
- if ( runtime ) {
- throw new Error('already connected!');
- }
-
- deferred.done( cb );
-
- if ( typeof opts === 'string' && cache.get( opts ) ) {
- runtime = cache.get( opts );
- }
-
- // 像filePicker只能独立存在,不能公用。
- runtime = runtime || cache.get( null, standalone );
-
- // 需要创建
- if ( !runtime ) {
- runtime = Runtime.create( opts, opts.runtimeOrder );
- runtime.__promise = deferred.promise();
- runtime.once( 'ready', deferred.resolve );
- runtime.init();
- cache.add( runtime );
- runtime.__client = 1;
- } else {
- // 来自cache
- Base.$.extend( runtime.options, opts );
- runtime.__promise.then( deferred.resolve );
- runtime.__client++;
- }
-
- standalone && (runtime.__standalone = standalone);
- return runtime;
- };
-
- this.getRuntime = function() {
- return runtime;
- };
-
- this.disconnectRuntime = function() {
- if ( !runtime ) {
- return;
- }
-
- runtime.__client--;
-
- if ( runtime.__client <= 0 ) {
- cache.remove( runtime );
- delete runtime.__promise;
- runtime.destroy();
- }
-
- runtime = null;
- };
-
- this.exec = function() {
- if ( !runtime ) {
- return;
- }
-
- var args = Base.slice( arguments );
- component && args.unshift( component );
-
- return runtime.exec.apply( this, args );
- };
-
- this.getRuid = function() {
- return runtime && runtime.uid;
- };
-
- this.destroy = (function( destroy ) {
- return function() {
- destroy && destroy.apply( this, arguments );
- this.trigger('destroy');
- this.off();
- this.exec('destroy');
- this.disconnectRuntime();
- };
- })( this.destroy );
- }
-
- Mediator.installTo( RuntimeClient.prototype );
- return RuntimeClient;
- });
- /**
- * @fileOverview Blob
- */
- define('lib/blob',[
- 'base',
- 'runtime/client'
- ], function( Base, RuntimeClient ) {
-
- function Blob( ruid, source ) {
- var me = this;
-
- me.source = source;
- me.ruid = ruid;
-
- RuntimeClient.call( me, 'Blob' );
-
- this.uid = source.uid || this.uid;
- this.type = source.type || '';
- this.size = source.size || 0;
-
- if ( ruid ) {
- me.connectRuntime( ruid );
- }
- }
-
- Base.inherits( RuntimeClient, {
- constructor: Blob,
-
- slice: function( start, end ) {
- return this.exec( 'slice', start, end );
- },
-
- getSource: function() {
- return this.source;
- }
- });
-
- return Blob;
- });
- /**
- * 为了统一化Flash的File和HTML5的File而存在。
- * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
- * @fileOverview File
- */
- define('lib/file',[
- 'base',
- 'lib/blob'
- ], function( Base, Blob ) {
-
- var uid = 1,
- rExt = /\.([^.]+)$/;
-
- function File( ruid, file ) {
- var ext;
-
- Blob.apply( this, arguments );
- this.name = file.name || ('untitled' + uid++);
- ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
-
- // todo 支持其他类型文件的转换。
-
- // 如果有mimetype, 但是文件名里面没有找出后缀规律
- if ( !ext && this.type ) {
- ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?
- RegExp.$1.toLowerCase() : '';
- this.name += '.' + ext;
- }
-
- // 如果没有指定mimetype, 但是知道文件后缀。
- if ( !this.type && ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {
- this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);
- }
-
- this.ext = ext;
- this.lastModifiedDate = file.lastModifiedDate ||
- (new Date()).toLocaleString();
- }
-
- return Base.inherits( Blob, File );
- });
-
- /**
- * @fileOverview 错误信息
- */
- define('lib/filepicker',[
- 'base',
- 'runtime/client',
- 'lib/file'
- ], function( Base, RuntimeClent, File ) {
-
- var $ = Base.$;
-
- function FilePicker( opts ) {
- opts = this.options = $.extend({}, FilePicker.options, opts );
-
- opts.container = $( opts.id );
-
- if ( !opts.container.length ) {
- throw new Error('按钮指定错误');
- }
-
- opts.innerHTML = opts.innerHTML || opts.label ||
- opts.container.html() || '';
-
- opts.button = $( opts.button || document.createElement('div') );
- opts.button.html( opts.innerHTML );
- opts.container.html( opts.button );
-
- RuntimeClent.call( this, 'FilePicker', true );
- }
-
- FilePicker.options = {
- button: null,
- container: null,
- label: null,
- innerHTML: null,
- multiple: true,
- accept: null,
- name: 'file'
- };
-
- Base.inherits( RuntimeClent, {
- constructor: FilePicker,
-
- init: function() {
- var me = this,
- opts = me.options,
- button = opts.button;
-
- button.addClass('webuploader-pick');
-
- me.on( 'all', function( type ) {
- var files;
-
- switch ( type ) {
- case 'mouseenter':
- button.addClass('webuploader-pick-hover');
- break;
-
- case 'mouseleave':
- button.removeClass('webuploader-pick-hover');
- break;
-
- case 'change':
- files = me.exec('getFiles');
- me.trigger( 'select', $.map( files, function( file ) {
- file = new File( me.getRuid(), file );
-
- // 记录来源。
- file._refer = opts.container;
- return file;
- }), opts.container );
- break;
- }
- });
-
- me.connectRuntime( opts, function() {
- me.refresh();
- me.exec( 'init', opts );
- me.trigger('ready');
- });
-
- $( window ).on( 'resize', function() {
- me.refresh();
- });
- },
-
- refresh: function() {
- var shimContainer = this.getRuntime().getContainer(),
- button = this.options.button,
- width = button.outerWidth ?
- button.outerWidth() : button.width(),
-
- height = button.outerHeight ?
- button.outerHeight() : button.height(),
-
- pos = button.offset();
-
- width && height && shimContainer.css({
- bottom: 'auto',
- right: 'auto',
- width: width + 'px',
- height: height + 'px'
- }).offset( pos );
- },
-
- enable: function() {
- var btn = this.options.button;
-
- btn.removeClass('webuploader-pick-disable');
- this.refresh();
- },
-
- disable: function() {
- var btn = this.options.button;
-
- this.getRuntime().getContainer().css({
- top: '-99999px'
- });
-
- btn.addClass('webuploader-pick-disable');
- },
-
- destroy: function() {
- if ( this.runtime ) {
- this.exec('destroy');
- this.disconnectRuntime();
- }
- }
- });
-
- return FilePicker;
- });
-
- /**
- * @fileOverview 组件基类。
- */
- define('widgets/widget',[
- 'base',
- 'uploader'
- ], function( Base, Uploader ) {
-
- var $ = Base.$,
- _init = Uploader.prototype._init,
- IGNORE = {},
- widgetClass = [];
-
- function isArrayLike( obj ) {
- if ( !obj ) {
- return false;
- }
-
- var length = obj.length,
- type = $.type( obj );
-
- if ( obj.nodeType === 1 && length ) {
- return true;
- }
-
- return type === 'array' || type !== 'function' && type !== 'string' &&
- (length === 0 || typeof length === 'number' && length > 0 &&
- (length - 1) in obj);
- }
-
- function Widget( uploader ) {
- this.owner = uploader;
- this.options = uploader.options;
- }
-
- $.extend( Widget.prototype, {
-
- init: Base.noop,
-
- // 类Backbone的事件监听声明,监听uploader实例上的事件
- // widget直接无法监听事件,事件只能通过uploader来传递
- invoke: function( apiName, args ) {
-
- /*
- {
- 'make-thumb': 'makeThumb'
- }
- */
- var map = this.responseMap;
-
- // 如果无API响应声明则忽略
- if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
- !$.isFunction( this[ map[ apiName ] ] ) ) {
-
- return IGNORE;
- }
-
- return this[ map[ apiName ] ].apply( this, args );
-
- },
-
- /**
- * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
- * @method request
- * @grammar request( command, args ) => * | Promise
- * @grammar request( command, args, callback ) => Promise
- * @for Uploader
- */
- request: function() {
- return this.owner.request.apply( this.owner, arguments );
- }
- });
-
- // 扩展Uploader.
- $.extend( Uploader.prototype, {
-
- // 覆写_init用来初始化widgets
- _init: function() {
- var me = this,
- widgets = me._widgets = [];
-
- $.each( widgetClass, function( _, klass ) {
- widgets.push( new klass( me ) );
- });
-
- return _init.apply( me, arguments );
- },
-
- request: function( apiName, args, callback ) {
- var i = 0,
- widgets = this._widgets,
- len = widgets.length,
- rlts = [],
- dfds = [],
- widget, rlt, promise, key;
-
- args = isArrayLike( args ) ? args : [ args ];
-
- for ( ; i < len; i++ ) {
- widget = widgets[ i ];
- rlt = widget.invoke( apiName, args );
-
- if ( rlt !== IGNORE ) {
-
- // Deferred对象
- if ( Base.isPromise( rlt ) ) {
- dfds.push( rlt );
- } else {
- rlts.push( rlt );
- }
- }
- }
-
- // 如果有callback,则用异步方式。
- if ( callback || dfds.length ) {
- promise = Base.when.apply( Base, dfds );
- key = promise.pipe ? 'pipe' : 'then';
-
- // 很重要不能删除。删除了会死循环。
- // 保证执行顺序。让callback总是在下一个tick中执行。
- return promise[ key ](function() {
- var deferred = Base.Deferred(),
- args = arguments;
-
- setTimeout(function() {
- deferred.resolve.apply( deferred, args );
- }, 1 );
-
- return deferred.promise();
- })[ key ]( callback || Base.noop );
- } else {
- return rlts[ 0 ];
- }
- }
- });
-
- /**
- * 添加组件
- * @param {object} widgetProto 组件原型,构造函数通过constructor属性定义
- * @param {object} responseMap API名称与函数实现的映射
- * @example
- * Uploader.register( {
- * init: function( options ) {},
- * makeThumb: function() {}
- * }, {
- * 'make-thumb': 'makeThumb'
- * } );
- */
- Uploader.register = Widget.register = function( responseMap, widgetProto ) {
- var map = { init: 'init' },
- klass;
-
- if ( arguments.length === 1 ) {
- widgetProto = responseMap;
- widgetProto.responseMap = map;
- } else {
- widgetProto.responseMap = $.extend( map, responseMap );
- }
-
- klass = Base.inherits( Widget, widgetProto );
- widgetClass.push( klass );
-
- return klass;
- };
-
- return Widget;
- });
- /**
- * @fileOverview 文件选择相关
- */
- define('widgets/filepicker',[
- 'base',
- 'uploader',
- 'lib/filepicker',
- 'widgets/widget'
- ], function( Base, Uploader, FilePicker ) {
- var $ = Base.$;
-
- $.extend( Uploader.options, {
-
- /**
- * @property {Selector | Object} [pick=undefined]
- * @namespace options
- * @for Uploader
- * @description 指定选择文件的按钮容器,不指定则不创建按钮。
- *
- * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。
- * * `label` {String} 请采用 `innerHTML` 代替
- * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
- * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
- */
- pick: null,
-
- /**
- * @property {Arroy} [accept=null]
- * @namespace options
- * @for Uploader
- * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
- *
- * * `title` {String} 文字描述
- * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
- * * `mimeTypes` {String} 多个用逗号分割。
- *
- * 如:
- *
- * ```
- * {
- * title: 'Images',
- * extensions: 'gif,jpg,jpeg,bmp,png',
- * mimeTypes: 'image/*'
- * }
- * ```
- */
- accept: null/*{
- title: 'Images',
- extensions: 'gif,jpg,jpeg,bmp,png',
- mimeTypes: 'image/*'
- }*/
- });
-
- return Uploader.register({
- 'add-btn': 'addButton',
- refresh: 'refresh',
- disable: 'disable',
- enable: 'enable'
- }, {
-
- init: function( opts ) {
- this.pickers = [];
- return opts.pick && this.addButton( opts.pick );
- },
-
- refresh: function() {
- $.each( this.pickers, function() {
- this.refresh();
- });
- },
-
- /**
- * @method addButton
- * @for Uploader
- * @grammar addButton( pick ) => Promise
- * @description
- * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
- * @example
- * uploader.addButton({
- * id: '#btnContainer',
- * innerHTML: '选择文件'
- * });
- */
- addButton: function( pick ) {
- var me = this,
- opts = me.options,
- accept = opts.accept,
- options, picker, deferred;
-
- if ( !pick ) {
- return;
- }
-
- deferred = Base.Deferred();
- $.isPlainObject( pick ) || (pick = {
- id: pick
- });
-
- options = $.extend({}, pick, {
- accept: $.isPlainObject( accept ) ? [ accept ] : accept,
- swf: opts.swf,
- runtimeOrder: opts.runtimeOrder
- });
-
- picker = new FilePicker( options );
-
- picker.once( 'ready', deferred.resolve );
- picker.on( 'select', function( files ) {
- me.owner.request( 'add-file', [ files ]);
- });
- picker.init();
-
- this.pickers.push( picker );
-
- return deferred.promise();
- },
-
- disable: function() {
- $.each( this.pickers, function() {
- this.disable();
- });
- },
-
- enable: function() {
- $.each( this.pickers, function() {
- this.enable();
- });
- }
- });
- });
- /**
- * @fileOverview Image
- */
- define('lib/image',[
- 'base',
- 'runtime/client',
- 'lib/blob'
- ], function( Base, RuntimeClient, Blob ) {
- var $ = Base.$;
-
- // 构造器。
- function Image( opts ) {
- this.options = $.extend({}, Image.options, opts );
- RuntimeClient.call( this, 'Image' );
-
- this.on( 'load', function() {
- this._info = this.exec('info');
- this._meta = this.exec('meta');
- });
- }
-
- // 默认选项。
- Image.options = {
-
- // 默认的图片处理质量
- quality: 90,
-
- // 是否裁剪
- crop: false,
-
- // 是否保留头部信息
- preserveHeaders: true,
-
- // 是否允许放大。
- allowMagnify: true
- };
-
- // 继承RuntimeClient.
- Base.inherits( RuntimeClient, {
- constructor: Image,
-
- info: function( val ) {
-
- // setter
- if ( val ) {
- this._info = val;
- return this;
- }
-
- // getter
- return this._info;
- },
-
- meta: function( val ) {
-
- // setter
- if ( val ) {
- this._meta = val;
- return this;
- }
-
- // getter
- return this._meta;
- },
-
- loadFromBlob: function( blob ) {
- var me = this,
- ruid = blob.getRuid();
-
- this.connectRuntime( ruid, function() {
- me.exec( 'init', me.options );
- me.exec( 'loadFromBlob', blob );
- });
- },
-
- resize: function() {
- var args = Base.slice( arguments );
- return this.exec.apply( this, [ 'resize' ].concat( args ) );
- },
-
- getAsDataUrl: function( type ) {
- return this.exec( 'getAsDataUrl', type );
- },
-
- getAsBlob: function( type ) {
- var blob = this.exec( 'getAsBlob', type );
-
- return new Blob( this.getRuid(), blob );
- }
- });
-
- return Image;
- });
- /**
- * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
- */
- define('widgets/image',[
- 'base',
- 'uploader',
- 'lib/image',
- 'widgets/widget'
- ], function( Base, Uploader, Image ) {
-
- var $ = Base.$,
- throttle;
-
- // 根据要处理的文件大小来节流,一次不能处理太多,会卡。
- throttle = (function( max ) {
- var occupied = 0,
- waiting = [],
- tick = function() {
- var item;
-
- while ( waiting.length && occupied < max ) {
- item = waiting.shift();
- occupied += item[ 0 ];
- item[ 1 ]();
- }
- };
-
- return function( emiter, size, cb ) {
- waiting.push([ size, cb ]);
- emiter.once( 'destroy', function() {
- occupied -= size;
- setTimeout( tick, 1 );
- });
- setTimeout( tick, 1 );
- };
- })( 5 * 1024 * 1024 );
-
- $.extend( Uploader.options, {
-
- /**
- * @property {Object} [thumb]
- * @namespace options
- * @for Uploader
- * @description 配置生成缩略图的选项。
- *
- * 默认为:
- *
- * ```javascript
- * {
- * width: 110,
- * height: 110,
- *
- * // 图片质量,只有type为`image/jpeg`的时候才有效。
- * quality: 70,
- *
- * // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
- * allowMagnify: true,
- *
- * // 是否允许裁剪。
- * crop: true,
- *
- * // 是否保留头部meta信息。
- * preserveHeaders: false,
- *
- * // 为空的话则保留原有图片格式。
- * // 否则强制转换成指定的类型。
- * type: 'image/jpeg'
- * }
- * ```
- */
- thumb: {
- width: 110,
- height: 110,
- quality: 70,
- allowMagnify: true,
- crop: true,
- preserveHeaders: false,
-
- // 为空的话则保留原有图片格式。
- // 否则强制转换成指定的类型。
- // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
- // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
- type: 'image/jpeg'
- },
-
- /**
- * @property {Object} [compress]
- * @namespace options
- * @for Uploader
- * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。
- *
- * 默认为:
- *
- * ```javascript
- * {
- * width: 1600,
- * height: 1600,
- *
- * // 图片质量,只有type为`image/jpeg`的时候才有效。
- * quality: 90,
- *
- * // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
- * allowMagnify: false,
- *
- * // 是否允许裁剪。
- * crop: false,
- *
- * // 是否保留头部meta信息。
- * preserveHeaders: true
- * }
- * ```
- */
- compress: {
- width: 1600,
- height: 1600,
- quality: 90,
- allowMagnify: false,
- crop: false,
- preserveHeaders: true
- }
- });
-
- return Uploader.register({
- 'make-thumb': 'makeThumb',
- 'before-send-file': 'compressImage'
- }, {
-
-
- /**
- * 生成缩略图,此过程为异步,所以需要传入`callback`。
- * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
- *
- * `callback`中可以接收到两个参数。
- * * 第一个为error,如果生成缩略图有错误,此error将为真。
- * * 第二个为ret, 缩略图的Data URL值。
- *
- * **注意**
- * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。
- *
- *
- * @method makeThumb
- * @grammar makeThumb( file, callback ) => undefined
- * @grammar makeThumb( file, callback, width, height ) => undefined
- * @for Uploader
- * @example
- *
- * uploader.on( 'fileQueued', function( file ) {
- * var $li = ...;
- *
- * uploader.makeThumb( file, function( error, ret ) {
- * if ( error ) {
- * $li.text('预览错误');
- * } else {
- * $li.append(' ');
- * }
- * });
- *
- * });
- */
- makeThumb: function( file, cb, width, height ) {
- var opts, image;
-
- file = this.request( 'get-file', file );
-
- // 只预览图片格式。
- if ( !file.type.match( /^image/ ) ) {
- cb( true );
- return;
- }
-
- opts = $.extend({}, this.options.thumb );
-
- // 如果传入的是object.
- if ( $.isPlainObject( width ) ) {
- opts = $.extend( opts, width );
- width = null;
- }
-
- width = width || opts.width;
- height = height || opts.height;
-
- image = new Image( opts );
-
- image.once( 'load', function() {
- file._info = file._info || image.info();
- file._meta = file._meta || image.meta();
- image.resize( width, height );
- });
-
- image.once( 'complete', function() {
- cb( false, image.getAsDataUrl( opts.type ) );
- image.destroy();
- });
-
- image.once( 'error', function() {
- cb( true );
- image.destroy();
- });
-
- throttle( image, file.source.size, function() {
- file._info && image.info( file._info );
- file._meta && image.meta( file._meta );
- image.loadFromBlob( file.source );
- });
- },
-
- compressImage: function( file ) {
- var opts = this.options.compress || this.options.resize,
- compressSize = opts && opts.compressSize || 300 * 1024,
- image, deferred;
-
- file = this.request( 'get-file', file );
-
- // 只预览图片格式。
- if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||
- file.size < compressSize ||
- file._compressed ) {
- return;
- }
-
- opts = $.extend({}, opts );
- deferred = Base.Deferred();
-
- image = new Image( opts );
-
- deferred.always(function() {
- image.destroy();
- image = null;
- });
- image.once( 'error', deferred.reject );
- image.once( 'load', function() {
- file._info = file._info || image.info();
- file._meta = file._meta || image.meta();
- image.resize( opts.width, opts.height );
- });
-
- image.once( 'complete', function() {
- var blob, size;
-
- // 移动端 UC / qq 浏览器的无图模式下
- // ctx.getImageData 处理大图的时候会报 Exception
- // INDEX_SIZE_ERR: DOM Exception 1
- try {
- blob = image.getAsBlob( opts.type );
-
- size = file.size;
-
- // 如果压缩后,比原来还大则不用压缩后的。
- if ( blob.size < size ) {
- // file.source.destroy && file.source.destroy();
- file.source = blob;
- file.size = blob.size;
-
- file.trigger( 'resize', blob.size, size );
- }
-
- // 标记,避免重复压缩。
- file._compressed = true;
- deferred.resolve();
- } catch ( e ) {
- // 出错了直接继续,让其上传原始图片
- deferred.resolve();
- }
- });
-
- file._info && image.info( file._info );
- file._meta && image.meta( file._meta );
-
- image.loadFromBlob( file.source );
- return deferred.promise();
- }
- });
- });
- /**
- * @fileOverview 文件属性封装
- */
- define('file',[
- 'base',
- 'mediator'
- ], function( Base, Mediator ) {
-
- var $ = Base.$,
- idPrefix = 'WU_FILE_',
- idSuffix = 0,
- rExt = /\.([^.]+)$/,
- statusMap = {};
-
- function gid() {
- return idPrefix + idSuffix++;
- }
-
- /**
- * 文件类
- * @class File
- * @constructor 构造函数
- * @grammar new File( source ) => File
- * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
- */
- function WUFile( source ) {
-
- /**
- * 文件名,包括扩展名(后缀)
- * @property name
- * @type {string}
- */
- this.name = source.name || 'Untitled';
-
- /**
- * 文件体积(字节)
- * @property size
- * @type {uint}
- * @default 0
- */
- this.size = source.size || 0;
-
- /**
- * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
- * @property type
- * @type {string}
- * @default 'application'
- */
- this.type = source.type || 'application';
-
- /**
- * 文件最后修改日期
- * @property lastModifiedDate
- * @type {int}
- * @default 当前时间戳
- */
- this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
-
- /**
- * 文件ID,每个对象具有唯一ID,与文件名无关
- * @property id
- * @type {string}
- */
- this.id = gid();
-
- /**
- * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
- * @property ext
- * @type {string}
- */
- this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
-
-
- /**
- * 状态文字说明。在不同的status语境下有不同的用途。
- * @property statusText
- * @type {string}
- */
- this.statusText = '';
-
- // 存储文件状态,防止通过属性直接修改
- statusMap[ this.id ] = WUFile.Status.INITED;
-
- this.source = source;
- this.loaded = 0;
-
- this.on( 'error', function( msg ) {
- this.setStatus( WUFile.Status.ERROR, msg );
- });
- }
-
- $.extend( WUFile.prototype, {
-
- /**
- * 设置状态,状态变化时会触发`change`事件。
- * @method setStatus
- * @grammar setStatus( status[, statusText] );
- * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
- * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
- */
- setStatus: function( status, text ) {
-
- var prevStatus = statusMap[ this.id ];
-
- typeof text !== 'undefined' && (this.statusText = text);
-
- if ( status !== prevStatus ) {
- statusMap[ this.id ] = status;
- /**
- * 文件状态变化
- * @event statuschange
- */
- this.trigger( 'statuschange', status, prevStatus );
- }
-
- },
-
- /**
- * 获取文件状态
- * @return {File.Status}
- * @example
- 文件状态具体包括以下几种类型:
- {
- // 初始化
- INITED: 0,
- // 已入队列
- QUEUED: 1,
- // 正在上传
- PROGRESS: 2,
- // 上传出错
- ERROR: 3,
- // 上传成功
- COMPLETE: 4,
- // 上传取消
- CANCELLED: 5
- }
- */
- getStatus: function() {
- return statusMap[ this.id ];
- },
-
- /**
- * 获取文件原始信息。
- * @return {*}
- */
- getSource: function() {
- return this.source;
- },
-
- destory: function() {
- delete statusMap[ this.id ];
- }
- });
-
- Mediator.installTo( WUFile.prototype );
-
- /**
- * 文件状态值,具体包括以下几种类型:
- * * `inited` 初始状态
- * * `queued` 已经进入队列, 等待上传
- * * `progress` 上传中
- * * `complete` 上传完成。
- * * `error` 上传出错,可重试
- * * `interrupt` 上传中断,可续传。
- * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
- * * `cancelled` 文件被移除。
- * @property {Object} Status
- * @namespace File
- * @class File
- * @static
- */
- WUFile.Status = {
- INITED: 'inited', // 初始状态
- QUEUED: 'queued', // 已经进入队列, 等待上传
- PROGRESS: 'progress', // 上传中
- ERROR: 'error', // 上传出错,可重试
- COMPLETE: 'complete', // 上传完成。
- CANCELLED: 'cancelled', // 上传取消。
- INTERRUPT: 'interrupt', // 上传中断,可续传。
- INVALID: 'invalid' // 文件不合格,不能重试上传。
- };
-
- return WUFile;
- });
-
- /**
- * @fileOverview 文件队列
- */
- define('queue',[
- 'base',
- 'mediator',
- 'file'
- ], function( Base, Mediator, WUFile ) {
-
- var $ = Base.$,
- STATUS = WUFile.Status;
-
- /**
- * 文件队列, 用来存储各个状态中的文件。
- * @class Queue
- * @extends Mediator
- */
- function Queue() {
-
- /**
- * 统计文件数。
- * * `numOfQueue` 队列中的文件数。
- * * `numOfSuccess` 上传成功的文件数
- * * `numOfCancel` 被移除的文件数
- * * `numOfProgress` 正在上传中的文件数
- * * `numOfUploadFailed` 上传错误的文件数。
- * * `numOfInvalid` 无效的文件数。
- * @property {Object} stats
- */
- this.stats = {
- numOfQueue: 0,
- numOfSuccess: 0,
- numOfCancel: 0,
- numOfProgress: 0,
- numOfUploadFailed: 0,
- numOfInvalid: 0
- };
-
- // 上传队列,仅包括等待上传的文件
- this._queue = [];
-
- // 存储所有文件
- this._map = {};
- }
-
- $.extend( Queue.prototype, {
-
- /**
- * 将新文件加入对队列尾部
- *
- * @method append
- * @param {File} file 文件对象
- */
- append: function( file ) {
- this._queue.push( file );
- this._fileAdded( file );
- return this;
- },
-
- /**
- * 将新文件加入对队列头部
- *
- * @method prepend
- * @param {File} file 文件对象
- */
- prepend: function( file ) {
- this._queue.unshift( file );
- this._fileAdded( file );
- return this;
- },
-
- /**
- * 获取文件对象
- *
- * @method getFile
- * @param {String} fileId 文件ID
- * @return {File}
- */
- getFile: function( fileId ) {
- if ( typeof fileId !== 'string' ) {
- return fileId;
- }
- return this._map[ fileId ];
- },
-
- /**
- * 从队列中取出一个指定状态的文件。
- * @grammar fetch( status ) => File
- * @method fetch
- * @param {String} status [文件状态值](#WebUploader:File:File.Status)
- * @return {File} [File](#WebUploader:File)
- */
- fetch: function( status ) {
- var len = this._queue.length,
- i, file;
-
- status = status || STATUS.QUEUED;
-
- for ( i = 0; i < len; i++ ) {
- file = this._queue[ i ];
-
- if ( status === file.getStatus() ) {
- return file;
- }
- }
-
- return null;
- },
-
- /**
- * 对队列进行排序,能够控制文件上传顺序。
- * @grammar sort( fn ) => undefined
- * @method sort
- * @param {Function} fn 排序方法
- */
- sort: function( fn ) {
- if ( typeof fn === 'function' ) {
- this._queue.sort( fn );
- }
- },
-
- /**
- * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
- * @grammar getFiles( [status1[, status2 ...]] ) => Array
- * @method getFiles
- * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
- */
- getFiles: function() {
- var sts = [].slice.call( arguments, 0 ),
- ret = [],
- i = 0,
- len = this._queue.length,
- file;
-
- for ( ; i < len; i++ ) {
- file = this._queue[ i ];
-
- if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
- continue;
- }
-
- ret.push( file );
- }
-
- return ret;
- },
-
- _fileAdded: function( file ) {
- var me = this,
- existing = this._map[ file.id ];
-
- if ( !existing ) {
- this._map[ file.id ] = file;
-
- file.on( 'statuschange', function( cur, pre ) {
- me._onFileStatusChange( cur, pre );
- });
- }
-
- file.setStatus( STATUS.QUEUED );
- },
-
- _onFileStatusChange: function( curStatus, preStatus ) {
- var stats = this.stats;
-
- switch ( preStatus ) {
- case STATUS.PROGRESS:
- stats.numOfProgress--;
- break;
-
- case STATUS.QUEUED:
- stats.numOfQueue --;
- break;
-
- case STATUS.ERROR:
- stats.numOfUploadFailed--;
- break;
-
- case STATUS.INVALID:
- stats.numOfInvalid--;
- break;
- }
-
- switch ( curStatus ) {
- case STATUS.QUEUED:
- stats.numOfQueue++;
- break;
-
- case STATUS.PROGRESS:
- stats.numOfProgress++;
- break;
-
- case STATUS.ERROR:
- stats.numOfUploadFailed++;
- break;
-
- case STATUS.COMPLETE:
- stats.numOfSuccess++;
- break;
-
- case STATUS.CANCELLED:
- stats.numOfCancel++;
- break;
-
- case STATUS.INVALID:
- stats.numOfInvalid++;
- break;
- }
- }
-
- });
-
- Mediator.installTo( Queue.prototype );
-
- return Queue;
- });
- /**
- * @fileOverview 队列
- */
- define('widgets/queue',[
- 'base',
- 'uploader',
- 'queue',
- 'file',
- 'lib/file',
- 'runtime/client',
- 'widgets/widget'
- ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
-
- var $ = Base.$,
- rExt = /\.\w+$/,
- Status = WUFile.Status;
-
- return Uploader.register({
- 'sort-files': 'sortFiles',
- 'add-file': 'addFiles',
- 'get-file': 'getFile',
- 'fetch-file': 'fetchFile',
- 'get-stats': 'getStats',
- 'get-files': 'getFiles',
- 'remove-file': 'removeFile',
- 'retry': 'retry',
- 'reset': 'reset',
- 'accept-file': 'acceptFile'
- }, {
-
- init: function( opts ) {
- var me = this,
- deferred, len, i, item, arr, accept, runtime;
-
- if ( $.isPlainObject( opts.accept ) ) {
- opts.accept = [ opts.accept ];
- }
-
- // accept中的中生成匹配正则。
- if ( opts.accept ) {
- arr = [];
-
- for ( i = 0, len = opts.accept.length; i < len; i++ ) {
- item = opts.accept[ i ].extensions;
- item && arr.push( item );
- }
-
- if ( arr.length ) {
- accept = '\\.' + arr.join(',')
- .replace( /,/g, '$|\\.' )
- .replace( /\*/g, '.*' ) + '$';
- }
-
- me.accept = new RegExp( accept, 'i' );
- }
-
- me.queue = new Queue();
- me.stats = me.queue.stats;
-
- // 如果当前不是html5运行时,那就算了。
- // 不执行后续操作
- if ( this.request('predict-runtime-type') !== 'html5' ) {
- return;
- }
-
- // 创建一个 html5 运行时的 placeholder
- // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
- deferred = Base.Deferred();
- runtime = new RuntimeClient('Placeholder');
- runtime.connectRuntime({
- runtimeOrder: 'html5'
- }, function() {
- me._ruid = runtime.getRuid();
- deferred.resolve();
- });
- return deferred.promise();
- },
-
-
- // 为了支持外部直接添加一个原生File对象。
- _wrapFile: function( file ) {
- if ( !(file instanceof WUFile) ) {
-
- if ( !(file instanceof File) ) {
- if ( !this._ruid ) {
- throw new Error('Can\'t add external files.');
- }
- file = new File( this._ruid, file );
- }
-
- file = new WUFile( file );
- }
-
- return file;
- },
-
- // 判断文件是否可以被加入队列
- acceptFile: function( file ) {
- var invalid = !file || file.size < 6 || this.accept &&
-
- // 如果名字中有后缀,才做后缀白名单处理。
- rExt.exec( file.name ) && !this.accept.test( file.name );
-
- return !invalid;
- },
-
-
- /**
- * @event beforeFileQueued
- * @param {File} file File对象
- * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
- * @for Uploader
- */
-
- /**
- * @event fileQueued
- * @param {File} file File对象
- * @description 当文件被加入队列以后触发。
- * @for Uploader
- */
-
- _addFile: function( file ) {
- var me = this;
-
- file = me._wrapFile( file );
-
- // 不过类型判断允许不允许,先派送 `beforeFileQueued`
- if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
- return;
- }
-
- // 类型不匹配,则派送错误事件,并返回。
- if ( !me.acceptFile( file ) ) {
- me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
- return;
- }
-
- me.queue.append( file );
- me.owner.trigger( 'fileQueued', file );
- return file;
- },
-
- getFile: function( fileId ) {
- return this.queue.getFile( fileId );
- },
-
- /**
- * @event filesQueued
- * @param {File} files 数组,内容为原始File(lib/File)对象。
- * @description 当一批文件添加进队列以后触发。
- * @for Uploader
- */
-
- /**
- * @method addFiles
- * @grammar addFiles( file ) => undefined
- * @grammar addFiles( [file1, file2 ...] ) => undefined
- * @param {Array of File or File} [files] Files 对象 数组
- * @description 添加文件到队列
- * @for Uploader
- */
- addFiles: function( files ) {
- var me = this;
-
- if ( !files.length ) {
- files = [ files ];
- }
-
- files = $.map( files, function( file ) {
- return me._addFile( file );
- });
-
- me.owner.trigger( 'filesQueued', files );
-
- if ( me.options.auto ) {
- me.request('start-upload');
- }
- },
-
- getStats: function() {
- return this.stats;
- },
-
- /**
- * @event fileDequeued
- * @param {File} file File对象
- * @description 当文件被移除队列后触发。
- * @for Uploader
- */
-
- /**
- * @method removeFile
- * @grammar removeFile( file ) => undefined
- * @grammar removeFile( id ) => undefined
- * @param {File|id} file File对象或这File对象的id
- * @description 移除某一文件。
- * @for Uploader
- * @example
- *
- * $li.on('click', '.remove-this', function() {
- * uploader.removeFile( file );
- * })
- */
- removeFile: function( file ) {
- var me = this;
-
- file = file.id ? file : me.queue.getFile( file );
-
- file.setStatus( Status.CANCELLED );
- me.owner.trigger( 'fileDequeued', file );
- },
-
- /**
- * @method getFiles
- * @grammar getFiles() => Array
- * @grammar getFiles( status1, status2, status... ) => Array
- * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
- * @for Uploader
- * @example
- * console.log( uploader.getFiles() ); // => all files
- * console.log( uploader.getFiles('error') ) // => all error files.
- */
- getFiles: function() {
- return this.queue.getFiles.apply( this.queue, arguments );
- },
-
- fetchFile: function() {
- return this.queue.fetch.apply( this.queue, arguments );
- },
-
- /**
- * @method retry
- * @grammar retry() => undefined
- * @grammar retry( file ) => undefined
- * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
- * @for Uploader
- * @example
- * function retry() {
- * uploader.retry();
- * }
- */
- retry: function( file, noForceStart ) {
- var me = this,
- files, i, len;
-
- if ( file ) {
- file = file.id ? file : me.queue.getFile( file );
- file.setStatus( Status.QUEUED );
- noForceStart || me.request('start-upload');
- return;
- }
-
- files = me.queue.getFiles( Status.ERROR );
- i = 0;
- len = files.length;
-
- for ( ; i < len; i++ ) {
- file = files[ i ];
- file.setStatus( Status.QUEUED );
- }
-
- me.request('start-upload');
- },
-
- /**
- * @method sort
- * @grammar sort( fn ) => undefined
- * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
- * @for Uploader
- */
- sortFiles: function() {
- return this.queue.sort.apply( this.queue, arguments );
- },
-
- /**
- * @method reset
- * @grammar reset() => undefined
- * @description 重置uploader。目前只重置了队列。
- * @for Uploader
- * @example
- * uploader.reset();
- */
- reset: function() {
- this.queue = new Queue();
- this.stats = this.queue.stats;
- }
- });
-
- });
- /**
- * @fileOverview 添加获取Runtime相关信息的方法。
- */
- define('widgets/runtime',[
- 'uploader',
- 'runtime/runtime',
- 'widgets/widget'
- ], function( Uploader, Runtime ) {
-
- Uploader.support = function() {
- return Runtime.hasRuntime.apply( Runtime, arguments );
- };
-
- return Uploader.register({
- 'predict-runtime-type': 'predictRuntmeType'
- }, {
-
- init: function() {
- if ( !this.predictRuntmeType() ) {
- throw Error('Runtime Error');
- }
- },
-
- /**
- * 预测Uploader将采用哪个`Runtime`
- * @grammar predictRuntmeType() => String
- * @method predictRuntmeType
- * @for Uploader
- */
- predictRuntmeType: function() {
- var orders = this.options.runtimeOrder || Runtime.orders,
- type = this.type,
- i, len;
-
- if ( !type ) {
- orders = orders.split( /\s*,\s*/g );
-
- for ( i = 0, len = orders.length; i < len; i++ ) {
- if ( Runtime.hasRuntime( orders[ i ] ) ) {
- this.type = type = orders[ i ];
- break;
- }
- }
- }
-
- return type;
- }
- });
- });
- /**
- * @fileOverview Transport
- */
- define('lib/transport',[
- 'base',
- 'runtime/client',
- 'mediator'
- ], function( Base, RuntimeClient, Mediator ) {
-
- var $ = Base.$;
-
- function Transport( opts ) {
- var me = this;
-
- opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
- RuntimeClient.call( this, 'Transport' );
-
- this._blob = null;
- this._formData = opts.formData || {};
- this._headers = opts.headers || {};
-
- this.on( 'progress', this._timeout );
- this.on( 'load error', function() {
- me.trigger( 'progress', 1 );
- clearTimeout( me._timer );
- });
- }
-
- Transport.options = {
- server: '',
- method: 'POST',
-
- // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
- withCredentials: false,
- fileVal: 'file',
- timeout: 2 * 60 * 1000, // 2分钟
- formData: {},
- headers: {},
- sendAsBinary: false
- };
-
- $.extend( Transport.prototype, {
-
- // 添加Blob, 只能添加一次,最后一次有效。
- appendBlob: function( key, blob, filename ) {
- var me = this,
- opts = me.options;
-
- if ( me.getRuid() ) {
- me.disconnectRuntime();
- }
-
- // 连接到blob归属的同一个runtime.
- me.connectRuntime( blob.ruid, function() {
- me.exec('init');
- });
-
- me._blob = blob;
- opts.fileVal = key || opts.fileVal;
- opts.filename = filename || opts.filename;
- },
-
- // 添加其他字段
- append: function( key, value ) {
- if ( typeof key === 'object' ) {
- $.extend( this._formData, key );
- } else {
- this._formData[ key ] = value;
- }
- },
-
- setRequestHeader: function( key, value ) {
- if ( typeof key === 'object' ) {
- $.extend( this._headers, key );
- } else {
- this._headers[ key ] = value;
- }
- },
-
- send: function( method ) {
- this.exec( 'send', method );
- this._timeout();
- },
-
- abort: function() {
- clearTimeout( this._timer );
- return this.exec('abort');
- },
-
- destroy: function() {
- this.trigger('destroy');
- this.off();
- this.exec('destroy');
- this.disconnectRuntime();
- },
-
- getResponse: function() {
- return this.exec('getResponse');
- },
-
- getResponseAsJson: function() {
- return this.exec('getResponseAsJson');
- },
-
- getStatus: function() {
- return this.exec('getStatus');
- },
-
- _timeout: function() {
- var me = this,
- duration = me.options.timeout;
-
- if ( !duration ) {
- return;
- }
-
- clearTimeout( me._timer );
- me._timer = setTimeout(function() {
- me.abort();
- me.trigger( 'error', 'timeout' );
- }, duration );
- }
-
- });
-
- // 让Transport具备事件功能。
- Mediator.installTo( Transport.prototype );
-
- return Transport;
- });
- /**
- * @fileOverview 负责文件上传相关。
- */
- define('widgets/upload',[
- 'base',
- 'uploader',
- 'file',
- 'lib/transport',
- 'widgets/widget'
- ], function( Base, Uploader, WUFile, Transport ) {
-
- var $ = Base.$,
- isPromise = Base.isPromise,
- Status = WUFile.Status;
-
- // 添加默认配置项
- $.extend( Uploader.options, {
-
-
- /**
- * @property {Boolean} [prepareNextFile=false]
- * @namespace options
- * @for Uploader
- * @description 是否允许在文件传输时提前把下一个文件准备好。
- * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
- * 如果能提前在当前文件传输期处理,可以节省总体耗时。
- */
- prepareNextFile: false,
-
- /**
- * @property {Boolean} [chunked=false]
- * @namespace options
- * @for Uploader
- * @description 是否要分片处理大文件上传。
- */
- chunked: false,
-
- /**
- * @property {Boolean} [chunkSize=5242880]
- * @namespace options
- * @for Uploader
- * @description 如果要分片,分多大一片? 默认大小为5M.
- */
- chunkSize: 5 * 1024 * 1024,
-
- /**
- * @property {Boolean} [chunkRetry=2]
- * @namespace options
- * @for Uploader
- * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
- */
- chunkRetry: 2,
-
- /**
- * @property {Boolean} [threads=3]
- * @namespace options
- * @for Uploader
- * @description 上传并发数。允许同时最大上传进程数。
- */
- threads: 3,
-
-
- /**
- * @property {Object} [formData]
- * @namespace options
- * @for Uploader
- * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
- */
- formData: null
-
- /**
- * @property {Object} [fileVal='file']
- * @namespace options
- * @for Uploader
- * @description 设置文件上传域的name。
- */
-
- /**
- * @property {Object} [method='POST']
- * @namespace options
- * @for Uploader
- * @description 文件上传方式,`POST`或者`GET`。
- */
-
- /**
- * @property {Object} [sendAsBinary=false]
- * @namespace options
- * @for Uploader
- * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
- * 其他参数在$_GET数组中。
- */
- });
-
- // 负责将文件切片。
- function CuteFile( file, chunkSize ) {
- var pending = [],
- blob = file.source,
- total = blob.size,
- chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
- start = 0,
- index = 0,
- len;
-
- while ( index < chunks ) {
- len = Math.min( chunkSize, total - start );
-
- pending.push({
- file: file,
- start: start,
- end: chunkSize ? (start + len) : total,
- total: total,
- chunks: chunks,
- chunk: index++
- });
- start += len;
- }
-
- file.blocks = pending.concat();
- file.remaning = pending.length;
-
- return {
- file: file,
-
- has: function() {
- return !!pending.length;
- },
-
- fetch: function() {
- return pending.shift();
- }
- };
- }
-
- Uploader.register({
- 'start-upload': 'start',
- 'stop-upload': 'stop',
- 'skip-file': 'skipFile',
- 'is-in-progress': 'isInProgress'
- }, {
-
- init: function() {
- var owner = this.owner;
-
- this.runing = false;
-
- // 记录当前正在传的数据,跟threads相关
- this.pool = [];
-
- // 缓存即将上传的文件。
- this.pending = [];
-
- // 跟踪还有多少分片没有完成上传。
- this.remaning = 0;
- this.__tick = Base.bindFn( this._tick, this );
-
- owner.on( 'uploadComplete', function( file ) {
- // 把其他块取消了。
- file.blocks && $.each( file.blocks, function( _, v ) {
- v.transport && (v.transport.abort(), v.transport.destroy());
- delete v.transport;
- });
-
- delete file.blocks;
- delete file.remaning;
- });
- },
-
- /**
- * @event startUpload
- * @description 当开始上传流程时触发。
- * @for Uploader
- */
-
- /**
- * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
- * @grammar upload() => undefined
- * @method upload
- * @for Uploader
- */
- start: function() {
- var me = this;
-
- // 移出invalid的文件
- $.each( me.request( 'get-files', Status.INVALID ), function() {
- me.request( 'remove-file', this );
- });
-
- if ( me.runing ) {
- return;
- }
-
- me.runing = true;
-
- // 如果有暂停的,则续传
- $.each( me.pool, function( _, v ) {
- var file = v.file;
-
- if ( file.getStatus() === Status.INTERRUPT ) {
- file.setStatus( Status.PROGRESS );
- me._trigged = false;
- v.transport && v.transport.send();
- }
- });
-
- me._trigged = false;
- me.owner.trigger('startUpload');
- Base.nextTick( me.__tick );
- },
-
- /**
- * @event stopUpload
- * @description 当开始上传流程暂停时触发。
- * @for Uploader
- */
-
- /**
- * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
- * @grammar stop() => undefined
- * @grammar stop( true ) => undefined
- * @method stop
- * @for Uploader
- */
- stop: function( interrupt ) {
- var me = this;
-
- if ( me.runing === false ) {
- return;
- }
-
- me.runing = false;
-
- interrupt && $.each( me.pool, function( _, v ) {
- v.transport && v.transport.abort();
- v.file.setStatus( Status.INTERRUPT );
- });
-
- me.owner.trigger('stopUpload');
- },
-
- /**
- * 判断`Uplaode`r是否正在上传中。
- * @grammar isInProgress() => Boolean
- * @method isInProgress
- * @for Uploader
- */
- isInProgress: function() {
- return !!this.runing;
- },
-
- getStats: function() {
- return this.request('get-stats');
- },
-
- /**
- * 掉过一个文件上传,直接标记指定文件为已上传状态。
- * @grammar skipFile( file ) => undefined
- * @method skipFile
- * @for Uploader
- */
- skipFile: function( file, status ) {
- file = this.request( 'get-file', file );
-
- file.setStatus( status || Status.COMPLETE );
- file.skipped = true;
-
- // 如果正在上传。
- file.blocks && $.each( file.blocks, function( _, v ) {
- var _tr = v.transport;
-
- if ( _tr ) {
- _tr.abort();
- _tr.destroy();
- delete v.transport;
- }
- });
-
- this.owner.trigger( 'uploadSkip', file );
- },
-
- /**
- * @event uploadFinished
- * @description 当所有文件上传结束时触发。
- * @for Uploader
- */
- _tick: function() {
- var me = this,
- opts = me.options,
- fn, val;
-
- // 上一个promise还没有结束,则等待完成后再执行。
- if ( me._promise ) {
- return me._promise.always( me.__tick );
- }
-
- // 还有位置,且还有文件要处理的话。
- if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
- me._trigged = false;
-
- fn = function( val ) {
- me._promise = null;
-
- // 有可能是reject过来的,所以要检测val的类型。
- val && val.file && me._startSend( val );
- Base.nextTick( me.__tick );
- };
-
- me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
-
- // 没有要上传的了,且没有正在传输的了。
- } else if ( !me.remaning && !me.getStats().numOfQueue ) {
- me.runing = false;
-
- me._trigged || Base.nextTick(function() {
- me.owner.trigger('uploadFinished');
- });
- me._trigged = true;
- }
- },
-
- _nextBlock: function() {
- var me = this,
- act = me._act,
- opts = me.options,
- next, done;
-
- // 如果当前文件还有没有需要传输的,则直接返回剩下的。
- if ( act && act.has() &&
- act.file.getStatus() === Status.PROGRESS ) {
-
- // 是否提前准备下一个文件
- if ( opts.prepareNextFile && !me.pending.length ) {
- me._prepareNextFile();
- }
-
- return act.fetch();
-
- // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
- } else if ( me.runing ) {
-
- // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
- if ( !me.pending.length && me.getStats().numOfQueue ) {
- me._prepareNextFile();
- }
-
- next = me.pending.shift();
- done = function( file ) {
- if ( !file ) {
- return null;
- }
-
- act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
- me._act = act;
- return act.fetch();
- };
-
- // 文件可能还在prepare中,也有可能已经完全准备好了。
- return isPromise( next ) ?
- next[ next.pipe ? 'pipe' : 'then']( done ) :
- done( next );
- }
- },
-
-
- /**
- * @event uploadStart
- * @param {File} file File对象
- * @description 某个文件开始上传前触发,一个文件只会触发一次。
- * @for Uploader
- */
- _prepareNextFile: function() {
- var me = this,
- file = me.request('fetch-file'),
- pending = me.pending,
- promise;
-
- if ( file ) {
- promise = me.request( 'before-send-file', file, function() {
-
- // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
- if ( file.getStatus() === Status.QUEUED ) {
- me.owner.trigger( 'uploadStart', file );
- file.setStatus( Status.PROGRESS );
- return file;
- }
-
- return me._finishFile( file );
- });
-
- // 如果还在pending中,则替换成文件本身。
- promise.done(function() {
- var idx = $.inArray( promise, pending );
-
- ~idx && pending.splice( idx, 1, file );
- });
-
- // befeore-send-file的钩子就有错误发生。
- promise.fail(function( reason ) {
- file.setStatus( Status.ERROR, reason );
- me.owner.trigger( 'uploadError', file, reason );
- me.owner.trigger( 'uploadComplete', file );
- });
-
- pending.push( promise );
- }
- },
-
- // 让出位置了,可以让其他分片开始上传
- _popBlock: function( block ) {
- var idx = $.inArray( block, this.pool );
-
- this.pool.splice( idx, 1 );
- block.file.remaning--;
- this.remaning--;
- },
-
- // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
- _startSend: function( block ) {
- var me = this,
- file = block.file,
- promise;
-
- me.pool.push( block );
- me.remaning++;
-
- // 如果没有分片,则直接使用原始的。
- // 不会丢失content-type信息。
- block.blob = block.chunks === 1 ? file.source :
- file.source.slice( block.start, block.end );
-
- // hook, 每个分片发送之前可能要做些异步的事情。
- promise = me.request( 'before-send', block, function() {
-
- // 有可能文件已经上传出错了,所以不需要再传输了。
- if ( file.getStatus() === Status.PROGRESS ) {
- me._doSend( block );
- } else {
- me._popBlock( block );
- Base.nextTick( me.__tick );
- }
- });
-
- // 如果为fail了,则跳过此分片。
- promise.fail(function() {
- if ( file.remaning === 1 ) {
- me._finishFile( file ).always(function() {
- block.percentage = 1;
- me._popBlock( block );
- me.owner.trigger( 'uploadComplete', file );
- Base.nextTick( me.__tick );
- });
- } else {
- block.percentage = 1;
- me._popBlock( block );
- Base.nextTick( me.__tick );
- }
- });
- },
-
-
- /**
- * @event uploadBeforeSend
- * @param {Object} object
- * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
- * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
- * @for Uploader
- */
-
- /**
- * @event uploadAccept
- * @param {Object} object
- * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
- * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
- * @for Uploader
- */
-
- /**
- * @event uploadProgress
- * @param {File} file File对象
- * @param {Number} percentage 上传进度
- * @description 上传过程中触发,携带上传进度。
- * @for Uploader
- */
-
-
- /**
- * @event uploadError
- * @param {File} file File对象
- * @param {String} reason 出错的code
- * @description 当文件上传出错时触发。
- * @for Uploader
- */
-
- /**
- * @event uploadSuccess
- * @param {File} file File对象
- * @param {Object} response 服务端返回的数据
- * @description 当文件上传成功时触发。
- * @for Uploader
- */
-
- /**
- * @event uploadComplete
- * @param {File} [file] File对象
- * @description 不管成功或者失败,文件上传完成时触发。
- * @for Uploader
- */
-
- // 做上传操作。
- _doSend: function( block ) {
- var me = this,
- owner = me.owner,
- opts = me.options,
- file = block.file,
- tr = new Transport( opts ),
- data = $.extend({}, opts.formData ),
- headers = $.extend({}, opts.headers ),
- requestAccept, ret;
-
- block.transport = tr;
-
- tr.on( 'destroy', function() {
- delete block.transport;
- me._popBlock( block );
- Base.nextTick( me.__tick );
- });
-
- // 广播上传进度。以文件为单位。
- tr.on( 'progress', function( percentage ) {
- var totalPercent = 0,
- uploaded = 0;
-
- // 可能没有abort掉,progress还是执行进来了。
- // if ( !file.blocks ) {
- // return;
- // }
-
- totalPercent = block.percentage = percentage;
-
- if ( block.chunks > 1 ) { // 计算文件的整体速度。
- $.each( file.blocks, function( _, v ) {
- uploaded += (v.percentage || 0) * (v.end - v.start);
- });
-
- totalPercent = uploaded / file.size;
- }
-
- owner.trigger( 'uploadProgress', file, totalPercent || 0 );
- });
-
- // 用来询问,是否返回的结果是有错误的。
- requestAccept = function( reject ) {
- var fn;
-
- ret = tr.getResponseAsJson() || {};
- ret._raw = tr.getResponse();
- fn = function( value ) {
- reject = value;
- };
-
- // 服务端响应了,不代表成功了,询问是否响应正确。
- if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
- reject = reject || 'server';
- }
-
- return reject;
- };
-
- // 尝试重试,然后广播文件上传出错。
- tr.on( 'error', function( type, flag ) {
- block.retried = block.retried || 0;
-
- // 自动重试
- if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
- block.retried < opts.chunkRetry ) {
-
- block.retried++;
- tr.send();
-
- } else {
-
- // http status 500 ~ 600
- if ( !flag && type === 'server' ) {
- type = requestAccept( type );
- }
-
- file.setStatus( Status.ERROR, type );
- owner.trigger( 'uploadError', file, type );
- owner.trigger( 'uploadComplete', file );
- }
- });
-
- // 上传成功
- tr.on( 'load', function() {
- var reason;
-
- // 如果非预期,转向上传出错。
- if ( (reason = requestAccept()) ) {
- tr.trigger( 'error', reason, true );
- return;
- }
-
- // 全部上传完成。
- if ( file.remaning === 1 ) {
- me._finishFile( file, ret );
- } else {
- tr.destroy();
- }
- });
-
- // 配置默认的上传字段。
- data = $.extend( data, {
- id: file.id,
- name: file.name,
- type: file.type,
- lastModifiedDate: file.lastModifiedDate,
- size: file.size
- });
-
- block.chunks > 1 && $.extend( data, {
- chunks: block.chunks,
- chunk: block.chunk
- });
-
- // 在发送之间可以添加字段什么的。。。
- // 如果默认的字段不够使用,可以通过监听此事件来扩展
- owner.trigger( 'uploadBeforeSend', block, data, headers );
-
- // 开始发送。
- tr.appendBlob( opts.fileVal, block.blob, file.name );
- tr.append( data );
- tr.setRequestHeader( headers );
- tr.send();
- },
-
- // 完成上传。
- _finishFile: function( file, ret, hds ) {
- var owner = this.owner;
-
- return owner
- .request( 'after-send-file', arguments, function() {
- file.setStatus( Status.COMPLETE );
- owner.trigger( 'uploadSuccess', file, ret, hds );
- })
- .fail(function( reason ) {
-
- // 如果外部已经标记为invalid什么的,不再改状态。
- if ( file.getStatus() === Status.PROGRESS ) {
- file.setStatus( Status.ERROR, reason );
- }
-
- owner.trigger( 'uploadError', file, reason );
- })
- .always(function() {
- owner.trigger( 'uploadComplete', file );
- });
- }
-
- });
- });
- /**
- * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
- */
-
- define('widgets/validator',[
- 'base',
- 'uploader',
- 'file',
- 'widgets/widget'
- ], function( Base, Uploader, WUFile ) {
-
- var $ = Base.$,
- validators = {},
- api;
-
- /**
- * @event error
- * @param {String} type 错误类型。
- * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
- *
- * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
- * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
- * @for Uploader
- */
-
- // 暴露给外面的api
- api = {
-
- // 添加验证器
- addValidator: function( type, cb ) {
- validators[ type ] = cb;
- },
-
- // 移除验证器
- removeValidator: function( type ) {
- delete validators[ type ];
- }
- };
-
- // 在Uploader初始化的时候启动Validators的初始化
- Uploader.register({
- init: function() {
- var me = this;
- $.each( validators, function() {
- this.call( me.owner );
- });
- }
- });
-
- /**
- * @property {int} [fileNumLimit=undefined]
- * @namespace options
- * @for Uploader
- * @description 验证文件总数量, 超出则不允许加入队列。
- */
- api.addValidator( 'fileNumLimit', function() {
- var uploader = this,
- opts = uploader.options,
- count = 0,
- max = opts.fileNumLimit >> 0,
- flag = true;
-
- if ( !max ) {
- return;
- }
-
- uploader.on( 'beforeFileQueued', function( file ) {
-
- if ( count >= max && flag ) {
- flag = false;
- this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
- setTimeout(function() {
- flag = true;
- }, 1 );
- }
-
- return count >= max ? false : true;
- });
-
- uploader.on( 'fileQueued', function() {
- count++;
- });
-
- uploader.on( 'fileDequeued', function() {
- count--;
- });
-
- uploader.on( 'uploadFinished', function() {
- count = 0;
- });
- });
-
-
- /**
- * @property {int} [fileSizeLimit=undefined]
- * @namespace options
- * @for Uploader
- * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
- */
- api.addValidator( 'fileSizeLimit', function() {
- var uploader = this,
- opts = uploader.options,
- count = 0,
- max = opts.fileSizeLimit >> 0,
- flag = true;
-
- if ( !max ) {
- return;
- }
-
- uploader.on( 'beforeFileQueued', function( file ) {
- var invalid = count + file.size > max;
-
- if ( invalid && flag ) {
- flag = false;
- this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
- setTimeout(function() {
- flag = true;
- }, 1 );
- }
-
- return invalid ? false : true;
- });
-
- uploader.on( 'fileQueued', function( file ) {
- count += file.size;
- });
-
- uploader.on( 'fileDequeued', function( file ) {
- count -= file.size;
- });
-
- uploader.on( 'uploadFinished', function() {
- count = 0;
- });
- });
-
- /**
- * @property {int} [fileSingleSizeLimit=undefined]
- * @namespace options
- * @for Uploader
- * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
- */
- api.addValidator( 'fileSingleSizeLimit', function() {
- var uploader = this,
- opts = uploader.options,
- max = opts.fileSingleSizeLimit;
-
- if ( !max ) {
- return;
- }
-
- uploader.on( 'beforeFileQueued', function( file ) {
-
- if ( file.size > max ) {
- file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
- this.trigger( 'error', 'F_EXCEED_SIZE', file );
- return false;
- }
-
- });
-
- });
-
- /**
- * @property {int} [duplicate=undefined]
- * @namespace options
- * @for Uploader
- * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
- */
- api.addValidator( 'duplicate', function() {
- var uploader = this,
- opts = uploader.options,
- mapping = {};
-
- if ( opts.duplicate ) {
- return;
- }
-
- function hashString( str ) {
- var hash = 0,
- i = 0,
- len = str.length,
- _char;
-
- for ( ; i < len; i++ ) {
- _char = str.charCodeAt( i );
- hash = _char + (hash << 6) + (hash << 16) - hash;
- }
-
- return hash;
- }
-
- uploader.on( 'beforeFileQueued', function( file ) {
- var hash = file.__hash || (file.__hash = hashString( file.name +
- file.size + file.lastModifiedDate ));
-
- // 已经重复了
- if ( mapping[ hash ] ) {
- this.trigger( 'error', 'F_DUPLICATE', file );
- return false;
- }
- });
-
- uploader.on( 'fileQueued', function( file ) {
- var hash = file.__hash;
-
- hash && (mapping[ hash ] = true);
- });
-
- uploader.on( 'fileDequeued', function( file ) {
- var hash = file.__hash;
-
- hash && (delete mapping[ hash ]);
- });
- });
-
- return api;
- });
-
- /**
- * @fileOverview Runtime管理器,负责Runtime的选择, 连接
- */
- define('runtime/compbase',[],function() {
-
- function CompBase( owner, runtime ) {
-
- this.owner = owner;
- this.options = owner.options;
-
- this.getRuntime = function() {
- return runtime;
- };
-
- this.getRuid = function() {
- return runtime.uid;
- };
-
- this.trigger = function() {
- return owner.trigger.apply( owner, arguments );
- };
- }
-
- return CompBase;
- });
- /**
- * @fileOverview FlashRuntime
- */
- define('runtime/flash/runtime',[
- 'base',
- 'runtime/runtime',
- 'runtime/compbase'
- ], function( Base, Runtime, CompBase ) {
-
- var $ = Base.$,
- type = 'flash',
- components = {};
-
-
- function getFlashVersion() {
- var version;
-
- try {
- version = navigator.plugins[ 'Shockwave Flash' ];
- version = version.description;
- } catch ( ex ) {
- try {
- version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
- .GetVariable('$version');
- } catch ( ex2 ) {
- version = '0.0';
- }
- }
- version = version.match( /\d+/g );
- return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );
- }
-
- function FlashRuntime() {
- var pool = {},
- clients = {},
- destory = this.destory,
- me = this,
- jsreciver = Base.guid('webuploader_');
-
- Runtime.apply( me, arguments );
- me.type = type;
-
-
- // 这个方法的调用者,实际上是RuntimeClient
- me.exec = function( comp, fn/*, args...*/ ) {
- var client = this,
- uid = client.uid,
- args = Base.slice( arguments, 2 ),
- instance;
-
- clients[ uid ] = client;
-
- if ( components[ comp ] ) {
- if ( !pool[ uid ] ) {
- pool[ uid ] = new components[ comp ]( client, me );
- }
-
- instance = pool[ uid ];
-
- if ( instance[ fn ] ) {
- return instance[ fn ].apply( instance, args );
- }
- }
-
- return me.flashExec.apply( client, arguments );
- };
-
- function handler( evt, obj ) {
- var type = evt.type || evt,
- parts, uid;
-
- parts = type.split('::');
- uid = parts[ 0 ];
- type = parts[ 1 ];
-
- // console.log.apply( console, arguments );
-
- if ( type === 'Ready' && uid === me.uid ) {
- me.trigger('ready');
- } else if ( clients[ uid ] ) {
- clients[ uid ].trigger( type.toLowerCase(), evt, obj );
- }
-
- // Base.log( evt, obj );
- }
-
- // flash的接受器。
- window[ jsreciver ] = function() {
- var args = arguments;
-
- // 为了能捕获得到。
- setTimeout(function() {
- handler.apply( null, args );
- }, 1 );
- };
-
- this.jsreciver = jsreciver;
-
- this.destory = function() {
- // @todo 删除池子中的所有实例
- return destory && destory.apply( this, arguments );
- };
-
- this.flashExec = function( comp, fn ) {
- var flash = me.getFlash(),
- args = Base.slice( arguments, 2 );
-
- return flash.exec( this.uid, comp, fn, args );
- };
-
- // @todo
- }
-
- Base.inherits( Runtime, {
- constructor: FlashRuntime,
-
- init: function() {
- var container = this.getContainer(),
- opts = this.options,
- html;
-
- // if not the minimal height, shims are not initialized
- // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)
- container.css({
- position: 'absolute',
- top: '-8px',
- left: '-8px',
- width: '9px',
- height: '9px',
- overflow: 'hidden'
- });
-
- // insert flash object
- html = '' +
- ' ' +
- ' ' +
- ' ' +
- ' ' +
- ' ';
-
- container.html( html );
- },
-
- getFlash: function() {
- if ( this._flash ) {
- return this._flash;
- }
-
- this._flash = $( '#' + this.uid ).get( 0 );
- return this._flash;
- }
-
- });
-
- FlashRuntime.register = function( name, component ) {
- component = components[ name ] = Base.inherits( CompBase, $.extend({
-
- // @todo fix this later
- flashExec: function() {
- var owner = this.owner,
- runtime = this.getRuntime();
-
- return runtime.flashExec.apply( owner, arguments );
- }
- }, component ) );
-
- return component;
- };
-
- if ( getFlashVersion() >= 11.4 ) {
- Runtime.addRuntime( type, FlashRuntime );
- }
-
- return FlashRuntime;
- });
- /**
- * @fileOverview FilePicker
- */
- define('runtime/flash/filepicker',[
- 'base',
- 'runtime/flash/runtime'
- ], function( Base, FlashRuntime ) {
- var $ = Base.$;
-
- return FlashRuntime.register( 'FilePicker', {
- init: function( opts ) {
- var copy = $.extend({}, opts ),
- len, i;
-
- // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug.
- len = copy.accept && copy.accept.length;
- for ( i = 0; i < len; i++ ) {
- if ( !copy.accept[ i ].title ) {
- copy.accept[ i ].title = 'Files';
- }
- }
-
- delete copy.button;
- delete copy.container;
-
- this.flashExec( 'FilePicker', 'init', copy );
- },
-
- destroy: function() {
- // todo
- }
- });
- });
- /**
- * @fileOverview 图片压缩
- */
- define('runtime/flash/image',[
- 'runtime/flash/runtime'
- ], function( FlashRuntime ) {
-
- return FlashRuntime.register( 'Image', {
- // init: function( options ) {
- // var owner = this.owner;
-
- // this.flashExec( 'Image', 'init', options );
- // owner.on( 'load', function() {
- // debugger;
- // });
- // },
-
- loadFromBlob: function( blob ) {
- var owner = this.owner;
-
- owner.info() && this.flashExec( 'Image', 'info', owner.info() );
- owner.meta() && this.flashExec( 'Image', 'meta', owner.meta() );
-
- this.flashExec( 'Image', 'loadFromBlob', blob.uid );
- }
- });
- });
- /**
- * @fileOverview Transport flash实现
- */
- define('runtime/flash/transport',[
- 'base',
- 'runtime/flash/runtime',
- 'runtime/client'
- ], function( Base, FlashRuntime, RuntimeClient ) {
- var $ = Base.$;
-
- return FlashRuntime.register( 'Transport', {
- init: function() {
- this._status = 0;
- this._response = null;
- this._responseJson = null;
- },
-
- send: function() {
- var owner = this.owner,
- opts = this.options,
- xhr = this._initAjax(),
- blob = owner._blob,
- server = opts.server,
- binary;
-
- xhr.connectRuntime( blob.ruid );
-
- if ( opts.sendAsBinary ) {
- server += (/\?/.test( server ) ? '&' : '?') +
- $.param( owner._formData );
-
- binary = blob.uid;
- } else {
- $.each( owner._formData, function( k, v ) {
- xhr.exec( 'append', k, v );
- });
-
- xhr.exec( 'appendBlob', opts.fileVal, blob.uid,
- opts.filename || owner._formData.name || '' );
- }
-
- this._setRequestHeader( xhr, opts.headers );
- xhr.exec( 'send', {
- method: opts.method,
- url: server
- }, binary );
- },
-
- getStatus: function() {
- return this._status;
- },
-
- getResponse: function() {
- return this._response;
- },
-
- getResponseAsJson: function() {
- return this._responseJson;
- },
-
- abort: function() {
- var xhr = this._xhr;
-
- if ( xhr ) {
- xhr.exec('abort');
- xhr.destroy();
- this._xhr = xhr = null;
- }
- },
-
- destroy: function() {
- this.abort();
- },
-
- _initAjax: function() {
- var me = this,
- xhr = new RuntimeClient('XMLHttpRequest');
-
- xhr.on( 'uploadprogress progress', function( e ) {
- return me.trigger( 'progress', e.loaded / e.total );
- });
-
- xhr.on( 'load', function() {
- var status = xhr.exec('getStatus'),
- err = '';
-
- xhr.off();
- me._xhr = null;
-
- if ( status >= 200 && status < 300 ) {
- me._response = xhr.exec('getResponse');
- me._responseJson = xhr.exec('getResponseAsJson');
- } else if ( status >= 500 && status < 600 ) {
- me._response = xhr.exec('getResponse');
- me._responseJson = xhr.exec('getResponseAsJson');
- err = 'server';
- } else {
- err = 'http';
- }
-
- xhr.destroy();
- xhr = null;
-
- return err ? me.trigger( 'error', err ) : me.trigger('load');
- });
-
- xhr.on( 'error', function() {
- xhr.off();
- me._xhr = null;
- me.trigger( 'error', 'http' );
- });
-
- me._xhr = xhr;
- return xhr;
- },
-
- _setRequestHeader: function( xhr, headers ) {
- $.each( headers, function( key, val ) {
- xhr.exec( 'setRequestHeader', key, val );
- });
- }
- });
- });
- /**
- * @fileOverview 只有flash实现的文件版本。
- */
- define('preset/flashonly',[
- 'base',
-
- // widgets
- 'widgets/filepicker',
- 'widgets/image',
- 'widgets/queue',
- 'widgets/runtime',
- 'widgets/upload',
- 'widgets/validator',
-
- // runtimes
-
- // flash
- 'runtime/flash/filepicker',
- 'runtime/flash/image',
- 'runtime/flash/transport'
- ], function( Base ) {
- return Base;
- });
- define('webuploader',[
- 'preset/flashonly'
- ], function( preset ) {
- return preset;
- });
- return require('webuploader');
-});
diff --git a/www/js/ueditor/third-party/webuploader/webuploader.flashonly.min.js b/www/js/ueditor/third-party/webuploader/webuploader.flashonly.min.js
deleted file mode 100644
index 49c6b50b87..0000000000
--- a/www/js/ueditor/third-party/webuploader/webuploader.flashonly.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* WebUploader 0.1.2 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}},j=b(a,f,e);i(j),"object"==typeof module&&"object"==typeof module.exports?module.exports=j:"function"==typeof define&&define.amd?define([],j):(c=a.WebUploader,a.WebUploader=j,a.WebUploader.noConflict=function(){a.WebUploader=c})}(this,function(a,b,c){return b("dollar-third",[],function(){return a.jQuery||a.Zepto}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.2",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return{successNum:a.numOfSuccess,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.parentNode.removeChild(this.__container),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,b.call(d,"Blob"),this.uid=c.uid||this.uid,this.type=c.type||"",this.size=c.size||0,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;b.apply(this,arguments),this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&this.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(this.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),!this.type&&~"jpg,jpeg,png,gif,bmp".indexOf(f)&&(this.type="image/"+("jpg"===f?"jpeg":f)),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString()}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var b=this,c=b.options,e=c.button;e.addClass("webuploader-pick"),b.on("all",function(a){var g;switch(a){case"mouseenter":e.addClass("webuploader-pick-hover");break;case"mouseleave":e.removeClass("webuploader-pick-hover");break;case"change":g=b.exec("getFiles"),b.trigger("select",f.map(g,function(a){return a=new d(b.getRuid(),a),a._refer=c.container,a}),c.container)}}),b.connectRuntime(c,function(){b.refresh(),b.exec("init",c),b.trigger("ready")}),f(a).on("resize",function(){b.refresh()})},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){this.runtime&&(this.exec("destroy"),this.disconnectRuntime())}}),e}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g={},h=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):g},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[];return e.each(h,function(c,d){b.push(new d(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,h,i,j,k=0,l=this._widgets,m=l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],h=f.invoke(b,d),h!==g&&(a.isPromise(h)?o.push(h):n.push(h));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return setTimeout(function(){b.resolve.apply(b,c)},1),b.promise()})[j](e||a.noop)):n[0]}}),b.register=d.register=function(b,c){var f,g={init:"init"};return 1===arguments.length?(c=b,c.responseMap=g):c.responseMap=e.extend(g,b),f=a.inherits(d,c),h.push(f),f},d}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({"add-btn":"addButton",refresh:"refresh",disable:"disable",enable:"enable"},{init:function(a){return this.pickers=[],a.pick&&this.addButton(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addButton:function(b){var e,f,g,h=this,i=h.options,j=i.accept;if(b)return g=a.Deferred(),d.isPlainObject(b)||(b={id:b}),e=d.extend({},b,{accept:d.isPlainObject(j)?[j]:j,swf:i.swf,runtimeOrder:i.runtimeOrder}),f=new c(e),f.once("ready",g.resolve),f.on("select",function(a){h.owner.request("add-file",[a])}),f.init(),this.pickers.push(f),g.promise()},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})}})}),b("lib/image",["base","runtime/client","lib/blob"],function(a,b,c){function d(a){this.options=e.extend({},d.options,a),b.call(this,"Image"),this.on("load",function(){this._info=this.exec("info"),this._meta=this.exec("meta")})}var e=a.$;return d.options={quality:90,crop:!1,preserveHeaders:!0,allowMagnify:!0},a.inherits(b,{constructor:d,info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},loadFromBlob:function(a){var b=this,c=a.getRuid();this.connectRuntime(c,function(){b.exec("init",b.options),b.exec("loadFromBlob",a)})},resize:function(){var b=a.slice(arguments);return this.exec.apply(this,["resize"].concat(b))},getAsDataUrl:function(a){return this.exec("getAsDataUrl",a)},getAsBlob:function(a){var b=this.exec("getAsBlob",a);return new c(this.getRuid(),b)}}),d}),b("widgets/image",["base","uploader","lib/image","widgets/widget"],function(a,b,c){var d,e=a.$;return d=function(a){var b=0,c=[],d=function(){for(var d;c.length&&a>b;)d=c.shift(),b+=d[0],d[1]()};return function(a,e,f){c.push([e,f]),a.once("destroy",function(){b-=e,setTimeout(d,1)}),setTimeout(d,1)}}(5242880),e.extend(b.options,{thumb:{width:110,height:110,quality:70,allowMagnify:!0,crop:!0,preserveHeaders:!1,type:"image/jpeg"},compress:{width:1600,height:1600,quality:90,allowMagnify:!1,crop:!1,preserveHeaders:!0}}),b.register({"make-thumb":"makeThumb","before-send-file":"compressImage"},{makeThumb:function(a,b,f,g){var h,i;return a=this.request("get-file",a),a.type.match(/^image/)?(h=e.extend({},this.options.thumb),e.isPlainObject(f)&&(h=e.extend(h,f),f=null),f=f||h.width,g=g||h.height,i=new c(h),i.once("load",function(){a._info=a._info||i.info(),a._meta=a._meta||i.meta(),i.resize(f,g)}),i.once("complete",function(){b(!1,i.getAsDataUrl(h.type)),i.destroy()}),i.once("error",function(){b(!0),i.destroy()}),void d(i,a.source.size,function(){a._info&&i.info(a._info),a._meta&&i.meta(a._meta),i.loadFromBlob(a.source)})):void b(!0)},compressImage:function(b){var d,f,g=this.options.compress||this.options.resize,h=g&&g.compressSize||307200;return b=this.request("get-file",b),!g||!~"image/jpeg,image/jpg".indexOf(b.type)||b.sizeb;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)})),a.setStatus(f.QUEUED)},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({"sort-files":"sortFiles","add-file":"addFiles","get-file":"getFile","fetch-file":"fetchFile","get-stats":"getStats","get-files":"getFiles","remove-file":"removeFile",retry:"retry",reset:"reset","accept-file":"acceptFile"},{init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||a.size<6||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFiles:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&b.request("start-upload")},getStats:function(){return this.stats},removeFile:function(a){var b=this;a=a.id?a:b.queue.getFile(a),a.setStatus(i.CANCELLED),b.owner.trigger("fileDequeued",a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.queue=new c,this.stats=this.queue.stats}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({"predict-runtime-type":"predictRuntmeType"},{init:function(){if(!this.predictRuntmeType())throw Error("Runtime Error")},predictRuntmeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){for(var c,d=[],e=a.source,f=e.size,g=b?Math.ceil(f/b):1,h=0,i=0;g>i;)c=Math.min(b,f-h),d.push({file:a,start:h,end:b?h+c:f,total:f,chunks:g,chunk:i++}),h+=c;return a.blocks=d.concat(),a.remaning=d.length,{file:a,has:function(){return!!d.length},fetch:function(){return d.shift()}}}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:null}),b.register({"start-upload":"start","stop-upload":"stop","skip-file":"skipFile","is-in-progress":"isInProgress"},{init:function(){var b=this.owner;this.runing=!1,this.pool=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},start:function(){var b=this;f.each(b.request("get-files",h.INVALID),function(){b.request("remove-file",this)}),b.runing||(b.runing=!0,f.each(b.pool,function(a,c){var d=c.file;d.getStatus()===h.INTERRUPT&&(d.setStatus(h.PROGRESS),b._trigged=!1,c.transport&&c.transport.send())}),b._trigged=!1,b.owner.trigger("startUpload"),a.nextTick(b.__tick))},stop:function(a){var b=this;b.runing!==!1&&(b.runing=!1,a&&f.each(b.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),b.owner.trigger("stopUpload"))},isInProgress:function(){return!!this.runing},getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length1&&(f.each(k.blocks,function(a,b){d+=(b.percentage||0)*(b.end-b.start)}),c=d/k.size),i.trigger("uploadProgress",k,c||0)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({init:function(){var a=this;e.each(f,function(){this.call(a.owner)})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=b.fileNumLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=b.fileSizeLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}))}),d}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/flash/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a;try{a=navigator.plugins["Shockwave Flash"],a=a.description}catch(b){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(c){a="0.0"}}return a=a.match(/\d+/g),parseFloat(a[0]+"."+a[1],10)}function f(){function d(a,b){var c,d,e=a.type||a;c=e.split("::"),d=c[0],e=c[1],"Ready"===e&&d===j.uid?j.trigger("ready"):f[d]&&f[d].trigger(e.toLowerCase(),a,b)}var e={},f={},g=this.destory,j=this,k=b.guid("webuploader_");c.apply(j,arguments),j.type=h,j.exec=function(a,c){var d,g=this,h=g.uid,k=b.slice(arguments,2);return f[h]=g,i[a]&&(e[h]||(e[h]=new i[a](g,j)),d=e[h],d[c])?d[c].apply(d,k):j.flashExec.apply(g,arguments)},a[k]=function(){var a=arguments;setTimeout(function(){d.apply(null,a)},1)},this.jsreciver=k,this.destory=function(){return g&&g.apply(this,arguments)},this.flashExec=function(a,c){var d=j.getFlash(),e=b.slice(arguments,2);return d.exec(this.uid,a,c,e)}}var g=b.$,h="flash",i={};return b.inherits(c,{constructor:f,init:function(){var a,c=this.getContainer(),d=this.options;c.css({position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),a=' ',c.html(a)},getFlash:function(){return this._flash?this._flash:(this._flash=g("#"+this.uid).get(0),this._flash)}}),f.register=function(a,c){return c=i[a]=b.inherits(d,g.extend({flashExec:function(){var a=this.owner,b=this.getRuntime();return b.flashExec.apply(a,arguments)}},c))},e()>=11.4&&c.addRuntime(h,f),f}),b("runtime/flash/filepicker",["base","runtime/flash/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(a){var b,d,e=c.extend({},a);for(b=e.accept&&e.accept.length,d=0;b>d;d++)e.accept[d].title||(e.accept[d].title="Files");delete e.button,delete e.container,this.flashExec("FilePicker","init",e)},destroy:function(){}})}),b("runtime/flash/image",["runtime/flash/runtime"],function(a){return a.register("Image",{loadFromBlob:function(a){var b=this.owner;b.info()&&this.flashExec("Image","info",b.info()),b.meta()&&this.flashExec("Image","meta",b.meta()),this.flashExec("Image","loadFromBlob",a.uid)}})}),b("runtime/flash/transport",["base","runtime/flash/runtime","runtime/client"],function(a,b,c){var d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null,this._responseJson=null},send:function(){var a,b=this.owner,c=this.options,e=this._initAjax(),f=b._blob,g=c.server;e.connectRuntime(f.ruid),c.sendAsBinary?(g+=(/\?/.test(g)?"&":"?")+d.param(b._formData),a=f.uid):(d.each(b._formData,function(a,b){e.exec("append",a,b)
-}),e.exec("appendBlob",c.fileVal,f.uid,c.filename||b._formData.name||"")),this._setRequestHeader(e,c.headers),e.exec("send",{method:c.method,url:g},a)},getStatus:function(){return this._status},getResponse:function(){return this._response},getResponseAsJson:function(){return this._responseJson},abort:function(){var a=this._xhr;a&&(a.exec("abort"),a.destroy(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new c("XMLHttpRequest");return b.on("uploadprogress progress",function(b){return a.trigger("progress",b.loaded/b.total)}),b.on("load",function(){var c=b.exec("getStatus"),d="";return b.off(),a._xhr=null,c>=200&&300>c?(a._response=b.exec("getResponse"),a._responseJson=b.exec("getResponseAsJson")):c>=500&&600>c?(a._response=b.exec("getResponse"),a._responseJson=b.exec("getResponseAsJson"),d="server"):d="http",b.destroy(),b=null,d?a.trigger("error",d):a.trigger("load")}),b.on("error",function(){b.off(),a._xhr=null,a.trigger("error","http")}),a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.exec("setRequestHeader",b,c)})}})}),b("preset/flashonly",["base","widgets/filepicker","widgets/image","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","runtime/flash/filepicker","runtime/flash/image","runtime/flash/transport"],function(a){return a}),b("webuploader",["preset/flashonly"],function(a){return a}),c("webuploader")});
\ No newline at end of file
diff --git a/www/js/ueditor/third-party/webuploader/webuploader.html5only.js b/www/js/ueditor/third-party/webuploader/webuploader.html5only.js
deleted file mode 100644
index 5dd481375e..0000000000
--- a/www/js/ueditor/third-party/webuploader/webuploader.html5only.js
+++ /dev/null
@@ -1,5559 +0,0 @@
-/*! WebUploader 0.1.2 */
-
-
-/**
- * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
- *
- * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
- */
-(function( root, factory ) {
- var modules = {},
-
- // 内部require, 简单不完全实现。
- // https://github.com/amdjs/amdjs-api/wiki/require
- _require = function( deps, callback ) {
- var args, len, i;
-
- // 如果deps不是数组,则直接返回指定module
- if ( typeof deps === 'string' ) {
- return getModule( deps );
- } else {
- args = [];
- for( len = deps.length, i = 0; i < len; i++ ) {
- args.push( getModule( deps[ i ] ) );
- }
-
- return callback.apply( null, args );
- }
- },
-
- // 内部define,暂时不支持不指定id.
- _define = function( id, deps, factory ) {
- if ( arguments.length === 2 ) {
- factory = deps;
- deps = null;
- }
-
- _require( deps || [], function() {
- setModule( id, factory, arguments );
- });
- },
-
- // 设置module, 兼容CommonJs写法。
- setModule = function( id, factory, args ) {
- var module = {
- exports: factory
- },
- returned;
-
- if ( typeof factory === 'function' ) {
- args.length || (args = [ _require, module.exports, module ]);
- returned = factory.apply( null, args );
- returned !== undefined && (module.exports = returned);
- }
-
- modules[ id ] = module.exports;
- },
-
- // 根据id获取module
- getModule = function( id ) {
- var module = modules[ id ] || root[ id ];
-
- if ( !module ) {
- throw new Error( '`' + id + '` is undefined' );
- }
-
- return module;
- },
-
- // 将所有modules,将路径ids装换成对象。
- exportsTo = function( obj ) {
- var key, host, parts, part, last, ucFirst;
-
- // make the first character upper case.
- ucFirst = function( str ) {
- return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
- };
-
- for ( key in modules ) {
- host = obj;
-
- if ( !modules.hasOwnProperty( key ) ) {
- continue;
- }
-
- parts = key.split('/');
- last = ucFirst( parts.pop() );
-
- while( (part = ucFirst( parts.shift() )) ) {
- host[ part ] = host[ part ] || {};
- host = host[ part ];
- }
-
- host[ last ] = modules[ key ];
- }
- },
-
- exports = factory( root, _define, _require ),
- origin;
-
- // exports every module.
- exportsTo( exports );
-
- if ( typeof module === 'object' && typeof module.exports === 'object' ) {
-
- // For CommonJS and CommonJS-like environments where a proper window is present,
- module.exports = exports;
- } else if ( typeof define === 'function' && define.amd ) {
-
- // Allow using this built library as an AMD module
- // in another project. That other project will only
- // see this AMD call, not the internal modules in
- // the closure below.
- define([], exports );
- } else {
-
- // Browser globals case. Just assign the
- // result to a property on the global.
- origin = root.WebUploader;
- root.WebUploader = exports;
- root.WebUploader.noConflict = function() {
- root.WebUploader = origin;
- };
- }
-})( this, function( window, define, require ) {
-
-
- /**
- * @fileOverview jQuery or Zepto
- */
- define('dollar-third',[],function() {
- return window.jQuery || window.Zepto;
- });
- /**
- * @fileOverview Dom 操作相关
- */
- define('dollar',[
- 'dollar-third'
- ], function( _ ) {
- return _;
- });
- /**
- * @fileOverview 使用jQuery的Promise
- */
- define('promise-third',[
- 'dollar'
- ], function( $ ) {
- return {
- Deferred: $.Deferred,
- when: $.when,
-
- isPromise: function( anything ) {
- return anything && typeof anything.then === 'function';
- }
- };
- });
- /**
- * @fileOverview Promise/A+
- */
- define('promise',[
- 'promise-third'
- ], function( _ ) {
- return _;
- });
- /**
- * @fileOverview 基础类方法。
- */
-
- /**
- * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
- *
- * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
- * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
- *
- * * module `base`:WebUploader.Base
- * * module `file`: WebUploader.File
- * * module `lib/dnd`: WebUploader.Lib.Dnd
- * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
- *
- *
- * 以下文档将可能省略`WebUploader`前缀。
- * @module WebUploader
- * @title WebUploader API文档
- */
- define('base',[
- 'dollar',
- 'promise'
- ], function( $, promise ) {
-
- var noop = function() {},
- call = Function.call;
-
- // http://jsperf.com/uncurrythis
- // 反科里化
- function uncurryThis( fn ) {
- return function() {
- return call.apply( fn, arguments );
- };
- }
-
- function bindFn( fn, context ) {
- return function() {
- return fn.apply( context, arguments );
- };
- }
-
- function createObject( proto ) {
- var f;
-
- if ( Object.create ) {
- return Object.create( proto );
- } else {
- f = function() {};
- f.prototype = proto;
- return new f();
- }
- }
-
-
- /**
- * 基础类,提供一些简单常用的方法。
- * @class Base
- */
- return {
-
- /**
- * @property {String} version 当前版本号。
- */
- version: '0.1.2',
-
- /**
- * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
- */
- $: $,
-
- Deferred: promise.Deferred,
-
- isPromise: promise.isPromise,
-
- when: promise.when,
-
- /**
- * @description 简单的浏览器检查结果。
- *
- * * `webkit` webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
- * * `chrome` chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
- * * `ie` ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
- * * `firefox` firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
- * * `safari` safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
- * * `opera` opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
- *
- * @property {Object} [browser]
- */
- browser: (function( ua ) {
- var ret = {},
- webkit = ua.match( /WebKit\/([\d.]+)/ ),
- chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
- ua.match( /CriOS\/([\d.]+)/ ),
-
- ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
- ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i),
- firefox = ua.match( /Firefox\/([\d.]+)/ ),
- safari = ua.match( /Safari\/([\d.]+)/ ),
- opera = ua.match( /OPR\/([\d.]+)/ );
-
- webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
- chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
- ie && (ret.ie = parseFloat( ie[ 1 ] ));
- firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
- safari && (ret.safari = parseFloat( safari[ 1 ] ));
- opera && (ret.opera = parseFloat( opera[ 1 ] ));
-
- return ret;
- })( navigator.userAgent ),
-
- /**
- * @description 操作系统检查结果。
- *
- * * `android` 如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
- * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
- * @property {Object} [os]
- */
- os: (function( ua ) {
- var ret = {},
-
- // osx = !!ua.match( /\(Macintosh\; Intel / ),
- android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
- ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
-
- // osx && (ret.osx = true);
- android && (ret.android = parseFloat( android[ 1 ] ));
- ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
-
- return ret;
- })( navigator.userAgent ),
-
- /**
- * 实现类与类之间的继承。
- * @method inherits
- * @grammar Base.inherits( super ) => child
- * @grammar Base.inherits( super, protos ) => child
- * @grammar Base.inherits( super, protos, statics ) => child
- * @param {Class} super 父类
- * @param {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
- * @param {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
- * @param {Object} [statics] 静态属性或方法。
- * @return {Class} 返回子类。
- * @example
- * function Person() {
- * console.log( 'Super' );
- * }
- * Person.prototype.hello = function() {
- * console.log( 'hello' );
- * };
- *
- * var Manager = Base.inherits( Person, {
- * world: function() {
- * console.log( 'World' );
- * }
- * });
- *
- * // 因为没有指定构造器,父类的构造器将会执行。
- * var instance = new Manager(); // => Super
- *
- * // 继承子父类的方法
- * instance.hello(); // => hello
- * instance.world(); // => World
- *
- * // 子类的__super__属性指向父类
- * console.log( Manager.__super__ === Person ); // => true
- */
- inherits: function( Super, protos, staticProtos ) {
- var child;
-
- if ( typeof protos === 'function' ) {
- child = protos;
- protos = null;
- } else if ( protos && protos.hasOwnProperty('constructor') ) {
- child = protos.constructor;
- } else {
- child = function() {
- return Super.apply( this, arguments );
- };
- }
-
- // 复制静态方法
- $.extend( true, child, Super, staticProtos || {} );
-
- /* jshint camelcase: false */
-
- // 让子类的__super__属性指向父类。
- child.__super__ = Super.prototype;
-
- // 构建原型,添加原型方法或属性。
- // 暂时用Object.create实现。
- child.prototype = createObject( Super.prototype );
- protos && $.extend( true, child.prototype, protos );
-
- return child;
- },
-
- /**
- * 一个不做任何事情的方法。可以用来赋值给默认的callback.
- * @method noop
- */
- noop: noop,
-
- /**
- * 返回一个新的方法,此方法将已指定的`context`来执行。
- * @grammar Base.bindFn( fn, context ) => Function
- * @method bindFn
- * @example
- * var doSomething = function() {
- * console.log( this.name );
- * },
- * obj = {
- * name: 'Object Name'
- * },
- * aliasFn = Base.bind( doSomething, obj );
- *
- * aliasFn(); // => Object Name
- *
- */
- bindFn: bindFn,
-
- /**
- * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。
- * @grammar Base.log( args... ) => undefined
- * @method log
- */
- log: (function() {
- if ( window.console ) {
- return bindFn( console.log, console );
- }
- return noop;
- })(),
-
- nextTick: (function() {
-
- return function( cb ) {
- setTimeout( cb, 1 );
- };
-
- // @bug 当浏览器不在当前窗口时就停了。
- // var next = window.requestAnimationFrame ||
- // window.webkitRequestAnimationFrame ||
- // window.mozRequestAnimationFrame ||
- // function( cb ) {
- // window.setTimeout( cb, 1000 / 60 );
- // };
-
- // // fix: Uncaught TypeError: Illegal invocation
- // return bindFn( next, window );
- })(),
-
- /**
- * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
- * 将用来将非数组对象转化成数组对象。
- * @grammar Base.slice( target, start[, end] ) => Array
- * @method slice
- * @example
- * function doSomthing() {
- * var args = Base.slice( arguments, 1 );
- * console.log( args );
- * }
- *
- * doSomthing( 'ignored', 'arg2', 'arg3' ); // => Array ["arg2", "arg3"]
- */
- slice: uncurryThis( [].slice ),
-
- /**
- * 生成唯一的ID
- * @method guid
- * @grammar Base.guid() => String
- * @grammar Base.guid( prefx ) => String
- */
- guid: (function() {
- var counter = 0;
-
- return function( prefix ) {
- var guid = (+new Date()).toString( 32 ),
- i = 0;
-
- for ( ; i < 5; i++ ) {
- guid += Math.floor( Math.random() * 65535 ).toString( 32 );
- }
-
- return (prefix || 'wu_') + guid + (counter++).toString( 32 );
- };
- })(),
-
- /**
- * 格式化文件大小, 输出成带单位的字符串
- * @method formatSize
- * @grammar Base.formatSize( size ) => String
- * @grammar Base.formatSize( size, pointLength ) => String
- * @grammar Base.formatSize( size, pointLength, units ) => String
- * @param {Number} size 文件大小
- * @param {Number} [pointLength=2] 精确到的小数点数。
- * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
- * @example
- * console.log( Base.formatSize( 100 ) ); // => 100B
- * console.log( Base.formatSize( 1024 ) ); // => 1.00K
- * console.log( Base.formatSize( 1024, 0 ) ); // => 1K
- * console.log( Base.formatSize( 1024 * 1024 ) ); // => 1.00M
- * console.log( Base.formatSize( 1024 * 1024 * 1024 ) ); // => 1.00G
- * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) ); // => 1024MB
- */
- formatSize: function( size, pointLength, units ) {
- var unit;
-
- units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
-
- while ( (unit = units.shift()) && size > 1024 ) {
- size = size / 1024;
- }
-
- return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
- unit;
- }
- };
- });
- /**
- * 事件处理类,可以独立使用,也可以扩展给对象使用。
- * @fileOverview Mediator
- */
- define('mediator',[
- 'base'
- ], function( Base ) {
- var $ = Base.$,
- slice = [].slice,
- separator = /\s+/,
- protos;
-
- // 根据条件过滤出事件handlers.
- function findHandlers( arr, name, callback, context ) {
- return $.grep( arr, function( handler ) {
- return handler &&
- (!name || handler.e === name) &&
- (!callback || handler.cb === callback ||
- handler.cb._cb === callback) &&
- (!context || handler.ctx === context);
- });
- }
-
- function eachEvent( events, callback, iterator ) {
- // 不支持对象,只支持多个event用空格隔开
- $.each( (events || '').split( separator ), function( _, key ) {
- iterator( key, callback );
- });
- }
-
- function triggerHanders( events, args ) {
- var stoped = false,
- i = -1,
- len = events.length,
- handler;
-
- while ( ++i < len ) {
- handler = events[ i ];
-
- if ( handler.cb.apply( handler.ctx2, args ) === false ) {
- stoped = true;
- break;
- }
- }
-
- return !stoped;
- }
-
- protos = {
-
- /**
- * 绑定事件。
- *
- * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
- * ```javascript
- * var obj = {};
- *
- * // 使得obj有事件行为
- * Mediator.installTo( obj );
- *
- * obj.on( 'testa', function( arg1, arg2 ) {
- * console.log( arg1, arg2 ); // => 'arg1', 'arg2'
- * });
- *
- * obj.trigger( 'testa', 'arg1', 'arg2' );
- * ```
- *
- * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
- * 切会影响到`trigger`方法的返回值,为`false`。
- *
- * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
- * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
- * ```javascript
- * obj.on( 'all', function( type, arg1, arg2 ) {
- * console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
- * });
- * ```
- *
- * @method on
- * @grammar on( name, callback[, context] ) => self
- * @param {String} name 事件名,支持多个事件用空格隔开
- * @param {Function} callback 事件处理器
- * @param {Object} [context] 事件处理器的上下文。
- * @return {self} 返回自身,方便链式
- * @chainable
- * @class Mediator
- */
- on: function( name, callback, context ) {
- var me = this,
- set;
-
- if ( !callback ) {
- return this;
- }
-
- set = this._events || (this._events = []);
-
- eachEvent( name, callback, function( name, callback ) {
- var handler = { e: name };
-
- handler.cb = callback;
- handler.ctx = context;
- handler.ctx2 = context || me;
- handler.id = set.length;
-
- set.push( handler );
- });
-
- return this;
- },
-
- /**
- * 绑定事件,且当handler执行完后,自动解除绑定。
- * @method once
- * @grammar once( name, callback[, context] ) => self
- * @param {String} name 事件名
- * @param {Function} callback 事件处理器
- * @param {Object} [context] 事件处理器的上下文。
- * @return {self} 返回自身,方便链式
- * @chainable
- */
- once: function( name, callback, context ) {
- var me = this;
-
- if ( !callback ) {
- return me;
- }
-
- eachEvent( name, callback, function( name, callback ) {
- var once = function() {
- me.off( name, once );
- return callback.apply( context || me, arguments );
- };
-
- once._cb = callback;
- me.on( name, once, context );
- });
-
- return me;
- },
-
- /**
- * 解除事件绑定
- * @method off
- * @grammar off( [name[, callback[, context] ] ] ) => self
- * @param {String} [name] 事件名
- * @param {Function} [callback] 事件处理器
- * @param {Object} [context] 事件处理器的上下文。
- * @return {self} 返回自身,方便链式
- * @chainable
- */
- off: function( name, cb, ctx ) {
- var events = this._events;
-
- if ( !events ) {
- return this;
- }
-
- if ( !name && !cb && !ctx ) {
- this._events = [];
- return this;
- }
-
- eachEvent( name, cb, function( name, cb ) {
- $.each( findHandlers( events, name, cb, ctx ), function() {
- delete events[ this.id ];
- });
- });
-
- return this;
- },
-
- /**
- * 触发事件
- * @method trigger
- * @grammar trigger( name[, args...] ) => self
- * @param {String} type 事件名
- * @param {*} [...] 任意参数
- * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
- */
- trigger: function( type ) {
- var args, events, allEvents;
-
- if ( !this._events || !type ) {
- return this;
- }
-
- args = slice.call( arguments, 1 );
- events = findHandlers( this._events, type );
- allEvents = findHandlers( this._events, 'all' );
-
- return triggerHanders( events, args ) &&
- triggerHanders( allEvents, arguments );
- }
- };
-
- /**
- * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
- * 主要目的是负责模块与模块之间的合作,降低耦合度。
- *
- * @class Mediator
- */
- return $.extend({
-
- /**
- * 可以通过这个接口,使任何对象具备事件功能。
- * @method installTo
- * @param {Object} obj 需要具备事件行为的对象。
- * @return {Object} 返回obj.
- */
- installTo: function( obj ) {
- return $.extend( obj, protos );
- }
-
- }, protos );
- });
- /**
- * @fileOverview Uploader上传类
- */
- define('uploader',[
- 'base',
- 'mediator'
- ], function( Base, Mediator ) {
-
- var $ = Base.$;
-
- /**
- * 上传入口类。
- * @class Uploader
- * @constructor
- * @grammar new Uploader( opts ) => Uploader
- * @example
- * var uploader = WebUploader.Uploader({
- * swf: 'path_of_swf/Uploader.swf',
- *
- * // 开起分片上传。
- * chunked: true
- * });
- */
- function Uploader( opts ) {
- this.options = $.extend( true, {}, Uploader.options, opts );
- this._init( this.options );
- }
-
- // default Options
- // widgets中有相应扩展
- Uploader.options = {};
- Mediator.installTo( Uploader.prototype );
-
- // 批量添加纯命令式方法。
- $.each({
- upload: 'start-upload',
- stop: 'stop-upload',
- getFile: 'get-file',
- getFiles: 'get-files',
- addFile: 'add-file',
- addFiles: 'add-file',
- sort: 'sort-files',
- removeFile: 'remove-file',
- skipFile: 'skip-file',
- retry: 'retry',
- isInProgress: 'is-in-progress',
- makeThumb: 'make-thumb',
- getDimension: 'get-dimension',
- addButton: 'add-btn',
- getRuntimeType: 'get-runtime-type',
- refresh: 'refresh',
- disable: 'disable',
- enable: 'enable',
- reset: 'reset'
- }, function( fn, command ) {
- Uploader.prototype[ fn ] = function() {
- return this.request( command, arguments );
- };
- });
-
- $.extend( Uploader.prototype, {
- state: 'pending',
-
- _init: function( opts ) {
- var me = this;
-
- me.request( 'init', opts, function() {
- me.state = 'ready';
- me.trigger('ready');
- });
- },
-
- /**
- * 获取或者设置Uploader配置项。
- * @method option
- * @grammar option( key ) => *
- * @grammar option( key, val ) => self
- * @example
- *
- * // 初始状态图片上传前不会压缩
- * var uploader = new WebUploader.Uploader({
- * resize: null;
- * });
- *
- * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
- * uploader.options( 'resize', {
- * width: 1600,
- * height: 1600
- * });
- */
- option: function( key, val ) {
- var opts = this.options;
-
- // setter
- if ( arguments.length > 1 ) {
-
- if ( $.isPlainObject( val ) &&
- $.isPlainObject( opts[ key ] ) ) {
- $.extend( opts[ key ], val );
- } else {
- opts[ key ] = val;
- }
-
- } else { // getter
- return key ? opts[ key ] : opts;
- }
- },
-
- /**
- * 获取文件统计信息。返回一个包含一下信息的对象。
- * * `successNum` 上传成功的文件数
- * * `uploadFailNum` 上传失败的文件数
- * * `cancelNum` 被删除的文件数
- * * `invalidNum` 无效的文件数
- * * `queueNum` 还在队列中的文件数
- * @method getStats
- * @grammar getStats() => Object
- */
- getStats: function() {
- // return this._mgr.getStats.apply( this._mgr, arguments );
- var stats = this.request('get-stats');
-
- return {
- successNum: stats.numOfSuccess,
-
- // who care?
- // queueFailNum: 0,
- cancelNum: stats.numOfCancel,
- invalidNum: stats.numOfInvalid,
- uploadFailNum: stats.numOfUploadFailed,
- queueNum: stats.numOfQueue
- };
- },
-
- // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
- trigger: function( type/*, args...*/ ) {
- var args = [].slice.call( arguments, 1 ),
- opts = this.options,
- name = 'on' + type.substring( 0, 1 ).toUpperCase() +
- type.substring( 1 );
-
- if (
- // 调用通过on方法注册的handler.
- Mediator.trigger.apply( this, arguments ) === false ||
-
- // 调用opts.onEvent
- $.isFunction( opts[ name ] ) &&
- opts[ name ].apply( this, args ) === false ||
-
- // 调用this.onEvent
- $.isFunction( this[ name ] ) &&
- this[ name ].apply( this, args ) === false ||
-
- // 广播所有uploader的事件。
- Mediator.trigger.apply( Mediator,
- [ this, type ].concat( args ) ) === false ) {
-
- return false;
- }
-
- return true;
- },
-
- // widgets/widget.js将补充此方法的详细文档。
- request: Base.noop
- });
-
- /**
- * 创建Uploader实例,等同于new Uploader( opts );
- * @method create
- * @class Base
- * @static
- * @grammar Base.create( opts ) => Uploader
- */
- Base.create = Uploader.create = function( opts ) {
- return new Uploader( opts );
- };
-
- // 暴露Uploader,可以通过它来扩展业务逻辑。
- Base.Uploader = Uploader;
-
- return Uploader;
- });
- /**
- * @fileOverview Runtime管理器,负责Runtime的选择, 连接
- */
- define('runtime/runtime',[
- 'base',
- 'mediator'
- ], function( Base, Mediator ) {
-
- var $ = Base.$,
- factories = {},
-
- // 获取对象的第一个key
- getFirstKey = function( obj ) {
- for ( var key in obj ) {
- if ( obj.hasOwnProperty( key ) ) {
- return key;
- }
- }
- return null;
- };
-
- // 接口类。
- function Runtime( options ) {
- this.options = $.extend({
- container: document.body
- }, options );
- this.uid = Base.guid('rt_');
- }
-
- $.extend( Runtime.prototype, {
-
- getContainer: function() {
- var opts = this.options,
- parent, container;
-
- if ( this._container ) {
- return this._container;
- }
-
- parent = $( opts.container || document.body );
- container = $( document.createElement('div') );
-
- container.attr( 'id', 'rt_' + this.uid );
- container.css({
- position: 'absolute',
- top: '0px',
- left: '0px',
- width: '1px',
- height: '1px',
- overflow: 'hidden'
- });
-
- parent.append( container );
- parent.addClass('webuploader-container');
- this._container = container;
- return container;
- },
-
- init: Base.noop,
- exec: Base.noop,
-
- destroy: function() {
- if ( this._container ) {
- this._container.parentNode.removeChild( this.__container );
- }
-
- this.off();
- }
- });
-
- Runtime.orders = 'html5,flash';
-
-
- /**
- * 添加Runtime实现。
- * @param {String} type 类型
- * @param {Runtime} factory 具体Runtime实现。
- */
- Runtime.addRuntime = function( type, factory ) {
- factories[ type ] = factory;
- };
-
- Runtime.hasRuntime = function( type ) {
- return !!(type ? factories[ type ] : getFirstKey( factories ));
- };
-
- Runtime.create = function( opts, orders ) {
- var type, runtime;
-
- orders = orders || Runtime.orders;
- $.each( orders.split( /\s*,\s*/g ), function() {
- if ( factories[ this ] ) {
- type = this;
- return false;
- }
- });
-
- type = type || getFirstKey( factories );
-
- if ( !type ) {
- throw new Error('Runtime Error');
- }
-
- runtime = new factories[ type ]( opts );
- return runtime;
- };
-
- Mediator.installTo( Runtime.prototype );
- return Runtime;
- });
-
- /**
- * @fileOverview Runtime管理器,负责Runtime的选择, 连接
- */
- define('runtime/client',[
- 'base',
- 'mediator',
- 'runtime/runtime'
- ], function( Base, Mediator, Runtime ) {
-
- var cache;
-
- cache = (function() {
- var obj = {};
-
- return {
- add: function( runtime ) {
- obj[ runtime.uid ] = runtime;
- },
-
- get: function( ruid, standalone ) {
- var i;
-
- if ( ruid ) {
- return obj[ ruid ];
- }
-
- for ( i in obj ) {
- // 有些类型不能重用,比如filepicker.
- if ( standalone && obj[ i ].__standalone ) {
- continue;
- }
-
- return obj[ i ];
- }
-
- return null;
- },
-
- remove: function( runtime ) {
- delete obj[ runtime.uid ];
- }
- };
- })();
-
- function RuntimeClient( component, standalone ) {
- var deferred = Base.Deferred(),
- runtime;
-
- this.uid = Base.guid('client_');
-
- // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
- this.runtimeReady = function( cb ) {
- return deferred.done( cb );
- };
-
- this.connectRuntime = function( opts, cb ) {
-
- // already connected.
- if ( runtime ) {
- throw new Error('already connected!');
- }
-
- deferred.done( cb );
-
- if ( typeof opts === 'string' && cache.get( opts ) ) {
- runtime = cache.get( opts );
- }
-
- // 像filePicker只能独立存在,不能公用。
- runtime = runtime || cache.get( null, standalone );
-
- // 需要创建
- if ( !runtime ) {
- runtime = Runtime.create( opts, opts.runtimeOrder );
- runtime.__promise = deferred.promise();
- runtime.once( 'ready', deferred.resolve );
- runtime.init();
- cache.add( runtime );
- runtime.__client = 1;
- } else {
- // 来自cache
- Base.$.extend( runtime.options, opts );
- runtime.__promise.then( deferred.resolve );
- runtime.__client++;
- }
-
- standalone && (runtime.__standalone = standalone);
- return runtime;
- };
-
- this.getRuntime = function() {
- return runtime;
- };
-
- this.disconnectRuntime = function() {
- if ( !runtime ) {
- return;
- }
-
- runtime.__client--;
-
- if ( runtime.__client <= 0 ) {
- cache.remove( runtime );
- delete runtime.__promise;
- runtime.destroy();
- }
-
- runtime = null;
- };
-
- this.exec = function() {
- if ( !runtime ) {
- return;
- }
-
- var args = Base.slice( arguments );
- component && args.unshift( component );
-
- return runtime.exec.apply( this, args );
- };
-
- this.getRuid = function() {
- return runtime && runtime.uid;
- };
-
- this.destroy = (function( destroy ) {
- return function() {
- destroy && destroy.apply( this, arguments );
- this.trigger('destroy');
- this.off();
- this.exec('destroy');
- this.disconnectRuntime();
- };
- })( this.destroy );
- }
-
- Mediator.installTo( RuntimeClient.prototype );
- return RuntimeClient;
- });
- /**
- * @fileOverview 错误信息
- */
- define('lib/dnd',[
- 'base',
- 'mediator',
- 'runtime/client'
- ], function( Base, Mediator, RuntimeClent ) {
-
- var $ = Base.$;
-
- function DragAndDrop( opts ) {
- opts = this.options = $.extend({}, DragAndDrop.options, opts );
-
- opts.container = $( opts.container );
-
- if ( !opts.container.length ) {
- return;
- }
-
- RuntimeClent.call( this, 'DragAndDrop' );
- }
-
- DragAndDrop.options = {
- accept: null,
- disableGlobalDnd: false
- };
-
- Base.inherits( RuntimeClent, {
- constructor: DragAndDrop,
-
- init: function() {
- var me = this;
-
- me.connectRuntime( me.options, function() {
- me.exec('init');
- me.trigger('ready');
- });
- },
-
- destroy: function() {
- this.disconnectRuntime();
- }
- });
-
- Mediator.installTo( DragAndDrop.prototype );
-
- return DragAndDrop;
- });
- /**
- * @fileOverview 组件基类。
- */
- define('widgets/widget',[
- 'base',
- 'uploader'
- ], function( Base, Uploader ) {
-
- var $ = Base.$,
- _init = Uploader.prototype._init,
- IGNORE = {},
- widgetClass = [];
-
- function isArrayLike( obj ) {
- if ( !obj ) {
- return false;
- }
-
- var length = obj.length,
- type = $.type( obj );
-
- if ( obj.nodeType === 1 && length ) {
- return true;
- }
-
- return type === 'array' || type !== 'function' && type !== 'string' &&
- (length === 0 || typeof length === 'number' && length > 0 &&
- (length - 1) in obj);
- }
-
- function Widget( uploader ) {
- this.owner = uploader;
- this.options = uploader.options;
- }
-
- $.extend( Widget.prototype, {
-
- init: Base.noop,
-
- // 类Backbone的事件监听声明,监听uploader实例上的事件
- // widget直接无法监听事件,事件只能通过uploader来传递
- invoke: function( apiName, args ) {
-
- /*
- {
- 'make-thumb': 'makeThumb'
- }
- */
- var map = this.responseMap;
-
- // 如果无API响应声明则忽略
- if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
- !$.isFunction( this[ map[ apiName ] ] ) ) {
-
- return IGNORE;
- }
-
- return this[ map[ apiName ] ].apply( this, args );
-
- },
-
- /**
- * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
- * @method request
- * @grammar request( command, args ) => * | Promise
- * @grammar request( command, args, callback ) => Promise
- * @for Uploader
- */
- request: function() {
- return this.owner.request.apply( this.owner, arguments );
- }
- });
-
- // 扩展Uploader.
- $.extend( Uploader.prototype, {
-
- // 覆写_init用来初始化widgets
- _init: function() {
- var me = this,
- widgets = me._widgets = [];
-
- $.each( widgetClass, function( _, klass ) {
- widgets.push( new klass( me ) );
- });
-
- return _init.apply( me, arguments );
- },
-
- request: function( apiName, args, callback ) {
- var i = 0,
- widgets = this._widgets,
- len = widgets.length,
- rlts = [],
- dfds = [],
- widget, rlt, promise, key;
-
- args = isArrayLike( args ) ? args : [ args ];
-
- for ( ; i < len; i++ ) {
- widget = widgets[ i ];
- rlt = widget.invoke( apiName, args );
-
- if ( rlt !== IGNORE ) {
-
- // Deferred对象
- if ( Base.isPromise( rlt ) ) {
- dfds.push( rlt );
- } else {
- rlts.push( rlt );
- }
- }
- }
-
- // 如果有callback,则用异步方式。
- if ( callback || dfds.length ) {
- promise = Base.when.apply( Base, dfds );
- key = promise.pipe ? 'pipe' : 'then';
-
- // 很重要不能删除。删除了会死循环。
- // 保证执行顺序。让callback总是在下一个tick中执行。
- return promise[ key ](function() {
- var deferred = Base.Deferred(),
- args = arguments;
-
- setTimeout(function() {
- deferred.resolve.apply( deferred, args );
- }, 1 );
-
- return deferred.promise();
- })[ key ]( callback || Base.noop );
- } else {
- return rlts[ 0 ];
- }
- }
- });
-
- /**
- * 添加组件
- * @param {object} widgetProto 组件原型,构造函数通过constructor属性定义
- * @param {object} responseMap API名称与函数实现的映射
- * @example
- * Uploader.register( {
- * init: function( options ) {},
- * makeThumb: function() {}
- * }, {
- * 'make-thumb': 'makeThumb'
- * } );
- */
- Uploader.register = Widget.register = function( responseMap, widgetProto ) {
- var map = { init: 'init' },
- klass;
-
- if ( arguments.length === 1 ) {
- widgetProto = responseMap;
- widgetProto.responseMap = map;
- } else {
- widgetProto.responseMap = $.extend( map, responseMap );
- }
-
- klass = Base.inherits( Widget, widgetProto );
- widgetClass.push( klass );
-
- return klass;
- };
-
- return Widget;
- });
- /**
- * @fileOverview DragAndDrop Widget。
- */
- define('widgets/filednd',[
- 'base',
- 'uploader',
- 'lib/dnd',
- 'widgets/widget'
- ], function( Base, Uploader, Dnd ) {
- var $ = Base.$;
-
- Uploader.options.dnd = '';
-
- /**
- * @property {Selector} [dnd=undefined] 指定Drag And Drop拖拽的容器,如果不指定,则不启动。
- * @namespace options
- * @for Uploader
- */
-
- /**
- * @event dndAccept
- * @param {DataTransferItemList} items DataTransferItem
- * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。
- * @for Uploader
- */
- return Uploader.register({
- init: function( opts ) {
-
- if ( !opts.dnd ||
- this.request('predict-runtime-type') !== 'html5' ) {
- return;
- }
-
- var me = this,
- deferred = Base.Deferred(),
- options = $.extend({}, {
- disableGlobalDnd: opts.disableGlobalDnd,
- container: opts.dnd,
- accept: opts.accept
- }),
- dnd;
-
- dnd = new Dnd( options );
-
- dnd.once( 'ready', deferred.resolve );
- dnd.on( 'drop', function( files ) {
- me.request( 'add-file', [ files ]);
- });
-
- // 检测文件是否全部允许添加。
- dnd.on( 'accept', function( items ) {
- return me.owner.trigger( 'dndAccept', items );
- });
-
- dnd.init();
-
- return deferred.promise();
- }
- });
- });
-
- /**
- * @fileOverview 错误信息
- */
- define('lib/filepaste',[
- 'base',
- 'mediator',
- 'runtime/client'
- ], function( Base, Mediator, RuntimeClent ) {
-
- var $ = Base.$;
-
- function FilePaste( opts ) {
- opts = this.options = $.extend({}, opts );
- opts.container = $( opts.container || document.body );
- RuntimeClent.call( this, 'FilePaste' );
- }
-
- Base.inherits( RuntimeClent, {
- constructor: FilePaste,
-
- init: function() {
- var me = this;
-
- me.connectRuntime( me.options, function() {
- me.exec('init');
- me.trigger('ready');
- });
- },
-
- destroy: function() {
- this.exec('destroy');
- this.disconnectRuntime();
- this.off();
- }
- });
-
- Mediator.installTo( FilePaste.prototype );
-
- return FilePaste;
- });
- /**
- * @fileOverview 组件基类。
- */
- define('widgets/filepaste',[
- 'base',
- 'uploader',
- 'lib/filepaste',
- 'widgets/widget'
- ], function( Base, Uploader, FilePaste ) {
- var $ = Base.$;
-
- /**
- * @property {Selector} [paste=undefined] 指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`.
- * @namespace options
- * @for Uploader
- */
- return Uploader.register({
- init: function( opts ) {
-
- if ( !opts.paste ||
- this.request('predict-runtime-type') !== 'html5' ) {
- return;
- }
-
- var me = this,
- deferred = Base.Deferred(),
- options = $.extend({}, {
- container: opts.paste,
- accept: opts.accept
- }),
- paste;
-
- paste = new FilePaste( options );
-
- paste.once( 'ready', deferred.resolve );
- paste.on( 'paste', function( files ) {
- me.owner.request( 'add-file', [ files ]);
- });
- paste.init();
-
- return deferred.promise();
- }
- });
- });
- /**
- * @fileOverview Blob
- */
- define('lib/blob',[
- 'base',
- 'runtime/client'
- ], function( Base, RuntimeClient ) {
-
- function Blob( ruid, source ) {
- var me = this;
-
- me.source = source;
- me.ruid = ruid;
-
- RuntimeClient.call( me, 'Blob' );
-
- this.uid = source.uid || this.uid;
- this.type = source.type || '';
- this.size = source.size || 0;
-
- if ( ruid ) {
- me.connectRuntime( ruid );
- }
- }
-
- Base.inherits( RuntimeClient, {
- constructor: Blob,
-
- slice: function( start, end ) {
- return this.exec( 'slice', start, end );
- },
-
- getSource: function() {
- return this.source;
- }
- });
-
- return Blob;
- });
- /**
- * 为了统一化Flash的File和HTML5的File而存在。
- * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
- * @fileOverview File
- */
- define('lib/file',[
- 'base',
- 'lib/blob'
- ], function( Base, Blob ) {
-
- var uid = 1,
- rExt = /\.([^.]+)$/;
-
- function File( ruid, file ) {
- var ext;
-
- Blob.apply( this, arguments );
- this.name = file.name || ('untitled' + uid++);
- ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
-
- // todo 支持其他类型文件的转换。
-
- // 如果有mimetype, 但是文件名里面没有找出后缀规律
- if ( !ext && this.type ) {
- ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?
- RegExp.$1.toLowerCase() : '';
- this.name += '.' + ext;
- }
-
- // 如果没有指定mimetype, 但是知道文件后缀。
- if ( !this.type && ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {
- this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);
- }
-
- this.ext = ext;
- this.lastModifiedDate = file.lastModifiedDate ||
- (new Date()).toLocaleString();
- }
-
- return Base.inherits( Blob, File );
- });
-
- /**
- * @fileOverview 错误信息
- */
- define('lib/filepicker',[
- 'base',
- 'runtime/client',
- 'lib/file'
- ], function( Base, RuntimeClent, File ) {
-
- var $ = Base.$;
-
- function FilePicker( opts ) {
- opts = this.options = $.extend({}, FilePicker.options, opts );
-
- opts.container = $( opts.id );
-
- if ( !opts.container.length ) {
- throw new Error('按钮指定错误');
- }
-
- opts.innerHTML = opts.innerHTML || opts.label ||
- opts.container.html() || '';
-
- opts.button = $( opts.button || document.createElement('div') );
- opts.button.html( opts.innerHTML );
- opts.container.html( opts.button );
-
- RuntimeClent.call( this, 'FilePicker', true );
- }
-
- FilePicker.options = {
- button: null,
- container: null,
- label: null,
- innerHTML: null,
- multiple: true,
- accept: null,
- name: 'file'
- };
-
- Base.inherits( RuntimeClent, {
- constructor: FilePicker,
-
- init: function() {
- var me = this,
- opts = me.options,
- button = opts.button;
-
- button.addClass('webuploader-pick');
-
- me.on( 'all', function( type ) {
- var files;
-
- switch ( type ) {
- case 'mouseenter':
- button.addClass('webuploader-pick-hover');
- break;
-
- case 'mouseleave':
- button.removeClass('webuploader-pick-hover');
- break;
-
- case 'change':
- files = me.exec('getFiles');
- me.trigger( 'select', $.map( files, function( file ) {
- file = new File( me.getRuid(), file );
-
- // 记录来源。
- file._refer = opts.container;
- return file;
- }), opts.container );
- break;
- }
- });
-
- me.connectRuntime( opts, function() {
- me.refresh();
- me.exec( 'init', opts );
- me.trigger('ready');
- });
-
- $( window ).on( 'resize', function() {
- me.refresh();
- });
- },
-
- refresh: function() {
- var shimContainer = this.getRuntime().getContainer(),
- button = this.options.button,
- width = button.outerWidth ?
- button.outerWidth() : button.width(),
-
- height = button.outerHeight ?
- button.outerHeight() : button.height(),
-
- pos = button.offset();
-
- width && height && shimContainer.css({
- bottom: 'auto',
- right: 'auto',
- width: width + 'px',
- height: height + 'px'
- }).offset( pos );
- },
-
- enable: function() {
- var btn = this.options.button;
-
- btn.removeClass('webuploader-pick-disable');
- this.refresh();
- },
-
- disable: function() {
- var btn = this.options.button;
-
- this.getRuntime().getContainer().css({
- top: '-99999px'
- });
-
- btn.addClass('webuploader-pick-disable');
- },
-
- destroy: function() {
- if ( this.runtime ) {
- this.exec('destroy');
- this.disconnectRuntime();
- }
- }
- });
-
- return FilePicker;
- });
-
- /**
- * @fileOverview 文件选择相关
- */
- define('widgets/filepicker',[
- 'base',
- 'uploader',
- 'lib/filepicker',
- 'widgets/widget'
- ], function( Base, Uploader, FilePicker ) {
- var $ = Base.$;
-
- $.extend( Uploader.options, {
-
- /**
- * @property {Selector | Object} [pick=undefined]
- * @namespace options
- * @for Uploader
- * @description 指定选择文件的按钮容器,不指定则不创建按钮。
- *
- * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。
- * * `label` {String} 请采用 `innerHTML` 代替
- * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
- * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
- */
- pick: null,
-
- /**
- * @property {Arroy} [accept=null]
- * @namespace options
- * @for Uploader
- * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
- *
- * * `title` {String} 文字描述
- * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
- * * `mimeTypes` {String} 多个用逗号分割。
- *
- * 如:
- *
- * ```
- * {
- * title: 'Images',
- * extensions: 'gif,jpg,jpeg,bmp,png',
- * mimeTypes: 'image/*'
- * }
- * ```
- */
- accept: null/*{
- title: 'Images',
- extensions: 'gif,jpg,jpeg,bmp,png',
- mimeTypes: 'image/*'
- }*/
- });
-
- return Uploader.register({
- 'add-btn': 'addButton',
- refresh: 'refresh',
- disable: 'disable',
- enable: 'enable'
- }, {
-
- init: function( opts ) {
- this.pickers = [];
- return opts.pick && this.addButton( opts.pick );
- },
-
- refresh: function() {
- $.each( this.pickers, function() {
- this.refresh();
- });
- },
-
- /**
- * @method addButton
- * @for Uploader
- * @grammar addButton( pick ) => Promise
- * @description
- * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
- * @example
- * uploader.addButton({
- * id: '#btnContainer',
- * innerHTML: '选择文件'
- * });
- */
- addButton: function( pick ) {
- var me = this,
- opts = me.options,
- accept = opts.accept,
- options, picker, deferred;
-
- if ( !pick ) {
- return;
- }
-
- deferred = Base.Deferred();
- $.isPlainObject( pick ) || (pick = {
- id: pick
- });
-
- options = $.extend({}, pick, {
- accept: $.isPlainObject( accept ) ? [ accept ] : accept,
- swf: opts.swf,
- runtimeOrder: opts.runtimeOrder
- });
-
- picker = new FilePicker( options );
-
- picker.once( 'ready', deferred.resolve );
- picker.on( 'select', function( files ) {
- me.owner.request( 'add-file', [ files ]);
- });
- picker.init();
-
- this.pickers.push( picker );
-
- return deferred.promise();
- },
-
- disable: function() {
- $.each( this.pickers, function() {
- this.disable();
- });
- },
-
- enable: function() {
- $.each( this.pickers, function() {
- this.enable();
- });
- }
- });
- });
- /**
- * @fileOverview Image
- */
- define('lib/image',[
- 'base',
- 'runtime/client',
- 'lib/blob'
- ], function( Base, RuntimeClient, Blob ) {
- var $ = Base.$;
-
- // 构造器。
- function Image( opts ) {
- this.options = $.extend({}, Image.options, opts );
- RuntimeClient.call( this, 'Image' );
-
- this.on( 'load', function() {
- this._info = this.exec('info');
- this._meta = this.exec('meta');
- });
- }
-
- // 默认选项。
- Image.options = {
-
- // 默认的图片处理质量
- quality: 90,
-
- // 是否裁剪
- crop: false,
-
- // 是否保留头部信息
- preserveHeaders: true,
-
- // 是否允许放大。
- allowMagnify: true
- };
-
- // 继承RuntimeClient.
- Base.inherits( RuntimeClient, {
- constructor: Image,
-
- info: function( val ) {
-
- // setter
- if ( val ) {
- this._info = val;
- return this;
- }
-
- // getter
- return this._info;
- },
-
- meta: function( val ) {
-
- // setter
- if ( val ) {
- this._meta = val;
- return this;
- }
-
- // getter
- return this._meta;
- },
-
- loadFromBlob: function( blob ) {
- var me = this,
- ruid = blob.getRuid();
-
- this.connectRuntime( ruid, function() {
- me.exec( 'init', me.options );
- me.exec( 'loadFromBlob', blob );
- });
- },
-
- resize: function() {
- var args = Base.slice( arguments );
- return this.exec.apply( this, [ 'resize' ].concat( args ) );
- },
-
- getAsDataUrl: function( type ) {
- return this.exec( 'getAsDataUrl', type );
- },
-
- getAsBlob: function( type ) {
- var blob = this.exec( 'getAsBlob', type );
-
- return new Blob( this.getRuid(), blob );
- }
- });
-
- return Image;
- });
- /**
- * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
- */
- define('widgets/image',[
- 'base',
- 'uploader',
- 'lib/image',
- 'widgets/widget'
- ], function( Base, Uploader, Image ) {
-
- var $ = Base.$,
- throttle;
-
- // 根据要处理的文件大小来节流,一次不能处理太多,会卡。
- throttle = (function( max ) {
- var occupied = 0,
- waiting = [],
- tick = function() {
- var item;
-
- while ( waiting.length && occupied < max ) {
- item = waiting.shift();
- occupied += item[ 0 ];
- item[ 1 ]();
- }
- };
-
- return function( emiter, size, cb ) {
- waiting.push([ size, cb ]);
- emiter.once( 'destroy', function() {
- occupied -= size;
- setTimeout( tick, 1 );
- });
- setTimeout( tick, 1 );
- };
- })( 5 * 1024 * 1024 );
-
- $.extend( Uploader.options, {
-
- /**
- * @property {Object} [thumb]
- * @namespace options
- * @for Uploader
- * @description 配置生成缩略图的选项。
- *
- * 默认为:
- *
- * ```javascript
- * {
- * width: 110,
- * height: 110,
- *
- * // 图片质量,只有type为`image/jpeg`的时候才有效。
- * quality: 70,
- *
- * // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
- * allowMagnify: true,
- *
- * // 是否允许裁剪。
- * crop: true,
- *
- * // 是否保留头部meta信息。
- * preserveHeaders: false,
- *
- * // 为空的话则保留原有图片格式。
- * // 否则强制转换成指定的类型。
- * type: 'image/jpeg'
- * }
- * ```
- */
- thumb: {
- width: 110,
- height: 110,
- quality: 70,
- allowMagnify: true,
- crop: true,
- preserveHeaders: false,
-
- // 为空的话则保留原有图片格式。
- // 否则强制转换成指定的类型。
- // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
- // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
- type: 'image/jpeg'
- },
-
- /**
- * @property {Object} [compress]
- * @namespace options
- * @for Uploader
- * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。
- *
- * 默认为:
- *
- * ```javascript
- * {
- * width: 1600,
- * height: 1600,
- *
- * // 图片质量,只有type为`image/jpeg`的时候才有效。
- * quality: 90,
- *
- * // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
- * allowMagnify: false,
- *
- * // 是否允许裁剪。
- * crop: false,
- *
- * // 是否保留头部meta信息。
- * preserveHeaders: true
- * }
- * ```
- */
- compress: {
- width: 1600,
- height: 1600,
- quality: 90,
- allowMagnify: false,
- crop: false,
- preserveHeaders: true
- }
- });
-
- return Uploader.register({
- 'make-thumb': 'makeThumb',
- 'before-send-file': 'compressImage'
- }, {
-
-
- /**
- * 生成缩略图,此过程为异步,所以需要传入`callback`。
- * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
- *
- * `callback`中可以接收到两个参数。
- * * 第一个为error,如果生成缩略图有错误,此error将为真。
- * * 第二个为ret, 缩略图的Data URL值。
- *
- * **注意**
- * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。
- *
- *
- * @method makeThumb
- * @grammar makeThumb( file, callback ) => undefined
- * @grammar makeThumb( file, callback, width, height ) => undefined
- * @for Uploader
- * @example
- *
- * uploader.on( 'fileQueued', function( file ) {
- * var $li = ...;
- *
- * uploader.makeThumb( file, function( error, ret ) {
- * if ( error ) {
- * $li.text('预览错误');
- * } else {
- * $li.append(' ');
- * }
- * });
- *
- * });
- */
- makeThumb: function( file, cb, width, height ) {
- var opts, image;
-
- file = this.request( 'get-file', file );
-
- // 只预览图片格式。
- if ( !file.type.match( /^image/ ) ) {
- cb( true );
- return;
- }
-
- opts = $.extend({}, this.options.thumb );
-
- // 如果传入的是object.
- if ( $.isPlainObject( width ) ) {
- opts = $.extend( opts, width );
- width = null;
- }
-
- width = width || opts.width;
- height = height || opts.height;
-
- image = new Image( opts );
-
- image.once( 'load', function() {
- file._info = file._info || image.info();
- file._meta = file._meta || image.meta();
- image.resize( width, height );
- });
-
- image.once( 'complete', function() {
- cb( false, image.getAsDataUrl( opts.type ) );
- image.destroy();
- });
-
- image.once( 'error', function() {
- cb( true );
- image.destroy();
- });
-
- throttle( image, file.source.size, function() {
- file._info && image.info( file._info );
- file._meta && image.meta( file._meta );
- image.loadFromBlob( file.source );
- });
- },
-
- compressImage: function( file ) {
- var opts = this.options.compress || this.options.resize,
- compressSize = opts && opts.compressSize || 300 * 1024,
- image, deferred;
-
- file = this.request( 'get-file', file );
-
- // 只预览图片格式。
- if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||
- file.size < compressSize ||
- file._compressed ) {
- return;
- }
-
- opts = $.extend({}, opts );
- deferred = Base.Deferred();
-
- image = new Image( opts );
-
- deferred.always(function() {
- image.destroy();
- image = null;
- });
- image.once( 'error', deferred.reject );
- image.once( 'load', function() {
- file._info = file._info || image.info();
- file._meta = file._meta || image.meta();
- image.resize( opts.width, opts.height );
- });
-
- image.once( 'complete', function() {
- var blob, size;
-
- // 移动端 UC / qq 浏览器的无图模式下
- // ctx.getImageData 处理大图的时候会报 Exception
- // INDEX_SIZE_ERR: DOM Exception 1
- try {
- blob = image.getAsBlob( opts.type );
-
- size = file.size;
-
- // 如果压缩后,比原来还大则不用压缩后的。
- if ( blob.size < size ) {
- // file.source.destroy && file.source.destroy();
- file.source = blob;
- file.size = blob.size;
-
- file.trigger( 'resize', blob.size, size );
- }
-
- // 标记,避免重复压缩。
- file._compressed = true;
- deferred.resolve();
- } catch ( e ) {
- // 出错了直接继续,让其上传原始图片
- deferred.resolve();
- }
- });
-
- file._info && image.info( file._info );
- file._meta && image.meta( file._meta );
-
- image.loadFromBlob( file.source );
- return deferred.promise();
- }
- });
- });
- /**
- * @fileOverview 文件属性封装
- */
- define('file',[
- 'base',
- 'mediator'
- ], function( Base, Mediator ) {
-
- var $ = Base.$,
- idPrefix = 'WU_FILE_',
- idSuffix = 0,
- rExt = /\.([^.]+)$/,
- statusMap = {};
-
- function gid() {
- return idPrefix + idSuffix++;
- }
-
- /**
- * 文件类
- * @class File
- * @constructor 构造函数
- * @grammar new File( source ) => File
- * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
- */
- function WUFile( source ) {
-
- /**
- * 文件名,包括扩展名(后缀)
- * @property name
- * @type {string}
- */
- this.name = source.name || 'Untitled';
-
- /**
- * 文件体积(字节)
- * @property size
- * @type {uint}
- * @default 0
- */
- this.size = source.size || 0;
-
- /**
- * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
- * @property type
- * @type {string}
- * @default 'application'
- */
- this.type = source.type || 'application';
-
- /**
- * 文件最后修改日期
- * @property lastModifiedDate
- * @type {int}
- * @default 当前时间戳
- */
- this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
-
- /**
- * 文件ID,每个对象具有唯一ID,与文件名无关
- * @property id
- * @type {string}
- */
- this.id = gid();
-
- /**
- * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
- * @property ext
- * @type {string}
- */
- this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
-
-
- /**
- * 状态文字说明。在不同的status语境下有不同的用途。
- * @property statusText
- * @type {string}
- */
- this.statusText = '';
-
- // 存储文件状态,防止通过属性直接修改
- statusMap[ this.id ] = WUFile.Status.INITED;
-
- this.source = source;
- this.loaded = 0;
-
- this.on( 'error', function( msg ) {
- this.setStatus( WUFile.Status.ERROR, msg );
- });
- }
-
- $.extend( WUFile.prototype, {
-
- /**
- * 设置状态,状态变化时会触发`change`事件。
- * @method setStatus
- * @grammar setStatus( status[, statusText] );
- * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
- * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
- */
- setStatus: function( status, text ) {
-
- var prevStatus = statusMap[ this.id ];
-
- typeof text !== 'undefined' && (this.statusText = text);
-
- if ( status !== prevStatus ) {
- statusMap[ this.id ] = status;
- /**
- * 文件状态变化
- * @event statuschange
- */
- this.trigger( 'statuschange', status, prevStatus );
- }
-
- },
-
- /**
- * 获取文件状态
- * @return {File.Status}
- * @example
- 文件状态具体包括以下几种类型:
- {
- // 初始化
- INITED: 0,
- // 已入队列
- QUEUED: 1,
- // 正在上传
- PROGRESS: 2,
- // 上传出错
- ERROR: 3,
- // 上传成功
- COMPLETE: 4,
- // 上传取消
- CANCELLED: 5
- }
- */
- getStatus: function() {
- return statusMap[ this.id ];
- },
-
- /**
- * 获取文件原始信息。
- * @return {*}
- */
- getSource: function() {
- return this.source;
- },
-
- destory: function() {
- delete statusMap[ this.id ];
- }
- });
-
- Mediator.installTo( WUFile.prototype );
-
- /**
- * 文件状态值,具体包括以下几种类型:
- * * `inited` 初始状态
- * * `queued` 已经进入队列, 等待上传
- * * `progress` 上传中
- * * `complete` 上传完成。
- * * `error` 上传出错,可重试
- * * `interrupt` 上传中断,可续传。
- * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
- * * `cancelled` 文件被移除。
- * @property {Object} Status
- * @namespace File
- * @class File
- * @static
- */
- WUFile.Status = {
- INITED: 'inited', // 初始状态
- QUEUED: 'queued', // 已经进入队列, 等待上传
- PROGRESS: 'progress', // 上传中
- ERROR: 'error', // 上传出错,可重试
- COMPLETE: 'complete', // 上传完成。
- CANCELLED: 'cancelled', // 上传取消。
- INTERRUPT: 'interrupt', // 上传中断,可续传。
- INVALID: 'invalid' // 文件不合格,不能重试上传。
- };
-
- return WUFile;
- });
-
- /**
- * @fileOverview 文件队列
- */
- define('queue',[
- 'base',
- 'mediator',
- 'file'
- ], function( Base, Mediator, WUFile ) {
-
- var $ = Base.$,
- STATUS = WUFile.Status;
-
- /**
- * 文件队列, 用来存储各个状态中的文件。
- * @class Queue
- * @extends Mediator
- */
- function Queue() {
-
- /**
- * 统计文件数。
- * * `numOfQueue` 队列中的文件数。
- * * `numOfSuccess` 上传成功的文件数
- * * `numOfCancel` 被移除的文件数
- * * `numOfProgress` 正在上传中的文件数
- * * `numOfUploadFailed` 上传错误的文件数。
- * * `numOfInvalid` 无效的文件数。
- * @property {Object} stats
- */
- this.stats = {
- numOfQueue: 0,
- numOfSuccess: 0,
- numOfCancel: 0,
- numOfProgress: 0,
- numOfUploadFailed: 0,
- numOfInvalid: 0
- };
-
- // 上传队列,仅包括等待上传的文件
- this._queue = [];
-
- // 存储所有文件
- this._map = {};
- }
-
- $.extend( Queue.prototype, {
-
- /**
- * 将新文件加入对队列尾部
- *
- * @method append
- * @param {File} file 文件对象
- */
- append: function( file ) {
- this._queue.push( file );
- this._fileAdded( file );
- return this;
- },
-
- /**
- * 将新文件加入对队列头部
- *
- * @method prepend
- * @param {File} file 文件对象
- */
- prepend: function( file ) {
- this._queue.unshift( file );
- this._fileAdded( file );
- return this;
- },
-
- /**
- * 获取文件对象
- *
- * @method getFile
- * @param {String} fileId 文件ID
- * @return {File}
- */
- getFile: function( fileId ) {
- if ( typeof fileId !== 'string' ) {
- return fileId;
- }
- return this._map[ fileId ];
- },
-
- /**
- * 从队列中取出一个指定状态的文件。
- * @grammar fetch( status ) => File
- * @method fetch
- * @param {String} status [文件状态值](#WebUploader:File:File.Status)
- * @return {File} [File](#WebUploader:File)
- */
- fetch: function( status ) {
- var len = this._queue.length,
- i, file;
-
- status = status || STATUS.QUEUED;
-
- for ( i = 0; i < len; i++ ) {
- file = this._queue[ i ];
-
- if ( status === file.getStatus() ) {
- return file;
- }
- }
-
- return null;
- },
-
- /**
- * 对队列进行排序,能够控制文件上传顺序。
- * @grammar sort( fn ) => undefined
- * @method sort
- * @param {Function} fn 排序方法
- */
- sort: function( fn ) {
- if ( typeof fn === 'function' ) {
- this._queue.sort( fn );
- }
- },
-
- /**
- * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
- * @grammar getFiles( [status1[, status2 ...]] ) => Array
- * @method getFiles
- * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
- */
- getFiles: function() {
- var sts = [].slice.call( arguments, 0 ),
- ret = [],
- i = 0,
- len = this._queue.length,
- file;
-
- for ( ; i < len; i++ ) {
- file = this._queue[ i ];
-
- if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
- continue;
- }
-
- ret.push( file );
- }
-
- return ret;
- },
-
- _fileAdded: function( file ) {
- var me = this,
- existing = this._map[ file.id ];
-
- if ( !existing ) {
- this._map[ file.id ] = file;
-
- file.on( 'statuschange', function( cur, pre ) {
- me._onFileStatusChange( cur, pre );
- });
- }
-
- file.setStatus( STATUS.QUEUED );
- },
-
- _onFileStatusChange: function( curStatus, preStatus ) {
- var stats = this.stats;
-
- switch ( preStatus ) {
- case STATUS.PROGRESS:
- stats.numOfProgress--;
- break;
-
- case STATUS.QUEUED:
- stats.numOfQueue --;
- break;
-
- case STATUS.ERROR:
- stats.numOfUploadFailed--;
- break;
-
- case STATUS.INVALID:
- stats.numOfInvalid--;
- break;
- }
-
- switch ( curStatus ) {
- case STATUS.QUEUED:
- stats.numOfQueue++;
- break;
-
- case STATUS.PROGRESS:
- stats.numOfProgress++;
- break;
-
- case STATUS.ERROR:
- stats.numOfUploadFailed++;
- break;
-
- case STATUS.COMPLETE:
- stats.numOfSuccess++;
- break;
-
- case STATUS.CANCELLED:
- stats.numOfCancel++;
- break;
-
- case STATUS.INVALID:
- stats.numOfInvalid++;
- break;
- }
- }
-
- });
-
- Mediator.installTo( Queue.prototype );
-
- return Queue;
- });
- /**
- * @fileOverview 队列
- */
- define('widgets/queue',[
- 'base',
- 'uploader',
- 'queue',
- 'file',
- 'lib/file',
- 'runtime/client',
- 'widgets/widget'
- ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
-
- var $ = Base.$,
- rExt = /\.\w+$/,
- Status = WUFile.Status;
-
- return Uploader.register({
- 'sort-files': 'sortFiles',
- 'add-file': 'addFiles',
- 'get-file': 'getFile',
- 'fetch-file': 'fetchFile',
- 'get-stats': 'getStats',
- 'get-files': 'getFiles',
- 'remove-file': 'removeFile',
- 'retry': 'retry',
- 'reset': 'reset',
- 'accept-file': 'acceptFile'
- }, {
-
- init: function( opts ) {
- var me = this,
- deferred, len, i, item, arr, accept, runtime;
-
- if ( $.isPlainObject( opts.accept ) ) {
- opts.accept = [ opts.accept ];
- }
-
- // accept中的中生成匹配正则。
- if ( opts.accept ) {
- arr = [];
-
- for ( i = 0, len = opts.accept.length; i < len; i++ ) {
- item = opts.accept[ i ].extensions;
- item && arr.push( item );
- }
-
- if ( arr.length ) {
- accept = '\\.' + arr.join(',')
- .replace( /,/g, '$|\\.' )
- .replace( /\*/g, '.*' ) + '$';
- }
-
- me.accept = new RegExp( accept, 'i' );
- }
-
- me.queue = new Queue();
- me.stats = me.queue.stats;
-
- // 如果当前不是html5运行时,那就算了。
- // 不执行后续操作
- if ( this.request('predict-runtime-type') !== 'html5' ) {
- return;
- }
-
- // 创建一个 html5 运行时的 placeholder
- // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
- deferred = Base.Deferred();
- runtime = new RuntimeClient('Placeholder');
- runtime.connectRuntime({
- runtimeOrder: 'html5'
- }, function() {
- me._ruid = runtime.getRuid();
- deferred.resolve();
- });
- return deferred.promise();
- },
-
-
- // 为了支持外部直接添加一个原生File对象。
- _wrapFile: function( file ) {
- if ( !(file instanceof WUFile) ) {
-
- if ( !(file instanceof File) ) {
- if ( !this._ruid ) {
- throw new Error('Can\'t add external files.');
- }
- file = new File( this._ruid, file );
- }
-
- file = new WUFile( file );
- }
-
- return file;
- },
-
- // 判断文件是否可以被加入队列
- acceptFile: function( file ) {
- var invalid = !file || file.size < 6 || this.accept &&
-
- // 如果名字中有后缀,才做后缀白名单处理。
- rExt.exec( file.name ) && !this.accept.test( file.name );
-
- return !invalid;
- },
-
-
- /**
- * @event beforeFileQueued
- * @param {File} file File对象
- * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
- * @for Uploader
- */
-
- /**
- * @event fileQueued
- * @param {File} file File对象
- * @description 当文件被加入队列以后触发。
- * @for Uploader
- */
-
- _addFile: function( file ) {
- var me = this;
-
- file = me._wrapFile( file );
-
- // 不过类型判断允许不允许,先派送 `beforeFileQueued`
- if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
- return;
- }
-
- // 类型不匹配,则派送错误事件,并返回。
- if ( !me.acceptFile( file ) ) {
- me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
- return;
- }
-
- me.queue.append( file );
- me.owner.trigger( 'fileQueued', file );
- return file;
- },
-
- getFile: function( fileId ) {
- return this.queue.getFile( fileId );
- },
-
- /**
- * @event filesQueued
- * @param {File} files 数组,内容为原始File(lib/File)对象。
- * @description 当一批文件添加进队列以后触发。
- * @for Uploader
- */
-
- /**
- * @method addFiles
- * @grammar addFiles( file ) => undefined
- * @grammar addFiles( [file1, file2 ...] ) => undefined
- * @param {Array of File or File} [files] Files 对象 数组
- * @description 添加文件到队列
- * @for Uploader
- */
- addFiles: function( files ) {
- var me = this;
-
- if ( !files.length ) {
- files = [ files ];
- }
-
- files = $.map( files, function( file ) {
- return me._addFile( file );
- });
-
- me.owner.trigger( 'filesQueued', files );
-
- if ( me.options.auto ) {
- me.request('start-upload');
- }
- },
-
- getStats: function() {
- return this.stats;
- },
-
- /**
- * @event fileDequeued
- * @param {File} file File对象
- * @description 当文件被移除队列后触发。
- * @for Uploader
- */
-
- /**
- * @method removeFile
- * @grammar removeFile( file ) => undefined
- * @grammar removeFile( id ) => undefined
- * @param {File|id} file File对象或这File对象的id
- * @description 移除某一文件。
- * @for Uploader
- * @example
- *
- * $li.on('click', '.remove-this', function() {
- * uploader.removeFile( file );
- * })
- */
- removeFile: function( file ) {
- var me = this;
-
- file = file.id ? file : me.queue.getFile( file );
-
- file.setStatus( Status.CANCELLED );
- me.owner.trigger( 'fileDequeued', file );
- },
-
- /**
- * @method getFiles
- * @grammar getFiles() => Array
- * @grammar getFiles( status1, status2, status... ) => Array
- * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
- * @for Uploader
- * @example
- * console.log( uploader.getFiles() ); // => all files
- * console.log( uploader.getFiles('error') ) // => all error files.
- */
- getFiles: function() {
- return this.queue.getFiles.apply( this.queue, arguments );
- },
-
- fetchFile: function() {
- return this.queue.fetch.apply( this.queue, arguments );
- },
-
- /**
- * @method retry
- * @grammar retry() => undefined
- * @grammar retry( file ) => undefined
- * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
- * @for Uploader
- * @example
- * function retry() {
- * uploader.retry();
- * }
- */
- retry: function( file, noForceStart ) {
- var me = this,
- files, i, len;
-
- if ( file ) {
- file = file.id ? file : me.queue.getFile( file );
- file.setStatus( Status.QUEUED );
- noForceStart || me.request('start-upload');
- return;
- }
-
- files = me.queue.getFiles( Status.ERROR );
- i = 0;
- len = files.length;
-
- for ( ; i < len; i++ ) {
- file = files[ i ];
- file.setStatus( Status.QUEUED );
- }
-
- me.request('start-upload');
- },
-
- /**
- * @method sort
- * @grammar sort( fn ) => undefined
- * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
- * @for Uploader
- */
- sortFiles: function() {
- return this.queue.sort.apply( this.queue, arguments );
- },
-
- /**
- * @method reset
- * @grammar reset() => undefined
- * @description 重置uploader。目前只重置了队列。
- * @for Uploader
- * @example
- * uploader.reset();
- */
- reset: function() {
- this.queue = new Queue();
- this.stats = this.queue.stats;
- }
- });
-
- });
- /**
- * @fileOverview 添加获取Runtime相关信息的方法。
- */
- define('widgets/runtime',[
- 'uploader',
- 'runtime/runtime',
- 'widgets/widget'
- ], function( Uploader, Runtime ) {
-
- Uploader.support = function() {
- return Runtime.hasRuntime.apply( Runtime, arguments );
- };
-
- return Uploader.register({
- 'predict-runtime-type': 'predictRuntmeType'
- }, {
-
- init: function() {
- if ( !this.predictRuntmeType() ) {
- throw Error('Runtime Error');
- }
- },
-
- /**
- * 预测Uploader将采用哪个`Runtime`
- * @grammar predictRuntmeType() => String
- * @method predictRuntmeType
- * @for Uploader
- */
- predictRuntmeType: function() {
- var orders = this.options.runtimeOrder || Runtime.orders,
- type = this.type,
- i, len;
-
- if ( !type ) {
- orders = orders.split( /\s*,\s*/g );
-
- for ( i = 0, len = orders.length; i < len; i++ ) {
- if ( Runtime.hasRuntime( orders[ i ] ) ) {
- this.type = type = orders[ i ];
- break;
- }
- }
- }
-
- return type;
- }
- });
- });
- /**
- * @fileOverview Transport
- */
- define('lib/transport',[
- 'base',
- 'runtime/client',
- 'mediator'
- ], function( Base, RuntimeClient, Mediator ) {
-
- var $ = Base.$;
-
- function Transport( opts ) {
- var me = this;
-
- opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
- RuntimeClient.call( this, 'Transport' );
-
- this._blob = null;
- this._formData = opts.formData || {};
- this._headers = opts.headers || {};
-
- this.on( 'progress', this._timeout );
- this.on( 'load error', function() {
- me.trigger( 'progress', 1 );
- clearTimeout( me._timer );
- });
- }
-
- Transport.options = {
- server: '',
- method: 'POST',
-
- // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
- withCredentials: false,
- fileVal: 'file',
- timeout: 2 * 60 * 1000, // 2分钟
- formData: {},
- headers: {},
- sendAsBinary: false
- };
-
- $.extend( Transport.prototype, {
-
- // 添加Blob, 只能添加一次,最后一次有效。
- appendBlob: function( key, blob, filename ) {
- var me = this,
- opts = me.options;
-
- if ( me.getRuid() ) {
- me.disconnectRuntime();
- }
-
- // 连接到blob归属的同一个runtime.
- me.connectRuntime( blob.ruid, function() {
- me.exec('init');
- });
-
- me._blob = blob;
- opts.fileVal = key || opts.fileVal;
- opts.filename = filename || opts.filename;
- },
-
- // 添加其他字段
- append: function( key, value ) {
- if ( typeof key === 'object' ) {
- $.extend( this._formData, key );
- } else {
- this._formData[ key ] = value;
- }
- },
-
- setRequestHeader: function( key, value ) {
- if ( typeof key === 'object' ) {
- $.extend( this._headers, key );
- } else {
- this._headers[ key ] = value;
- }
- },
-
- send: function( method ) {
- this.exec( 'send', method );
- this._timeout();
- },
-
- abort: function() {
- clearTimeout( this._timer );
- return this.exec('abort');
- },
-
- destroy: function() {
- this.trigger('destroy');
- this.off();
- this.exec('destroy');
- this.disconnectRuntime();
- },
-
- getResponse: function() {
- return this.exec('getResponse');
- },
-
- getResponseAsJson: function() {
- return this.exec('getResponseAsJson');
- },
-
- getStatus: function() {
- return this.exec('getStatus');
- },
-
- _timeout: function() {
- var me = this,
- duration = me.options.timeout;
-
- if ( !duration ) {
- return;
- }
-
- clearTimeout( me._timer );
- me._timer = setTimeout(function() {
- me.abort();
- me.trigger( 'error', 'timeout' );
- }, duration );
- }
-
- });
-
- // 让Transport具备事件功能。
- Mediator.installTo( Transport.prototype );
-
- return Transport;
- });
- /**
- * @fileOverview 负责文件上传相关。
- */
- define('widgets/upload',[
- 'base',
- 'uploader',
- 'file',
- 'lib/transport',
- 'widgets/widget'
- ], function( Base, Uploader, WUFile, Transport ) {
-
- var $ = Base.$,
- isPromise = Base.isPromise,
- Status = WUFile.Status;
-
- // 添加默认配置项
- $.extend( Uploader.options, {
-
-
- /**
- * @property {Boolean} [prepareNextFile=false]
- * @namespace options
- * @for Uploader
- * @description 是否允许在文件传输时提前把下一个文件准备好。
- * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
- * 如果能提前在当前文件传输期处理,可以节省总体耗时。
- */
- prepareNextFile: false,
-
- /**
- * @property {Boolean} [chunked=false]
- * @namespace options
- * @for Uploader
- * @description 是否要分片处理大文件上传。
- */
- chunked: false,
-
- /**
- * @property {Boolean} [chunkSize=5242880]
- * @namespace options
- * @for Uploader
- * @description 如果要分片,分多大一片? 默认大小为5M.
- */
- chunkSize: 5 * 1024 * 1024,
-
- /**
- * @property {Boolean} [chunkRetry=2]
- * @namespace options
- * @for Uploader
- * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
- */
- chunkRetry: 2,
-
- /**
- * @property {Boolean} [threads=3]
- * @namespace options
- * @for Uploader
- * @description 上传并发数。允许同时最大上传进程数。
- */
- threads: 3,
-
-
- /**
- * @property {Object} [formData]
- * @namespace options
- * @for Uploader
- * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
- */
- formData: null
-
- /**
- * @property {Object} [fileVal='file']
- * @namespace options
- * @for Uploader
- * @description 设置文件上传域的name。
- */
-
- /**
- * @property {Object} [method='POST']
- * @namespace options
- * @for Uploader
- * @description 文件上传方式,`POST`或者`GET`。
- */
-
- /**
- * @property {Object} [sendAsBinary=false]
- * @namespace options
- * @for Uploader
- * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
- * 其他参数在$_GET数组中。
- */
- });
-
- // 负责将文件切片。
- function CuteFile( file, chunkSize ) {
- var pending = [],
- blob = file.source,
- total = blob.size,
- chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
- start = 0,
- index = 0,
- len;
-
- while ( index < chunks ) {
- len = Math.min( chunkSize, total - start );
-
- pending.push({
- file: file,
- start: start,
- end: chunkSize ? (start + len) : total,
- total: total,
- chunks: chunks,
- chunk: index++
- });
- start += len;
- }
-
- file.blocks = pending.concat();
- file.remaning = pending.length;
-
- return {
- file: file,
-
- has: function() {
- return !!pending.length;
- },
-
- fetch: function() {
- return pending.shift();
- }
- };
- }
-
- Uploader.register({
- 'start-upload': 'start',
- 'stop-upload': 'stop',
- 'skip-file': 'skipFile',
- 'is-in-progress': 'isInProgress'
- }, {
-
- init: function() {
- var owner = this.owner;
-
- this.runing = false;
-
- // 记录当前正在传的数据,跟threads相关
- this.pool = [];
-
- // 缓存即将上传的文件。
- this.pending = [];
-
- // 跟踪还有多少分片没有完成上传。
- this.remaning = 0;
- this.__tick = Base.bindFn( this._tick, this );
-
- owner.on( 'uploadComplete', function( file ) {
- // 把其他块取消了。
- file.blocks && $.each( file.blocks, function( _, v ) {
- v.transport && (v.transport.abort(), v.transport.destroy());
- delete v.transport;
- });
-
- delete file.blocks;
- delete file.remaning;
- });
- },
-
- /**
- * @event startUpload
- * @description 当开始上传流程时触发。
- * @for Uploader
- */
-
- /**
- * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
- * @grammar upload() => undefined
- * @method upload
- * @for Uploader
- */
- start: function() {
- var me = this;
-
- // 移出invalid的文件
- $.each( me.request( 'get-files', Status.INVALID ), function() {
- me.request( 'remove-file', this );
- });
-
- if ( me.runing ) {
- return;
- }
-
- me.runing = true;
-
- // 如果有暂停的,则续传
- $.each( me.pool, function( _, v ) {
- var file = v.file;
-
- if ( file.getStatus() === Status.INTERRUPT ) {
- file.setStatus( Status.PROGRESS );
- me._trigged = false;
- v.transport && v.transport.send();
- }
- });
-
- me._trigged = false;
- me.owner.trigger('startUpload');
- Base.nextTick( me.__tick );
- },
-
- /**
- * @event stopUpload
- * @description 当开始上传流程暂停时触发。
- * @for Uploader
- */
-
- /**
- * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
- * @grammar stop() => undefined
- * @grammar stop( true ) => undefined
- * @method stop
- * @for Uploader
- */
- stop: function( interrupt ) {
- var me = this;
-
- if ( me.runing === false ) {
- return;
- }
-
- me.runing = false;
-
- interrupt && $.each( me.pool, function( _, v ) {
- v.transport && v.transport.abort();
- v.file.setStatus( Status.INTERRUPT );
- });
-
- me.owner.trigger('stopUpload');
- },
-
- /**
- * 判断`Uplaode`r是否正在上传中。
- * @grammar isInProgress() => Boolean
- * @method isInProgress
- * @for Uploader
- */
- isInProgress: function() {
- return !!this.runing;
- },
-
- getStats: function() {
- return this.request('get-stats');
- },
-
- /**
- * 掉过一个文件上传,直接标记指定文件为已上传状态。
- * @grammar skipFile( file ) => undefined
- * @method skipFile
- * @for Uploader
- */
- skipFile: function( file, status ) {
- file = this.request( 'get-file', file );
-
- file.setStatus( status || Status.COMPLETE );
- file.skipped = true;
-
- // 如果正在上传。
- file.blocks && $.each( file.blocks, function( _, v ) {
- var _tr = v.transport;
-
- if ( _tr ) {
- _tr.abort();
- _tr.destroy();
- delete v.transport;
- }
- });
-
- this.owner.trigger( 'uploadSkip', file );
- },
-
- /**
- * @event uploadFinished
- * @description 当所有文件上传结束时触发。
- * @for Uploader
- */
- _tick: function() {
- var me = this,
- opts = me.options,
- fn, val;
-
- // 上一个promise还没有结束,则等待完成后再执行。
- if ( me._promise ) {
- return me._promise.always( me.__tick );
- }
-
- // 还有位置,且还有文件要处理的话。
- if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
- me._trigged = false;
-
- fn = function( val ) {
- me._promise = null;
-
- // 有可能是reject过来的,所以要检测val的类型。
- val && val.file && me._startSend( val );
- Base.nextTick( me.__tick );
- };
-
- me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
-
- // 没有要上传的了,且没有正在传输的了。
- } else if ( !me.remaning && !me.getStats().numOfQueue ) {
- me.runing = false;
-
- me._trigged || Base.nextTick(function() {
- me.owner.trigger('uploadFinished');
- });
- me._trigged = true;
- }
- },
-
- _nextBlock: function() {
- var me = this,
- act = me._act,
- opts = me.options,
- next, done;
-
- // 如果当前文件还有没有需要传输的,则直接返回剩下的。
- if ( act && act.has() &&
- act.file.getStatus() === Status.PROGRESS ) {
-
- // 是否提前准备下一个文件
- if ( opts.prepareNextFile && !me.pending.length ) {
- me._prepareNextFile();
- }
-
- return act.fetch();
-
- // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
- } else if ( me.runing ) {
-
- // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
- if ( !me.pending.length && me.getStats().numOfQueue ) {
- me._prepareNextFile();
- }
-
- next = me.pending.shift();
- done = function( file ) {
- if ( !file ) {
- return null;
- }
-
- act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
- me._act = act;
- return act.fetch();
- };
-
- // 文件可能还在prepare中,也有可能已经完全准备好了。
- return isPromise( next ) ?
- next[ next.pipe ? 'pipe' : 'then']( done ) :
- done( next );
- }
- },
-
-
- /**
- * @event uploadStart
- * @param {File} file File对象
- * @description 某个文件开始上传前触发,一个文件只会触发一次。
- * @for Uploader
- */
- _prepareNextFile: function() {
- var me = this,
- file = me.request('fetch-file'),
- pending = me.pending,
- promise;
-
- if ( file ) {
- promise = me.request( 'before-send-file', file, function() {
-
- // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
- if ( file.getStatus() === Status.QUEUED ) {
- me.owner.trigger( 'uploadStart', file );
- file.setStatus( Status.PROGRESS );
- return file;
- }
-
- return me._finishFile( file );
- });
-
- // 如果还在pending中,则替换成文件本身。
- promise.done(function() {
- var idx = $.inArray( promise, pending );
-
- ~idx && pending.splice( idx, 1, file );
- });
-
- // befeore-send-file的钩子就有错误发生。
- promise.fail(function( reason ) {
- file.setStatus( Status.ERROR, reason );
- me.owner.trigger( 'uploadError', file, reason );
- me.owner.trigger( 'uploadComplete', file );
- });
-
- pending.push( promise );
- }
- },
-
- // 让出位置了,可以让其他分片开始上传
- _popBlock: function( block ) {
- var idx = $.inArray( block, this.pool );
-
- this.pool.splice( idx, 1 );
- block.file.remaning--;
- this.remaning--;
- },
-
- // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
- _startSend: function( block ) {
- var me = this,
- file = block.file,
- promise;
-
- me.pool.push( block );
- me.remaning++;
-
- // 如果没有分片,则直接使用原始的。
- // 不会丢失content-type信息。
- block.blob = block.chunks === 1 ? file.source :
- file.source.slice( block.start, block.end );
-
- // hook, 每个分片发送之前可能要做些异步的事情。
- promise = me.request( 'before-send', block, function() {
-
- // 有可能文件已经上传出错了,所以不需要再传输了。
- if ( file.getStatus() === Status.PROGRESS ) {
- me._doSend( block );
- } else {
- me._popBlock( block );
- Base.nextTick( me.__tick );
- }
- });
-
- // 如果为fail了,则跳过此分片。
- promise.fail(function() {
- if ( file.remaning === 1 ) {
- me._finishFile( file ).always(function() {
- block.percentage = 1;
- me._popBlock( block );
- me.owner.trigger( 'uploadComplete', file );
- Base.nextTick( me.__tick );
- });
- } else {
- block.percentage = 1;
- me._popBlock( block );
- Base.nextTick( me.__tick );
- }
- });
- },
-
-
- /**
- * @event uploadBeforeSend
- * @param {Object} object
- * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
- * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
- * @for Uploader
- */
-
- /**
- * @event uploadAccept
- * @param {Object} object
- * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
- * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
- * @for Uploader
- */
-
- /**
- * @event uploadProgress
- * @param {File} file File对象
- * @param {Number} percentage 上传进度
- * @description 上传过程中触发,携带上传进度。
- * @for Uploader
- */
-
-
- /**
- * @event uploadError
- * @param {File} file File对象
- * @param {String} reason 出错的code
- * @description 当文件上传出错时触发。
- * @for Uploader
- */
-
- /**
- * @event uploadSuccess
- * @param {File} file File对象
- * @param {Object} response 服务端返回的数据
- * @description 当文件上传成功时触发。
- * @for Uploader
- */
-
- /**
- * @event uploadComplete
- * @param {File} [file] File对象
- * @description 不管成功或者失败,文件上传完成时触发。
- * @for Uploader
- */
-
- // 做上传操作。
- _doSend: function( block ) {
- var me = this,
- owner = me.owner,
- opts = me.options,
- file = block.file,
- tr = new Transport( opts ),
- data = $.extend({}, opts.formData ),
- headers = $.extend({}, opts.headers ),
- requestAccept, ret;
-
- block.transport = tr;
-
- tr.on( 'destroy', function() {
- delete block.transport;
- me._popBlock( block );
- Base.nextTick( me.__tick );
- });
-
- // 广播上传进度。以文件为单位。
- tr.on( 'progress', function( percentage ) {
- var totalPercent = 0,
- uploaded = 0;
-
- // 可能没有abort掉,progress还是执行进来了。
- // if ( !file.blocks ) {
- // return;
- // }
-
- totalPercent = block.percentage = percentage;
-
- if ( block.chunks > 1 ) { // 计算文件的整体速度。
- $.each( file.blocks, function( _, v ) {
- uploaded += (v.percentage || 0) * (v.end - v.start);
- });
-
- totalPercent = uploaded / file.size;
- }
-
- owner.trigger( 'uploadProgress', file, totalPercent || 0 );
- });
-
- // 用来询问,是否返回的结果是有错误的。
- requestAccept = function( reject ) {
- var fn;
-
- ret = tr.getResponseAsJson() || {};
- ret._raw = tr.getResponse();
- fn = function( value ) {
- reject = value;
- };
-
- // 服务端响应了,不代表成功了,询问是否响应正确。
- if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
- reject = reject || 'server';
- }
-
- return reject;
- };
-
- // 尝试重试,然后广播文件上传出错。
- tr.on( 'error', function( type, flag ) {
- block.retried = block.retried || 0;
-
- // 自动重试
- if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
- block.retried < opts.chunkRetry ) {
-
- block.retried++;
- tr.send();
-
- } else {
-
- // http status 500 ~ 600
- if ( !flag && type === 'server' ) {
- type = requestAccept( type );
- }
-
- file.setStatus( Status.ERROR, type );
- owner.trigger( 'uploadError', file, type );
- owner.trigger( 'uploadComplete', file );
- }
- });
-
- // 上传成功
- tr.on( 'load', function() {
- var reason;
-
- // 如果非预期,转向上传出错。
- if ( (reason = requestAccept()) ) {
- tr.trigger( 'error', reason, true );
- return;
- }
-
- // 全部上传完成。
- if ( file.remaning === 1 ) {
- me._finishFile( file, ret );
- } else {
- tr.destroy();
- }
- });
-
- // 配置默认的上传字段。
- data = $.extend( data, {
- id: file.id,
- name: file.name,
- type: file.type,
- lastModifiedDate: file.lastModifiedDate,
- size: file.size
- });
-
- block.chunks > 1 && $.extend( data, {
- chunks: block.chunks,
- chunk: block.chunk
- });
-
- // 在发送之间可以添加字段什么的。。。
- // 如果默认的字段不够使用,可以通过监听此事件来扩展
- owner.trigger( 'uploadBeforeSend', block, data, headers );
-
- // 开始发送。
- tr.appendBlob( opts.fileVal, block.blob, file.name );
- tr.append( data );
- tr.setRequestHeader( headers );
- tr.send();
- },
-
- // 完成上传。
- _finishFile: function( file, ret, hds ) {
- var owner = this.owner;
-
- return owner
- .request( 'after-send-file', arguments, function() {
- file.setStatus( Status.COMPLETE );
- owner.trigger( 'uploadSuccess', file, ret, hds );
- })
- .fail(function( reason ) {
-
- // 如果外部已经标记为invalid什么的,不再改状态。
- if ( file.getStatus() === Status.PROGRESS ) {
- file.setStatus( Status.ERROR, reason );
- }
-
- owner.trigger( 'uploadError', file, reason );
- })
- .always(function() {
- owner.trigger( 'uploadComplete', file );
- });
- }
-
- });
- });
- /**
- * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
- */
-
- define('widgets/validator',[
- 'base',
- 'uploader',
- 'file',
- 'widgets/widget'
- ], function( Base, Uploader, WUFile ) {
-
- var $ = Base.$,
- validators = {},
- api;
-
- /**
- * @event error
- * @param {String} type 错误类型。
- * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
- *
- * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
- * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
- * @for Uploader
- */
-
- // 暴露给外面的api
- api = {
-
- // 添加验证器
- addValidator: function( type, cb ) {
- validators[ type ] = cb;
- },
-
- // 移除验证器
- removeValidator: function( type ) {
- delete validators[ type ];
- }
- };
-
- // 在Uploader初始化的时候启动Validators的初始化
- Uploader.register({
- init: function() {
- var me = this;
- $.each( validators, function() {
- this.call( me.owner );
- });
- }
- });
-
- /**
- * @property {int} [fileNumLimit=undefined]
- * @namespace options
- * @for Uploader
- * @description 验证文件总数量, 超出则不允许加入队列。
- */
- api.addValidator( 'fileNumLimit', function() {
- var uploader = this,
- opts = uploader.options,
- count = 0,
- max = opts.fileNumLimit >> 0,
- flag = true;
-
- if ( !max ) {
- return;
- }
-
- uploader.on( 'beforeFileQueued', function( file ) {
-
- if ( count >= max && flag ) {
- flag = false;
- this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
- setTimeout(function() {
- flag = true;
- }, 1 );
- }
-
- return count >= max ? false : true;
- });
-
- uploader.on( 'fileQueued', function() {
- count++;
- });
-
- uploader.on( 'fileDequeued', function() {
- count--;
- });
-
- uploader.on( 'uploadFinished', function() {
- count = 0;
- });
- });
-
-
- /**
- * @property {int} [fileSizeLimit=undefined]
- * @namespace options
- * @for Uploader
- * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
- */
- api.addValidator( 'fileSizeLimit', function() {
- var uploader = this,
- opts = uploader.options,
- count = 0,
- max = opts.fileSizeLimit >> 0,
- flag = true;
-
- if ( !max ) {
- return;
- }
-
- uploader.on( 'beforeFileQueued', function( file ) {
- var invalid = count + file.size > max;
-
- if ( invalid && flag ) {
- flag = false;
- this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
- setTimeout(function() {
- flag = true;
- }, 1 );
- }
-
- return invalid ? false : true;
- });
-
- uploader.on( 'fileQueued', function( file ) {
- count += file.size;
- });
-
- uploader.on( 'fileDequeued', function( file ) {
- count -= file.size;
- });
-
- uploader.on( 'uploadFinished', function() {
- count = 0;
- });
- });
-
- /**
- * @property {int} [fileSingleSizeLimit=undefined]
- * @namespace options
- * @for Uploader
- * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
- */
- api.addValidator( 'fileSingleSizeLimit', function() {
- var uploader = this,
- opts = uploader.options,
- max = opts.fileSingleSizeLimit;
-
- if ( !max ) {
- return;
- }
-
- uploader.on( 'beforeFileQueued', function( file ) {
-
- if ( file.size > max ) {
- file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
- this.trigger( 'error', 'F_EXCEED_SIZE', file );
- return false;
- }
-
- });
-
- });
-
- /**
- * @property {int} [duplicate=undefined]
- * @namespace options
- * @for Uploader
- * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
- */
- api.addValidator( 'duplicate', function() {
- var uploader = this,
- opts = uploader.options,
- mapping = {};
-
- if ( opts.duplicate ) {
- return;
- }
-
- function hashString( str ) {
- var hash = 0,
- i = 0,
- len = str.length,
- _char;
-
- for ( ; i < len; i++ ) {
- _char = str.charCodeAt( i );
- hash = _char + (hash << 6) + (hash << 16) - hash;
- }
-
- return hash;
- }
-
- uploader.on( 'beforeFileQueued', function( file ) {
- var hash = file.__hash || (file.__hash = hashString( file.name +
- file.size + file.lastModifiedDate ));
-
- // 已经重复了
- if ( mapping[ hash ] ) {
- this.trigger( 'error', 'F_DUPLICATE', file );
- return false;
- }
- });
-
- uploader.on( 'fileQueued', function( file ) {
- var hash = file.__hash;
-
- hash && (mapping[ hash ] = true);
- });
-
- uploader.on( 'fileDequeued', function( file ) {
- var hash = file.__hash;
-
- hash && (delete mapping[ hash ]);
- });
- });
-
- return api;
- });
-
- /**
- * @fileOverview Runtime管理器,负责Runtime的选择, 连接
- */
- define('runtime/compbase',[],function() {
-
- function CompBase( owner, runtime ) {
-
- this.owner = owner;
- this.options = owner.options;
-
- this.getRuntime = function() {
- return runtime;
- };
-
- this.getRuid = function() {
- return runtime.uid;
- };
-
- this.trigger = function() {
- return owner.trigger.apply( owner, arguments );
- };
- }
-
- return CompBase;
- });
- /**
- * @fileOverview Html5Runtime
- */
- define('runtime/html5/runtime',[
- 'base',
- 'runtime/runtime',
- 'runtime/compbase'
- ], function( Base, Runtime, CompBase ) {
-
- var type = 'html5',
- components = {};
-
- function Html5Runtime() {
- var pool = {},
- me = this,
- destory = this.destory;
-
- Runtime.apply( me, arguments );
- me.type = type;
-
-
- // 这个方法的调用者,实际上是RuntimeClient
- me.exec = function( comp, fn/*, args...*/) {
- var client = this,
- uid = client.uid,
- args = Base.slice( arguments, 2 ),
- instance;
-
- if ( components[ comp ] ) {
- instance = pool[ uid ] = pool[ uid ] ||
- new components[ comp ]( client, me );
-
- if ( instance[ fn ] ) {
- return instance[ fn ].apply( instance, args );
- }
- }
- };
-
- me.destory = function() {
- // @todo 删除池子中的所有实例
- return destory && destory.apply( this, arguments );
- };
- }
-
- Base.inherits( Runtime, {
- constructor: Html5Runtime,
-
- // 不需要连接其他程序,直接执行callback
- init: function() {
- var me = this;
- setTimeout(function() {
- me.trigger('ready');
- }, 1 );
- }
-
- });
-
- // 注册Components
- Html5Runtime.register = function( name, component ) {
- var klass = components[ name ] = Base.inherits( CompBase, component );
- return klass;
- };
-
- // 注册html5运行时。
- // 只有在支持的前提下注册。
- if ( window.Blob && window.FileReader && window.DataView ) {
- Runtime.addRuntime( type, Html5Runtime );
- }
-
- return Html5Runtime;
- });
- /**
- * @fileOverview Blob Html实现
- */
- define('runtime/html5/blob',[
- 'runtime/html5/runtime',
- 'lib/blob'
- ], function( Html5Runtime, Blob ) {
-
- return Html5Runtime.register( 'Blob', {
- slice: function( start, end ) {
- var blob = this.owner.source,
- slice = blob.slice || blob.webkitSlice || blob.mozSlice;
-
- blob = slice.call( blob, start, end );
-
- return new Blob( this.getRuid(), blob );
- }
- });
- });
- /**
- * @fileOverview FilePaste
- */
- define('runtime/html5/dnd',[
- 'base',
- 'runtime/html5/runtime',
- 'lib/file'
- ], function( Base, Html5Runtime, File ) {
-
- var $ = Base.$,
- prefix = 'webuploader-dnd-';
-
- return Html5Runtime.register( 'DragAndDrop', {
- init: function() {
- var elem = this.elem = this.options.container;
-
- this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );
- this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );
- this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );
- this.dropHandler = Base.bindFn( this._dropHandler, this );
- this.dndOver = false;
-
- elem.on( 'dragenter', this.dragEnterHandler );
- elem.on( 'dragover', this.dragOverHandler );
- elem.on( 'dragleave', this.dragLeaveHandler );
- elem.on( 'drop', this.dropHandler );
-
- if ( this.options.disableGlobalDnd ) {
- $( document ).on( 'dragover', this.dragOverHandler );
- $( document ).on( 'drop', this.dropHandler );
- }
- },
-
- _dragEnterHandler: function( e ) {
- var me = this,
- denied = me._denied || false,
- items;
-
- e = e.originalEvent || e;
-
- if ( !me.dndOver ) {
- me.dndOver = true;
-
- // 注意只有 chrome 支持。
- items = e.dataTransfer.items;
-
- if ( items && items.length ) {
- me._denied = denied = !me.trigger( 'accept', items );
- }
-
- me.elem.addClass( prefix + 'over' );
- me.elem[ denied ? 'addClass' :
- 'removeClass' ]( prefix + 'denied' );
- }
-
-
- e.dataTransfer.dropEffect = denied ? 'none' : 'copy';
-
- return false;
- },
-
- _dragOverHandler: function( e ) {
- // 只处理框内的。
- var parentElem = this.elem.parent().get( 0 );
- if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
- return false;
- }
-
- clearTimeout( this._leaveTimer );
- this._dragEnterHandler.call( this, e );
-
- return false;
- },
-
- _dragLeaveHandler: function() {
- var me = this,
- handler;
-
- handler = function() {
- me.dndOver = false;
- me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );
- };
-
- clearTimeout( me._leaveTimer );
- me._leaveTimer = setTimeout( handler, 100 );
- return false;
- },
-
- _dropHandler: function( e ) {
- var me = this,
- ruid = me.getRuid(),
- parentElem = me.elem.parent().get( 0 );
-
- // 只处理框内的。
- if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
- return false;
- }
-
- me._getTansferFiles( e, function( results ) {
- me.trigger( 'drop', $.map( results, function( file ) {
- return new File( ruid, file );
- }) );
- });
-
- me.dndOver = false;
- me.elem.removeClass( prefix + 'over' );
- return false;
- },
-
- // 如果传入 callback 则去查看文件夹,否则只管当前文件夹。
- _getTansferFiles: function( e, callback ) {
- var results = [],
- promises = [],
- items, files, dataTransfer, file, item, i, len, canAccessFolder;
-
- e = e.originalEvent || e;
-
- dataTransfer = e.dataTransfer;
- items = dataTransfer.items;
- files = dataTransfer.files;
-
- canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);
-
- for ( i = 0, len = files.length; i < len; i++ ) {
- file = files[ i ];
- item = items && items[ i ];
-
- if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {
-
- promises.push( this._traverseDirectoryTree(
- item.webkitGetAsEntry(), results ) );
- } else {
- results.push( file );
- }
- }
-
- Base.when.apply( Base, promises ).done(function() {
-
- if ( !results.length ) {
- return;
- }
-
- callback( results );
- });
- },
-
- _traverseDirectoryTree: function( entry, results ) {
- var deferred = Base.Deferred(),
- me = this;
-
- if ( entry.isFile ) {
- entry.file(function( file ) {
- results.push( file );
- deferred.resolve();
- });
- } else if ( entry.isDirectory ) {
- entry.createReader().readEntries(function( entries ) {
- var len = entries.length,
- promises = [],
- arr = [], // 为了保证顺序。
- i;
-
- for ( i = 0; i < len; i++ ) {
- promises.push( me._traverseDirectoryTree(
- entries[ i ], arr ) );
- }
-
- Base.when.apply( Base, promises ).then(function() {
- results.push.apply( results, arr );
- deferred.resolve();
- }, deferred.reject );
- });
- }
-
- return deferred.promise();
- },
-
- destroy: function() {
- var elem = this.elem;
-
- elem.off( 'dragenter', this.dragEnterHandler );
- elem.off( 'dragover', this.dragEnterHandler );
- elem.off( 'dragleave', this.dragLeaveHandler );
- elem.off( 'drop', this.dropHandler );
-
- if ( this.options.disableGlobalDnd ) {
- $( document ).off( 'dragover', this.dragOverHandler );
- $( document ).off( 'drop', this.dropHandler );
- }
- }
- });
- });
-
- /**
- * @fileOverview FilePaste
- */
- define('runtime/html5/filepaste',[
- 'base',
- 'runtime/html5/runtime',
- 'lib/file'
- ], function( Base, Html5Runtime, File ) {
-
- return Html5Runtime.register( 'FilePaste', {
- init: function() {
- var opts = this.options,
- elem = this.elem = opts.container,
- accept = '.*',
- arr, i, len, item;
-
- // accetp的mimeTypes中生成匹配正则。
- if ( opts.accept ) {
- arr = [];
-
- for ( i = 0, len = opts.accept.length; i < len; i++ ) {
- item = opts.accept[ i ].mimeTypes;
- item && arr.push( item );
- }
-
- if ( arr.length ) {
- accept = arr.join(',');
- accept = accept.replace( /,/g, '|' ).replace( /\*/g, '.*' );
- }
- }
- this.accept = accept = new RegExp( accept, 'i' );
- this.hander = Base.bindFn( this._pasteHander, this );
- elem.on( 'paste', this.hander );
- },
-
- _pasteHander: function( e ) {
- var allowed = [],
- ruid = this.getRuid(),
- items, item, blob, i, len;
-
- e = e.originalEvent || e;
- items = e.clipboardData.items;
-
- for ( i = 0, len = items.length; i < len; i++ ) {
- item = items[ i ];
-
- if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {
- continue;
- }
-
- allowed.push( new File( ruid, blob ) );
- }
-
- if ( allowed.length ) {
- // 不阻止非文件粘贴(文字粘贴)的事件冒泡
- e.preventDefault();
- e.stopPropagation();
- this.trigger( 'paste', allowed );
- }
- },
-
- destroy: function() {
- this.elem.off( 'paste', this.hander );
- }
- });
- });
-
- /**
- * @fileOverview FilePicker
- */
- define('runtime/html5/filepicker',[
- 'base',
- 'runtime/html5/runtime'
- ], function( Base, Html5Runtime ) {
-
- var $ = Base.$;
-
- return Html5Runtime.register( 'FilePicker', {
- init: function() {
- var container = this.getRuntime().getContainer(),
- me = this,
- owner = me.owner,
- opts = me.options,
- lable = $( document.createElement('label') ),
- input = $( document.createElement('input') ),
- arr, i, len, mouseHandler;
-
- input.attr( 'type', 'file' );
- input.attr( 'name', opts.name );
- input.addClass('webuploader-element-invisible');
-
- lable.on( 'click', function() {
- input.trigger('click');
- });
-
- lable.css({
- opacity: 0,
- width: '100%',
- height: '100%',
- display: 'block',
- cursor: 'pointer',
- background: '#ffffff'
- });
-
- if ( opts.multiple ) {
- input.attr( 'multiple', 'multiple' );
- }
-
- // @todo Firefox不支持单独指定后缀
- if ( opts.accept && opts.accept.length > 0 ) {
- arr = [];
-
- for ( i = 0, len = opts.accept.length; i < len; i++ ) {
- arr.push( opts.accept[ i ].mimeTypes );
- }
-
- input.attr( 'accept', arr.join(',') );
- }
-
- container.append( input );
- container.append( lable );
-
- mouseHandler = function( e ) {
- owner.trigger( e.type );
- };
-
- input.on( 'change', function( e ) {
- var fn = arguments.callee,
- clone;
-
- me.files = e.target.files;
-
- // reset input
- clone = this.cloneNode( true );
- this.parentNode.replaceChild( clone, this );
-
- input.off();
- input = $( clone ).on( 'change', fn )
- .on( 'mouseenter mouseleave', mouseHandler );
-
- owner.trigger('change');
- });
-
- lable.on( 'mouseenter mouseleave', mouseHandler );
-
- },
-
-
- getFiles: function() {
- return this.files;
- },
-
- destroy: function() {
- // todo
- }
- });
- });
- /**
- * Terms:
- *
- * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
- * @fileOverview Image控件
- */
- define('runtime/html5/util',[
- 'base'
- ], function( Base ) {
-
- var urlAPI = window.createObjectURL && window ||
- window.URL && URL.revokeObjectURL && URL ||
- window.webkitURL,
- createObjectURL = Base.noop,
- revokeObjectURL = createObjectURL;
-
- if ( urlAPI ) {
-
- // 更安全的方式调用,比如android里面就能把context改成其他的对象。
- createObjectURL = function() {
- return urlAPI.createObjectURL.apply( urlAPI, arguments );
- };
-
- revokeObjectURL = function() {
- return urlAPI.revokeObjectURL.apply( urlAPI, arguments );
- };
- }
-
- return {
- createObjectURL: createObjectURL,
- revokeObjectURL: revokeObjectURL,
-
- dataURL2Blob: function( dataURI ) {
- var byteStr, intArray, ab, i, mimetype, parts;
-
- parts = dataURI.split(',');
-
- if ( ~parts[ 0 ].indexOf('base64') ) {
- byteStr = atob( parts[ 1 ] );
- } else {
- byteStr = decodeURIComponent( parts[ 1 ] );
- }
-
- ab = new ArrayBuffer( byteStr.length );
- intArray = new Uint8Array( ab );
-
- for ( i = 0; i < byteStr.length; i++ ) {
- intArray[ i ] = byteStr.charCodeAt( i );
- }
-
- mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ];
-
- return this.arrayBufferToBlob( ab, mimetype );
- },
-
- dataURL2ArrayBuffer: function( dataURI ) {
- var byteStr, intArray, i, parts;
-
- parts = dataURI.split(',');
-
- if ( ~parts[ 0 ].indexOf('base64') ) {
- byteStr = atob( parts[ 1 ] );
- } else {
- byteStr = decodeURIComponent( parts[ 1 ] );
- }
-
- intArray = new Uint8Array( byteStr.length );
-
- for ( i = 0; i < byteStr.length; i++ ) {
- intArray[ i ] = byteStr.charCodeAt( i );
- }
-
- return intArray.buffer;
- },
-
- arrayBufferToBlob: function( buffer, type ) {
- var builder = window.BlobBuilder || window.WebKitBlobBuilder,
- bb;
-
- // android不支持直接new Blob, 只能借助blobbuilder.
- if ( builder ) {
- bb = new builder();
- bb.append( buffer );
- return bb.getBlob( type );
- }
-
- return new Blob([ buffer ], type ? { type: type } : {} );
- },
-
- // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg.
- // 你得到的结果是png.
- canvasToDataUrl: function( canvas, type, quality ) {
- return canvas.toDataURL( type, quality / 100 );
- },
-
- // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
- parseMeta: function( blob, callback ) {
- callback( false, {});
- },
-
- // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
- updateImageHead: function( data ) {
- return data;
- }
- };
- });
- /**
- * Terms:
- *
- * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
- * @fileOverview Image控件
- */
- define('runtime/html5/imagemeta',[
- 'runtime/html5/util'
- ], function( Util ) {
-
- var api;
-
- api = {
- parsers: {
- 0xffe1: []
- },
-
- maxMetaDataSize: 262144,
-
- parse: function( blob, cb ) {
- var me = this,
- fr = new FileReader();
-
- fr.onload = function() {
- cb( false, me._parse( this.result ) );
- fr = fr.onload = fr.onerror = null;
- };
-
- fr.onerror = function( e ) {
- cb( e.message );
- fr = fr.onload = fr.onerror = null;
- };
-
- blob = blob.slice( 0, me.maxMetaDataSize );
- fr.readAsArrayBuffer( blob.getSource() );
- },
-
- _parse: function( buffer, noParse ) {
- if ( buffer.byteLength < 6 ) {
- return;
- }
-
- var dataview = new DataView( buffer ),
- offset = 2,
- maxOffset = dataview.byteLength - 4,
- headLength = offset,
- ret = {},
- markerBytes, markerLength, parsers, i;
-
- if ( dataview.getUint16( 0 ) === 0xffd8 ) {
-
- while ( offset < maxOffset ) {
- markerBytes = dataview.getUint16( offset );
-
- if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef ||
- markerBytes === 0xfffe ) {
-
- markerLength = dataview.getUint16( offset + 2 ) + 2;
-
- if ( offset + markerLength > dataview.byteLength ) {
- break;
- }
-
- parsers = api.parsers[ markerBytes ];
-
- if ( !noParse && parsers ) {
- for ( i = 0; i < parsers.length; i += 1 ) {
- parsers[ i ].call( api, dataview, offset,
- markerLength, ret );
- }
- }
-
- offset += markerLength;
- headLength = offset;
- } else {
- break;
- }
- }
-
- if ( headLength > 6 ) {
- if ( buffer.slice ) {
- ret.imageHead = buffer.slice( 2, headLength );
- } else {
- // Workaround for IE10, which does not yet
- // support ArrayBuffer.slice:
- ret.imageHead = new Uint8Array( buffer )
- .subarray( 2, headLength );
- }
- }
- }
-
- return ret;
- },
-
- updateImageHead: function( buffer, head ) {
- var data = this._parse( buffer, true ),
- buf1, buf2, bodyoffset;
-
-
- bodyoffset = 2;
- if ( data.imageHead ) {
- bodyoffset = 2 + data.imageHead.byteLength;
- }
-
- if ( buffer.slice ) {
- buf2 = buffer.slice( bodyoffset );
- } else {
- buf2 = new Uint8Array( buffer ).subarray( bodyoffset );
- }
-
- buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength );
-
- buf1[ 0 ] = 0xFF;
- buf1[ 1 ] = 0xD8;
- buf1.set( new Uint8Array( head ), 2 );
- buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 );
-
- return buf1.buffer;
- }
- };
-
- Util.parseMeta = function() {
- return api.parse.apply( api, arguments );
- };
-
- Util.updateImageHead = function() {
- return api.updateImageHead.apply( api, arguments );
- };
-
- return api;
- });
- /**
- * 代码来自于:https://github.com/blueimp/JavaScript-Load-Image
- * 暂时项目中只用了orientation.
- *
- * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail.
- * @fileOverview EXIF解析
- */
-
- // Sample
- // ====================================
- // Make : Apple
- // Model : iPhone 4S
- // Orientation : 1
- // XResolution : 72 [72/1]
- // YResolution : 72 [72/1]
- // ResolutionUnit : 2
- // Software : QuickTime 7.7.1
- // DateTime : 2013:09:01 22:53:55
- // ExifIFDPointer : 190
- // ExposureTime : 0.058823529411764705 [1/17]
- // FNumber : 2.4 [12/5]
- // ExposureProgram : Normal program
- // ISOSpeedRatings : 800
- // ExifVersion : 0220
- // DateTimeOriginal : 2013:09:01 22:52:51
- // DateTimeDigitized : 2013:09:01 22:52:51
- // ComponentsConfiguration : YCbCr
- // ShutterSpeedValue : 4.058893515764426
- // ApertureValue : 2.5260688216892597 [4845/1918]
- // BrightnessValue : -0.3126686601998395
- // MeteringMode : Pattern
- // Flash : Flash did not fire, compulsory flash mode
- // FocalLength : 4.28 [107/25]
- // SubjectArea : [4 values]
- // FlashpixVersion : 0100
- // ColorSpace : 1
- // PixelXDimension : 2448
- // PixelYDimension : 3264
- // SensingMethod : One-chip color area sensor
- // ExposureMode : 0
- // WhiteBalance : Auto white balance
- // FocalLengthIn35mmFilm : 35
- // SceneCaptureType : Standard
- define('runtime/html5/imagemeta/exif',[
- 'base',
- 'runtime/html5/imagemeta'
- ], function( Base, ImageMeta ) {
-
- var EXIF = {};
-
- EXIF.ExifMap = function() {
- return this;
- };
-
- EXIF.ExifMap.prototype.map = {
- 'Orientation': 0x0112
- };
-
- EXIF.ExifMap.prototype.get = function( id ) {
- return this[ id ] || this[ this.map[ id ] ];
- };
-
- EXIF.exifTagTypes = {
- // byte, 8-bit unsigned int:
- 1: {
- getValue: function( dataView, dataOffset ) {
- return dataView.getUint8( dataOffset );
- },
- size: 1
- },
-
- // ascii, 8-bit byte:
- 2: {
- getValue: function( dataView, dataOffset ) {
- return String.fromCharCode( dataView.getUint8( dataOffset ) );
- },
- size: 1,
- ascii: true
- },
-
- // short, 16 bit int:
- 3: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getUint16( dataOffset, littleEndian );
- },
- size: 2
- },
-
- // long, 32 bit int:
- 4: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getUint32( dataOffset, littleEndian );
- },
- size: 4
- },
-
- // rational = two long values,
- // first is numerator, second is denominator:
- 5: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getUint32( dataOffset, littleEndian ) /
- dataView.getUint32( dataOffset + 4, littleEndian );
- },
- size: 8
- },
-
- // slong, 32 bit signed int:
- 9: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getInt32( dataOffset, littleEndian );
- },
- size: 4
- },
-
- // srational, two slongs, first is numerator, second is denominator:
- 10: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getInt32( dataOffset, littleEndian ) /
- dataView.getInt32( dataOffset + 4, littleEndian );
- },
- size: 8
- }
- };
-
- // undefined, 8-bit byte, value depending on field:
- EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ];
-
- EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length,
- littleEndian ) {
-
- var tagType = EXIF.exifTagTypes[ type ],
- tagSize, dataOffset, values, i, str, c;
-
- if ( !tagType ) {
- Base.log('Invalid Exif data: Invalid tag type.');
- return;
- }
-
- tagSize = tagType.size * length;
-
- // Determine if the value is contained in the dataOffset bytes,
- // or if the value at the dataOffset is a pointer to the actual data:
- dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8,
- littleEndian ) : (offset + 8);
-
- if ( dataOffset + tagSize > dataView.byteLength ) {
- Base.log('Invalid Exif data: Invalid data offset.');
- return;
- }
-
- if ( length === 1 ) {
- return tagType.getValue( dataView, dataOffset, littleEndian );
- }
-
- values = [];
-
- for ( i = 0; i < length; i += 1 ) {
- values[ i ] = tagType.getValue( dataView,
- dataOffset + i * tagType.size, littleEndian );
- }
-
- if ( tagType.ascii ) {
- str = '';
-
- // Concatenate the chars:
- for ( i = 0; i < values.length; i += 1 ) {
- c = values[ i ];
-
- // Ignore the terminating NULL byte(s):
- if ( c === '\u0000' ) {
- break;
- }
- str += c;
- }
-
- return str;
- }
- return values;
- };
-
- EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian,
- data ) {
-
- var tag = dataView.getUint16( offset, littleEndian );
- data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset,
- dataView.getUint16( offset + 2, littleEndian ), // tag type
- dataView.getUint32( offset + 4, littleEndian ), // tag length
- littleEndian );
- };
-
- EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset,
- littleEndian, data ) {
-
- var tagsNumber, dirEndOffset, i;
-
- if ( dirOffset + 6 > dataView.byteLength ) {
- Base.log('Invalid Exif data: Invalid directory offset.');
- return;
- }
-
- tagsNumber = dataView.getUint16( dirOffset, littleEndian );
- dirEndOffset = dirOffset + 2 + 12 * tagsNumber;
-
- if ( dirEndOffset + 4 > dataView.byteLength ) {
- Base.log('Invalid Exif data: Invalid directory size.');
- return;
- }
-
- for ( i = 0; i < tagsNumber; i += 1 ) {
- this.parseExifTag( dataView, tiffOffset,
- dirOffset + 2 + 12 * i, // tag offset
- littleEndian, data );
- }
-
- // Return the offset to the next directory:
- return dataView.getUint32( dirEndOffset, littleEndian );
- };
-
- // EXIF.getExifThumbnail = function(dataView, offset, length) {
- // var hexData,
- // i,
- // b;
- // if (!length || offset + length > dataView.byteLength) {
- // Base.log('Invalid Exif data: Invalid thumbnail data.');
- // return;
- // }
- // hexData = [];
- // for (i = 0; i < length; i += 1) {
- // b = dataView.getUint8(offset + i);
- // hexData.push((b < 16 ? '0' : '') + b.toString(16));
- // }
- // return 'data:image/jpeg,%' + hexData.join('%');
- // };
-
- EXIF.parseExifData = function( dataView, offset, length, data ) {
-
- var tiffOffset = offset + 10,
- littleEndian, dirOffset;
-
- // Check for the ASCII code for "Exif" (0x45786966):
- if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) {
- // No Exif data, might be XMP data instead
- return;
- }
- if ( tiffOffset + 8 > dataView.byteLength ) {
- Base.log('Invalid Exif data: Invalid segment size.');
- return;
- }
-
- // Check for the two null bytes:
- if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) {
- Base.log('Invalid Exif data: Missing byte alignment offset.');
- return;
- }
-
- // Check the byte alignment:
- switch ( dataView.getUint16( tiffOffset ) ) {
- case 0x4949:
- littleEndian = true;
- break;
-
- case 0x4D4D:
- littleEndian = false;
- break;
-
- default:
- Base.log('Invalid Exif data: Invalid byte alignment marker.');
- return;
- }
-
- // Check for the TIFF tag marker (0x002A):
- if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) {
- Base.log('Invalid Exif data: Missing TIFF marker.');
- return;
- }
-
- // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:
- dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian );
- // Create the exif object to store the tags:
- data.exif = new EXIF.ExifMap();
- // Parse the tags of the main image directory and retrieve the
- // offset to the next directory, usually the thumbnail directory:
- dirOffset = EXIF.parseExifTags( dataView, tiffOffset,
- tiffOffset + dirOffset, littleEndian, data );
-
- // 尝试读取缩略图
- // if ( dirOffset ) {
- // thumbnailData = {exif: {}};
- // dirOffset = EXIF.parseExifTags(
- // dataView,
- // tiffOffset,
- // tiffOffset + dirOffset,
- // littleEndian,
- // thumbnailData
- // );
-
- // // Check for JPEG Thumbnail offset:
- // if (thumbnailData.exif[0x0201]) {
- // data.exif.Thumbnail = EXIF.getExifThumbnail(
- // dataView,
- // tiffOffset + thumbnailData.exif[0x0201],
- // thumbnailData.exif[0x0202] // Thumbnail data length
- // );
- // }
- // }
- };
-
- ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData );
- return EXIF;
- });
- /**
- * @fileOverview Image
- */
- define('runtime/html5/image',[
- 'base',
- 'runtime/html5/runtime',
- 'runtime/html5/util'
- ], function( Base, Html5Runtime, Util ) {
-
- var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';
-
- return Html5Runtime.register( 'Image', {
-
- // flag: 标记是否被修改过。
- modified: false,
-
- init: function() {
- var me = this,
- img = new Image();
-
- img.onload = function() {
-
- me._info = {
- type: me.type,
- width: this.width,
- height: this.height
- };
-
- // 读取meta信息。
- if ( !me._metas && 'image/jpeg' === me.type ) {
- Util.parseMeta( me._blob, function( error, ret ) {
- me._metas = ret;
- me.owner.trigger('load');
- });
- } else {
- me.owner.trigger('load');
- }
- };
-
- img.onerror = function() {
- me.owner.trigger('error');
- };
-
- me._img = img;
- },
-
- loadFromBlob: function( blob ) {
- var me = this,
- img = me._img;
-
- me._blob = blob;
- me.type = blob.type;
- img.src = Util.createObjectURL( blob.getSource() );
- me.owner.once( 'load', function() {
- Util.revokeObjectURL( img.src );
- });
- },
-
- resize: function( width, height ) {
- var canvas = this._canvas ||
- (this._canvas = document.createElement('canvas'));
-
- this._resize( this._img, canvas, width, height );
- this._blob = null; // 没用了,可以删掉了。
- this.modified = true;
- this.owner.trigger('complete');
- },
-
- getAsBlob: function( type ) {
- var blob = this._blob,
- opts = this.options,
- canvas;
-
- type = type || this.type;
-
- // blob需要重新生成。
- if ( this.modified || this.type !== type ) {
- canvas = this._canvas;
-
- if ( type === 'image/jpeg' ) {
-
- blob = Util.canvasToDataUrl( canvas, 'image/jpeg',
- opts.quality );
-
- if ( opts.preserveHeaders && this._metas &&
- this._metas.imageHead ) {
-
- blob = Util.dataURL2ArrayBuffer( blob );
- blob = Util.updateImageHead( blob,
- this._metas.imageHead );
- blob = Util.arrayBufferToBlob( blob, type );
- return blob;
- }
- } else {
- blob = Util.canvasToDataUrl( canvas, type );
- }
-
- blob = Util.dataURL2Blob( blob );
- }
-
- return blob;
- },
-
- getAsDataUrl: function( type ) {
- var opts = this.options;
-
- type = type || this.type;
-
- if ( type === 'image/jpeg' ) {
- return Util.canvasToDataUrl( this._canvas, type, opts.quality );
- } else {
- return this._canvas.toDataURL( type );
- }
- },
-
- getOrientation: function() {
- return this._metas && this._metas.exif &&
- this._metas.exif.get('Orientation') || 1;
- },
-
- info: function( val ) {
-
- // setter
- if ( val ) {
- this._info = val;
- return this;
- }
-
- // getter
- return this._info;
- },
-
- meta: function( val ) {
-
- // setter
- if ( val ) {
- this._meta = val;
- return this;
- }
-
- // getter
- return this._meta;
- },
-
- destroy: function() {
- var canvas = this._canvas;
- this._img.onload = null;
-
- if ( canvas ) {
- canvas.getContext('2d')
- .clearRect( 0, 0, canvas.width, canvas.height );
- canvas.width = canvas.height = 0;
- this._canvas = null;
- }
-
- // 释放内存。非常重要,否则释放不了image的内存。
- this._img.src = BLANK;
- this._img = this._blob = null;
- },
-
- _resize: function( img, cvs, width, height ) {
- var opts = this.options,
- naturalWidth = img.width,
- naturalHeight = img.height,
- orientation = this.getOrientation(),
- scale, w, h, x, y;
-
- // values that require 90 degree rotation
- if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
-
- // 交换width, height的值。
- width ^= height;
- height ^= width;
- width ^= height;
- }
-
- scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth,
- height / naturalHeight );
-
- // 不允许放大。
- opts.allowMagnify || (scale = Math.min( 1, scale ));
-
- w = naturalWidth * scale;
- h = naturalHeight * scale;
-
- if ( opts.crop ) {
- cvs.width = width;
- cvs.height = height;
- } else {
- cvs.width = w;
- cvs.height = h;
- }
-
- x = (cvs.width - w) / 2;
- y = (cvs.height - h) / 2;
-
- opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
-
- this._renderImageToCanvas( cvs, img, x, y, w, h );
- },
-
- _rotate2Orientaion: function( canvas, orientation ) {
- var width = canvas.width,
- height = canvas.height,
- ctx = canvas.getContext('2d');
-
- switch ( orientation ) {
- case 5:
- case 6:
- case 7:
- case 8:
- canvas.width = height;
- canvas.height = width;
- break;
- }
-
- switch ( orientation ) {
- case 2: // horizontal flip
- ctx.translate( width, 0 );
- ctx.scale( -1, 1 );
- break;
-
- case 3: // 180 rotate left
- ctx.translate( width, height );
- ctx.rotate( Math.PI );
- break;
-
- case 4: // vertical flip
- ctx.translate( 0, height );
- ctx.scale( 1, -1 );
- break;
-
- case 5: // vertical flip + 90 rotate right
- ctx.rotate( 0.5 * Math.PI );
- ctx.scale( 1, -1 );
- break;
-
- case 6: // 90 rotate right
- ctx.rotate( 0.5 * Math.PI );
- ctx.translate( 0, -height );
- break;
-
- case 7: // horizontal flip + 90 rotate right
- ctx.rotate( 0.5 * Math.PI );
- ctx.translate( width, -height );
- ctx.scale( -1, 1 );
- break;
-
- case 8: // 90 rotate left
- ctx.rotate( -0.5 * Math.PI );
- ctx.translate( -width, 0 );
- break;
- }
- },
-
- // https://github.com/stomita/ios-imagefile-megapixel/
- // blob/master/src/megapix-image.js
- _renderImageToCanvas: (function() {
-
- // 如果不是ios, 不需要这么复杂!
- if ( !Base.os.ios ) {
- return function( canvas, img, x, y, w, h ) {
- canvas.getContext('2d').drawImage( img, x, y, w, h );
- };
- }
-
- /**
- * Detecting vertical squash in loaded image.
- * Fixes a bug which squash image vertically while drawing into
- * canvas for some images.
- */
- function detectVerticalSquash( img, iw, ih ) {
- var canvas = document.createElement('canvas'),
- ctx = canvas.getContext('2d'),
- sy = 0,
- ey = ih,
- py = ih,
- data, alpha, ratio;
-
-
- canvas.width = 1;
- canvas.height = ih;
- ctx.drawImage( img, 0, 0 );
- data = ctx.getImageData( 0, 0, 1, ih ).data;
-
- // search image edge pixel position in case
- // it is squashed vertically.
- while ( py > sy ) {
- alpha = data[ (py - 1) * 4 + 3 ];
-
- if ( alpha === 0 ) {
- ey = py;
- } else {
- sy = py;
- }
-
- py = (ey + sy) >> 1;
- }
-
- ratio = (py / ih);
- return (ratio === 0) ? 1 : ratio;
- }
-
- // fix ie7 bug
- // http://stackoverflow.com/questions/11929099/
- // html5-canvas-drawimage-ratio-bug-ios
- if ( Base.os.ios >= 7 ) {
- return function( canvas, img, x, y, w, h ) {
- var iw = img.naturalWidth,
- ih = img.naturalHeight,
- vertSquashRatio = detectVerticalSquash( img, iw, ih );
-
- return canvas.getContext('2d').drawImage( img, 0, 0,
- iw * vertSquashRatio, ih * vertSquashRatio,
- x, y, w, h );
- };
- }
-
- /**
- * Detect subsampling in loaded image.
- * In iOS, larger images than 2M pixels may be
- * subsampled in rendering.
- */
- function detectSubsampling( img ) {
- var iw = img.naturalWidth,
- ih = img.naturalHeight,
- canvas, ctx;
-
- // subsampling may happen overmegapixel image
- if ( iw * ih > 1024 * 1024 ) {
- canvas = document.createElement('canvas');
- canvas.width = canvas.height = 1;
- ctx = canvas.getContext('2d');
- ctx.drawImage( img, -iw + 1, 0 );
-
- // subsampled image becomes half smaller in rendering size.
- // check alpha channel value to confirm image is covering
- // edge pixel or not. if alpha value is 0
- // image is not covering, hence subsampled.
- return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0;
- } else {
- return false;
- }
- }
-
-
- return function( canvas, img, x, y, width, height ) {
- var iw = img.naturalWidth,
- ih = img.naturalHeight,
- ctx = canvas.getContext('2d'),
- subsampled = detectSubsampling( img ),
- doSquash = this.type === 'image/jpeg',
- d = 1024,
- sy = 0,
- dy = 0,
- tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;
-
- if ( subsampled ) {
- iw /= 2;
- ih /= 2;
- }
-
- ctx.save();
- tmpCanvas = document.createElement('canvas');
- tmpCanvas.width = tmpCanvas.height = d;
-
- tmpCtx = tmpCanvas.getContext('2d');
- vertSquashRatio = doSquash ?
- detectVerticalSquash( img, iw, ih ) : 1;
-
- dw = Math.ceil( d * width / iw );
- dh = Math.ceil( d * height / ih / vertSquashRatio );
-
- while ( sy < ih ) {
- sx = 0;
- dx = 0;
- while ( sx < iw ) {
- tmpCtx.clearRect( 0, 0, d, d );
- tmpCtx.drawImage( img, -sx, -sy );
- ctx.drawImage( tmpCanvas, 0, 0, d, d,
- x + dx, y + dy, dw, dh );
- sx += d;
- dx += dw;
- }
- sy += d;
- dy += dh;
- }
- ctx.restore();
- tmpCanvas = tmpCtx = null;
- };
- })()
- });
- });
- /**
- * @fileOverview Transport
- * @todo 支持chunked传输,优势:
- * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
- * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
- */
- define('runtime/html5/transport',[
- 'base',
- 'runtime/html5/runtime'
- ], function( Base, Html5Runtime ) {
-
- var noop = Base.noop,
- $ = Base.$;
-
- return Html5Runtime.register( 'Transport', {
- init: function() {
- this._status = 0;
- this._response = null;
- },
-
- send: function() {
- var owner = this.owner,
- opts = this.options,
- xhr = this._initAjax(),
- blob = owner._blob,
- server = opts.server,
- formData, binary, fr;
-
- if ( opts.sendAsBinary ) {
- server += (/\?/.test( server ) ? '&' : '?') +
- $.param( owner._formData );
-
- binary = blob.getSource();
- } else {
- formData = new FormData();
- $.each( owner._formData, function( k, v ) {
- formData.append( k, v );
- });
-
- formData.append( opts.fileVal, blob.getSource(),
- opts.filename || owner._formData.name || '' );
- }
-
- if ( opts.withCredentials && 'withCredentials' in xhr ) {
- xhr.open( opts.method, server, true );
- xhr.withCredentials = true;
- } else {
- xhr.open( opts.method, server );
- }
-
- this._setRequestHeader( xhr, opts.headers );
-
- if ( binary ) {
- xhr.overrideMimeType('application/octet-stream');
-
- // android直接发送blob会导致服务端接收到的是空文件。
- // bug详情。
- // https://code.google.com/p/android/issues/detail?id=39882
- // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
- if ( Base.os.android ) {
- fr = new FileReader();
-
- fr.onload = function() {
- xhr.send( this.result );
- fr = fr.onload = null;
- };
-
- fr.readAsArrayBuffer( binary );
- } else {
- xhr.send( binary );
- }
- } else {
- xhr.send( formData );
- }
- },
-
- getResponse: function() {
- return this._response;
- },
-
- getResponseAsJson: function() {
- return this._parseJson( this._response );
- },
-
- getStatus: function() {
- return this._status;
- },
-
- abort: function() {
- var xhr = this._xhr;
-
- if ( xhr ) {
- xhr.upload.onprogress = noop;
- xhr.onreadystatechange = noop;
- xhr.abort();
-
- this._xhr = xhr = null;
- }
- },
-
- destroy: function() {
- this.abort();
- },
-
- _initAjax: function() {
- var me = this,
- xhr = new XMLHttpRequest(),
- opts = this.options;
-
- if ( opts.withCredentials && !('withCredentials' in xhr) &&
- typeof XDomainRequest !== 'undefined' ) {
- xhr = new XDomainRequest();
- }
-
- xhr.upload.onprogress = function( e ) {
- var percentage = 0;
-
- if ( e.lengthComputable ) {
- percentage = e.loaded / e.total;
- }
-
- return me.trigger( 'progress', percentage );
- };
-
- xhr.onreadystatechange = function() {
-
- if ( xhr.readyState !== 4 ) {
- return;
- }
-
- xhr.upload.onprogress = noop;
- xhr.onreadystatechange = noop;
- me._xhr = null;
- me._status = xhr.status;
-
- if ( xhr.status >= 200 && xhr.status < 300 ) {
- me._response = xhr.responseText;
- return me.trigger('load');
- } else if ( xhr.status >= 500 && xhr.status < 600 ) {
- me._response = xhr.responseText;
- return me.trigger( 'error', 'server' );
- }
-
-
- return me.trigger( 'error', me._status ? 'http' : 'abort' );
- };
-
- me._xhr = xhr;
- return xhr;
- },
-
- _setRequestHeader: function( xhr, headers ) {
- $.each( headers, function( key, val ) {
- xhr.setRequestHeader( key, val );
- });
- },
-
- _parseJson: function( str ) {
- var json;
-
- try {
- json = JSON.parse( str );
- } catch ( ex ) {
- json = {};
- }
-
- return json;
- }
- });
- });
- /**
- * @fileOverview 只有html5实现的文件版本。
- */
- define('preset/html5only',[
- 'base',
-
- // widgets
- 'widgets/filednd',
- 'widgets/filepaste',
- 'widgets/filepicker',
- 'widgets/image',
- 'widgets/queue',
- 'widgets/runtime',
- 'widgets/upload',
- 'widgets/validator',
-
- // runtimes
- // html5
- 'runtime/html5/blob',
- 'runtime/html5/dnd',
- 'runtime/html5/filepaste',
- 'runtime/html5/filepicker',
- 'runtime/html5/imagemeta/exif',
- 'runtime/html5/image',
- 'runtime/html5/transport'
- ], function( Base ) {
- return Base;
- });
- define('webuploader',[
- 'preset/html5only'
- ], function( preset ) {
- return preset;
- });
- return require('webuploader');
-});
diff --git a/www/js/ueditor/third-party/webuploader/webuploader.html5only.min.js b/www/js/ueditor/third-party/webuploader/webuploader.html5only.min.js
deleted file mode 100644
index 866dcde755..0000000000
--- a/www/js/ueditor/third-party/webuploader/webuploader.html5only.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* WebUploader 0.1.2 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}},j=b(a,f,e);i(j),"object"==typeof module&&"object"==typeof module.exports?module.exports=j:"function"==typeof define&&define.amd?define([],j):(c=a.WebUploader,a.WebUploader=j,a.WebUploader.noConflict=function(){a.WebUploader=c})}(this,function(a,b,c){return b("dollar-third",[],function(){return a.jQuery||a.Zepto}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.2",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return{successNum:a.numOfSuccess,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.parentNode.removeChild(this.__container),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/dnd",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},d.options,a),a.container=e(a.container),a.container.length&&c.call(this,"DragAndDrop")}var e=a.$;return d.options={accept:null,disableGlobalDnd:!1},a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})},destroy:function(){this.disconnectRuntime()}}),b.installTo(d.prototype),d}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g={},h=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):g},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[];return e.each(h,function(c,d){b.push(new d(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,h,i,j,k=0,l=this._widgets,m=l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],h=f.invoke(b,d),h!==g&&(a.isPromise(h)?o.push(h):n.push(h));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return setTimeout(function(){b.resolve.apply(b,c)},1),b.promise()})[j](e||a.noop)):n[0]}}),b.register=d.register=function(b,c){var f,g={init:"init"};return 1===arguments.length?(c=b,c.responseMap=g):c.responseMap=e.extend(g,b),f=a.inherits(d,c),h.push(f),f},d}),b("widgets/filednd",["base","uploader","lib/dnd","widgets/widget"],function(a,b,c){var d=a.$;return b.options.dnd="",b.register({init:function(b){if(b.dnd&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{disableGlobalDnd:b.disableGlobalDnd,container:b.dnd,accept:b.accept});return e=new c(h),e.once("ready",g.resolve),e.on("drop",function(a){f.request("add-file",[a])}),e.on("accept",function(a){return f.owner.trigger("dndAccept",a)}),e.init(),g.promise()}}})}),b("lib/filepaste",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},a),a.container=e(a.container||document.body),c.call(this,"FilePaste")}var e=a.$;return a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})},destroy:function(){this.exec("destroy"),this.disconnectRuntime(),this.off()}}),b.installTo(d.prototype),d}),b("widgets/filepaste",["base","uploader","lib/filepaste","widgets/widget"],function(a,b,c){var d=a.$;return b.register({init:function(b){if(b.paste&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{container:b.paste,accept:b.accept});return e=new c(h),e.once("ready",g.resolve),e.on("paste",function(a){f.owner.request("add-file",[a])}),e.init(),g.promise()}}})}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,b.call(d,"Blob"),this.uid=c.uid||this.uid,this.type=c.type||"",this.size=c.size||0,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;b.apply(this,arguments),this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&this.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(this.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),!this.type&&~"jpg,jpeg,png,gif,bmp".indexOf(f)&&(this.type="image/"+("jpg"===f?"jpeg":f)),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString()}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var b=this,c=b.options,e=c.button;e.addClass("webuploader-pick"),b.on("all",function(a){var g;switch(a){case"mouseenter":e.addClass("webuploader-pick-hover");break;case"mouseleave":e.removeClass("webuploader-pick-hover");break;case"change":g=b.exec("getFiles"),b.trigger("select",f.map(g,function(a){return a=new d(b.getRuid(),a),a._refer=c.container,a}),c.container)}}),b.connectRuntime(c,function(){b.refresh(),b.exec("init",c),b.trigger("ready")}),f(a).on("resize",function(){b.refresh()})},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){this.runtime&&(this.exec("destroy"),this.disconnectRuntime())}}),e}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({"add-btn":"addButton",refresh:"refresh",disable:"disable",enable:"enable"},{init:function(a){return this.pickers=[],a.pick&&this.addButton(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addButton:function(b){var e,f,g,h=this,i=h.options,j=i.accept;if(b)return g=a.Deferred(),d.isPlainObject(b)||(b={id:b}),e=d.extend({},b,{accept:d.isPlainObject(j)?[j]:j,swf:i.swf,runtimeOrder:i.runtimeOrder}),f=new c(e),f.once("ready",g.resolve),f.on("select",function(a){h.owner.request("add-file",[a])}),f.init(),this.pickers.push(f),g.promise()},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})}})}),b("lib/image",["base","runtime/client","lib/blob"],function(a,b,c){function d(a){this.options=e.extend({},d.options,a),b.call(this,"Image"),this.on("load",function(){this._info=this.exec("info"),this._meta=this.exec("meta")})}var e=a.$;return d.options={quality:90,crop:!1,preserveHeaders:!0,allowMagnify:!0},a.inherits(b,{constructor:d,info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},loadFromBlob:function(a){var b=this,c=a.getRuid();this.connectRuntime(c,function(){b.exec("init",b.options),b.exec("loadFromBlob",a)})},resize:function(){var b=a.slice(arguments);return this.exec.apply(this,["resize"].concat(b))},getAsDataUrl:function(a){return this.exec("getAsDataUrl",a)},getAsBlob:function(a){var b=this.exec("getAsBlob",a);return new c(this.getRuid(),b)}}),d}),b("widgets/image",["base","uploader","lib/image","widgets/widget"],function(a,b,c){var d,e=a.$;return d=function(a){var b=0,c=[],d=function(){for(var d;c.length&&a>b;)d=c.shift(),b+=d[0],d[1]()};return function(a,e,f){c.push([e,f]),a.once("destroy",function(){b-=e,setTimeout(d,1)}),setTimeout(d,1)}}(5242880),e.extend(b.options,{thumb:{width:110,height:110,quality:70,allowMagnify:!0,crop:!0,preserveHeaders:!1,type:"image/jpeg"},compress:{width:1600,height:1600,quality:90,allowMagnify:!1,crop:!1,preserveHeaders:!0}}),b.register({"make-thumb":"makeThumb","before-send-file":"compressImage"},{makeThumb:function(a,b,f,g){var h,i;return a=this.request("get-file",a),a.type.match(/^image/)?(h=e.extend({},this.options.thumb),e.isPlainObject(f)&&(h=e.extend(h,f),f=null),f=f||h.width,g=g||h.height,i=new c(h),i.once("load",function(){a._info=a._info||i.info(),a._meta=a._meta||i.meta(),i.resize(f,g)}),i.once("complete",function(){b(!1,i.getAsDataUrl(h.type)),i.destroy()}),i.once("error",function(){b(!0),i.destroy()}),void d(i,a.source.size,function(){a._info&&i.info(a._info),a._meta&&i.meta(a._meta),i.loadFromBlob(a.source)})):void b(!0)},compressImage:function(b){var d,f,g=this.options.compress||this.options.resize,h=g&&g.compressSize||307200;return b=this.request("get-file",b),!g||!~"image/jpeg,image/jpg".indexOf(b.type)||b.sizeb;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)})),a.setStatus(f.QUEUED)},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({"sort-files":"sortFiles","add-file":"addFiles","get-file":"getFile","fetch-file":"fetchFile","get-stats":"getStats","get-files":"getFiles","remove-file":"removeFile",retry:"retry",reset:"reset","accept-file":"acceptFile"},{init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||a.size<6||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFiles:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&b.request("start-upload")},getStats:function(){return this.stats},removeFile:function(a){var b=this;a=a.id?a:b.queue.getFile(a),a.setStatus(i.CANCELLED),b.owner.trigger("fileDequeued",a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.queue=new c,this.stats=this.queue.stats}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({"predict-runtime-type":"predictRuntmeType"},{init:function(){if(!this.predictRuntmeType())throw Error("Runtime Error")},predictRuntmeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){for(var c,d=[],e=a.source,f=e.size,g=b?Math.ceil(f/b):1,h=0,i=0;g>i;)c=Math.min(b,f-h),d.push({file:a,start:h,end:b?h+c:f,total:f,chunks:g,chunk:i++}),h+=c;return a.blocks=d.concat(),a.remaning=d.length,{file:a,has:function(){return!!d.length},fetch:function(){return d.shift()}}}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:null}),b.register({"start-upload":"start","stop-upload":"stop","skip-file":"skipFile","is-in-progress":"isInProgress"},{init:function(){var b=this.owner;this.runing=!1,this.pool=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},start:function(){var b=this;f.each(b.request("get-files",h.INVALID),function(){b.request("remove-file",this)}),b.runing||(b.runing=!0,f.each(b.pool,function(a,c){var d=c.file;d.getStatus()===h.INTERRUPT&&(d.setStatus(h.PROGRESS),b._trigged=!1,c.transport&&c.transport.send())}),b._trigged=!1,b.owner.trigger("startUpload"),a.nextTick(b.__tick))},stop:function(a){var b=this;b.runing!==!1&&(b.runing=!1,a&&f.each(b.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),b.owner.trigger("stopUpload"))},isInProgress:function(){return!!this.runing},getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length1&&(f.each(k.blocks,function(a,b){d+=(b.percentage||0)*(b.end-b.start)}),c=d/k.size),i.trigger("uploadProgress",k,c||0)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({init:function(){var a=this;e.each(f,function(){this.call(a.owner)})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=b.fileNumLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=b.fileSizeLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}))}),d}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destory;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destory=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/dnd",["base","runtime/html5/runtime","lib/file"],function(a,b,c){var d=a.$,e="webuploader-dnd-";return b.register("DragAndDrop",{init:function(){var b=this.elem=this.options.container;this.dragEnterHandler=a.bindFn(this._dragEnterHandler,this),this.dragOverHandler=a.bindFn(this._dragOverHandler,this),this.dragLeaveHandler=a.bindFn(this._dragLeaveHandler,this),this.dropHandler=a.bindFn(this._dropHandler,this),this.dndOver=!1,b.on("dragenter",this.dragEnterHandler),b.on("dragover",this.dragOverHandler),b.on("dragleave",this.dragLeaveHandler),b.on("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).on("dragover",this.dragOverHandler),d(document).on("drop",this.dropHandler))
-},_dragEnterHandler:function(a){var b,c=this,d=c._denied||!1;return a=a.originalEvent||a,c.dndOver||(c.dndOver=!0,b=a.dataTransfer.items,b&&b.length&&(c._denied=d=!c.trigger("accept",b)),c.elem.addClass(e+"over"),c.elem[d?"addClass":"removeClass"](e+"denied")),a.dataTransfer.dropEffect=d?"none":"copy",!1},_dragOverHandler:function(a){var b=this.elem.parent().get(0);return b&&!d.contains(b,a.currentTarget)?!1:(clearTimeout(this._leaveTimer),this._dragEnterHandler.call(this,a),!1)},_dragLeaveHandler:function(){var a,b=this;return a=function(){b.dndOver=!1,b.elem.removeClass(e+"over "+e+"denied")},clearTimeout(b._leaveTimer),b._leaveTimer=setTimeout(a,100),!1},_dropHandler:function(a){var b=this,f=b.getRuid(),g=b.elem.parent().get(0);return g&&!d.contains(g,a.currentTarget)?!1:(b._getTansferFiles(a,function(a){b.trigger("drop",d.map(a,function(a){return new c(f,a)}))}),b.dndOver=!1,b.elem.removeClass(e+"over"),!1)},_getTansferFiles:function(b,c){var d,e,f,g,h,i,j,k,l=[],m=[];for(b=b.originalEvent||b,f=b.dataTransfer,d=f.items,e=f.files,k=!(!d||!d[0].webkitGetAsEntry),i=0,j=e.length;j>i;i++)g=e[i],h=d&&d[i],k&&h.webkitGetAsEntry().isDirectory?m.push(this._traverseDirectoryTree(h.webkitGetAsEntry(),l)):l.push(g);a.when.apply(a,m).done(function(){l.length&&c(l)})},_traverseDirectoryTree:function(b,c){var d=a.Deferred(),e=this;return b.isFile?b.file(function(a){c.push(a),d.resolve()}):b.isDirectory&&b.createReader().readEntries(function(b){var f,g=b.length,h=[],i=[];for(f=0;g>f;f++)h.push(e._traverseDirectoryTree(b[f],i));a.when.apply(a,h).then(function(){c.push.apply(c,i),d.resolve()},d.reject)}),d.promise()},destroy:function(){var a=this.elem;a.off("dragenter",this.dragEnterHandler),a.off("dragover",this.dragEnterHandler),a.off("dragleave",this.dragLeaveHandler),a.off("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).off("dragover",this.dragOverHandler),d(document).off("drop",this.dropHandler))}})}),b("runtime/html5/filepaste",["base","runtime/html5/runtime","lib/file"],function(a,b,c){return b.register("FilePaste",{init:function(){var b,c,d,e,f=this.options,g=this.elem=f.container,h=".*";if(f.accept){for(b=[],c=0,d=f.accept.length;d>c;c++)e=f.accept[c].mimeTypes,e&&b.push(e);b.length&&(h=b.join(","),h=h.replace(/,/g,"|").replace(/\*/g,".*"))}this.accept=h=new RegExp(h,"i"),this.hander=a.bindFn(this._pasteHander,this),g.on("paste",this.hander)},_pasteHander:function(a){var b,d,e,f,g,h=[],i=this.getRuid();for(a=a.originalEvent||a,b=a.clipboardData.items,f=0,g=b.length;g>f;f++)d=b[f],"file"===d.kind&&(e=d.getAsFile())&&h.push(new c(i,e));h.length&&(a.preventDefault(),a.stopPropagation(),this.trigger("paste",h))},destroy:function(){this.elem.off("paste",this.hander)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=c(document.createElement("label")),k=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){}})}),b("runtime/html5/util",["base"],function(b){var c=a.createObjectURL&&a||a.URL&&URL.revokeObjectURL&&URL||a.webkitURL,d=b.noop,e=d;return c&&(d=function(){return c.createObjectURL.apply(c,arguments)},e=function(){return c.revokeObjectURL.apply(c,arguments)}),{createObjectURL:d,revokeObjectURL:e,dataURL2Blob:function(a){var b,c,d,e,f,g;for(g=a.split(","),b=~g[0].indexOf("base64")?atob(g[1]):decodeURIComponent(g[1]),d=new ArrayBuffer(b.length),c=new Uint8Array(d),e=0;ei&&(d=h.getUint16(i),d>=65504&&65519>=d||65534===d)&&(e=h.getUint16(i+2)+2,!(i+e>h.byteLength));){if(f=b.parsers[d],!c&&f)for(g=0;g6&&(l.imageHead=a.slice?a.slice(2,k):new Uint8Array(a).subarray(2,k))}return l}},updateImageHead:function(a,b){var c,d,e,f=this._parse(a,!0);return e=2,f.imageHead&&(e=2+f.imageHead.byteLength),d=a.slice?a.slice(e):new Uint8Array(a).subarray(e),c=new Uint8Array(b.byteLength+2+d.byteLength),c[0]=255,c[1]=216,c.set(new Uint8Array(b),2),c.set(new Uint8Array(d),b.byteLength+2),c.buffer}},a.parseMeta=function(){return b.parse.apply(b,arguments)},a.updateImageHead=function(){return b.updateImageHead.apply(b,arguments)},b}),b("runtime/html5/imagemeta/exif",["base","runtime/html5/imagemeta"],function(a,b){var c={};return c.ExifMap=function(){return this},c.ExifMap.prototype.map={Orientation:274},c.ExifMap.prototype.get=function(a){return this[a]||this[this.map[a]]},c.exifTagTypes={1:{getValue:function(a,b){return a.getUint8(b)},size:1},2:{getValue:function(a,b){return String.fromCharCode(a.getUint8(b))},size:1,ascii:!0},3:{getValue:function(a,b,c){return a.getUint16(b,c)},size:2},4:{getValue:function(a,b,c){return a.getUint32(b,c)},size:4},5:{getValue:function(a,b,c){return a.getUint32(b,c)/a.getUint32(b+4,c)},size:8},9:{getValue:function(a,b,c){return a.getInt32(b,c)},size:4},10:{getValue:function(a,b,c){return a.getInt32(b,c)/a.getInt32(b+4,c)},size:8}},c.exifTagTypes[7]=c.exifTagTypes[1],c.getExifValue=function(b,d,e,f,g,h){var i,j,k,l,m,n,o=c.exifTagTypes[f];if(!o)return void a.log("Invalid Exif data: Invalid tag type.");if(i=o.size*g,j=i>4?d+b.getUint32(e+8,h):e+8,j+i>b.byteLength)return void a.log("Invalid Exif data: Invalid data offset.");if(1===g)return o.getValue(b,j,h);for(k=[],l=0;g>l;l+=1)k[l]=o.getValue(b,j+l*o.size,h);if(o.ascii){for(m="",l=0;lb.byteLength)return void a.log("Invalid Exif data: Invalid directory offset.");if(g=b.getUint16(d,e),h=d+2+12*g,h+4>b.byteLength)return void a.log("Invalid Exif data: Invalid directory size.");for(i=0;g>i;i+=1)this.parseExifTag(b,c,d+2+12*i,e,f);return b.getUint32(h,e)},c.parseExifData=function(b,d,e,f){var g,h,i=d+10;if(1165519206===b.getUint32(d+4)){if(i+8>b.byteLength)return void a.log("Invalid Exif data: Invalid segment size.");if(0!==b.getUint16(d+8))return void a.log("Invalid Exif data: Missing byte alignment offset.");switch(b.getUint16(i)){case 18761:g=!0;break;case 19789:g=!1;break;default:return void a.log("Invalid Exif data: Invalid byte alignment marker.")}if(42!==b.getUint16(i+2,g))return void a.log("Invalid Exif data: Missing TIFF marker.");h=b.getUint32(i+4,g),f.exif=new c.ExifMap,h=c.parseExifTags(b,i,i+h,g,f)}},b.parsers[65505].push(c.parseExifData),c}),b("runtime/html5/image",["base","runtime/html5/runtime","runtime/html5/util"],function(a,b,c){var d="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D";return b.register("Image",{modified:!1,init:function(){var a=this,b=new Image;b.onload=function(){a._info={type:a.type,width:this.width,height:this.height},a._metas||"image/jpeg"!==a.type?a.owner.trigger("load"):c.parseMeta(a._blob,function(b,c){a._metas=c,a.owner.trigger("load")})},b.onerror=function(){a.owner.trigger("error")},a._img=b},loadFromBlob:function(a){var b=this,d=b._img;b._blob=a,b.type=a.type,d.src=c.createObjectURL(a.getSource()),b.owner.once("load",function(){c.revokeObjectURL(d.src)})},resize:function(a,b){var c=this._canvas||(this._canvas=document.createElement("canvas"));this._resize(this._img,c,a,b),this._blob=null,this.modified=!0,this.owner.trigger("complete")},getAsBlob:function(a){var b,d=this._blob,e=this.options;if(a=a||this.type,this.modified||this.type!==a){if(b=this._canvas,"image/jpeg"===a){if(d=c.canvasToDataUrl(b,"image/jpeg",e.quality),e.preserveHeaders&&this._metas&&this._metas.imageHead)return d=c.dataURL2ArrayBuffer(d),d=c.updateImageHead(d,this._metas.imageHead),d=c.arrayBufferToBlob(d,a)}else d=c.canvasToDataUrl(b,a);d=c.dataURL2Blob(d)}return d},getAsDataUrl:function(a){var b=this.options;return a=a||this.type,"image/jpeg"===a?c.canvasToDataUrl(this._canvas,a,b.quality):this._canvas.toDataURL(a)},getOrientation:function(){return this._metas&&this._metas.exif&&this._metas.exif.get("Orientation")||1},info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},destroy:function(){var a=this._canvas;this._img.onload=null,a&&(a.getContext("2d").clearRect(0,0,a.width,a.height),a.width=a.height=0,this._canvas=null),this._img.src=d,this._img=this._blob=null},_resize:function(a,b,c,d){var e,f,g,h,i,j=this.options,k=a.width,l=a.height,m=this.getOrientation();~[5,6,7,8].indexOf(m)&&(c^=d,d^=c,c^=d),e=Math[j.crop?"max":"min"](c/k,d/l),j.allowMagnify||(e=Math.min(1,e)),f=k*e,g=l*e,j.crop?(b.width=c,b.height=d):(b.width=f,b.height=g),h=(b.width-f)/2,i=(b.height-g)/2,j.preserveHeaders||this._rotate2Orientaion(b,m),this._renderImageToCanvas(b,a,h,i,f,g)},_rotate2Orientaion:function(a,b){var c=a.width,d=a.height,e=a.getContext("2d");switch(b){case 5:case 6:case 7:case 8:a.width=d,a.height=c}switch(b){case 2:e.translate(c,0),e.scale(-1,1);break;case 3:e.translate(c,d),e.rotate(Math.PI);break;case 4:e.translate(0,d),e.scale(1,-1);break;case 5:e.rotate(.5*Math.PI),e.scale(1,-1);break;case 6:e.rotate(.5*Math.PI),e.translate(0,-d);break;case 7:e.rotate(.5*Math.PI),e.translate(c,-d),e.scale(-1,1);break;case 8:e.rotate(-.5*Math.PI),e.translate(-c,0)}},_renderImageToCanvas:function(){function b(a,b,c){var d,e,f,g=document.createElement("canvas"),h=g.getContext("2d"),i=0,j=c,k=c;for(g.width=1,g.height=c,h.drawImage(a,0,0),d=h.getImageData(0,0,1,c).data;k>i;)e=d[4*(k-1)+3],0===e?j=k:i=k,k=j+i>>1;return f=k/c,0===f?1:f}function c(a){var b,c,d=a.naturalWidth,e=a.naturalHeight;return d*e>1048576?(b=document.createElement("canvas"),b.width=b.height=1,c=b.getContext("2d"),c.drawImage(a,-d+1,0),0===c.getImageData(0,0,1,1).data[3]):!1}return a.os.ios?a.os.ios>=7?function(a,c,d,e,f,g){var h=c.naturalWidth,i=c.naturalHeight,j=b(c,h,i);return a.getContext("2d").drawImage(c,0,0,h*j,i*j,d,e,f,g)}:function(a,d,e,f,g,h){var i,j,k,l,m,n,o,p=d.naturalWidth,q=d.naturalHeight,r=a.getContext("2d"),s=c(d),t="image/jpeg"===this.type,u=1024,v=0,w=0;for(s&&(p/=2,q/=2),r.save(),i=document.createElement("canvas"),i.width=i.height=u,j=i.getContext("2d"),k=t?b(d,p,q):1,l=Math.ceil(u*g/p),m=Math.ceil(u*h/q/k);q>v;){for(n=0,o=0;p>n;)j.clearRect(0,0,u,u),j.drawImage(d,-n,-v),r.drawImage(i,0,0,u,u,e+o,f+w,l,m),n+=u,o+=l;v+=u,w+=m}r.restore(),i=j=null}:function(a,b,c,d,e,f){a.getContext("2d").drawImage(b,c,d,e,f)}}()})}),b("runtime/html5/transport",["base","runtime/html5/runtime"],function(a,b){var c=a.noop,d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null},send:function(){var b,c,e,f=this.owner,g=this.options,h=this._initAjax(),i=f._blob,j=g.server;g.sendAsBinary?(j+=(/\?/.test(j)?"&":"?")+d.param(f._formData),c=i.getSource()):(b=new FormData,d.each(f._formData,function(a,c){b.append(a,c)}),b.append(g.fileVal,i.getSource(),g.filename||f._formData.name||"")),g.withCredentials&&"withCredentials"in h?(h.open(g.method,j,!0),h.withCredentials=!0):h.open(g.method,j),this._setRequestHeader(h,g.headers),c?(h.overrideMimeType("application/octet-stream"),a.os.android?(e=new FileReader,e.onload=function(){h.send(this.result),e=e.onload=null},e.readAsArrayBuffer(c)):h.send(c)):h.send(b)},getResponse:function(){return this._response},getResponseAsJson:function(){return this._parseJson(this._response)},getStatus:function(){return this._status},abort:function(){var a=this._xhr;a&&(a.upload.onprogress=c,a.onreadystatechange=c,a.abort(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new XMLHttpRequest,d=this.options;return!d.withCredentials||"withCredentials"in b||"undefined"==typeof XDomainRequest||(b=new XDomainRequest),b.upload.onprogress=function(b){var c=0;return b.lengthComputable&&(c=b.loaded/b.total),a.trigger("progress",c)},b.onreadystatechange=function(){return 4===b.readyState?(b.upload.onprogress=c,b.onreadystatechange=c,a._xhr=null,a._status=b.status,b.status>=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("preset/html5only",["base","widgets/filednd","widgets/filepaste","widgets/filepicker","widgets/image","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","runtime/html5/blob","runtime/html5/dnd","runtime/html5/filepaste","runtime/html5/filepicker","runtime/html5/imagemeta/exif","runtime/html5/image","runtime/html5/transport"],function(a){return a}),b("webuploader",["preset/html5only"],function(a){return a}),c("webuploader")});
\ No newline at end of file
diff --git a/www/js/ueditor/third-party/webuploader/webuploader.js b/www/js/ueditor/third-party/webuploader/webuploader.js
deleted file mode 100644
index 39d9351a18..0000000000
--- a/www/js/ueditor/third-party/webuploader/webuploader.js
+++ /dev/null
@@ -1,6733 +0,0 @@
-/*! WebUploader 0.1.2 */
-
-
-/**
- * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
- *
- * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
- */
-(function( root, factory ) {
- var modules = {},
-
- // 内部require, 简单不完全实现。
- // https://github.com/amdjs/amdjs-api/wiki/require
- _require = function( deps, callback ) {
- var args, len, i;
-
- // 如果deps不是数组,则直接返回指定module
- if ( typeof deps === 'string' ) {
- return getModule( deps );
- } else {
- args = [];
- for( len = deps.length, i = 0; i < len; i++ ) {
- args.push( getModule( deps[ i ] ) );
- }
-
- return callback.apply( null, args );
- }
- },
-
- // 内部define,暂时不支持不指定id.
- _define = function( id, deps, factory ) {
- if ( arguments.length === 2 ) {
- factory = deps;
- deps = null;
- }
-
- _require( deps || [], function() {
- setModule( id, factory, arguments );
- });
- },
-
- // 设置module, 兼容CommonJs写法。
- setModule = function( id, factory, args ) {
- var module = {
- exports: factory
- },
- returned;
-
- if ( typeof factory === 'function' ) {
- args.length || (args = [ _require, module.exports, module ]);
- returned = factory.apply( null, args );
- returned !== undefined && (module.exports = returned);
- }
-
- modules[ id ] = module.exports;
- },
-
- // 根据id获取module
- getModule = function( id ) {
- var module = modules[ id ] || root[ id ];
-
- if ( !module ) {
- throw new Error( '`' + id + '` is undefined' );
- }
-
- return module;
- },
-
- // 将所有modules,将路径ids装换成对象。
- exportsTo = function( obj ) {
- var key, host, parts, part, last, ucFirst;
-
- // make the first character upper case.
- ucFirst = function( str ) {
- return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
- };
-
- for ( key in modules ) {
- host = obj;
-
- if ( !modules.hasOwnProperty( key ) ) {
- continue;
- }
-
- parts = key.split('/');
- last = ucFirst( parts.pop() );
-
- while( (part = ucFirst( parts.shift() )) ) {
- host[ part ] = host[ part ] || {};
- host = host[ part ];
- }
-
- host[ last ] = modules[ key ];
- }
- },
-
- exports = factory( root, _define, _require ),
- origin;
-
- // exports every module.
- exportsTo( exports );
-
- if ( typeof module === 'object' && typeof module.exports === 'object' ) {
-
- // For CommonJS and CommonJS-like environments where a proper window is present,
- module.exports = exports;
- } else if ( typeof define === 'function' && define.amd ) {
-
- // Allow using this built library as an AMD module
- // in another project. That other project will only
- // see this AMD call, not the internal modules in
- // the closure below.
- define([], exports );
- } else {
-
- // Browser globals case. Just assign the
- // result to a property on the global.
- origin = root.WebUploader;
- root.WebUploader = exports;
- root.WebUploader.noConflict = function() {
- root.WebUploader = origin;
- };
- }
-})( this, function( window, define, require ) {
-
-
- /**
- * @fileOverview jQuery or Zepto
- */
- define('dollar-third',[],function() {
- return window.jQuery || window.Zepto;
- });
- /**
- * @fileOverview Dom 操作相关
- */
- define('dollar',[
- 'dollar-third'
- ], function( _ ) {
- return _;
- });
- /**
- * @fileOverview 使用jQuery的Promise
- */
- define('promise-third',[
- 'dollar'
- ], function( $ ) {
- return {
- Deferred: $.Deferred,
- when: $.when,
-
- isPromise: function( anything ) {
- return anything && typeof anything.then === 'function';
- }
- };
- });
- /**
- * @fileOverview Promise/A+
- */
- define('promise',[
- 'promise-third'
- ], function( _ ) {
- return _;
- });
- /**
- * @fileOverview 基础类方法。
- */
-
- /**
- * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
- *
- * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
- * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
- *
- * * module `base`:WebUploader.Base
- * * module `file`: WebUploader.File
- * * module `lib/dnd`: WebUploader.Lib.Dnd
- * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
- *
- *
- * 以下文档将可能省略`WebUploader`前缀。
- * @module WebUploader
- * @title WebUploader API文档
- */
- define('base',[
- 'dollar',
- 'promise'
- ], function( $, promise ) {
-
- var noop = function() {},
- call = Function.call;
-
- // http://jsperf.com/uncurrythis
- // 反科里化
- function uncurryThis( fn ) {
- return function() {
- return call.apply( fn, arguments );
- };
- }
-
- function bindFn( fn, context ) {
- return function() {
- return fn.apply( context, arguments );
- };
- }
-
- function createObject( proto ) {
- var f;
-
- if ( Object.create ) {
- return Object.create( proto );
- } else {
- f = function() {};
- f.prototype = proto;
- return new f();
- }
- }
-
-
- /**
- * 基础类,提供一些简单常用的方法。
- * @class Base
- */
- return {
-
- /**
- * @property {String} version 当前版本号。
- */
- version: '0.1.2',
-
- /**
- * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
- */
- $: $,
-
- Deferred: promise.Deferred,
-
- isPromise: promise.isPromise,
-
- when: promise.when,
-
- /**
- * @description 简单的浏览器检查结果。
- *
- * * `webkit` webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
- * * `chrome` chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
- * * `ie` ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
- * * `firefox` firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
- * * `safari` safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
- * * `opera` opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
- *
- * @property {Object} [browser]
- */
- browser: (function( ua ) {
- var ret = {},
- webkit = ua.match( /WebKit\/([\d.]+)/ ),
- chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
- ua.match( /CriOS\/([\d.]+)/ ),
-
- ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
- ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i),
- firefox = ua.match( /Firefox\/([\d.]+)/ ),
- safari = ua.match( /Safari\/([\d.]+)/ ),
- opera = ua.match( /OPR\/([\d.]+)/ );
-
- webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
- chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
- ie && (ret.ie = parseFloat( ie[ 1 ] ));
- firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
- safari && (ret.safari = parseFloat( safari[ 1 ] ));
- opera && (ret.opera = parseFloat( opera[ 1 ] ));
-
- return ret;
- })( navigator.userAgent ),
-
- /**
- * @description 操作系统检查结果。
- *
- * * `android` 如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
- * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
- * @property {Object} [os]
- */
- os: (function( ua ) {
- var ret = {},
-
- // osx = !!ua.match( /\(Macintosh\; Intel / ),
- android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
- ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
-
- // osx && (ret.osx = true);
- android && (ret.android = parseFloat( android[ 1 ] ));
- ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
-
- return ret;
- })( navigator.userAgent ),
-
- /**
- * 实现类与类之间的继承。
- * @method inherits
- * @grammar Base.inherits( super ) => child
- * @grammar Base.inherits( super, protos ) => child
- * @grammar Base.inherits( super, protos, statics ) => child
- * @param {Class} super 父类
- * @param {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
- * @param {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
- * @param {Object} [statics] 静态属性或方法。
- * @return {Class} 返回子类。
- * @example
- * function Person() {
- * console.log( 'Super' );
- * }
- * Person.prototype.hello = function() {
- * console.log( 'hello' );
- * };
- *
- * var Manager = Base.inherits( Person, {
- * world: function() {
- * console.log( 'World' );
- * }
- * });
- *
- * // 因为没有指定构造器,父类的构造器将会执行。
- * var instance = new Manager(); // => Super
- *
- * // 继承子父类的方法
- * instance.hello(); // => hello
- * instance.world(); // => World
- *
- * // 子类的__super__属性指向父类
- * console.log( Manager.__super__ === Person ); // => true
- */
- inherits: function( Super, protos, staticProtos ) {
- var child;
-
- if ( typeof protos === 'function' ) {
- child = protos;
- protos = null;
- } else if ( protos && protos.hasOwnProperty('constructor') ) {
- child = protos.constructor;
- } else {
- child = function() {
- return Super.apply( this, arguments );
- };
- }
-
- // 复制静态方法
- $.extend( true, child, Super, staticProtos || {} );
-
- /* jshint camelcase: false */
-
- // 让子类的__super__属性指向父类。
- child.__super__ = Super.prototype;
-
- // 构建原型,添加原型方法或属性。
- // 暂时用Object.create实现。
- child.prototype = createObject( Super.prototype );
- protos && $.extend( true, child.prototype, protos );
-
- return child;
- },
-
- /**
- * 一个不做任何事情的方法。可以用来赋值给默认的callback.
- * @method noop
- */
- noop: noop,
-
- /**
- * 返回一个新的方法,此方法将已指定的`context`来执行。
- * @grammar Base.bindFn( fn, context ) => Function
- * @method bindFn
- * @example
- * var doSomething = function() {
- * console.log( this.name );
- * },
- * obj = {
- * name: 'Object Name'
- * },
- * aliasFn = Base.bind( doSomething, obj );
- *
- * aliasFn(); // => Object Name
- *
- */
- bindFn: bindFn,
-
- /**
- * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。
- * @grammar Base.log( args... ) => undefined
- * @method log
- */
- log: (function() {
- if ( window.console ) {
- return bindFn( console.log, console );
- }
- return noop;
- })(),
-
- nextTick: (function() {
-
- return function( cb ) {
- setTimeout( cb, 1 );
- };
-
- // @bug 当浏览器不在当前窗口时就停了。
- // var next = window.requestAnimationFrame ||
- // window.webkitRequestAnimationFrame ||
- // window.mozRequestAnimationFrame ||
- // function( cb ) {
- // window.setTimeout( cb, 1000 / 60 );
- // };
-
- // // fix: Uncaught TypeError: Illegal invocation
- // return bindFn( next, window );
- })(),
-
- /**
- * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
- * 将用来将非数组对象转化成数组对象。
- * @grammar Base.slice( target, start[, end] ) => Array
- * @method slice
- * @example
- * function doSomthing() {
- * var args = Base.slice( arguments, 1 );
- * console.log( args );
- * }
- *
- * doSomthing( 'ignored', 'arg2', 'arg3' ); // => Array ["arg2", "arg3"]
- */
- slice: uncurryThis( [].slice ),
-
- /**
- * 生成唯一的ID
- * @method guid
- * @grammar Base.guid() => String
- * @grammar Base.guid( prefx ) => String
- */
- guid: (function() {
- var counter = 0;
-
- return function( prefix ) {
- var guid = (+new Date()).toString( 32 ),
- i = 0;
-
- for ( ; i < 5; i++ ) {
- guid += Math.floor( Math.random() * 65535 ).toString( 32 );
- }
-
- return (prefix || 'wu_') + guid + (counter++).toString( 32 );
- };
- })(),
-
- /**
- * 格式化文件大小, 输出成带单位的字符串
- * @method formatSize
- * @grammar Base.formatSize( size ) => String
- * @grammar Base.formatSize( size, pointLength ) => String
- * @grammar Base.formatSize( size, pointLength, units ) => String
- * @param {Number} size 文件大小
- * @param {Number} [pointLength=2] 精确到的小数点数。
- * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
- * @example
- * console.log( Base.formatSize( 100 ) ); // => 100B
- * console.log( Base.formatSize( 1024 ) ); // => 1.00K
- * console.log( Base.formatSize( 1024, 0 ) ); // => 1K
- * console.log( Base.formatSize( 1024 * 1024 ) ); // => 1.00M
- * console.log( Base.formatSize( 1024 * 1024 * 1024 ) ); // => 1.00G
- * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) ); // => 1024MB
- */
- formatSize: function( size, pointLength, units ) {
- var unit;
-
- units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
-
- while ( (unit = units.shift()) && size > 1024 ) {
- size = size / 1024;
- }
-
- return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
- unit;
- }
- };
- });
- /**
- * 事件处理类,可以独立使用,也可以扩展给对象使用。
- * @fileOverview Mediator
- */
- define('mediator',[
- 'base'
- ], function( Base ) {
- var $ = Base.$,
- slice = [].slice,
- separator = /\s+/,
- protos;
-
- // 根据条件过滤出事件handlers.
- function findHandlers( arr, name, callback, context ) {
- return $.grep( arr, function( handler ) {
- return handler &&
- (!name || handler.e === name) &&
- (!callback || handler.cb === callback ||
- handler.cb._cb === callback) &&
- (!context || handler.ctx === context);
- });
- }
-
- function eachEvent( events, callback, iterator ) {
- // 不支持对象,只支持多个event用空格隔开
- $.each( (events || '').split( separator ), function( _, key ) {
- iterator( key, callback );
- });
- }
-
- function triggerHanders( events, args ) {
- var stoped = false,
- i = -1,
- len = events.length,
- handler;
-
- while ( ++i < len ) {
- handler = events[ i ];
-
- if ( handler.cb.apply( handler.ctx2, args ) === false ) {
- stoped = true;
- break;
- }
- }
-
- return !stoped;
- }
-
- protos = {
-
- /**
- * 绑定事件。
- *
- * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
- * ```javascript
- * var obj = {};
- *
- * // 使得obj有事件行为
- * Mediator.installTo( obj );
- *
- * obj.on( 'testa', function( arg1, arg2 ) {
- * console.log( arg1, arg2 ); // => 'arg1', 'arg2'
- * });
- *
- * obj.trigger( 'testa', 'arg1', 'arg2' );
- * ```
- *
- * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
- * 切会影响到`trigger`方法的返回值,为`false`。
- *
- * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
- * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
- * ```javascript
- * obj.on( 'all', function( type, arg1, arg2 ) {
- * console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
- * });
- * ```
- *
- * @method on
- * @grammar on( name, callback[, context] ) => self
- * @param {String} name 事件名,支持多个事件用空格隔开
- * @param {Function} callback 事件处理器
- * @param {Object} [context] 事件处理器的上下文。
- * @return {self} 返回自身,方便链式
- * @chainable
- * @class Mediator
- */
- on: function( name, callback, context ) {
- var me = this,
- set;
-
- if ( !callback ) {
- return this;
- }
-
- set = this._events || (this._events = []);
-
- eachEvent( name, callback, function( name, callback ) {
- var handler = { e: name };
-
- handler.cb = callback;
- handler.ctx = context;
- handler.ctx2 = context || me;
- handler.id = set.length;
-
- set.push( handler );
- });
-
- return this;
- },
-
- /**
- * 绑定事件,且当handler执行完后,自动解除绑定。
- * @method once
- * @grammar once( name, callback[, context] ) => self
- * @param {String} name 事件名
- * @param {Function} callback 事件处理器
- * @param {Object} [context] 事件处理器的上下文。
- * @return {self} 返回自身,方便链式
- * @chainable
- */
- once: function( name, callback, context ) {
- var me = this;
-
- if ( !callback ) {
- return me;
- }
-
- eachEvent( name, callback, function( name, callback ) {
- var once = function() {
- me.off( name, once );
- return callback.apply( context || me, arguments );
- };
-
- once._cb = callback;
- me.on( name, once, context );
- });
-
- return me;
- },
-
- /**
- * 解除事件绑定
- * @method off
- * @grammar off( [name[, callback[, context] ] ] ) => self
- * @param {String} [name] 事件名
- * @param {Function} [callback] 事件处理器
- * @param {Object} [context] 事件处理器的上下文。
- * @return {self} 返回自身,方便链式
- * @chainable
- */
- off: function( name, cb, ctx ) {
- var events = this._events;
-
- if ( !events ) {
- return this;
- }
-
- if ( !name && !cb && !ctx ) {
- this._events = [];
- return this;
- }
-
- eachEvent( name, cb, function( name, cb ) {
- $.each( findHandlers( events, name, cb, ctx ), function() {
- delete events[ this.id ];
- });
- });
-
- return this;
- },
-
- /**
- * 触发事件
- * @method trigger
- * @grammar trigger( name[, args...] ) => self
- * @param {String} type 事件名
- * @param {*} [...] 任意参数
- * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
- */
- trigger: function( type ) {
- var args, events, allEvents;
-
- if ( !this._events || !type ) {
- return this;
- }
-
- args = slice.call( arguments, 1 );
- events = findHandlers( this._events, type );
- allEvents = findHandlers( this._events, 'all' );
-
- return triggerHanders( events, args ) &&
- triggerHanders( allEvents, arguments );
- }
- };
-
- /**
- * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
- * 主要目的是负责模块与模块之间的合作,降低耦合度。
- *
- * @class Mediator
- */
- return $.extend({
-
- /**
- * 可以通过这个接口,使任何对象具备事件功能。
- * @method installTo
- * @param {Object} obj 需要具备事件行为的对象。
- * @return {Object} 返回obj.
- */
- installTo: function( obj ) {
- return $.extend( obj, protos );
- }
-
- }, protos );
- });
- /**
- * @fileOverview Uploader上传类
- */
- define('uploader',[
- 'base',
- 'mediator'
- ], function( Base, Mediator ) {
-
- var $ = Base.$;
-
- /**
- * 上传入口类。
- * @class Uploader
- * @constructor
- * @grammar new Uploader( opts ) => Uploader
- * @example
- * var uploader = WebUploader.Uploader({
- * swf: 'path_of_swf/Uploader.swf',
- *
- * // 开起分片上传。
- * chunked: true
- * });
- */
- function Uploader( opts ) {
- this.options = $.extend( true, {}, Uploader.options, opts );
- this._init( this.options );
- }
-
- // default Options
- // widgets中有相应扩展
- Uploader.options = {};
- Mediator.installTo( Uploader.prototype );
-
- // 批量添加纯命令式方法。
- $.each({
- upload: 'start-upload',
- stop: 'stop-upload',
- getFile: 'get-file',
- getFiles: 'get-files',
- addFile: 'add-file',
- addFiles: 'add-file',
- sort: 'sort-files',
- removeFile: 'remove-file',
- skipFile: 'skip-file',
- retry: 'retry',
- isInProgress: 'is-in-progress',
- makeThumb: 'make-thumb',
- getDimension: 'get-dimension',
- addButton: 'add-btn',
- getRuntimeType: 'get-runtime-type',
- refresh: 'refresh',
- disable: 'disable',
- enable: 'enable',
- reset: 'reset'
- }, function( fn, command ) {
- Uploader.prototype[ fn ] = function() {
- return this.request( command, arguments );
- };
- });
-
- $.extend( Uploader.prototype, {
- state: 'pending',
-
- _init: function( opts ) {
- var me = this;
-
- me.request( 'init', opts, function() {
- me.state = 'ready';
- me.trigger('ready');
- });
- },
-
- /**
- * 获取或者设置Uploader配置项。
- * @method option
- * @grammar option( key ) => *
- * @grammar option( key, val ) => self
- * @example
- *
- * // 初始状态图片上传前不会压缩
- * var uploader = new WebUploader.Uploader({
- * resize: null;
- * });
- *
- * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
- * uploader.options( 'resize', {
- * width: 1600,
- * height: 1600
- * });
- */
- option: function( key, val ) {
- var opts = this.options;
-
- // setter
- if ( arguments.length > 1 ) {
-
- if ( $.isPlainObject( val ) &&
- $.isPlainObject( opts[ key ] ) ) {
- $.extend( opts[ key ], val );
- } else {
- opts[ key ] = val;
- }
-
- } else { // getter
- return key ? opts[ key ] : opts;
- }
- },
-
- /**
- * 获取文件统计信息。返回一个包含一下信息的对象。
- * * `successNum` 上传成功的文件数
- * * `uploadFailNum` 上传失败的文件数
- * * `cancelNum` 被删除的文件数
- * * `invalidNum` 无效的文件数
- * * `queueNum` 还在队列中的文件数
- * @method getStats
- * @grammar getStats() => Object
- */
- getStats: function() {
- // return this._mgr.getStats.apply( this._mgr, arguments );
- var stats = this.request('get-stats');
-
- return {
- successNum: stats.numOfSuccess,
-
- // who care?
- // queueFailNum: 0,
- cancelNum: stats.numOfCancel,
- invalidNum: stats.numOfInvalid,
- uploadFailNum: stats.numOfUploadFailed,
- queueNum: stats.numOfQueue
- };
- },
-
- // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
- trigger: function( type/*, args...*/ ) {
- var args = [].slice.call( arguments, 1 ),
- opts = this.options,
- name = 'on' + type.substring( 0, 1 ).toUpperCase() +
- type.substring( 1 );
-
- if (
- // 调用通过on方法注册的handler.
- Mediator.trigger.apply( this, arguments ) === false ||
-
- // 调用opts.onEvent
- $.isFunction( opts[ name ] ) &&
- opts[ name ].apply( this, args ) === false ||
-
- // 调用this.onEvent
- $.isFunction( this[ name ] ) &&
- this[ name ].apply( this, args ) === false ||
-
- // 广播所有uploader的事件。
- Mediator.trigger.apply( Mediator,
- [ this, type ].concat( args ) ) === false ) {
-
- return false;
- }
-
- return true;
- },
-
- // widgets/widget.js将补充此方法的详细文档。
- request: Base.noop
- });
-
- /**
- * 创建Uploader实例,等同于new Uploader( opts );
- * @method create
- * @class Base
- * @static
- * @grammar Base.create( opts ) => Uploader
- */
- Base.create = Uploader.create = function( opts ) {
- return new Uploader( opts );
- };
-
- // 暴露Uploader,可以通过它来扩展业务逻辑。
- Base.Uploader = Uploader;
-
- return Uploader;
- });
- /**
- * @fileOverview Runtime管理器,负责Runtime的选择, 连接
- */
- define('runtime/runtime',[
- 'base',
- 'mediator'
- ], function( Base, Mediator ) {
-
- var $ = Base.$,
- factories = {},
-
- // 获取对象的第一个key
- getFirstKey = function( obj ) {
- for ( var key in obj ) {
- if ( obj.hasOwnProperty( key ) ) {
- return key;
- }
- }
- return null;
- };
-
- // 接口类。
- function Runtime( options ) {
- this.options = $.extend({
- container: document.body
- }, options );
- this.uid = Base.guid('rt_');
- }
-
- $.extend( Runtime.prototype, {
-
- getContainer: function() {
- var opts = this.options,
- parent, container;
-
- if ( this._container ) {
- return this._container;
- }
-
- parent = $( opts.container || document.body );
- container = $( document.createElement('div') );
-
- container.attr( 'id', 'rt_' + this.uid );
- container.css({
- position: 'absolute',
- top: '0px',
- left: '0px',
- width: '1px',
- height: '1px',
- overflow: 'hidden'
- });
-
- parent.append( container );
- parent.addClass('webuploader-container');
- this._container = container;
- return container;
- },
-
- init: Base.noop,
- exec: Base.noop,
-
- destroy: function() {
- if ( this._container ) {
- this._container.parentNode.removeChild( this.__container );
- }
-
- this.off();
- }
- });
-
- Runtime.orders = 'html5,flash';
-
-
- /**
- * 添加Runtime实现。
- * @param {String} type 类型
- * @param {Runtime} factory 具体Runtime实现。
- */
- Runtime.addRuntime = function( type, factory ) {
- factories[ type ] = factory;
- };
-
- Runtime.hasRuntime = function( type ) {
- return !!(type ? factories[ type ] : getFirstKey( factories ));
- };
-
- Runtime.create = function( opts, orders ) {
- var type, runtime;
-
- orders = orders || Runtime.orders;
- $.each( orders.split( /\s*,\s*/g ), function() {
- if ( factories[ this ] ) {
- type = this;
- return false;
- }
- });
-
- type = type || getFirstKey( factories );
-
- if ( !type ) {
- throw new Error('Runtime Error');
- }
-
- runtime = new factories[ type ]( opts );
- return runtime;
- };
-
- Mediator.installTo( Runtime.prototype );
- return Runtime;
- });
-
- /**
- * @fileOverview Runtime管理器,负责Runtime的选择, 连接
- */
- define('runtime/client',[
- 'base',
- 'mediator',
- 'runtime/runtime'
- ], function( Base, Mediator, Runtime ) {
-
- var cache;
-
- cache = (function() {
- var obj = {};
-
- return {
- add: function( runtime ) {
- obj[ runtime.uid ] = runtime;
- },
-
- get: function( ruid, standalone ) {
- var i;
-
- if ( ruid ) {
- return obj[ ruid ];
- }
-
- for ( i in obj ) {
- // 有些类型不能重用,比如filepicker.
- if ( standalone && obj[ i ].__standalone ) {
- continue;
- }
-
- return obj[ i ];
- }
-
- return null;
- },
-
- remove: function( runtime ) {
- delete obj[ runtime.uid ];
- }
- };
- })();
-
- function RuntimeClient( component, standalone ) {
- var deferred = Base.Deferred(),
- runtime;
-
- this.uid = Base.guid('client_');
-
- // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
- this.runtimeReady = function( cb ) {
- return deferred.done( cb );
- };
-
- this.connectRuntime = function( opts, cb ) {
-
- // already connected.
- if ( runtime ) {
- throw new Error('already connected!');
- }
-
- deferred.done( cb );
-
- if ( typeof opts === 'string' && cache.get( opts ) ) {
- runtime = cache.get( opts );
- }
-
- // 像filePicker只能独立存在,不能公用。
- runtime = runtime || cache.get( null, standalone );
-
- // 需要创建
- if ( !runtime ) {
- runtime = Runtime.create( opts, opts.runtimeOrder );
- runtime.__promise = deferred.promise();
- runtime.once( 'ready', deferred.resolve );
- runtime.init();
- cache.add( runtime );
- runtime.__client = 1;
- } else {
- // 来自cache
- Base.$.extend( runtime.options, opts );
- runtime.__promise.then( deferred.resolve );
- runtime.__client++;
- }
-
- standalone && (runtime.__standalone = standalone);
- return runtime;
- };
-
- this.getRuntime = function() {
- return runtime;
- };
-
- this.disconnectRuntime = function() {
- if ( !runtime ) {
- return;
- }
-
- runtime.__client--;
-
- if ( runtime.__client <= 0 ) {
- cache.remove( runtime );
- delete runtime.__promise;
- runtime.destroy();
- }
-
- runtime = null;
- };
-
- this.exec = function() {
- if ( !runtime ) {
- return;
- }
-
- var args = Base.slice( arguments );
- component && args.unshift( component );
-
- return runtime.exec.apply( this, args );
- };
-
- this.getRuid = function() {
- return runtime && runtime.uid;
- };
-
- this.destroy = (function( destroy ) {
- return function() {
- destroy && destroy.apply( this, arguments );
- this.trigger('destroy');
- this.off();
- this.exec('destroy');
- this.disconnectRuntime();
- };
- })( this.destroy );
- }
-
- Mediator.installTo( RuntimeClient.prototype );
- return RuntimeClient;
- });
- /**
- * @fileOverview 错误信息
- */
- define('lib/dnd',[
- 'base',
- 'mediator',
- 'runtime/client'
- ], function( Base, Mediator, RuntimeClent ) {
-
- var $ = Base.$;
-
- function DragAndDrop( opts ) {
- opts = this.options = $.extend({}, DragAndDrop.options, opts );
-
- opts.container = $( opts.container );
-
- if ( !opts.container.length ) {
- return;
- }
-
- RuntimeClent.call( this, 'DragAndDrop' );
- }
-
- DragAndDrop.options = {
- accept: null,
- disableGlobalDnd: false
- };
-
- Base.inherits( RuntimeClent, {
- constructor: DragAndDrop,
-
- init: function() {
- var me = this;
-
- me.connectRuntime( me.options, function() {
- me.exec('init');
- me.trigger('ready');
- });
- },
-
- destroy: function() {
- this.disconnectRuntime();
- }
- });
-
- Mediator.installTo( DragAndDrop.prototype );
-
- return DragAndDrop;
- });
- /**
- * @fileOverview 组件基类。
- */
- define('widgets/widget',[
- 'base',
- 'uploader'
- ], function( Base, Uploader ) {
-
- var $ = Base.$,
- _init = Uploader.prototype._init,
- IGNORE = {},
- widgetClass = [];
-
- function isArrayLike( obj ) {
- if ( !obj ) {
- return false;
- }
-
- var length = obj.length,
- type = $.type( obj );
-
- if ( obj.nodeType === 1 && length ) {
- return true;
- }
-
- return type === 'array' || type !== 'function' && type !== 'string' &&
- (length === 0 || typeof length === 'number' && length > 0 &&
- (length - 1) in obj);
- }
-
- function Widget( uploader ) {
- this.owner = uploader;
- this.options = uploader.options;
- }
-
- $.extend( Widget.prototype, {
-
- init: Base.noop,
-
- // 类Backbone的事件监听声明,监听uploader实例上的事件
- // widget直接无法监听事件,事件只能通过uploader来传递
- invoke: function( apiName, args ) {
-
- /*
- {
- 'make-thumb': 'makeThumb'
- }
- */
- var map = this.responseMap;
-
- // 如果无API响应声明则忽略
- if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
- !$.isFunction( this[ map[ apiName ] ] ) ) {
-
- return IGNORE;
- }
-
- return this[ map[ apiName ] ].apply( this, args );
-
- },
-
- /**
- * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
- * @method request
- * @grammar request( command, args ) => * | Promise
- * @grammar request( command, args, callback ) => Promise
- * @for Uploader
- */
- request: function() {
- return this.owner.request.apply( this.owner, arguments );
- }
- });
-
- // 扩展Uploader.
- $.extend( Uploader.prototype, {
-
- // 覆写_init用来初始化widgets
- _init: function() {
- var me = this,
- widgets = me._widgets = [];
-
- $.each( widgetClass, function( _, klass ) {
- widgets.push( new klass( me ) );
- });
-
- return _init.apply( me, arguments );
- },
-
- request: function( apiName, args, callback ) {
- var i = 0,
- widgets = this._widgets,
- len = widgets.length,
- rlts = [],
- dfds = [],
- widget, rlt, promise, key;
-
- args = isArrayLike( args ) ? args : [ args ];
-
- for ( ; i < len; i++ ) {
- widget = widgets[ i ];
- rlt = widget.invoke( apiName, args );
-
- if ( rlt !== IGNORE ) {
-
- // Deferred对象
- if ( Base.isPromise( rlt ) ) {
- dfds.push( rlt );
- } else {
- rlts.push( rlt );
- }
- }
- }
-
- // 如果有callback,则用异步方式。
- if ( callback || dfds.length ) {
- promise = Base.when.apply( Base, dfds );
- key = promise.pipe ? 'pipe' : 'then';
-
- // 很重要不能删除。删除了会死循环。
- // 保证执行顺序。让callback总是在下一个tick中执行。
- return promise[ key ](function() {
- var deferred = Base.Deferred(),
- args = arguments;
-
- setTimeout(function() {
- deferred.resolve.apply( deferred, args );
- }, 1 );
-
- return deferred.promise();
- })[ key ]( callback || Base.noop );
- } else {
- return rlts[ 0 ];
- }
- }
- });
-
- /**
- * 添加组件
- * @param {object} widgetProto 组件原型,构造函数通过constructor属性定义
- * @param {object} responseMap API名称与函数实现的映射
- * @example
- * Uploader.register( {
- * init: function( options ) {},
- * makeThumb: function() {}
- * }, {
- * 'make-thumb': 'makeThumb'
- * } );
- */
- Uploader.register = Widget.register = function( responseMap, widgetProto ) {
- var map = { init: 'init' },
- klass;
-
- if ( arguments.length === 1 ) {
- widgetProto = responseMap;
- widgetProto.responseMap = map;
- } else {
- widgetProto.responseMap = $.extend( map, responseMap );
- }
-
- klass = Base.inherits( Widget, widgetProto );
- widgetClass.push( klass );
-
- return klass;
- };
-
- return Widget;
- });
- /**
- * @fileOverview DragAndDrop Widget。
- */
- define('widgets/filednd',[
- 'base',
- 'uploader',
- 'lib/dnd',
- 'widgets/widget'
- ], function( Base, Uploader, Dnd ) {
- var $ = Base.$;
-
- Uploader.options.dnd = '';
-
- /**
- * @property {Selector} [dnd=undefined] 指定Drag And Drop拖拽的容器,如果不指定,则不启动。
- * @namespace options
- * @for Uploader
- */
-
- /**
- * @event dndAccept
- * @param {DataTransferItemList} items DataTransferItem
- * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。
- * @for Uploader
- */
- return Uploader.register({
- init: function( opts ) {
-
- if ( !opts.dnd ||
- this.request('predict-runtime-type') !== 'html5' ) {
- return;
- }
-
- var me = this,
- deferred = Base.Deferred(),
- options = $.extend({}, {
- disableGlobalDnd: opts.disableGlobalDnd,
- container: opts.dnd,
- accept: opts.accept
- }),
- dnd;
-
- dnd = new Dnd( options );
-
- dnd.once( 'ready', deferred.resolve );
- dnd.on( 'drop', function( files ) {
- me.request( 'add-file', [ files ]);
- });
-
- // 检测文件是否全部允许添加。
- dnd.on( 'accept', function( items ) {
- return me.owner.trigger( 'dndAccept', items );
- });
-
- dnd.init();
-
- return deferred.promise();
- }
- });
- });
-
- /**
- * @fileOverview 错误信息
- */
- define('lib/filepaste',[
- 'base',
- 'mediator',
- 'runtime/client'
- ], function( Base, Mediator, RuntimeClent ) {
-
- var $ = Base.$;
-
- function FilePaste( opts ) {
- opts = this.options = $.extend({}, opts );
- opts.container = $( opts.container || document.body );
- RuntimeClent.call( this, 'FilePaste' );
- }
-
- Base.inherits( RuntimeClent, {
- constructor: FilePaste,
-
- init: function() {
- var me = this;
-
- me.connectRuntime( me.options, function() {
- me.exec('init');
- me.trigger('ready');
- });
- },
-
- destroy: function() {
- this.exec('destroy');
- this.disconnectRuntime();
- this.off();
- }
- });
-
- Mediator.installTo( FilePaste.prototype );
-
- return FilePaste;
- });
- /**
- * @fileOverview 组件基类。
- */
- define('widgets/filepaste',[
- 'base',
- 'uploader',
- 'lib/filepaste',
- 'widgets/widget'
- ], function( Base, Uploader, FilePaste ) {
- var $ = Base.$;
-
- /**
- * @property {Selector} [paste=undefined] 指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`.
- * @namespace options
- * @for Uploader
- */
- return Uploader.register({
- init: function( opts ) {
-
- if ( !opts.paste ||
- this.request('predict-runtime-type') !== 'html5' ) {
- return;
- }
-
- var me = this,
- deferred = Base.Deferred(),
- options = $.extend({}, {
- container: opts.paste,
- accept: opts.accept
- }),
- paste;
-
- paste = new FilePaste( options );
-
- paste.once( 'ready', deferred.resolve );
- paste.on( 'paste', function( files ) {
- me.owner.request( 'add-file', [ files ]);
- });
- paste.init();
-
- return deferred.promise();
- }
- });
- });
- /**
- * @fileOverview Blob
- */
- define('lib/blob',[
- 'base',
- 'runtime/client'
- ], function( Base, RuntimeClient ) {
-
- function Blob( ruid, source ) {
- var me = this;
-
- me.source = source;
- me.ruid = ruid;
-
- RuntimeClient.call( me, 'Blob' );
-
- this.uid = source.uid || this.uid;
- this.type = source.type || '';
- this.size = source.size || 0;
-
- if ( ruid ) {
- me.connectRuntime( ruid );
- }
- }
-
- Base.inherits( RuntimeClient, {
- constructor: Blob,
-
- slice: function( start, end ) {
- return this.exec( 'slice', start, end );
- },
-
- getSource: function() {
- return this.source;
- }
- });
-
- return Blob;
- });
- /**
- * 为了统一化Flash的File和HTML5的File而存在。
- * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
- * @fileOverview File
- */
- define('lib/file',[
- 'base',
- 'lib/blob'
- ], function( Base, Blob ) {
-
- var uid = 1,
- rExt = /\.([^.]+)$/;
-
- function File( ruid, file ) {
- var ext;
-
- Blob.apply( this, arguments );
- this.name = file.name || ('untitled' + uid++);
- ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
-
- // todo 支持其他类型文件的转换。
-
- // 如果有mimetype, 但是文件名里面没有找出后缀规律
- if ( !ext && this.type ) {
- ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?
- RegExp.$1.toLowerCase() : '';
- this.name += '.' + ext;
- }
-
- // 如果没有指定mimetype, 但是知道文件后缀。
- if ( !this.type && ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {
- this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);
- }
-
- this.ext = ext;
- this.lastModifiedDate = file.lastModifiedDate ||
- (new Date()).toLocaleString();
- }
-
- return Base.inherits( Blob, File );
- });
-
- /**
- * @fileOverview 错误信息
- */
- define('lib/filepicker',[
- 'base',
- 'runtime/client',
- 'lib/file'
- ], function( Base, RuntimeClent, File ) {
-
- var $ = Base.$;
-
- function FilePicker( opts ) {
- opts = this.options = $.extend({}, FilePicker.options, opts );
-
- opts.container = $( opts.id );
-
- if ( !opts.container.length ) {
- throw new Error('按钮指定错误');
- }
-
- opts.innerHTML = opts.innerHTML || opts.label ||
- opts.container.html() || '';
-
- opts.button = $( opts.button || document.createElement('div') );
- opts.button.html( opts.innerHTML );
- opts.container.html( opts.button );
-
- RuntimeClent.call( this, 'FilePicker', true );
- }
-
- FilePicker.options = {
- button: null,
- container: null,
- label: null,
- innerHTML: null,
- multiple: true,
- accept: null,
- name: 'file'
- };
-
- Base.inherits( RuntimeClent, {
- constructor: FilePicker,
-
- init: function() {
- var me = this,
- opts = me.options,
- button = opts.button;
-
- button.addClass('webuploader-pick');
-
- me.on( 'all', function( type ) {
- var files;
-
- switch ( type ) {
- case 'mouseenter':
- button.addClass('webuploader-pick-hover');
- break;
-
- case 'mouseleave':
- button.removeClass('webuploader-pick-hover');
- break;
-
- case 'change':
- files = me.exec('getFiles');
- me.trigger( 'select', $.map( files, function( file ) {
- file = new File( me.getRuid(), file );
-
- // 记录来源。
- file._refer = opts.container;
- return file;
- }), opts.container );
- break;
- }
- });
-
- me.connectRuntime( opts, function() {
- me.refresh();
- me.exec( 'init', opts );
- me.trigger('ready');
- });
-
- $( window ).on( 'resize', function() {
- me.refresh();
- });
- },
-
- refresh: function() {
- var shimContainer = this.getRuntime().getContainer(),
- button = this.options.button,
- width = button.outerWidth ?
- button.outerWidth() : button.width(),
-
- height = button.outerHeight ?
- button.outerHeight() : button.height(),
-
- pos = button.offset();
-
- width && height && shimContainer.css({
- bottom: 'auto',
- right: 'auto',
- width: width + 'px',
- height: height + 'px'
- }).offset( pos );
- },
-
- enable: function() {
- var btn = this.options.button;
-
- btn.removeClass('webuploader-pick-disable');
- this.refresh();
- },
-
- disable: function() {
- var btn = this.options.button;
-
- this.getRuntime().getContainer().css({
- top: '-99999px'
- });
-
- btn.addClass('webuploader-pick-disable');
- },
-
- destroy: function() {
- if ( this.runtime ) {
- this.exec('destroy');
- this.disconnectRuntime();
- }
- }
- });
-
- return FilePicker;
- });
-
- /**
- * @fileOverview 文件选择相关
- */
- define('widgets/filepicker',[
- 'base',
- 'uploader',
- 'lib/filepicker',
- 'widgets/widget'
- ], function( Base, Uploader, FilePicker ) {
- var $ = Base.$;
-
- $.extend( Uploader.options, {
-
- /**
- * @property {Selector | Object} [pick=undefined]
- * @namespace options
- * @for Uploader
- * @description 指定选择文件的按钮容器,不指定则不创建按钮。
- *
- * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。
- * * `label` {String} 请采用 `innerHTML` 代替
- * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
- * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
- */
- pick: null,
-
- /**
- * @property {Arroy} [accept=null]
- * @namespace options
- * @for Uploader
- * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
- *
- * * `title` {String} 文字描述
- * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
- * * `mimeTypes` {String} 多个用逗号分割。
- *
- * 如:
- *
- * ```
- * {
- * title: 'Images',
- * extensions: 'gif,jpg,jpeg,bmp,png',
- * mimeTypes: 'image/*'
- * }
- * ```
- */
- accept: null/*{
- title: 'Images',
- extensions: 'gif,jpg,jpeg,bmp,png',
- mimeTypes: 'image/*'
- }*/
- });
-
- return Uploader.register({
- 'add-btn': 'addButton',
- refresh: 'refresh',
- disable: 'disable',
- enable: 'enable'
- }, {
-
- init: function( opts ) {
- this.pickers = [];
- return opts.pick && this.addButton( opts.pick );
- },
-
- refresh: function() {
- $.each( this.pickers, function() {
- this.refresh();
- });
- },
-
- /**
- * @method addButton
- * @for Uploader
- * @grammar addButton( pick ) => Promise
- * @description
- * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
- * @example
- * uploader.addButton({
- * id: '#btnContainer',
- * innerHTML: '选择文件'
- * });
- */
- addButton: function( pick ) {
- var me = this,
- opts = me.options,
- accept = opts.accept,
- options, picker, deferred;
-
- if ( !pick ) {
- return;
- }
-
- deferred = Base.Deferred();
- $.isPlainObject( pick ) || (pick = {
- id: pick
- });
-
- options = $.extend({}, pick, {
- accept: $.isPlainObject( accept ) ? [ accept ] : accept,
- swf: opts.swf,
- runtimeOrder: opts.runtimeOrder
- });
-
- picker = new FilePicker( options );
-
- picker.once( 'ready', deferred.resolve );
- picker.on( 'select', function( files ) {
- me.owner.request( 'add-file', [ files ]);
- });
- picker.init();
-
- this.pickers.push( picker );
-
- return deferred.promise();
- },
-
- disable: function() {
- $.each( this.pickers, function() {
- this.disable();
- });
- },
-
- enable: function() {
- $.each( this.pickers, function() {
- this.enable();
- });
- }
- });
- });
- /**
- * @fileOverview Image
- */
- define('lib/image',[
- 'base',
- 'runtime/client',
- 'lib/blob'
- ], function( Base, RuntimeClient, Blob ) {
- var $ = Base.$;
-
- // 构造器。
- function Image( opts ) {
- this.options = $.extend({}, Image.options, opts );
- RuntimeClient.call( this, 'Image' );
-
- this.on( 'load', function() {
- this._info = this.exec('info');
- this._meta = this.exec('meta');
- });
- }
-
- // 默认选项。
- Image.options = {
-
- // 默认的图片处理质量
- quality: 90,
-
- // 是否裁剪
- crop: false,
-
- // 是否保留头部信息
- preserveHeaders: true,
-
- // 是否允许放大。
- allowMagnify: true
- };
-
- // 继承RuntimeClient.
- Base.inherits( RuntimeClient, {
- constructor: Image,
-
- info: function( val ) {
-
- // setter
- if ( val ) {
- this._info = val;
- return this;
- }
-
- // getter
- return this._info;
- },
-
- meta: function( val ) {
-
- // setter
- if ( val ) {
- this._meta = val;
- return this;
- }
-
- // getter
- return this._meta;
- },
-
- loadFromBlob: function( blob ) {
- var me = this,
- ruid = blob.getRuid();
-
- this.connectRuntime( ruid, function() {
- me.exec( 'init', me.options );
- me.exec( 'loadFromBlob', blob );
- });
- },
-
- resize: function() {
- var args = Base.slice( arguments );
- return this.exec.apply( this, [ 'resize' ].concat( args ) );
- },
-
- getAsDataUrl: function( type ) {
- return this.exec( 'getAsDataUrl', type );
- },
-
- getAsBlob: function( type ) {
- var blob = this.exec( 'getAsBlob', type );
-
- return new Blob( this.getRuid(), blob );
- }
- });
-
- return Image;
- });
- /**
- * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
- */
- define('widgets/image',[
- 'base',
- 'uploader',
- 'lib/image',
- 'widgets/widget'
- ], function( Base, Uploader, Image ) {
-
- var $ = Base.$,
- throttle;
-
- // 根据要处理的文件大小来节流,一次不能处理太多,会卡。
- throttle = (function( max ) {
- var occupied = 0,
- waiting = [],
- tick = function() {
- var item;
-
- while ( waiting.length && occupied < max ) {
- item = waiting.shift();
- occupied += item[ 0 ];
- item[ 1 ]();
- }
- };
-
- return function( emiter, size, cb ) {
- waiting.push([ size, cb ]);
- emiter.once( 'destroy', function() {
- occupied -= size;
- setTimeout( tick, 1 );
- });
- setTimeout( tick, 1 );
- };
- })( 5 * 1024 * 1024 );
-
- $.extend( Uploader.options, {
-
- /**
- * @property {Object} [thumb]
- * @namespace options
- * @for Uploader
- * @description 配置生成缩略图的选项。
- *
- * 默认为:
- *
- * ```javascript
- * {
- * width: 110,
- * height: 110,
- *
- * // 图片质量,只有type为`image/jpeg`的时候才有效。
- * quality: 70,
- *
- * // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
- * allowMagnify: true,
- *
- * // 是否允许裁剪。
- * crop: true,
- *
- * // 是否保留头部meta信息。
- * preserveHeaders: false,
- *
- * // 为空的话则保留原有图片格式。
- * // 否则强制转换成指定的类型。
- * type: 'image/jpeg'
- * }
- * ```
- */
- thumb: {
- width: 110,
- height: 110,
- quality: 70,
- allowMagnify: true,
- crop: true,
- preserveHeaders: false,
-
- // 为空的话则保留原有图片格式。
- // 否则强制转换成指定的类型。
- // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
- // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
- type: 'image/jpeg'
- },
-
- /**
- * @property {Object} [compress]
- * @namespace options
- * @for Uploader
- * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。
- *
- * 默认为:
- *
- * ```javascript
- * {
- * width: 1600,
- * height: 1600,
- *
- * // 图片质量,只有type为`image/jpeg`的时候才有效。
- * quality: 90,
- *
- * // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
- * allowMagnify: false,
- *
- * // 是否允许裁剪。
- * crop: false,
- *
- * // 是否保留头部meta信息。
- * preserveHeaders: true
- * }
- * ```
- */
- compress: {
- width: 1600,
- height: 1600,
- quality: 90,
- allowMagnify: false,
- crop: false,
- preserveHeaders: true
- }
- });
-
- return Uploader.register({
- 'make-thumb': 'makeThumb',
- 'before-send-file': 'compressImage'
- }, {
-
-
- /**
- * 生成缩略图,此过程为异步,所以需要传入`callback`。
- * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
- *
- * `callback`中可以接收到两个参数。
- * * 第一个为error,如果生成缩略图有错误,此error将为真。
- * * 第二个为ret, 缩略图的Data URL值。
- *
- * **注意**
- * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。
- *
- *
- * @method makeThumb
- * @grammar makeThumb( file, callback ) => undefined
- * @grammar makeThumb( file, callback, width, height ) => undefined
- * @for Uploader
- * @example
- *
- * uploader.on( 'fileQueued', function( file ) {
- * var $li = ...;
- *
- * uploader.makeThumb( file, function( error, ret ) {
- * if ( error ) {
- * $li.text('预览错误');
- * } else {
- * $li.append(' ');
- * }
- * });
- *
- * });
- */
- makeThumb: function( file, cb, width, height ) {
- var opts, image;
-
- file = this.request( 'get-file', file );
-
- // 只预览图片格式。
- if ( !file.type.match( /^image/ ) ) {
- cb( true );
- return;
- }
-
- opts = $.extend({}, this.options.thumb );
-
- // 如果传入的是object.
- if ( $.isPlainObject( width ) ) {
- opts = $.extend( opts, width );
- width = null;
- }
-
- width = width || opts.width;
- height = height || opts.height;
-
- image = new Image( opts );
-
- image.once( 'load', function() {
- file._info = file._info || image.info();
- file._meta = file._meta || image.meta();
- image.resize( width, height );
- });
-
- image.once( 'complete', function() {
- cb( false, image.getAsDataUrl( opts.type ) );
- image.destroy();
- });
-
- image.once( 'error', function() {
- cb( true );
- image.destroy();
- });
-
- throttle( image, file.source.size, function() {
- file._info && image.info( file._info );
- file._meta && image.meta( file._meta );
- image.loadFromBlob( file.source );
- });
- },
-
- compressImage: function( file ) {
- var opts = this.options.compress || this.options.resize,
- compressSize = opts && opts.compressSize || 300 * 1024,
- image, deferred;
-
- file = this.request( 'get-file', file );
-
- // 只预览图片格式。
- if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||
- file.size < compressSize ||
- file._compressed ) {
- return;
- }
-
- opts = $.extend({}, opts );
- deferred = Base.Deferred();
-
- image = new Image( opts );
-
- deferred.always(function() {
- image.destroy();
- image = null;
- });
- image.once( 'error', deferred.reject );
- image.once( 'load', function() {
- file._info = file._info || image.info();
- file._meta = file._meta || image.meta();
- image.resize( opts.width, opts.height );
- });
-
- image.once( 'complete', function() {
- var blob, size;
-
- // 移动端 UC / qq 浏览器的无图模式下
- // ctx.getImageData 处理大图的时候会报 Exception
- // INDEX_SIZE_ERR: DOM Exception 1
- try {
- blob = image.getAsBlob( opts.type );
-
- size = file.size;
-
- // 如果压缩后,比原来还大则不用压缩后的。
- if ( blob.size < size ) {
- // file.source.destroy && file.source.destroy();
- file.source = blob;
- file.size = blob.size;
-
- file.trigger( 'resize', blob.size, size );
- }
-
- // 标记,避免重复压缩。
- file._compressed = true;
- deferred.resolve();
- } catch ( e ) {
- // 出错了直接继续,让其上传原始图片
- deferred.resolve();
- }
- });
-
- file._info && image.info( file._info );
- file._meta && image.meta( file._meta );
-
- image.loadFromBlob( file.source );
- return deferred.promise();
- }
- });
- });
- /**
- * @fileOverview 文件属性封装
- */
- define('file',[
- 'base',
- 'mediator'
- ], function( Base, Mediator ) {
-
- var $ = Base.$,
- idPrefix = 'WU_FILE_',
- idSuffix = 0,
- rExt = /\.([^.]+)$/,
- statusMap = {};
-
- function gid() {
- return idPrefix + idSuffix++;
- }
-
- /**
- * 文件类
- * @class File
- * @constructor 构造函数
- * @grammar new File( source ) => File
- * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
- */
- function WUFile( source ) {
-
- /**
- * 文件名,包括扩展名(后缀)
- * @property name
- * @type {string}
- */
- this.name = source.name || 'Untitled';
-
- /**
- * 文件体积(字节)
- * @property size
- * @type {uint}
- * @default 0
- */
- this.size = source.size || 0;
-
- /**
- * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
- * @property type
- * @type {string}
- * @default 'application'
- */
- this.type = source.type || 'application';
-
- /**
- * 文件最后修改日期
- * @property lastModifiedDate
- * @type {int}
- * @default 当前时间戳
- */
- this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
-
- /**
- * 文件ID,每个对象具有唯一ID,与文件名无关
- * @property id
- * @type {string}
- */
- this.id = gid();
-
- /**
- * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
- * @property ext
- * @type {string}
- */
- this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
-
-
- /**
- * 状态文字说明。在不同的status语境下有不同的用途。
- * @property statusText
- * @type {string}
- */
- this.statusText = '';
-
- // 存储文件状态,防止通过属性直接修改
- statusMap[ this.id ] = WUFile.Status.INITED;
-
- this.source = source;
- this.loaded = 0;
-
- this.on( 'error', function( msg ) {
- this.setStatus( WUFile.Status.ERROR, msg );
- });
- }
-
- $.extend( WUFile.prototype, {
-
- /**
- * 设置状态,状态变化时会触发`change`事件。
- * @method setStatus
- * @grammar setStatus( status[, statusText] );
- * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
- * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
- */
- setStatus: function( status, text ) {
-
- var prevStatus = statusMap[ this.id ];
-
- typeof text !== 'undefined' && (this.statusText = text);
-
- if ( status !== prevStatus ) {
- statusMap[ this.id ] = status;
- /**
- * 文件状态变化
- * @event statuschange
- */
- this.trigger( 'statuschange', status, prevStatus );
- }
-
- },
-
- /**
- * 获取文件状态
- * @return {File.Status}
- * @example
- 文件状态具体包括以下几种类型:
- {
- // 初始化
- INITED: 0,
- // 已入队列
- QUEUED: 1,
- // 正在上传
- PROGRESS: 2,
- // 上传出错
- ERROR: 3,
- // 上传成功
- COMPLETE: 4,
- // 上传取消
- CANCELLED: 5
- }
- */
- getStatus: function() {
- return statusMap[ this.id ];
- },
-
- /**
- * 获取文件原始信息。
- * @return {*}
- */
- getSource: function() {
- return this.source;
- },
-
- destory: function() {
- delete statusMap[ this.id ];
- }
- });
-
- Mediator.installTo( WUFile.prototype );
-
- /**
- * 文件状态值,具体包括以下几种类型:
- * * `inited` 初始状态
- * * `queued` 已经进入队列, 等待上传
- * * `progress` 上传中
- * * `complete` 上传完成。
- * * `error` 上传出错,可重试
- * * `interrupt` 上传中断,可续传。
- * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
- * * `cancelled` 文件被移除。
- * @property {Object} Status
- * @namespace File
- * @class File
- * @static
- */
- WUFile.Status = {
- INITED: 'inited', // 初始状态
- QUEUED: 'queued', // 已经进入队列, 等待上传
- PROGRESS: 'progress', // 上传中
- ERROR: 'error', // 上传出错,可重试
- COMPLETE: 'complete', // 上传完成。
- CANCELLED: 'cancelled', // 上传取消。
- INTERRUPT: 'interrupt', // 上传中断,可续传。
- INVALID: 'invalid' // 文件不合格,不能重试上传。
- };
-
- return WUFile;
- });
-
- /**
- * @fileOverview 文件队列
- */
- define('queue',[
- 'base',
- 'mediator',
- 'file'
- ], function( Base, Mediator, WUFile ) {
-
- var $ = Base.$,
- STATUS = WUFile.Status;
-
- /**
- * 文件队列, 用来存储各个状态中的文件。
- * @class Queue
- * @extends Mediator
- */
- function Queue() {
-
- /**
- * 统计文件数。
- * * `numOfQueue` 队列中的文件数。
- * * `numOfSuccess` 上传成功的文件数
- * * `numOfCancel` 被移除的文件数
- * * `numOfProgress` 正在上传中的文件数
- * * `numOfUploadFailed` 上传错误的文件数。
- * * `numOfInvalid` 无效的文件数。
- * @property {Object} stats
- */
- this.stats = {
- numOfQueue: 0,
- numOfSuccess: 0,
- numOfCancel: 0,
- numOfProgress: 0,
- numOfUploadFailed: 0,
- numOfInvalid: 0
- };
-
- // 上传队列,仅包括等待上传的文件
- this._queue = [];
-
- // 存储所有文件
- this._map = {};
- }
-
- $.extend( Queue.prototype, {
-
- /**
- * 将新文件加入对队列尾部
- *
- * @method append
- * @param {File} file 文件对象
- */
- append: function( file ) {
- this._queue.push( file );
- this._fileAdded( file );
- return this;
- },
-
- /**
- * 将新文件加入对队列头部
- *
- * @method prepend
- * @param {File} file 文件对象
- */
- prepend: function( file ) {
- this._queue.unshift( file );
- this._fileAdded( file );
- return this;
- },
-
- /**
- * 获取文件对象
- *
- * @method getFile
- * @param {String} fileId 文件ID
- * @return {File}
- */
- getFile: function( fileId ) {
- if ( typeof fileId !== 'string' ) {
- return fileId;
- }
- return this._map[ fileId ];
- },
-
- /**
- * 从队列中取出一个指定状态的文件。
- * @grammar fetch( status ) => File
- * @method fetch
- * @param {String} status [文件状态值](#WebUploader:File:File.Status)
- * @return {File} [File](#WebUploader:File)
- */
- fetch: function( status ) {
- var len = this._queue.length,
- i, file;
-
- status = status || STATUS.QUEUED;
-
- for ( i = 0; i < len; i++ ) {
- file = this._queue[ i ];
-
- if ( status === file.getStatus() ) {
- return file;
- }
- }
-
- return null;
- },
-
- /**
- * 对队列进行排序,能够控制文件上传顺序。
- * @grammar sort( fn ) => undefined
- * @method sort
- * @param {Function} fn 排序方法
- */
- sort: function( fn ) {
- if ( typeof fn === 'function' ) {
- this._queue.sort( fn );
- }
- },
-
- /**
- * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
- * @grammar getFiles( [status1[, status2 ...]] ) => Array
- * @method getFiles
- * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
- */
- getFiles: function() {
- var sts = [].slice.call( arguments, 0 ),
- ret = [],
- i = 0,
- len = this._queue.length,
- file;
-
- for ( ; i < len; i++ ) {
- file = this._queue[ i ];
-
- if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
- continue;
- }
-
- ret.push( file );
- }
-
- return ret;
- },
-
- _fileAdded: function( file ) {
- var me = this,
- existing = this._map[ file.id ];
-
- if ( !existing ) {
- this._map[ file.id ] = file;
-
- file.on( 'statuschange', function( cur, pre ) {
- me._onFileStatusChange( cur, pre );
- });
- }
-
- file.setStatus( STATUS.QUEUED );
- },
-
- _onFileStatusChange: function( curStatus, preStatus ) {
- var stats = this.stats;
-
- switch ( preStatus ) {
- case STATUS.PROGRESS:
- stats.numOfProgress--;
- break;
-
- case STATUS.QUEUED:
- stats.numOfQueue --;
- break;
-
- case STATUS.ERROR:
- stats.numOfUploadFailed--;
- break;
-
- case STATUS.INVALID:
- stats.numOfInvalid--;
- break;
- }
-
- switch ( curStatus ) {
- case STATUS.QUEUED:
- stats.numOfQueue++;
- break;
-
- case STATUS.PROGRESS:
- stats.numOfProgress++;
- break;
-
- case STATUS.ERROR:
- stats.numOfUploadFailed++;
- break;
-
- case STATUS.COMPLETE:
- stats.numOfSuccess++;
- break;
-
- case STATUS.CANCELLED:
- stats.numOfCancel++;
- break;
-
- case STATUS.INVALID:
- stats.numOfInvalid++;
- break;
- }
- }
-
- });
-
- Mediator.installTo( Queue.prototype );
-
- return Queue;
- });
- /**
- * @fileOverview 队列
- */
- define('widgets/queue',[
- 'base',
- 'uploader',
- 'queue',
- 'file',
- 'lib/file',
- 'runtime/client',
- 'widgets/widget'
- ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
-
- var $ = Base.$,
- rExt = /\.\w+$/,
- Status = WUFile.Status;
-
- return Uploader.register({
- 'sort-files': 'sortFiles',
- 'add-file': 'addFiles',
- 'get-file': 'getFile',
- 'fetch-file': 'fetchFile',
- 'get-stats': 'getStats',
- 'get-files': 'getFiles',
- 'remove-file': 'removeFile',
- 'retry': 'retry',
- 'reset': 'reset',
- 'accept-file': 'acceptFile'
- }, {
-
- init: function( opts ) {
- var me = this,
- deferred, len, i, item, arr, accept, runtime;
-
- if ( $.isPlainObject( opts.accept ) ) {
- opts.accept = [ opts.accept ];
- }
-
- // accept中的中生成匹配正则。
- if ( opts.accept ) {
- arr = [];
-
- for ( i = 0, len = opts.accept.length; i < len; i++ ) {
- item = opts.accept[ i ].extensions;
- item && arr.push( item );
- }
-
- if ( arr.length ) {
- accept = '\\.' + arr.join(',')
- .replace( /,/g, '$|\\.' )
- .replace( /\*/g, '.*' ) + '$';
- }
-
- me.accept = new RegExp( accept, 'i' );
- }
-
- me.queue = new Queue();
- me.stats = me.queue.stats;
-
- // 如果当前不是html5运行时,那就算了。
- // 不执行后续操作
- if ( this.request('predict-runtime-type') !== 'html5' ) {
- return;
- }
-
- // 创建一个 html5 运行时的 placeholder
- // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
- deferred = Base.Deferred();
- runtime = new RuntimeClient('Placeholder');
- runtime.connectRuntime({
- runtimeOrder: 'html5'
- }, function() {
- me._ruid = runtime.getRuid();
- deferred.resolve();
- });
- return deferred.promise();
- },
-
-
- // 为了支持外部直接添加一个原生File对象。
- _wrapFile: function( file ) {
- if ( !(file instanceof WUFile) ) {
-
- if ( !(file instanceof File) ) {
- if ( !this._ruid ) {
- throw new Error('Can\'t add external files.');
- }
- file = new File( this._ruid, file );
- }
-
- file = new WUFile( file );
- }
-
- return file;
- },
-
- // 判断文件是否可以被加入队列
- acceptFile: function( file ) {
- var invalid = !file || file.size < 6 || this.accept &&
-
- // 如果名字中有后缀,才做后缀白名单处理。
- rExt.exec( file.name ) && !this.accept.test( file.name );
-
- return !invalid;
- },
-
-
- /**
- * @event beforeFileQueued
- * @param {File} file File对象
- * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
- * @for Uploader
- */
-
- /**
- * @event fileQueued
- * @param {File} file File对象
- * @description 当文件被加入队列以后触发。
- * @for Uploader
- */
-
- _addFile: function( file ) {
- var me = this;
-
- file = me._wrapFile( file );
-
- // 不过类型判断允许不允许,先派送 `beforeFileQueued`
- if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
- return;
- }
-
- // 类型不匹配,则派送错误事件,并返回。
- if ( !me.acceptFile( file ) ) {
- me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
- return;
- }
-
- me.queue.append( file );
- me.owner.trigger( 'fileQueued', file );
- return file;
- },
-
- getFile: function( fileId ) {
- return this.queue.getFile( fileId );
- },
-
- /**
- * @event filesQueued
- * @param {File} files 数组,内容为原始File(lib/File)对象。
- * @description 当一批文件添加进队列以后触发。
- * @for Uploader
- */
-
- /**
- * @method addFiles
- * @grammar addFiles( file ) => undefined
- * @grammar addFiles( [file1, file2 ...] ) => undefined
- * @param {Array of File or File} [files] Files 对象 数组
- * @description 添加文件到队列
- * @for Uploader
- */
- addFiles: function( files ) {
- var me = this;
-
- if ( !files.length ) {
- files = [ files ];
- }
-
- files = $.map( files, function( file ) {
- return me._addFile( file );
- });
-
- me.owner.trigger( 'filesQueued', files );
-
- if ( me.options.auto ) {
- me.request('start-upload');
- }
- },
-
- getStats: function() {
- return this.stats;
- },
-
- /**
- * @event fileDequeued
- * @param {File} file File对象
- * @description 当文件被移除队列后触发。
- * @for Uploader
- */
-
- /**
- * @method removeFile
- * @grammar removeFile( file ) => undefined
- * @grammar removeFile( id ) => undefined
- * @param {File|id} file File对象或这File对象的id
- * @description 移除某一文件。
- * @for Uploader
- * @example
- *
- * $li.on('click', '.remove-this', function() {
- * uploader.removeFile( file );
- * })
- */
- removeFile: function( file ) {
- var me = this;
-
- file = file.id ? file : me.queue.getFile( file );
-
- file.setStatus( Status.CANCELLED );
- me.owner.trigger( 'fileDequeued', file );
- },
-
- /**
- * @method getFiles
- * @grammar getFiles() => Array
- * @grammar getFiles( status1, status2, status... ) => Array
- * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
- * @for Uploader
- * @example
- * console.log( uploader.getFiles() ); // => all files
- * console.log( uploader.getFiles('error') ) // => all error files.
- */
- getFiles: function() {
- return this.queue.getFiles.apply( this.queue, arguments );
- },
-
- fetchFile: function() {
- return this.queue.fetch.apply( this.queue, arguments );
- },
-
- /**
- * @method retry
- * @grammar retry() => undefined
- * @grammar retry( file ) => undefined
- * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
- * @for Uploader
- * @example
- * function retry() {
- * uploader.retry();
- * }
- */
- retry: function( file, noForceStart ) {
- var me = this,
- files, i, len;
-
- if ( file ) {
- file = file.id ? file : me.queue.getFile( file );
- file.setStatus( Status.QUEUED );
- noForceStart || me.request('start-upload');
- return;
- }
-
- files = me.queue.getFiles( Status.ERROR );
- i = 0;
- len = files.length;
-
- for ( ; i < len; i++ ) {
- file = files[ i ];
- file.setStatus( Status.QUEUED );
- }
-
- me.request('start-upload');
- },
-
- /**
- * @method sort
- * @grammar sort( fn ) => undefined
- * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
- * @for Uploader
- */
- sortFiles: function() {
- return this.queue.sort.apply( this.queue, arguments );
- },
-
- /**
- * @method reset
- * @grammar reset() => undefined
- * @description 重置uploader。目前只重置了队列。
- * @for Uploader
- * @example
- * uploader.reset();
- */
- reset: function() {
- this.queue = new Queue();
- this.stats = this.queue.stats;
- }
- });
-
- });
- /**
- * @fileOverview 添加获取Runtime相关信息的方法。
- */
- define('widgets/runtime',[
- 'uploader',
- 'runtime/runtime',
- 'widgets/widget'
- ], function( Uploader, Runtime ) {
-
- Uploader.support = function() {
- return Runtime.hasRuntime.apply( Runtime, arguments );
- };
-
- return Uploader.register({
- 'predict-runtime-type': 'predictRuntmeType'
- }, {
-
- init: function() {
- if ( !this.predictRuntmeType() ) {
- throw Error('Runtime Error');
- }
- },
-
- /**
- * 预测Uploader将采用哪个`Runtime`
- * @grammar predictRuntmeType() => String
- * @method predictRuntmeType
- * @for Uploader
- */
- predictRuntmeType: function() {
- var orders = this.options.runtimeOrder || Runtime.orders,
- type = this.type,
- i, len;
-
- if ( !type ) {
- orders = orders.split( /\s*,\s*/g );
-
- for ( i = 0, len = orders.length; i < len; i++ ) {
- if ( Runtime.hasRuntime( orders[ i ] ) ) {
- this.type = type = orders[ i ];
- break;
- }
- }
- }
-
- return type;
- }
- });
- });
- /**
- * @fileOverview Transport
- */
- define('lib/transport',[
- 'base',
- 'runtime/client',
- 'mediator'
- ], function( Base, RuntimeClient, Mediator ) {
-
- var $ = Base.$;
-
- function Transport( opts ) {
- var me = this;
-
- opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
- RuntimeClient.call( this, 'Transport' );
-
- this._blob = null;
- this._formData = opts.formData || {};
- this._headers = opts.headers || {};
-
- this.on( 'progress', this._timeout );
- this.on( 'load error', function() {
- me.trigger( 'progress', 1 );
- clearTimeout( me._timer );
- });
- }
-
- Transport.options = {
- server: '',
- method: 'POST',
-
- // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
- withCredentials: false,
- fileVal: 'file',
- timeout: 2 * 60 * 1000, // 2分钟
- formData: {},
- headers: {},
- sendAsBinary: false
- };
-
- $.extend( Transport.prototype, {
-
- // 添加Blob, 只能添加一次,最后一次有效。
- appendBlob: function( key, blob, filename ) {
- var me = this,
- opts = me.options;
-
- if ( me.getRuid() ) {
- me.disconnectRuntime();
- }
-
- // 连接到blob归属的同一个runtime.
- me.connectRuntime( blob.ruid, function() {
- me.exec('init');
- });
-
- me._blob = blob;
- opts.fileVal = key || opts.fileVal;
- opts.filename = filename || opts.filename;
- },
-
- // 添加其他字段
- append: function( key, value ) {
- if ( typeof key === 'object' ) {
- $.extend( this._formData, key );
- } else {
- this._formData[ key ] = value;
- }
- },
-
- setRequestHeader: function( key, value ) {
- if ( typeof key === 'object' ) {
- $.extend( this._headers, key );
- } else {
- this._headers[ key ] = value;
- }
- },
-
- send: function( method ) {
- this.exec( 'send', method );
- this._timeout();
- },
-
- abort: function() {
- clearTimeout( this._timer );
- return this.exec('abort');
- },
-
- destroy: function() {
- this.trigger('destroy');
- this.off();
- this.exec('destroy');
- this.disconnectRuntime();
- },
-
- getResponse: function() {
- return this.exec('getResponse');
- },
-
- getResponseAsJson: function() {
- return this.exec('getResponseAsJson');
- },
-
- getStatus: function() {
- return this.exec('getStatus');
- },
-
- _timeout: function() {
- var me = this,
- duration = me.options.timeout;
-
- if ( !duration ) {
- return;
- }
-
- clearTimeout( me._timer );
- me._timer = setTimeout(function() {
- me.abort();
- me.trigger( 'error', 'timeout' );
- }, duration );
- }
-
- });
-
- // 让Transport具备事件功能。
- Mediator.installTo( Transport.prototype );
-
- return Transport;
- });
- /**
- * @fileOverview 负责文件上传相关。
- */
- define('widgets/upload',[
- 'base',
- 'uploader',
- 'file',
- 'lib/transport',
- 'widgets/widget'
- ], function( Base, Uploader, WUFile, Transport ) {
-
- var $ = Base.$,
- isPromise = Base.isPromise,
- Status = WUFile.Status;
-
- // 添加默认配置项
- $.extend( Uploader.options, {
-
-
- /**
- * @property {Boolean} [prepareNextFile=false]
- * @namespace options
- * @for Uploader
- * @description 是否允许在文件传输时提前把下一个文件准备好。
- * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
- * 如果能提前在当前文件传输期处理,可以节省总体耗时。
- */
- prepareNextFile: false,
-
- /**
- * @property {Boolean} [chunked=false]
- * @namespace options
- * @for Uploader
- * @description 是否要分片处理大文件上传。
- */
- chunked: false,
-
- /**
- * @property {Boolean} [chunkSize=5242880]
- * @namespace options
- * @for Uploader
- * @description 如果要分片,分多大一片? 默认大小为5M.
- */
- chunkSize: 5 * 1024 * 1024,
-
- /**
- * @property {Boolean} [chunkRetry=2]
- * @namespace options
- * @for Uploader
- * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
- */
- chunkRetry: 2,
-
- /**
- * @property {Boolean} [threads=3]
- * @namespace options
- * @for Uploader
- * @description 上传并发数。允许同时最大上传进程数。
- */
- threads: 3,
-
-
- /**
- * @property {Object} [formData]
- * @namespace options
- * @for Uploader
- * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
- */
- formData: null
-
- /**
- * @property {Object} [fileVal='file']
- * @namespace options
- * @for Uploader
- * @description 设置文件上传域的name。
- */
-
- /**
- * @property {Object} [method='POST']
- * @namespace options
- * @for Uploader
- * @description 文件上传方式,`POST`或者`GET`。
- */
-
- /**
- * @property {Object} [sendAsBinary=false]
- * @namespace options
- * @for Uploader
- * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
- * 其他参数在$_GET数组中。
- */
- });
-
- // 负责将文件切片。
- function CuteFile( file, chunkSize ) {
- var pending = [],
- blob = file.source,
- total = blob.size,
- chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
- start = 0,
- index = 0,
- len;
-
- while ( index < chunks ) {
- len = Math.min( chunkSize, total - start );
-
- pending.push({
- file: file,
- start: start,
- end: chunkSize ? (start + len) : total,
- total: total,
- chunks: chunks,
- chunk: index++
- });
- start += len;
- }
-
- file.blocks = pending.concat();
- file.remaning = pending.length;
-
- return {
- file: file,
-
- has: function() {
- return !!pending.length;
- },
-
- fetch: function() {
- return pending.shift();
- }
- };
- }
-
- Uploader.register({
- 'start-upload': 'start',
- 'stop-upload': 'stop',
- 'skip-file': 'skipFile',
- 'is-in-progress': 'isInProgress'
- }, {
-
- init: function() {
- var owner = this.owner;
-
- this.runing = false;
-
- // 记录当前正在传的数据,跟threads相关
- this.pool = [];
-
- // 缓存即将上传的文件。
- this.pending = [];
-
- // 跟踪还有多少分片没有完成上传。
- this.remaning = 0;
- this.__tick = Base.bindFn( this._tick, this );
-
- owner.on( 'uploadComplete', function( file ) {
- // 把其他块取消了。
- file.blocks && $.each( file.blocks, function( _, v ) {
- v.transport && (v.transport.abort(), v.transport.destroy());
- delete v.transport;
- });
-
- delete file.blocks;
- delete file.remaning;
- });
- },
-
- /**
- * @event startUpload
- * @description 当开始上传流程时触发。
- * @for Uploader
- */
-
- /**
- * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
- * @grammar upload() => undefined
- * @method upload
- * @for Uploader
- */
- start: function() {
- var me = this;
-
- // 移出invalid的文件
- $.each( me.request( 'get-files', Status.INVALID ), function() {
- me.request( 'remove-file', this );
- });
-
- if ( me.runing ) {
- return;
- }
-
- me.runing = true;
-
- // 如果有暂停的,则续传
- $.each( me.pool, function( _, v ) {
- var file = v.file;
-
- if ( file.getStatus() === Status.INTERRUPT ) {
- file.setStatus( Status.PROGRESS );
- me._trigged = false;
- v.transport && v.transport.send();
- }
- });
-
- me._trigged = false;
- me.owner.trigger('startUpload');
- Base.nextTick( me.__tick );
- },
-
- /**
- * @event stopUpload
- * @description 当开始上传流程暂停时触发。
- * @for Uploader
- */
-
- /**
- * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
- * @grammar stop() => undefined
- * @grammar stop( true ) => undefined
- * @method stop
- * @for Uploader
- */
- stop: function( interrupt ) {
- var me = this;
-
- if ( me.runing === false ) {
- return;
- }
-
- me.runing = false;
-
- interrupt && $.each( me.pool, function( _, v ) {
- v.transport && v.transport.abort();
- v.file.setStatus( Status.INTERRUPT );
- });
-
- me.owner.trigger('stopUpload');
- },
-
- /**
- * 判断`Uplaode`r是否正在上传中。
- * @grammar isInProgress() => Boolean
- * @method isInProgress
- * @for Uploader
- */
- isInProgress: function() {
- return !!this.runing;
- },
-
- getStats: function() {
- return this.request('get-stats');
- },
-
- /**
- * 掉过一个文件上传,直接标记指定文件为已上传状态。
- * @grammar skipFile( file ) => undefined
- * @method skipFile
- * @for Uploader
- */
- skipFile: function( file, status ) {
- file = this.request( 'get-file', file );
-
- file.setStatus( status || Status.COMPLETE );
- file.skipped = true;
-
- // 如果正在上传。
- file.blocks && $.each( file.blocks, function( _, v ) {
- var _tr = v.transport;
-
- if ( _tr ) {
- _tr.abort();
- _tr.destroy();
- delete v.transport;
- }
- });
-
- this.owner.trigger( 'uploadSkip', file );
- },
-
- /**
- * @event uploadFinished
- * @description 当所有文件上传结束时触发。
- * @for Uploader
- */
- _tick: function() {
- var me = this,
- opts = me.options,
- fn, val;
-
- // 上一个promise还没有结束,则等待完成后再执行。
- if ( me._promise ) {
- return me._promise.always( me.__tick );
- }
-
- // 还有位置,且还有文件要处理的话。
- if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
- me._trigged = false;
-
- fn = function( val ) {
- me._promise = null;
-
- // 有可能是reject过来的,所以要检测val的类型。
- val && val.file && me._startSend( val );
- Base.nextTick( me.__tick );
- };
-
- me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
-
- // 没有要上传的了,且没有正在传输的了。
- } else if ( !me.remaning && !me.getStats().numOfQueue ) {
- me.runing = false;
-
- me._trigged || Base.nextTick(function() {
- me.owner.trigger('uploadFinished');
- });
- me._trigged = true;
- }
- },
-
- _nextBlock: function() {
- var me = this,
- act = me._act,
- opts = me.options,
- next, done;
-
- // 如果当前文件还有没有需要传输的,则直接返回剩下的。
- if ( act && act.has() &&
- act.file.getStatus() === Status.PROGRESS ) {
-
- // 是否提前准备下一个文件
- if ( opts.prepareNextFile && !me.pending.length ) {
- me._prepareNextFile();
- }
-
- return act.fetch();
-
- // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
- } else if ( me.runing ) {
-
- // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
- if ( !me.pending.length && me.getStats().numOfQueue ) {
- me._prepareNextFile();
- }
-
- next = me.pending.shift();
- done = function( file ) {
- if ( !file ) {
- return null;
- }
-
- act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
- me._act = act;
- return act.fetch();
- };
-
- // 文件可能还在prepare中,也有可能已经完全准备好了。
- return isPromise( next ) ?
- next[ next.pipe ? 'pipe' : 'then']( done ) :
- done( next );
- }
- },
-
-
- /**
- * @event uploadStart
- * @param {File} file File对象
- * @description 某个文件开始上传前触发,一个文件只会触发一次。
- * @for Uploader
- */
- _prepareNextFile: function() {
- var me = this,
- file = me.request('fetch-file'),
- pending = me.pending,
- promise;
-
- if ( file ) {
- promise = me.request( 'before-send-file', file, function() {
-
- // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
- if ( file.getStatus() === Status.QUEUED ) {
- me.owner.trigger( 'uploadStart', file );
- file.setStatus( Status.PROGRESS );
- return file;
- }
-
- return me._finishFile( file );
- });
-
- // 如果还在pending中,则替换成文件本身。
- promise.done(function() {
- var idx = $.inArray( promise, pending );
-
- ~idx && pending.splice( idx, 1, file );
- });
-
- // befeore-send-file的钩子就有错误发生。
- promise.fail(function( reason ) {
- file.setStatus( Status.ERROR, reason );
- me.owner.trigger( 'uploadError', file, reason );
- me.owner.trigger( 'uploadComplete', file );
- });
-
- pending.push( promise );
- }
- },
-
- // 让出位置了,可以让其他分片开始上传
- _popBlock: function( block ) {
- var idx = $.inArray( block, this.pool );
-
- this.pool.splice( idx, 1 );
- block.file.remaning--;
- this.remaning--;
- },
-
- // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
- _startSend: function( block ) {
- var me = this,
- file = block.file,
- promise;
-
- me.pool.push( block );
- me.remaning++;
-
- // 如果没有分片,则直接使用原始的。
- // 不会丢失content-type信息。
- block.blob = block.chunks === 1 ? file.source :
- file.source.slice( block.start, block.end );
-
- // hook, 每个分片发送之前可能要做些异步的事情。
- promise = me.request( 'before-send', block, function() {
-
- // 有可能文件已经上传出错了,所以不需要再传输了。
- if ( file.getStatus() === Status.PROGRESS ) {
- me._doSend( block );
- } else {
- me._popBlock( block );
- Base.nextTick( me.__tick );
- }
- });
-
- // 如果为fail了,则跳过此分片。
- promise.fail(function() {
- if ( file.remaning === 1 ) {
- me._finishFile( file ).always(function() {
- block.percentage = 1;
- me._popBlock( block );
- me.owner.trigger( 'uploadComplete', file );
- Base.nextTick( me.__tick );
- });
- } else {
- block.percentage = 1;
- me._popBlock( block );
- Base.nextTick( me.__tick );
- }
- });
- },
-
-
- /**
- * @event uploadBeforeSend
- * @param {Object} object
- * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
- * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
- * @for Uploader
- */
-
- /**
- * @event uploadAccept
- * @param {Object} object
- * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
- * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
- * @for Uploader
- */
-
- /**
- * @event uploadProgress
- * @param {File} file File对象
- * @param {Number} percentage 上传进度
- * @description 上传过程中触发,携带上传进度。
- * @for Uploader
- */
-
-
- /**
- * @event uploadError
- * @param {File} file File对象
- * @param {String} reason 出错的code
- * @description 当文件上传出错时触发。
- * @for Uploader
- */
-
- /**
- * @event uploadSuccess
- * @param {File} file File对象
- * @param {Object} response 服务端返回的数据
- * @description 当文件上传成功时触发。
- * @for Uploader
- */
-
- /**
- * @event uploadComplete
- * @param {File} [file] File对象
- * @description 不管成功或者失败,文件上传完成时触发。
- * @for Uploader
- */
-
- // 做上传操作。
- _doSend: function( block ) {
- var me = this,
- owner = me.owner,
- opts = me.options,
- file = block.file,
- tr = new Transport( opts ),
- data = $.extend({}, opts.formData ),
- headers = $.extend({}, opts.headers ),
- requestAccept, ret;
-
- block.transport = tr;
-
- tr.on( 'destroy', function() {
- delete block.transport;
- me._popBlock( block );
- Base.nextTick( me.__tick );
- });
-
- // 广播上传进度。以文件为单位。
- tr.on( 'progress', function( percentage ) {
- var totalPercent = 0,
- uploaded = 0;
-
- // 可能没有abort掉,progress还是执行进来了。
- // if ( !file.blocks ) {
- // return;
- // }
-
- totalPercent = block.percentage = percentage;
-
- if ( block.chunks > 1 ) { // 计算文件的整体速度。
- $.each( file.blocks, function( _, v ) {
- uploaded += (v.percentage || 0) * (v.end - v.start);
- });
-
- totalPercent = uploaded / file.size;
- }
-
- owner.trigger( 'uploadProgress', file, totalPercent || 0 );
- });
-
- // 用来询问,是否返回的结果是有错误的。
- requestAccept = function( reject ) {
- var fn;
-
- ret = tr.getResponseAsJson() || {};
- ret._raw = tr.getResponse();
- fn = function( value ) {
- reject = value;
- };
-
- // 服务端响应了,不代表成功了,询问是否响应正确。
- if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
- reject = reject || 'server';
- }
-
- return reject;
- };
-
- // 尝试重试,然后广播文件上传出错。
- tr.on( 'error', function( type, flag ) {
- block.retried = block.retried || 0;
-
- // 自动重试
- if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
- block.retried < opts.chunkRetry ) {
-
- block.retried++;
- tr.send();
-
- } else {
-
- // http status 500 ~ 600
- if ( !flag && type === 'server' ) {
- type = requestAccept( type );
- }
-
- file.setStatus( Status.ERROR, type );
- owner.trigger( 'uploadError', file, type );
- owner.trigger( 'uploadComplete', file );
- }
- });
-
- // 上传成功
- tr.on( 'load', function() {
- var reason;
-
- // 如果非预期,转向上传出错。
- if ( (reason = requestAccept()) ) {
- tr.trigger( 'error', reason, true );
- return;
- }
-
- // 全部上传完成。
- if ( file.remaning === 1 ) {
- me._finishFile( file, ret );
- } else {
- tr.destroy();
- }
- });
-
- // 配置默认的上传字段。
- data = $.extend( data, {
- id: file.id,
- name: file.name,
- type: file.type,
- lastModifiedDate: file.lastModifiedDate,
- size: file.size
- });
-
- block.chunks > 1 && $.extend( data, {
- chunks: block.chunks,
- chunk: block.chunk
- });
-
- // 在发送之间可以添加字段什么的。。。
- // 如果默认的字段不够使用,可以通过监听此事件来扩展
- owner.trigger( 'uploadBeforeSend', block, data, headers );
-
- // 开始发送。
- tr.appendBlob( opts.fileVal, block.blob, file.name );
- tr.append( data );
- tr.setRequestHeader( headers );
- tr.send();
- },
-
- // 完成上传。
- _finishFile: function( file, ret, hds ) {
- var owner = this.owner;
-
- return owner
- .request( 'after-send-file', arguments, function() {
- file.setStatus( Status.COMPLETE );
- owner.trigger( 'uploadSuccess', file, ret, hds );
- })
- .fail(function( reason ) {
-
- // 如果外部已经标记为invalid什么的,不再改状态。
- if ( file.getStatus() === Status.PROGRESS ) {
- file.setStatus( Status.ERROR, reason );
- }
-
- owner.trigger( 'uploadError', file, reason );
- })
- .always(function() {
- owner.trigger( 'uploadComplete', file );
- });
- }
-
- });
- });
- /**
- * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
- */
-
- define('widgets/validator',[
- 'base',
- 'uploader',
- 'file',
- 'widgets/widget'
- ], function( Base, Uploader, WUFile ) {
-
- var $ = Base.$,
- validators = {},
- api;
-
- /**
- * @event error
- * @param {String} type 错误类型。
- * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
- *
- * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
- * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
- * @for Uploader
- */
-
- // 暴露给外面的api
- api = {
-
- // 添加验证器
- addValidator: function( type, cb ) {
- validators[ type ] = cb;
- },
-
- // 移除验证器
- removeValidator: function( type ) {
- delete validators[ type ];
- }
- };
-
- // 在Uploader初始化的时候启动Validators的初始化
- Uploader.register({
- init: function() {
- var me = this;
- $.each( validators, function() {
- this.call( me.owner );
- });
- }
- });
-
- /**
- * @property {int} [fileNumLimit=undefined]
- * @namespace options
- * @for Uploader
- * @description 验证文件总数量, 超出则不允许加入队列。
- */
- api.addValidator( 'fileNumLimit', function() {
- var uploader = this,
- opts = uploader.options,
- count = 0,
- max = opts.fileNumLimit >> 0,
- flag = true;
-
- if ( !max ) {
- return;
- }
-
- uploader.on( 'beforeFileQueued', function( file ) {
-
- if ( count >= max && flag ) {
- flag = false;
- this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
- setTimeout(function() {
- flag = true;
- }, 1 );
- }
-
- return count >= max ? false : true;
- });
-
- uploader.on( 'fileQueued', function() {
- count++;
- });
-
- uploader.on( 'fileDequeued', function() {
- count--;
- });
-
- uploader.on( 'uploadFinished', function() {
- count = 0;
- });
- });
-
-
- /**
- * @property {int} [fileSizeLimit=undefined]
- * @namespace options
- * @for Uploader
- * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
- */
- api.addValidator( 'fileSizeLimit', function() {
- var uploader = this,
- opts = uploader.options,
- count = 0,
- max = opts.fileSizeLimit >> 0,
- flag = true;
-
- if ( !max ) {
- return;
- }
-
- uploader.on( 'beforeFileQueued', function( file ) {
- var invalid = count + file.size > max;
-
- if ( invalid && flag ) {
- flag = false;
- this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
- setTimeout(function() {
- flag = true;
- }, 1 );
- }
-
- return invalid ? false : true;
- });
-
- uploader.on( 'fileQueued', function( file ) {
- count += file.size;
- });
-
- uploader.on( 'fileDequeued', function( file ) {
- count -= file.size;
- });
-
- uploader.on( 'uploadFinished', function() {
- count = 0;
- });
- });
-
- /**
- * @property {int} [fileSingleSizeLimit=undefined]
- * @namespace options
- * @for Uploader
- * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
- */
- api.addValidator( 'fileSingleSizeLimit', function() {
- var uploader = this,
- opts = uploader.options,
- max = opts.fileSingleSizeLimit;
-
- if ( !max ) {
- return;
- }
-
- uploader.on( 'beforeFileQueued', function( file ) {
-
- if ( file.size > max ) {
- file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
- this.trigger( 'error', 'F_EXCEED_SIZE', file );
- return false;
- }
-
- });
-
- });
-
- /**
- * @property {int} [duplicate=undefined]
- * @namespace options
- * @for Uploader
- * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
- */
- api.addValidator( 'duplicate', function() {
- var uploader = this,
- opts = uploader.options,
- mapping = {};
-
- if ( opts.duplicate ) {
- return;
- }
-
- function hashString( str ) {
- var hash = 0,
- i = 0,
- len = str.length,
- _char;
-
- for ( ; i < len; i++ ) {
- _char = str.charCodeAt( i );
- hash = _char + (hash << 6) + (hash << 16) - hash;
- }
-
- return hash;
- }
-
- uploader.on( 'beforeFileQueued', function( file ) {
- var hash = file.__hash || (file.__hash = hashString( file.name +
- file.size + file.lastModifiedDate ));
-
- // 已经重复了
- if ( mapping[ hash ] ) {
- this.trigger( 'error', 'F_DUPLICATE', file );
- return false;
- }
- });
-
- uploader.on( 'fileQueued', function( file ) {
- var hash = file.__hash;
-
- hash && (mapping[ hash ] = true);
- });
-
- uploader.on( 'fileDequeued', function( file ) {
- var hash = file.__hash;
-
- hash && (delete mapping[ hash ]);
- });
- });
-
- return api;
- });
-
- /**
- * @fileOverview Runtime管理器,负责Runtime的选择, 连接
- */
- define('runtime/compbase',[],function() {
-
- function CompBase( owner, runtime ) {
-
- this.owner = owner;
- this.options = owner.options;
-
- this.getRuntime = function() {
- return runtime;
- };
-
- this.getRuid = function() {
- return runtime.uid;
- };
-
- this.trigger = function() {
- return owner.trigger.apply( owner, arguments );
- };
- }
-
- return CompBase;
- });
- /**
- * @fileOverview Html5Runtime
- */
- define('runtime/html5/runtime',[
- 'base',
- 'runtime/runtime',
- 'runtime/compbase'
- ], function( Base, Runtime, CompBase ) {
-
- var type = 'html5',
- components = {};
-
- function Html5Runtime() {
- var pool = {},
- me = this,
- destory = this.destory;
-
- Runtime.apply( me, arguments );
- me.type = type;
-
-
- // 这个方法的调用者,实际上是RuntimeClient
- me.exec = function( comp, fn/*, args...*/) {
- var client = this,
- uid = client.uid,
- args = Base.slice( arguments, 2 ),
- instance;
-
- if ( components[ comp ] ) {
- instance = pool[ uid ] = pool[ uid ] ||
- new components[ comp ]( client, me );
-
- if ( instance[ fn ] ) {
- return instance[ fn ].apply( instance, args );
- }
- }
- };
-
- me.destory = function() {
- // @todo 删除池子中的所有实例
- return destory && destory.apply( this, arguments );
- };
- }
-
- Base.inherits( Runtime, {
- constructor: Html5Runtime,
-
- // 不需要连接其他程序,直接执行callback
- init: function() {
- var me = this;
- setTimeout(function() {
- me.trigger('ready');
- }, 1 );
- }
-
- });
-
- // 注册Components
- Html5Runtime.register = function( name, component ) {
- var klass = components[ name ] = Base.inherits( CompBase, component );
- return klass;
- };
-
- // 注册html5运行时。
- // 只有在支持的前提下注册。
- if ( window.Blob && window.FileReader && window.DataView ) {
- Runtime.addRuntime( type, Html5Runtime );
- }
-
- return Html5Runtime;
- });
- /**
- * @fileOverview Blob Html实现
- */
- define('runtime/html5/blob',[
- 'runtime/html5/runtime',
- 'lib/blob'
- ], function( Html5Runtime, Blob ) {
-
- return Html5Runtime.register( 'Blob', {
- slice: function( start, end ) {
- var blob = this.owner.source,
- slice = blob.slice || blob.webkitSlice || blob.mozSlice;
-
- blob = slice.call( blob, start, end );
-
- return new Blob( this.getRuid(), blob );
- }
- });
- });
- /**
- * @fileOverview FilePaste
- */
- define('runtime/html5/dnd',[
- 'base',
- 'runtime/html5/runtime',
- 'lib/file'
- ], function( Base, Html5Runtime, File ) {
-
- var $ = Base.$,
- prefix = 'webuploader-dnd-';
-
- return Html5Runtime.register( 'DragAndDrop', {
- init: function() {
- var elem = this.elem = this.options.container;
-
- this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );
- this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );
- this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );
- this.dropHandler = Base.bindFn( this._dropHandler, this );
- this.dndOver = false;
-
- elem.on( 'dragenter', this.dragEnterHandler );
- elem.on( 'dragover', this.dragOverHandler );
- elem.on( 'dragleave', this.dragLeaveHandler );
- elem.on( 'drop', this.dropHandler );
-
- if ( this.options.disableGlobalDnd ) {
- $( document ).on( 'dragover', this.dragOverHandler );
- $( document ).on( 'drop', this.dropHandler );
- }
- },
-
- _dragEnterHandler: function( e ) {
- var me = this,
- denied = me._denied || false,
- items;
-
- e = e.originalEvent || e;
-
- if ( !me.dndOver ) {
- me.dndOver = true;
-
- // 注意只有 chrome 支持。
- items = e.dataTransfer.items;
-
- if ( items && items.length ) {
- me._denied = denied = !me.trigger( 'accept', items );
- }
-
- me.elem.addClass( prefix + 'over' );
- me.elem[ denied ? 'addClass' :
- 'removeClass' ]( prefix + 'denied' );
- }
-
-
- e.dataTransfer.dropEffect = denied ? 'none' : 'copy';
-
- return false;
- },
-
- _dragOverHandler: function( e ) {
- // 只处理框内的。
- var parentElem = this.elem.parent().get( 0 );
- if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
- return false;
- }
-
- clearTimeout( this._leaveTimer );
- this._dragEnterHandler.call( this, e );
-
- return false;
- },
-
- _dragLeaveHandler: function() {
- var me = this,
- handler;
-
- handler = function() {
- me.dndOver = false;
- me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );
- };
-
- clearTimeout( me._leaveTimer );
- me._leaveTimer = setTimeout( handler, 100 );
- return false;
- },
-
- _dropHandler: function( e ) {
- var me = this,
- ruid = me.getRuid(),
- parentElem = me.elem.parent().get( 0 );
-
- // 只处理框内的。
- if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
- return false;
- }
-
- me._getTansferFiles( e, function( results ) {
- me.trigger( 'drop', $.map( results, function( file ) {
- return new File( ruid, file );
- }) );
- });
-
- me.dndOver = false;
- me.elem.removeClass( prefix + 'over' );
- return false;
- },
-
- // 如果传入 callback 则去查看文件夹,否则只管当前文件夹。
- _getTansferFiles: function( e, callback ) {
- var results = [],
- promises = [],
- items, files, dataTransfer, file, item, i, len, canAccessFolder;
-
- e = e.originalEvent || e;
-
- dataTransfer = e.dataTransfer;
- items = dataTransfer.items;
- files = dataTransfer.files;
-
- canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);
-
- for ( i = 0, len = files.length; i < len; i++ ) {
- file = files[ i ];
- item = items && items[ i ];
-
- if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {
-
- promises.push( this._traverseDirectoryTree(
- item.webkitGetAsEntry(), results ) );
- } else {
- results.push( file );
- }
- }
-
- Base.when.apply( Base, promises ).done(function() {
-
- if ( !results.length ) {
- return;
- }
-
- callback( results );
- });
- },
-
- _traverseDirectoryTree: function( entry, results ) {
- var deferred = Base.Deferred(),
- me = this;
-
- if ( entry.isFile ) {
- entry.file(function( file ) {
- results.push( file );
- deferred.resolve();
- });
- } else if ( entry.isDirectory ) {
- entry.createReader().readEntries(function( entries ) {
- var len = entries.length,
- promises = [],
- arr = [], // 为了保证顺序。
- i;
-
- for ( i = 0; i < len; i++ ) {
- promises.push( me._traverseDirectoryTree(
- entries[ i ], arr ) );
- }
-
- Base.when.apply( Base, promises ).then(function() {
- results.push.apply( results, arr );
- deferred.resolve();
- }, deferred.reject );
- });
- }
-
- return deferred.promise();
- },
-
- destroy: function() {
- var elem = this.elem;
-
- elem.off( 'dragenter', this.dragEnterHandler );
- elem.off( 'dragover', this.dragEnterHandler );
- elem.off( 'dragleave', this.dragLeaveHandler );
- elem.off( 'drop', this.dropHandler );
-
- if ( this.options.disableGlobalDnd ) {
- $( document ).off( 'dragover', this.dragOverHandler );
- $( document ).off( 'drop', this.dropHandler );
- }
- }
- });
- });
-
- /**
- * @fileOverview FilePaste
- */
- define('runtime/html5/filepaste',[
- 'base',
- 'runtime/html5/runtime',
- 'lib/file'
- ], function( Base, Html5Runtime, File ) {
-
- return Html5Runtime.register( 'FilePaste', {
- init: function() {
- var opts = this.options,
- elem = this.elem = opts.container,
- accept = '.*',
- arr, i, len, item;
-
- // accetp的mimeTypes中生成匹配正则。
- if ( opts.accept ) {
- arr = [];
-
- for ( i = 0, len = opts.accept.length; i < len; i++ ) {
- item = opts.accept[ i ].mimeTypes;
- item && arr.push( item );
- }
-
- if ( arr.length ) {
- accept = arr.join(',');
- accept = accept.replace( /,/g, '|' ).replace( /\*/g, '.*' );
- }
- }
- this.accept = accept = new RegExp( accept, 'i' );
- this.hander = Base.bindFn( this._pasteHander, this );
- elem.on( 'paste', this.hander );
- },
-
- _pasteHander: function( e ) {
- var allowed = [],
- ruid = this.getRuid(),
- items, item, blob, i, len;
-
- e = e.originalEvent || e;
- items = e.clipboardData.items;
-
- for ( i = 0, len = items.length; i < len; i++ ) {
- item = items[ i ];
-
- if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {
- continue;
- }
-
- allowed.push( new File( ruid, blob ) );
- }
-
- if ( allowed.length ) {
- // 不阻止非文件粘贴(文字粘贴)的事件冒泡
- e.preventDefault();
- e.stopPropagation();
- this.trigger( 'paste', allowed );
- }
- },
-
- destroy: function() {
- this.elem.off( 'paste', this.hander );
- }
- });
- });
-
- /**
- * @fileOverview FilePicker
- */
- define('runtime/html5/filepicker',[
- 'base',
- 'runtime/html5/runtime'
- ], function( Base, Html5Runtime ) {
-
- var $ = Base.$;
-
- return Html5Runtime.register( 'FilePicker', {
- init: function() {
- var container = this.getRuntime().getContainer(),
- me = this,
- owner = me.owner,
- opts = me.options,
- lable = $( document.createElement('label') ),
- input = $( document.createElement('input') ),
- arr, i, len, mouseHandler;
-
- input.attr( 'type', 'file' );
- input.attr( 'name', opts.name );
- input.addClass('webuploader-element-invisible');
-
- lable.on( 'click', function() {
- input.trigger('click');
- });
-
- lable.css({
- opacity: 0,
- width: '100%',
- height: '100%',
- display: 'block',
- cursor: 'pointer',
- background: '#ffffff'
- });
-
- if ( opts.multiple ) {
- input.attr( 'multiple', 'multiple' );
- }
-
- // @todo Firefox不支持单独指定后缀
- if ( opts.accept && opts.accept.length > 0 ) {
- arr = [];
-
- for ( i = 0, len = opts.accept.length; i < len; i++ ) {
- arr.push( opts.accept[ i ].mimeTypes );
- }
-
- input.attr( 'accept', arr.join(',') );
- }
-
- container.append( input );
- container.append( lable );
-
- mouseHandler = function( e ) {
- owner.trigger( e.type );
- };
-
- input.on( 'change', function( e ) {
- var fn = arguments.callee,
- clone;
-
- me.files = e.target.files;
-
- // reset input
- clone = this.cloneNode( true );
- this.parentNode.replaceChild( clone, this );
-
- input.off();
- input = $( clone ).on( 'change', fn )
- .on( 'mouseenter mouseleave', mouseHandler );
-
- owner.trigger('change');
- });
-
- lable.on( 'mouseenter mouseleave', mouseHandler );
-
- },
-
-
- getFiles: function() {
- return this.files;
- },
-
- destroy: function() {
- // todo
- }
- });
- });
- /**
- * Terms:
- *
- * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
- * @fileOverview Image控件
- */
- define('runtime/html5/util',[
- 'base'
- ], function( Base ) {
-
- var urlAPI = window.createObjectURL && window ||
- window.URL && URL.revokeObjectURL && URL ||
- window.webkitURL,
- createObjectURL = Base.noop,
- revokeObjectURL = createObjectURL;
-
- if ( urlAPI ) {
-
- // 更安全的方式调用,比如android里面就能把context改成其他的对象。
- createObjectURL = function() {
- return urlAPI.createObjectURL.apply( urlAPI, arguments );
- };
-
- revokeObjectURL = function() {
- return urlAPI.revokeObjectURL.apply( urlAPI, arguments );
- };
- }
-
- return {
- createObjectURL: createObjectURL,
- revokeObjectURL: revokeObjectURL,
-
- dataURL2Blob: function( dataURI ) {
- var byteStr, intArray, ab, i, mimetype, parts;
-
- parts = dataURI.split(',');
-
- if ( ~parts[ 0 ].indexOf('base64') ) {
- byteStr = atob( parts[ 1 ] );
- } else {
- byteStr = decodeURIComponent( parts[ 1 ] );
- }
-
- ab = new ArrayBuffer( byteStr.length );
- intArray = new Uint8Array( ab );
-
- for ( i = 0; i < byteStr.length; i++ ) {
- intArray[ i ] = byteStr.charCodeAt( i );
- }
-
- mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ];
-
- return this.arrayBufferToBlob( ab, mimetype );
- },
-
- dataURL2ArrayBuffer: function( dataURI ) {
- var byteStr, intArray, i, parts;
-
- parts = dataURI.split(',');
-
- if ( ~parts[ 0 ].indexOf('base64') ) {
- byteStr = atob( parts[ 1 ] );
- } else {
- byteStr = decodeURIComponent( parts[ 1 ] );
- }
-
- intArray = new Uint8Array( byteStr.length );
-
- for ( i = 0; i < byteStr.length; i++ ) {
- intArray[ i ] = byteStr.charCodeAt( i );
- }
-
- return intArray.buffer;
- },
-
- arrayBufferToBlob: function( buffer, type ) {
- var builder = window.BlobBuilder || window.WebKitBlobBuilder,
- bb;
-
- // android不支持直接new Blob, 只能借助blobbuilder.
- if ( builder ) {
- bb = new builder();
- bb.append( buffer );
- return bb.getBlob( type );
- }
-
- return new Blob([ buffer ], type ? { type: type } : {} );
- },
-
- // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg.
- // 你得到的结果是png.
- canvasToDataUrl: function( canvas, type, quality ) {
- return canvas.toDataURL( type, quality / 100 );
- },
-
- // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
- parseMeta: function( blob, callback ) {
- callback( false, {});
- },
-
- // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
- updateImageHead: function( data ) {
- return data;
- }
- };
- });
- /**
- * Terms:
- *
- * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
- * @fileOverview Image控件
- */
- define('runtime/html5/imagemeta',[
- 'runtime/html5/util'
- ], function( Util ) {
-
- var api;
-
- api = {
- parsers: {
- 0xffe1: []
- },
-
- maxMetaDataSize: 262144,
-
- parse: function( blob, cb ) {
- var me = this,
- fr = new FileReader();
-
- fr.onload = function() {
- cb( false, me._parse( this.result ) );
- fr = fr.onload = fr.onerror = null;
- };
-
- fr.onerror = function( e ) {
- cb( e.message );
- fr = fr.onload = fr.onerror = null;
- };
-
- blob = blob.slice( 0, me.maxMetaDataSize );
- fr.readAsArrayBuffer( blob.getSource() );
- },
-
- _parse: function( buffer, noParse ) {
- if ( buffer.byteLength < 6 ) {
- return;
- }
-
- var dataview = new DataView( buffer ),
- offset = 2,
- maxOffset = dataview.byteLength - 4,
- headLength = offset,
- ret = {},
- markerBytes, markerLength, parsers, i;
-
- if ( dataview.getUint16( 0 ) === 0xffd8 ) {
-
- while ( offset < maxOffset ) {
- markerBytes = dataview.getUint16( offset );
-
- if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef ||
- markerBytes === 0xfffe ) {
-
- markerLength = dataview.getUint16( offset + 2 ) + 2;
-
- if ( offset + markerLength > dataview.byteLength ) {
- break;
- }
-
- parsers = api.parsers[ markerBytes ];
-
- if ( !noParse && parsers ) {
- for ( i = 0; i < parsers.length; i += 1 ) {
- parsers[ i ].call( api, dataview, offset,
- markerLength, ret );
- }
- }
-
- offset += markerLength;
- headLength = offset;
- } else {
- break;
- }
- }
-
- if ( headLength > 6 ) {
- if ( buffer.slice ) {
- ret.imageHead = buffer.slice( 2, headLength );
- } else {
- // Workaround for IE10, which does not yet
- // support ArrayBuffer.slice:
- ret.imageHead = new Uint8Array( buffer )
- .subarray( 2, headLength );
- }
- }
- }
-
- return ret;
- },
-
- updateImageHead: function( buffer, head ) {
- var data = this._parse( buffer, true ),
- buf1, buf2, bodyoffset;
-
-
- bodyoffset = 2;
- if ( data.imageHead ) {
- bodyoffset = 2 + data.imageHead.byteLength;
- }
-
- if ( buffer.slice ) {
- buf2 = buffer.slice( bodyoffset );
- } else {
- buf2 = new Uint8Array( buffer ).subarray( bodyoffset );
- }
-
- buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength );
-
- buf1[ 0 ] = 0xFF;
- buf1[ 1 ] = 0xD8;
- buf1.set( new Uint8Array( head ), 2 );
- buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 );
-
- return buf1.buffer;
- }
- };
-
- Util.parseMeta = function() {
- return api.parse.apply( api, arguments );
- };
-
- Util.updateImageHead = function() {
- return api.updateImageHead.apply( api, arguments );
- };
-
- return api;
- });
- /**
- * 代码来自于:https://github.com/blueimp/JavaScript-Load-Image
- * 暂时项目中只用了orientation.
- *
- * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail.
- * @fileOverview EXIF解析
- */
-
- // Sample
- // ====================================
- // Make : Apple
- // Model : iPhone 4S
- // Orientation : 1
- // XResolution : 72 [72/1]
- // YResolution : 72 [72/1]
- // ResolutionUnit : 2
- // Software : QuickTime 7.7.1
- // DateTime : 2013:09:01 22:53:55
- // ExifIFDPointer : 190
- // ExposureTime : 0.058823529411764705 [1/17]
- // FNumber : 2.4 [12/5]
- // ExposureProgram : Normal program
- // ISOSpeedRatings : 800
- // ExifVersion : 0220
- // DateTimeOriginal : 2013:09:01 22:52:51
- // DateTimeDigitized : 2013:09:01 22:52:51
- // ComponentsConfiguration : YCbCr
- // ShutterSpeedValue : 4.058893515764426
- // ApertureValue : 2.5260688216892597 [4845/1918]
- // BrightnessValue : -0.3126686601998395
- // MeteringMode : Pattern
- // Flash : Flash did not fire, compulsory flash mode
- // FocalLength : 4.28 [107/25]
- // SubjectArea : [4 values]
- // FlashpixVersion : 0100
- // ColorSpace : 1
- // PixelXDimension : 2448
- // PixelYDimension : 3264
- // SensingMethod : One-chip color area sensor
- // ExposureMode : 0
- // WhiteBalance : Auto white balance
- // FocalLengthIn35mmFilm : 35
- // SceneCaptureType : Standard
- define('runtime/html5/imagemeta/exif',[
- 'base',
- 'runtime/html5/imagemeta'
- ], function( Base, ImageMeta ) {
-
- var EXIF = {};
-
- EXIF.ExifMap = function() {
- return this;
- };
-
- EXIF.ExifMap.prototype.map = {
- 'Orientation': 0x0112
- };
-
- EXIF.ExifMap.prototype.get = function( id ) {
- return this[ id ] || this[ this.map[ id ] ];
- };
-
- EXIF.exifTagTypes = {
- // byte, 8-bit unsigned int:
- 1: {
- getValue: function( dataView, dataOffset ) {
- return dataView.getUint8( dataOffset );
- },
- size: 1
- },
-
- // ascii, 8-bit byte:
- 2: {
- getValue: function( dataView, dataOffset ) {
- return String.fromCharCode( dataView.getUint8( dataOffset ) );
- },
- size: 1,
- ascii: true
- },
-
- // short, 16 bit int:
- 3: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getUint16( dataOffset, littleEndian );
- },
- size: 2
- },
-
- // long, 32 bit int:
- 4: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getUint32( dataOffset, littleEndian );
- },
- size: 4
- },
-
- // rational = two long values,
- // first is numerator, second is denominator:
- 5: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getUint32( dataOffset, littleEndian ) /
- dataView.getUint32( dataOffset + 4, littleEndian );
- },
- size: 8
- },
-
- // slong, 32 bit signed int:
- 9: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getInt32( dataOffset, littleEndian );
- },
- size: 4
- },
-
- // srational, two slongs, first is numerator, second is denominator:
- 10: {
- getValue: function( dataView, dataOffset, littleEndian ) {
- return dataView.getInt32( dataOffset, littleEndian ) /
- dataView.getInt32( dataOffset + 4, littleEndian );
- },
- size: 8
- }
- };
-
- // undefined, 8-bit byte, value depending on field:
- EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ];
-
- EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length,
- littleEndian ) {
-
- var tagType = EXIF.exifTagTypes[ type ],
- tagSize, dataOffset, values, i, str, c;
-
- if ( !tagType ) {
- Base.log('Invalid Exif data: Invalid tag type.');
- return;
- }
-
- tagSize = tagType.size * length;
-
- // Determine if the value is contained in the dataOffset bytes,
- // or if the value at the dataOffset is a pointer to the actual data:
- dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8,
- littleEndian ) : (offset + 8);
-
- if ( dataOffset + tagSize > dataView.byteLength ) {
- Base.log('Invalid Exif data: Invalid data offset.');
- return;
- }
-
- if ( length === 1 ) {
- return tagType.getValue( dataView, dataOffset, littleEndian );
- }
-
- values = [];
-
- for ( i = 0; i < length; i += 1 ) {
- values[ i ] = tagType.getValue( dataView,
- dataOffset + i * tagType.size, littleEndian );
- }
-
- if ( tagType.ascii ) {
- str = '';
-
- // Concatenate the chars:
- for ( i = 0; i < values.length; i += 1 ) {
- c = values[ i ];
-
- // Ignore the terminating NULL byte(s):
- if ( c === '\u0000' ) {
- break;
- }
- str += c;
- }
-
- return str;
- }
- return values;
- };
-
- EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian,
- data ) {
-
- var tag = dataView.getUint16( offset, littleEndian );
- data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset,
- dataView.getUint16( offset + 2, littleEndian ), // tag type
- dataView.getUint32( offset + 4, littleEndian ), // tag length
- littleEndian );
- };
-
- EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset,
- littleEndian, data ) {
-
- var tagsNumber, dirEndOffset, i;
-
- if ( dirOffset + 6 > dataView.byteLength ) {
- Base.log('Invalid Exif data: Invalid directory offset.');
- return;
- }
-
- tagsNumber = dataView.getUint16( dirOffset, littleEndian );
- dirEndOffset = dirOffset + 2 + 12 * tagsNumber;
-
- if ( dirEndOffset + 4 > dataView.byteLength ) {
- Base.log('Invalid Exif data: Invalid directory size.');
- return;
- }
-
- for ( i = 0; i < tagsNumber; i += 1 ) {
- this.parseExifTag( dataView, tiffOffset,
- dirOffset + 2 + 12 * i, // tag offset
- littleEndian, data );
- }
-
- // Return the offset to the next directory:
- return dataView.getUint32( dirEndOffset, littleEndian );
- };
-
- // EXIF.getExifThumbnail = function(dataView, offset, length) {
- // var hexData,
- // i,
- // b;
- // if (!length || offset + length > dataView.byteLength) {
- // Base.log('Invalid Exif data: Invalid thumbnail data.');
- // return;
- // }
- // hexData = [];
- // for (i = 0; i < length; i += 1) {
- // b = dataView.getUint8(offset + i);
- // hexData.push((b < 16 ? '0' : '') + b.toString(16));
- // }
- // return 'data:image/jpeg,%' + hexData.join('%');
- // };
-
- EXIF.parseExifData = function( dataView, offset, length, data ) {
-
- var tiffOffset = offset + 10,
- littleEndian, dirOffset;
-
- // Check for the ASCII code for "Exif" (0x45786966):
- if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) {
- // No Exif data, might be XMP data instead
- return;
- }
- if ( tiffOffset + 8 > dataView.byteLength ) {
- Base.log('Invalid Exif data: Invalid segment size.');
- return;
- }
-
- // Check for the two null bytes:
- if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) {
- Base.log('Invalid Exif data: Missing byte alignment offset.');
- return;
- }
-
- // Check the byte alignment:
- switch ( dataView.getUint16( tiffOffset ) ) {
- case 0x4949:
- littleEndian = true;
- break;
-
- case 0x4D4D:
- littleEndian = false;
- break;
-
- default:
- Base.log('Invalid Exif data: Invalid byte alignment marker.');
- return;
- }
-
- // Check for the TIFF tag marker (0x002A):
- if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) {
- Base.log('Invalid Exif data: Missing TIFF marker.');
- return;
- }
-
- // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:
- dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian );
- // Create the exif object to store the tags:
- data.exif = new EXIF.ExifMap();
- // Parse the tags of the main image directory and retrieve the
- // offset to the next directory, usually the thumbnail directory:
- dirOffset = EXIF.parseExifTags( dataView, tiffOffset,
- tiffOffset + dirOffset, littleEndian, data );
-
- // 尝试读取缩略图
- // if ( dirOffset ) {
- // thumbnailData = {exif: {}};
- // dirOffset = EXIF.parseExifTags(
- // dataView,
- // tiffOffset,
- // tiffOffset + dirOffset,
- // littleEndian,
- // thumbnailData
- // );
-
- // // Check for JPEG Thumbnail offset:
- // if (thumbnailData.exif[0x0201]) {
- // data.exif.Thumbnail = EXIF.getExifThumbnail(
- // dataView,
- // tiffOffset + thumbnailData.exif[0x0201],
- // thumbnailData.exif[0x0202] // Thumbnail data length
- // );
- // }
- // }
- };
-
- ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData );
- return EXIF;
- });
- /**
- * 这个方式性能不行,但是可以解决android里面的toDataUrl的bug
- * android里面toDataUrl('image/jpege')得到的结果却是png.
- *
- * 所以这里没辙,只能借助这个工具
- * @fileOverview jpeg encoder
- */
- define('runtime/html5/jpegencoder',[], function( require, exports, module ) {
-
- /*
- Copyright (c) 2008, Adobe Systems Incorporated
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the name of Adobe Systems Incorporated nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- /*
- JPEG encoder ported to JavaScript and optimized by Andreas Ritter, www.bytestrom.eu, 11/2009
-
- Basic GUI blocking jpeg encoder
- */
-
- function JPEGEncoder(quality) {
- var self = this;
- var fround = Math.round;
- var ffloor = Math.floor;
- var YTable = new Array(64);
- var UVTable = new Array(64);
- var fdtbl_Y = new Array(64);
- var fdtbl_UV = new Array(64);
- var YDC_HT;
- var UVDC_HT;
- var YAC_HT;
- var UVAC_HT;
-
- var bitcode = new Array(65535);
- var category = new Array(65535);
- var outputfDCTQuant = new Array(64);
- var DU = new Array(64);
- var byteout = [];
- var bytenew = 0;
- var bytepos = 7;
-
- var YDU = new Array(64);
- var UDU = new Array(64);
- var VDU = new Array(64);
- var clt = new Array(256);
- var RGB_YUV_TABLE = new Array(2048);
- var currentQuality;
-
- var ZigZag = [
- 0, 1, 5, 6,14,15,27,28,
- 2, 4, 7,13,16,26,29,42,
- 3, 8,12,17,25,30,41,43,
- 9,11,18,24,31,40,44,53,
- 10,19,23,32,39,45,52,54,
- 20,22,33,38,46,51,55,60,
- 21,34,37,47,50,56,59,61,
- 35,36,48,49,57,58,62,63
- ];
-
- var std_dc_luminance_nrcodes = [0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0];
- var std_dc_luminance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
- var std_ac_luminance_nrcodes = [0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d];
- var std_ac_luminance_values = [
- 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,
- 0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,
- 0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,
- 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,
- 0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,
- 0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
- 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,
- 0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
- 0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
- 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
- 0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
- 0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
- 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,
- 0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
- 0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,
- 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,
- 0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,
- 0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
- 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,
- 0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
- 0xf9,0xfa
- ];
-
- var std_dc_chrominance_nrcodes = [0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0];
- var std_dc_chrominance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
- var std_ac_chrominance_nrcodes = [0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77];
- var std_ac_chrominance_values = [
- 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,
- 0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,
- 0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
- 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,
- 0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,
- 0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
- 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,
- 0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,
- 0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,
- 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,
- 0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,
- 0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
- 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,
- 0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,
- 0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,
- 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,
- 0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,
- 0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
- 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,
- 0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
- 0xf9,0xfa
- ];
-
- function initQuantTables(sf){
- var YQT = [
- 16, 11, 10, 16, 24, 40, 51, 61,
- 12, 12, 14, 19, 26, 58, 60, 55,
- 14, 13, 16, 24, 40, 57, 69, 56,
- 14, 17, 22, 29, 51, 87, 80, 62,
- 18, 22, 37, 56, 68,109,103, 77,
- 24, 35, 55, 64, 81,104,113, 92,
- 49, 64, 78, 87,103,121,120,101,
- 72, 92, 95, 98,112,100,103, 99
- ];
-
- for (var i = 0; i < 64; i++) {
- var t = ffloor((YQT[i]*sf+50)/100);
- if (t < 1) {
- t = 1;
- } else if (t > 255) {
- t = 255;
- }
- YTable[ZigZag[i]] = t;
- }
- var UVQT = [
- 17, 18, 24, 47, 99, 99, 99, 99,
- 18, 21, 26, 66, 99, 99, 99, 99,
- 24, 26, 56, 99, 99, 99, 99, 99,
- 47, 66, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99
- ];
- for (var j = 0; j < 64; j++) {
- var u = ffloor((UVQT[j]*sf+50)/100);
- if (u < 1) {
- u = 1;
- } else if (u > 255) {
- u = 255;
- }
- UVTable[ZigZag[j]] = u;
- }
- var aasf = [
- 1.0, 1.387039845, 1.306562965, 1.175875602,
- 1.0, 0.785694958, 0.541196100, 0.275899379
- ];
- var k = 0;
- for (var row = 0; row < 8; row++)
- {
- for (var col = 0; col < 8; col++)
- {
- fdtbl_Y[k] = (1.0 / (YTable [ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
- fdtbl_UV[k] = (1.0 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
- k++;
- }
- }
- }
-
- function computeHuffmanTbl(nrcodes, std_table){
- var codevalue = 0;
- var pos_in_table = 0;
- var HT = new Array();
- for (var k = 1; k <= 16; k++) {
- for (var j = 1; j <= nrcodes[k]; j++) {
- HT[std_table[pos_in_table]] = [];
- HT[std_table[pos_in_table]][0] = codevalue;
- HT[std_table[pos_in_table]][1] = k;
- pos_in_table++;
- codevalue++;
- }
- codevalue*=2;
- }
- return HT;
- }
-
- function initHuffmanTbl()
- {
- YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values);
- UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values);
- YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values);
- UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values);
- }
-
- function initCategoryNumber()
- {
- var nrlower = 1;
- var nrupper = 2;
- for (var cat = 1; cat <= 15; cat++) {
- //Positive numbers
- for (var nr = nrlower; nr>0] = 38470 * i;
- RGB_YUV_TABLE[(i+ 512)>>0] = 7471 * i + 0x8000;
- RGB_YUV_TABLE[(i+ 768)>>0] = -11059 * i;
- RGB_YUV_TABLE[(i+1024)>>0] = -21709 * i;
- RGB_YUV_TABLE[(i+1280)>>0] = 32768 * i + 0x807FFF;
- RGB_YUV_TABLE[(i+1536)>>0] = -27439 * i;
- RGB_YUV_TABLE[(i+1792)>>0] = - 5329 * i;
- }
- }
-
- // IO functions
- function writeBits(bs)
- {
- var value = bs[0];
- var posval = bs[1]-1;
- while ( posval >= 0 ) {
- if (value & (1 << posval) ) {
- bytenew |= (1 << bytepos);
- }
- posval--;
- bytepos--;
- if (bytepos < 0) {
- if (bytenew == 0xFF) {
- writeByte(0xFF);
- writeByte(0);
- }
- else {
- writeByte(bytenew);
- }
- bytepos=7;
- bytenew=0;
- }
- }
- }
-
- function writeByte(value)
- {
- byteout.push(clt[value]); // write char directly instead of converting later
- }
-
- function writeWord(value)
- {
- writeByte((value>>8)&0xFF);
- writeByte((value )&0xFF);
- }
-
- // DCT & quantization core
- function fDCTQuant(data, fdtbl)
- {
- var d0, d1, d2, d3, d4, d5, d6, d7;
- /* Pass 1: process rows. */
- var dataOff=0;
- var i;
- var I8 = 8;
- var I64 = 64;
- for (i=0; i 0.0) ? ((fDCTQuant + 0.5)|0) : ((fDCTQuant - 0.5)|0);
- //outputfDCTQuant[i] = fround(fDCTQuant);
-
- }
- return outputfDCTQuant;
- }
-
- function writeAPP0()
- {
- writeWord(0xFFE0); // marker
- writeWord(16); // length
- writeByte(0x4A); // J
- writeByte(0x46); // F
- writeByte(0x49); // I
- writeByte(0x46); // F
- writeByte(0); // = "JFIF",'\0'
- writeByte(1); // versionhi
- writeByte(1); // versionlo
- writeByte(0); // xyunits
- writeWord(1); // xdensity
- writeWord(1); // ydensity
- writeByte(0); // thumbnwidth
- writeByte(0); // thumbnheight
- }
-
- function writeSOF0(width, height)
- {
- writeWord(0xFFC0); // marker
- writeWord(17); // length, truecolor YUV JPG
- writeByte(8); // precision
- writeWord(height);
- writeWord(width);
- writeByte(3); // nrofcomponents
- writeByte(1); // IdY
- writeByte(0x11); // HVY
- writeByte(0); // QTY
- writeByte(2); // IdU
- writeByte(0x11); // HVU
- writeByte(1); // QTU
- writeByte(3); // IdV
- writeByte(0x11); // HVV
- writeByte(1); // QTV
- }
-
- function writeDQT()
- {
- writeWord(0xFFDB); // marker
- writeWord(132); // length
- writeByte(0);
- for (var i=0; i<64; i++) {
- writeByte(YTable[i]);
- }
- writeByte(1);
- for (var j=0; j<64; j++) {
- writeByte(UVTable[j]);
- }
- }
-
- function writeDHT()
- {
- writeWord(0xFFC4); // marker
- writeWord(0x01A2); // length
-
- writeByte(0); // HTYDCinfo
- for (var i=0; i<16; i++) {
- writeByte(std_dc_luminance_nrcodes[i+1]);
- }
- for (var j=0; j<=11; j++) {
- writeByte(std_dc_luminance_values[j]);
- }
-
- writeByte(0x10); // HTYACinfo
- for (var k=0; k<16; k++) {
- writeByte(std_ac_luminance_nrcodes[k+1]);
- }
- for (var l=0; l<=161; l++) {
- writeByte(std_ac_luminance_values[l]);
- }
-
- writeByte(1); // HTUDCinfo
- for (var m=0; m<16; m++) {
- writeByte(std_dc_chrominance_nrcodes[m+1]);
- }
- for (var n=0; n<=11; n++) {
- writeByte(std_dc_chrominance_values[n]);
- }
-
- writeByte(0x11); // HTUACinfo
- for (var o=0; o<16; o++) {
- writeByte(std_ac_chrominance_nrcodes[o+1]);
- }
- for (var p=0; p<=161; p++) {
- writeByte(std_ac_chrominance_values[p]);
- }
- }
-
- function writeSOS()
- {
- writeWord(0xFFDA); // marker
- writeWord(12); // length
- writeByte(3); // nrofcomponents
- writeByte(1); // IdY
- writeByte(0); // HTY
- writeByte(2); // IdU
- writeByte(0x11); // HTU
- writeByte(3); // IdV
- writeByte(0x11); // HTV
- writeByte(0); // Ss
- writeByte(0x3f); // Se
- writeByte(0); // Bf
- }
-
- function processDU(CDU, fdtbl, DC, HTDC, HTAC){
- var EOB = HTAC[0x00];
- var M16zeroes = HTAC[0xF0];
- var pos;
- var I16 = 16;
- var I63 = 63;
- var I64 = 64;
- var DU_DCT = fDCTQuant(CDU, fdtbl);
- //ZigZag reorder
- for (var j=0;j0)&&(DU[end0pos]==0); end0pos--) {};
- //end0pos = first element in reverse order !=0
- if ( end0pos == 0) {
- writeBits(EOB);
- return DC;
- }
- var i = 1;
- var lng;
- while ( i <= end0pos ) {
- var startpos = i;
- for (; (DU[i]==0) && (i<=end0pos); ++i) {}
- var nrzeroes = i-startpos;
- if ( nrzeroes >= I16 ) {
- lng = nrzeroes>>4;
- for (var nrmarker=1; nrmarker <= lng; ++nrmarker)
- writeBits(M16zeroes);
- nrzeroes = nrzeroes&0xF;
- }
- pos = 32767+DU[i];
- writeBits(HTAC[(nrzeroes<<4)+category[pos]]);
- writeBits(bitcode[pos]);
- i++;
- }
- if ( end0pos != I63 ) {
- writeBits(EOB);
- }
- return DC;
- }
-
- function initCharLookupTable(){
- var sfcc = String.fromCharCode;
- for(var i=0; i < 256; i++){ ///// ACHTUNG // 255
- clt[i] = sfcc(i);
- }
- }
-
- this.encode = function(image,quality) // image data object
- {
- // var time_start = new Date().getTime();
-
- if(quality) setQuality(quality);
-
- // Initialize bit writer
- byteout = new Array();
- bytenew=0;
- bytepos=7;
-
- // Add JPEG headers
- writeWord(0xFFD8); // SOI
- writeAPP0();
- writeDQT();
- writeSOF0(image.width,image.height);
- writeDHT();
- writeSOS();
-
-
- // Encode 8x8 macroblocks
- var DCY=0;
- var DCU=0;
- var DCV=0;
-
- bytenew=0;
- bytepos=7;
-
-
- this.encode.displayName = "_encode_";
-
- var imageData = image.data;
- var width = image.width;
- var height = image.height;
-
- var quadWidth = width*4;
- var tripleWidth = width*3;
-
- var x, y = 0;
- var r, g, b;
- var start,p, col,row,pos;
- while(y < height){
- x = 0;
- while(x < quadWidth){
- start = quadWidth * y + x;
- p = start;
- col = -1;
- row = 0;
-
- for(pos=0; pos < 64; pos++){
- row = pos >> 3;// /8
- col = ( pos & 7 ) * 4; // %8
- p = start + ( row * quadWidth ) + col;
-
- if(y+row >= height){ // padding bottom
- p-= (quadWidth*(y+1+row-height));
- }
-
- if(x+col >= quadWidth){ // padding right
- p-= ((x+col) - quadWidth +4)
- }
-
- r = imageData[ p++ ];
- g = imageData[ p++ ];
- b = imageData[ p++ ];
-
-
- /* // calculate YUV values dynamically
- YDU[pos]=((( 0.29900)*r+( 0.58700)*g+( 0.11400)*b))-128; //-0x80
- UDU[pos]=(((-0.16874)*r+(-0.33126)*g+( 0.50000)*b));
- VDU[pos]=((( 0.50000)*r+(-0.41869)*g+(-0.08131)*b));
- */
-
- // use lookup table (slightly faster)
- YDU[pos] = ((RGB_YUV_TABLE[r] + RGB_YUV_TABLE[(g + 256)>>0] + RGB_YUV_TABLE[(b + 512)>>0]) >> 16)-128;
- UDU[pos] = ((RGB_YUV_TABLE[(r + 768)>>0] + RGB_YUV_TABLE[(g + 1024)>>0] + RGB_YUV_TABLE[(b + 1280)>>0]) >> 16)-128;
- VDU[pos] = ((RGB_YUV_TABLE[(r + 1280)>>0] + RGB_YUV_TABLE[(g + 1536)>>0] + RGB_YUV_TABLE[(b + 1792)>>0]) >> 16)-128;
-
- }
-
- DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
- DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
- DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
- x+=32;
- }
- y+=8;
- }
-
-
- ////////////////////////////////////////////////////////////////
-
- // Do the bit alignment of the EOI marker
- if ( bytepos >= 0 ) {
- var fillbits = [];
- fillbits[1] = bytepos+1;
- fillbits[0] = (1<<(bytepos+1))-1;
- writeBits(fillbits);
- }
-
- writeWord(0xFFD9); //EOI
-
- var jpegDataUri = 'data:image/jpeg;base64,' + btoa(byteout.join(''));
-
- byteout = [];
-
- // benchmarking
- // var duration = new Date().getTime() - time_start;
- // console.log('Encoding time: '+ currentQuality + 'ms');
- //
-
- return jpegDataUri
- }
-
- function setQuality(quality){
- if (quality <= 0) {
- quality = 1;
- }
- if (quality > 100) {
- quality = 100;
- }
-
- if(currentQuality == quality) return // don't recalc if unchanged
-
- var sf = 0;
- if (quality < 50) {
- sf = Math.floor(5000 / quality);
- } else {
- sf = Math.floor(200 - quality*2);
- }
-
- initQuantTables(sf);
- currentQuality = quality;
- // console.log('Quality set to: '+quality +'%');
- }
-
- function init(){
- // var time_start = new Date().getTime();
- if(!quality) quality = 50;
- // Create tables
- initCharLookupTable()
- initHuffmanTbl();
- initCategoryNumber();
- initRGBYUVTable();
-
- setQuality(quality);
- // var duration = new Date().getTime() - time_start;
- // console.log('Initialization '+ duration + 'ms');
- }
-
- init();
-
- };
-
- JPEGEncoder.encode = function( data, quality ) {
- var encoder = new JPEGEncoder( quality );
-
- return encoder.encode( data );
- }
-
- return JPEGEncoder;
- });
- /**
- * @fileOverview Fix android canvas.toDataUrl bug.
- */
- define('runtime/html5/androidpatch',[
- 'runtime/html5/util',
- 'runtime/html5/jpegencoder',
- 'base'
- ], function( Util, encoder, Base ) {
- var origin = Util.canvasToDataUrl,
- supportJpeg;
-
- Util.canvasToDataUrl = function( canvas, type, quality ) {
- var ctx, w, h, fragement, parts;
-
- // 非android手机直接跳过。
- if ( !Base.os.android ) {
- return origin.apply( null, arguments );
- }
-
- // 检测是否canvas支持jpeg导出,根据数据格式来判断。
- // JPEG 前两位分别是:255, 216
- if ( type === 'image/jpeg' && typeof supportJpeg === 'undefined' ) {
- fragement = origin.apply( null, arguments );
-
- parts = fragement.split(',');
-
- if ( ~parts[ 0 ].indexOf('base64') ) {
- fragement = atob( parts[ 1 ] );
- } else {
- fragement = decodeURIComponent( parts[ 1 ] );
- }
-
- fragement = fragement.substring( 0, 2 );
-
- supportJpeg = fragement.charCodeAt( 0 ) === 255 &&
- fragement.charCodeAt( 1 ) === 216;
- }
-
- // 只有在android环境下才修复
- if ( type === 'image/jpeg' && !supportJpeg ) {
- w = canvas.width;
- h = canvas.height;
- ctx = canvas.getContext('2d');
-
- return encoder.encode( ctx.getImageData( 0, 0, w, h ), quality );
- }
-
- return origin.apply( null, arguments );
- };
- });
- /**
- * @fileOverview Image
- */
- define('runtime/html5/image',[
- 'base',
- 'runtime/html5/runtime',
- 'runtime/html5/util'
- ], function( Base, Html5Runtime, Util ) {
-
- var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';
-
- return Html5Runtime.register( 'Image', {
-
- // flag: 标记是否被修改过。
- modified: false,
-
- init: function() {
- var me = this,
- img = new Image();
-
- img.onload = function() {
-
- me._info = {
- type: me.type,
- width: this.width,
- height: this.height
- };
-
- // 读取meta信息。
- if ( !me._metas && 'image/jpeg' === me.type ) {
- Util.parseMeta( me._blob, function( error, ret ) {
- me._metas = ret;
- me.owner.trigger('load');
- });
- } else {
- me.owner.trigger('load');
- }
- };
-
- img.onerror = function() {
- me.owner.trigger('error');
- };
-
- me._img = img;
- },
-
- loadFromBlob: function( blob ) {
- var me = this,
- img = me._img;
-
- me._blob = blob;
- me.type = blob.type;
- img.src = Util.createObjectURL( blob.getSource() );
- me.owner.once( 'load', function() {
- Util.revokeObjectURL( img.src );
- });
- },
-
- resize: function( width, height ) {
- var canvas = this._canvas ||
- (this._canvas = document.createElement('canvas'));
-
- this._resize( this._img, canvas, width, height );
- this._blob = null; // 没用了,可以删掉了。
- this.modified = true;
- this.owner.trigger('complete');
- },
-
- getAsBlob: function( type ) {
- var blob = this._blob,
- opts = this.options,
- canvas;
-
- type = type || this.type;
-
- // blob需要重新生成。
- if ( this.modified || this.type !== type ) {
- canvas = this._canvas;
-
- if ( type === 'image/jpeg' ) {
-
- blob = Util.canvasToDataUrl( canvas, 'image/jpeg',
- opts.quality );
-
- if ( opts.preserveHeaders && this._metas &&
- this._metas.imageHead ) {
-
- blob = Util.dataURL2ArrayBuffer( blob );
- blob = Util.updateImageHead( blob,
- this._metas.imageHead );
- blob = Util.arrayBufferToBlob( blob, type );
- return blob;
- }
- } else {
- blob = Util.canvasToDataUrl( canvas, type );
- }
-
- blob = Util.dataURL2Blob( blob );
- }
-
- return blob;
- },
-
- getAsDataUrl: function( type ) {
- var opts = this.options;
-
- type = type || this.type;
-
- if ( type === 'image/jpeg' ) {
- return Util.canvasToDataUrl( this._canvas, type, opts.quality );
- } else {
- return this._canvas.toDataURL( type );
- }
- },
-
- getOrientation: function() {
- return this._metas && this._metas.exif &&
- this._metas.exif.get('Orientation') || 1;
- },
-
- info: function( val ) {
-
- // setter
- if ( val ) {
- this._info = val;
- return this;
- }
-
- // getter
- return this._info;
- },
-
- meta: function( val ) {
-
- // setter
- if ( val ) {
- this._meta = val;
- return this;
- }
-
- // getter
- return this._meta;
- },
-
- destroy: function() {
- var canvas = this._canvas;
- this._img.onload = null;
-
- if ( canvas ) {
- canvas.getContext('2d')
- .clearRect( 0, 0, canvas.width, canvas.height );
- canvas.width = canvas.height = 0;
- this._canvas = null;
- }
-
- // 释放内存。非常重要,否则释放不了image的内存。
- this._img.src = BLANK;
- this._img = this._blob = null;
- },
-
- _resize: function( img, cvs, width, height ) {
- var opts = this.options,
- naturalWidth = img.width,
- naturalHeight = img.height,
- orientation = this.getOrientation(),
- scale, w, h, x, y;
-
- // values that require 90 degree rotation
- if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
-
- // 交换width, height的值。
- width ^= height;
- height ^= width;
- width ^= height;
- }
-
- scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth,
- height / naturalHeight );
-
- // 不允许放大。
- opts.allowMagnify || (scale = Math.min( 1, scale ));
-
- w = naturalWidth * scale;
- h = naturalHeight * scale;
-
- if ( opts.crop ) {
- cvs.width = width;
- cvs.height = height;
- } else {
- cvs.width = w;
- cvs.height = h;
- }
-
- x = (cvs.width - w) / 2;
- y = (cvs.height - h) / 2;
-
- opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
-
- this._renderImageToCanvas( cvs, img, x, y, w, h );
- },
-
- _rotate2Orientaion: function( canvas, orientation ) {
- var width = canvas.width,
- height = canvas.height,
- ctx = canvas.getContext('2d');
-
- switch ( orientation ) {
- case 5:
- case 6:
- case 7:
- case 8:
- canvas.width = height;
- canvas.height = width;
- break;
- }
-
- switch ( orientation ) {
- case 2: // horizontal flip
- ctx.translate( width, 0 );
- ctx.scale( -1, 1 );
- break;
-
- case 3: // 180 rotate left
- ctx.translate( width, height );
- ctx.rotate( Math.PI );
- break;
-
- case 4: // vertical flip
- ctx.translate( 0, height );
- ctx.scale( 1, -1 );
- break;
-
- case 5: // vertical flip + 90 rotate right
- ctx.rotate( 0.5 * Math.PI );
- ctx.scale( 1, -1 );
- break;
-
- case 6: // 90 rotate right
- ctx.rotate( 0.5 * Math.PI );
- ctx.translate( 0, -height );
- break;
-
- case 7: // horizontal flip + 90 rotate right
- ctx.rotate( 0.5 * Math.PI );
- ctx.translate( width, -height );
- ctx.scale( -1, 1 );
- break;
-
- case 8: // 90 rotate left
- ctx.rotate( -0.5 * Math.PI );
- ctx.translate( -width, 0 );
- break;
- }
- },
-
- // https://github.com/stomita/ios-imagefile-megapixel/
- // blob/master/src/megapix-image.js
- _renderImageToCanvas: (function() {
-
- // 如果不是ios, 不需要这么复杂!
- if ( !Base.os.ios ) {
- return function( canvas, img, x, y, w, h ) {
- canvas.getContext('2d').drawImage( img, x, y, w, h );
- };
- }
-
- /**
- * Detecting vertical squash in loaded image.
- * Fixes a bug which squash image vertically while drawing into
- * canvas for some images.
- */
- function detectVerticalSquash( img, iw, ih ) {
- var canvas = document.createElement('canvas'),
- ctx = canvas.getContext('2d'),
- sy = 0,
- ey = ih,
- py = ih,
- data, alpha, ratio;
-
-
- canvas.width = 1;
- canvas.height = ih;
- ctx.drawImage( img, 0, 0 );
- data = ctx.getImageData( 0, 0, 1, ih ).data;
-
- // search image edge pixel position in case
- // it is squashed vertically.
- while ( py > sy ) {
- alpha = data[ (py - 1) * 4 + 3 ];
-
- if ( alpha === 0 ) {
- ey = py;
- } else {
- sy = py;
- }
-
- py = (ey + sy) >> 1;
- }
-
- ratio = (py / ih);
- return (ratio === 0) ? 1 : ratio;
- }
-
- // fix ie7 bug
- // http://stackoverflow.com/questions/11929099/
- // html5-canvas-drawimage-ratio-bug-ios
- if ( Base.os.ios >= 7 ) {
- return function( canvas, img, x, y, w, h ) {
- var iw = img.naturalWidth,
- ih = img.naturalHeight,
- vertSquashRatio = detectVerticalSquash( img, iw, ih );
-
- return canvas.getContext('2d').drawImage( img, 0, 0,
- iw * vertSquashRatio, ih * vertSquashRatio,
- x, y, w, h );
- };
- }
-
- /**
- * Detect subsampling in loaded image.
- * In iOS, larger images than 2M pixels may be
- * subsampled in rendering.
- */
- function detectSubsampling( img ) {
- var iw = img.naturalWidth,
- ih = img.naturalHeight,
- canvas, ctx;
-
- // subsampling may happen overmegapixel image
- if ( iw * ih > 1024 * 1024 ) {
- canvas = document.createElement('canvas');
- canvas.width = canvas.height = 1;
- ctx = canvas.getContext('2d');
- ctx.drawImage( img, -iw + 1, 0 );
-
- // subsampled image becomes half smaller in rendering size.
- // check alpha channel value to confirm image is covering
- // edge pixel or not. if alpha value is 0
- // image is not covering, hence subsampled.
- return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0;
- } else {
- return false;
- }
- }
-
-
- return function( canvas, img, x, y, width, height ) {
- var iw = img.naturalWidth,
- ih = img.naturalHeight,
- ctx = canvas.getContext('2d'),
- subsampled = detectSubsampling( img ),
- doSquash = this.type === 'image/jpeg',
- d = 1024,
- sy = 0,
- dy = 0,
- tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;
-
- if ( subsampled ) {
- iw /= 2;
- ih /= 2;
- }
-
- ctx.save();
- tmpCanvas = document.createElement('canvas');
- tmpCanvas.width = tmpCanvas.height = d;
-
- tmpCtx = tmpCanvas.getContext('2d');
- vertSquashRatio = doSquash ?
- detectVerticalSquash( img, iw, ih ) : 1;
-
- dw = Math.ceil( d * width / iw );
- dh = Math.ceil( d * height / ih / vertSquashRatio );
-
- while ( sy < ih ) {
- sx = 0;
- dx = 0;
- while ( sx < iw ) {
- tmpCtx.clearRect( 0, 0, d, d );
- tmpCtx.drawImage( img, -sx, -sy );
- ctx.drawImage( tmpCanvas, 0, 0, d, d,
- x + dx, y + dy, dw, dh );
- sx += d;
- dx += dw;
- }
- sy += d;
- dy += dh;
- }
- ctx.restore();
- tmpCanvas = tmpCtx = null;
- };
- })()
- });
- });
- /**
- * @fileOverview Transport
- * @todo 支持chunked传输,优势:
- * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
- * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
- */
- define('runtime/html5/transport',[
- 'base',
- 'runtime/html5/runtime'
- ], function( Base, Html5Runtime ) {
-
- var noop = Base.noop,
- $ = Base.$;
-
- return Html5Runtime.register( 'Transport', {
- init: function() {
- this._status = 0;
- this._response = null;
- },
-
- send: function() {
- var owner = this.owner,
- opts = this.options,
- xhr = this._initAjax(),
- blob = owner._blob,
- server = opts.server,
- formData, binary, fr;
-
- if ( opts.sendAsBinary ) {
- server += (/\?/.test( server ) ? '&' : '?') +
- $.param( owner._formData );
-
- binary = blob.getSource();
- } else {
- formData = new FormData();
- $.each( owner._formData, function( k, v ) {
- formData.append( k, v );
- });
-
- formData.append( opts.fileVal, blob.getSource(),
- opts.filename || owner._formData.name || '' );
- }
-
- if ( opts.withCredentials && 'withCredentials' in xhr ) {
- xhr.open( opts.method, server, true );
- xhr.withCredentials = true;
- } else {
- xhr.open( opts.method, server );
- }
-
- this._setRequestHeader( xhr, opts.headers );
-
- if ( binary ) {
- xhr.overrideMimeType('application/octet-stream');
-
- // android直接发送blob会导致服务端接收到的是空文件。
- // bug详情。
- // https://code.google.com/p/android/issues/detail?id=39882
- // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
- if ( Base.os.android ) {
- fr = new FileReader();
-
- fr.onload = function() {
- xhr.send( this.result );
- fr = fr.onload = null;
- };
-
- fr.readAsArrayBuffer( binary );
- } else {
- xhr.send( binary );
- }
- } else {
- xhr.send( formData );
- }
- },
-
- getResponse: function() {
- return this._response;
- },
-
- getResponseAsJson: function() {
- return this._parseJson( this._response );
- },
-
- getStatus: function() {
- return this._status;
- },
-
- abort: function() {
- var xhr = this._xhr;
-
- if ( xhr ) {
- xhr.upload.onprogress = noop;
- xhr.onreadystatechange = noop;
- xhr.abort();
-
- this._xhr = xhr = null;
- }
- },
-
- destroy: function() {
- this.abort();
- },
-
- _initAjax: function() {
- var me = this,
- xhr = new XMLHttpRequest(),
- opts = this.options;
-
- if ( opts.withCredentials && !('withCredentials' in xhr) &&
- typeof XDomainRequest !== 'undefined' ) {
- xhr = new XDomainRequest();
- }
-
- xhr.upload.onprogress = function( e ) {
- var percentage = 0;
-
- if ( e.lengthComputable ) {
- percentage = e.loaded / e.total;
- }
-
- return me.trigger( 'progress', percentage );
- };
-
- xhr.onreadystatechange = function() {
-
- if ( xhr.readyState !== 4 ) {
- return;
- }
-
- xhr.upload.onprogress = noop;
- xhr.onreadystatechange = noop;
- me._xhr = null;
- me._status = xhr.status;
-
- if ( xhr.status >= 200 && xhr.status < 300 ) {
- me._response = xhr.responseText;
- return me.trigger('load');
- } else if ( xhr.status >= 500 && xhr.status < 600 ) {
- me._response = xhr.responseText;
- return me.trigger( 'error', 'server' );
- }
-
-
- return me.trigger( 'error', me._status ? 'http' : 'abort' );
- };
-
- me._xhr = xhr;
- return xhr;
- },
-
- _setRequestHeader: function( xhr, headers ) {
- $.each( headers, function( key, val ) {
- xhr.setRequestHeader( key, val );
- });
- },
-
- _parseJson: function( str ) {
- var json;
-
- try {
- json = JSON.parse( str );
- } catch ( ex ) {
- json = {};
- }
-
- return json;
- }
- });
- });
- /**
- * @fileOverview FlashRuntime
- */
- define('runtime/flash/runtime',[
- 'base',
- 'runtime/runtime',
- 'runtime/compbase'
- ], function( Base, Runtime, CompBase ) {
-
- var $ = Base.$,
- type = 'flash',
- components = {};
-
-
- function getFlashVersion() {
- var version;
-
- try {
- version = navigator.plugins[ 'Shockwave Flash' ];
- version = version.description;
- } catch ( ex ) {
- try {
- version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
- .GetVariable('$version');
- } catch ( ex2 ) {
- version = '0.0';
- }
- }
- version = version.match( /\d+/g );
- return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );
- }
-
- function FlashRuntime() {
- var pool = {},
- clients = {},
- destory = this.destory,
- me = this,
- jsreciver = Base.guid('webuploader_');
-
- Runtime.apply( me, arguments );
- me.type = type;
-
-
- // 这个方法的调用者,实际上是RuntimeClient
- me.exec = function( comp, fn/*, args...*/ ) {
- var client = this,
- uid = client.uid,
- args = Base.slice( arguments, 2 ),
- instance;
-
- clients[ uid ] = client;
-
- if ( components[ comp ] ) {
- if ( !pool[ uid ] ) {
- pool[ uid ] = new components[ comp ]( client, me );
- }
-
- instance = pool[ uid ];
-
- if ( instance[ fn ] ) {
- return instance[ fn ].apply( instance, args );
- }
- }
-
- return me.flashExec.apply( client, arguments );
- };
-
- function handler( evt, obj ) {
- var type = evt.type || evt,
- parts, uid;
-
- parts = type.split('::');
- uid = parts[ 0 ];
- type = parts[ 1 ];
-
- // console.log.apply( console, arguments );
-
- if ( type === 'Ready' && uid === me.uid ) {
- me.trigger('ready');
- } else if ( clients[ uid ] ) {
- clients[ uid ].trigger( type.toLowerCase(), evt, obj );
- }
-
- // Base.log( evt, obj );
- }
-
- // flash的接受器。
- window[ jsreciver ] = function() {
- var args = arguments;
-
- // 为了能捕获得到。
- setTimeout(function() {
- handler.apply( null, args );
- }, 1 );
- };
-
- this.jsreciver = jsreciver;
-
- this.destory = function() {
- // @todo 删除池子中的所有实例
- return destory && destory.apply( this, arguments );
- };
-
- this.flashExec = function( comp, fn ) {
- var flash = me.getFlash(),
- args = Base.slice( arguments, 2 );
-
- return flash.exec( this.uid, comp, fn, args );
- };
-
- // @todo
- }
-
- Base.inherits( Runtime, {
- constructor: FlashRuntime,
-
- init: function() {
- var container = this.getContainer(),
- opts = this.options,
- html;
-
- // if not the minimal height, shims are not initialized
- // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)
- container.css({
- position: 'absolute',
- top: '-8px',
- left: '-8px',
- width: '9px',
- height: '9px',
- overflow: 'hidden'
- });
-
- // insert flash object
- html = '' +
- ' ' +
- ' ' +
- ' ' +
- ' ' +
- ' ';
-
- container.html( html );
- },
-
- getFlash: function() {
- if ( this._flash ) {
- return this._flash;
- }
-
- this._flash = $( '#' + this.uid ).get( 0 );
- return this._flash;
- }
-
- });
-
- FlashRuntime.register = function( name, component ) {
- component = components[ name ] = Base.inherits( CompBase, $.extend({
-
- // @todo fix this later
- flashExec: function() {
- var owner = this.owner,
- runtime = this.getRuntime();
-
- return runtime.flashExec.apply( owner, arguments );
- }
- }, component ) );
-
- return component;
- };
-
- if ( getFlashVersion() >= 11.4 ) {
- Runtime.addRuntime( type, FlashRuntime );
- }
-
- return FlashRuntime;
- });
- /**
- * @fileOverview FilePicker
- */
- define('runtime/flash/filepicker',[
- 'base',
- 'runtime/flash/runtime'
- ], function( Base, FlashRuntime ) {
- var $ = Base.$;
-
- return FlashRuntime.register( 'FilePicker', {
- init: function( opts ) {
- var copy = $.extend({}, opts ),
- len, i;
-
- // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug.
- len = copy.accept && copy.accept.length;
- for ( i = 0; i < len; i++ ) {
- if ( !copy.accept[ i ].title ) {
- copy.accept[ i ].title = 'Files';
- }
- }
-
- delete copy.button;
- delete copy.container;
-
- this.flashExec( 'FilePicker', 'init', copy );
- },
-
- destroy: function() {
- // todo
- }
- });
- });
- /**
- * @fileOverview 图片压缩
- */
- define('runtime/flash/image',[
- 'runtime/flash/runtime'
- ], function( FlashRuntime ) {
-
- return FlashRuntime.register( 'Image', {
- // init: function( options ) {
- // var owner = this.owner;
-
- // this.flashExec( 'Image', 'init', options );
- // owner.on( 'load', function() {
- // debugger;
- // });
- // },
-
- loadFromBlob: function( blob ) {
- var owner = this.owner;
-
- owner.info() && this.flashExec( 'Image', 'info', owner.info() );
- owner.meta() && this.flashExec( 'Image', 'meta', owner.meta() );
-
- this.flashExec( 'Image', 'loadFromBlob', blob.uid );
- }
- });
- });
- /**
- * @fileOverview Transport flash实现
- */
- define('runtime/flash/transport',[
- 'base',
- 'runtime/flash/runtime',
- 'runtime/client'
- ], function( Base, FlashRuntime, RuntimeClient ) {
- var $ = Base.$;
-
- return FlashRuntime.register( 'Transport', {
- init: function() {
- this._status = 0;
- this._response = null;
- this._responseJson = null;
- },
-
- send: function() {
- var owner = this.owner,
- opts = this.options,
- xhr = this._initAjax(),
- blob = owner._blob,
- server = opts.server,
- binary;
-
- xhr.connectRuntime( blob.ruid );
-
- if ( opts.sendAsBinary ) {
- server += (/\?/.test( server ) ? '&' : '?') +
- $.param( owner._formData );
-
- binary = blob.uid;
- } else {
- $.each( owner._formData, function( k, v ) {
- xhr.exec( 'append', k, v );
- });
-
- xhr.exec( 'appendBlob', opts.fileVal, blob.uid,
- opts.filename || owner._formData.name || '' );
- }
-
- this._setRequestHeader( xhr, opts.headers );
- xhr.exec( 'send', {
- method: opts.method,
- url: server
- }, binary );
- },
-
- getStatus: function() {
- return this._status;
- },
-
- getResponse: function() {
- return this._response;
- },
-
- getResponseAsJson: function() {
- return this._responseJson;
- },
-
- abort: function() {
- var xhr = this._xhr;
-
- if ( xhr ) {
- xhr.exec('abort');
- xhr.destroy();
- this._xhr = xhr = null;
- }
- },
-
- destroy: function() {
- this.abort();
- },
-
- _initAjax: function() {
- var me = this,
- xhr = new RuntimeClient('XMLHttpRequest');
-
- xhr.on( 'uploadprogress progress', function( e ) {
- return me.trigger( 'progress', e.loaded / e.total );
- });
-
- xhr.on( 'load', function() {
- var status = xhr.exec('getStatus'),
- err = '';
-
- xhr.off();
- me._xhr = null;
-
- if ( status >= 200 && status < 300 ) {
- me._response = xhr.exec('getResponse');
- me._responseJson = xhr.exec('getResponseAsJson');
- } else if ( status >= 500 && status < 600 ) {
- me._response = xhr.exec('getResponse');
- me._responseJson = xhr.exec('getResponseAsJson');
- err = 'server';
- } else {
- err = 'http';
- }
-
- xhr.destroy();
- xhr = null;
-
- return err ? me.trigger( 'error', err ) : me.trigger('load');
- });
-
- xhr.on( 'error', function() {
- xhr.off();
- me._xhr = null;
- me.trigger( 'error', 'http' );
- });
-
- me._xhr = xhr;
- return xhr;
- },
-
- _setRequestHeader: function( xhr, headers ) {
- $.each( headers, function( key, val ) {
- xhr.exec( 'setRequestHeader', key, val );
- });
- }
- });
- });
- /**
- * @fileOverview 完全版本。
- */
- define('preset/all',[
- 'base',
-
- // widgets
- 'widgets/filednd',
- 'widgets/filepaste',
- 'widgets/filepicker',
- 'widgets/image',
- 'widgets/queue',
- 'widgets/runtime',
- 'widgets/upload',
- 'widgets/validator',
-
- // runtimes
- // html5
- 'runtime/html5/blob',
- 'runtime/html5/dnd',
- 'runtime/html5/filepaste',
- 'runtime/html5/filepicker',
- 'runtime/html5/imagemeta/exif',
- 'runtime/html5/androidpatch',
- 'runtime/html5/image',
- 'runtime/html5/transport',
-
- // flash
- 'runtime/flash/filepicker',
- 'runtime/flash/image',
- 'runtime/flash/transport'
- ], function( Base ) {
- return Base;
- });
- define('webuploader',[
- 'preset/all'
- ], function( preset ) {
- return preset;
- });
- return require('webuploader');
-});
diff --git a/www/js/ueditor/third-party/webuploader/webuploader.min.js b/www/js/ueditor/third-party/webuploader/webuploader.min.js
deleted file mode 100644
index 8807780cbe..0000000000
--- a/www/js/ueditor/third-party/webuploader/webuploader.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* WebUploader 0.1.2 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}},j=b(a,f,e);i(j),"object"==typeof module&&"object"==typeof module.exports?module.exports=j:"function"==typeof define&&define.amd?define([],j):(c=a.WebUploader,a.WebUploader=j,a.WebUploader.noConflict=function(){a.WebUploader=c})}(this,function(a,b,c){return b("dollar-third",[],function(){return a.jQuery||a.Zepto}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.2",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return{successNum:a.numOfSuccess,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.parentNode.removeChild(this.__container),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/dnd",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},d.options,a),a.container=e(a.container),a.container.length&&c.call(this,"DragAndDrop")}var e=a.$;return d.options={accept:null,disableGlobalDnd:!1},a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})},destroy:function(){this.disconnectRuntime()}}),b.installTo(d.prototype),d}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g={},h=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):g},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[];return e.each(h,function(c,d){b.push(new d(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,h,i,j,k=0,l=this._widgets,m=l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],h=f.invoke(b,d),h!==g&&(a.isPromise(h)?o.push(h):n.push(h));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return setTimeout(function(){b.resolve.apply(b,c)},1),b.promise()})[j](e||a.noop)):n[0]}}),b.register=d.register=function(b,c){var f,g={init:"init"};return 1===arguments.length?(c=b,c.responseMap=g):c.responseMap=e.extend(g,b),f=a.inherits(d,c),h.push(f),f},d}),b("widgets/filednd",["base","uploader","lib/dnd","widgets/widget"],function(a,b,c){var d=a.$;return b.options.dnd="",b.register({init:function(b){if(b.dnd&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{disableGlobalDnd:b.disableGlobalDnd,container:b.dnd,accept:b.accept});return e=new c(h),e.once("ready",g.resolve),e.on("drop",function(a){f.request("add-file",[a])}),e.on("accept",function(a){return f.owner.trigger("dndAccept",a)}),e.init(),g.promise()}}})}),b("lib/filepaste",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},a),a.container=e(a.container||document.body),c.call(this,"FilePaste")}var e=a.$;return a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})},destroy:function(){this.exec("destroy"),this.disconnectRuntime(),this.off()}}),b.installTo(d.prototype),d}),b("widgets/filepaste",["base","uploader","lib/filepaste","widgets/widget"],function(a,b,c){var d=a.$;return b.register({init:function(b){if(b.paste&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{container:b.paste,accept:b.accept});return e=new c(h),e.once("ready",g.resolve),e.on("paste",function(a){f.owner.request("add-file",[a])}),e.init(),g.promise()}}})}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,b.call(d,"Blob"),this.uid=c.uid||this.uid,this.type=c.type||"",this.size=c.size||0,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;b.apply(this,arguments),this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&this.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(this.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),!this.type&&~"jpg,jpeg,png,gif,bmp".indexOf(f)&&(this.type="image/"+("jpg"===f?"jpeg":f)),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString()}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var b=this,c=b.options,e=c.button;e.addClass("webuploader-pick"),b.on("all",function(a){var g;switch(a){case"mouseenter":e.addClass("webuploader-pick-hover");break;case"mouseleave":e.removeClass("webuploader-pick-hover");break;case"change":g=b.exec("getFiles"),b.trigger("select",f.map(g,function(a){return a=new d(b.getRuid(),a),a._refer=c.container,a}),c.container)}}),b.connectRuntime(c,function(){b.refresh(),b.exec("init",c),b.trigger("ready")}),f(a).on("resize",function(){b.refresh()})},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){this.runtime&&(this.exec("destroy"),this.disconnectRuntime())}}),e}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({"add-btn":"addButton",refresh:"refresh",disable:"disable",enable:"enable"},{init:function(a){return this.pickers=[],a.pick&&this.addButton(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addButton:function(b){var e,f,g,h=this,i=h.options,j=i.accept;if(b)return g=a.Deferred(),d.isPlainObject(b)||(b={id:b}),e=d.extend({},b,{accept:d.isPlainObject(j)?[j]:j,swf:i.swf,runtimeOrder:i.runtimeOrder}),f=new c(e),f.once("ready",g.resolve),f.on("select",function(a){h.owner.request("add-file",[a])}),f.init(),this.pickers.push(f),g.promise()},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})}})}),b("lib/image",["base","runtime/client","lib/blob"],function(a,b,c){function d(a){this.options=e.extend({},d.options,a),b.call(this,"Image"),this.on("load",function(){this._info=this.exec("info"),this._meta=this.exec("meta")})}var e=a.$;return d.options={quality:90,crop:!1,preserveHeaders:!0,allowMagnify:!0},a.inherits(b,{constructor:d,info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},loadFromBlob:function(a){var b=this,c=a.getRuid();this.connectRuntime(c,function(){b.exec("init",b.options),b.exec("loadFromBlob",a)})},resize:function(){var b=a.slice(arguments);return this.exec.apply(this,["resize"].concat(b))},getAsDataUrl:function(a){return this.exec("getAsDataUrl",a)},getAsBlob:function(a){var b=this.exec("getAsBlob",a);return new c(this.getRuid(),b)}}),d}),b("widgets/image",["base","uploader","lib/image","widgets/widget"],function(a,b,c){var d,e=a.$;return d=function(a){var b=0,c=[],d=function(){for(var d;c.length&&a>b;)d=c.shift(),b+=d[0],d[1]()};return function(a,e,f){c.push([e,f]),a.once("destroy",function(){b-=e,setTimeout(d,1)}),setTimeout(d,1)}}(5242880),e.extend(b.options,{thumb:{width:110,height:110,quality:70,allowMagnify:!0,crop:!0,preserveHeaders:!1,type:"image/jpeg"},compress:{width:1600,height:1600,quality:90,allowMagnify:!1,crop:!1,preserveHeaders:!0}}),b.register({"make-thumb":"makeThumb","before-send-file":"compressImage"},{makeThumb:function(a,b,f,g){var h,i;return a=this.request("get-file",a),a.type.match(/^image/)?(h=e.extend({},this.options.thumb),e.isPlainObject(f)&&(h=e.extend(h,f),f=null),f=f||h.width,g=g||h.height,i=new c(h),i.once("load",function(){a._info=a._info||i.info(),a._meta=a._meta||i.meta(),i.resize(f,g)}),i.once("complete",function(){b(!1,i.getAsDataUrl(h.type)),i.destroy()}),i.once("error",function(){b(!0),i.destroy()}),void d(i,a.source.size,function(){a._info&&i.info(a._info),a._meta&&i.meta(a._meta),i.loadFromBlob(a.source)})):void b(!0)},compressImage:function(b){var d,f,g=this.options.compress||this.options.resize,h=g&&g.compressSize||307200;return b=this.request("get-file",b),!g||!~"image/jpeg,image/jpg".indexOf(b.type)||b.sizeb;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)})),a.setStatus(f.QUEUED)},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({"sort-files":"sortFiles","add-file":"addFiles","get-file":"getFile","fetch-file":"fetchFile","get-stats":"getStats","get-files":"getFiles","remove-file":"removeFile",retry:"retry",reset:"reset","accept-file":"acceptFile"},{init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||a.size<6||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFiles:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&b.request("start-upload")},getStats:function(){return this.stats},removeFile:function(a){var b=this;a=a.id?a:b.queue.getFile(a),a.setStatus(i.CANCELLED),b.owner.trigger("fileDequeued",a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.queue=new c,this.stats=this.queue.stats}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({"predict-runtime-type":"predictRuntmeType"},{init:function(){if(!this.predictRuntmeType())throw Error("Runtime Error")},predictRuntmeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){for(var c,d=[],e=a.source,f=e.size,g=b?Math.ceil(f/b):1,h=0,i=0;g>i;)c=Math.min(b,f-h),d.push({file:a,start:h,end:b?h+c:f,total:f,chunks:g,chunk:i++}),h+=c;return a.blocks=d.concat(),a.remaning=d.length,{file:a,has:function(){return!!d.length},fetch:function(){return d.shift()}}}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:null}),b.register({"start-upload":"start","stop-upload":"stop","skip-file":"skipFile","is-in-progress":"isInProgress"},{init:function(){var b=this.owner;this.runing=!1,this.pool=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},start:function(){var b=this;f.each(b.request("get-files",h.INVALID),function(){b.request("remove-file",this)}),b.runing||(b.runing=!0,f.each(b.pool,function(a,c){var d=c.file;d.getStatus()===h.INTERRUPT&&(d.setStatus(h.PROGRESS),b._trigged=!1,c.transport&&c.transport.send())}),b._trigged=!1,b.owner.trigger("startUpload"),a.nextTick(b.__tick))},stop:function(a){var b=this;b.runing!==!1&&(b.runing=!1,a&&f.each(b.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),b.owner.trigger("stopUpload"))},isInProgress:function(){return!!this.runing},getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length1&&(f.each(k.blocks,function(a,b){d+=(b.percentage||0)*(b.end-b.start)}),c=d/k.size),i.trigger("uploadProgress",k,c||0)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({init:function(){var a=this;e.each(f,function(){this.call(a.owner)})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=b.fileNumLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=b.fileSizeLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}))}),d}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destory;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destory=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/dnd",["base","runtime/html5/runtime","lib/file"],function(a,b,c){var d=a.$,e="webuploader-dnd-";return b.register("DragAndDrop",{init:function(){var b=this.elem=this.options.container;this.dragEnterHandler=a.bindFn(this._dragEnterHandler,this),this.dragOverHandler=a.bindFn(this._dragOverHandler,this),this.dragLeaveHandler=a.bindFn(this._dragLeaveHandler,this),this.dropHandler=a.bindFn(this._dropHandler,this),this.dndOver=!1,b.on("dragenter",this.dragEnterHandler),b.on("dragover",this.dragOverHandler),b.on("dragleave",this.dragLeaveHandler),b.on("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).on("dragover",this.dragOverHandler),d(document).on("drop",this.dropHandler))
-},_dragEnterHandler:function(a){var b,c=this,d=c._denied||!1;return a=a.originalEvent||a,c.dndOver||(c.dndOver=!0,b=a.dataTransfer.items,b&&b.length&&(c._denied=d=!c.trigger("accept",b)),c.elem.addClass(e+"over"),c.elem[d?"addClass":"removeClass"](e+"denied")),a.dataTransfer.dropEffect=d?"none":"copy",!1},_dragOverHandler:function(a){var b=this.elem.parent().get(0);return b&&!d.contains(b,a.currentTarget)?!1:(clearTimeout(this._leaveTimer),this._dragEnterHandler.call(this,a),!1)},_dragLeaveHandler:function(){var a,b=this;return a=function(){b.dndOver=!1,b.elem.removeClass(e+"over "+e+"denied")},clearTimeout(b._leaveTimer),b._leaveTimer=setTimeout(a,100),!1},_dropHandler:function(a){var b=this,f=b.getRuid(),g=b.elem.parent().get(0);return g&&!d.contains(g,a.currentTarget)?!1:(b._getTansferFiles(a,function(a){b.trigger("drop",d.map(a,function(a){return new c(f,a)}))}),b.dndOver=!1,b.elem.removeClass(e+"over"),!1)},_getTansferFiles:function(b,c){var d,e,f,g,h,i,j,k,l=[],m=[];for(b=b.originalEvent||b,f=b.dataTransfer,d=f.items,e=f.files,k=!(!d||!d[0].webkitGetAsEntry),i=0,j=e.length;j>i;i++)g=e[i],h=d&&d[i],k&&h.webkitGetAsEntry().isDirectory?m.push(this._traverseDirectoryTree(h.webkitGetAsEntry(),l)):l.push(g);a.when.apply(a,m).done(function(){l.length&&c(l)})},_traverseDirectoryTree:function(b,c){var d=a.Deferred(),e=this;return b.isFile?b.file(function(a){c.push(a),d.resolve()}):b.isDirectory&&b.createReader().readEntries(function(b){var f,g=b.length,h=[],i=[];for(f=0;g>f;f++)h.push(e._traverseDirectoryTree(b[f],i));a.when.apply(a,h).then(function(){c.push.apply(c,i),d.resolve()},d.reject)}),d.promise()},destroy:function(){var a=this.elem;a.off("dragenter",this.dragEnterHandler),a.off("dragover",this.dragEnterHandler),a.off("dragleave",this.dragLeaveHandler),a.off("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).off("dragover",this.dragOverHandler),d(document).off("drop",this.dropHandler))}})}),b("runtime/html5/filepaste",["base","runtime/html5/runtime","lib/file"],function(a,b,c){return b.register("FilePaste",{init:function(){var b,c,d,e,f=this.options,g=this.elem=f.container,h=".*";if(f.accept){for(b=[],c=0,d=f.accept.length;d>c;c++)e=f.accept[c].mimeTypes,e&&b.push(e);b.length&&(h=b.join(","),h=h.replace(/,/g,"|").replace(/\*/g,".*"))}this.accept=h=new RegExp(h,"i"),this.hander=a.bindFn(this._pasteHander,this),g.on("paste",this.hander)},_pasteHander:function(a){var b,d,e,f,g,h=[],i=this.getRuid();for(a=a.originalEvent||a,b=a.clipboardData.items,f=0,g=b.length;g>f;f++)d=b[f],"file"===d.kind&&(e=d.getAsFile())&&h.push(new c(i,e));h.length&&(a.preventDefault(),a.stopPropagation(),this.trigger("paste",h))},destroy:function(){this.elem.off("paste",this.hander)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=c(document.createElement("label")),k=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){}})}),b("runtime/html5/util",["base"],function(b){var c=a.createObjectURL&&a||a.URL&&URL.revokeObjectURL&&URL||a.webkitURL,d=b.noop,e=d;return c&&(d=function(){return c.createObjectURL.apply(c,arguments)},e=function(){return c.revokeObjectURL.apply(c,arguments)}),{createObjectURL:d,revokeObjectURL:e,dataURL2Blob:function(a){var b,c,d,e,f,g;for(g=a.split(","),b=~g[0].indexOf("base64")?atob(g[1]):decodeURIComponent(g[1]),d=new ArrayBuffer(b.length),c=new Uint8Array(d),e=0;ei&&(d=h.getUint16(i),d>=65504&&65519>=d||65534===d)&&(e=h.getUint16(i+2)+2,!(i+e>h.byteLength));){if(f=b.parsers[d],!c&&f)for(g=0;g6&&(l.imageHead=a.slice?a.slice(2,k):new Uint8Array(a).subarray(2,k))}return l}},updateImageHead:function(a,b){var c,d,e,f=this._parse(a,!0);return e=2,f.imageHead&&(e=2+f.imageHead.byteLength),d=a.slice?a.slice(e):new Uint8Array(a).subarray(e),c=new Uint8Array(b.byteLength+2+d.byteLength),c[0]=255,c[1]=216,c.set(new Uint8Array(b),2),c.set(new Uint8Array(d),b.byteLength+2),c.buffer}},a.parseMeta=function(){return b.parse.apply(b,arguments)},a.updateImageHead=function(){return b.updateImageHead.apply(b,arguments)},b}),b("runtime/html5/imagemeta/exif",["base","runtime/html5/imagemeta"],function(a,b){var c={};return c.ExifMap=function(){return this},c.ExifMap.prototype.map={Orientation:274},c.ExifMap.prototype.get=function(a){return this[a]||this[this.map[a]]},c.exifTagTypes={1:{getValue:function(a,b){return a.getUint8(b)},size:1},2:{getValue:function(a,b){return String.fromCharCode(a.getUint8(b))},size:1,ascii:!0},3:{getValue:function(a,b,c){return a.getUint16(b,c)},size:2},4:{getValue:function(a,b,c){return a.getUint32(b,c)},size:4},5:{getValue:function(a,b,c){return a.getUint32(b,c)/a.getUint32(b+4,c)},size:8},9:{getValue:function(a,b,c){return a.getInt32(b,c)},size:4},10:{getValue:function(a,b,c){return a.getInt32(b,c)/a.getInt32(b+4,c)},size:8}},c.exifTagTypes[7]=c.exifTagTypes[1],c.getExifValue=function(b,d,e,f,g,h){var i,j,k,l,m,n,o=c.exifTagTypes[f];if(!o)return void a.log("Invalid Exif data: Invalid tag type.");if(i=o.size*g,j=i>4?d+b.getUint32(e+8,h):e+8,j+i>b.byteLength)return void a.log("Invalid Exif data: Invalid data offset.");if(1===g)return o.getValue(b,j,h);for(k=[],l=0;g>l;l+=1)k[l]=o.getValue(b,j+l*o.size,h);if(o.ascii){for(m="",l=0;lb.byteLength)return void a.log("Invalid Exif data: Invalid directory offset.");if(g=b.getUint16(d,e),h=d+2+12*g,h+4>b.byteLength)return void a.log("Invalid Exif data: Invalid directory size.");for(i=0;g>i;i+=1)this.parseExifTag(b,c,d+2+12*i,e,f);return b.getUint32(h,e)},c.parseExifData=function(b,d,e,f){var g,h,i=d+10;if(1165519206===b.getUint32(d+4)){if(i+8>b.byteLength)return void a.log("Invalid Exif data: Invalid segment size.");if(0!==b.getUint16(d+8))return void a.log("Invalid Exif data: Missing byte alignment offset.");switch(b.getUint16(i)){case 18761:g=!0;break;case 19789:g=!1;break;default:return void a.log("Invalid Exif data: Invalid byte alignment marker.")}if(42!==b.getUint16(i+2,g))return void a.log("Invalid Exif data: Missing TIFF marker.");h=b.getUint32(i+4,g),f.exif=new c.ExifMap,h=c.parseExifTags(b,i,i+h,g,f)}},b.parsers[65505].push(c.parseExifData),c}),b("runtime/html5/jpegencoder",[],function(){function a(a){function b(a){for(var b=[16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99],c=0;64>c;c++){var d=y((b[c]*a+50)/100);1>d?d=1:d>255&&(d=255),z[P[c]]=d}for(var e=[17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99],f=0;64>f;f++){var g=y((e[f]*a+50)/100);1>g?g=1:g>255&&(g=255),A[P[f]]=g}for(var h=[1,1.387039845,1.306562965,1.175875602,1,.785694958,.5411961,.275899379],i=0,j=0;8>j;j++)for(var k=0;8>k;k++)B[i]=1/(z[P[i]]*h[j]*h[k]*8),C[i]=1/(A[P[i]]*h[j]*h[k]*8),i++}function c(a,b){for(var c=0,d=0,e=new Array,f=1;16>=f;f++){for(var g=1;g<=a[f];g++)e[b[d]]=[],e[b[d]][0]=c,e[b[d]][1]=f,d++,c++;c*=2}return e}function d(){t=c(Q,R),u=c(U,V),v=c(S,T),w=c(W,X)}function e(){for(var a=1,b=2,c=1;15>=c;c++){for(var d=a;b>d;d++)E[32767+d]=c,D[32767+d]=[],D[32767+d][1]=c,D[32767+d][0]=d;for(var e=-(b-1);-a>=e;e++)E[32767+e]=c,D[32767+e]=[],D[32767+e][1]=c,D[32767+e][0]=b-1+e;a<<=1,b<<=1}}function f(){for(var a=0;256>a;a++)O[a]=19595*a,O[a+256>>0]=38470*a,O[a+512>>0]=7471*a+32768,O[a+768>>0]=-11059*a,O[a+1024>>0]=-21709*a,O[a+1280>>0]=32768*a+8421375,O[a+1536>>0]=-27439*a,O[a+1792>>0]=-5329*a}function g(a){for(var b=a[0],c=a[1]-1;c>=0;)b&1<J&&(255==I?(h(255),h(0)):h(I),J=7,I=0)}function h(a){H.push(N[a])}function i(a){h(a>>8&255),h(255&a)}function j(a,b){var c,d,e,f,g,h,i,j,k,l=0,m=8,n=64;for(k=0;m>k;++k){c=a[l],d=a[l+1],e=a[l+2],f=a[l+3],g=a[l+4],h=a[l+5],i=a[l+6],j=a[l+7];var o=c+j,p=c-j,q=d+i,r=d-i,s=e+h,t=e-h,u=f+g,v=f-g,w=o+u,x=o-u,y=q+s,z=q-s;a[l]=w+y,a[l+4]=w-y;var A=.707106781*(z+x);a[l+2]=x+A,a[l+6]=x-A,w=v+t,y=t+r,z=r+p;var B=.382683433*(w-z),C=.5411961*w+B,D=1.306562965*z+B,E=.707106781*y,G=p+E,H=p-E;a[l+5]=H+C,a[l+3]=H-C,a[l+1]=G+D,a[l+7]=G-D,l+=8}for(l=0,k=0;m>k;++k){c=a[l],d=a[l+8],e=a[l+16],f=a[l+24],g=a[l+32],h=a[l+40],i=a[l+48],j=a[l+56];var I=c+j,J=c-j,K=d+i,L=d-i,M=e+h,N=e-h,O=f+g,P=f-g,Q=I+O,R=I-O,S=K+M,T=K-M;a[l]=Q+S,a[l+32]=Q-S;var U=.707106781*(T+R);a[l+16]=R+U,a[l+48]=R-U,Q=P+N,S=N+L,T=L+J;var V=.382683433*(Q-T),W=.5411961*Q+V,X=1.306562965*T+V,Y=.707106781*S,Z=J+Y,$=J-Y;a[l+40]=$+W,a[l+24]=$-W,a[l+8]=Z+X,a[l+56]=Z-X,l++}var _;for(k=0;n>k;++k)_=a[k]*b[k],F[k]=_>0?_+.5|0:_-.5|0;return F}function k(){i(65504),i(16),h(74),h(70),h(73),h(70),h(0),h(1),h(1),h(0),i(1),i(1),h(0),h(0)}function l(a,b){i(65472),i(17),h(8),i(b),i(a),h(3),h(1),h(17),h(0),h(2),h(17),h(1),h(3),h(17),h(1)}function m(){i(65499),i(132),h(0);for(var a=0;64>a;a++)h(z[a]);h(1);for(var b=0;64>b;b++)h(A[b])}function n(){i(65476),i(418),h(0);for(var a=0;16>a;a++)h(Q[a+1]);for(var b=0;11>=b;b++)h(R[b]);h(16);for(var c=0;16>c;c++)h(S[c+1]);for(var d=0;161>=d;d++)h(T[d]);h(1);for(var e=0;16>e;e++)h(U[e+1]);for(var f=0;11>=f;f++)h(V[f]);h(17);for(var g=0;16>g;g++)h(W[g+1]);for(var j=0;161>=j;j++)h(X[j])}function o(){i(65498),i(12),h(3),h(1),h(0),h(2),h(17),h(3),h(17),h(0),h(63),h(0)}function p(a,b,c,d,e){for(var f,h=e[0],i=e[240],k=16,l=63,m=64,n=j(a,b),o=0;m>o;++o)G[P[o]]=n[o];var p=G[0]-c;c=G[0],0==p?g(d[0]):(f=32767+p,g(d[E[f]]),g(D[f]));for(var q=63;q>0&&0==G[q];q--);if(0==q)return g(h),c;for(var r,s=1;q>=s;){for(var t=s;0==G[s]&&q>=s;++s);var u=s-t;if(u>=k){r=u>>4;for(var v=1;r>=v;++v)g(i);u=15&u}f=32767+G[s],g(e[(u<<4)+E[f]]),g(D[f]),s++}return q!=l&&g(h),c}function q(){for(var a=String.fromCharCode,b=0;256>b;b++)N[b]=a(b)}function r(a){if(0>=a&&(a=1),a>100&&(a=100),x!=a){var c=0;c=Math.floor(50>a?5e3/a:200-2*a),b(c),x=a}}function s(){a||(a=50),q(),d(),e(),f(),r(a)}var t,u,v,w,x,y=(Math.round,Math.floor),z=new Array(64),A=new Array(64),B=new Array(64),C=new Array(64),D=new Array(65535),E=new Array(65535),F=new Array(64),G=new Array(64),H=[],I=0,J=7,K=new Array(64),L=new Array(64),M=new Array(64),N=new Array(256),O=new Array(2048),P=[0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63],Q=[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0],R=[0,1,2,3,4,5,6,7,8,9,10,11],S=[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125],T=[1,2,3,0,4,17,5,18,33,49,65,6,19,81,97,7,34,113,20,50,129,145,161,8,35,66,177,193,21,82,209,240,36,51,98,114,130,9,10,22,23,24,25,26,37,38,39,40,41,42,52,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,225,226,227,228,229,230,231,232,233,234,241,242,243,244,245,246,247,248,249,250],U=[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0],V=[0,1,2,3,4,5,6,7,8,9,10,11],W=[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,119],X=[0,1,2,3,17,4,5,33,49,6,18,65,81,7,97,113,19,34,50,129,8,20,66,145,161,177,193,9,35,51,82,240,21,98,114,209,10,22,36,52,225,37,241,23,24,25,26,38,39,40,41,42,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,130,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,226,227,228,229,230,231,232,233,234,242,243,244,245,246,247,248,249,250];this.encode=function(a,b){b&&r(b),H=new Array,I=0,J=7,i(65496),k(),m(),l(a.width,a.height),n(),o();var c=0,d=0,e=0;I=0,J=7,this.encode.displayName="_encode_";for(var f,h,j,q,s,x,y,z,A,D=a.data,E=a.width,F=a.height,G=4*E,N=0;F>N;){for(f=0;G>f;){for(s=G*N+f,x=s,y=-1,z=0,A=0;64>A;A++)z=A>>3,y=4*(7&A),x=s+z*G+y,N+z>=F&&(x-=G*(N+1+z-F)),f+y>=G&&(x-=f+y-G+4),h=D[x++],j=D[x++],q=D[x++],K[A]=(O[h]+O[j+256>>0]+O[q+512>>0]>>16)-128,L[A]=(O[h+768>>0]+O[j+1024>>0]+O[q+1280>>0]>>16)-128,M[A]=(O[h+1280>>0]+O[j+1536>>0]+O[q+1792>>0]>>16)-128;c=p(K,B,c,t,v),d=p(L,C,d,u,w),e=p(M,C,e,u,w),f+=32}N+=8}if(J>=0){var P=[];P[1]=J+1,P[0]=(1<i;)e=d[4*(k-1)+3],0===e?j=k:i=k,k=j+i>>1;return f=k/c,0===f?1:f}function c(a){var b,c,d=a.naturalWidth,e=a.naturalHeight;return d*e>1048576?(b=document.createElement("canvas"),b.width=b.height=1,c=b.getContext("2d"),c.drawImage(a,-d+1,0),0===c.getImageData(0,0,1,1).data[3]):!1}return a.os.ios?a.os.ios>=7?function(a,c,d,e,f,g){var h=c.naturalWidth,i=c.naturalHeight,j=b(c,h,i);return a.getContext("2d").drawImage(c,0,0,h*j,i*j,d,e,f,g)}:function(a,d,e,f,g,h){var i,j,k,l,m,n,o,p=d.naturalWidth,q=d.naturalHeight,r=a.getContext("2d"),s=c(d),t="image/jpeg"===this.type,u=1024,v=0,w=0;for(s&&(p/=2,q/=2),r.save(),i=document.createElement("canvas"),i.width=i.height=u,j=i.getContext("2d"),k=t?b(d,p,q):1,l=Math.ceil(u*g/p),m=Math.ceil(u*h/q/k);q>v;){for(n=0,o=0;p>n;)j.clearRect(0,0,u,u),j.drawImage(d,-n,-v),r.drawImage(i,0,0,u,u,e+o,f+w,l,m),n+=u,o+=l;v+=u,w+=m}r.restore(),i=j=null}:function(a,b,c,d,e,f){a.getContext("2d").drawImage(b,c,d,e,f)}}()})}),b("runtime/html5/transport",["base","runtime/html5/runtime"],function(a,b){var c=a.noop,d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null},send:function(){var b,c,e,f=this.owner,g=this.options,h=this._initAjax(),i=f._blob,j=g.server;g.sendAsBinary?(j+=(/\?/.test(j)?"&":"?")+d.param(f._formData),c=i.getSource()):(b=new FormData,d.each(f._formData,function(a,c){b.append(a,c)}),b.append(g.fileVal,i.getSource(),g.filename||f._formData.name||"")),g.withCredentials&&"withCredentials"in h?(h.open(g.method,j,!0),h.withCredentials=!0):h.open(g.method,j),this._setRequestHeader(h,g.headers),c?(h.overrideMimeType("application/octet-stream"),a.os.android?(e=new FileReader,e.onload=function(){h.send(this.result),e=e.onload=null},e.readAsArrayBuffer(c)):h.send(c)):h.send(b)},getResponse:function(){return this._response},getResponseAsJson:function(){return this._parseJson(this._response)},getStatus:function(){return this._status},abort:function(){var a=this._xhr;a&&(a.upload.onprogress=c,a.onreadystatechange=c,a.abort(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new XMLHttpRequest,d=this.options;return!d.withCredentials||"withCredentials"in b||"undefined"==typeof XDomainRequest||(b=new XDomainRequest),b.upload.onprogress=function(b){var c=0;return b.lengthComputable&&(c=b.loaded/b.total),a.trigger("progress",c)},b.onreadystatechange=function(){return 4===b.readyState?(b.upload.onprogress=c,b.onreadystatechange=c,a._xhr=null,a._status=b.status,b.status>=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("runtime/flash/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a;try{a=navigator.plugins["Shockwave Flash"],a=a.description}catch(b){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(c){a="0.0"}}return a=a.match(/\d+/g),parseFloat(a[0]+"."+a[1],10)}function f(){function d(a,b){var c,d,e=a.type||a;c=e.split("::"),d=c[0],e=c[1],"Ready"===e&&d===j.uid?j.trigger("ready"):f[d]&&f[d].trigger(e.toLowerCase(),a,b)}var e={},f={},g=this.destory,j=this,k=b.guid("webuploader_");c.apply(j,arguments),j.type=h,j.exec=function(a,c){var d,g=this,h=g.uid,k=b.slice(arguments,2);return f[h]=g,i[a]&&(e[h]||(e[h]=new i[a](g,j)),d=e[h],d[c])?d[c].apply(d,k):j.flashExec.apply(g,arguments)},a[k]=function(){var a=arguments;setTimeout(function(){d.apply(null,a)},1)},this.jsreciver=k,this.destory=function(){return g&&g.apply(this,arguments)},this.flashExec=function(a,c){var d=j.getFlash(),e=b.slice(arguments,2);return d.exec(this.uid,a,c,e)}}var g=b.$,h="flash",i={};return b.inherits(c,{constructor:f,init:function(){var a,c=this.getContainer(),d=this.options;c.css({position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),a=' ',c.html(a)},getFlash:function(){return this._flash?this._flash:(this._flash=g("#"+this.uid).get(0),this._flash)}}),f.register=function(a,c){return c=i[a]=b.inherits(d,g.extend({flashExec:function(){var a=this.owner,b=this.getRuntime();return b.flashExec.apply(a,arguments)}},c))},e()>=11.4&&c.addRuntime(h,f),f}),b("runtime/flash/filepicker",["base","runtime/flash/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(a){var b,d,e=c.extend({},a);for(b=e.accept&&e.accept.length,d=0;b>d;d++)e.accept[d].title||(e.accept[d].title="Files");delete e.button,delete e.container,this.flashExec("FilePicker","init",e)},destroy:function(){}})}),b("runtime/flash/image",["runtime/flash/runtime"],function(a){return a.register("Image",{loadFromBlob:function(a){var b=this.owner;b.info()&&this.flashExec("Image","info",b.info()),b.meta()&&this.flashExec("Image","meta",b.meta()),this.flashExec("Image","loadFromBlob",a.uid)}})}),b("runtime/flash/transport",["base","runtime/flash/runtime","runtime/client"],function(a,b,c){var d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null,this._responseJson=null},send:function(){var a,b=this.owner,c=this.options,e=this._initAjax(),f=b._blob,g=c.server;e.connectRuntime(f.ruid),c.sendAsBinary?(g+=(/\?/.test(g)?"&":"?")+d.param(b._formData),a=f.uid):(d.each(b._formData,function(a,b){e.exec("append",a,b)}),e.exec("appendBlob",c.fileVal,f.uid,c.filename||b._formData.name||"")),this._setRequestHeader(e,c.headers),e.exec("send",{method:c.method,url:g},a)},getStatus:function(){return this._status},getResponse:function(){return this._response},getResponseAsJson:function(){return this._responseJson},abort:function(){var a=this._xhr;a&&(a.exec("abort"),a.destroy(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new c("XMLHttpRequest");return b.on("uploadprogress progress",function(b){return a.trigger("progress",b.loaded/b.total)}),b.on("load",function(){var c=b.exec("getStatus"),d="";return b.off(),a._xhr=null,c>=200&&300>c?(a._response=b.exec("getResponse"),a._responseJson=b.exec("getResponseAsJson")):c>=500&&600>c?(a._response=b.exec("getResponse"),a._responseJson=b.exec("getResponseAsJson"),d="server"):d="http",b.destroy(),b=null,d?a.trigger("error",d):a.trigger("load")}),b.on("error",function(){b.off(),a._xhr=null,a.trigger("error","http")}),a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.exec("setRequestHeader",b,c)})}})}),b("preset/all",["base","widgets/filednd","widgets/filepaste","widgets/filepicker","widgets/image","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","runtime/html5/blob","runtime/html5/dnd","runtime/html5/filepaste","runtime/html5/filepicker","runtime/html5/imagemeta/exif","runtime/html5/androidpatch","runtime/html5/image","runtime/html5/transport","runtime/flash/filepicker","runtime/flash/image","runtime/flash/transport"],function(a){return a}),b("webuploader",["preset/all"],function(a){return a}),c("webuploader")});
\ No newline at end of file
diff --git a/www/js/ueditor/third-party/webuploader/webuploader.withoutimage.js b/www/js/ueditor/third-party/webuploader/webuploader.withoutimage.js
deleted file mode 100644
index 1b921c3a0b..0000000000
--- a/www/js/ueditor/third-party/webuploader/webuploader.withoutimage.js
+++ /dev/null
@@ -1,4593 +0,0 @@
-/*! WebUploader 0.1.2 */
-
-
-/**
- * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
- *
- * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
- */
-(function( root, factory ) {
- var modules = {},
-
- // 内部require, 简单不完全实现。
- // https://github.com/amdjs/amdjs-api/wiki/require
- _require = function( deps, callback ) {
- var args, len, i;
-
- // 如果deps不是数组,则直接返回指定module
- if ( typeof deps === 'string' ) {
- return getModule( deps );
- } else {
- args = [];
- for( len = deps.length, i = 0; i < len; i++ ) {
- args.push( getModule( deps[ i ] ) );
- }
-
- return callback.apply( null, args );
- }
- },
-
- // 内部define,暂时不支持不指定id.
- _define = function( id, deps, factory ) {
- if ( arguments.length === 2 ) {
- factory = deps;
- deps = null;
- }
-
- _require( deps || [], function() {
- setModule( id, factory, arguments );
- });
- },
-
- // 设置module, 兼容CommonJs写法。
- setModule = function( id, factory, args ) {
- var module = {
- exports: factory
- },
- returned;
-
- if ( typeof factory === 'function' ) {
- args.length || (args = [ _require, module.exports, module ]);
- returned = factory.apply( null, args );
- returned !== undefined && (module.exports = returned);
- }
-
- modules[ id ] = module.exports;
- },
-
- // 根据id获取module
- getModule = function( id ) {
- var module = modules[ id ] || root[ id ];
-
- if ( !module ) {
- throw new Error( '`' + id + '` is undefined' );
- }
-
- return module;
- },
-
- // 将所有modules,将路径ids装换成对象。
- exportsTo = function( obj ) {
- var key, host, parts, part, last, ucFirst;
-
- // make the first character upper case.
- ucFirst = function( str ) {
- return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
- };
-
- for ( key in modules ) {
- host = obj;
-
- if ( !modules.hasOwnProperty( key ) ) {
- continue;
- }
-
- parts = key.split('/');
- last = ucFirst( parts.pop() );
-
- while( (part = ucFirst( parts.shift() )) ) {
- host[ part ] = host[ part ] || {};
- host = host[ part ];
- }
-
- host[ last ] = modules[ key ];
- }
- },
-
- exports = factory( root, _define, _require ),
- origin;
-
- // exports every module.
- exportsTo( exports );
-
- if ( typeof module === 'object' && typeof module.exports === 'object' ) {
-
- // For CommonJS and CommonJS-like environments where a proper window is present,
- module.exports = exports;
- } else if ( typeof define === 'function' && define.amd ) {
-
- // Allow using this built library as an AMD module
- // in another project. That other project will only
- // see this AMD call, not the internal modules in
- // the closure below.
- define([], exports );
- } else {
-
- // Browser globals case. Just assign the
- // result to a property on the global.
- origin = root.WebUploader;
- root.WebUploader = exports;
- root.WebUploader.noConflict = function() {
- root.WebUploader = origin;
- };
- }
-})( this, function( window, define, require ) {
-
-
- /**
- * @fileOverview jQuery or Zepto
- */
- define('dollar-third',[],function() {
- return window.jQuery || window.Zepto;
- });
- /**
- * @fileOverview Dom 操作相关
- */
- define('dollar',[
- 'dollar-third'
- ], function( _ ) {
- return _;
- });
- /**
- * @fileOverview 使用jQuery的Promise
- */
- define('promise-third',[
- 'dollar'
- ], function( $ ) {
- return {
- Deferred: $.Deferred,
- when: $.when,
-
- isPromise: function( anything ) {
- return anything && typeof anything.then === 'function';
- }
- };
- });
- /**
- * @fileOverview Promise/A+
- */
- define('promise',[
- 'promise-third'
- ], function( _ ) {
- return _;
- });
- /**
- * @fileOverview 基础类方法。
- */
-
- /**
- * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
- *
- * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
- * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
- *
- * * module `base`:WebUploader.Base
- * * module `file`: WebUploader.File
- * * module `lib/dnd`: WebUploader.Lib.Dnd
- * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
- *
- *
- * 以下文档将可能省略`WebUploader`前缀。
- * @module WebUploader
- * @title WebUploader API文档
- */
- define('base',[
- 'dollar',
- 'promise'
- ], function( $, promise ) {
-
- var noop = function() {},
- call = Function.call;
-
- // http://jsperf.com/uncurrythis
- // 反科里化
- function uncurryThis( fn ) {
- return function() {
- return call.apply( fn, arguments );
- };
- }
-
- function bindFn( fn, context ) {
- return function() {
- return fn.apply( context, arguments );
- };
- }
-
- function createObject( proto ) {
- var f;
-
- if ( Object.create ) {
- return Object.create( proto );
- } else {
- f = function() {};
- f.prototype = proto;
- return new f();
- }
- }
-
-
- /**
- * 基础类,提供一些简单常用的方法。
- * @class Base
- */
- return {
-
- /**
- * @property {String} version 当前版本号。
- */
- version: '0.1.2',
-
- /**
- * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
- */
- $: $,
-
- Deferred: promise.Deferred,
-
- isPromise: promise.isPromise,
-
- when: promise.when,
-
- /**
- * @description 简单的浏览器检查结果。
- *
- * * `webkit` webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
- * * `chrome` chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
- * * `ie` ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
- * * `firefox` firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
- * * `safari` safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
- * * `opera` opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
- *
- * @property {Object} [browser]
- */
- browser: (function( ua ) {
- var ret = {},
- webkit = ua.match( /WebKit\/([\d.]+)/ ),
- chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
- ua.match( /CriOS\/([\d.]+)/ ),
-
- ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
- ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i),
- firefox = ua.match( /Firefox\/([\d.]+)/ ),
- safari = ua.match( /Safari\/([\d.]+)/ ),
- opera = ua.match( /OPR\/([\d.]+)/ );
-
- webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
- chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
- ie && (ret.ie = parseFloat( ie[ 1 ] ));
- firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
- safari && (ret.safari = parseFloat( safari[ 1 ] ));
- opera && (ret.opera = parseFloat( opera[ 1 ] ));
-
- return ret;
- })( navigator.userAgent ),
-
- /**
- * @description 操作系统检查结果。
- *
- * * `android` 如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
- * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
- * @property {Object} [os]
- */
- os: (function( ua ) {
- var ret = {},
-
- // osx = !!ua.match( /\(Macintosh\; Intel / ),
- android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
- ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
-
- // osx && (ret.osx = true);
- android && (ret.android = parseFloat( android[ 1 ] ));
- ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
-
- return ret;
- })( navigator.userAgent ),
-
- /**
- * 实现类与类之间的继承。
- * @method inherits
- * @grammar Base.inherits( super ) => child
- * @grammar Base.inherits( super, protos ) => child
- * @grammar Base.inherits( super, protos, statics ) => child
- * @param {Class} super 父类
- * @param {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
- * @param {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
- * @param {Object} [statics] 静态属性或方法。
- * @return {Class} 返回子类。
- * @example
- * function Person() {
- * console.log( 'Super' );
- * }
- * Person.prototype.hello = function() {
- * console.log( 'hello' );
- * };
- *
- * var Manager = Base.inherits( Person, {
- * world: function() {
- * console.log( 'World' );
- * }
- * });
- *
- * // 因为没有指定构造器,父类的构造器将会执行。
- * var instance = new Manager(); // => Super
- *
- * // 继承子父类的方法
- * instance.hello(); // => hello
- * instance.world(); // => World
- *
- * // 子类的__super__属性指向父类
- * console.log( Manager.__super__ === Person ); // => true
- */
- inherits: function( Super, protos, staticProtos ) {
- var child;
-
- if ( typeof protos === 'function' ) {
- child = protos;
- protos = null;
- } else if ( protos && protos.hasOwnProperty('constructor') ) {
- child = protos.constructor;
- } else {
- child = function() {
- return Super.apply( this, arguments );
- };
- }
-
- // 复制静态方法
- $.extend( true, child, Super, staticProtos || {} );
-
- /* jshint camelcase: false */
-
- // 让子类的__super__属性指向父类。
- child.__super__ = Super.prototype;
-
- // 构建原型,添加原型方法或属性。
- // 暂时用Object.create实现。
- child.prototype = createObject( Super.prototype );
- protos && $.extend( true, child.prototype, protos );
-
- return child;
- },
-
- /**
- * 一个不做任何事情的方法。可以用来赋值给默认的callback.
- * @method noop
- */
- noop: noop,
-
- /**
- * 返回一个新的方法,此方法将已指定的`context`来执行。
- * @grammar Base.bindFn( fn, context ) => Function
- * @method bindFn
- * @example
- * var doSomething = function() {
- * console.log( this.name );
- * },
- * obj = {
- * name: 'Object Name'
- * },
- * aliasFn = Base.bind( doSomething, obj );
- *
- * aliasFn(); // => Object Name
- *
- */
- bindFn: bindFn,
-
- /**
- * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。
- * @grammar Base.log( args... ) => undefined
- * @method log
- */
- log: (function() {
- if ( window.console ) {
- return bindFn( console.log, console );
- }
- return noop;
- })(),
-
- nextTick: (function() {
-
- return function( cb ) {
- setTimeout( cb, 1 );
- };
-
- // @bug 当浏览器不在当前窗口时就停了。
- // var next = window.requestAnimationFrame ||
- // window.webkitRequestAnimationFrame ||
- // window.mozRequestAnimationFrame ||
- // function( cb ) {
- // window.setTimeout( cb, 1000 / 60 );
- // };
-
- // // fix: Uncaught TypeError: Illegal invocation
- // return bindFn( next, window );
- })(),
-
- /**
- * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
- * 将用来将非数组对象转化成数组对象。
- * @grammar Base.slice( target, start[, end] ) => Array
- * @method slice
- * @example
- * function doSomthing() {
- * var args = Base.slice( arguments, 1 );
- * console.log( args );
- * }
- *
- * doSomthing( 'ignored', 'arg2', 'arg3' ); // => Array ["arg2", "arg3"]
- */
- slice: uncurryThis( [].slice ),
-
- /**
- * 生成唯一的ID
- * @method guid
- * @grammar Base.guid() => String
- * @grammar Base.guid( prefx ) => String
- */
- guid: (function() {
- var counter = 0;
-
- return function( prefix ) {
- var guid = (+new Date()).toString( 32 ),
- i = 0;
-
- for ( ; i < 5; i++ ) {
- guid += Math.floor( Math.random() * 65535 ).toString( 32 );
- }
-
- return (prefix || 'wu_') + guid + (counter++).toString( 32 );
- };
- })(),
-
- /**
- * 格式化文件大小, 输出成带单位的字符串
- * @method formatSize
- * @grammar Base.formatSize( size ) => String
- * @grammar Base.formatSize( size, pointLength ) => String
- * @grammar Base.formatSize( size, pointLength, units ) => String
- * @param {Number} size 文件大小
- * @param {Number} [pointLength=2] 精确到的小数点数。
- * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
- * @example
- * console.log( Base.formatSize( 100 ) ); // => 100B
- * console.log( Base.formatSize( 1024 ) ); // => 1.00K
- * console.log( Base.formatSize( 1024, 0 ) ); // => 1K
- * console.log( Base.formatSize( 1024 * 1024 ) ); // => 1.00M
- * console.log( Base.formatSize( 1024 * 1024 * 1024 ) ); // => 1.00G
- * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) ); // => 1024MB
- */
- formatSize: function( size, pointLength, units ) {
- var unit;
-
- units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
-
- while ( (unit = units.shift()) && size > 1024 ) {
- size = size / 1024;
- }
-
- return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
- unit;
- }
- };
- });
- /**
- * 事件处理类,可以独立使用,也可以扩展给对象使用。
- * @fileOverview Mediator
- */
- define('mediator',[
- 'base'
- ], function( Base ) {
- var $ = Base.$,
- slice = [].slice,
- separator = /\s+/,
- protos;
-
- // 根据条件过滤出事件handlers.
- function findHandlers( arr, name, callback, context ) {
- return $.grep( arr, function( handler ) {
- return handler &&
- (!name || handler.e === name) &&
- (!callback || handler.cb === callback ||
- handler.cb._cb === callback) &&
- (!context || handler.ctx === context);
- });
- }
-
- function eachEvent( events, callback, iterator ) {
- // 不支持对象,只支持多个event用空格隔开
- $.each( (events || '').split( separator ), function( _, key ) {
- iterator( key, callback );
- });
- }
-
- function triggerHanders( events, args ) {
- var stoped = false,
- i = -1,
- len = events.length,
- handler;
-
- while ( ++i < len ) {
- handler = events[ i ];
-
- if ( handler.cb.apply( handler.ctx2, args ) === false ) {
- stoped = true;
- break;
- }
- }
-
- return !stoped;
- }
-
- protos = {
-
- /**
- * 绑定事件。
- *
- * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
- * ```javascript
- * var obj = {};
- *
- * // 使得obj有事件行为
- * Mediator.installTo( obj );
- *
- * obj.on( 'testa', function( arg1, arg2 ) {
- * console.log( arg1, arg2 ); // => 'arg1', 'arg2'
- * });
- *
- * obj.trigger( 'testa', 'arg1', 'arg2' );
- * ```
- *
- * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
- * 切会影响到`trigger`方法的返回值,为`false`。
- *
- * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
- * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
- * ```javascript
- * obj.on( 'all', function( type, arg1, arg2 ) {
- * console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
- * });
- * ```
- *
- * @method on
- * @grammar on( name, callback[, context] ) => self
- * @param {String} name 事件名,支持多个事件用空格隔开
- * @param {Function} callback 事件处理器
- * @param {Object} [context] 事件处理器的上下文。
- * @return {self} 返回自身,方便链式
- * @chainable
- * @class Mediator
- */
- on: function( name, callback, context ) {
- var me = this,
- set;
-
- if ( !callback ) {
- return this;
- }
-
- set = this._events || (this._events = []);
-
- eachEvent( name, callback, function( name, callback ) {
- var handler = { e: name };
-
- handler.cb = callback;
- handler.ctx = context;
- handler.ctx2 = context || me;
- handler.id = set.length;
-
- set.push( handler );
- });
-
- return this;
- },
-
- /**
- * 绑定事件,且当handler执行完后,自动解除绑定。
- * @method once
- * @grammar once( name, callback[, context] ) => self
- * @param {String} name 事件名
- * @param {Function} callback 事件处理器
- * @param {Object} [context] 事件处理器的上下文。
- * @return {self} 返回自身,方便链式
- * @chainable
- */
- once: function( name, callback, context ) {
- var me = this;
-
- if ( !callback ) {
- return me;
- }
-
- eachEvent( name, callback, function( name, callback ) {
- var once = function() {
- me.off( name, once );
- return callback.apply( context || me, arguments );
- };
-
- once._cb = callback;
- me.on( name, once, context );
- });
-
- return me;
- },
-
- /**
- * 解除事件绑定
- * @method off
- * @grammar off( [name[, callback[, context] ] ] ) => self
- * @param {String} [name] 事件名
- * @param {Function} [callback] 事件处理器
- * @param {Object} [context] 事件处理器的上下文。
- * @return {self} 返回自身,方便链式
- * @chainable
- */
- off: function( name, cb, ctx ) {
- var events = this._events;
-
- if ( !events ) {
- return this;
- }
-
- if ( !name && !cb && !ctx ) {
- this._events = [];
- return this;
- }
-
- eachEvent( name, cb, function( name, cb ) {
- $.each( findHandlers( events, name, cb, ctx ), function() {
- delete events[ this.id ];
- });
- });
-
- return this;
- },
-
- /**
- * 触发事件
- * @method trigger
- * @grammar trigger( name[, args...] ) => self
- * @param {String} type 事件名
- * @param {*} [...] 任意参数
- * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
- */
- trigger: function( type ) {
- var args, events, allEvents;
-
- if ( !this._events || !type ) {
- return this;
- }
-
- args = slice.call( arguments, 1 );
- events = findHandlers( this._events, type );
- allEvents = findHandlers( this._events, 'all' );
-
- return triggerHanders( events, args ) &&
- triggerHanders( allEvents, arguments );
- }
- };
-
- /**
- * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
- * 主要目的是负责模块与模块之间的合作,降低耦合度。
- *
- * @class Mediator
- */
- return $.extend({
-
- /**
- * 可以通过这个接口,使任何对象具备事件功能。
- * @method installTo
- * @param {Object} obj 需要具备事件行为的对象。
- * @return {Object} 返回obj.
- */
- installTo: function( obj ) {
- return $.extend( obj, protos );
- }
-
- }, protos );
- });
- /**
- * @fileOverview Uploader上传类
- */
- define('uploader',[
- 'base',
- 'mediator'
- ], function( Base, Mediator ) {
-
- var $ = Base.$;
-
- /**
- * 上传入口类。
- * @class Uploader
- * @constructor
- * @grammar new Uploader( opts ) => Uploader
- * @example
- * var uploader = WebUploader.Uploader({
- * swf: 'path_of_swf/Uploader.swf',
- *
- * // 开起分片上传。
- * chunked: true
- * });
- */
- function Uploader( opts ) {
- this.options = $.extend( true, {}, Uploader.options, opts );
- this._init( this.options );
- }
-
- // default Options
- // widgets中有相应扩展
- Uploader.options = {};
- Mediator.installTo( Uploader.prototype );
-
- // 批量添加纯命令式方法。
- $.each({
- upload: 'start-upload',
- stop: 'stop-upload',
- getFile: 'get-file',
- getFiles: 'get-files',
- addFile: 'add-file',
- addFiles: 'add-file',
- sort: 'sort-files',
- removeFile: 'remove-file',
- skipFile: 'skip-file',
- retry: 'retry',
- isInProgress: 'is-in-progress',
- makeThumb: 'make-thumb',
- getDimension: 'get-dimension',
- addButton: 'add-btn',
- getRuntimeType: 'get-runtime-type',
- refresh: 'refresh',
- disable: 'disable',
- enable: 'enable',
- reset: 'reset'
- }, function( fn, command ) {
- Uploader.prototype[ fn ] = function() {
- return this.request( command, arguments );
- };
- });
-
- $.extend( Uploader.prototype, {
- state: 'pending',
-
- _init: function( opts ) {
- var me = this;
-
- me.request( 'init', opts, function() {
- me.state = 'ready';
- me.trigger('ready');
- });
- },
-
- /**
- * 获取或者设置Uploader配置项。
- * @method option
- * @grammar option( key ) => *
- * @grammar option( key, val ) => self
- * @example
- *
- * // 初始状态图片上传前不会压缩
- * var uploader = new WebUploader.Uploader({
- * resize: null;
- * });
- *
- * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
- * uploader.options( 'resize', {
- * width: 1600,
- * height: 1600
- * });
- */
- option: function( key, val ) {
- var opts = this.options;
-
- // setter
- if ( arguments.length > 1 ) {
-
- if ( $.isPlainObject( val ) &&
- $.isPlainObject( opts[ key ] ) ) {
- $.extend( opts[ key ], val );
- } else {
- opts[ key ] = val;
- }
-
- } else { // getter
- return key ? opts[ key ] : opts;
- }
- },
-
- /**
- * 获取文件统计信息。返回一个包含一下信息的对象。
- * * `successNum` 上传成功的文件数
- * * `uploadFailNum` 上传失败的文件数
- * * `cancelNum` 被删除的文件数
- * * `invalidNum` 无效的文件数
- * * `queueNum` 还在队列中的文件数
- * @method getStats
- * @grammar getStats() => Object
- */
- getStats: function() {
- // return this._mgr.getStats.apply( this._mgr, arguments );
- var stats = this.request('get-stats');
-
- return {
- successNum: stats.numOfSuccess,
-
- // who care?
- // queueFailNum: 0,
- cancelNum: stats.numOfCancel,
- invalidNum: stats.numOfInvalid,
- uploadFailNum: stats.numOfUploadFailed,
- queueNum: stats.numOfQueue
- };
- },
-
- // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
- trigger: function( type/*, args...*/ ) {
- var args = [].slice.call( arguments, 1 ),
- opts = this.options,
- name = 'on' + type.substring( 0, 1 ).toUpperCase() +
- type.substring( 1 );
-
- if (
- // 调用通过on方法注册的handler.
- Mediator.trigger.apply( this, arguments ) === false ||
-
- // 调用opts.onEvent
- $.isFunction( opts[ name ] ) &&
- opts[ name ].apply( this, args ) === false ||
-
- // 调用this.onEvent
- $.isFunction( this[ name ] ) &&
- this[ name ].apply( this, args ) === false ||
-
- // 广播所有uploader的事件。
- Mediator.trigger.apply( Mediator,
- [ this, type ].concat( args ) ) === false ) {
-
- return false;
- }
-
- return true;
- },
-
- // widgets/widget.js将补充此方法的详细文档。
- request: Base.noop
- });
-
- /**
- * 创建Uploader实例,等同于new Uploader( opts );
- * @method create
- * @class Base
- * @static
- * @grammar Base.create( opts ) => Uploader
- */
- Base.create = Uploader.create = function( opts ) {
- return new Uploader( opts );
- };
-
- // 暴露Uploader,可以通过它来扩展业务逻辑。
- Base.Uploader = Uploader;
-
- return Uploader;
- });
- /**
- * @fileOverview Runtime管理器,负责Runtime的选择, 连接
- */
- define('runtime/runtime',[
- 'base',
- 'mediator'
- ], function( Base, Mediator ) {
-
- var $ = Base.$,
- factories = {},
-
- // 获取对象的第一个key
- getFirstKey = function( obj ) {
- for ( var key in obj ) {
- if ( obj.hasOwnProperty( key ) ) {
- return key;
- }
- }
- return null;
- };
-
- // 接口类。
- function Runtime( options ) {
- this.options = $.extend({
- container: document.body
- }, options );
- this.uid = Base.guid('rt_');
- }
-
- $.extend( Runtime.prototype, {
-
- getContainer: function() {
- var opts = this.options,
- parent, container;
-
- if ( this._container ) {
- return this._container;
- }
-
- parent = $( opts.container || document.body );
- container = $( document.createElement('div') );
-
- container.attr( 'id', 'rt_' + this.uid );
- container.css({
- position: 'absolute',
- top: '0px',
- left: '0px',
- width: '1px',
- height: '1px',
- overflow: 'hidden'
- });
-
- parent.append( container );
- parent.addClass('webuploader-container');
- this._container = container;
- return container;
- },
-
- init: Base.noop,
- exec: Base.noop,
-
- destroy: function() {
- if ( this._container ) {
- this._container.parentNode.removeChild( this.__container );
- }
-
- this.off();
- }
- });
-
- Runtime.orders = 'html5,flash';
-
-
- /**
- * 添加Runtime实现。
- * @param {String} type 类型
- * @param {Runtime} factory 具体Runtime实现。
- */
- Runtime.addRuntime = function( type, factory ) {
- factories[ type ] = factory;
- };
-
- Runtime.hasRuntime = function( type ) {
- return !!(type ? factories[ type ] : getFirstKey( factories ));
- };
-
- Runtime.create = function( opts, orders ) {
- var type, runtime;
-
- orders = orders || Runtime.orders;
- $.each( orders.split( /\s*,\s*/g ), function() {
- if ( factories[ this ] ) {
- type = this;
- return false;
- }
- });
-
- type = type || getFirstKey( factories );
-
- if ( !type ) {
- throw new Error('Runtime Error');
- }
-
- runtime = new factories[ type ]( opts );
- return runtime;
- };
-
- Mediator.installTo( Runtime.prototype );
- return Runtime;
- });
-
- /**
- * @fileOverview Runtime管理器,负责Runtime的选择, 连接
- */
- define('runtime/client',[
- 'base',
- 'mediator',
- 'runtime/runtime'
- ], function( Base, Mediator, Runtime ) {
-
- var cache;
-
- cache = (function() {
- var obj = {};
-
- return {
- add: function( runtime ) {
- obj[ runtime.uid ] = runtime;
- },
-
- get: function( ruid, standalone ) {
- var i;
-
- if ( ruid ) {
- return obj[ ruid ];
- }
-
- for ( i in obj ) {
- // 有些类型不能重用,比如filepicker.
- if ( standalone && obj[ i ].__standalone ) {
- continue;
- }
-
- return obj[ i ];
- }
-
- return null;
- },
-
- remove: function( runtime ) {
- delete obj[ runtime.uid ];
- }
- };
- })();
-
- function RuntimeClient( component, standalone ) {
- var deferred = Base.Deferred(),
- runtime;
-
- this.uid = Base.guid('client_');
-
- // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
- this.runtimeReady = function( cb ) {
- return deferred.done( cb );
- };
-
- this.connectRuntime = function( opts, cb ) {
-
- // already connected.
- if ( runtime ) {
- throw new Error('already connected!');
- }
-
- deferred.done( cb );
-
- if ( typeof opts === 'string' && cache.get( opts ) ) {
- runtime = cache.get( opts );
- }
-
- // 像filePicker只能独立存在,不能公用。
- runtime = runtime || cache.get( null, standalone );
-
- // 需要创建
- if ( !runtime ) {
- runtime = Runtime.create( opts, opts.runtimeOrder );
- runtime.__promise = deferred.promise();
- runtime.once( 'ready', deferred.resolve );
- runtime.init();
- cache.add( runtime );
- runtime.__client = 1;
- } else {
- // 来自cache
- Base.$.extend( runtime.options, opts );
- runtime.__promise.then( deferred.resolve );
- runtime.__client++;
- }
-
- standalone && (runtime.__standalone = standalone);
- return runtime;
- };
-
- this.getRuntime = function() {
- return runtime;
- };
-
- this.disconnectRuntime = function() {
- if ( !runtime ) {
- return;
- }
-
- runtime.__client--;
-
- if ( runtime.__client <= 0 ) {
- cache.remove( runtime );
- delete runtime.__promise;
- runtime.destroy();
- }
-
- runtime = null;
- };
-
- this.exec = function() {
- if ( !runtime ) {
- return;
- }
-
- var args = Base.slice( arguments );
- component && args.unshift( component );
-
- return runtime.exec.apply( this, args );
- };
-
- this.getRuid = function() {
- return runtime && runtime.uid;
- };
-
- this.destroy = (function( destroy ) {
- return function() {
- destroy && destroy.apply( this, arguments );
- this.trigger('destroy');
- this.off();
- this.exec('destroy');
- this.disconnectRuntime();
- };
- })( this.destroy );
- }
-
- Mediator.installTo( RuntimeClient.prototype );
- return RuntimeClient;
- });
- /**
- * @fileOverview 错误信息
- */
- define('lib/dnd',[
- 'base',
- 'mediator',
- 'runtime/client'
- ], function( Base, Mediator, RuntimeClent ) {
-
- var $ = Base.$;
-
- function DragAndDrop( opts ) {
- opts = this.options = $.extend({}, DragAndDrop.options, opts );
-
- opts.container = $( opts.container );
-
- if ( !opts.container.length ) {
- return;
- }
-
- RuntimeClent.call( this, 'DragAndDrop' );
- }
-
- DragAndDrop.options = {
- accept: null,
- disableGlobalDnd: false
- };
-
- Base.inherits( RuntimeClent, {
- constructor: DragAndDrop,
-
- init: function() {
- var me = this;
-
- me.connectRuntime( me.options, function() {
- me.exec('init');
- me.trigger('ready');
- });
- },
-
- destroy: function() {
- this.disconnectRuntime();
- }
- });
-
- Mediator.installTo( DragAndDrop.prototype );
-
- return DragAndDrop;
- });
- /**
- * @fileOverview 组件基类。
- */
- define('widgets/widget',[
- 'base',
- 'uploader'
- ], function( Base, Uploader ) {
-
- var $ = Base.$,
- _init = Uploader.prototype._init,
- IGNORE = {},
- widgetClass = [];
-
- function isArrayLike( obj ) {
- if ( !obj ) {
- return false;
- }
-
- var length = obj.length,
- type = $.type( obj );
-
- if ( obj.nodeType === 1 && length ) {
- return true;
- }
-
- return type === 'array' || type !== 'function' && type !== 'string' &&
- (length === 0 || typeof length === 'number' && length > 0 &&
- (length - 1) in obj);
- }
-
- function Widget( uploader ) {
- this.owner = uploader;
- this.options = uploader.options;
- }
-
- $.extend( Widget.prototype, {
-
- init: Base.noop,
-
- // 类Backbone的事件监听声明,监听uploader实例上的事件
- // widget直接无法监听事件,事件只能通过uploader来传递
- invoke: function( apiName, args ) {
-
- /*
- {
- 'make-thumb': 'makeThumb'
- }
- */
- var map = this.responseMap;
-
- // 如果无API响应声明则忽略
- if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
- !$.isFunction( this[ map[ apiName ] ] ) ) {
-
- return IGNORE;
- }
-
- return this[ map[ apiName ] ].apply( this, args );
-
- },
-
- /**
- * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
- * @method request
- * @grammar request( command, args ) => * | Promise
- * @grammar request( command, args, callback ) => Promise
- * @for Uploader
- */
- request: function() {
- return this.owner.request.apply( this.owner, arguments );
- }
- });
-
- // 扩展Uploader.
- $.extend( Uploader.prototype, {
-
- // 覆写_init用来初始化widgets
- _init: function() {
- var me = this,
- widgets = me._widgets = [];
-
- $.each( widgetClass, function( _, klass ) {
- widgets.push( new klass( me ) );
- });
-
- return _init.apply( me, arguments );
- },
-
- request: function( apiName, args, callback ) {
- var i = 0,
- widgets = this._widgets,
- len = widgets.length,
- rlts = [],
- dfds = [],
- widget, rlt, promise, key;
-
- args = isArrayLike( args ) ? args : [ args ];
-
- for ( ; i < len; i++ ) {
- widget = widgets[ i ];
- rlt = widget.invoke( apiName, args );
-
- if ( rlt !== IGNORE ) {
-
- // Deferred对象
- if ( Base.isPromise( rlt ) ) {
- dfds.push( rlt );
- } else {
- rlts.push( rlt );
- }
- }
- }
-
- // 如果有callback,则用异步方式。
- if ( callback || dfds.length ) {
- promise = Base.when.apply( Base, dfds );
- key = promise.pipe ? 'pipe' : 'then';
-
- // 很重要不能删除。删除了会死循环。
- // 保证执行顺序。让callback总是在下一个tick中执行。
- return promise[ key ](function() {
- var deferred = Base.Deferred(),
- args = arguments;
-
- setTimeout(function() {
- deferred.resolve.apply( deferred, args );
- }, 1 );
-
- return deferred.promise();
- })[ key ]( callback || Base.noop );
- } else {
- return rlts[ 0 ];
- }
- }
- });
-
- /**
- * 添加组件
- * @param {object} widgetProto 组件原型,构造函数通过constructor属性定义
- * @param {object} responseMap API名称与函数实现的映射
- * @example
- * Uploader.register( {
- * init: function( options ) {},
- * makeThumb: function() {}
- * }, {
- * 'make-thumb': 'makeThumb'
- * } );
- */
- Uploader.register = Widget.register = function( responseMap, widgetProto ) {
- var map = { init: 'init' },
- klass;
-
- if ( arguments.length === 1 ) {
- widgetProto = responseMap;
- widgetProto.responseMap = map;
- } else {
- widgetProto.responseMap = $.extend( map, responseMap );
- }
-
- klass = Base.inherits( Widget, widgetProto );
- widgetClass.push( klass );
-
- return klass;
- };
-
- return Widget;
- });
- /**
- * @fileOverview DragAndDrop Widget。
- */
- define('widgets/filednd',[
- 'base',
- 'uploader',
- 'lib/dnd',
- 'widgets/widget'
- ], function( Base, Uploader, Dnd ) {
- var $ = Base.$;
-
- Uploader.options.dnd = '';
-
- /**
- * @property {Selector} [dnd=undefined] 指定Drag And Drop拖拽的容器,如果不指定,则不启动。
- * @namespace options
- * @for Uploader
- */
-
- /**
- * @event dndAccept
- * @param {DataTransferItemList} items DataTransferItem
- * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。
- * @for Uploader
- */
- return Uploader.register({
- init: function( opts ) {
-
- if ( !opts.dnd ||
- this.request('predict-runtime-type') !== 'html5' ) {
- return;
- }
-
- var me = this,
- deferred = Base.Deferred(),
- options = $.extend({}, {
- disableGlobalDnd: opts.disableGlobalDnd,
- container: opts.dnd,
- accept: opts.accept
- }),
- dnd;
-
- dnd = new Dnd( options );
-
- dnd.once( 'ready', deferred.resolve );
- dnd.on( 'drop', function( files ) {
- me.request( 'add-file', [ files ]);
- });
-
- // 检测文件是否全部允许添加。
- dnd.on( 'accept', function( items ) {
- return me.owner.trigger( 'dndAccept', items );
- });
-
- dnd.init();
-
- return deferred.promise();
- }
- });
- });
-
- /**
- * @fileOverview 错误信息
- */
- define('lib/filepaste',[
- 'base',
- 'mediator',
- 'runtime/client'
- ], function( Base, Mediator, RuntimeClent ) {
-
- var $ = Base.$;
-
- function FilePaste( opts ) {
- opts = this.options = $.extend({}, opts );
- opts.container = $( opts.container || document.body );
- RuntimeClent.call( this, 'FilePaste' );
- }
-
- Base.inherits( RuntimeClent, {
- constructor: FilePaste,
-
- init: function() {
- var me = this;
-
- me.connectRuntime( me.options, function() {
- me.exec('init');
- me.trigger('ready');
- });
- },
-
- destroy: function() {
- this.exec('destroy');
- this.disconnectRuntime();
- this.off();
- }
- });
-
- Mediator.installTo( FilePaste.prototype );
-
- return FilePaste;
- });
- /**
- * @fileOverview 组件基类。
- */
- define('widgets/filepaste',[
- 'base',
- 'uploader',
- 'lib/filepaste',
- 'widgets/widget'
- ], function( Base, Uploader, FilePaste ) {
- var $ = Base.$;
-
- /**
- * @property {Selector} [paste=undefined] 指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`.
- * @namespace options
- * @for Uploader
- */
- return Uploader.register({
- init: function( opts ) {
-
- if ( !opts.paste ||
- this.request('predict-runtime-type') !== 'html5' ) {
- return;
- }
-
- var me = this,
- deferred = Base.Deferred(),
- options = $.extend({}, {
- container: opts.paste,
- accept: opts.accept
- }),
- paste;
-
- paste = new FilePaste( options );
-
- paste.once( 'ready', deferred.resolve );
- paste.on( 'paste', function( files ) {
- me.owner.request( 'add-file', [ files ]);
- });
- paste.init();
-
- return deferred.promise();
- }
- });
- });
- /**
- * @fileOverview Blob
- */
- define('lib/blob',[
- 'base',
- 'runtime/client'
- ], function( Base, RuntimeClient ) {
-
- function Blob( ruid, source ) {
- var me = this;
-
- me.source = source;
- me.ruid = ruid;
-
- RuntimeClient.call( me, 'Blob' );
-
- this.uid = source.uid || this.uid;
- this.type = source.type || '';
- this.size = source.size || 0;
-
- if ( ruid ) {
- me.connectRuntime( ruid );
- }
- }
-
- Base.inherits( RuntimeClient, {
- constructor: Blob,
-
- slice: function( start, end ) {
- return this.exec( 'slice', start, end );
- },
-
- getSource: function() {
- return this.source;
- }
- });
-
- return Blob;
- });
- /**
- * 为了统一化Flash的File和HTML5的File而存在。
- * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
- * @fileOverview File
- */
- define('lib/file',[
- 'base',
- 'lib/blob'
- ], function( Base, Blob ) {
-
- var uid = 1,
- rExt = /\.([^.]+)$/;
-
- function File( ruid, file ) {
- var ext;
-
- Blob.apply( this, arguments );
- this.name = file.name || ('untitled' + uid++);
- ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
-
- // todo 支持其他类型文件的转换。
-
- // 如果有mimetype, 但是文件名里面没有找出后缀规律
- if ( !ext && this.type ) {
- ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?
- RegExp.$1.toLowerCase() : '';
- this.name += '.' + ext;
- }
-
- // 如果没有指定mimetype, 但是知道文件后缀。
- if ( !this.type && ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {
- this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);
- }
-
- this.ext = ext;
- this.lastModifiedDate = file.lastModifiedDate ||
- (new Date()).toLocaleString();
- }
-
- return Base.inherits( Blob, File );
- });
-
- /**
- * @fileOverview 错误信息
- */
- define('lib/filepicker',[
- 'base',
- 'runtime/client',
- 'lib/file'
- ], function( Base, RuntimeClent, File ) {
-
- var $ = Base.$;
-
- function FilePicker( opts ) {
- opts = this.options = $.extend({}, FilePicker.options, opts );
-
- opts.container = $( opts.id );
-
- if ( !opts.container.length ) {
- throw new Error('按钮指定错误');
- }
-
- opts.innerHTML = opts.innerHTML || opts.label ||
- opts.container.html() || '';
-
- opts.button = $( opts.button || document.createElement('div') );
- opts.button.html( opts.innerHTML );
- opts.container.html( opts.button );
-
- RuntimeClent.call( this, 'FilePicker', true );
- }
-
- FilePicker.options = {
- button: null,
- container: null,
- label: null,
- innerHTML: null,
- multiple: true,
- accept: null,
- name: 'file'
- };
-
- Base.inherits( RuntimeClent, {
- constructor: FilePicker,
-
- init: function() {
- var me = this,
- opts = me.options,
- button = opts.button;
-
- button.addClass('webuploader-pick');
-
- me.on( 'all', function( type ) {
- var files;
-
- switch ( type ) {
- case 'mouseenter':
- button.addClass('webuploader-pick-hover');
- break;
-
- case 'mouseleave':
- button.removeClass('webuploader-pick-hover');
- break;
-
- case 'change':
- files = me.exec('getFiles');
- me.trigger( 'select', $.map( files, function( file ) {
- file = new File( me.getRuid(), file );
-
- // 记录来源。
- file._refer = opts.container;
- return file;
- }), opts.container );
- break;
- }
- });
-
- me.connectRuntime( opts, function() {
- me.refresh();
- me.exec( 'init', opts );
- me.trigger('ready');
- });
-
- $( window ).on( 'resize', function() {
- me.refresh();
- });
- },
-
- refresh: function() {
- var shimContainer = this.getRuntime().getContainer(),
- button = this.options.button,
- width = button.outerWidth ?
- button.outerWidth() : button.width(),
-
- height = button.outerHeight ?
- button.outerHeight() : button.height(),
-
- pos = button.offset();
-
- width && height && shimContainer.css({
- bottom: 'auto',
- right: 'auto',
- width: width + 'px',
- height: height + 'px'
- }).offset( pos );
- },
-
- enable: function() {
- var btn = this.options.button;
-
- btn.removeClass('webuploader-pick-disable');
- this.refresh();
- },
-
- disable: function() {
- var btn = this.options.button;
-
- this.getRuntime().getContainer().css({
- top: '-99999px'
- });
-
- btn.addClass('webuploader-pick-disable');
- },
-
- destroy: function() {
- if ( this.runtime ) {
- this.exec('destroy');
- this.disconnectRuntime();
- }
- }
- });
-
- return FilePicker;
- });
-
- /**
- * @fileOverview 文件选择相关
- */
- define('widgets/filepicker',[
- 'base',
- 'uploader',
- 'lib/filepicker',
- 'widgets/widget'
- ], function( Base, Uploader, FilePicker ) {
- var $ = Base.$;
-
- $.extend( Uploader.options, {
-
- /**
- * @property {Selector | Object} [pick=undefined]
- * @namespace options
- * @for Uploader
- * @description 指定选择文件的按钮容器,不指定则不创建按钮。
- *
- * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。
- * * `label` {String} 请采用 `innerHTML` 代替
- * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
- * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
- */
- pick: null,
-
- /**
- * @property {Arroy} [accept=null]
- * @namespace options
- * @for Uploader
- * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
- *
- * * `title` {String} 文字描述
- * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
- * * `mimeTypes` {String} 多个用逗号分割。
- *
- * 如:
- *
- * ```
- * {
- * title: 'Images',
- * extensions: 'gif,jpg,jpeg,bmp,png',
- * mimeTypes: 'image/*'
- * }
- * ```
- */
- accept: null/*{
- title: 'Images',
- extensions: 'gif,jpg,jpeg,bmp,png',
- mimeTypes: 'image/*'
- }*/
- });
-
- return Uploader.register({
- 'add-btn': 'addButton',
- refresh: 'refresh',
- disable: 'disable',
- enable: 'enable'
- }, {
-
- init: function( opts ) {
- this.pickers = [];
- return opts.pick && this.addButton( opts.pick );
- },
-
- refresh: function() {
- $.each( this.pickers, function() {
- this.refresh();
- });
- },
-
- /**
- * @method addButton
- * @for Uploader
- * @grammar addButton( pick ) => Promise
- * @description
- * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
- * @example
- * uploader.addButton({
- * id: '#btnContainer',
- * innerHTML: '选择文件'
- * });
- */
- addButton: function( pick ) {
- var me = this,
- opts = me.options,
- accept = opts.accept,
- options, picker, deferred;
-
- if ( !pick ) {
- return;
- }
-
- deferred = Base.Deferred();
- $.isPlainObject( pick ) || (pick = {
- id: pick
- });
-
- options = $.extend({}, pick, {
- accept: $.isPlainObject( accept ) ? [ accept ] : accept,
- swf: opts.swf,
- runtimeOrder: opts.runtimeOrder
- });
-
- picker = new FilePicker( options );
-
- picker.once( 'ready', deferred.resolve );
- picker.on( 'select', function( files ) {
- me.owner.request( 'add-file', [ files ]);
- });
- picker.init();
-
- this.pickers.push( picker );
-
- return deferred.promise();
- },
-
- disable: function() {
- $.each( this.pickers, function() {
- this.disable();
- });
- },
-
- enable: function() {
- $.each( this.pickers, function() {
- this.enable();
- });
- }
- });
- });
- /**
- * @fileOverview 文件属性封装
- */
- define('file',[
- 'base',
- 'mediator'
- ], function( Base, Mediator ) {
-
- var $ = Base.$,
- idPrefix = 'WU_FILE_',
- idSuffix = 0,
- rExt = /\.([^.]+)$/,
- statusMap = {};
-
- function gid() {
- return idPrefix + idSuffix++;
- }
-
- /**
- * 文件类
- * @class File
- * @constructor 构造函数
- * @grammar new File( source ) => File
- * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
- */
- function WUFile( source ) {
-
- /**
- * 文件名,包括扩展名(后缀)
- * @property name
- * @type {string}
- */
- this.name = source.name || 'Untitled';
-
- /**
- * 文件体积(字节)
- * @property size
- * @type {uint}
- * @default 0
- */
- this.size = source.size || 0;
-
- /**
- * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
- * @property type
- * @type {string}
- * @default 'application'
- */
- this.type = source.type || 'application';
-
- /**
- * 文件最后修改日期
- * @property lastModifiedDate
- * @type {int}
- * @default 当前时间戳
- */
- this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
-
- /**
- * 文件ID,每个对象具有唯一ID,与文件名无关
- * @property id
- * @type {string}
- */
- this.id = gid();
-
- /**
- * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
- * @property ext
- * @type {string}
- */
- this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
-
-
- /**
- * 状态文字说明。在不同的status语境下有不同的用途。
- * @property statusText
- * @type {string}
- */
- this.statusText = '';
-
- // 存储文件状态,防止通过属性直接修改
- statusMap[ this.id ] = WUFile.Status.INITED;
-
- this.source = source;
- this.loaded = 0;
-
- this.on( 'error', function( msg ) {
- this.setStatus( WUFile.Status.ERROR, msg );
- });
- }
-
- $.extend( WUFile.prototype, {
-
- /**
- * 设置状态,状态变化时会触发`change`事件。
- * @method setStatus
- * @grammar setStatus( status[, statusText] );
- * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
- * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
- */
- setStatus: function( status, text ) {
-
- var prevStatus = statusMap[ this.id ];
-
- typeof text !== 'undefined' && (this.statusText = text);
-
- if ( status !== prevStatus ) {
- statusMap[ this.id ] = status;
- /**
- * 文件状态变化
- * @event statuschange
- */
- this.trigger( 'statuschange', status, prevStatus );
- }
-
- },
-
- /**
- * 获取文件状态
- * @return {File.Status}
- * @example
- 文件状态具体包括以下几种类型:
- {
- // 初始化
- INITED: 0,
- // 已入队列
- QUEUED: 1,
- // 正在上传
- PROGRESS: 2,
- // 上传出错
- ERROR: 3,
- // 上传成功
- COMPLETE: 4,
- // 上传取消
- CANCELLED: 5
- }
- */
- getStatus: function() {
- return statusMap[ this.id ];
- },
-
- /**
- * 获取文件原始信息。
- * @return {*}
- */
- getSource: function() {
- return this.source;
- },
-
- destory: function() {
- delete statusMap[ this.id ];
- }
- });
-
- Mediator.installTo( WUFile.prototype );
-
- /**
- * 文件状态值,具体包括以下几种类型:
- * * `inited` 初始状态
- * * `queued` 已经进入队列, 等待上传
- * * `progress` 上传中
- * * `complete` 上传完成。
- * * `error` 上传出错,可重试
- * * `interrupt` 上传中断,可续传。
- * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
- * * `cancelled` 文件被移除。
- * @property {Object} Status
- * @namespace File
- * @class File
- * @static
- */
- WUFile.Status = {
- INITED: 'inited', // 初始状态
- QUEUED: 'queued', // 已经进入队列, 等待上传
- PROGRESS: 'progress', // 上传中
- ERROR: 'error', // 上传出错,可重试
- COMPLETE: 'complete', // 上传完成。
- CANCELLED: 'cancelled', // 上传取消。
- INTERRUPT: 'interrupt', // 上传中断,可续传。
- INVALID: 'invalid' // 文件不合格,不能重试上传。
- };
-
- return WUFile;
- });
-
- /**
- * @fileOverview 文件队列
- */
- define('queue',[
- 'base',
- 'mediator',
- 'file'
- ], function( Base, Mediator, WUFile ) {
-
- var $ = Base.$,
- STATUS = WUFile.Status;
-
- /**
- * 文件队列, 用来存储各个状态中的文件。
- * @class Queue
- * @extends Mediator
- */
- function Queue() {
-
- /**
- * 统计文件数。
- * * `numOfQueue` 队列中的文件数。
- * * `numOfSuccess` 上传成功的文件数
- * * `numOfCancel` 被移除的文件数
- * * `numOfProgress` 正在上传中的文件数
- * * `numOfUploadFailed` 上传错误的文件数。
- * * `numOfInvalid` 无效的文件数。
- * @property {Object} stats
- */
- this.stats = {
- numOfQueue: 0,
- numOfSuccess: 0,
- numOfCancel: 0,
- numOfProgress: 0,
- numOfUploadFailed: 0,
- numOfInvalid: 0
- };
-
- // 上传队列,仅包括等待上传的文件
- this._queue = [];
-
- // 存储所有文件
- this._map = {};
- }
-
- $.extend( Queue.prototype, {
-
- /**
- * 将新文件加入对队列尾部
- *
- * @method append
- * @param {File} file 文件对象
- */
- append: function( file ) {
- this._queue.push( file );
- this._fileAdded( file );
- return this;
- },
-
- /**
- * 将新文件加入对队列头部
- *
- * @method prepend
- * @param {File} file 文件对象
- */
- prepend: function( file ) {
- this._queue.unshift( file );
- this._fileAdded( file );
- return this;
- },
-
- /**
- * 获取文件对象
- *
- * @method getFile
- * @param {String} fileId 文件ID
- * @return {File}
- */
- getFile: function( fileId ) {
- if ( typeof fileId !== 'string' ) {
- return fileId;
- }
- return this._map[ fileId ];
- },
-
- /**
- * 从队列中取出一个指定状态的文件。
- * @grammar fetch( status ) => File
- * @method fetch
- * @param {String} status [文件状态值](#WebUploader:File:File.Status)
- * @return {File} [File](#WebUploader:File)
- */
- fetch: function( status ) {
- var len = this._queue.length,
- i, file;
-
- status = status || STATUS.QUEUED;
-
- for ( i = 0; i < len; i++ ) {
- file = this._queue[ i ];
-
- if ( status === file.getStatus() ) {
- return file;
- }
- }
-
- return null;
- },
-
- /**
- * 对队列进行排序,能够控制文件上传顺序。
- * @grammar sort( fn ) => undefined
- * @method sort
- * @param {Function} fn 排序方法
- */
- sort: function( fn ) {
- if ( typeof fn === 'function' ) {
- this._queue.sort( fn );
- }
- },
-
- /**
- * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
- * @grammar getFiles( [status1[, status2 ...]] ) => Array
- * @method getFiles
- * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
- */
- getFiles: function() {
- var sts = [].slice.call( arguments, 0 ),
- ret = [],
- i = 0,
- len = this._queue.length,
- file;
-
- for ( ; i < len; i++ ) {
- file = this._queue[ i ];
-
- if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
- continue;
- }
-
- ret.push( file );
- }
-
- return ret;
- },
-
- _fileAdded: function( file ) {
- var me = this,
- existing = this._map[ file.id ];
-
- if ( !existing ) {
- this._map[ file.id ] = file;
-
- file.on( 'statuschange', function( cur, pre ) {
- me._onFileStatusChange( cur, pre );
- });
- }
-
- file.setStatus( STATUS.QUEUED );
- },
-
- _onFileStatusChange: function( curStatus, preStatus ) {
- var stats = this.stats;
-
- switch ( preStatus ) {
- case STATUS.PROGRESS:
- stats.numOfProgress--;
- break;
-
- case STATUS.QUEUED:
- stats.numOfQueue --;
- break;
-
- case STATUS.ERROR:
- stats.numOfUploadFailed--;
- break;
-
- case STATUS.INVALID:
- stats.numOfInvalid--;
- break;
- }
-
- switch ( curStatus ) {
- case STATUS.QUEUED:
- stats.numOfQueue++;
- break;
-
- case STATUS.PROGRESS:
- stats.numOfProgress++;
- break;
-
- case STATUS.ERROR:
- stats.numOfUploadFailed++;
- break;
-
- case STATUS.COMPLETE:
- stats.numOfSuccess++;
- break;
-
- case STATUS.CANCELLED:
- stats.numOfCancel++;
- break;
-
- case STATUS.INVALID:
- stats.numOfInvalid++;
- break;
- }
- }
-
- });
-
- Mediator.installTo( Queue.prototype );
-
- return Queue;
- });
- /**
- * @fileOverview 队列
- */
- define('widgets/queue',[
- 'base',
- 'uploader',
- 'queue',
- 'file',
- 'lib/file',
- 'runtime/client',
- 'widgets/widget'
- ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
-
- var $ = Base.$,
- rExt = /\.\w+$/,
- Status = WUFile.Status;
-
- return Uploader.register({
- 'sort-files': 'sortFiles',
- 'add-file': 'addFiles',
- 'get-file': 'getFile',
- 'fetch-file': 'fetchFile',
- 'get-stats': 'getStats',
- 'get-files': 'getFiles',
- 'remove-file': 'removeFile',
- 'retry': 'retry',
- 'reset': 'reset',
- 'accept-file': 'acceptFile'
- }, {
-
- init: function( opts ) {
- var me = this,
- deferred, len, i, item, arr, accept, runtime;
-
- if ( $.isPlainObject( opts.accept ) ) {
- opts.accept = [ opts.accept ];
- }
-
- // accept中的中生成匹配正则。
- if ( opts.accept ) {
- arr = [];
-
- for ( i = 0, len = opts.accept.length; i < len; i++ ) {
- item = opts.accept[ i ].extensions;
- item && arr.push( item );
- }
-
- if ( arr.length ) {
- accept = '\\.' + arr.join(',')
- .replace( /,/g, '$|\\.' )
- .replace( /\*/g, '.*' ) + '$';
- }
-
- me.accept = new RegExp( accept, 'i' );
- }
-
- me.queue = new Queue();
- me.stats = me.queue.stats;
-
- // 如果当前不是html5运行时,那就算了。
- // 不执行后续操作
- if ( this.request('predict-runtime-type') !== 'html5' ) {
- return;
- }
-
- // 创建一个 html5 运行时的 placeholder
- // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
- deferred = Base.Deferred();
- runtime = new RuntimeClient('Placeholder');
- runtime.connectRuntime({
- runtimeOrder: 'html5'
- }, function() {
- me._ruid = runtime.getRuid();
- deferred.resolve();
- });
- return deferred.promise();
- },
-
-
- // 为了支持外部直接添加一个原生File对象。
- _wrapFile: function( file ) {
- if ( !(file instanceof WUFile) ) {
-
- if ( !(file instanceof File) ) {
- if ( !this._ruid ) {
- throw new Error('Can\'t add external files.');
- }
- file = new File( this._ruid, file );
- }
-
- file = new WUFile( file );
- }
-
- return file;
- },
-
- // 判断文件是否可以被加入队列
- acceptFile: function( file ) {
- var invalid = !file || file.size < 6 || this.accept &&
-
- // 如果名字中有后缀,才做后缀白名单处理。
- rExt.exec( file.name ) && !this.accept.test( file.name );
-
- return !invalid;
- },
-
-
- /**
- * @event beforeFileQueued
- * @param {File} file File对象
- * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
- * @for Uploader
- */
-
- /**
- * @event fileQueued
- * @param {File} file File对象
- * @description 当文件被加入队列以后触发。
- * @for Uploader
- */
-
- _addFile: function( file ) {
- var me = this;
-
- file = me._wrapFile( file );
-
- // 不过类型判断允许不允许,先派送 `beforeFileQueued`
- if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
- return;
- }
-
- // 类型不匹配,则派送错误事件,并返回。
- if ( !me.acceptFile( file ) ) {
- me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
- return;
- }
-
- me.queue.append( file );
- me.owner.trigger( 'fileQueued', file );
- return file;
- },
-
- getFile: function( fileId ) {
- return this.queue.getFile( fileId );
- },
-
- /**
- * @event filesQueued
- * @param {File} files 数组,内容为原始File(lib/File)对象。
- * @description 当一批文件添加进队列以后触发。
- * @for Uploader
- */
-
- /**
- * @method addFiles
- * @grammar addFiles( file ) => undefined
- * @grammar addFiles( [file1, file2 ...] ) => undefined
- * @param {Array of File or File} [files] Files 对象 数组
- * @description 添加文件到队列
- * @for Uploader
- */
- addFiles: function( files ) {
- var me = this;
-
- if ( !files.length ) {
- files = [ files ];
- }
-
- files = $.map( files, function( file ) {
- return me._addFile( file );
- });
-
- me.owner.trigger( 'filesQueued', files );
-
- if ( me.options.auto ) {
- me.request('start-upload');
- }
- },
-
- getStats: function() {
- return this.stats;
- },
-
- /**
- * @event fileDequeued
- * @param {File} file File对象
- * @description 当文件被移除队列后触发。
- * @for Uploader
- */
-
- /**
- * @method removeFile
- * @grammar removeFile( file ) => undefined
- * @grammar removeFile( id ) => undefined
- * @param {File|id} file File对象或这File对象的id
- * @description 移除某一文件。
- * @for Uploader
- * @example
- *
- * $li.on('click', '.remove-this', function() {
- * uploader.removeFile( file );
- * })
- */
- removeFile: function( file ) {
- var me = this;
-
- file = file.id ? file : me.queue.getFile( file );
-
- file.setStatus( Status.CANCELLED );
- me.owner.trigger( 'fileDequeued', file );
- },
-
- /**
- * @method getFiles
- * @grammar getFiles() => Array
- * @grammar getFiles( status1, status2, status... ) => Array
- * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
- * @for Uploader
- * @example
- * console.log( uploader.getFiles() ); // => all files
- * console.log( uploader.getFiles('error') ) // => all error files.
- */
- getFiles: function() {
- return this.queue.getFiles.apply( this.queue, arguments );
- },
-
- fetchFile: function() {
- return this.queue.fetch.apply( this.queue, arguments );
- },
-
- /**
- * @method retry
- * @grammar retry() => undefined
- * @grammar retry( file ) => undefined
- * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
- * @for Uploader
- * @example
- * function retry() {
- * uploader.retry();
- * }
- */
- retry: function( file, noForceStart ) {
- var me = this,
- files, i, len;
-
- if ( file ) {
- file = file.id ? file : me.queue.getFile( file );
- file.setStatus( Status.QUEUED );
- noForceStart || me.request('start-upload');
- return;
- }
-
- files = me.queue.getFiles( Status.ERROR );
- i = 0;
- len = files.length;
-
- for ( ; i < len; i++ ) {
- file = files[ i ];
- file.setStatus( Status.QUEUED );
- }
-
- me.request('start-upload');
- },
-
- /**
- * @method sort
- * @grammar sort( fn ) => undefined
- * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
- * @for Uploader
- */
- sortFiles: function() {
- return this.queue.sort.apply( this.queue, arguments );
- },
-
- /**
- * @method reset
- * @grammar reset() => undefined
- * @description 重置uploader。目前只重置了队列。
- * @for Uploader
- * @example
- * uploader.reset();
- */
- reset: function() {
- this.queue = new Queue();
- this.stats = this.queue.stats;
- }
- });
-
- });
- /**
- * @fileOverview 添加获取Runtime相关信息的方法。
- */
- define('widgets/runtime',[
- 'uploader',
- 'runtime/runtime',
- 'widgets/widget'
- ], function( Uploader, Runtime ) {
-
- Uploader.support = function() {
- return Runtime.hasRuntime.apply( Runtime, arguments );
- };
-
- return Uploader.register({
- 'predict-runtime-type': 'predictRuntmeType'
- }, {
-
- init: function() {
- if ( !this.predictRuntmeType() ) {
- throw Error('Runtime Error');
- }
- },
-
- /**
- * 预测Uploader将采用哪个`Runtime`
- * @grammar predictRuntmeType() => String
- * @method predictRuntmeType
- * @for Uploader
- */
- predictRuntmeType: function() {
- var orders = this.options.runtimeOrder || Runtime.orders,
- type = this.type,
- i, len;
-
- if ( !type ) {
- orders = orders.split( /\s*,\s*/g );
-
- for ( i = 0, len = orders.length; i < len; i++ ) {
- if ( Runtime.hasRuntime( orders[ i ] ) ) {
- this.type = type = orders[ i ];
- break;
- }
- }
- }
-
- return type;
- }
- });
- });
- /**
- * @fileOverview Transport
- */
- define('lib/transport',[
- 'base',
- 'runtime/client',
- 'mediator'
- ], function( Base, RuntimeClient, Mediator ) {
-
- var $ = Base.$;
-
- function Transport( opts ) {
- var me = this;
-
- opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
- RuntimeClient.call( this, 'Transport' );
-
- this._blob = null;
- this._formData = opts.formData || {};
- this._headers = opts.headers || {};
-
- this.on( 'progress', this._timeout );
- this.on( 'load error', function() {
- me.trigger( 'progress', 1 );
- clearTimeout( me._timer );
- });
- }
-
- Transport.options = {
- server: '',
- method: 'POST',
-
- // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
- withCredentials: false,
- fileVal: 'file',
- timeout: 2 * 60 * 1000, // 2分钟
- formData: {},
- headers: {},
- sendAsBinary: false
- };
-
- $.extend( Transport.prototype, {
-
- // 添加Blob, 只能添加一次,最后一次有效。
- appendBlob: function( key, blob, filename ) {
- var me = this,
- opts = me.options;
-
- if ( me.getRuid() ) {
- me.disconnectRuntime();
- }
-
- // 连接到blob归属的同一个runtime.
- me.connectRuntime( blob.ruid, function() {
- me.exec('init');
- });
-
- me._blob = blob;
- opts.fileVal = key || opts.fileVal;
- opts.filename = filename || opts.filename;
- },
-
- // 添加其他字段
- append: function( key, value ) {
- if ( typeof key === 'object' ) {
- $.extend( this._formData, key );
- } else {
- this._formData[ key ] = value;
- }
- },
-
- setRequestHeader: function( key, value ) {
- if ( typeof key === 'object' ) {
- $.extend( this._headers, key );
- } else {
- this._headers[ key ] = value;
- }
- },
-
- send: function( method ) {
- this.exec( 'send', method );
- this._timeout();
- },
-
- abort: function() {
- clearTimeout( this._timer );
- return this.exec('abort');
- },
-
- destroy: function() {
- this.trigger('destroy');
- this.off();
- this.exec('destroy');
- this.disconnectRuntime();
- },
-
- getResponse: function() {
- return this.exec('getResponse');
- },
-
- getResponseAsJson: function() {
- return this.exec('getResponseAsJson');
- },
-
- getStatus: function() {
- return this.exec('getStatus');
- },
-
- _timeout: function() {
- var me = this,
- duration = me.options.timeout;
-
- if ( !duration ) {
- return;
- }
-
- clearTimeout( me._timer );
- me._timer = setTimeout(function() {
- me.abort();
- me.trigger( 'error', 'timeout' );
- }, duration );
- }
-
- });
-
- // 让Transport具备事件功能。
- Mediator.installTo( Transport.prototype );
-
- return Transport;
- });
- /**
- * @fileOverview 负责文件上传相关。
- */
- define('widgets/upload',[
- 'base',
- 'uploader',
- 'file',
- 'lib/transport',
- 'widgets/widget'
- ], function( Base, Uploader, WUFile, Transport ) {
-
- var $ = Base.$,
- isPromise = Base.isPromise,
- Status = WUFile.Status;
-
- // 添加默认配置项
- $.extend( Uploader.options, {
-
-
- /**
- * @property {Boolean} [prepareNextFile=false]
- * @namespace options
- * @for Uploader
- * @description 是否允许在文件传输时提前把下一个文件准备好。
- * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
- * 如果能提前在当前文件传输期处理,可以节省总体耗时。
- */
- prepareNextFile: false,
-
- /**
- * @property {Boolean} [chunked=false]
- * @namespace options
- * @for Uploader
- * @description 是否要分片处理大文件上传。
- */
- chunked: false,
-
- /**
- * @property {Boolean} [chunkSize=5242880]
- * @namespace options
- * @for Uploader
- * @description 如果要分片,分多大一片? 默认大小为5M.
- */
- chunkSize: 5 * 1024 * 1024,
-
- /**
- * @property {Boolean} [chunkRetry=2]
- * @namespace options
- * @for Uploader
- * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
- */
- chunkRetry: 2,
-
- /**
- * @property {Boolean} [threads=3]
- * @namespace options
- * @for Uploader
- * @description 上传并发数。允许同时最大上传进程数。
- */
- threads: 3,
-
-
- /**
- * @property {Object} [formData]
- * @namespace options
- * @for Uploader
- * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
- */
- formData: null
-
- /**
- * @property {Object} [fileVal='file']
- * @namespace options
- * @for Uploader
- * @description 设置文件上传域的name。
- */
-
- /**
- * @property {Object} [method='POST']
- * @namespace options
- * @for Uploader
- * @description 文件上传方式,`POST`或者`GET`。
- */
-
- /**
- * @property {Object} [sendAsBinary=false]
- * @namespace options
- * @for Uploader
- * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
- * 其他参数在$_GET数组中。
- */
- });
-
- // 负责将文件切片。
- function CuteFile( file, chunkSize ) {
- var pending = [],
- blob = file.source,
- total = blob.size,
- chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
- start = 0,
- index = 0,
- len;
-
- while ( index < chunks ) {
- len = Math.min( chunkSize, total - start );
-
- pending.push({
- file: file,
- start: start,
- end: chunkSize ? (start + len) : total,
- total: total,
- chunks: chunks,
- chunk: index++
- });
- start += len;
- }
-
- file.blocks = pending.concat();
- file.remaning = pending.length;
-
- return {
- file: file,
-
- has: function() {
- return !!pending.length;
- },
-
- fetch: function() {
- return pending.shift();
- }
- };
- }
-
- Uploader.register({
- 'start-upload': 'start',
- 'stop-upload': 'stop',
- 'skip-file': 'skipFile',
- 'is-in-progress': 'isInProgress'
- }, {
-
- init: function() {
- var owner = this.owner;
-
- this.runing = false;
-
- // 记录当前正在传的数据,跟threads相关
- this.pool = [];
-
- // 缓存即将上传的文件。
- this.pending = [];
-
- // 跟踪还有多少分片没有完成上传。
- this.remaning = 0;
- this.__tick = Base.bindFn( this._tick, this );
-
- owner.on( 'uploadComplete', function( file ) {
- // 把其他块取消了。
- file.blocks && $.each( file.blocks, function( _, v ) {
- v.transport && (v.transport.abort(), v.transport.destroy());
- delete v.transport;
- });
-
- delete file.blocks;
- delete file.remaning;
- });
- },
-
- /**
- * @event startUpload
- * @description 当开始上传流程时触发。
- * @for Uploader
- */
-
- /**
- * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
- * @grammar upload() => undefined
- * @method upload
- * @for Uploader
- */
- start: function() {
- var me = this;
-
- // 移出invalid的文件
- $.each( me.request( 'get-files', Status.INVALID ), function() {
- me.request( 'remove-file', this );
- });
-
- if ( me.runing ) {
- return;
- }
-
- me.runing = true;
-
- // 如果有暂停的,则续传
- $.each( me.pool, function( _, v ) {
- var file = v.file;
-
- if ( file.getStatus() === Status.INTERRUPT ) {
- file.setStatus( Status.PROGRESS );
- me._trigged = false;
- v.transport && v.transport.send();
- }
- });
-
- me._trigged = false;
- me.owner.trigger('startUpload');
- Base.nextTick( me.__tick );
- },
-
- /**
- * @event stopUpload
- * @description 当开始上传流程暂停时触发。
- * @for Uploader
- */
-
- /**
- * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
- * @grammar stop() => undefined
- * @grammar stop( true ) => undefined
- * @method stop
- * @for Uploader
- */
- stop: function( interrupt ) {
- var me = this;
-
- if ( me.runing === false ) {
- return;
- }
-
- me.runing = false;
-
- interrupt && $.each( me.pool, function( _, v ) {
- v.transport && v.transport.abort();
- v.file.setStatus( Status.INTERRUPT );
- });
-
- me.owner.trigger('stopUpload');
- },
-
- /**
- * 判断`Uplaode`r是否正在上传中。
- * @grammar isInProgress() => Boolean
- * @method isInProgress
- * @for Uploader
- */
- isInProgress: function() {
- return !!this.runing;
- },
-
- getStats: function() {
- return this.request('get-stats');
- },
-
- /**
- * 掉过一个文件上传,直接标记指定文件为已上传状态。
- * @grammar skipFile( file ) => undefined
- * @method skipFile
- * @for Uploader
- */
- skipFile: function( file, status ) {
- file = this.request( 'get-file', file );
-
- file.setStatus( status || Status.COMPLETE );
- file.skipped = true;
-
- // 如果正在上传。
- file.blocks && $.each( file.blocks, function( _, v ) {
- var _tr = v.transport;
-
- if ( _tr ) {
- _tr.abort();
- _tr.destroy();
- delete v.transport;
- }
- });
-
- this.owner.trigger( 'uploadSkip', file );
- },
-
- /**
- * @event uploadFinished
- * @description 当所有文件上传结束时触发。
- * @for Uploader
- */
- _tick: function() {
- var me = this,
- opts = me.options,
- fn, val;
-
- // 上一个promise还没有结束,则等待完成后再执行。
- if ( me._promise ) {
- return me._promise.always( me.__tick );
- }
-
- // 还有位置,且还有文件要处理的话。
- if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
- me._trigged = false;
-
- fn = function( val ) {
- me._promise = null;
-
- // 有可能是reject过来的,所以要检测val的类型。
- val && val.file && me._startSend( val );
- Base.nextTick( me.__tick );
- };
-
- me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
-
- // 没有要上传的了,且没有正在传输的了。
- } else if ( !me.remaning && !me.getStats().numOfQueue ) {
- me.runing = false;
-
- me._trigged || Base.nextTick(function() {
- me.owner.trigger('uploadFinished');
- });
- me._trigged = true;
- }
- },
-
- _nextBlock: function() {
- var me = this,
- act = me._act,
- opts = me.options,
- next, done;
-
- // 如果当前文件还有没有需要传输的,则直接返回剩下的。
- if ( act && act.has() &&
- act.file.getStatus() === Status.PROGRESS ) {
-
- // 是否提前准备下一个文件
- if ( opts.prepareNextFile && !me.pending.length ) {
- me._prepareNextFile();
- }
-
- return act.fetch();
-
- // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
- } else if ( me.runing ) {
-
- // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
- if ( !me.pending.length && me.getStats().numOfQueue ) {
- me._prepareNextFile();
- }
-
- next = me.pending.shift();
- done = function( file ) {
- if ( !file ) {
- return null;
- }
-
- act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
- me._act = act;
- return act.fetch();
- };
-
- // 文件可能还在prepare中,也有可能已经完全准备好了。
- return isPromise( next ) ?
- next[ next.pipe ? 'pipe' : 'then']( done ) :
- done( next );
- }
- },
-
-
- /**
- * @event uploadStart
- * @param {File} file File对象
- * @description 某个文件开始上传前触发,一个文件只会触发一次。
- * @for Uploader
- */
- _prepareNextFile: function() {
- var me = this,
- file = me.request('fetch-file'),
- pending = me.pending,
- promise;
-
- if ( file ) {
- promise = me.request( 'before-send-file', file, function() {
-
- // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
- if ( file.getStatus() === Status.QUEUED ) {
- me.owner.trigger( 'uploadStart', file );
- file.setStatus( Status.PROGRESS );
- return file;
- }
-
- return me._finishFile( file );
- });
-
- // 如果还在pending中,则替换成文件本身。
- promise.done(function() {
- var idx = $.inArray( promise, pending );
-
- ~idx && pending.splice( idx, 1, file );
- });
-
- // befeore-send-file的钩子就有错误发生。
- promise.fail(function( reason ) {
- file.setStatus( Status.ERROR, reason );
- me.owner.trigger( 'uploadError', file, reason );
- me.owner.trigger( 'uploadComplete', file );
- });
-
- pending.push( promise );
- }
- },
-
- // 让出位置了,可以让其他分片开始上传
- _popBlock: function( block ) {
- var idx = $.inArray( block, this.pool );
-
- this.pool.splice( idx, 1 );
- block.file.remaning--;
- this.remaning--;
- },
-
- // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
- _startSend: function( block ) {
- var me = this,
- file = block.file,
- promise;
-
- me.pool.push( block );
- me.remaning++;
-
- // 如果没有分片,则直接使用原始的。
- // 不会丢失content-type信息。
- block.blob = block.chunks === 1 ? file.source :
- file.source.slice( block.start, block.end );
-
- // hook, 每个分片发送之前可能要做些异步的事情。
- promise = me.request( 'before-send', block, function() {
-
- // 有可能文件已经上传出错了,所以不需要再传输了。
- if ( file.getStatus() === Status.PROGRESS ) {
- me._doSend( block );
- } else {
- me._popBlock( block );
- Base.nextTick( me.__tick );
- }
- });
-
- // 如果为fail了,则跳过此分片。
- promise.fail(function() {
- if ( file.remaning === 1 ) {
- me._finishFile( file ).always(function() {
- block.percentage = 1;
- me._popBlock( block );
- me.owner.trigger( 'uploadComplete', file );
- Base.nextTick( me.__tick );
- });
- } else {
- block.percentage = 1;
- me._popBlock( block );
- Base.nextTick( me.__tick );
- }
- });
- },
-
-
- /**
- * @event uploadBeforeSend
- * @param {Object} object
- * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
- * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
- * @for Uploader
- */
-
- /**
- * @event uploadAccept
- * @param {Object} object
- * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
- * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
- * @for Uploader
- */
-
- /**
- * @event uploadProgress
- * @param {File} file File对象
- * @param {Number} percentage 上传进度
- * @description 上传过程中触发,携带上传进度。
- * @for Uploader
- */
-
-
- /**
- * @event uploadError
- * @param {File} file File对象
- * @param {String} reason 出错的code
- * @description 当文件上传出错时触发。
- * @for Uploader
- */
-
- /**
- * @event uploadSuccess
- * @param {File} file File对象
- * @param {Object} response 服务端返回的数据
- * @description 当文件上传成功时触发。
- * @for Uploader
- */
-
- /**
- * @event uploadComplete
- * @param {File} [file] File对象
- * @description 不管成功或者失败,文件上传完成时触发。
- * @for Uploader
- */
-
- // 做上传操作。
- _doSend: function( block ) {
- var me = this,
- owner = me.owner,
- opts = me.options,
- file = block.file,
- tr = new Transport( opts ),
- data = $.extend({}, opts.formData ),
- headers = $.extend({}, opts.headers ),
- requestAccept, ret;
-
- block.transport = tr;
-
- tr.on( 'destroy', function() {
- delete block.transport;
- me._popBlock( block );
- Base.nextTick( me.__tick );
- });
-
- // 广播上传进度。以文件为单位。
- tr.on( 'progress', function( percentage ) {
- var totalPercent = 0,
- uploaded = 0;
-
- // 可能没有abort掉,progress还是执行进来了。
- // if ( !file.blocks ) {
- // return;
- // }
-
- totalPercent = block.percentage = percentage;
-
- if ( block.chunks > 1 ) { // 计算文件的整体速度。
- $.each( file.blocks, function( _, v ) {
- uploaded += (v.percentage || 0) * (v.end - v.start);
- });
-
- totalPercent = uploaded / file.size;
- }
-
- owner.trigger( 'uploadProgress', file, totalPercent || 0 );
- });
-
- // 用来询问,是否返回的结果是有错误的。
- requestAccept = function( reject ) {
- var fn;
-
- ret = tr.getResponseAsJson() || {};
- ret._raw = tr.getResponse();
- fn = function( value ) {
- reject = value;
- };
-
- // 服务端响应了,不代表成功了,询问是否响应正确。
- if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
- reject = reject || 'server';
- }
-
- return reject;
- };
-
- // 尝试重试,然后广播文件上传出错。
- tr.on( 'error', function( type, flag ) {
- block.retried = block.retried || 0;
-
- // 自动重试
- if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
- block.retried < opts.chunkRetry ) {
-
- block.retried++;
- tr.send();
-
- } else {
-
- // http status 500 ~ 600
- if ( !flag && type === 'server' ) {
- type = requestAccept( type );
- }
-
- file.setStatus( Status.ERROR, type );
- owner.trigger( 'uploadError', file, type );
- owner.trigger( 'uploadComplete', file );
- }
- });
-
- // 上传成功
- tr.on( 'load', function() {
- var reason;
-
- // 如果非预期,转向上传出错。
- if ( (reason = requestAccept()) ) {
- tr.trigger( 'error', reason, true );
- return;
- }
-
- // 全部上传完成。
- if ( file.remaning === 1 ) {
- me._finishFile( file, ret );
- } else {
- tr.destroy();
- }
- });
-
- // 配置默认的上传字段。
- data = $.extend( data, {
- id: file.id,
- name: file.name,
- type: file.type,
- lastModifiedDate: file.lastModifiedDate,
- size: file.size
- });
-
- block.chunks > 1 && $.extend( data, {
- chunks: block.chunks,
- chunk: block.chunk
- });
-
- // 在发送之间可以添加字段什么的。。。
- // 如果默认的字段不够使用,可以通过监听此事件来扩展
- owner.trigger( 'uploadBeforeSend', block, data, headers );
-
- // 开始发送。
- tr.appendBlob( opts.fileVal, block.blob, file.name );
- tr.append( data );
- tr.setRequestHeader( headers );
- tr.send();
- },
-
- // 完成上传。
- _finishFile: function( file, ret, hds ) {
- var owner = this.owner;
-
- return owner
- .request( 'after-send-file', arguments, function() {
- file.setStatus( Status.COMPLETE );
- owner.trigger( 'uploadSuccess', file, ret, hds );
- })
- .fail(function( reason ) {
-
- // 如果外部已经标记为invalid什么的,不再改状态。
- if ( file.getStatus() === Status.PROGRESS ) {
- file.setStatus( Status.ERROR, reason );
- }
-
- owner.trigger( 'uploadError', file, reason );
- })
- .always(function() {
- owner.trigger( 'uploadComplete', file );
- });
- }
-
- });
- });
- /**
- * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
- */
-
- define('widgets/validator',[
- 'base',
- 'uploader',
- 'file',
- 'widgets/widget'
- ], function( Base, Uploader, WUFile ) {
-
- var $ = Base.$,
- validators = {},
- api;
-
- /**
- * @event error
- * @param {String} type 错误类型。
- * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
- *
- * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
- * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
- * @for Uploader
- */
-
- // 暴露给外面的api
- api = {
-
- // 添加验证器
- addValidator: function( type, cb ) {
- validators[ type ] = cb;
- },
-
- // 移除验证器
- removeValidator: function( type ) {
- delete validators[ type ];
- }
- };
-
- // 在Uploader初始化的时候启动Validators的初始化
- Uploader.register({
- init: function() {
- var me = this;
- $.each( validators, function() {
- this.call( me.owner );
- });
- }
- });
-
- /**
- * @property {int} [fileNumLimit=undefined]
- * @namespace options
- * @for Uploader
- * @description 验证文件总数量, 超出则不允许加入队列。
- */
- api.addValidator( 'fileNumLimit', function() {
- var uploader = this,
- opts = uploader.options,
- count = 0,
- max = opts.fileNumLimit >> 0,
- flag = true;
-
- if ( !max ) {
- return;
- }
-
- uploader.on( 'beforeFileQueued', function( file ) {
-
- if ( count >= max && flag ) {
- flag = false;
- this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
- setTimeout(function() {
- flag = true;
- }, 1 );
- }
-
- return count >= max ? false : true;
- });
-
- uploader.on( 'fileQueued', function() {
- count++;
- });
-
- uploader.on( 'fileDequeued', function() {
- count--;
- });
-
- uploader.on( 'uploadFinished', function() {
- count = 0;
- });
- });
-
-
- /**
- * @property {int} [fileSizeLimit=undefined]
- * @namespace options
- * @for Uploader
- * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
- */
- api.addValidator( 'fileSizeLimit', function() {
- var uploader = this,
- opts = uploader.options,
- count = 0,
- max = opts.fileSizeLimit >> 0,
- flag = true;
-
- if ( !max ) {
- return;
- }
-
- uploader.on( 'beforeFileQueued', function( file ) {
- var invalid = count + file.size > max;
-
- if ( invalid && flag ) {
- flag = false;
- this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
- setTimeout(function() {
- flag = true;
- }, 1 );
- }
-
- return invalid ? false : true;
- });
-
- uploader.on( 'fileQueued', function( file ) {
- count += file.size;
- });
-
- uploader.on( 'fileDequeued', function( file ) {
- count -= file.size;
- });
-
- uploader.on( 'uploadFinished', function() {
- count = 0;
- });
- });
-
- /**
- * @property {int} [fileSingleSizeLimit=undefined]
- * @namespace options
- * @for Uploader
- * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
- */
- api.addValidator( 'fileSingleSizeLimit', function() {
- var uploader = this,
- opts = uploader.options,
- max = opts.fileSingleSizeLimit;
-
- if ( !max ) {
- return;
- }
-
- uploader.on( 'beforeFileQueued', function( file ) {
-
- if ( file.size > max ) {
- file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
- this.trigger( 'error', 'F_EXCEED_SIZE', file );
- return false;
- }
-
- });
-
- });
-
- /**
- * @property {int} [duplicate=undefined]
- * @namespace options
- * @for Uploader
- * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
- */
- api.addValidator( 'duplicate', function() {
- var uploader = this,
- opts = uploader.options,
- mapping = {};
-
- if ( opts.duplicate ) {
- return;
- }
-
- function hashString( str ) {
- var hash = 0,
- i = 0,
- len = str.length,
- _char;
-
- for ( ; i < len; i++ ) {
- _char = str.charCodeAt( i );
- hash = _char + (hash << 6) + (hash << 16) - hash;
- }
-
- return hash;
- }
-
- uploader.on( 'beforeFileQueued', function( file ) {
- var hash = file.__hash || (file.__hash = hashString( file.name +
- file.size + file.lastModifiedDate ));
-
- // 已经重复了
- if ( mapping[ hash ] ) {
- this.trigger( 'error', 'F_DUPLICATE', file );
- return false;
- }
- });
-
- uploader.on( 'fileQueued', function( file ) {
- var hash = file.__hash;
-
- hash && (mapping[ hash ] = true);
- });
-
- uploader.on( 'fileDequeued', function( file ) {
- var hash = file.__hash;
-
- hash && (delete mapping[ hash ]);
- });
- });
-
- return api;
- });
-
- /**
- * @fileOverview Runtime管理器,负责Runtime的选择, 连接
- */
- define('runtime/compbase',[],function() {
-
- function CompBase( owner, runtime ) {
-
- this.owner = owner;
- this.options = owner.options;
-
- this.getRuntime = function() {
- return runtime;
- };
-
- this.getRuid = function() {
- return runtime.uid;
- };
-
- this.trigger = function() {
- return owner.trigger.apply( owner, arguments );
- };
- }
-
- return CompBase;
- });
- /**
- * @fileOverview Html5Runtime
- */
- define('runtime/html5/runtime',[
- 'base',
- 'runtime/runtime',
- 'runtime/compbase'
- ], function( Base, Runtime, CompBase ) {
-
- var type = 'html5',
- components = {};
-
- function Html5Runtime() {
- var pool = {},
- me = this,
- destory = this.destory;
-
- Runtime.apply( me, arguments );
- me.type = type;
-
-
- // 这个方法的调用者,实际上是RuntimeClient
- me.exec = function( comp, fn/*, args...*/) {
- var client = this,
- uid = client.uid,
- args = Base.slice( arguments, 2 ),
- instance;
-
- if ( components[ comp ] ) {
- instance = pool[ uid ] = pool[ uid ] ||
- new components[ comp ]( client, me );
-
- if ( instance[ fn ] ) {
- return instance[ fn ].apply( instance, args );
- }
- }
- };
-
- me.destory = function() {
- // @todo 删除池子中的所有实例
- return destory && destory.apply( this, arguments );
- };
- }
-
- Base.inherits( Runtime, {
- constructor: Html5Runtime,
-
- // 不需要连接其他程序,直接执行callback
- init: function() {
- var me = this;
- setTimeout(function() {
- me.trigger('ready');
- }, 1 );
- }
-
- });
-
- // 注册Components
- Html5Runtime.register = function( name, component ) {
- var klass = components[ name ] = Base.inherits( CompBase, component );
- return klass;
- };
-
- // 注册html5运行时。
- // 只有在支持的前提下注册。
- if ( window.Blob && window.FileReader && window.DataView ) {
- Runtime.addRuntime( type, Html5Runtime );
- }
-
- return Html5Runtime;
- });
- /**
- * @fileOverview Blob Html实现
- */
- define('runtime/html5/blob',[
- 'runtime/html5/runtime',
- 'lib/blob'
- ], function( Html5Runtime, Blob ) {
-
- return Html5Runtime.register( 'Blob', {
- slice: function( start, end ) {
- var blob = this.owner.source,
- slice = blob.slice || blob.webkitSlice || blob.mozSlice;
-
- blob = slice.call( blob, start, end );
-
- return new Blob( this.getRuid(), blob );
- }
- });
- });
- /**
- * @fileOverview FilePaste
- */
- define('runtime/html5/dnd',[
- 'base',
- 'runtime/html5/runtime',
- 'lib/file'
- ], function( Base, Html5Runtime, File ) {
-
- var $ = Base.$,
- prefix = 'webuploader-dnd-';
-
- return Html5Runtime.register( 'DragAndDrop', {
- init: function() {
- var elem = this.elem = this.options.container;
-
- this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );
- this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );
- this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );
- this.dropHandler = Base.bindFn( this._dropHandler, this );
- this.dndOver = false;
-
- elem.on( 'dragenter', this.dragEnterHandler );
- elem.on( 'dragover', this.dragOverHandler );
- elem.on( 'dragleave', this.dragLeaveHandler );
- elem.on( 'drop', this.dropHandler );
-
- if ( this.options.disableGlobalDnd ) {
- $( document ).on( 'dragover', this.dragOverHandler );
- $( document ).on( 'drop', this.dropHandler );
- }
- },
-
- _dragEnterHandler: function( e ) {
- var me = this,
- denied = me._denied || false,
- items;
-
- e = e.originalEvent || e;
-
- if ( !me.dndOver ) {
- me.dndOver = true;
-
- // 注意只有 chrome 支持。
- items = e.dataTransfer.items;
-
- if ( items && items.length ) {
- me._denied = denied = !me.trigger( 'accept', items );
- }
-
- me.elem.addClass( prefix + 'over' );
- me.elem[ denied ? 'addClass' :
- 'removeClass' ]( prefix + 'denied' );
- }
-
-
- e.dataTransfer.dropEffect = denied ? 'none' : 'copy';
-
- return false;
- },
-
- _dragOverHandler: function( e ) {
- // 只处理框内的。
- var parentElem = this.elem.parent().get( 0 );
- if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
- return false;
- }
-
- clearTimeout( this._leaveTimer );
- this._dragEnterHandler.call( this, e );
-
- return false;
- },
-
- _dragLeaveHandler: function() {
- var me = this,
- handler;
-
- handler = function() {
- me.dndOver = false;
- me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );
- };
-
- clearTimeout( me._leaveTimer );
- me._leaveTimer = setTimeout( handler, 100 );
- return false;
- },
-
- _dropHandler: function( e ) {
- var me = this,
- ruid = me.getRuid(),
- parentElem = me.elem.parent().get( 0 );
-
- // 只处理框内的。
- if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
- return false;
- }
-
- me._getTansferFiles( e, function( results ) {
- me.trigger( 'drop', $.map( results, function( file ) {
- return new File( ruid, file );
- }) );
- });
-
- me.dndOver = false;
- me.elem.removeClass( prefix + 'over' );
- return false;
- },
-
- // 如果传入 callback 则去查看文件夹,否则只管当前文件夹。
- _getTansferFiles: function( e, callback ) {
- var results = [],
- promises = [],
- items, files, dataTransfer, file, item, i, len, canAccessFolder;
-
- e = e.originalEvent || e;
-
- dataTransfer = e.dataTransfer;
- items = dataTransfer.items;
- files = dataTransfer.files;
-
- canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);
-
- for ( i = 0, len = files.length; i < len; i++ ) {
- file = files[ i ];
- item = items && items[ i ];
-
- if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {
-
- promises.push( this._traverseDirectoryTree(
- item.webkitGetAsEntry(), results ) );
- } else {
- results.push( file );
- }
- }
-
- Base.when.apply( Base, promises ).done(function() {
-
- if ( !results.length ) {
- return;
- }
-
- callback( results );
- });
- },
-
- _traverseDirectoryTree: function( entry, results ) {
- var deferred = Base.Deferred(),
- me = this;
-
- if ( entry.isFile ) {
- entry.file(function( file ) {
- results.push( file );
- deferred.resolve();
- });
- } else if ( entry.isDirectory ) {
- entry.createReader().readEntries(function( entries ) {
- var len = entries.length,
- promises = [],
- arr = [], // 为了保证顺序。
- i;
-
- for ( i = 0; i < len; i++ ) {
- promises.push( me._traverseDirectoryTree(
- entries[ i ], arr ) );
- }
-
- Base.when.apply( Base, promises ).then(function() {
- results.push.apply( results, arr );
- deferred.resolve();
- }, deferred.reject );
- });
- }
-
- return deferred.promise();
- },
-
- destroy: function() {
- var elem = this.elem;
-
- elem.off( 'dragenter', this.dragEnterHandler );
- elem.off( 'dragover', this.dragEnterHandler );
- elem.off( 'dragleave', this.dragLeaveHandler );
- elem.off( 'drop', this.dropHandler );
-
- if ( this.options.disableGlobalDnd ) {
- $( document ).off( 'dragover', this.dragOverHandler );
- $( document ).off( 'drop', this.dropHandler );
- }
- }
- });
- });
-
- /**
- * @fileOverview FilePaste
- */
- define('runtime/html5/filepaste',[
- 'base',
- 'runtime/html5/runtime',
- 'lib/file'
- ], function( Base, Html5Runtime, File ) {
-
- return Html5Runtime.register( 'FilePaste', {
- init: function() {
- var opts = this.options,
- elem = this.elem = opts.container,
- accept = '.*',
- arr, i, len, item;
-
- // accetp的mimeTypes中生成匹配正则。
- if ( opts.accept ) {
- arr = [];
-
- for ( i = 0, len = opts.accept.length; i < len; i++ ) {
- item = opts.accept[ i ].mimeTypes;
- item && arr.push( item );
- }
-
- if ( arr.length ) {
- accept = arr.join(',');
- accept = accept.replace( /,/g, '|' ).replace( /\*/g, '.*' );
- }
- }
- this.accept = accept = new RegExp( accept, 'i' );
- this.hander = Base.bindFn( this._pasteHander, this );
- elem.on( 'paste', this.hander );
- },
-
- _pasteHander: function( e ) {
- var allowed = [],
- ruid = this.getRuid(),
- items, item, blob, i, len;
-
- e = e.originalEvent || e;
- items = e.clipboardData.items;
-
- for ( i = 0, len = items.length; i < len; i++ ) {
- item = items[ i ];
-
- if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {
- continue;
- }
-
- allowed.push( new File( ruid, blob ) );
- }
-
- if ( allowed.length ) {
- // 不阻止非文件粘贴(文字粘贴)的事件冒泡
- e.preventDefault();
- e.stopPropagation();
- this.trigger( 'paste', allowed );
- }
- },
-
- destroy: function() {
- this.elem.off( 'paste', this.hander );
- }
- });
- });
-
- /**
- * @fileOverview FilePicker
- */
- define('runtime/html5/filepicker',[
- 'base',
- 'runtime/html5/runtime'
- ], function( Base, Html5Runtime ) {
-
- var $ = Base.$;
-
- return Html5Runtime.register( 'FilePicker', {
- init: function() {
- var container = this.getRuntime().getContainer(),
- me = this,
- owner = me.owner,
- opts = me.options,
- lable = $( document.createElement('label') ),
- input = $( document.createElement('input') ),
- arr, i, len, mouseHandler;
-
- input.attr( 'type', 'file' );
- input.attr( 'name', opts.name );
- input.addClass('webuploader-element-invisible');
-
- lable.on( 'click', function() {
- input.trigger('click');
- });
-
- lable.css({
- opacity: 0,
- width: '100%',
- height: '100%',
- display: 'block',
- cursor: 'pointer',
- background: '#ffffff'
- });
-
- if ( opts.multiple ) {
- input.attr( 'multiple', 'multiple' );
- }
-
- // @todo Firefox不支持单独指定后缀
- if ( opts.accept && opts.accept.length > 0 ) {
- arr = [];
-
- for ( i = 0, len = opts.accept.length; i < len; i++ ) {
- arr.push( opts.accept[ i ].mimeTypes );
- }
-
- input.attr( 'accept', arr.join(',') );
- }
-
- container.append( input );
- container.append( lable );
-
- mouseHandler = function( e ) {
- owner.trigger( e.type );
- };
-
- input.on( 'change', function( e ) {
- var fn = arguments.callee,
- clone;
-
- me.files = e.target.files;
-
- // reset input
- clone = this.cloneNode( true );
- this.parentNode.replaceChild( clone, this );
-
- input.off();
- input = $( clone ).on( 'change', fn )
- .on( 'mouseenter mouseleave', mouseHandler );
-
- owner.trigger('change');
- });
-
- lable.on( 'mouseenter mouseleave', mouseHandler );
-
- },
-
-
- getFiles: function() {
- return this.files;
- },
-
- destroy: function() {
- // todo
- }
- });
- });
- /**
- * @fileOverview Transport
- * @todo 支持chunked传输,优势:
- * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
- * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
- */
- define('runtime/html5/transport',[
- 'base',
- 'runtime/html5/runtime'
- ], function( Base, Html5Runtime ) {
-
- var noop = Base.noop,
- $ = Base.$;
-
- return Html5Runtime.register( 'Transport', {
- init: function() {
- this._status = 0;
- this._response = null;
- },
-
- send: function() {
- var owner = this.owner,
- opts = this.options,
- xhr = this._initAjax(),
- blob = owner._blob,
- server = opts.server,
- formData, binary, fr;
-
- if ( opts.sendAsBinary ) {
- server += (/\?/.test( server ) ? '&' : '?') +
- $.param( owner._formData );
-
- binary = blob.getSource();
- } else {
- formData = new FormData();
- $.each( owner._formData, function( k, v ) {
- formData.append( k, v );
- });
-
- formData.append( opts.fileVal, blob.getSource(),
- opts.filename || owner._formData.name || '' );
- }
-
- if ( opts.withCredentials && 'withCredentials' in xhr ) {
- xhr.open( opts.method, server, true );
- xhr.withCredentials = true;
- } else {
- xhr.open( opts.method, server );
- }
-
- this._setRequestHeader( xhr, opts.headers );
-
- if ( binary ) {
- xhr.overrideMimeType('application/octet-stream');
-
- // android直接发送blob会导致服务端接收到的是空文件。
- // bug详情。
- // https://code.google.com/p/android/issues/detail?id=39882
- // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
- if ( Base.os.android ) {
- fr = new FileReader();
-
- fr.onload = function() {
- xhr.send( this.result );
- fr = fr.onload = null;
- };
-
- fr.readAsArrayBuffer( binary );
- } else {
- xhr.send( binary );
- }
- } else {
- xhr.send( formData );
- }
- },
-
- getResponse: function() {
- return this._response;
- },
-
- getResponseAsJson: function() {
- return this._parseJson( this._response );
- },
-
- getStatus: function() {
- return this._status;
- },
-
- abort: function() {
- var xhr = this._xhr;
-
- if ( xhr ) {
- xhr.upload.onprogress = noop;
- xhr.onreadystatechange = noop;
- xhr.abort();
-
- this._xhr = xhr = null;
- }
- },
-
- destroy: function() {
- this.abort();
- },
-
- _initAjax: function() {
- var me = this,
- xhr = new XMLHttpRequest(),
- opts = this.options;
-
- if ( opts.withCredentials && !('withCredentials' in xhr) &&
- typeof XDomainRequest !== 'undefined' ) {
- xhr = new XDomainRequest();
- }
-
- xhr.upload.onprogress = function( e ) {
- var percentage = 0;
-
- if ( e.lengthComputable ) {
- percentage = e.loaded / e.total;
- }
-
- return me.trigger( 'progress', percentage );
- };
-
- xhr.onreadystatechange = function() {
-
- if ( xhr.readyState !== 4 ) {
- return;
- }
-
- xhr.upload.onprogress = noop;
- xhr.onreadystatechange = noop;
- me._xhr = null;
- me._status = xhr.status;
-
- if ( xhr.status >= 200 && xhr.status < 300 ) {
- me._response = xhr.responseText;
- return me.trigger('load');
- } else if ( xhr.status >= 500 && xhr.status < 600 ) {
- me._response = xhr.responseText;
- return me.trigger( 'error', 'server' );
- }
-
-
- return me.trigger( 'error', me._status ? 'http' : 'abort' );
- };
-
- me._xhr = xhr;
- return xhr;
- },
-
- _setRequestHeader: function( xhr, headers ) {
- $.each( headers, function( key, val ) {
- xhr.setRequestHeader( key, val );
- });
- },
-
- _parseJson: function( str ) {
- var json;
-
- try {
- json = JSON.parse( str );
- } catch ( ex ) {
- json = {};
- }
-
- return json;
- }
- });
- });
- /**
- * @fileOverview FlashRuntime
- */
- define('runtime/flash/runtime',[
- 'base',
- 'runtime/runtime',
- 'runtime/compbase'
- ], function( Base, Runtime, CompBase ) {
-
- var $ = Base.$,
- type = 'flash',
- components = {};
-
-
- function getFlashVersion() {
- var version;
-
- try {
- version = navigator.plugins[ 'Shockwave Flash' ];
- version = version.description;
- } catch ( ex ) {
- try {
- version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
- .GetVariable('$version');
- } catch ( ex2 ) {
- version = '0.0';
- }
- }
- version = version.match( /\d+/g );
- return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );
- }
-
- function FlashRuntime() {
- var pool = {},
- clients = {},
- destory = this.destory,
- me = this,
- jsreciver = Base.guid('webuploader_');
-
- Runtime.apply( me, arguments );
- me.type = type;
-
-
- // 这个方法的调用者,实际上是RuntimeClient
- me.exec = function( comp, fn/*, args...*/ ) {
- var client = this,
- uid = client.uid,
- args = Base.slice( arguments, 2 ),
- instance;
-
- clients[ uid ] = client;
-
- if ( components[ comp ] ) {
- if ( !pool[ uid ] ) {
- pool[ uid ] = new components[ comp ]( client, me );
- }
-
- instance = pool[ uid ];
-
- if ( instance[ fn ] ) {
- return instance[ fn ].apply( instance, args );
- }
- }
-
- return me.flashExec.apply( client, arguments );
- };
-
- function handler( evt, obj ) {
- var type = evt.type || evt,
- parts, uid;
-
- parts = type.split('::');
- uid = parts[ 0 ];
- type = parts[ 1 ];
-
- // console.log.apply( console, arguments );
-
- if ( type === 'Ready' && uid === me.uid ) {
- me.trigger('ready');
- } else if ( clients[ uid ] ) {
- clients[ uid ].trigger( type.toLowerCase(), evt, obj );
- }
-
- // Base.log( evt, obj );
- }
-
- // flash的接受器。
- window[ jsreciver ] = function() {
- var args = arguments;
-
- // 为了能捕获得到。
- setTimeout(function() {
- handler.apply( null, args );
- }, 1 );
- };
-
- this.jsreciver = jsreciver;
-
- this.destory = function() {
- // @todo 删除池子中的所有实例
- return destory && destory.apply( this, arguments );
- };
-
- this.flashExec = function( comp, fn ) {
- var flash = me.getFlash(),
- args = Base.slice( arguments, 2 );
-
- return flash.exec( this.uid, comp, fn, args );
- };
-
- // @todo
- }
-
- Base.inherits( Runtime, {
- constructor: FlashRuntime,
-
- init: function() {
- var container = this.getContainer(),
- opts = this.options,
- html;
-
- // if not the minimal height, shims are not initialized
- // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)
- container.css({
- position: 'absolute',
- top: '-8px',
- left: '-8px',
- width: '9px',
- height: '9px',
- overflow: 'hidden'
- });
-
- // insert flash object
- html = '' +
- ' ' +
- ' ' +
- ' ' +
- ' ' +
- ' ';
-
- container.html( html );
- },
-
- getFlash: function() {
- if ( this._flash ) {
- return this._flash;
- }
-
- this._flash = $( '#' + this.uid ).get( 0 );
- return this._flash;
- }
-
- });
-
- FlashRuntime.register = function( name, component ) {
- component = components[ name ] = Base.inherits( CompBase, $.extend({
-
- // @todo fix this later
- flashExec: function() {
- var owner = this.owner,
- runtime = this.getRuntime();
-
- return runtime.flashExec.apply( owner, arguments );
- }
- }, component ) );
-
- return component;
- };
-
- if ( getFlashVersion() >= 11.4 ) {
- Runtime.addRuntime( type, FlashRuntime );
- }
-
- return FlashRuntime;
- });
- /**
- * @fileOverview FilePicker
- */
- define('runtime/flash/filepicker',[
- 'base',
- 'runtime/flash/runtime'
- ], function( Base, FlashRuntime ) {
- var $ = Base.$;
-
- return FlashRuntime.register( 'FilePicker', {
- init: function( opts ) {
- var copy = $.extend({}, opts ),
- len, i;
-
- // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug.
- len = copy.accept && copy.accept.length;
- for ( i = 0; i < len; i++ ) {
- if ( !copy.accept[ i ].title ) {
- copy.accept[ i ].title = 'Files';
- }
- }
-
- delete copy.button;
- delete copy.container;
-
- this.flashExec( 'FilePicker', 'init', copy );
- },
-
- destroy: function() {
- // todo
- }
- });
- });
- /**
- * @fileOverview Transport flash实现
- */
- define('runtime/flash/transport',[
- 'base',
- 'runtime/flash/runtime',
- 'runtime/client'
- ], function( Base, FlashRuntime, RuntimeClient ) {
- var $ = Base.$;
-
- return FlashRuntime.register( 'Transport', {
- init: function() {
- this._status = 0;
- this._response = null;
- this._responseJson = null;
- },
-
- send: function() {
- var owner = this.owner,
- opts = this.options,
- xhr = this._initAjax(),
- blob = owner._blob,
- server = opts.server,
- binary;
-
- xhr.connectRuntime( blob.ruid );
-
- if ( opts.sendAsBinary ) {
- server += (/\?/.test( server ) ? '&' : '?') +
- $.param( owner._formData );
-
- binary = blob.uid;
- } else {
- $.each( owner._formData, function( k, v ) {
- xhr.exec( 'append', k, v );
- });
-
- xhr.exec( 'appendBlob', opts.fileVal, blob.uid,
- opts.filename || owner._formData.name || '' );
- }
-
- this._setRequestHeader( xhr, opts.headers );
- xhr.exec( 'send', {
- method: opts.method,
- url: server
- }, binary );
- },
-
- getStatus: function() {
- return this._status;
- },
-
- getResponse: function() {
- return this._response;
- },
-
- getResponseAsJson: function() {
- return this._responseJson;
- },
-
- abort: function() {
- var xhr = this._xhr;
-
- if ( xhr ) {
- xhr.exec('abort');
- xhr.destroy();
- this._xhr = xhr = null;
- }
- },
-
- destroy: function() {
- this.abort();
- },
-
- _initAjax: function() {
- var me = this,
- xhr = new RuntimeClient('XMLHttpRequest');
-
- xhr.on( 'uploadprogress progress', function( e ) {
- return me.trigger( 'progress', e.loaded / e.total );
- });
-
- xhr.on( 'load', function() {
- var status = xhr.exec('getStatus'),
- err = '';
-
- xhr.off();
- me._xhr = null;
-
- if ( status >= 200 && status < 300 ) {
- me._response = xhr.exec('getResponse');
- me._responseJson = xhr.exec('getResponseAsJson');
- } else if ( status >= 500 && status < 600 ) {
- me._response = xhr.exec('getResponse');
- me._responseJson = xhr.exec('getResponseAsJson');
- err = 'server';
- } else {
- err = 'http';
- }
-
- xhr.destroy();
- xhr = null;
-
- return err ? me.trigger( 'error', err ) : me.trigger('load');
- });
-
- xhr.on( 'error', function() {
- xhr.off();
- me._xhr = null;
- me.trigger( 'error', 'http' );
- });
-
- me._xhr = xhr;
- return xhr;
- },
-
- _setRequestHeader: function( xhr, headers ) {
- $.each( headers, function( key, val ) {
- xhr.exec( 'setRequestHeader', key, val );
- });
- }
- });
- });
- /**
- * @fileOverview 没有图像处理的版本。
- */
- define('preset/withoutimage',[
- 'base',
-
- // widgets
- 'widgets/filednd',
- 'widgets/filepaste',
- 'widgets/filepicker',
- 'widgets/queue',
- 'widgets/runtime',
- 'widgets/upload',
- 'widgets/validator',
-
- // runtimes
- // html5
- 'runtime/html5/blob',
- 'runtime/html5/dnd',
- 'runtime/html5/filepaste',
- 'runtime/html5/filepicker',
- 'runtime/html5/transport',
-
- // flash
- 'runtime/flash/filepicker',
- 'runtime/flash/transport'
- ], function( Base ) {
- return Base;
- });
- define('webuploader',[
- 'preset/withoutimage'
- ], function( preset ) {
- return preset;
- });
- return require('webuploader');
-});
diff --git a/www/js/ueditor/third-party/webuploader/webuploader.withoutimage.min.js b/www/js/ueditor/third-party/webuploader/webuploader.withoutimage.min.js
deleted file mode 100644
index 70a7d483bd..0000000000
--- a/www/js/ueditor/third-party/webuploader/webuploader.withoutimage.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* WebUploader 0.1.2 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}},j=b(a,f,e);i(j),"object"==typeof module&&"object"==typeof module.exports?module.exports=j:"function"==typeof define&&define.amd?define([],j):(c=a.WebUploader,a.WebUploader=j,a.WebUploader.noConflict=function(){a.WebUploader=c})}(this,function(a,b,c){return b("dollar-third",[],function(){return a.jQuery||a.Zepto}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.2",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return{successNum:a.numOfSuccess,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.parentNode.removeChild(this.__container),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/dnd",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},d.options,a),a.container=e(a.container),a.container.length&&c.call(this,"DragAndDrop")}var e=a.$;return d.options={accept:null,disableGlobalDnd:!1},a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})},destroy:function(){this.disconnectRuntime()}}),b.installTo(d.prototype),d}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g={},h=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):g},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[];return e.each(h,function(c,d){b.push(new d(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,h,i,j,k=0,l=this._widgets,m=l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],h=f.invoke(b,d),h!==g&&(a.isPromise(h)?o.push(h):n.push(h));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return setTimeout(function(){b.resolve.apply(b,c)},1),b.promise()})[j](e||a.noop)):n[0]}}),b.register=d.register=function(b,c){var f,g={init:"init"};return 1===arguments.length?(c=b,c.responseMap=g):c.responseMap=e.extend(g,b),f=a.inherits(d,c),h.push(f),f},d}),b("widgets/filednd",["base","uploader","lib/dnd","widgets/widget"],function(a,b,c){var d=a.$;return b.options.dnd="",b.register({init:function(b){if(b.dnd&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{disableGlobalDnd:b.disableGlobalDnd,container:b.dnd,accept:b.accept});return e=new c(h),e.once("ready",g.resolve),e.on("drop",function(a){f.request("add-file",[a])}),e.on("accept",function(a){return f.owner.trigger("dndAccept",a)}),e.init(),g.promise()}}})}),b("lib/filepaste",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},a),a.container=e(a.container||document.body),c.call(this,"FilePaste")}var e=a.$;return a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})},destroy:function(){this.exec("destroy"),this.disconnectRuntime(),this.off()}}),b.installTo(d.prototype),d}),b("widgets/filepaste",["base","uploader","lib/filepaste","widgets/widget"],function(a,b,c){var d=a.$;return b.register({init:function(b){if(b.paste&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{container:b.paste,accept:b.accept});return e=new c(h),e.once("ready",g.resolve),e.on("paste",function(a){f.owner.request("add-file",[a])}),e.init(),g.promise()}}})}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,b.call(d,"Blob"),this.uid=c.uid||this.uid,this.type=c.type||"",this.size=c.size||0,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;b.apply(this,arguments),this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&this.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(this.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),!this.type&&~"jpg,jpeg,png,gif,bmp".indexOf(f)&&(this.type="image/"+("jpg"===f?"jpeg":f)),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString()}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var b=this,c=b.options,e=c.button;e.addClass("webuploader-pick"),b.on("all",function(a){var g;switch(a){case"mouseenter":e.addClass("webuploader-pick-hover");break;case"mouseleave":e.removeClass("webuploader-pick-hover");break;case"change":g=b.exec("getFiles"),b.trigger("select",f.map(g,function(a){return a=new d(b.getRuid(),a),a._refer=c.container,a}),c.container)}}),b.connectRuntime(c,function(){b.refresh(),b.exec("init",c),b.trigger("ready")}),f(a).on("resize",function(){b.refresh()})},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){this.runtime&&(this.exec("destroy"),this.disconnectRuntime())}}),e}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({"add-btn":"addButton",refresh:"refresh",disable:"disable",enable:"enable"},{init:function(a){return this.pickers=[],a.pick&&this.addButton(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addButton:function(b){var e,f,g,h=this,i=h.options,j=i.accept;if(b)return g=a.Deferred(),d.isPlainObject(b)||(b={id:b}),e=d.extend({},b,{accept:d.isPlainObject(j)?[j]:j,swf:i.swf,runtimeOrder:i.runtimeOrder}),f=new c(e),f.once("ready",g.resolve),f.on("select",function(a){h.owner.request("add-file",[a])}),f.init(),this.pickers.push(f),g.promise()},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destory:function(){delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)})),a.setStatus(f.QUEUED)},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({"sort-files":"sortFiles","add-file":"addFiles","get-file":"getFile","fetch-file":"fetchFile","get-stats":"getStats","get-files":"getFiles","remove-file":"removeFile",retry:"retry",reset:"reset","accept-file":"acceptFile"},{init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||a.size<6||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFiles:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&b.request("start-upload")},getStats:function(){return this.stats},removeFile:function(a){var b=this;a=a.id?a:b.queue.getFile(a),a.setStatus(i.CANCELLED),b.owner.trigger("fileDequeued",a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.queue=new c,this.stats=this.queue.stats}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({"predict-runtime-type":"predictRuntmeType"},{init:function(){if(!this.predictRuntmeType())throw Error("Runtime Error")},predictRuntmeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){for(var c,d=[],e=a.source,f=e.size,g=b?Math.ceil(f/b):1,h=0,i=0;g>i;)c=Math.min(b,f-h),d.push({file:a,start:h,end:b?h+c:f,total:f,chunks:g,chunk:i++}),h+=c;return a.blocks=d.concat(),a.remaning=d.length,{file:a,has:function(){return!!d.length},fetch:function(){return d.shift()}}}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:null}),b.register({"start-upload":"start","stop-upload":"stop","skip-file":"skipFile","is-in-progress":"isInProgress"},{init:function(){var b=this.owner;this.runing=!1,this.pool=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},start:function(){var b=this;f.each(b.request("get-files",h.INVALID),function(){b.request("remove-file",this)}),b.runing||(b.runing=!0,f.each(b.pool,function(a,c){var d=c.file;d.getStatus()===h.INTERRUPT&&(d.setStatus(h.PROGRESS),b._trigged=!1,c.transport&&c.transport.send())}),b._trigged=!1,b.owner.trigger("startUpload"),a.nextTick(b.__tick))},stop:function(a){var b=this;b.runing!==!1&&(b.runing=!1,a&&f.each(b.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),b.owner.trigger("stopUpload"))},isInProgress:function(){return!!this.runing},getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length1&&(f.each(k.blocks,function(a,b){d+=(b.percentage||0)*(b.end-b.start)}),c=d/k.size),i.trigger("uploadProgress",k,c||0)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({init:function(){var a=this;e.each(f,function(){this.call(a.owner)})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=b.fileNumLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=b.fileSizeLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}))}),d}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destory;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destory=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/dnd",["base","runtime/html5/runtime","lib/file"],function(a,b,c){var d=a.$,e="webuploader-dnd-";return b.register("DragAndDrop",{init:function(){var b=this.elem=this.options.container;this.dragEnterHandler=a.bindFn(this._dragEnterHandler,this),this.dragOverHandler=a.bindFn(this._dragOverHandler,this),this.dragLeaveHandler=a.bindFn(this._dragLeaveHandler,this),this.dropHandler=a.bindFn(this._dropHandler,this),this.dndOver=!1,b.on("dragenter",this.dragEnterHandler),b.on("dragover",this.dragOverHandler),b.on("dragleave",this.dragLeaveHandler),b.on("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).on("dragover",this.dragOverHandler),d(document).on("drop",this.dropHandler))},_dragEnterHandler:function(a){var b,c=this,d=c._denied||!1;return a=a.originalEvent||a,c.dndOver||(c.dndOver=!0,b=a.dataTransfer.items,b&&b.length&&(c._denied=d=!c.trigger("accept",b)),c.elem.addClass(e+"over"),c.elem[d?"addClass":"removeClass"](e+"denied")),a.dataTransfer.dropEffect=d?"none":"copy",!1},_dragOverHandler:function(a){var b=this.elem.parent().get(0);return b&&!d.contains(b,a.currentTarget)?!1:(clearTimeout(this._leaveTimer),this._dragEnterHandler.call(this,a),!1)},_dragLeaveHandler:function(){var a,b=this;return a=function(){b.dndOver=!1,b.elem.removeClass(e+"over "+e+"denied")},clearTimeout(b._leaveTimer),b._leaveTimer=setTimeout(a,100),!1},_dropHandler:function(a){var b=this,f=b.getRuid(),g=b.elem.parent().get(0);return g&&!d.contains(g,a.currentTarget)?!1:(b._getTansferFiles(a,function(a){b.trigger("drop",d.map(a,function(a){return new c(f,a)}))}),b.dndOver=!1,b.elem.removeClass(e+"over"),!1)},_getTansferFiles:function(b,c){var d,e,f,g,h,i,j,k,l=[],m=[];for(b=b.originalEvent||b,f=b.dataTransfer,d=f.items,e=f.files,k=!(!d||!d[0].webkitGetAsEntry),i=0,j=e.length;j>i;i++)g=e[i],h=d&&d[i],k&&h.webkitGetAsEntry().isDirectory?m.push(this._traverseDirectoryTree(h.webkitGetAsEntry(),l)):l.push(g);a.when.apply(a,m).done(function(){l.length&&c(l)})},_traverseDirectoryTree:function(b,c){var d=a.Deferred(),e=this;return b.isFile?b.file(function(a){c.push(a),d.resolve()}):b.isDirectory&&b.createReader().readEntries(function(b){var f,g=b.length,h=[],i=[];for(f=0;g>f;f++)h.push(e._traverseDirectoryTree(b[f],i));a.when.apply(a,h).then(function(){c.push.apply(c,i),d.resolve()},d.reject)}),d.promise()},destroy:function(){var a=this.elem;a.off("dragenter",this.dragEnterHandler),a.off("dragover",this.dragEnterHandler),a.off("dragleave",this.dragLeaveHandler),a.off("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).off("dragover",this.dragOverHandler),d(document).off("drop",this.dropHandler))}})}),b("runtime/html5/filepaste",["base","runtime/html5/runtime","lib/file"],function(a,b,c){return b.register("FilePaste",{init:function(){var b,c,d,e,f=this.options,g=this.elem=f.container,h=".*";if(f.accept){for(b=[],c=0,d=f.accept.length;d>c;c++)e=f.accept[c].mimeTypes,e&&b.push(e);b.length&&(h=b.join(","),h=h.replace(/,/g,"|").replace(/\*/g,".*"))
-}this.accept=h=new RegExp(h,"i"),this.hander=a.bindFn(this._pasteHander,this),g.on("paste",this.hander)},_pasteHander:function(a){var b,d,e,f,g,h=[],i=this.getRuid();for(a=a.originalEvent||a,b=a.clipboardData.items,f=0,g=b.length;g>f;f++)d=b[f],"file"===d.kind&&(e=d.getAsFile())&&h.push(new c(i,e));h.length&&(a.preventDefault(),a.stopPropagation(),this.trigger("paste",h))},destroy:function(){this.elem.off("paste",this.hander)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=c(document.createElement("label")),k=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){}})}),b("runtime/html5/transport",["base","runtime/html5/runtime"],function(a,b){var c=a.noop,d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null},send:function(){var b,c,e,f=this.owner,g=this.options,h=this._initAjax(),i=f._blob,j=g.server;g.sendAsBinary?(j+=(/\?/.test(j)?"&":"?")+d.param(f._formData),c=i.getSource()):(b=new FormData,d.each(f._formData,function(a,c){b.append(a,c)}),b.append(g.fileVal,i.getSource(),g.filename||f._formData.name||"")),g.withCredentials&&"withCredentials"in h?(h.open(g.method,j,!0),h.withCredentials=!0):h.open(g.method,j),this._setRequestHeader(h,g.headers),c?(h.overrideMimeType("application/octet-stream"),a.os.android?(e=new FileReader,e.onload=function(){h.send(this.result),e=e.onload=null},e.readAsArrayBuffer(c)):h.send(c)):h.send(b)},getResponse:function(){return this._response},getResponseAsJson:function(){return this._parseJson(this._response)},getStatus:function(){return this._status},abort:function(){var a=this._xhr;a&&(a.upload.onprogress=c,a.onreadystatechange=c,a.abort(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new XMLHttpRequest,d=this.options;return!d.withCredentials||"withCredentials"in b||"undefined"==typeof XDomainRequest||(b=new XDomainRequest),b.upload.onprogress=function(b){var c=0;return b.lengthComputable&&(c=b.loaded/b.total),a.trigger("progress",c)},b.onreadystatechange=function(){return 4===b.readyState?(b.upload.onprogress=c,b.onreadystatechange=c,a._xhr=null,a._status=b.status,b.status>=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("runtime/flash/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a;try{a=navigator.plugins["Shockwave Flash"],a=a.description}catch(b){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(c){a="0.0"}}return a=a.match(/\d+/g),parseFloat(a[0]+"."+a[1],10)}function f(){function d(a,b){var c,d,e=a.type||a;c=e.split("::"),d=c[0],e=c[1],"Ready"===e&&d===j.uid?j.trigger("ready"):f[d]&&f[d].trigger(e.toLowerCase(),a,b)}var e={},f={},g=this.destory,j=this,k=b.guid("webuploader_");c.apply(j,arguments),j.type=h,j.exec=function(a,c){var d,g=this,h=g.uid,k=b.slice(arguments,2);return f[h]=g,i[a]&&(e[h]||(e[h]=new i[a](g,j)),d=e[h],d[c])?d[c].apply(d,k):j.flashExec.apply(g,arguments)},a[k]=function(){var a=arguments;setTimeout(function(){d.apply(null,a)},1)},this.jsreciver=k,this.destory=function(){return g&&g.apply(this,arguments)},this.flashExec=function(a,c){var d=j.getFlash(),e=b.slice(arguments,2);return d.exec(this.uid,a,c,e)}}var g=b.$,h="flash",i={};return b.inherits(c,{constructor:f,init:function(){var a,c=this.getContainer(),d=this.options;c.css({position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),a=' ',c.html(a)},getFlash:function(){return this._flash?this._flash:(this._flash=g("#"+this.uid).get(0),this._flash)}}),f.register=function(a,c){return c=i[a]=b.inherits(d,g.extend({flashExec:function(){var a=this.owner,b=this.getRuntime();return b.flashExec.apply(a,arguments)}},c))},e()>=11.4&&c.addRuntime(h,f),f}),b("runtime/flash/filepicker",["base","runtime/flash/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(a){var b,d,e=c.extend({},a);for(b=e.accept&&e.accept.length,d=0;b>d;d++)e.accept[d].title||(e.accept[d].title="Files");delete e.button,delete e.container,this.flashExec("FilePicker","init",e)},destroy:function(){}})}),b("runtime/flash/transport",["base","runtime/flash/runtime","runtime/client"],function(a,b,c){var d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null,this._responseJson=null},send:function(){var a,b=this.owner,c=this.options,e=this._initAjax(),f=b._blob,g=c.server;e.connectRuntime(f.ruid),c.sendAsBinary?(g+=(/\?/.test(g)?"&":"?")+d.param(b._formData),a=f.uid):(d.each(b._formData,function(a,b){e.exec("append",a,b)}),e.exec("appendBlob",c.fileVal,f.uid,c.filename||b._formData.name||"")),this._setRequestHeader(e,c.headers),e.exec("send",{method:c.method,url:g},a)},getStatus:function(){return this._status},getResponse:function(){return this._response},getResponseAsJson:function(){return this._responseJson},abort:function(){var a=this._xhr;a&&(a.exec("abort"),a.destroy(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new c("XMLHttpRequest");return b.on("uploadprogress progress",function(b){return a.trigger("progress",b.loaded/b.total)}),b.on("load",function(){var c=b.exec("getStatus"),d="";return b.off(),a._xhr=null,c>=200&&300>c?(a._response=b.exec("getResponse"),a._responseJson=b.exec("getResponseAsJson")):c>=500&&600>c?(a._response=b.exec("getResponse"),a._responseJson=b.exec("getResponseAsJson"),d="server"):d="http",b.destroy(),b=null,d?a.trigger("error",d):a.trigger("load")}),b.on("error",function(){b.off(),a._xhr=null,a.trigger("error","http")}),a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.exec("setRequestHeader",b,c)})}})}),b("preset/withoutimage",["base","widgets/filednd","widgets/filepaste","widgets/filepicker","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","runtime/html5/blob","runtime/html5/dnd","runtime/html5/filepaste","runtime/html5/filepicker","runtime/html5/transport","runtime/flash/filepicker","runtime/flash/transport"],function(a){return a}),b("webuploader",["preset/withoutimage"],function(a){return a}),c("webuploader")});
\ No newline at end of file
diff --git a/www/js/ueditor/third-party/zeroclipboard/ZeroClipboard.js b/www/js/ueditor/third-party/zeroclipboard/ZeroClipboard.js
deleted file mode 100644
index 1d5d868d75..0000000000
--- a/www/js/ueditor/third-party/zeroclipboard/ZeroClipboard.js
+++ /dev/null
@@ -1,1256 +0,0 @@
-/*!
-* ZeroClipboard
-* The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript interface.
-* Copyright (c) 2014 Jon Rohan, James M. Greene
-* Licensed MIT
-* http://zeroclipboard.org/
-* v2.0.0-beta.5
-*/
-(function(window) {
- "use strict";
- var _currentElement;
- var _flashState = {
- bridge: null,
- version: "0.0.0",
- pluginType: "unknown",
- disabled: null,
- outdated: null,
- unavailable: null,
- deactivated: null,
- overdue: null,
- ready: null
- };
- var _clipData = {};
- var _clipDataFormatMap = null;
- var _clientIdCounter = 0;
- var _clientMeta = {};
- var _elementIdCounter = 0;
- var _elementMeta = {};
- var _swfPath = function() {
- var i, jsDir, tmpJsPath, jsPath, swfPath = "ZeroClipboard.swf";
- if (!(document.currentScript && (jsPath = document.currentScript.src))) {
- var scripts = document.getElementsByTagName("script");
- if ("readyState" in scripts[0]) {
- for (i = scripts.length; i--; ) {
- if (scripts[i].readyState === "interactive" && (jsPath = scripts[i].src)) {
- break;
- }
- }
- } else if (document.readyState === "loading") {
- jsPath = scripts[scripts.length - 1].src;
- } else {
- for (i = scripts.length; i--; ) {
- tmpJsPath = scripts[i].src;
- if (!tmpJsPath) {
- jsDir = null;
- break;
- }
- tmpJsPath = tmpJsPath.split("#")[0].split("?")[0];
- tmpJsPath = tmpJsPath.slice(0, tmpJsPath.lastIndexOf("/") + 1);
- if (jsDir == null) {
- jsDir = tmpJsPath;
- } else if (jsDir !== tmpJsPath) {
- jsDir = null;
- break;
- }
- }
- if (jsDir !== null) {
- jsPath = jsDir;
- }
- }
- }
- if (jsPath) {
- jsPath = jsPath.split("#")[0].split("?")[0];
- swfPath = jsPath.slice(0, jsPath.lastIndexOf("/") + 1) + swfPath;
- }
- return swfPath;
- }();
- var _camelizeCssPropName = function() {
- var matcherRegex = /\-([a-z])/g, replacerFn = function(match, group) {
- return group.toUpperCase();
- };
- return function(prop) {
- return prop.replace(matcherRegex, replacerFn);
- };
- }();
- var _getStyle = function(el, prop) {
- var value, camelProp, tagName;
- if (window.getComputedStyle) {
- value = window.getComputedStyle(el, null).getPropertyValue(prop);
- } else {
- camelProp = _camelizeCssPropName(prop);
- if (el.currentStyle) {
- value = el.currentStyle[camelProp];
- } else {
- value = el.style[camelProp];
- }
- }
- if (prop === "cursor") {
- if (!value || value === "auto") {
- tagName = el.tagName.toLowerCase();
- if (tagName === "a") {
- return "pointer";
- }
- }
- }
- return value;
- };
- var _elementMouseOver = function(event) {
- if (!event) {
- event = window.event;
- }
- var target;
- if (this !== window) {
- target = this;
- } else if (event.target) {
- target = event.target;
- } else if (event.srcElement) {
- target = event.srcElement;
- }
- ZeroClipboard.activate(target);
- };
- var _addEventHandler = function(element, method, func) {
- if (!element || element.nodeType !== 1) {
- return;
- }
- if (element.addEventListener) {
- element.addEventListener(method, func, false);
- } else if (element.attachEvent) {
- element.attachEvent("on" + method, func);
- }
- };
- var _removeEventHandler = function(element, method, func) {
- if (!element || element.nodeType !== 1) {
- return;
- }
- if (element.removeEventListener) {
- element.removeEventListener(method, func, false);
- } else if (element.detachEvent) {
- element.detachEvent("on" + method, func);
- }
- };
- var _addClass = function(element, value) {
- if (!element || element.nodeType !== 1) {
- return element;
- }
- if (element.classList) {
- if (!element.classList.contains(value)) {
- element.classList.add(value);
- }
- return element;
- }
- if (value && typeof value === "string") {
- var classNames = (value || "").split(/\s+/);
- if (element.nodeType === 1) {
- if (!element.className) {
- element.className = value;
- } else {
- var className = " " + element.className + " ", setClass = element.className;
- for (var c = 0, cl = classNames.length; c < cl; c++) {
- if (className.indexOf(" " + classNames[c] + " ") < 0) {
- setClass += " " + classNames[c];
- }
- }
- element.className = setClass.replace(/^\s+|\s+$/g, "");
- }
- }
- }
- return element;
- };
- var _removeClass = function(element, value) {
- if (!element || element.nodeType !== 1) {
- return element;
- }
- if (element.classList) {
- if (element.classList.contains(value)) {
- element.classList.remove(value);
- }
- return element;
- }
- if (value && typeof value === "string" || value === undefined) {
- var classNames = (value || "").split(/\s+/);
- if (element.nodeType === 1 && element.className) {
- if (value) {
- var className = (" " + element.className + " ").replace(/[\n\t]/g, " ");
- for (var c = 0, cl = classNames.length; c < cl; c++) {
- className = className.replace(" " + classNames[c] + " ", " ");
- }
- element.className = className.replace(/^\s+|\s+$/g, "");
- } else {
- element.className = "";
- }
- }
- }
- return element;
- };
- var _getZoomFactor = function() {
- var rect, physicalWidth, logicalWidth, zoomFactor = 1;
- if (typeof document.body.getBoundingClientRect === "function") {
- rect = document.body.getBoundingClientRect();
- physicalWidth = rect.right - rect.left;
- logicalWidth = document.body.offsetWidth;
- zoomFactor = Math.round(physicalWidth / logicalWidth * 100) / 100;
- }
- return zoomFactor;
- };
- var _getDOMObjectPosition = function(obj, defaultZIndex) {
- var info = {
- left: 0,
- top: 0,
- width: 0,
- height: 0,
- zIndex: _getSafeZIndex(defaultZIndex) - 1
- };
- if (obj.getBoundingClientRect) {
- var rect = obj.getBoundingClientRect();
- var pageXOffset, pageYOffset, zoomFactor;
- if ("pageXOffset" in window && "pageYOffset" in window) {
- pageXOffset = window.pageXOffset;
- pageYOffset = window.pageYOffset;
- } else {
- zoomFactor = _getZoomFactor();
- pageXOffset = Math.round(document.documentElement.scrollLeft / zoomFactor);
- pageYOffset = Math.round(document.documentElement.scrollTop / zoomFactor);
- }
- var leftBorderWidth = document.documentElement.clientLeft || 0;
- var topBorderWidth = document.documentElement.clientTop || 0;
- info.left = rect.left + pageXOffset - leftBorderWidth;
- info.top = rect.top + pageYOffset - topBorderWidth;
- info.width = "width" in rect ? rect.width : rect.right - rect.left;
- info.height = "height" in rect ? rect.height : rect.bottom - rect.top;
- }
- return info;
- };
- var _cacheBust = function(path, options) {
- var cacheBust = options == null || options && options.cacheBust === true;
- if (cacheBust) {
- return (path.indexOf("?") === -1 ? "?" : "&") + "noCache=" + new Date().getTime();
- } else {
- return "";
- }
- };
- var _vars = function(options) {
- var i, len, domain, domains, str = "", trustedOriginsExpanded = [];
- if (options.trustedDomains) {
- if (typeof options.trustedDomains === "string") {
- domains = [ options.trustedDomains ];
- } else if (typeof options.trustedDomains === "object" && "length" in options.trustedDomains) {
- domains = options.trustedDomains;
- }
- }
- if (domains && domains.length) {
- for (i = 0, len = domains.length; i < len; i++) {
- if (domains.hasOwnProperty(i) && domains[i] && typeof domains[i] === "string") {
- domain = _extractDomain(domains[i]);
- if (!domain) {
- continue;
- }
- if (domain === "*") {
- trustedOriginsExpanded = [ domain ];
- break;
- }
- trustedOriginsExpanded.push.apply(trustedOriginsExpanded, [ domain, "//" + domain, window.location.protocol + "//" + domain ]);
- }
- }
- }
- if (trustedOriginsExpanded.length) {
- str += "trustedOrigins=" + encodeURIComponent(trustedOriginsExpanded.join(","));
- }
- if (options.forceEnhancedClipboard === true) {
- str += (str ? "&" : "") + "forceEnhancedClipboard=true";
- }
- return str;
- };
- var _inArray = function(elem, array, fromIndex) {
- if (typeof array.indexOf === "function") {
- return array.indexOf(elem, fromIndex);
- }
- var i, len = array.length;
- if (typeof fromIndex === "undefined") {
- fromIndex = 0;
- } else if (fromIndex < 0) {
- fromIndex = len + fromIndex;
- }
- for (i = fromIndex; i < len; i++) {
- if (array.hasOwnProperty(i) && array[i] === elem) {
- return i;
- }
- }
- return -1;
- };
- var _prepClip = function(elements) {
- if (typeof elements === "string") {
- throw new TypeError("ZeroClipboard doesn't accept query strings.");
- }
- return typeof elements.length !== "number" ? [ elements ] : elements;
- };
- var _dispatchCallback = function(func, context, args, async) {
- if (async) {
- window.setTimeout(function() {
- func.apply(context, args);
- }, 0);
- } else {
- func.apply(context, args);
- }
- };
- var _getSafeZIndex = function(val) {
- var zIndex, tmp;
- if (val) {
- if (typeof val === "number" && val > 0) {
- zIndex = val;
- } else if (typeof val === "string" && (tmp = parseInt(val, 10)) && !isNaN(tmp) && tmp > 0) {
- zIndex = tmp;
- }
- }
- if (!zIndex) {
- if (typeof _globalConfig.zIndex === "number" && _globalConfig.zIndex > 0) {
- zIndex = _globalConfig.zIndex;
- } else if (typeof _globalConfig.zIndex === "string" && (tmp = parseInt(_globalConfig.zIndex, 10)) && !isNaN(tmp) && tmp > 0) {
- zIndex = tmp;
- }
- }
- return zIndex || 0;
- };
- var _extend = function() {
- var i, len, arg, prop, src, copy, target = arguments[0] || {};
- for (i = 1, len = arguments.length; i < len; i++) {
- if ((arg = arguments[i]) != null) {
- for (prop in arg) {
- if (arg.hasOwnProperty(prop)) {
- src = target[prop];
- copy = arg[prop];
- if (target === copy) {
- continue;
- }
- if (copy !== undefined) {
- target[prop] = copy;
- }
- }
- }
- }
- }
- return target;
- };
- var _extractDomain = function(originOrUrl) {
- if (originOrUrl == null || originOrUrl === "") {
- return null;
- }
- originOrUrl = originOrUrl.replace(/^\s+|\s+$/g, "");
- if (originOrUrl === "") {
- return null;
- }
- var protocolIndex = originOrUrl.indexOf("//");
- originOrUrl = protocolIndex === -1 ? originOrUrl : originOrUrl.slice(protocolIndex + 2);
- var pathIndex = originOrUrl.indexOf("/");
- originOrUrl = pathIndex === -1 ? originOrUrl : protocolIndex === -1 || pathIndex === 0 ? null : originOrUrl.slice(0, pathIndex);
- if (originOrUrl && originOrUrl.slice(-4).toLowerCase() === ".swf") {
- return null;
- }
- return originOrUrl || null;
- };
- var _determineScriptAccess = function() {
- var _extractAllDomains = function(origins, resultsArray) {
- var i, len, tmp;
- if (origins == null || resultsArray[0] === "*") {
- return;
- }
- if (typeof origins === "string") {
- origins = [ origins ];
- }
- if (!(typeof origins === "object" && typeof origins.length === "number")) {
- return;
- }
- for (i = 0, len = origins.length; i < len; i++) {
- if (origins.hasOwnProperty(i) && (tmp = _extractDomain(origins[i]))) {
- if (tmp === "*") {
- resultsArray.length = 0;
- resultsArray.push("*");
- break;
- }
- if (_inArray(tmp, resultsArray) === -1) {
- resultsArray.push(tmp);
- }
- }
- }
- };
- return function(currentDomain, configOptions) {
- var swfDomain = _extractDomain(configOptions.swfPath);
- if (swfDomain === null) {
- swfDomain = currentDomain;
- }
- var trustedDomains = [];
- _extractAllDomains(configOptions.trustedOrigins, trustedDomains);
- _extractAllDomains(configOptions.trustedDomains, trustedDomains);
- var len = trustedDomains.length;
- if (len > 0) {
- if (len === 1 && trustedDomains[0] === "*") {
- return "always";
- }
- if (_inArray(currentDomain, trustedDomains) !== -1) {
- if (len === 1 && currentDomain === swfDomain) {
- return "sameDomain";
- }
- return "always";
- }
- }
- return "never";
- };
- }();
- var _objectKeys = function(obj) {
- if (obj == null) {
- return [];
- }
- if (Object.keys) {
- return Object.keys(obj);
- }
- var keys = [];
- for (var prop in obj) {
- if (obj.hasOwnProperty(prop)) {
- keys.push(prop);
- }
- }
- return keys;
- };
- var _deleteOwnProperties = function(obj) {
- if (obj) {
- for (var prop in obj) {
- if (obj.hasOwnProperty(prop)) {
- delete obj[prop];
- }
- }
- }
- return obj;
- };
- var _safeActiveElement = function() {
- try {
- return document.activeElement;
- } catch (err) {}
- return null;
- };
- var _pick = function(obj, keys) {
- var newObj = {};
- for (var i = 0, len = keys.length; i < len; i++) {
- if (keys[i] in obj) {
- newObj[keys[i]] = obj[keys[i]];
- }
- }
- return newObj;
- };
- var _omit = function(obj, keys) {
- var newObj = {};
- for (var prop in obj) {
- if (_inArray(prop, keys) === -1) {
- newObj[prop] = obj[prop];
- }
- }
- return newObj;
- };
- var _mapClipDataToFlash = function(clipData) {
- var newClipData = {}, formatMap = {};
- if (!(typeof clipData === "object" && clipData)) {
- return;
- }
- for (var dataFormat in clipData) {
- if (dataFormat && clipData.hasOwnProperty(dataFormat) && typeof clipData[dataFormat] === "string" && clipData[dataFormat]) {
- switch (dataFormat.toLowerCase()) {
- case "text/plain":
- case "text":
- case "air:text":
- case "flash:text":
- newClipData.text = clipData[dataFormat];
- formatMap.text = dataFormat;
- break;
-
- case "text/html":
- case "html":
- case "air:html":
- case "flash:html":
- newClipData.html = clipData[dataFormat];
- formatMap.html = dataFormat;
- break;
-
- case "application/rtf":
- case "text/rtf":
- case "rtf":
- case "richtext":
- case "air:rtf":
- case "flash:rtf":
- newClipData.rtf = clipData[dataFormat];
- formatMap.rtf = dataFormat;
- break;
-
- default:
- break;
- }
- }
- }
- return {
- data: newClipData,
- formatMap: formatMap
- };
- };
- var _mapClipResultsFromFlash = function(clipResults, formatMap) {
- if (!(typeof clipResults === "object" && clipResults && typeof formatMap === "object" && formatMap)) {
- return clipResults;
- }
- var newResults = {};
- for (var prop in clipResults) {
- if (clipResults.hasOwnProperty(prop)) {
- if (prop !== "success" && prop !== "data") {
- newResults[prop] = clipResults[prop];
- continue;
- }
- newResults[prop] = {};
- var tmpHash = clipResults[prop];
- for (var dataFormat in tmpHash) {
- if (dataFormat && tmpHash.hasOwnProperty(dataFormat) && formatMap.hasOwnProperty(dataFormat)) {
- newResults[prop][formatMap[dataFormat]] = tmpHash[dataFormat];
- }
- }
- }
- }
- return newResults;
- };
- var _args = function(arraySlice) {
- return function(args) {
- return arraySlice.call(args, 0);
- };
- }(window.Array.prototype.slice);
- var _detectFlashSupport = function() {
- var plugin, ax, mimeType, hasFlash = false, isActiveX = false, isPPAPI = false, flashVersion = "";
- function parseFlashVersion(desc) {
- var matches = desc.match(/[\d]+/g);
- matches.length = 3;
- return matches.join(".");
- }
- function isPepperFlash(flashPlayerFileName) {
- return !!flashPlayerFileName && (flashPlayerFileName = flashPlayerFileName.toLowerCase()) && (/^(pepflashplayer\.dll|libpepflashplayer\.so|pepperflashplayer\.plugin)$/.test(flashPlayerFileName) || flashPlayerFileName.slice(-13) === "chrome.plugin");
- }
- function inspectPlugin(plugin) {
- if (plugin) {
- hasFlash = true;
- if (plugin.version) {
- flashVersion = parseFlashVersion(plugin.version);
- }
- if (!flashVersion && plugin.description) {
- flashVersion = parseFlashVersion(plugin.description);
- }
- if (plugin.filename) {
- isPPAPI = isPepperFlash(plugin.filename);
- }
- }
- }
- if (navigator.plugins && navigator.plugins.length) {
- plugin = navigator.plugins["Shockwave Flash"];
- inspectPlugin(plugin);
- if (navigator.plugins["Shockwave Flash 2.0"]) {
- hasFlash = true;
- flashVersion = "2.0.0.11";
- }
- } else if (navigator.mimeTypes && navigator.mimeTypes.length) {
- mimeType = navigator.mimeTypes["application/x-shockwave-flash"];
- plugin = mimeType && mimeType.enabledPlugin;
- inspectPlugin(plugin);
- } else if (typeof ActiveXObject !== "undefined") {
- isActiveX = true;
- try {
- ax = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
- hasFlash = true;
- flashVersion = parseFlashVersion(ax.GetVariable("$version"));
- } catch (e1) {
- try {
- ax = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
- hasFlash = true;
- flashVersion = "6.0.21";
- } catch (e2) {
- try {
- ax = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
- hasFlash = true;
- flashVersion = parseFlashVersion(ax.GetVariable("$version"));
- } catch (e3) {
- isActiveX = false;
- }
- }
- }
- }
- _flashState.disabled = hasFlash !== true;
- _flashState.outdated = flashVersion && parseFloat(flashVersion) < 11;
- _flashState.version = flashVersion || "0.0.0";
- _flashState.pluginType = isPPAPI ? "pepper" : isActiveX ? "activex" : hasFlash ? "netscape" : "unknown";
- };
- _detectFlashSupport();
- var ZeroClipboard = function(elements) {
- if (!(this instanceof ZeroClipboard)) {
- return new ZeroClipboard(elements);
- }
- this.id = "" + _clientIdCounter++;
- _clientMeta[this.id] = {
- instance: this,
- elements: [],
- handlers: {}
- };
- if (elements) {
- this.clip(elements);
- }
- if (typeof _flashState.ready !== "boolean") {
- _flashState.ready = false;
- }
- if (!ZeroClipboard.isFlashUnusable() && _flashState.bridge === null) {
- var _client = this;
- var maxWait = _globalConfig.flashLoadTimeout;
- if (typeof maxWait === "number" && maxWait >= 0) {
- setTimeout(function() {
- if (typeof _flashState.deactivated !== "boolean") {
- _flashState.deactivated = true;
- }
- if (_flashState.deactivated === true) {
- ZeroClipboard.emit({
- type: "error",
- name: "flash-deactivated",
- client: _client
- });
- }
- }, maxWait);
- }
- _flashState.overdue = false;
- _bridge();
- }
- };
- ZeroClipboard.prototype.setText = function(text) {
- ZeroClipboard.setData("text/plain", text);
- return this;
- };
- ZeroClipboard.prototype.setHtml = function(html) {
- ZeroClipboard.setData("text/html", html);
- return this;
- };
- ZeroClipboard.prototype.setRichText = function(richText) {
- ZeroClipboard.setData("application/rtf", richText);
- return this;
- };
- ZeroClipboard.prototype.setData = function() {
- ZeroClipboard.setData.apply(ZeroClipboard, _args(arguments));
- return this;
- };
- ZeroClipboard.prototype.clearData = function() {
- ZeroClipboard.clearData.apply(ZeroClipboard, _args(arguments));
- return this;
- };
- ZeroClipboard.prototype.setSize = function(width, height) {
- _setSize(width, height);
- return this;
- };
- var _setHandCursor = function(enabled) {
- if (_flashState.ready === true && _flashState.bridge && typeof _flashState.bridge.setHandCursor === "function") {
- _flashState.bridge.setHandCursor(enabled);
- } else {
- _flashState.ready = false;
- }
- };
- ZeroClipboard.prototype.destroy = function() {
- this.unclip();
- this.off();
- delete _clientMeta[this.id];
- };
- var _getAllClients = function() {
- var i, len, client, clients = [], clientIds = _objectKeys(_clientMeta);
- for (i = 0, len = clientIds.length; i < len; i++) {
- client = _clientMeta[clientIds[i]].instance;
- if (client && client instanceof ZeroClipboard) {
- clients.push(client);
- }
- }
- return clients;
- };
- ZeroClipboard.version = "2.0.0-beta.5";
- var _globalConfig = {
- swfPath: _swfPath,
- trustedDomains: window.location.host ? [ window.location.host ] : [],
- cacheBust: true,
- forceHandCursor: false,
- forceEnhancedClipboard: false,
- zIndex: 999999999,
- debug: false,
- title: null,
- autoActivate: true,
- flashLoadTimeout: 3e4
- };
- ZeroClipboard.isFlashUnusable = function() {
- return !!(_flashState.disabled || _flashState.outdated || _flashState.unavailable || _flashState.deactivated);
- };
- ZeroClipboard.config = function(options) {
- if (typeof options === "object" && options !== null) {
- _extend(_globalConfig, options);
- }
- if (typeof options === "string" && options) {
- if (_globalConfig.hasOwnProperty(options)) {
- return _globalConfig[options];
- }
- return;
- }
- var copy = {};
- for (var prop in _globalConfig) {
- if (_globalConfig.hasOwnProperty(prop)) {
- if (typeof _globalConfig[prop] === "object" && _globalConfig[prop] !== null) {
- if ("length" in _globalConfig[prop]) {
- copy[prop] = _globalConfig[prop].slice(0);
- } else {
- copy[prop] = _extend({}, _globalConfig[prop]);
- }
- } else {
- copy[prop] = _globalConfig[prop];
- }
- }
- }
- return copy;
- };
- ZeroClipboard.destroy = function() {
- ZeroClipboard.deactivate();
- for (var clientId in _clientMeta) {
- if (_clientMeta.hasOwnProperty(clientId) && _clientMeta[clientId]) {
- var client = _clientMeta[clientId].instance;
- if (client && typeof client.destroy === "function") {
- client.destroy();
- }
- }
- }
- var flashBridge = _flashState.bridge;
- if (flashBridge) {
- var htmlBridge = _getHtmlBridge(flashBridge);
- if (htmlBridge) {
- if (_flashState.pluginType === "activex" && "readyState" in flashBridge) {
- flashBridge.style.display = "none";
- (function removeSwfFromIE() {
- if (flashBridge.readyState === 4) {
- for (var prop in flashBridge) {
- if (typeof flashBridge[prop] === "function") {
- flashBridge[prop] = null;
- }
- }
- flashBridge.parentNode.removeChild(flashBridge);
- if (htmlBridge.parentNode) {
- htmlBridge.parentNode.removeChild(htmlBridge);
- }
- } else {
- setTimeout(removeSwfFromIE, 10);
- }
- })();
- } else {
- flashBridge.parentNode.removeChild(flashBridge);
- if (htmlBridge.parentNode) {
- htmlBridge.parentNode.removeChild(htmlBridge);
- }
- }
- }
- _flashState.ready = null;
- _flashState.bridge = null;
- _flashState.deactivated = null;
- }
- ZeroClipboard.clearData();
- };
- ZeroClipboard.activate = function(element) {
- if (_currentElement) {
- _removeClass(_currentElement, _globalConfig.hoverClass);
- _removeClass(_currentElement, _globalConfig.activeClass);
- }
- _currentElement = element;
- _addClass(element, _globalConfig.hoverClass);
- _reposition();
- var newTitle = _globalConfig.title || element.getAttribute("title");
- if (newTitle) {
- var htmlBridge = _getHtmlBridge(_flashState.bridge);
- if (htmlBridge) {
- htmlBridge.setAttribute("title", newTitle);
- }
- }
- var useHandCursor = _globalConfig.forceHandCursor === true || _getStyle(element, "cursor") === "pointer";
- _setHandCursor(useHandCursor);
- };
- ZeroClipboard.deactivate = function() {
- var htmlBridge = _getHtmlBridge(_flashState.bridge);
- if (htmlBridge) {
- htmlBridge.removeAttribute("title");
- htmlBridge.style.left = "0px";
- htmlBridge.style.top = "-9999px";
- _setSize(1, 1);
- }
- if (_currentElement) {
- _removeClass(_currentElement, _globalConfig.hoverClass);
- _removeClass(_currentElement, _globalConfig.activeClass);
- _currentElement = null;
- }
- };
- ZeroClipboard.state = function() {
- return {
- browser: _pick(window.navigator, [ "userAgent", "platform", "appName" ]),
- flash: _omit(_flashState, [ "bridge" ]),
- zeroclipboard: {
- version: ZeroClipboard.version,
- config: ZeroClipboard.config()
- }
- };
- };
- ZeroClipboard.setData = function(format, data) {
- var dataObj;
- if (typeof format === "object" && format && typeof data === "undefined") {
- dataObj = format;
- ZeroClipboard.clearData();
- } else if (typeof format === "string" && format) {
- dataObj = {};
- dataObj[format] = data;
- } else {
- return;
- }
- for (var dataFormat in dataObj) {
- if (dataFormat && dataObj.hasOwnProperty(dataFormat) && typeof dataObj[dataFormat] === "string" && dataObj[dataFormat]) {
- _clipData[dataFormat] = dataObj[dataFormat];
- }
- }
- };
- ZeroClipboard.clearData = function(format) {
- if (typeof format === "undefined") {
- _deleteOwnProperties(_clipData);
- _clipDataFormatMap = null;
- } else if (typeof format === "string" && _clipData.hasOwnProperty(format)) {
- delete _clipData[format];
- }
- };
- var _bridge = function() {
- var flashBridge, len;
- var container = document.getElementById("global-zeroclipboard-html-bridge");
- if (!container) {
- var allowScriptAccess = _determineScriptAccess(window.location.host, _globalConfig);
- var allowNetworking = allowScriptAccess === "never" ? "none" : "all";
- var flashvars = _vars(_globalConfig);
- var swfUrl = _globalConfig.swfPath + _cacheBust(_globalConfig.swfPath, _globalConfig);
- container = _createHtmlBridge();
- var divToBeReplaced = document.createElement("div");
- container.appendChild(divToBeReplaced);
- document.body.appendChild(container);
- var tmpDiv = document.createElement("div");
- var oldIE = _flashState.pluginType === "activex";
- tmpDiv.innerHTML = '" + (oldIE ? ' ' : "") + ' ' + ' ' + ' ' + ' ' + ' ' + " ";
- flashBridge = tmpDiv.firstChild;
- tmpDiv = null;
- flashBridge.ZeroClipboard = ZeroClipboard;
- container.replaceChild(flashBridge, divToBeReplaced);
- }
- if (!flashBridge) {
- flashBridge = document["global-zeroclipboard-flash-bridge"];
- if (flashBridge && (len = flashBridge.length)) {
- flashBridge = flashBridge[len - 1];
- }
- if (!flashBridge) {
- flashBridge = container.firstChild;
- }
- }
- _flashState.bridge = flashBridge || null;
- };
- var _createHtmlBridge = function() {
- var container = document.createElement("div");
- container.id = "global-zeroclipboard-html-bridge";
- container.className = "global-zeroclipboard-container";
- container.style.position = "absolute";
- container.style.left = "0px";
- container.style.top = "-9999px";
- container.style.width = "1px";
- container.style.height = "1px";
- container.style.zIndex = "" + _getSafeZIndex(_globalConfig.zIndex);
- return container;
- };
- var _getHtmlBridge = function(flashBridge) {
- var htmlBridge = flashBridge && flashBridge.parentNode;
- while (htmlBridge && htmlBridge.nodeName === "OBJECT" && htmlBridge.parentNode) {
- htmlBridge = htmlBridge.parentNode;
- }
- return htmlBridge || null;
- };
- var _reposition = function() {
- if (_currentElement) {
- var pos = _getDOMObjectPosition(_currentElement, _globalConfig.zIndex);
- var htmlBridge = _getHtmlBridge(_flashState.bridge);
- if (htmlBridge) {
- htmlBridge.style.top = pos.top + "px";
- htmlBridge.style.left = pos.left + "px";
- htmlBridge.style.width = pos.width + "px";
- htmlBridge.style.height = pos.height + "px";
- htmlBridge.style.zIndex = pos.zIndex + 1;
- }
- _setSize(pos.width, pos.height);
- }
- };
- var _setSize = function(width, height) {
- var htmlBridge = _getHtmlBridge(_flashState.bridge);
- if (htmlBridge) {
- htmlBridge.style.width = width + "px";
- htmlBridge.style.height = height + "px";
- }
- };
- ZeroClipboard.emit = function(event) {
- var eventType, eventObj, performCallbackAsync, clients, i, len, eventCopy, returnVal, tmp;
- if (typeof event === "string" && event) {
- eventType = event;
- }
- if (typeof event === "object" && event && typeof event.type === "string" && event.type) {
- eventType = event.type;
- eventObj = event;
- }
- if (!eventType) {
- return;
- }
- event = _createEvent(eventType, eventObj);
- _preprocessEvent(event);
- if (event.type === "ready" && _flashState.overdue === true) {
- return ZeroClipboard.emit({
- type: "error",
- name: "flash-overdue"
- });
- }
- performCallbackAsync = !/^(before)?copy$/.test(event.type);
- if (event.client) {
- _dispatchClientCallbacks.call(event.client, event, performCallbackAsync);
- } else {
- clients = event.target && event.target !== window && _globalConfig.autoActivate === true ? _getAllClientsClippedToElement(event.target) : _getAllClients();
- for (i = 0, len = clients.length; i < len; i++) {
- eventCopy = _extend({}, event, {
- client: clients[i]
- });
- _dispatchClientCallbacks.call(clients[i], eventCopy, performCallbackAsync);
- }
- }
- if (event.type === "copy") {
- tmp = _mapClipDataToFlash(_clipData);
- returnVal = tmp.data;
- _clipDataFormatMap = tmp.formatMap;
- }
- return returnVal;
- };
- var _dispatchClientCallbacks = function(event, async) {
- var handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers[event.type];
- if (handlers && handlers.length) {
- var i, len, func, context, originalContext = this;
- for (i = 0, len = handlers.length; i < len; i++) {
- func = handlers[i];
- context = originalContext;
- if (typeof func === "string" && typeof window[func] === "function") {
- func = window[func];
- }
- if (typeof func === "object" && func && typeof func.handleEvent === "function") {
- context = func;
- func = func.handleEvent;
- }
- if (typeof func === "function") {
- _dispatchCallback(func, context, [ event ], async);
- }
- }
- }
- return this;
- };
- var _eventMessages = {
- ready: "Flash communication is established",
- error: {
- "flash-disabled": "Flash is disabled or not installed",
- "flash-outdated": "Flash is too outdated to support ZeroClipboard",
- "flash-unavailable": "Flash is unable to communicate bidirectionally with JavaScript",
- "flash-deactivated": "Flash is too outdated for your browser and/or is configured as click-to-activate",
- "flash-overdue": "Flash communication was established but NOT within the acceptable time limit"
- }
- };
- var _createEvent = function(eventType, event) {
- if (!(eventType || event && event.type)) {
- return;
- }
- event = event || {};
- eventType = (eventType || event.type).toLowerCase();
- _extend(event, {
- type: eventType,
- target: event.target || _currentElement || null,
- relatedTarget: event.relatedTarget || null,
- currentTarget: _flashState && _flashState.bridge || null
- });
- var msg = _eventMessages[event.type];
- if (event.type === "error" && event.name && msg) {
- msg = msg[event.name];
- }
- if (msg) {
- event.message = msg;
- }
- if (event.type === "ready") {
- _extend(event, {
- target: null,
- version: _flashState.version
- });
- }
- if (event.type === "error") {
- event.target = null;
- if (/^flash-(outdated|unavailable|deactivated|overdue)$/.test(event.name)) {
- _extend(event, {
- version: _flashState.version,
- minimumVersion: "11.0.0"
- });
- }
- }
- if (event.type === "copy") {
- event.clipboardData = {
- setData: ZeroClipboard.setData,
- clearData: ZeroClipboard.clearData
- };
- }
- if (event.type === "aftercopy") {
- event = _mapClipResultsFromFlash(event, _clipDataFormatMap);
- }
- if (event.target && !event.relatedTarget) {
- event.relatedTarget = _getRelatedTarget(event.target);
- }
- return event;
- };
- var _getRelatedTarget = function(targetEl) {
- var relatedTargetId = targetEl && targetEl.getAttribute && targetEl.getAttribute("data-clipboard-target");
- return relatedTargetId ? document.getElementById(relatedTargetId) : null;
- };
- var _preprocessEvent = function(event) {
- var element = event.target || _currentElement;
- switch (event.type) {
- case "error":
- if (_inArray(event.name, [ "flash-disabled", "flash-outdated", "flash-deactivated", "flash-overdue" ])) {
- _extend(_flashState, {
- disabled: event.name === "flash-disabled",
- outdated: event.name === "flash-outdated",
- unavailable: event.name === "flash-unavailable",
- deactivated: event.name === "flash-deactivated",
- overdue: event.name === "flash-overdue",
- ready: false
- });
- }
- break;
-
- case "ready":
- var wasDeactivated = _flashState.deactivated === true;
- _extend(_flashState, {
- disabled: false,
- outdated: false,
- unavailable: false,
- deactivated: false,
- overdue: wasDeactivated,
- ready: !wasDeactivated
- });
- break;
-
- case "copy":
- var textContent, htmlContent, targetEl = event.relatedTarget;
- if (!(_clipData["text/html"] || _clipData["text/plain"]) && targetEl && (htmlContent = targetEl.value || targetEl.outerHTML || targetEl.innerHTML) && (textContent = targetEl.value || targetEl.textContent || targetEl.innerText)) {
- event.clipboardData.clearData();
- event.clipboardData.setData("text/plain", textContent);
- if (htmlContent !== textContent) {
- event.clipboardData.setData("text/html", htmlContent);
- }
- } else if (!_clipData["text/plain"] && event.target && (textContent = event.target.getAttribute("data-clipboard-text"))) {
- event.clipboardData.clearData();
- event.clipboardData.setData("text/plain", textContent);
- }
- break;
-
- case "aftercopy":
- ZeroClipboard.clearData();
- if (element && element !== _safeActiveElement() && element.focus) {
- element.focus();
- }
- break;
-
- case "mouseover":
- _addClass(element, _globalConfig.hoverClass);
- break;
-
- case "mouseout":
- if (_globalConfig.autoActivate === true) {
- ZeroClipboard.deactivate();
- }
- break;
-
- case "mousedown":
- _addClass(element, _globalConfig.activeClass);
- break;
-
- case "mouseup":
- _removeClass(element, _globalConfig.activeClass);
- break;
- }
- };
- ZeroClipboard.prototype.on = function(eventName, func) {
- var i, len, events, added = {}, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;
- if (typeof eventName === "string" && eventName) {
- events = eventName.toLowerCase().split(/\s+/);
- } else if (typeof eventName === "object" && eventName && typeof func === "undefined") {
- for (i in eventName) {
- if (eventName.hasOwnProperty(i) && typeof i === "string" && i && typeof eventName[i] === "function") {
- this.on(i, eventName[i]);
- }
- }
- }
- if (events && events.length) {
- for (i = 0, len = events.length; i < len; i++) {
- eventName = events[i].replace(/^on/, "");
- added[eventName] = true;
- if (!handlers[eventName]) {
- handlers[eventName] = [];
- }
- handlers[eventName].push(func);
- }
- if (added.ready && _flashState.ready) {
- ZeroClipboard.emit({
- type: "ready",
- client: this
- });
- }
- if (added.error) {
- var errorTypes = [ "disabled", "outdated", "unavailable", "deactivated", "overdue" ];
- for (i = 0, len = errorTypes.length; i < len; i++) {
- if (_flashState[errorTypes[i]]) {
- ZeroClipboard.emit({
- type: "error",
- name: "flash-" + errorTypes[i],
- client: this
- });
- break;
- }
- }
- }
- }
- return this;
- };
- ZeroClipboard.prototype.off = function(eventName, func) {
- var i, len, foundIndex, events, perEventHandlers, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;
- if (arguments.length === 0) {
- events = _objectKeys(handlers);
- } else if (typeof eventName === "string" && eventName) {
- events = eventName.split(/\s+/);
- } else if (typeof eventName === "object" && eventName && typeof func === "undefined") {
- for (i in eventName) {
- if (eventName.hasOwnProperty(i) && typeof i === "string" && i && typeof eventName[i] === "function") {
- this.off(i, eventName[i]);
- }
- }
- }
- if (events && events.length) {
- for (i = 0, len = events.length; i < len; i++) {
- eventName = events[i].toLowerCase().replace(/^on/, "");
- perEventHandlers = handlers[eventName];
- if (perEventHandlers && perEventHandlers.length) {
- if (func) {
- foundIndex = _inArray(func, perEventHandlers);
- while (foundIndex !== -1) {
- perEventHandlers.splice(foundIndex, 1);
- foundIndex = _inArray(func, perEventHandlers, foundIndex);
- }
- } else {
- handlers[eventName].length = 0;
- }
- }
- }
- }
- return this;
- };
- ZeroClipboard.prototype.handlers = function(eventName) {
- var prop, copy = null, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;
- if (handlers) {
- if (typeof eventName === "string" && eventName) {
- return handlers[eventName] ? handlers[eventName].slice(0) : null;
- }
- copy = {};
- for (prop in handlers) {
- if (handlers.hasOwnProperty(prop) && handlers[prop]) {
- copy[prop] = handlers[prop].slice(0);
- }
- }
- }
- return copy;
- };
- ZeroClipboard.prototype.clip = function(elements) {
- elements = _prepClip(elements);
- for (var i = 0; i < elements.length; i++) {
- if (elements.hasOwnProperty(i) && elements[i] && elements[i].nodeType === 1) {
- if (!elements[i].zcClippingId) {
- elements[i].zcClippingId = "zcClippingId_" + _elementIdCounter++;
- _elementMeta[elements[i].zcClippingId] = [ this.id ];
- if (_globalConfig.autoActivate === true) {
- _addEventHandler(elements[i], "mouseover", _elementMouseOver);
- }
- } else if (_inArray(this.id, _elementMeta[elements[i].zcClippingId]) === -1) {
- _elementMeta[elements[i].zcClippingId].push(this.id);
- }
- var clippedElements = _clientMeta[this.id].elements;
- if (_inArray(elements[i], clippedElements) === -1) {
- clippedElements.push(elements[i]);
- }
- }
- }
- return this;
- };
- ZeroClipboard.prototype.unclip = function(elements) {
- var meta = _clientMeta[this.id];
- if (!meta) {
- return this;
- }
- var clippedElements = meta.elements;
- var arrayIndex;
- if (typeof elements === "undefined") {
- elements = clippedElements.slice(0);
- } else {
- elements = _prepClip(elements);
- }
- for (var i = elements.length; i--; ) {
- if (elements.hasOwnProperty(i) && elements[i] && elements[i].nodeType === 1) {
- arrayIndex = 0;
- while ((arrayIndex = _inArray(elements[i], clippedElements, arrayIndex)) !== -1) {
- clippedElements.splice(arrayIndex, 1);
- }
- var clientIds = _elementMeta[elements[i].zcClippingId];
- if (clientIds) {
- arrayIndex = 0;
- while ((arrayIndex = _inArray(this.id, clientIds, arrayIndex)) !== -1) {
- clientIds.splice(arrayIndex, 1);
- }
- if (clientIds.length === 0) {
- if (_globalConfig.autoActivate === true) {
- _removeEventHandler(elements[i], "mouseover", _elementMouseOver);
- }
- delete elements[i].zcClippingId;
- }
- }
- }
- }
- return this;
- };
- ZeroClipboard.prototype.elements = function() {
- var meta = _clientMeta[this.id];
- return meta && meta.elements ? meta.elements.slice(0) : [];
- };
- var _getAllClientsClippedToElement = function(element) {
- var elementMetaId, clientIds, i, len, client, clients = [];
- if (element && element.nodeType === 1 && (elementMetaId = element.zcClippingId) && _elementMeta.hasOwnProperty(elementMetaId)) {
- clientIds = _elementMeta[elementMetaId];
- if (clientIds && clientIds.length) {
- for (i = 0, len = clientIds.length; i < len; i++) {
- client = _clientMeta[clientIds[i]].instance;
- if (client && client instanceof ZeroClipboard) {
- clients.push(client);
- }
- }
- }
- }
- return clients;
- };
- _globalConfig.hoverClass = "zeroclipboard-is-hover";
- _globalConfig.activeClass = "zeroclipboard-is-active";
- if (typeof define === "function" && define.amd) {
- define(function() {
- return ZeroClipboard;
- });
- } else if (typeof module === "object" && module && typeof module.exports === "object" && module.exports) {
- module.exports = ZeroClipboard;
- } else {
- window.ZeroClipboard = ZeroClipboard;
- }
-})(function() {
- return this;
-}());
\ No newline at end of file
diff --git a/www/js/ueditor/third-party/zeroclipboard/ZeroClipboard.min.js b/www/js/ueditor/third-party/zeroclipboard/ZeroClipboard.min.js
deleted file mode 100644
index c500f2380f..0000000000
--- a/www/js/ueditor/third-party/zeroclipboard/ZeroClipboard.min.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/*!
-* ZeroClipboard
-* The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript interface.
-* Copyright (c) 2014 Jon Rohan, James M. Greene
-* Licensed MIT
-* http://zeroclipboard.org/
-* v2.0.0-beta.5
-*/
-!function(a){"use strict";var b,c={bridge:null,version:"0.0.0",pluginType:"unknown",disabled:null,outdated:null,unavailable:null,deactivated:null,overdue:null,ready:null},d={},e=null,f=0,g={},h=0,i={},j=function(){var a,b,c,d,e="ZeroClipboard.swf";if(!document.currentScript||!(d=document.currentScript.src)){var f=document.getElementsByTagName("script");if("readyState"in f[0])for(a=f.length;a--&&("interactive"!==f[a].readyState||!(d=f[a].src)););else if("loading"===document.readyState)d=f[f.length-1].src;else{for(a=f.length;a--;){if(c=f[a].src,!c){b=null;break}if(c=c.split("#")[0].split("?")[0],c=c.slice(0,c.lastIndexOf("/")+1),null==b)b=c;else if(b!==c){b=null;break}}null!==b&&(d=b)}}return d&&(d=d.split("#")[0].split("?")[0],e=d.slice(0,d.lastIndexOf("/")+1)+e),e}(),k=function(){var a=/\-([a-z])/g,b=function(a,b){return b.toUpperCase()};return function(c){return c.replace(a,b)}}(),l=function(b,c){var d,e,f;return a.getComputedStyle?d=a.getComputedStyle(b,null).getPropertyValue(c):(e=k(c),d=b.currentStyle?b.currentStyle[e]:b.style[e]),"cursor"!==c||d&&"auto"!==d||(f=b.tagName.toLowerCase(),"a"!==f)?d:"pointer"},m=function(b){b||(b=a.event);var c;this!==a?c=this:b.target?c=b.target:b.srcElement&&(c=b.srcElement),L.activate(c)},n=function(a,b,c){a&&1===a.nodeType&&(a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent&&a.attachEvent("on"+b,c))},o=function(a,b,c){a&&1===a.nodeType&&(a.removeEventListener?a.removeEventListener(b,c,!1):a.detachEvent&&a.detachEvent("on"+b,c))},p=function(a,b){if(!a||1!==a.nodeType)return a;if(a.classList)return a.classList.contains(b)||a.classList.add(b),a;if(b&&"string"==typeof b){var c=(b||"").split(/\s+/);if(1===a.nodeType)if(a.className){for(var d=" "+a.className+" ",e=a.className,f=0,g=c.length;g>f;f++)d.indexOf(" "+c[f]+" ")<0&&(e+=" "+c[f]);a.className=e.replace(/^\s+|\s+$/g,"")}else a.className=b}return a},q=function(a,b){if(!a||1!==a.nodeType)return a;if(a.classList)return a.classList.contains(b)&&a.classList.remove(b),a;if(b&&"string"==typeof b||void 0===b){var c=(b||"").split(/\s+/);if(1===a.nodeType&&a.className)if(b){for(var d=(" "+a.className+" ").replace(/[\n\t]/g," "),e=0,f=c.length;f>e;e++)d=d.replace(" "+c[e]+" "," ");a.className=d.replace(/^\s+|\s+$/g,"")}else a.className=""}return a},r=function(){var a,b,c,d=1;return"function"==typeof document.body.getBoundingClientRect&&(a=document.body.getBoundingClientRect(),b=a.right-a.left,c=document.body.offsetWidth,d=Math.round(b/c*100)/100),d},s=function(b,c){var d={left:0,top:0,width:0,height:0,zIndex:y(c)-1};if(b.getBoundingClientRect){var e,f,g,h=b.getBoundingClientRect();"pageXOffset"in a&&"pageYOffset"in a?(e=a.pageXOffset,f=a.pageYOffset):(g=r(),e=Math.round(document.documentElement.scrollLeft/g),f=Math.round(document.documentElement.scrollTop/g));var i=document.documentElement.clientLeft||0,j=document.documentElement.clientTop||0;d.left=h.left+e-i,d.top=h.top+f-j,d.width="width"in h?h.width:h.right-h.left,d.height="height"in h?h.height:h.bottom-h.top}return d},t=function(a,b){var c=null==b||b&&b.cacheBust===!0;return c?(-1===a.indexOf("?")?"?":"&")+"noCache="+(new Date).getTime():""},u=function(b){var c,d,e,f,g="",h=[];if(b.trustedDomains&&("string"==typeof b.trustedDomains?f=[b.trustedDomains]:"object"==typeof b.trustedDomains&&"length"in b.trustedDomains&&(f=b.trustedDomains)),f&&f.length)for(c=0,d=f.length;d>c;c++)if(f.hasOwnProperty(c)&&f[c]&&"string"==typeof f[c]){if(e=A(f[c]),!e)continue;if("*"===e){h=[e];break}h.push.apply(h,[e,"//"+e,a.location.protocol+"//"+e])}return h.length&&(g+="trustedOrigins="+encodeURIComponent(h.join(","))),b.forceEnhancedClipboard===!0&&(g+=(g?"&":"")+"forceEnhancedClipboard=true"),g},v=function(a,b,c){if("function"==typeof b.indexOf)return b.indexOf(a,c);var d,e=b.length;for("undefined"==typeof c?c=0:0>c&&(c=e+c),d=c;e>d;d++)if(b.hasOwnProperty(d)&&b[d]===a)return d;return-1},w=function(a){if("string"==typeof a)throw new TypeError("ZeroClipboard doesn't accept query strings.");return"number"!=typeof a.length?[a]:a},x=function(b,c,d,e){e?a.setTimeout(function(){b.apply(c,d)},0):b.apply(c,d)},y=function(a){var b,c;return a&&("number"==typeof a&&a>0?b=a:"string"==typeof a&&(c=parseInt(a,10))&&!isNaN(c)&&c>0&&(b=c)),b||("number"==typeof O.zIndex&&O.zIndex>0?b=O.zIndex:"string"==typeof O.zIndex&&(c=parseInt(O.zIndex,10))&&!isNaN(c)&&c>0&&(b=c)),b||0},z=function(){var a,b,c,d,e,f,g=arguments[0]||{};for(a=1,b=arguments.length;b>a;a++)if(null!=(c=arguments[a]))for(d in c)if(c.hasOwnProperty(d)){if(e=g[d],f=c[d],g===f)continue;void 0!==f&&(g[d]=f)}return g},A=function(a){if(null==a||""===a)return null;if(a=a.replace(/^\s+|\s+$/g,""),""===a)return null;var b=a.indexOf("//");a=-1===b?a:a.slice(b+2);var c=a.indexOf("/");return a=-1===c?a:-1===b||0===c?null:a.slice(0,c),a&&".swf"===a.slice(-4).toLowerCase()?null:a||null},B=function(){var a=function(a,b){var c,d,e;if(null!=a&&"*"!==b[0]&&("string"==typeof a&&(a=[a]),"object"==typeof a&&"number"==typeof a.length))for(c=0,d=a.length;d>c;c++)if(a.hasOwnProperty(c)&&(e=A(a[c]))){if("*"===e){b.length=0,b.push("*");break}-1===v(e,b)&&b.push(e)}};return function(b,c){var d=A(c.swfPath);null===d&&(d=b);var e=[];a(c.trustedOrigins,e),a(c.trustedDomains,e);var f=e.length;if(f>0){if(1===f&&"*"===e[0])return"always";if(-1!==v(b,e))return 1===f&&b===d?"sameDomain":"always"}return"never"}}(),C=function(a){if(null==a)return[];if(Object.keys)return Object.keys(a);var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b},D=function(a){if(a)for(var b in a)a.hasOwnProperty(b)&&delete a[b];return a},E=function(){try{return document.activeElement}catch(a){}return null},F=function(a,b){for(var c={},d=0,e=b.length;e>d;d++)b[d]in a&&(c[b[d]]=a[b[d]]);return c},G=function(a,b){var c={};for(var d in a)-1===v(d,b)&&(c[d]=a[d]);return c},H=function(a){var b={},c={};if("object"==typeof a&&a){for(var d in a)if(d&&a.hasOwnProperty(d)&&"string"==typeof a[d]&&a[d])switch(d.toLowerCase()){case"text/plain":case"text":case"air:text":case"flash:text":b.text=a[d],c.text=d;break;case"text/html":case"html":case"air:html":case"flash:html":b.html=a[d],c.html=d;break;case"application/rtf":case"text/rtf":case"rtf":case"richtext":case"air:rtf":case"flash:rtf":b.rtf=a[d],c.rtf=d}return{data:b,formatMap:c}}},I=function(a,b){if("object"!=typeof a||!a||"object"!=typeof b||!b)return a;var c={};for(var d in a)if(a.hasOwnProperty(d)){if("success"!==d&&"data"!==d){c[d]=a[d];continue}c[d]={};var e=a[d];for(var f in e)f&&e.hasOwnProperty(f)&&b.hasOwnProperty(f)&&(c[d][b[f]]=e[f])}return c},J=function(a){return function(b){return a.call(b,0)}}(a.Array.prototype.slice),K=function(){function a(a){var b=a.match(/[\d]+/g);return b.length=3,b.join(".")}function b(a){return!!a&&(a=a.toLowerCase())&&(/^(pepflashplayer\.dll|libpepflashplayer\.so|pepperflashplayer\.plugin)$/.test(a)||"chrome.plugin"===a.slice(-13))}function d(c){c&&(h=!0,c.version&&(k=a(c.version)),!k&&c.description&&(k=a(c.description)),c.filename&&(j=b(c.filename)))}var e,f,g,h=!1,i=!1,j=!1,k="";if(navigator.plugins&&navigator.plugins.length)e=navigator.plugins["Shockwave Flash"],d(e),navigator.plugins["Shockwave Flash 2.0"]&&(h=!0,k="2.0.0.11");else if(navigator.mimeTypes&&navigator.mimeTypes.length)g=navigator.mimeTypes["application/x-shockwave-flash"],e=g&&g.enabledPlugin,d(e);else if("undefined"!=typeof ActiveXObject){i=!0;try{f=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"),h=!0,k=a(f.GetVariable("$version"))}catch(l){try{f=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"),h=!0,k="6.0.21"}catch(m){try{f=new ActiveXObject("ShockwaveFlash.ShockwaveFlash"),h=!0,k=a(f.GetVariable("$version"))}catch(n){i=!1}}}}c.disabled=h!==!0,c.outdated=k&&parseFloat(k)<11,c.version=k||"0.0.0",c.pluginType=j?"pepper":i?"activex":h?"netscape":"unknown"};K();var L=function(a){if(!(this instanceof L))return new L(a);if(this.id=""+f++,g[this.id]={instance:this,elements:[],handlers:{}},a&&this.clip(a),"boolean"!=typeof c.ready&&(c.ready=!1),!L.isFlashUnusable()&&null===c.bridge){var b=this,d=O.flashLoadTimeout;"number"==typeof d&&d>=0&&setTimeout(function(){"boolean"!=typeof c.deactivated&&(c.deactivated=!0),c.deactivated===!0&&L.emit({type:"error",name:"flash-deactivated",client:b})},d),c.overdue=!1,P()}};L.prototype.setText=function(a){return L.setData("text/plain",a),this},L.prototype.setHtml=function(a){return L.setData("text/html",a),this},L.prototype.setRichText=function(a){return L.setData("application/rtf",a),this},L.prototype.setData=function(){return L.setData.apply(L,J(arguments)),this},L.prototype.clearData=function(){return L.clearData.apply(L,J(arguments)),this},L.prototype.setSize=function(a,b){return T(a,b),this};var M=function(a){c.ready===!0&&c.bridge&&"function"==typeof c.bridge.setHandCursor?c.bridge.setHandCursor(a):c.ready=!1};L.prototype.destroy=function(){this.unclip(),this.off(),delete g[this.id]};var N=function(){var a,b,c,d=[],e=C(g);for(a=0,b=e.length;b>a;a++)c=g[e[a]].instance,c&&c instanceof L&&d.push(c);return d};L.version="2.0.0-beta.5";var O={swfPath:j,trustedDomains:a.location.host?[a.location.host]:[],cacheBust:!0,forceHandCursor:!1,forceEnhancedClipboard:!1,zIndex:999999999,debug:!1,title:null,autoActivate:!0,flashLoadTimeout:3e4};L.isFlashUnusable=function(){return!!(c.disabled||c.outdated||c.unavailable||c.deactivated)},L.config=function(a){"object"==typeof a&&null!==a&&z(O,a);{if("string"!=typeof a||!a){var b={};for(var c in O)O.hasOwnProperty(c)&&(b[c]="object"==typeof O[c]&&null!==O[c]?"length"in O[c]?O[c].slice(0):z({},O[c]):O[c]);return b}if(O.hasOwnProperty(a))return O[a]}},L.destroy=function(){L.deactivate();for(var a in g)if(g.hasOwnProperty(a)&&g[a]){var b=g[a].instance;b&&"function"==typeof b.destroy&&b.destroy()}var d=c.bridge;if(d){var e=R(d);e&&("activex"===c.pluginType&&"readyState"in d?(d.style.display="none",function f(){if(4===d.readyState){for(var a in d)"function"==typeof d[a]&&(d[a]=null);d.parentNode.removeChild(d),e.parentNode&&e.parentNode.removeChild(e)}else setTimeout(f,10)}()):(d.parentNode.removeChild(d),e.parentNode&&e.parentNode.removeChild(e))),c.ready=null,c.bridge=null,c.deactivated=null}L.clearData()},L.activate=function(a){b&&(q(b,O.hoverClass),q(b,O.activeClass)),b=a,p(a,O.hoverClass),S();var d=O.title||a.getAttribute("title");if(d){var e=R(c.bridge);e&&e.setAttribute("title",d)}var f=O.forceHandCursor===!0||"pointer"===l(a,"cursor");M(f)},L.deactivate=function(){var a=R(c.bridge);a&&(a.removeAttribute("title"),a.style.left="0px",a.style.top="-9999px",T(1,1)),b&&(q(b,O.hoverClass),q(b,O.activeClass),b=null)},L.state=function(){return{browser:F(a.navigator,["userAgent","platform","appName"]),flash:G(c,["bridge"]),zeroclipboard:{version:L.version,config:L.config()}}},L.setData=function(a,b){var c;if("object"==typeof a&&a&&"undefined"==typeof b)c=a,L.clearData();else{if("string"!=typeof a||!a)return;c={},c[a]=b}for(var e in c)e&&c.hasOwnProperty(e)&&"string"==typeof c[e]&&c[e]&&(d[e]=c[e])},L.clearData=function(a){"undefined"==typeof a?(D(d),e=null):"string"==typeof a&&d.hasOwnProperty(a)&&delete d[a]};var P=function(){var b,d,e=document.getElementById("global-zeroclipboard-html-bridge");if(!e){var f=B(a.location.host,O),g="never"===f?"none":"all",h=u(O),i=O.swfPath+t(O.swfPath,O);e=Q();var j=document.createElement("div");e.appendChild(j),document.body.appendChild(e);var k=document.createElement("div"),l="activex"===c.pluginType;k.innerHTML='"+(l?' ':"")+' ',b=k.firstChild,k=null,b.ZeroClipboard=L,e.replaceChild(b,j)}b||(b=document["global-zeroclipboard-flash-bridge"],b&&(d=b.length)&&(b=b[d-1]),b||(b=e.firstChild)),c.bridge=b||null},Q=function(){var a=document.createElement("div");return a.id="global-zeroclipboard-html-bridge",a.className="global-zeroclipboard-container",a.style.position="absolute",a.style.left="0px",a.style.top="-9999px",a.style.width="1px",a.style.height="1px",a.style.zIndex=""+y(O.zIndex),a},R=function(a){for(var b=a&&a.parentNode;b&&"OBJECT"===b.nodeName&&b.parentNode;)b=b.parentNode;return b||null},S=function(){if(b){var a=s(b,O.zIndex),d=R(c.bridge);d&&(d.style.top=a.top+"px",d.style.left=a.left+"px",d.style.width=a.width+"px",d.style.height=a.height+"px",d.style.zIndex=a.zIndex+1),T(a.width,a.height)}},T=function(a,b){var d=R(c.bridge);d&&(d.style.width=a+"px",d.style.height=b+"px")};L.emit=function(b){var f,g,h,i,j,k,l,m,n;if("string"==typeof b&&b&&(f=b),"object"==typeof b&&b&&"string"==typeof b.type&&b.type&&(f=b.type,g=b),f){if(b=W(f,g),Y(b),"ready"===b.type&&c.overdue===!0)return L.emit({type:"error",name:"flash-overdue"});if(h=!/^(before)?copy$/.test(b.type),b.client)U.call(b.client,b,h);else for(i=b.target&&b.target!==a&&O.autoActivate===!0?Z(b.target):N(),j=0,k=i.length;k>j;j++)l=z({},b,{client:i[j]}),U.call(i[j],l,h);return"copy"===b.type&&(n=H(d),m=n.data,e=n.formatMap),m}};var U=function(b,c){var d=g[this.id]&&g[this.id].handlers[b.type];if(d&&d.length){var e,f,h,i,j=this;for(e=0,f=d.length;f>e;e++)h=d[e],i=j,"string"==typeof h&&"function"==typeof a[h]&&(h=a[h]),"object"==typeof h&&h&&"function"==typeof h.handleEvent&&(i=h,h=h.handleEvent),"function"==typeof h&&x(h,i,[b],c)}return this},V={ready:"Flash communication is established",error:{"flash-disabled":"Flash is disabled or not installed","flash-outdated":"Flash is too outdated to support ZeroClipboard","flash-unavailable":"Flash is unable to communicate bidirectionally with JavaScript","flash-deactivated":"Flash is too outdated for your browser and/or is configured as click-to-activate","flash-overdue":"Flash communication was established but NOT within the acceptable time limit"}},W=function(a,d){if(a||d&&d.type){d=d||{},a=(a||d.type).toLowerCase(),z(d,{type:a,target:d.target||b||null,relatedTarget:d.relatedTarget||null,currentTarget:c&&c.bridge||null});var f=V[d.type];return"error"===d.type&&d.name&&f&&(f=f[d.name]),f&&(d.message=f),"ready"===d.type&&z(d,{target:null,version:c.version}),"error"===d.type&&(d.target=null,/^flash-(outdated|unavailable|deactivated|overdue)$/.test(d.name)&&z(d,{version:c.version,minimumVersion:"11.0.0"})),"copy"===d.type&&(d.clipboardData={setData:L.setData,clearData:L.clearData}),"aftercopy"===d.type&&(d=I(d,e)),d.target&&!d.relatedTarget&&(d.relatedTarget=X(d.target)),d}},X=function(a){var b=a&&a.getAttribute&&a.getAttribute("data-clipboard-target");return b?document.getElementById(b):null},Y=function(a){var e=a.target||b;switch(a.type){case"error":v(a.name,["flash-disabled","flash-outdated","flash-deactivated","flash-overdue"])&&z(c,{disabled:"flash-disabled"===a.name,outdated:"flash-outdated"===a.name,unavailable:"flash-unavailable"===a.name,deactivated:"flash-deactivated"===a.name,overdue:"flash-overdue"===a.name,ready:!1});break;case"ready":var f=c.deactivated===!0;z(c,{disabled:!1,outdated:!1,unavailable:!1,deactivated:!1,overdue:f,ready:!f});break;case"copy":var g,h,i=a.relatedTarget;!d["text/html"]&&!d["text/plain"]&&i&&(h=i.value||i.outerHTML||i.innerHTML)&&(g=i.value||i.textContent||i.innerText)?(a.clipboardData.clearData(),a.clipboardData.setData("text/plain",g),h!==g&&a.clipboardData.setData("text/html",h)):!d["text/plain"]&&a.target&&(g=a.target.getAttribute("data-clipboard-text"))&&(a.clipboardData.clearData(),a.clipboardData.setData("text/plain",g));break;case"aftercopy":L.clearData(),e&&e!==E()&&e.focus&&e.focus();break;case"mouseover":p(e,O.hoverClass);break;case"mouseout":O.autoActivate===!0&&L.deactivate();break;case"mousedown":p(e,O.activeClass);break;case"mouseup":q(e,O.activeClass)}};L.prototype.on=function(a,b){var d,e,f,h={},i=g[this.id]&&g[this.id].handlers;if("string"==typeof a&&a)f=a.toLowerCase().split(/\s+/);else if("object"==typeof a&&a&&"undefined"==typeof b)for(d in a)a.hasOwnProperty(d)&&"string"==typeof d&&d&&"function"==typeof a[d]&&this.on(d,a[d]);if(f&&f.length){for(d=0,e=f.length;e>d;d++)a=f[d].replace(/^on/,""),h[a]=!0,i[a]||(i[a]=[]),i[a].push(b);if(h.ready&&c.ready&&L.emit({type:"ready",client:this}),h.error){var j=["disabled","outdated","unavailable","deactivated","overdue"];for(d=0,e=j.length;e>d;d++)if(c[j[d]]){L.emit({type:"error",name:"flash-"+j[d],client:this});break}}}return this},L.prototype.off=function(a,b){var c,d,e,f,h,i=g[this.id]&&g[this.id].handlers;if(0===arguments.length)f=C(i);else if("string"==typeof a&&a)f=a.split(/\s+/);else if("object"==typeof a&&a&&"undefined"==typeof b)for(c in a)a.hasOwnProperty(c)&&"string"==typeof c&&c&&"function"==typeof a[c]&&this.off(c,a[c]);if(f&&f.length)for(c=0,d=f.length;d>c;c++)if(a=f[c].toLowerCase().replace(/^on/,""),h=i[a],h&&h.length)if(b)for(e=v(b,h);-1!==e;)h.splice(e,1),e=v(b,h,e);else i[a].length=0;return this},L.prototype.handlers=function(a){var b,c=null,d=g[this.id]&&g[this.id].handlers;if(d){if("string"==typeof a&&a)return d[a]?d[a].slice(0):null;c={};for(b in d)d.hasOwnProperty(b)&&d[b]&&(c[b]=d[b].slice(0))}return c},L.prototype.clip=function(a){a=w(a);for(var b=0;bd;d++)f=g[c[d]].instance,f&&f instanceof L&&h.push(f);return h};O.hoverClass="zeroclipboard-is-hover",O.activeClass="zeroclipboard-is-active","function"==typeof define&&define.amd?define(function(){return L}):"object"==typeof module&&module&&"object"==typeof module.exports&&module.exports?module.exports=L:a.ZeroClipboard=L}(function(){return this}());
\ No newline at end of file
diff --git a/www/js/ueditor/third-party/zeroclipboard/ZeroClipboard.swf b/www/js/ueditor/third-party/zeroclipboard/ZeroClipboard.swf
deleted file mode 100644
index ed1c9d21c3..0000000000
Binary files a/www/js/ueditor/third-party/zeroclipboard/ZeroClipboard.swf and /dev/null differ
diff --git a/www/js/ueditor/ueditor.all.min.js b/www/js/ueditor/ueditor.all.min.js
deleted file mode 100644
index 9967e1d40d..0000000000
--- a/www/js/ueditor/ueditor.all.min.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*!
- * UEditor
- * version: ueditor
- * build: Sun Sep 25 2016 11:06:46 GMT+0800 (CST)
- *
- * Remove UE.plugin.register("autosave"
- * Change body font-size 16px to 13px;
- */
-
-!function(){function getListener(a,b,c){var d;return b=b.toLowerCase(),(d=a.__allListeners||c&&(a.__allListeners={}))&&(d[b]||c&&(d[b]=[]))}function getDomNode(a,b,c,d,e,f){var g,h=d&&a[b];for(!h&&(h=a[c]);!h&&(g=(g||a).parentNode);){if("BODY"==g.tagName||f&&!f(g))return null;h=g[c]}return h&&e&&!e(h)?getDomNode(h,b,c,!1,e):h}UEDITOR_CONFIG=window.UEDITOR_CONFIG||{};var baidu=window.baidu||{};window.baidu=baidu,window.UE=baidu.editor=window.UE||{},UE.plugins={},UE.commands={},UE.instants={},UE.I18N={},UE._customizeUI={},UE.version="1.4.3";var dom=UE.dom={},browser=UE.browser=function(){var a=navigator.userAgent.toLowerCase(),b=window.opera,c={ie:/(msie\s|trident.*rv:)([\w.]+)/.test(a),opera:!!b&&b.version,webkit:a.indexOf(" applewebkit/")>-1,mac:a.indexOf("macintosh")>-1,quirks:"BackCompat"==document.compatMode};c.gecko="Gecko"==navigator.product&&!c.webkit&&!c.opera&&!c.ie;var d=0;if(c.ie){var e=a.match(/(?:msie\s([\w.]+))/),f=a.match(/(?:trident.*rv:([\w.]+))/);d=e&&f&&e[1]&&f[1]?Math.max(1*e[1],1*f[1]):e&&e[1]?1*e[1]:f&&f[1]?1*f[1]:0,c.ie11Compat=11==document.documentMode,c.ie9Compat=9==document.documentMode,c.ie8=!!document.documentMode,c.ie8Compat=8==document.documentMode,c.ie7Compat=7==d&&!document.documentMode||7==document.documentMode,c.ie6Compat=d<7||c.quirks,c.ie9above=d>8,c.ie9below=d<9,c.ie11above=d>10,c.ie11below=d<11}if(c.gecko){var g=a.match(/rv:([\d\.]+)/);g&&(g=g[1].split("."),d=1e4*g[0]+100*(g[1]||0)+1*(g[2]||0))}return/chrome\/(\d+\.\d)/i.test(a)&&(c.chrome=+RegExp.$1),/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(a)&&!/chrome/i.test(a)&&(c.safari=+(RegExp.$1||RegExp.$2)),c.opera&&(d=parseFloat(b.version())),c.webkit&&(d=parseFloat(a.match(/ applewebkit\/(\d+)/)[1])),c.version=d,c.isCompatible=!c.mobile&&(c.ie&&d>=6||c.gecko&&d>=10801||c.opera&&d>=9.5||c.air&&d>=1||c.webkit&&d>=522||!1),c}(),ie=browser.ie,webkit=browser.webkit,gecko=browser.gecko,opera=browser.opera,utils=UE.utils={each:function(a,b,c){if(null!=a)if(a.length===+a.length){for(var d=0,e=a.length;d=c&&a===b)return d=e,!1}),d},removeItem:function(a,b){for(var c=0,d=a.length;c'](?:(amp|lt|quot|gt|#39|nbsp|#\d+);)?/g,function(a,b){return b?a:{"<":"<","&":"&",'"':""",">":">","'":"'"}[a]}):""},unhtmlForUrl:function(a,b){return a?a.replace(b||/[<">']/g,function(a){return{"<":"<","&":"&",'"':""",">":">","'":"'"}[a]}):""},html:function(a){return a?a.replace(/&((g|l|quo)t|amp|#39|nbsp);/g,function(a){return{"<":"<","&":"&",""":'"',">":">","'":"'"," ":" "}[a]}):""},cssStyleToDomStyle:function(){var a=document.createElement("div").style,b={"float":void 0!=a.cssFloat?"cssFloat":void 0!=a.styleFloat?"styleFloat":"float"};return function(a){return b[a]||(b[a]=a.toLowerCase().replace(/-./g,function(a){return a.charAt(1).toUpperCase()}))}}(),loadFile:function(){function a(a,c){try{for(var d,e=0;d=b[e++];)if(d.doc===a&&d.url==(c.src||c.href))return d}catch(f){return null}}var b=[];return function(c,d,e){var f=a(c,d);if(f)return void(f.ready?e&&e():f.funs.push(e));if(b.push({doc:c,url:d.src||d.href,funs:[e]}),!c.body){var g=[];for(var h in d)"tag"!=h&&g.push(h+'="'+d[h]+'"');return void c.write("<"+d.tag+" "+g.join(" ")+" >"+d.tag+">")}if(!d.id||!c.getElementById(d.id)){var i=c.createElement(d.tag);delete d.tag;for(var h in d)i.setAttribute(h,d[h]);i.onload=i.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){if(f=a(c,d),f.funs.length>0){f.ready=1;for(var b;b=f.funs.pop();)b()}i.onload=i.onreadystatechange=null}},i.onerror=function(){throw Error("The load "+(d.href||d.src)+" fails,check the url settings of file ueditor.config.js ")},c.getElementsByTagName("head")[0].appendChild(i)}}}(),isEmptyObject:function(a){if(null==a)return!0;if(this.isArray(a)||this.isString(a))return 0===a.length;for(var b in a)if(a.hasOwnProperty(b))return!1;return!0},fixColor:function(a,b){if(/color/i.test(a)&&/rgba?/.test(b)){var c=b.split(",");if(c.length>3)return"";b="#";for(var d,e=0;d=c[e++];)d=parseInt(d.replace(/[^\d]/gi,""),10).toString(16),b+=1==d.length?"0"+d:d;b=b.toUpperCase()}return b},optCss:function(a){function b(a,b){if(!a)return"";var c=a.top,d=a.bottom,e=a.left,f=a.right,g="";if(c&&e&&d&&f)g+=";"+b+":"+(c==d&&d==e&&e==f?c:c==d&&e==f?c+" "+e:e==f?c+" "+e+" "+d:c+" "+f+" "+d+" "+e)+";";else for(var h in a)g+=";"+b+"-"+h+":"+a[h]+";";return g}var c,d;return a=a.replace(/(padding|margin|border)\-([^:]+):([^;]+);?/gi,function(a,b,e,f){if(1==f.split(" ").length)switch(b){case"padding":return!c&&(c={}),c[e]=f,"";case"margin":return!d&&(d={}),d[e]=f,"";case"border":return"initial"==f?"":a}return a}),a+=b(c,"padding")+b(d,"margin"),a.replace(/^[ \n\r\t;]*|[ \n\r\t]*$/,"").replace(/;([ \n\r\t]+)|\1;/g,";").replace(/(&((l|g)t|quot|#39))?;{2,}/g,function(a,b){return b?b+";;":";"})},clone:function(a,b){var c;b=b||{};for(var d in a)a.hasOwnProperty(d)&&(c=a[d],"object"==typeof c?(b[d]=utils.isArray(c)?[]:{},utils.clone(a[d],b[d])):b[d]=c);return b},transUnitToPx:function(a){if(!/(pt|cm)/.test(a))return a;var b;switch(a.replace(/([\d.]+)(\w+)/,function(c,d,e){a=d,b=e}),b){case"cm":a=25*parseFloat(a);break;case"pt":a=Math.round(96*parseFloat(a)/72)}return a+(a?"px":"")},domReady:function(){function a(a){a.isReady=!0;for(var c;c=b.pop();c());}var b=[];return function(c,d){d=d||window;var e=d.document;c&&b.push(c),"complete"===e.readyState?a(e):(e.isReady&&a(e),browser.ie&&11!=browser.version?(!function(){if(!e.isReady){try{e.documentElement.doScroll("left")}catch(b){return void setTimeout(arguments.callee,0)}a(e)}}(),d.attachEvent("onload",function(){a(e)})):(e.addEventListener("DOMContentLoaded",function(){e.removeEventListener("DOMContentLoaded",arguments.callee,!1),a(e)},!1),d.addEventListener("load",function(){a(e)},!1)))}}(),cssRule:browser.ie&&11!=browser.version?function(a,b,c){var d,e;if(void 0===b||b&&b.nodeType&&9==b.nodeType){if(c=b&&b.nodeType&&9==b.nodeType?b:c||document,d=c.indexList||(c.indexList={}),e=d[a],void 0!==e)return c.styleSheets[e].cssText}else{if(c=c||document,d=c.indexList||(c.indexList={}),e=d[a],""===b)return void 0!==e&&(c.styleSheets[e].cssText="",delete d[a],!0);void 0!==e?sheetStyle=c.styleSheets[e]:(sheetStyle=c.createStyleSheet("",e=c.styleSheets.length),d[a]=e),sheetStyle.cssText=b}}:function(a,b,c){var d;return void 0===b||b&&b.nodeType&&9==b.nodeType?(c=b&&b.nodeType&&9==b.nodeType?b:c||document,d=c.getElementById(a),d?d.innerHTML:void 0):(c=c||document,d=c.getElementById(a),""===b?!!d&&(d.parentNode.removeChild(d),!0):void(d?d.innerHTML=b:(d=c.createElement("style"),d.id=a,d.innerHTML=b,c.getElementsByTagName("head")[0].appendChild(d))))},sort:function(a,b){b=b||function(a,b){return a.localeCompare(b)};for(var c=0,d=a.length;c0){var g=a[c];a[c]=a[e],a[e]=g}return a},serializeParam:function(a){var b=[];for(var c in a)if("method"!=c&&"timeout"!=c&&"async"!=c)if("function"!=(typeof a[c]).toLowerCase()&&"object"!=(typeof a[c]).toLowerCase())b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));else if(utils.isArray(a[c]))for(var d=0;d1||b!==a.parentNode){a.style.cssText=b.style.cssText+";"+a.style.cssText,b=b.parentNode;continue}b.style.cssText+=";"+a.style.cssText,"A"==b.tagName&&(b.style.textDecoration="underline")}if("A"!=b.tagName){b===a.parentNode&&domUtils.remove(a,!0);break}}b=b.parentNode}},mergeSibling:function(a,b,c){function d(a,b,c){var d;if((d=c[a])&&!domUtils.isBookmarkNode(d)&&1==d.nodeType&&domUtils.isSameElement(c,d)){for(;d.firstChild;)"firstChild"==b?c.insertBefore(d.lastChild,c.firstChild):c.appendChild(d.firstChild);domUtils.remove(d)}}!b&&d("previousSibling","firstChild",a),!c&&d("nextSibling","lastChild",a)},unSelectable:ie&&browser.ie9below||browser.opera?function(a){a.onselectstart=function(){return!1},a.onclick=a.onkeyup=a.onkeydown=function(){return!1},a.unselectable="on",a.setAttribute("unselectable","on");for(var b,c=0;b=a.all[c++];)switch(b.tagName.toLowerCase()){case"iframe":case"textarea":case"input":case"select":break;default:b.unselectable="on",a.setAttribute("unselectable","on")}}:function(a){a.style.MozUserSelect=a.style.webkitUserSelect=a.style.msUserSelect=a.style.KhtmlUserSelect="none"},removeAttributes:function(a,b){b=utils.isArray(b)?b:utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0;c=b[d++];){switch(c=attrFix[c]||c){case"className":a[c]="";break;case"style":a.style.cssText="";var e=a.getAttributeNode("style");!browser.ie&&e&&a.removeAttributeNode(e)}a.removeAttribute(c)}},createElement:function(a,b,c){return domUtils.setAttributes(a.createElement(b),c)},setAttributes:function(a,b){for(var c in b)if(b.hasOwnProperty(c)){var d=b[c];switch(c){case"class":a.className=d;break;case"style":a.style.cssText=a.style.cssText+";"+d;break;case"innerHTML":a[c]=d;break;case"value":a.value=d;break;default:a.setAttribute(attrFix[c]||c,d)}}return a},getComputedStyle:function(a,b){var c="width height top left";if(c.indexOf(b)>-1)return a["offset"+b.replace(/^\w/,function(a){return a.toUpperCase()})]+"px";if(3==a.nodeType&&(a=a.parentNode),browser.ie&&browser.version<9&&"font-size"==b&&!a.style.fontSize&&!dtd.$empty[a.tagName]&&!dtd.$nonChild[a.tagName]){var d=a.ownerDocument.createElement("span");d.style.cssText="padding:0;border:0;font-family:simsun;",d.innerHTML=".",a.appendChild(d);var e=d.offsetHeight;return a.removeChild(d),d=null,e+"px"}try{var f=domUtils.getStyle(a,b)||(window.getComputedStyle?domUtils.getWindow(a).getComputedStyle(a,"").getPropertyValue(b):(a.currentStyle||a.style)[utils.cssStyleToDomStyle(b)])}catch(g){return""}return utils.transUnitToPx(utils.fixColor(b,f))},removeClasses:function(a,b){b=utils.isArray(b)?b:utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)e=e.replace(new RegExp("\\b"+c+"\\b"),"");e=utils.trim(e).replace(/[ ]{2,}/g," "),e?a.className=e:domUtils.removeAttributes(a,["class"])},addClass:function(a,b){if(a){b=utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)new RegExp("\\b"+c+"\\b").test(e)||(e+=" "+c);a.className=utils.trim(e)}},hasClass:function(a,b){if(utils.isRegExp(b))return b.test(a.className);b=utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)if(!new RegExp("\\b"+c+"\\b","i").test(e))return!1;return d-1==b.length},preventDefault:function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},removeStyle:function(a,b){browser.ie?("color"==b&&(b="(^|;)"+b),a.style.cssText=a.style.cssText.replace(new RegExp(b+"[^:]*:[^;]+;?","ig"),"")):a.style.removeProperty?a.style.removeProperty(b):a.style.removeAttribute(utils.cssStyleToDomStyle(b)),a.style.cssText||domUtils.removeAttributes(a,["style"])},getStyle:function(a,b){var c=a.style[utils.cssStyleToDomStyle(b)];return utils.fixColor(b,c)},setStyle:function(a,b,c){a.style[utils.cssStyleToDomStyle(b)]=c,utils.trim(a.style.cssText)||this.removeAttributes(a,"style")},setStyles:function(a,b){for(var c in b)b.hasOwnProperty(c)&&domUtils.setStyle(a,c,b[c])},removeDirtyAttr:function(a){for(var b,c=0,d=a.getElementsByTagName("*");b=d[c++];)b.removeAttribute("_moz_dirty");a.removeAttribute("_moz_dirty")},getChildCount:function(a,b){var c=0,d=a.firstChild;for(b=b||function(){return 1};d;)b(d)&&c++,d=d.nextSibling;return c},isEmptyNode:function(a){return!a.firstChild||0==domUtils.getChildCount(a,function(a){return!domUtils.isBr(a)&&!domUtils.isBookmarkNode(a)&&!domUtils.isWhitespace(a)})},clearSelectedArr:function(a){for(var b;b=a.pop();)domUtils.removeAttributes(b,["class"])},scrollToView:function(a,b,c){var d=function(){var a=b.document,c="CSS1Compat"==a.compatMode;return{width:(c?a.documentElement.clientWidth:a.body.clientWidth)||0,height:(c?a.documentElement.clientHeight:a.body.clientHeight)||0}},e=function(a){if("pageXOffset"in a)return{x:a.pageXOffset||0,y:a.pageYOffset||0};var b=a.document;return{x:b.documentElement.scrollLeft||b.body.scrollLeft||0,y:b.documentElement.scrollTop||b.body.scrollTop||0}},f=d().height,g=f*-1+c;g+=a.offsetHeight||0;var h=domUtils.getXY(a);g+=h.y;var i=e(b).y;(g>i||g0)return 0;for(var c in dtd.$isNotEmpty)if(a.getElementsByTagName(c).length)return 0;return 1},setViewportOffset:function(a,b){var c=0|parseInt(a.style.left),d=0|parseInt(a.style.top),e=a.getBoundingClientRect(),f=b.left-e.left,g=b.top-e.top;f&&(a.style.left=c+f+"px"),g&&(a.style.top=d+g+"px")},fillNode:function(a,b){var c=browser.ie?a.createTextNode(domUtils.fillChar):a.createElement("br");b.innerHTML="",b.appendChild(c)},moveChild:function(a,b,c){for(;a.firstChild;)c&&b.firstChild?b.insertBefore(a.lastChild,b.firstChild):b.appendChild(a.firstChild)},hasNoAttributes:function(a){return browser.ie?/^<\w+\s*?>/.test(a.outerHTML):0==a.attributes.length},isCustomeNode:function(a){return 1==a.nodeType&&a.getAttribute("_ue_custom_node_")},isTagNode:function(a,b){return 1==a.nodeType&&new RegExp("\\b"+a.tagName+"\\b","i").test(b)},filterNodeList:function(a,b,c){var d=[];if(!utils.isFunction(b)){var e=b;b=function(a){return utils.indexOf(utils.isArray(e)?e:e.split(" "),a.tagName.toLowerCase())!=-1}}return utils.each(a,function(a){b(a)&&d.push(a)}),0==d.length?null:1!=d.length&&c?d:d[0]},isInNodeEndBoundary:function(a,b){var c=a.startContainer;if(3==c.nodeType&&a.startOffset!=c.nodeValue.length)return 0;if(1==c.nodeType&&a.startOffset!=c.childNodes.length)return 0;for(;c!==b;){if(c.nextSibling)return 0;c=c.parentNode}return 1},isBoundaryNode:function(a,b){for(var c;!domUtils.isBody(a);)if(c=a,a=a.parentNode,c!==a[b])return!1;return!0},fillHtml:browser.ie11below?" ":" "},fillCharReg=new RegExp(domUtils.fillChar,"g");!function(){function a(a){a.collapsed=a.startContainer&&a.endContainer&&a.startContainer===a.endContainer&&a.startOffset==a.endOffset}function b(a){return!a.collapsed&&1==a.startContainer.nodeType&&a.startContainer===a.endContainer&&a.endOffset-a.startOffset==1}function c(b,c,d,e){return 1==c.nodeType&&(dtd.$empty[c.tagName]||dtd.$nonChild[c.tagName])&&(d=domUtils.getNodeIndex(c)+(b?0:1),c=c.parentNode),b?(e.startContainer=c,e.startOffset=d,e.endContainer||e.collapse(!0)):(e.endContainer=c,e.endOffset=d,e.startContainer||e.collapse(!1)),a(e),e}function d(a,b){var c,d,e=a.startContainer,f=a.endContainer,g=a.startOffset,h=a.endOffset,i=a.document,j=i.createDocumentFragment();if(1==e.nodeType&&(e=e.childNodes[g]||(c=e.appendChild(i.createTextNode("")))),1==f.nodeType&&(f=f.childNodes[h]||(d=f.appendChild(i.createTextNode("")))),e===f&&3==e.nodeType)return j.appendChild(i.createTextNode(e.substringData(g,h-g))),b&&(e.deleteData(g,h-g),a.collapse(!0)),j;for(var k,l,m=j,n=domUtils.findParents(e,!0),o=domUtils.findParents(f,!0),p=0;n[p]==o[p];)p++;for(var q,r=p;q=n[r];r++){for(k=q.nextSibling,q==e?c||(3==a.startContainer.nodeType?(m.appendChild(i.createTextNode(e.nodeValue.slice(g))),b&&e.deleteData(g,e.nodeValue.length-g)):m.appendChild(b?e:e.cloneNode(!0))):(l=q.cloneNode(!1),m.appendChild(l));k&&k!==f&&k!==o[r];)q=k.nextSibling,m.appendChild(b?k:k.cloneNode(!0)),k=q;m=l}m=j,n[p]||(m.appendChild(n[p-1].cloneNode(!1)),m=m.firstChild);for(var s,r=p;s=o[r];r++){if(k=s.previousSibling,s==f?d||3!=a.endContainer.nodeType||(m.appendChild(i.createTextNode(f.substringData(0,h))),b&&f.deleteData(0,h)):(l=s.cloneNode(!1),m.appendChild(l)),r!=p||!n[p])for(;k&&k!==e;)s=k.previousSibling,m.insertBefore(b?k:k.cloneNode(!0),m.firstChild),k=s;m=l}return b&&a.setStartBefore(o[p]?n[p]?o[p]:n[p-1]:o[p-1]).collapse(!0),c&&domUtils.remove(c),d&&domUtils.remove(d),j}function e(a,b){try{if(g&&domUtils.inDoc(g,a))if(g.nodeValue.replace(fillCharReg,"").length)g.nodeValue=g.nodeValue.replace(fillCharReg,"");else{var c=g.parentNode;for(domUtils.remove(g);c&&domUtils.isEmptyInlineElement(c)&&(browser.safari?!(domUtils.getPosition(c,b)&domUtils.POSITION_CONTAINS):!c.contains(b));)g=c.parentNode,domUtils.remove(c),c=g}}catch(d){}
-}function f(a,b){var c;for(a=a[b];a&&domUtils.isFillChar(a);)c=a[b],domUtils.remove(a),a=c}var g,h=0,i=domUtils.fillChar,j=dom.Range=function(a){var b=this;b.startContainer=b.startOffset=b.endContainer=b.endOffset=null,b.document=a,b.collapsed=!0};j.prototype={cloneContents:function(){return this.collapsed?null:d(this,0)},deleteContents:function(){var a;return this.collapsed||d(this,1),browser.webkit&&(a=this.startContainer,3!=a.nodeType||a.nodeValue.length||(this.setStartBefore(a).collapse(!0),domUtils.remove(a))),this},extractContents:function(){return this.collapsed?null:d(this,2)},setStart:function(a,b){return c(!0,a,b,this)},setEnd:function(a,b){return c(!1,a,b,this)},setStartAfter:function(a){return this.setStart(a.parentNode,domUtils.getNodeIndex(a)+1)},setStartBefore:function(a){return this.setStart(a.parentNode,domUtils.getNodeIndex(a))},setEndAfter:function(a){return this.setEnd(a.parentNode,domUtils.getNodeIndex(a)+1)},setEndBefore:function(a){return this.setEnd(a.parentNode,domUtils.getNodeIndex(a))},setStartAtFirst:function(a){return this.setStart(a,0)},setStartAtLast:function(a){return this.setStart(a,3==a.nodeType?a.nodeValue.length:a.childNodes.length)},setEndAtFirst:function(a){return this.setEnd(a,0)},setEndAtLast:function(a){return this.setEnd(a,3==a.nodeType?a.nodeValue.length:a.childNodes.length)},selectNode:function(a){return this.setStartBefore(a).setEndAfter(a)},selectNodeContents:function(a){return this.setStart(a,0).setEndAtLast(a)},cloneRange:function(){var a=this;return new j(a.document).setStart(a.startContainer,a.startOffset).setEnd(a.endContainer,a.endOffset)},collapse:function(a){var b=this;return a?(b.endContainer=b.startContainer,b.endOffset=b.startOffset):(b.startContainer=b.endContainer,b.startOffset=b.endOffset),b.collapsed=!0,b},shrinkBoundary:function(a){function b(a){return 1==a.nodeType&&!domUtils.isBookmarkNode(a)&&!dtd.$empty[a.tagName]&&!dtd.$nonChild[a.tagName]}for(var c,d=this,e=d.collapsed;1==d.startContainer.nodeType&&(c=d.startContainer.childNodes[d.startOffset])&&b(c);)d.setStart(c,0);if(e)return d.collapse(!0);if(!a)for(;1==d.endContainer.nodeType&&d.endOffset>0&&(c=d.endContainer.childNodes[d.endOffset-1])&&b(c);)d.setEnd(c,c.childNodes.length);return d},getCommonAncestor:function(a,c){var d=this,e=d.startContainer,f=d.endContainer;return e===f?a&&b(this)&&(e=e.childNodes[d.startOffset],1==e.nodeType)?e:c&&3==e.nodeType?e.parentNode:e:domUtils.getCommonAncestor(e,f)},trimBoundary:function(a){this.txtToElmBoundary();var b=this.startContainer,c=this.startOffset,d=this.collapsed,e=this.endContainer;if(3==b.nodeType){if(0==c)this.setStartBefore(b);else if(c>=b.nodeValue.length)this.setStartAfter(b);else{var f=domUtils.split(b,c);b===e?this.setEnd(f,this.endOffset-c):b.parentNode===e&&(this.endOffset+=1),this.setStartBefore(f)}if(d)return this.collapse(!0)}return a||(c=this.endOffset,e=this.endContainer,3==e.nodeType&&(0==c?this.setEndBefore(e):(c=c.nodeValue.length&&a["set"+b.replace(/(\w)/,function(a){return a.toUpperCase()})+"After"](c):a["set"+b.replace(/(\w)/,function(a){return a.toUpperCase()})+"Before"](c))}return!a&&this.collapsed||(b(this,"start"),b(this,"end")),this},insertNode:function(a){var b=a,c=1;11==a.nodeType&&(b=a.firstChild,c=a.childNodes.length),this.trimBoundary(!0);var d=this.startContainer,e=this.startOffset,f=d.childNodes[e];return f?d.insertBefore(a,f):d.appendChild(a),b.parentNode===this.endContainer&&(this.endOffset=this.endOffset+c),this.setStartBefore(b)},setCursor:function(a,b){return this.collapse(!a).select(b)},createBookmark:function(a,b){var c,d=this.document.createElement("span");return d.style.cssText="display:none;line-height:0px;",d.appendChild(this.document.createTextNode("")),d.id="_baidu_bookmark_start_"+(b?"":h++),this.collapsed||(c=d.cloneNode(!0),c.id="_baidu_bookmark_end_"+(b?"":h++)),this.insertNode(d),c&&this.collapse().insertNode(c).setEndBefore(c),this.setStartAfter(d),{start:a?d.id:d,end:c?a?c.id:c:null,id:a}},moveToBookmark:function(a){var b=a.id?this.document.getElementById(a.start):a.start,c=a.end&&a.id?this.document.getElementById(a.end):a.end;return this.setStartBefore(b),domUtils.remove(b),c?(this.setEndBefore(c),domUtils.remove(c)):this.collapse(!0),this},enlarge:function(a,b){var c,d,e=domUtils.isBody,f=this.document.createTextNode("");if(a){for(d=this.startContainer,1==d.nodeType?d.childNodes[this.startOffset]?c=d=d.childNodes[this.startOffset]:(d.appendChild(f),c=d=f):c=d;;){if(domUtils.isBlockElm(d)){for(d=c;(c=d.previousSibling)&&!domUtils.isBlockElm(c);)d=c;this.setStartBefore(d);break}c=d,d=d.parentNode}for(d=this.endContainer,1==d.nodeType?((c=d.childNodes[this.endOffset])?d.insertBefore(f,c):d.appendChild(f),c=d=f):c=d;;){if(domUtils.isBlockElm(d)){for(d=c;(c=d.nextSibling)&&!domUtils.isBlockElm(c);)d=c;this.setEndAfter(d);break}c=d,d=d.parentNode}f.parentNode===this.endContainer&&this.endOffset--,domUtils.remove(f)}if(!this.collapsed){for(;!(0!=this.startOffset||b&&b(this.startContainer)||e(this.startContainer));)this.setStartBefore(this.startContainer);for(;!(this.endOffset!=(1==this.endContainer.nodeType?this.endContainer.childNodes.length:this.endContainer.nodeValue.length)||b&&b(this.endContainer)||e(this.endContainer));)this.setEndAfter(this.endContainer)}return this},enlargeToBlockElm:function(a){for(;!domUtils.isBlockElm(this.startContainer);)this.setStartBefore(this.startContainer);if(!a)for(;!domUtils.isBlockElm(this.endContainer);)this.setEndAfter(this.endContainer);return this},adjustmentBoundary:function(){if(!this.collapsed){for(;!domUtils.isBody(this.startContainer)&&this.startOffset==this.startContainer[3==this.startContainer.nodeType?"nodeValue":"childNodes"].length&&this.startContainer[3==this.startContainer.nodeType?"nodeValue":"childNodes"].length;)this.setStartAfter(this.startContainer);for(;!domUtils.isBody(this.endContainer)&&!this.endOffset&&this.endContainer[3==this.endContainer.nodeType?"nodeValue":"childNodes"].length;)this.setEndBefore(this.endContainer)}return this},applyInlineStyle:function(a,b,c){if(this.collapsed)return this;this.trimBoundary().enlarge(!1,function(a){return 1==a.nodeType&&domUtils.isBlockElm(a)}).adjustmentBoundary();for(var d,e,f=this.createBookmark(),g=f.end,h=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase():!domUtils.isWhitespace(a)},i=domUtils.getNextDomNode(f.start,!1,h),j=this.cloneRange();i&&domUtils.getPosition(i,g)&domUtils.POSITION_PRECEDING;)if(3==i.nodeType||dtd[a][i.tagName]){for(j.setStartBefore(i),d=i;d&&(3==d.nodeType||dtd[a][d.tagName])&&d!==g;)e=d,d=domUtils.getNextDomNode(d,1==d.nodeType,null,function(b){return dtd[a][b.tagName]});var k,l=j.setEndAfter(e).extractContents();if(c&&c.length>0){var m,n;n=m=c[0].cloneNode(!1);for(var o,p=1;o=c[p++];)m.appendChild(o.cloneNode(!1)),m=m.firstChild;k=m}else k=j.document.createElement(a);b&&domUtils.setAttributes(k,b),k.appendChild(l),j.insertNode(c?n:k);var q;if("span"==a&&b.style&&/text\-decoration/.test(b.style)&&(q=domUtils.findParentByTagName(k,"a",!0))?(domUtils.setAttributes(q,b),domUtils.remove(k,!0),k=q):(domUtils.mergeSibling(k),domUtils.clearEmptySibling(k)),domUtils.mergeChild(k,b),i=domUtils.getNextDomNode(k,!1,h),domUtils.mergeToParent(k),d===g)break}else i=domUtils.getNextDomNode(i,!0,h);return this.moveToBookmark(f)},removeInlineStyle:function(a){if(this.collapsed)return this;a=utils.isArray(a)?a:[a],this.shrinkBoundary().adjustmentBoundary();for(var b=this.startContainer,c=this.endContainer;;){if(1==b.nodeType){if(utils.indexOf(a,b.tagName.toLowerCase())>-1)break;if("body"==b.tagName.toLowerCase()){b=null;break}}b=b.parentNode}for(;;){if(1==c.nodeType){if(utils.indexOf(a,c.tagName.toLowerCase())>-1)break;if("body"==c.tagName.toLowerCase()){c=null;break}}c=c.parentNode}var d,e,f=this.createBookmark();b&&(e=this.cloneRange().setEndBefore(f.start).setStartBefore(b),d=e.extractContents(),e.insertNode(d),domUtils.clearEmptySibling(b,!0),b.parentNode.insertBefore(f.start,b)),c&&(e=this.cloneRange().setStartAfter(f.end).setEndAfter(c),d=e.extractContents(),e.insertNode(d),domUtils.clearEmptySibling(c,!1,!0),c.parentNode.insertBefore(f.end,c.nextSibling));for(var g,h=domUtils.getNextDomNode(f.start,!1,function(a){return 1==a.nodeType});h&&h!==f.end;)g=domUtils.getNextDomNode(h,!0,function(a){return 1==a.nodeType}),utils.indexOf(a,h.tagName.toLowerCase())>-1&&domUtils.remove(h,!0),h=g;return this.moveToBookmark(f)},getClosedNode:function(){var a;if(!this.collapsed){var c=this.cloneRange().adjustmentBoundary().shrinkBoundary();if(b(c)){var d=c.startContainer.childNodes[c.startOffset];d&&1==d.nodeType&&(dtd.$empty[d.tagName]||dtd.$nonChild[d.tagName])&&(a=d)}}return a},select:browser.ie?function(a,b){var c;this.collapsed||this.shrinkBoundary();var d=this.getClosedNode();if(d&&!b){try{c=this.document.body.createControlRange(),c.addElement(d),c.select()}catch(h){}return this}var j,k=this.createBookmark(),l=k.start;if(c=this.document.body.createTextRange(),c.moveToElementText(l),c.moveStart("character",1),this.collapsed){if(!a&&3!=this.startContainer.nodeType){var m=this.document.createTextNode(i),n=this.document.createElement("span");n.appendChild(this.document.createTextNode(i)),l.parentNode.insertBefore(n,l),l.parentNode.insertBefore(m,l),e(this.document,m),g=m,f(n,"previousSibling"),f(l,"nextSibling"),c.moveStart("character",-1),c.collapse(!0)}}else{var o=this.document.body.createTextRange();j=k.end,o.moveToElementText(j),c.setEndPoint("EndToEnd",o)}this.moveToBookmark(k),n&&domUtils.remove(n);try{c.select()}catch(h){}return this}:function(a){function b(a){function b(b,c,d){3==b.nodeType&&b.nodeValue.length0)j=k-1;else{if(!(l<0))return{container:d,offset:c(e)};i=k+1}}if(k==-1){if(h.moveToElementText(d),h.setEndPoint("StartToStart",a),f=h.text.replace(/(\r\n|\r)/g,"\n").length,g=d.childNodes,!f)return e=g[g.length-1],{container:e,offset:e.nodeValue.length};for(var m=g.length;f>0;)f-=g[--m].nodeValue.length;return{container:g[m],offset:-f}}if(h.collapse(l>0),h.setEndPoint(l>0?"StartToStart":"EndToStart",a),f=h.text.replace(/(\r\n|\r)/g,"\n").length,!f)return dtd.$empty[e.tagName]||dtd.$nonChild[e.tagName]?{container:d,offset:c(e)+(l>0?0:1)}:{container:e,offset:l>0?0:e.childNodes.length};for(;f>0;)try{var n=e;e=e[l>0?"previousSibling":"nextSibling"],f-=e.nodeValue.length}catch(o){return{container:d,offset:c(n)}}return{container:e,offset:l>0?-f:e.nodeValue.length+f}}function b(b,c){if(b.item)c.selectNode(b.item(0));else{var d=a(b,!0);c.setStart(d.container,d.offset),0!=b.compareEndPoints("StartToEnd",b)&&(d=a(b,!1),c.setEnd(d.container,d.offset))}return c}function c(a){var b;try{b=a.getNative().createRange()}catch(c){return null}var d=b.item?b.item(0):b.parentElement();return(d.ownerDocument||d)===a.document?b:null}var d=dom.Selection=function(a){var b,d=this;d.document=a,browser.ie9below&&(b=domUtils.getWindow(a).frameElement,domUtils.on(b,"beforedeactivate",function(){d._bakIERange=d.getIERange()}),domUtils.on(b,"activate",function(){try{!c(d)&&d._bakIERange&&d._bakIERange.select()}catch(a){}d._bakIERange=null})),b=a=null};d.prototype={rangeInBody:function(a,b){var c=browser.ie9below||b?a.item?a.item():a.parentElement():a.startContainer;return c===this.document.body||domUtils.inDoc(c,this.document)},getNative:function(){var a=this.document;try{return a?browser.ie9below?a.selection:domUtils.getWindow(a).getSelection():null}catch(b){return null}},getIERange:function(){var a=c(this);return!a&&this._bakIERange?this._bakIERange:a},cache:function(){this.clear(),this._cachedRange=this.getRange(),this._cachedStartElement=this.getStart(),this._cachedStartElementPath=this.getStartElementPath()},getStartElementPath:function(){if(this._cachedStartElementPath)return this._cachedStartElementPath;var a=this.getStart();return a?domUtils.findParents(a,!0,null,!0):[]},clear:function(){this._cachedStartElementPath=this._cachedRange=this._cachedStartElement=null},isFocus:function(){try{if(browser.ie9below){var a=c(this);return!(!a||!this.rangeInBody(a))}return!!this.getNative().rangeCount}catch(b){return!1}},getRange:function(){function a(a){for(var b=c.document.body.firstChild,d=a.collapsed;b&&b.firstChild;)a.setStart(b,0),b=b.firstChild;a.startContainer||a.setStart(c.document.body,0),d&&a.collapse(!0)}var c=this;if(null!=c._cachedRange)return this._cachedRange;var d=new baidu.editor.dom.Range(c.document);if(browser.ie9below){var e=c.getIERange();if(e)try{b(e,d)}catch(f){a(d)}else a(d)}else{var g=c.getNative();if(g&&g.rangeCount){var h=g.getRangeAt(0),i=g.getRangeAt(g.rangeCount-1);d.setStart(h.startContainer,h.startOffset).setEnd(i.endContainer,i.endOffset),d.collapsed&&domUtils.isBody(d.startContainer)&&!d.startOffset&&a(d)}else{if(this._bakRange&&domUtils.inDoc(this._bakRange.startContainer,this.document))return this._bakRange;a(d)}}return this._bakRange=d},getStart:function(){if(this._cachedStartElement)return this._cachedStartElement;var a,b,c,d,e=browser.ie9below?this.getIERange():this.getRange();if(browser.ie9below){if(!e)return this.document.body.firstChild;if(e.item)return e.item(0);for(a=e.duplicate(),a.text.length>0&&a.moveStart("character",1),a.collapse(1),b=a.parentElement(),d=c=e.parentElement();c=c.parentNode;)if(c==b){b=d;break}}else if(e.shrinkBoundary(),b=e.startContainer,1==b.nodeType&&b.hasChildNodes()&&(b=b.childNodes[Math.min(b.childNodes.length-1,e.startOffset)]),3==b.nodeType)return b.parentNode;return b},getText:function(){var a,b;return this.isFocus()&&(a=this.getNative())?(b=browser.ie9below?a.createRange():a.getRangeAt(0),browser.ie9below?b.text:b.toString()):""},clearRange:function(){this.getNative()[browser.ie9below?"empty":"removeAllRanges"]()}}}(),function(){function a(a,b){var c;if(b.textarea)if(utils.isString(b.textarea)){for(var d,e=0,f=domUtils.getElementsByTagName(a,"textarea");d=f[e++];)if(d.id=="ueditor_textarea_"+b.options.textarea){c=d;break}}else c=b.textarea;c||(a.appendChild(c=domUtils.createElement(document,"textarea",{name:b.options.textarea,id:"ueditor_textarea_"+b.options.textarea,style:"display:none"})),b.textarea=c),!c.getAttribute("name")&&c.setAttribute("name",b.options.textarea),c.value=b.hasContents()?b.options.allHtmlEnabled?b.getAllHtml():b.getContent(null,null,!0):""}function b(a){for(var b in a)return b}function c(a){a.langIsReady=!0,a.fireEvent("langReady")}var d,e=0,f=UE.Editor=function(a){var d=this;d.uid=e++,EventBase.call(d),d.commands={},d.options=utils.extend(utils.clone(a||{}),UEDITOR_CONFIG,!0),d.shortcutkeys={},d.inputRules=[],d.outputRules=[],d.setOpt(f.defaultOptions(d)),d.loadServerConfig(),utils.isEmptyObject(UE.I18N)?utils.loadFile(document,{src:d.options.langPath+d.options.lang+"/"+d.options.lang+".js",tag:"script",type:"text/javascript",defer:"defer"},function(){UE.plugin.load(d),c(d)}):(d.options.lang=b(UE.I18N),UE.plugin.load(d),c(d)),UE.instants["ueditorInstant"+d.uid]=d};f.prototype={registerCommand:function(a,b){this.commands[a]=b},ready:function(a){var b=this;a&&(b.isReady?a.apply(b):b.addListener("ready",a))},setOpt:function(a,b){var c={};utils.isString(a)?c[a]=b:c=a,utils.extend(this.options,c,!0)},getOpt:function(a){return this.options[a]},destroy:function(){var a=this;a.fireEvent("destroy");var b=a.container.parentNode,c=a.textarea;c?c.style.display="":(c=document.createElement("textarea"),b.parentNode.insertBefore(c,b)),c.style.width=a.iframe.offsetWidth+"px",c.style.height=a.iframe.offsetHeight+"px",c.value=a.getContent(),c.id=a.key,b.innerHTML="",domUtils.remove(b);var d=a.key;for(var e in a)a.hasOwnProperty(e)&&delete this[e];UE.delEditor(d)},render:function(a){var b=this,c=b.options,d=function(b){return parseInt(domUtils.getComputedStyle(a,b))};if(utils.isString(a)&&(a=document.getElementById(a)),a){c.initialFrameWidth?c.minFrameWidth=c.initialFrameWidth:c.minFrameWidth=c.initialFrameWidth=a.offsetWidth,c.initialFrameHeight?c.minFrameHeight=c.initialFrameHeight:c.initialFrameHeight=c.minFrameHeight=a.offsetHeight,a.style.width=/%$/.test(c.initialFrameWidth)?"100%":c.initialFrameWidth-d("padding-left")-d("padding-right")+"px",a.style.height=/%$/.test(c.initialFrameHeight)?"100%":c.initialFrameHeight-d("padding-top")-d("padding-bottom")+"px",a.style.zIndex=c.zIndex;var e=(ie&&browser.version<9?"":"")+""+(c.iframeCssUrl?" ":"")+(c.initialStyle?"":"")+"";a.appendChild(domUtils.createElement(document,"iframe",{id:"ueditor_"+b.uid,width:"100%",height:"100%",frameborder:"0",src:"javascript:void(function(){document.open();"+(c.customDomain&&document.domain!=location.hostname?'document.domain="'+document.domain+'";':"")+'document.write("'+e+'");document.close();}())'})),a.style.overflow="hidden",setTimeout(function(){/%$/.test(c.initialFrameWidth)&&(c.minFrameWidth=c.initialFrameWidth=a.offsetWidth),/%$/.test(c.initialFrameHeight)&&(c.minFrameHeight=c.initialFrameHeight=a.offsetHeight,a.style.height=c.initialFrameHeight+"px")})}},_setup:function(b){var c=this,d=c.options;ie?(b.body.disabled=!0,b.body.contentEditable=!0,b.body.disabled=!1):b.body.contentEditable=!0,b.body.spellcheck=!1,c.document=b,c.window=b.defaultView||b.parentWindow,c.iframe=c.window.frameElement,c.body=b.body,c.selection=new dom.Selection(b);var e;browser.gecko&&(e=this.selection.getNative())&&e.removeAllRanges(),this._initEvents();for(var f=this.iframe.parentNode;!domUtils.isBody(f);f=f.parentNode)if("FORM"==f.tagName){c.form=f,c.options.autoSyncData?domUtils.on(c.window,"blur",function(){a(f,c)}):domUtils.on(f,"submit",function(){a(this,c)});break}if(d.initialContent)if(d.autoClearinitialContent){var g=c.execCommand;c.execCommand=function(){return c.fireEvent("firstBeforeExecCommand"),g.apply(c,arguments)},this._setDefaultContent(d.initialContent)}else this.setContent(d.initialContent,!1,!0);domUtils.isEmptyNode(c.body)&&(c.body.innerHTML=""+(browser.ie?"":" ")+"
"),d.focus&&setTimeout(function(){c.focus(c.options.focusInEnd),!c.options.autoClearinitialContent&&c._selectionChange()},0),c.container||(c.container=this.iframe.parentNode),d.fullscreen&&c.ui&&c.ui.setFullScreen(!0);try{c.document.execCommand("2D-position",!1,!1)}catch(h){}try{c.document.execCommand("enableInlineTableEditing",!1,!1)}catch(h){}try{c.document.execCommand("enableObjectResizing",!1,!1)}catch(h){}c._bindshortcutKeys(),c.isReady=1,c.fireEvent("ready"),d.onready&&d.onready.call(c),browser.ie9below||domUtils.on(c.window,["blur","focus"],function(a){if("blur"==a.type){c._bakRange=c.selection.getRange();try{c._bakNativeRange=c.selection.getNative().getRangeAt(0),c.selection.getNative().removeAllRanges()}catch(a){c._bakNativeRange=null}}else try{c._bakRange&&c._bakRange.select()}catch(a){}}),browser.gecko&&browser.version<=10902&&(c.body.contentEditable=!1,setTimeout(function(){c.body.contentEditable=!0},100),setInterval(function(){c.body.style.height=c.iframe.offsetHeight-20+"px"},100)),!d.isShow&&c.setHide(),d.readonly&&c.setDisabled()},sync:function(b){var c=this,d=b?document.getElementById(b):domUtils.findParent(c.iframe.parentNode,function(a){return"FORM"==a.tagName},!0);d&&a(d,c)},setHeight:function(a,b){a!==parseInt(this.iframe.parentNode.style.height)&&(this.iframe.parentNode.style.height=a+"px"),!b&&(this.options.minFrameHeight=this.options.initialFrameHeight=a),this.body.style.height=a+"px",!b&&this.trigger("setHeight")},addshortcutkey:function(a,b){var c={};b?c[a]=b:c=a,utils.extend(this.shortcutkeys,c)},_bindshortcutKeys:function(){var a=this,b=this.shortcutkeys;a.addListener("keydown",function(c,d){var e=d.keyCode||d.which;for(var f in b)for(var g,h=b[f].split(","),i=0;g=h[i++];){g=g.split(":");var j=g[0],k=g[1];(/^(ctrl)(\+shift)?\+(\d+)$/.test(j.toLowerCase())||/^(\d+)$/.test(j))&&(("ctrl"==RegExp.$1?d.ctrlKey||d.metaKey:0)&&(""!=RegExp.$2?d[RegExp.$2.slice(1)+"Key"]:1)&&e==RegExp.$3||e==RegExp.$1)&&(a.queryCommandState(f,k)!=-1&&a.execCommand(f,k),domUtils.preventDefault(d))}})},getContent:function(a,b,c,d,e){var f=this;if(a&&utils.isFunction(a)&&(b=a,a=""),b?!b():!this.hasContents())return"";f.fireEvent("beforegetcontent");var g=UE.htmlparser(f.body.innerHTML,d);return f.filterOutputRule(g),f.fireEvent("aftergetcontent",a,g),g.toHtml(e)},getAllHtml:function(){var a=this,b=[];if(a.fireEvent("getAllHtml",b),browser.ie&&browser.version>8){var c="";utils.each(a.document.styleSheets,function(a){c+=a.href?' ':""}),utils.each(a.document.getElementsByTagName("script"),function(a){c+=a.outerHTML})}return""+(a.options.charset?' ':"")+(c||a.document.getElementsByTagName("head")[0].innerHTML)+b.join("\n")+""+a.getContent(null,null,!0)+""},getPlainTxt:function(){var a=new RegExp(domUtils.fillChar,"g"),b=this.body.innerHTML.replace(/[\n\r]/g,"");return b=b.replace(/<(p|div)[^>]*>( | )<\/\1>/gi,"\n").replace(/ /gi,"\n").replace(/<[^>\/]+>/g,"").replace(/(\n)?<\/([^>]+)>/g,function(a,b,c){return dtd.$block[c]?"\n":b?b:""}),b.replace(a,"").replace(/\u00a0/g," ").replace(/ /g," ")},getContentTxt:function(){var a=new RegExp(domUtils.fillChar,"g");return this.body[browser.ie?"innerText":"textContent"].replace(a,"").replace(/\u00a0/g," ")},setContent:function(b,c,d){function e(a){return"DIV"==a.tagName&&a.getAttribute("cdata_tag")}var f=this;f.fireEvent("beforesetcontent",b);var g=UE.htmlparser(b);if(f.filterInputRule(g),b=g.toHtml(),f.body.innerHTML=(c?f.body.innerHTML:"")+b,"p"==f.options.enterTag){var h,i=this.body.firstChild;if(!i||1==i.nodeType&&(dtd.$cdata[i.tagName]||e(i)||domUtils.isCustomeNode(i))&&i===this.body.lastChild)this.body.innerHTML=""+(browser.ie?" ":" ")+"
"+this.body.innerHTML;else for(var j=f.document.createElement("p");i;){for(;i&&(3==i.nodeType||1==i.nodeType&&dtd.p[i.tagName]&&!dtd.$cdata[i.tagName]);)h=i.nextSibling,j.appendChild(i),i=h;if(j.firstChild){if(!i){f.body.appendChild(j);break}i.parentNode.insertBefore(j,i),j=f.document.createElement("p")}i=i.nextSibling}}f.fireEvent("aftersetcontent"),f.fireEvent("contentchange"),!d&&f._selectionChange(),f._bakRange=f._bakIERange=f._bakNativeRange=null;var k;browser.gecko&&(k=this.selection.getNative())&&k.removeAllRanges(),f.options.autoSyncData&&f.form&&a(f.form,f)},focus:function(a){try{var b=this,c=b.selection.getRange();if(a){var d=b.body.lastChild;d&&1==d.nodeType&&!dtd.$empty[d.tagName]&&(domUtils.isEmptyBlock(d)?c.setStartAtFirst(d):c.setStartAtLast(d),c.collapse(!0)),c.setCursor(!0)}else{if(!c.collapsed&&domUtils.isBody(c.startContainer)&&0==c.startOffset){var d=b.body.firstChild;d&&1==d.nodeType&&!dtd.$empty[d.tagName]&&c.setStartAtFirst(d).collapse(!0)}c.select(!0)}this.fireEvent("focus selectionchange")}catch(e){}},isFocus:function(){return this.selection.isFocus()},blur:function(){var a=this.selection.getNative();if(a.empty&&browser.ie){var b=document.body.createTextRange();b.moveToElementText(document.body),b.collapse(!0),b.select(),a.empty()}else a.removeAllRanges()},_initEvents:function(){var a=this,b=a.document,c=a.window;a._proxyDomEvent=utils.bind(a._proxyDomEvent,a),domUtils.on(b,["click","contextmenu","mousedown","keydown","keyup","keypress","mouseup","mouseover","mouseout","selectstart"],a._proxyDomEvent),domUtils.on(c,["focus","blur"],a._proxyDomEvent),domUtils.on(a.body,"drop",function(b){browser.gecko&&b.stopPropagation&&b.stopPropagation(),a.fireEvent("contentchange")}),domUtils.on(b,["mouseup","keydown"],function(b){"keydown"==b.type&&(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)||2!=b.button&&a._selectionChange(250,b)})},_proxyDomEvent:function(a){return this.fireEvent("before"+a.type.replace(/^on/,"").toLowerCase())!==!1&&(this.fireEvent(a.type.replace(/^on/,""),a)!==!1&&this.fireEvent("after"+a.type.replace(/^on/,"").toLowerCase()))},_selectionChange:function(a,b){var c,e,f=this,g=!1;if(browser.ie&&browser.version<9&&b&&"mouseup"==b.type){var h=this.selection.getRange();h.collapsed||(g=!0,c=b.clientX,e=b.clientY)}clearTimeout(d),d=setTimeout(function(){if(f.selection&&f.selection.getNative()){var a;if(g&&"None"==f.selection.getNative().type){a=f.document.body.createTextRange();try{a.moveToPoint(c,e)}catch(d){a=null}}var h;a&&(h=f.selection.getIERange,f.selection.getIERange=function(){return a}),f.selection.cache(),h&&(f.selection.getIERange=h),f.selection._cachedRange&&f.selection._cachedStartElement&&(f.fireEvent("beforeselectionchange"),f.fireEvent("selectionchange",!!b),f.fireEvent("afterselectionchange"),f.selection.clear())}},a||50)},_callCmdFn:function(a,b){var c,d,e=b[0].toLowerCase();return c=this.commands[e]||UE.commands[e],d=c&&c[a],c&&d||"queryCommandState"!=a?d?d.apply(this,b):void 0:0},execCommand:function(a){a=a.toLowerCase();var b,c=this,d=c.commands[a]||UE.commands[a];return d&&d.execCommand?(d.notNeedUndo||c.__hasEnterExecCommand?(b=this._callCmdFn("execCommand",arguments),!c.__hasEnterExecCommand&&!d.ignoreContentChange&&!c._ignoreContentChange&&c.fireEvent("contentchange")):(c.__hasEnterExecCommand=!0,c.queryCommandState.apply(c,arguments)!=-1&&(c.fireEvent("saveScene"),c.fireEvent.apply(c,["beforeexeccommand",a].concat(arguments)),b=this._callCmdFn("execCommand",arguments),c.fireEvent.apply(c,["afterexeccommand",a].concat(arguments)),c.fireEvent("saveScene")),c.__hasEnterExecCommand=!1),!c.__hasEnterExecCommand&&!d.ignoreContentChange&&!c._ignoreContentChange&&c._selectionChange(),b):null},queryCommandState:function(a){return this._callCmdFn("queryCommandState",arguments)},queryCommandValue:function(a){return this._callCmdFn("queryCommandValue",arguments)},hasContents:function(a){if(a)for(var b,c=0;b=a[c++];)if(this.document.getElementsByTagName(b).length>0)return!0;if(!domUtils.isEmptyBlock(this.body))return!0;for(a=["div"],c=0;b=a[c++];)for(var d,e=domUtils.getElementsByTagName(this.document,b),f=0;d=e[f++];)if(domUtils.isCustomeNode(d))return!0;return!1},reset:function(){this.fireEvent("reset")},setEnabled:function(){var a,b=this;if("false"==b.body.contentEditable){b.body.contentEditable=!0,a=b.selection.getRange();try{a.moveToBookmark(b.lastBk),delete b.lastBk}catch(c){a.setStartAtFirst(b.body).collapse(!0)}a.select(!0),b.bkqueryCommandState&&(b.queryCommandState=b.bkqueryCommandState,delete b.bkqueryCommandState),b.bkqueryCommandValue&&(b.queryCommandValue=b.bkqueryCommandValue,delete b.bkqueryCommandValue),b.fireEvent("selectionchange")}},enable:function(){return this.setEnabled()},setDisabled:function(a){var b=this;a=a?utils.isArray(a)?a:[a]:[],"true"==b.body.contentEditable&&(b.lastBk||(b.lastBk=b.selection.getRange().createBookmark(!0)),b.body.contentEditable=!1,b.bkqueryCommandState=b.queryCommandState,b.bkqueryCommandValue=b.queryCommandValue,b.queryCommandState=function(c){return utils.indexOf(a,c)!=-1?b.bkqueryCommandState.apply(b,arguments):-1},b.queryCommandValue=function(c){return utils.indexOf(a,c)!=-1?b.bkqueryCommandValue.apply(b,arguments):null},b.fireEvent("selectionchange"))},disable:function(a){return this.setDisabled(a)},_setDefaultContent:function(){function a(){var b=this;b.document.getElementById("initContent")&&(b.body.innerHTML=""+(ie?"":" ")+"
",b.removeListener("firstBeforeExecCommand focus",a),setTimeout(function(){b.focus(),b._selectionChange()},0))}return function(b){var c=this;c.body.innerHTML=''+b+"
",c.addListener("firstBeforeExecCommand focus",a)}}(),setShow:function(){var a=this,b=a.selection.getRange();if("none"==a.container.style.display){try{b.moveToBookmark(a.lastBk),delete a.lastBk}catch(c){b.setStartAtFirst(a.body).collapse(!0)}setTimeout(function(){b.select(!0)},100),a.container.style.display=""}},show:function(){return this.setShow()},setHide:function(){
-var a=this;a.lastBk||(a.lastBk=a.selection.getRange().createBookmark(!0)),a.container.style.display="none"},hide:function(){return this.setHide()},getLang:function(a){var b=UE.I18N[this.options.lang];if(!b)throw Error("not import language file");a=(a||"").split(".");for(var c,d=0;(c=a[d++])&&(b=b[c],b););return b},getContentLength:function(a,b){var c=this.getContent(!1,!1,!0).length;if(a){b=(b||[]).concat(["hr","img","iframe"]),c=this.getContentTxt().replace(/[\t\r\n]+/g,"").length;for(var d,e=0;d=b[e++];)c+=this.document.getElementsByTagName(d).length}return c},addInputRule:function(a){this.inputRules.push(a)},filterInputRule:function(a){for(var b,c=0;b=this.inputRules[c++];)b.call(this,a)},addOutputRule:function(a){this.outputRules.push(a)},filterOutputRule:function(a){for(var b,c=0;b=this.outputRules[c++];)b.call(this,a)},getActionUrl:function(a){var b=this.getOpt(a)||a,c=this.getOpt("imageUrl"),d=this.getOpt("serverUrl");return!d&&c&&(d=c.replace(/^(.*[\/]).+([\.].+)$/,"$1controller$2")),d?(d=d+(d.indexOf("?")==-1?"?":"&")+"action="+(b||""),utils.formatUrl(d)):""}},utils.inherits(f,EventBase)}(),UE.Editor.defaultOptions=function(a){var b=a.options.UEDITOR_HOME_URL;return{isShow:!0,initialContent:"",initialStyle:"",autoClearinitialContent:!1,iframeCssUrl:b+"themes/iframe.css",textarea:"editorValue",focus:!1,focusInEnd:!0,autoClearEmptyNode:!0,fullscreen:!1,readonly:!1,zIndex:999,imagePopup:!0,enterTag:"p",customDomain:!1,lang:"zh-cn",langPath:b+"lang/",theme:"default",themePath:b+"themes/",allHtmlEnabled:!1,scaleEnabled:!1,tableNativeEditInFF:!1,autoSyncData:!0,fileNameFormat:"{time}{rand:6}"}},function(){UE.Editor.prototype.loadServerConfig=function(){function showErrorMsg(a){console&&console.error(a)}var me=this;setTimeout(function(){try{me.options.imageUrl&&me.setOpt("serverUrl",me.options.imageUrl.replace(/^(.*[\/]).+([\.].+)$/,"$1controller$2"));var configUrl=me.getActionUrl("config"),isJsonp=utils.isCrossDomainUrl(configUrl);me._serverConfigLoaded=!1,configUrl&&UE.ajax.request(configUrl,{method:"GET",dataType:isJsonp?"jsonp":"",onsuccess:function(r){try{var config=isJsonp?r:eval("("+r.responseText+")");utils.extend(me.options,config),me.fireEvent("serverConfigLoaded"),me._serverConfigLoaded=!0}catch(e){showErrorMsg(me.getLang("loadconfigFormatError"))}},onerror:function(){showErrorMsg(me.getLang("loadconfigHttpError"))}})}catch(e){showErrorMsg(me.getLang("loadconfigError"))}})},UE.Editor.prototype.isServerConfigLoaded=function(){var a=this;return a._serverConfigLoaded||!1},UE.Editor.prototype.afterConfigReady=function(a){if(a&&utils.isFunction(a)){var b=this,c=function(){a.apply(b,arguments),b.removeListener("serverConfigLoaded",c)};b.isServerConfigLoaded()?a.call(b,"serverConfigLoaded"):b.addListener("serverConfigLoaded",c)}}}(),UE.ajax=function(){function a(a){var b=[];for(var c in a)if("method"!=c&&"timeout"!=c&&"async"!=c&&"dataType"!=c&&"callback"!=c&&void 0!=a[c]&&null!=a[c])if("function"!=(typeof a[c]).toLowerCase()&&"object"!=(typeof a[c]).toLowerCase())b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));else if(utils.isArray(a[c]))for(var d=0;d/gi,"").replace(/]*>[\s\S]*?.<\/v:shape>/gi,function(a){if(browser.opera)return"";try{if(/Bitmap/i.test(a))return"";var c=a.match(/width:([ \d.]*p[tx])/i)[1],d=a.match(/height:([ \d.]*p[tx])/i)[1],e=a.match(/src=\s*"([^"]*)"/i)[1];return' '}catch(f){return""}}).replace(/<\/?div[^>]*>/g,"").replace(/v:\w+=(["']?)[^'"]+\1/g,"").replace(/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi,"").replace(/]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"
$1
").replace(/\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/gi,function(a,b,c,d){return"class"==b&&"MsoListParagraph"==d?a:""}).replace(/<(font|span)[^>]*>(\s*)<\/\1>/gi,function(a,b,c){return c.replace(/[\t\r\n ]+/g," ")}).replace(/(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi,function(a,c,d,e){for(var f,g=[],h=e.replace(/^\s+|\s+$/,"").replace(/'/g,"'").replace(/"/gi,"'").replace(/[\d.]+(cm|pt)/g,function(a){return utils.transUnitToPx(a)}).split(/;\s*/g),i=0;f=h[i];i++){var j,k,l=f.split(":");if(2==l.length){if(j=l[0].toLowerCase(),k=l[1].toLowerCase(),/^(background)\w*/.test(j)&&0==k.replace(/(initial|\s)/g,"").length||/^(margin)\w*/.test(j)&&/^0\w+$/.test(k))continue;switch(j){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":/1&&(a(h,j,!0),b(h,j)),c(k,h,i,j);break;case"text":d(g,h);break;case"element":e(g,h,i,j);break;case"comment":f(g,h,i)}return h}function d(a,b){"pre"==a.parentNode.tagName?b.push(a.data):b.push(l[a.parentNode.tagName]?utils.html(a.data):a.data.replace(/[ ]{2}/g," "))}function e(d,e,f,g){var h="";if(d.attrs){h=[];var i=d.attrs;for(var j in i)h.push(j+(void 0!==i[j]?'="'+(k[j]?utils.html(i[j]).replace(/["]/g,function(a){return"""}):utils.unhtml(i[j]))+'"':""));h=h.join(" ")}if(e.push("<"+d.tagName+(h?" "+h:"")+(dtd.$empty[d.tagName]?"/":"")+">"),f&&!dtd.$inlineWithA[d.tagName]&&"pre"!=d.tagName&&d.children&&d.children.length&&(g=a(e,g,!0),b(e,g)),d.children&&d.children.length)for(var l,m=0;l=d.children[m++];)f&&"element"==l.type&&!dtd.$inlineWithA[l.tagName]&&m>1&&(a(e,g),b(e,g)),c(l,e,f,g);dtd.$empty[d.tagName]||(f&&!dtd.$inlineWithA[d.tagName]&&"pre"!=d.tagName&&d.children&&d.children.length&&(g=a(e,g),b(e,g)),e.push(""+d.tagName+">"))}function f(a,b){b.push("")}function g(a,b){var c;if("element"==a.type&&a.getAttr("id")==b)return a;if(a.children&&a.children.length)for(var d,e=0;d=a.children[e++];)if(c=g(d,b))return c}function h(a,b,c){if("element"==a.type&&a.tagName==b&&c.push(a),a.children&&a.children.length)for(var d,e=0;d=a.children[e++];)h(d,b,c)}function i(a,b){if(a.children&&a.children.length)for(var c,d=0;c=a.children[d];)i(c,b),c.parentNode&&(c.children&&c.children.length&&b(c),c.parentNode&&d++);else b(a)}var j=UE.uNode=function(a){this.type=a.type,this.data=a.data,this.tagName=a.tagName,this.parentNode=a.parentNode,this.attrs=a.attrs||{},this.children=a.children},k={href:1,src:1,_src:1,_href:1,cdata_data:1},l={style:1,script:1},m=" ",n="\n";j.createElement=function(a){return/[<>]/.test(a)?UE.htmlparser(a).children[0]:new j({type:"element",children:[],tagName:a})},j.createText=function(a,b){return new UE.uNode({type:"text",data:b?a:utils.unhtml(a||"")})},j.prototype={toHtml:function(a){var b=[];return c(this,b,a,0),b.join("")},innerHTML:function(a){if("element"!=this.type||dtd.$empty[this.tagName])return this;if(utils.isString(a)){if(this.children)for(var b,c=0;b=this.children[c++];)b.parentNode=null;this.children=[];for(var b,d=UE.htmlparser(a),c=0;b=d.children[c++];)this.children.push(b),b.parentNode=this;return this}var d=new UE.uNode({type:"root",children:this.children});return d.toHtml()},innerText:function(a,b){if("element"!=this.type||dtd.$empty[this.tagName])return this;if(a){if(this.children)for(var c,d=0;c=this.children[d++];)c.parentNode=null;return this.children=[],this.appendChild(j.createText(a,b)),this}return this.toHtml().replace(/<[^>]+>/g,"")},getData:function(){return"element"==this.type?"":this.data},firstChild:function(){return this.children?this.children[0]:null},lastChild:function(){return this.children?this.children[this.children.length-1]:null},previousSibling:function(){for(var a,b=this.parentNode,c=0;a=b.children[c];c++)if(a===this)return 0==c?null:b.children[c-1]},nextSibling:function(){for(var a,b=this.parentNode,c=0;a=b.children[c++];)if(a===this)return b.children[c]},replaceChild:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d,1,a),b.parentNode=null,a.parentNode=this,a}},appendChild:function(a){if("root"==this.type||"element"==this.type&&!dtd.$empty[this.tagName]){this.children||(this.children=[]),a.parentNode&&a.parentNode.removeChild(a);for(var b,c=0;b=this.children[c];c++)if(b===a){this.children.splice(c,1);break}return this.children.push(a),a.parentNode=this,a}},insertBefore:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d,0,a),a.parentNode=this,a}},insertAfter:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d+1,0,a),a.parentNode=this,a}},removeChild:function(a,b){if(this.children)for(var c,d=0;c=this.children[d];d++)if(c===a){if(this.children.splice(d,1),c.parentNode=null,b&&c.children&&c.children.length)for(var e,f=0;e=c.children[f];f++)this.children.splice(d+f,0,e),e.parentNode=this;return c}},getAttr:function(a){return this.attrs&&this.attrs[a.toLowerCase()]},setAttr:function(a,b){if(!a)return void delete this.attrs;if(this.attrs||(this.attrs={}),utils.isObject(a))for(var c in a)a[c]?this.attrs[c.toLowerCase()]=a[c]:delete this.attrs[c];else b?this.attrs[a.toLowerCase()]=b:delete this.attrs[a]},getIndex:function(){for(var a,b=this.parentNode,c=0;a=b.children[c];c++)if(a===this)return c;return-1},getNodeById:function(a){var b;if(this.children&&this.children.length)for(var c,d=0;c=this.children[d++];)if(b=g(c,a))return b},getNodesByTagName:function(a){a=utils.trim(a).replace(/[ ]{2,}/g," ").split(" ");var b=[],c=this;return utils.each(a,function(a){if(c.children&&c.children.length)for(var d,e=0;d=c.children[e++];)h(d,a,b)}),b},getStyle:function(a){var b=this.getAttr("style");if(!b)return"";var c=new RegExp("(^|;)\\s*"+a+":([^;]+)","i"),d=b.match(c);return d&&d[0]?d[2]:""},setStyle:function(a,b){function c(a,b){var c=new RegExp("(^|;)\\s*"+a+":([^;]+;?)","gi");d=d.replace(c,"$1"),b&&(d=a+":"+utils.unhtml(b)+";"+d)}var d=this.getAttr("style");if(d||(d=""),utils.isObject(a))for(var e in a)c(e,a[e]);else c(a,b);this.setAttr("style",utils.trim(d))},traversal:function(a){return this.children&&this.children.length&&i(this,a),this}}}();var htmlparser=UE.htmlparser=function(a,b){function c(a,b){if(m[a.tagName]){var c=k.createElement(m[a.tagName]);a.appendChild(c),c.appendChild(k.createText(b)),a=c}else a.appendChild(k.createText(b))}function d(a,b,c){var e;if(e=l[b]){for(var f,h=a;"root"!=h.type;){if(utils.isArray(e)?utils.indexOf(e,h.tagName)!=-1:e==h.tagName){a=h,f=!0;break}h=h.parentNode}f||(a=d(a,utils.isArray(e)?e[0]:e))}var i=new k({parentNode:a,type:"element",tagName:b.toLowerCase(),children:dtd.$empty[b]?null:[]});if(c){for(var m,n={};m=g.exec(c);)n[m[1].toLowerCase()]=j[m[1].toLowerCase()]?m[2]||m[3]||m[4]:utils.unhtml(m[2]||m[3]||m[4]);i.attrs=n}return a.children.push(i),dtd.$empty[b]?a:i}function e(a,b){a.children.push(new k({type:"comment",data:b,parentNode:a}))}var f=/<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\s\/<>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g,g=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,h={b:1,code:1,i:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,span:1,sub:1,img:1,sup:1,font:1,big:1,small:1,iframe:1,a:1,br:1,pre:1};a=a.replace(new RegExp(domUtils.fillChar,"g"),""),b||(a=a.replace(new RegExp("[\\r\\t\\n"+(b?"":" ")+"]*?(\\w+)\\s*(?:[^>]*)>[\\r\\t\\n"+(b?"":" ")+"]*","g"),function(a,c){return c&&h[c.toLowerCase()]?a.replace(/(^[\n\r]+)|([\n\r]+$)/g,""):a.replace(new RegExp("^[\\r\\n"+(b?"":" ")+"]+"),"").replace(new RegExp("[\\r\\n"+(b?"":" ")+"]+$"),"")}));for(var i,j={href:1,src:1},k=UE.uNode,l={td:"tr",tr:["tbody","thead","tfoot"],tbody:"table",th:"tr",thead:"table",tfoot:"table",caption:"table",li:["ul","ol"],dt:"dl",dd:"dl",option:"select"},m={ol:"li",ul:"li"},n=0,o=0,p=new k({type:"root",children:[]}),q=p;i=f.exec(a);){n=i.index;try{if(n>o&&c(q,a.slice(o,n)),i[3])dtd.$cdata[q.tagName]?c(q,i[0]):q=d(q,i[3].toLowerCase(),i[4]);else if(i[1]){if("root"!=q.type)if(dtd.$cdata[q.tagName]&&!dtd.$cdata[i[1]])c(q,i[0]);else{for(var r=q;"element"==q.type&&q.tagName!=i[1].toLowerCase();)if(q=q.parentNode,"root"==q.type)throw q=r,"break";q=q.parentNode}}else i[2]&&e(q,i[2])}catch(s){}o=f.lastIndex}return o");break;case"div":if(b.getAttr("cdata_tag"))break;if(d=b.getAttr("class"),d&&/^line number\d+/.test(d))break;if(!e)break;for(var f,g=UE.uNode.createElement("p");f=b.firstChild();)"text"!=f.type&&UE.dom.dtd.$block[f.tagName]?g.firstChild()?(b.parentNode.insertBefore(g,b),g=UE.uNode.createElement("p")):b.parentNode.insertBefore(f,b):g.appendChild(f);g.firstChild()&&b.parentNode.insertBefore(g,b),b.parentNode.removeChild(b);break;case"dl":b.tagName="ul";break;case"dt":case"dd":b.tagName="li";break;case"li":var h=b.getAttr("class");h&&/list\-/.test(h)||b.setAttr();var i=b.getNodesByTagName("ol ul");UE.utils.each(i,function(a){b.parentNode.insertAfter(a,b)});break;case"td":case"th":case"caption":b.children&&b.children.length||b.appendChild(browser.ie11below?UE.uNode.createText(" "):UE.uNode.createElement("br"));break;case"table":a.options.disabledTableInTable&&c(b)&&(b.parentNode.insertBefore(UE.uNode.createText(b.innerText()),b),b.parentNode.removeChild(b))}}})}),a.addOutputRule(function(b){var c;b.traversal(function(b){if("element"==b.type){if(a.options.autoClearEmptyNode&&dtd.$inline[b.tagName]&&!dtd.$empty[b.tagName]&&(!b.attrs||utils.isEmptyObject(b.attrs)))return void(b.firstChild()?"span"!=b.tagName||b.attrs&&!utils.isEmptyObject(b.attrs)||b.parentNode.removeChild(b,!0):b.parentNode.removeChild(b));switch(b.tagName){case"div":(c=b.getAttr("cdata_tag"))&&(b.tagName=c,b.appendChild(UE.uNode.createText(b.getAttr("cdata_data"))),b.setAttr({cdata_tag:"",cdata_data:"",_ue_custom_node_:""}));break;case"a":(c=b.getAttr("_href"))&&b.setAttr({href:utils.html(c),_href:""});break;case"span":c=b.getAttr("id"),c&&/^_baidu_bookmark_/i.test(c)&&b.parentNode.removeChild(b);break;case"img":(c=b.getAttr("_src"))&&b.setAttr({src:b.getAttr("_src"),_src:""})}}})})},UE.commands.inserthtml={execCommand:function(a,b,c){var d,e,f=this;if(b&&f.fireEvent("beforeinserthtml",b)!==!0){if(d=f.selection.getRange(),e=d.document.createElement("div"),e.style.display="inline",!c){var g=UE.htmlparser(b);f.options.filterRules&&UE.filterNode(g,f.options.filterRules),f.filterInputRule(g),b=g.toHtml()}if(e.innerHTML=utils.trim(b),!d.collapsed){var h=d.startContainer;if(domUtils.isFillChar(h)&&d.setStartBefore(h),h=d.endContainer,domUtils.isFillChar(h)&&d.setEndAfter(h),d.txtToElmBoundary(),d.endContainer&&1==d.endContainer.nodeType&&(h=d.endContainer.childNodes[d.endOffset],h&&domUtils.isBr(h)&&d.setEndAfter(h)),0==d.startOffset&&(h=d.startContainer,domUtils.isBoundaryNode(h,"firstChild")&&(h=d.endContainer,d.endOffset==(3==h.nodeType?h.nodeValue.length:h.childNodes.length)&&domUtils.isBoundaryNode(h,"lastChild")&&(f.body.innerHTML=""+(browser.ie?"":" ")+"
",d.setStart(f.body.firstChild,0).collapse(!0)))),!d.collapsed&&d.deleteContents(),1==d.startContainer.nodeType){var i,j=d.startContainer.childNodes[d.startOffset];if(j&&domUtils.isBlockElm(j)&&(i=j.previousSibling)&&domUtils.isBlockElm(i)){for(d.setEnd(i,i.childNodes.length).collapse();j.firstChild;)i.appendChild(j.firstChild);domUtils.remove(j)}}}var j,k,i,l,m,n=0;d.inFillChar()&&(j=d.startContainer,domUtils.isFillChar(j)?(d.setStartBefore(j).collapse(!0),domUtils.remove(j)):domUtils.isFillChar(j,!0)&&(j.nodeValue=j.nodeValue.replace(fillCharReg,""),d.startOffset--,d.collapsed&&d.collapse(!0)));var o=domUtils.findParentByTagName(d.startContainer,"li",!0);if(o){for(var p,q;j=e.firstChild;){for(;j&&(3==j.nodeType||!domUtils.isBlockElm(j)||"HR"==j.tagName);)p=j.nextSibling,d.insertNode(j).collapse(),q=j,j=p;if(j)if(/^(ol|ul)$/i.test(j.tagName)){for(;j.firstChild;)q=j.firstChild,domUtils.insertAfter(o,j.firstChild),o=o.nextSibling;domUtils.remove(j)}else{var r;p=j.nextSibling,r=f.document.createElement("li"),domUtils.insertAfter(o,r),r.appendChild(j),q=j,j=p,o=r}}o=domUtils.findParentByTagName(d.startContainer,"li",!0),domUtils.isEmptyBlock(o)&&domUtils.remove(o),q&&d.setStartAfter(q).collapse(!0).select(!0)}else{for(;j=e.firstChild;){if(n){for(var s=f.document.createElement("p");j&&(3==j.nodeType||!dtd.$block[j.tagName]);)m=j.nextSibling,s.appendChild(j),j=m;s.firstChild&&(j=s)}if(d.insertNode(j),m=j.nextSibling,!n&&j.nodeType==domUtils.NODE_ELEMENT&&domUtils.isBlockElm(j)&&(k=domUtils.findParent(j,function(a){return domUtils.isBlockElm(a)}),k&&"body"!=k.tagName.toLowerCase()&&(!dtd[k.tagName][j.nodeName]||j.parentNode!==k))){if(dtd[k.tagName][j.nodeName])for(l=j.parentNode;l!==k;)i=l,l=l.parentNode;else i=k;domUtils.breakParent(j,i||l);var i=j.previousSibling;domUtils.trimWhiteTextNode(i),i.childNodes.length||domUtils.remove(i),!browser.ie&&(p=j.nextSibling)&&domUtils.isBlockElm(p)&&p.lastChild&&!domUtils.isBr(p.lastChild)&&p.appendChild(f.document.createElement("br")),n=1}var p=j.nextSibling;if(!e.firstChild&&p&&domUtils.isBlockElm(p)){d.setStart(p,0).collapse(!0);break}d.setEndAfter(j).collapse()}if(j=d.startContainer,m&&domUtils.isBr(m)&&domUtils.remove(m),domUtils.isBlockElm(j)&&domUtils.isEmptyNode(j))if(m=j.nextSibling)domUtils.remove(j),1==m.nodeType&&dtd.$block[m.tagName]&&d.setStart(m,0).collapse(!0).shrinkBoundary();else try{j.innerHTML=browser.ie?domUtils.fillChar:" "}catch(t){d.setStartBefore(j),domUtils.remove(j)}try{d.select(!0)}catch(t){}}setTimeout(function(){d=f.selection.getRange(),d.scrollToView(f.autoHeightEnabled,f.autoHeightEnabled?domUtils.getXY(f.iframe).y:0),f.fireEvent("afterinserthtml",b)},200)}}},UE.plugins.autotypeset=function(){function a(a,b){return a&&3!=a.nodeType?domUtils.isBr(a)?1:a&&a.parentNode&&l[a.tagName.toLowerCase()]?g&&g.contains(a)||a.getAttribute("pagebreak")?0:b?!domUtils.isEmptyBlock(a):domUtils.isEmptyBlock(a,new RegExp("[\\s"+domUtils.fillChar+"]","g")):void 0:0}function b(a){a.style.cssText||(domUtils.removeAttributes(a,["style"]),"span"==a.tagName.toLowerCase()&&domUtils.hasNoAttributes(a)&&domUtils.remove(a,!0))}function c(c,f){var h,l=this;if(f){if(!i.pasteFilter)return;h=l.document.createElement("div"),h.innerHTML=f.html}else h=l.document.body;for(var m,n=domUtils.getElementsByTagName(h,"*"),o=0;m=n[o++];)if(l.fireEvent("excludeNodeinautotype",m)!==!0){if(i.clearFontSize&&m.style.fontSize&&(domUtils.removeStyle(m,"font-size"),b(m)),i.clearFontFamily&&m.style.fontFamily&&(domUtils.removeStyle(m,"font-family"),b(m)),a(m)){if(i.mergeEmptyline)for(var p,q=m.nextSibling,r=domUtils.isBr(m);a(q)&&(p=q,q=p.nextSibling,!r||q&&(!q||domUtils.isBr(q)));)domUtils.remove(p);if(i.removeEmptyline&&domUtils.inDoc(m,h)&&!k[m.parentNode.tagName.toLowerCase()]){if(domUtils.isBr(m)&&(q=m.nextSibling,q&&!domUtils.isBr(q)))continue;domUtils.remove(m);continue}}if(a(m,!0)&&"SPAN"!=m.tagName&&(i.indent&&(m.style.textIndent=i.indentValue),i.textAlign&&(m.style.textAlign=i.textAlign)),i.removeClass&&m.className&&!j[m.className.toLowerCase()]){if(g&&g.contains(m))continue;domUtils.removeAttributes(m,["class"])}if(i.imageBlockLine&&"img"==m.tagName.toLowerCase()&&!m.getAttribute("emotion"))if(f){var s=m;switch(i.imageBlockLine){case"left":case"right":case"none":for(var p,t,q,u=s.parentNode;dtd.$inline[u.tagName]||"A"==u.tagName;)u=u.parentNode;if(p=u,"P"==p.tagName&&"center"==domUtils.getStyle(p,"text-align")&&!domUtils.isBody(p)&&1==domUtils.getChildCount(p,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)}))if(t=p.previousSibling,q=p.nextSibling,t&&q&&1==t.nodeType&&1==q.nodeType&&t.tagName==q.tagName&&domUtils.isBlockElm(t)){for(t.appendChild(p.firstChild);q.firstChild;)t.appendChild(q.firstChild);domUtils.remove(p),domUtils.remove(q)}else domUtils.setStyle(p,"text-align","");domUtils.setStyle(s,"float",i.imageBlockLine);break;case"center":if("center"!=l.queryCommandValue("imagefloat")){for(u=s.parentNode,domUtils.setStyle(s,"float","none"),p=s;u&&1==domUtils.getChildCount(u,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)})&&(dtd.$inline[u.tagName]||"A"==u.tagName);)p=u,u=u.parentNode;var v=l.document.createElement("p");domUtils.setAttributes(v,{style:"text-align:center"}),p.parentNode.insertBefore(v,p),v.appendChild(p),domUtils.setStyle(p,"float","")}}}else{var w=l.selection.getRange();w.selectNode(m).select(),l.execCommand("imagefloat",i.imageBlockLine)}i.removeEmptyNode&&i.removeTagNames[m.tagName.toLowerCase()]&&domUtils.hasNoAttributes(m)&&domUtils.isEmptyBlock(m)&&domUtils.remove(m)}if(i.tobdc){var x=UE.htmlparser(h.innerHTML);x.traversal(function(a){"text"==a.type&&(a.data=e(a.data))}),h.innerHTML=x.toHtml()}if(i.bdc2sb){var x=UE.htmlparser(h.innerHTML);x.traversal(function(a){"text"==a.type&&(a.data=d(a.data))}),h.innerHTML=x.toHtml()}f&&(f.html=h.innerHTML)}function d(a){for(var b="",c=0;c=65281&&d<=65373?String.fromCharCode(a.charCodeAt(c)-65248):12288==d?String.fromCharCode(a.charCodeAt(c)-12288+32):a.charAt(c)}return b}function e(a){a=utils.html(a);for(var b="",c=0;c0?e.substring(e.indexOf(d.options.imagePath),e.length-1).replace(/"|\(|\)/gi,""):"none"!=e?e.replace(/url\("?|"?\)/gi,""):"";var g=' ",b.push(g)},aftersetcontent:function(){0==c&&b()}},inputRule:function(d){c=!1,utils.each(d.getNodesByTagName("p"),function(d){var e=d.getAttr("data-background");e&&(c=!0,b(a(e)),d.parentNode.removeChild(d))})},outputRule:function(a){var b=this,c=(utils.cssRule(e,b.document)||"").replace(/[\n\r]+/g,"").match(f);c&&a.appendChild(UE.uNode.createElement('
'))},commands:{background:{execCommand:function(a,c){b(c)},queryCommandValue:function(){var b=this,c=(utils.cssRule(e,b.document)||"").replace(/[\n\r]+/g,"").match(f);return c?a(c[1]):null},notNeedUndo:!0}}}}),UE.commands.imagefloat={execCommand:function(a,b){var c=this,d=c.selection.getRange();if(!d.collapsed){var e=d.getClosedNode();if(e&&"IMG"==e.tagName)switch(b){case"left":case"right":case"none":for(var f,g,h,i=e.parentNode;dtd.$inline[i.tagName]||"A"==i.tagName;)i=i.parentNode;if(f=i,"P"==f.tagName&&"center"==domUtils.getStyle(f,"text-align")){if(!domUtils.isBody(f)&&1==domUtils.getChildCount(f,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)}))if(g=f.previousSibling,h=f.nextSibling,g&&h&&1==g.nodeType&&1==h.nodeType&&g.tagName==h.tagName&&domUtils.isBlockElm(g)){for(g.appendChild(f.firstChild);h.firstChild;)g.appendChild(h.firstChild);domUtils.remove(f),domUtils.remove(h)}else domUtils.setStyle(f,"text-align","");d.selectNode(e).select()}domUtils.setStyle(e,"float","none"==b?"":b),"none"==b&&domUtils.removeAttributes(e,"align");break;case"center":if("center"!=c.queryCommandValue("imagefloat")){for(i=e.parentNode,domUtils.setStyle(e,"float",""),domUtils.removeAttributes(e,"align"),f=e;i&&1==domUtils.getChildCount(i,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)})&&(dtd.$inline[i.tagName]||"A"==i.tagName);)f=i,i=i.parentNode;d.setStartBefore(f).setCursor(!1),i=c.document.createElement("div"),i.appendChild(f),domUtils.setStyle(f,"float",""),c.execCommand("insertHtml",''+i.innerHTML+"
"),f=c.document.getElementById("_img_parent_tmp"),f.removeAttribute("id"),f=f.firstChild,d.selectNode(f).select(),h=f.parentNode.nextSibling,h&&domUtils.isEmptyNode(h)&&domUtils.remove(h)}}}},queryCommandValue:function(){var a,b,c=this.selection.getRange();return c.collapsed?"none":(a=c.getClosedNode(),a&&1==a.nodeType&&"IMG"==a.tagName?(b=domUtils.getComputedStyle(a,"float")||a.getAttribute("align"),"none"==b&&(b="center"==domUtils.getComputedStyle(a.parentNode,"text-align")?"center":b),{left:1,right:1,center:1}[b]?b:"none"):"none")},queryCommandState:function(){var a,b=this.selection.getRange();return b.collapsed?-1:(a=b.getClosedNode(),a&&1==a.nodeType&&"IMG"==a.tagName?0:-1)}},UE.commands.insertimage={execCommand:function(a,b){function c(a){utils.each("width,height,border,hspace,vspace".split(","),function(b){a[b]&&(a[b]=parseInt(a[b],10)||0)}),utils.each("src,_src".split(","),function(b){a[b]&&(a[b]=utils.unhtmlForUrl(a[b]))}),utils.each("title,alt".split(","),function(b){a[b]&&(a[b]=utils.unhtml(a[b]))})}if(b=utils.isArray(b)?b:[b],b.length){var d=this,e=d.selection.getRange(),f=e.getClosedNode();if(d.fireEvent("beforeinsertimage",b)!==!0){if(!f||!/img/i.test(f.tagName)||"edui-faked-video"==f.className&&f.className.indexOf("edui-upload-video")==-1||f.getAttribute("word_img")){var g,h=[],i="";if(g=b[0],1==b.length)c(g),i=' ","center"==g.floatStyle&&(i=''+i+"
"),h.push(i);else for(var j=0;g=b[j++];)c(g),i="
",h.push(i);d.execCommand("insertHtml",h.join(""))}else{var k=b.shift(),l=k.floatStyle;delete k.floatStyle,domUtils.setAttributes(f,k),d.execCommand("imagefloat",l),b.length>0&&(e.setStartAfter(f).setCursor(!1,!0),d.execCommand("insertimage",b))}d.fireEvent("afterinsertimage",b)}}}},UE.plugins.justify=function(){var a=domUtils.isBlockElm,b={left:1,right:1,center:1,justify:1},c=function(b,c){var d=b.createBookmark(),e=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase()&&!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)};b.enlarge(!0);for(var f,g=b.createBookmark(),h=domUtils.getNextDomNode(g.start,!1,e),i=b.cloneRange();h&&!(domUtils.getPosition(h,g.end)&domUtils.POSITION_FOLLOWING);)if(3!=h.nodeType&&a(h))h=domUtils.getNextDomNode(h,!0,e);else{for(i.setStartBefore(h);h&&h!==g.end&&!a(h);)f=h,h=domUtils.getNextDomNode(h,!1,null,function(b){return!a(b)});i.setEndAfter(f);var j=i.getCommonAncestor();if(!domUtils.isBody(j)&&a(j))domUtils.setStyles(j,utils.isString(c)?{"text-align":c}:c),h=j;else{var k=b.document.createElement("p");domUtils.setStyles(k,utils.isString(c)?{"text-align":c}:c);var l=i.extractContents();k.appendChild(l),i.insertNode(k),h=k}h=domUtils.getNextDomNode(h,!1,e)}return b.moveToBookmark(g).moveToBookmark(d)};UE.commands.justify={execCommand:function(a,b){var d,e=this.selection.getRange();return e.collapsed&&(d=this.document.createTextNode("p"),e.insertNode(d)),c(e,b),d&&(e.setStartBefore(d).collapse(!0),domUtils.remove(d)),e.select(),!0},queryCommandValue:function(){var a=this.selection.getStart(),c=domUtils.getComputedStyle(a,"text-align");return b[c]?c:"left"},queryCommandState:function(){var a=this.selection.getStart(),b=a&&domUtils.findParentByTagName(a,["td","th","caption"],!0);return b?-1:0}}},UE.plugins.font=function(){function a(a){for(var b;(b=a.parentNode)&&"SPAN"==b.tagName&&1==domUtils.getChildCount(b,function(a){return!domUtils.isBookmarkNode(a)&&!domUtils.isBr(a)});)b.style.cssText+=a.style.cssText,domUtils.remove(a,!0),a=b}function b(a,b,c){if(g[b]&&(a.adjustmentBoundary(),!a.collapsed&&1==a.startContainer.nodeType)){var d=a.startContainer.childNodes[a.startOffset];if(d&&domUtils.isTagNode(d,"span")){var e=a.createBookmark();utils.each(domUtils.getElementsByTagName(d,"span"),function(a){a.parentNode&&!domUtils.isBookmarkNode(a)&&("backcolor"==b&&domUtils.getComputedStyle(a,"background-color").toLowerCase()===c||(domUtils.removeStyle(a,g[b]),0==a.style.cssText.replace(/^\s+$/,"").length&&domUtils.remove(a,!0)))}),a.moveToBookmark(e)}}}function c(c,d,e){var f,g=c.collapsed,h=c.createBookmark();if(g)for(f=h.start.parentNode;dtd.$inline[f.tagName];)f=f.parentNode;else f=domUtils.getCommonAncestor(h.start,h.end);utils.each(domUtils.getElementsByTagName(f,"span"),function(b){if(b.parentNode&&!domUtils.isBookmarkNode(b)){if(/\s*border\s*:\s*none;?\s*/i.test(b.style.cssText))return void(/^\s*border\s*:\s*none;?\s*$/.test(b.style.cssText)?domUtils.remove(b,!0):domUtils.removeStyle(b,"border"));if(/border/i.test(b.style.cssText)&&"SPAN"==b.parentNode.tagName&&/border/i.test(b.parentNode.style.cssText)&&(b.style.cssText=b.style.cssText.replace(/border[^:]*:[^;]+;?/gi,"")),"fontborder"!=d||"none"!=e)for(var c=b.nextSibling;c&&1==c.nodeType&&"SPAN"==c.tagName;)if(domUtils.isBookmarkNode(c)&&"fontborder"==d)b.appendChild(c),c=b.nextSibling;else{if(c.style.cssText==b.style.cssText&&(domUtils.moveChild(c,b),domUtils.remove(c)),b.nextSibling===c)break;c=b.nextSibling}if(a(b),browser.ie&&browser.version>8){var f=domUtils.findParent(b,function(a){return"SPAN"==a.tagName&&/background-color/.test(a.style.cssText)});f&&!/background-color/.test(b.style.cssText)&&(b.style.backgroundColor=f.style.backgroundColor)}}}),c.moveToBookmark(h),b(c,d,e)}var d=this,e={forecolor:"color",backcolor:"background-color",fontsize:"font-size",fontfamily:"font-family",underline:"text-decoration",strikethrough:"text-decoration",fontborder:"border"},f={underline:1,strikethrough:1,fontborder:1},g={forecolor:"color",backcolor:"background-color",fontsize:"font-size",fontfamily:"font-family"};d.setOpt({fontfamily:[{name:"songti",val:"宋体,SimSun"},{name:"yahei",val:"微软雅黑,Microsoft YaHei"},{name:"kaiti",val:"楷体,楷体_GB2312, SimKai"},{name:"heiti",val:"黑体, SimHei"},{name:"lishu",val:"隶书, SimLi"},{name:"andaleMono",val:"andale mono"},{name:"arial",val:"arial, helvetica,sans-serif"},{name:"arialBlack",val:"arial black,avant garde"},{name:"comicSansMs",val:"comic sans ms"},{name:"impact",val:"impact,chicago"},{name:"timesNewRoman",val:"times new roman"}],fontsize:[10,11,12,14,16,18,20,24,36]}),d.addInputRule(function(a){utils.each(a.getNodesByTagName("u s del font strike"),function(a){if("font"==a.tagName){var b=[];for(var c in a.attrs)switch(c){case"size":b.push("font-size:"+({1:"10",2:"12",3:"16",4:"18",5:"24",6:"32",7:"48"}[a.attrs[c]]||a.attrs[c])+"px");break;case"color":b.push("color:"+a.attrs[c]);break;case"face":b.push("font-family:"+a.attrs[c]);break;case"style":b.push(a.attrs[c])}a.attrs={style:b.join(";")}}else{var d="u"==a.tagName?"underline":"line-through";a.attrs={style:(a.getAttr("style")||"")+"text-decoration:"+d+";"}}a.tagName="span"})});for(var h in e)!function(a,b){UE.commands[a]={execCommand:function(d,e){e=e||(this.queryCommandState(d)?"none":"underline"==d?"underline":"fontborder"==d?"1px solid #000":"line-through");var g,h=this,i=this.selection.getRange();if("default"==e)i.collapsed&&(g=h.document.createTextNode("font"),i.insertNode(g).select()),h.execCommand("removeFormat","span,a",b),g&&(i.setStartBefore(g).collapse(!0),domUtils.remove(g)),c(i,d,e),i.select();else if(i.collapsed){var j=domUtils.findParentByTagName(i.startContainer,"span",!0);if(g=h.document.createTextNode("font"),!j||j.children.length||j[browser.ie?"innerText":"textContent"].replace(fillCharReg,"").length){if(i.insertNode(g),i.selectNode(g).select(),j=i.document.createElement("span"),f[a]){if(domUtils.findParentByTagName(g,"a",!0))return i.setStartBefore(g).setCursor(),void domUtils.remove(g);h.execCommand("removeFormat","span,a",b)}if(j.style.cssText=b+":"+e,g.parentNode.insertBefore(j,g),!browser.ie||browser.ie&&9==browser.version)for(var k=j.parentNode;!domUtils.isBlockElm(k);)"SPAN"==k.tagName&&(j.style.cssText=k.style.cssText+";"+j.style.cssText),k=k.parentNode;opera?setTimeout(function(){i.setStart(j,0).collapse(!0),c(i,d,e),i.select()}):(i.setStart(j,0).collapse(!0),c(i,d,e),i.select())}else i.insertNode(g),f[a]&&(i.selectNode(g).select(),h.execCommand("removeFormat","span,a",b,null),j=domUtils.findParentByTagName(g,"span",!0),i.setStartBefore(g)),j&&(j.style.cssText+=";"+b+":"+e),i.collapse(!0).select();domUtils.remove(g)}else f[a]&&h.queryCommandValue(a)&&h.execCommand("removeFormat","span,a",b),i=h.selection.getRange(),i.applyInlineStyle("span",{style:b+":"+e}),c(i,d,e),i.select();return!0},queryCommandValue:function(a){var c=this.selection.getStart();if("underline"==a||"strikethrough"==a){for(var d,e=c;e&&!domUtils.isBlockElm(e)&&!domUtils.isBody(e);){if(1==e.nodeType&&(d=domUtils.getComputedStyle(e,b),"none"!=d))return d;e=e.parentNode}return"none"}if("fontborder"==a){for(var f,g=c;g&&dtd.$inline[g.tagName];){if((f=domUtils.getComputedStyle(g,"border"))&&/1px/.test(f)&&/solid/.test(f))return f;g=g.parentNode}return""}if("FontSize"==a){var h=domUtils.getComputedStyle(c,b),g=/^([\d\.]+)(\w+)$/.exec(h);return g?Math.floor(g[1])+g[2]:h}return domUtils.getComputedStyle(c,b)},queryCommandState:function(a){if(!f[a])return 0;var b=this.queryCommandValue(a);return"fontborder"==a?/1px/.test(b)&&/solid/.test(b):"underline"==a?/underline/.test(b):/line\-through/.test(b)}}}(h,e[h])},UE.plugins.link=function(){function a(a){var b=a.startContainer,c=a.endContainer;(b=domUtils.findParentByTagName(b,"a",!0))&&a.setStartBefore(b),(c=domUtils.findParentByTagName(c,"a",!0))&&a.setEndAfter(c)}function b(b,c,d){var e=b.cloneRange(),f=d.queryCommandValue("link");a(b=b.adjustmentBoundary());var g=b.startContainer;if(1==g.nodeType&&f&&(g=g.childNodes[b.startOffset],g&&1==g.nodeType&&"A"==g.tagName&&/^(?:https?|ftp|file)\s*:\s*\/\//.test(g[browser.ie?"innerText":"textContent"])&&(g[browser.ie?"innerText":"textContent"]=utils.html(c.textValue||c.href))),e.collapsed&&!f||(b.removeInlineStyle("a"),e=b.cloneRange()),e.collapsed){var h=b.document.createElement("a"),i="";c.textValue?(i=utils.html(c.textValue),delete c.textValue):i=utils.html(c.href),domUtils.setAttributes(h,c),g=domUtils.findParentByTagName(e.startContainer,"a",!0),g&&domUtils.isInNodeEndBoundary(e,g)&&b.setStartAfter(g).collapse(!0),h[browser.ie?"innerText":"textContent"]=i,b.insertNode(h).selectNode(h)}else b.applyInlineStyle("a",c)}UE.commands.unlink={execCommand:function(){var b,c=this.selection.getRange();c.collapsed&&!domUtils.findParentByTagName(c.startContainer,"a",!0)||(b=c.createBookmark(),a(c),c.removeInlineStyle("a").moveToBookmark(b).select())},queryCommandState:function(){return!this.highlight&&this.queryCommandValue("link")?0:-1}},UE.commands.link={execCommand:function(a,c){var d;c._href&&(c._href=utils.unhtml(c._href,/[<">]/g)),c.href&&(c.href=utils.unhtml(c.href,/[<">]/g)),c.textValue&&(c.textValue=utils.unhtml(c.textValue,/[<">]/g)),b(d=this.selection.getRange(),c,this),d.collapse().select(!0)},queryCommandValue:function(){var a,b=this.selection.getRange();if(!b.collapsed){b.shrinkBoundary();var c=3!=b.startContainer.nodeType&&b.startContainer.childNodes[b.startOffset]?b.startContainer.childNodes[b.startOffset]:b.startContainer,d=3==b.endContainer.nodeType||0==b.endOffset?b.endContainer:b.endContainer.childNodes[b.endOffset-1],e=b.getCommonAncestor();if(a=domUtils.findParentByTagName(e,"a",!0),!a&&1==e.nodeType)for(var f,g,h,i=e.getElementsByTagName("a"),j=0;h=i[j++];)if(f=domUtils.getPosition(h,c),g=domUtils.getPosition(h,d),(f&domUtils.POSITION_FOLLOWING||f&domUtils.POSITION_CONTAINS)&&(g&domUtils.POSITION_PRECEDING||g&domUtils.POSITION_CONTAINS)){a=h;break}return a}if(a=b.startContainer,a=1==a.nodeType?a:a.parentNode,a&&(a=domUtils.findParentByTagName(a,"a",!0))&&!domUtils.isInNodeEndBoundary(b,a))return a},queryCommandState:function(){var a=this.selection.getRange().getClosedNode(),b=a&&("edui-faked-video"==a.className||a.className.indexOf("edui-upload-video")!=-1);return b?-1:0}}},UE.plugins.insertframe=function(){function a(){b._iframe&&delete b._iframe}var b=this;b.addListener("selectionchange",function(){a()})},UE.commands.scrawl={queryCommandState:function(){return browser.ie&&browser.version<=8?-1:0}},UE.plugins.removeformat=function(){var a=this;a.setOpt({removeFormatTags:"b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var",removeFormatAttributes:"class,style,lang,width,height,align,hspace,valign"}),a.commands.removeformat={execCommand:function(a,b,c,d,e){function f(a){if(3==a.nodeType||"span"!=a.tagName.toLowerCase())return 0;if(browser.ie){var b=a.attributes;if(b.length){for(var c=0,d=b.length;c"+this.getContent(null,null,!0)+"
"),b.close()},notNeedUndo:1},UE.plugins.selectall=function(){var a=this;a.commands.selectall={execCommand:function(){var a=this,b=a.body,c=a.selection.getRange();c.selectNodeContents(b),domUtils.isEmptyBlock(b)&&(browser.opera&&b.firstChild&&1==b.firstChild.nodeType&&c.setStartAtFirst(b.firstChild),c.collapse(!0)),c.select(!0)},notNeedUndo:1},a.addshortcutkey({selectAll:"ctrl+65"})},UE.plugins.paragraph=function(){var a=this,b=domUtils.isBlockElm,c=["TD","LI","PRE"],d=function(a,d,e,f){var g,h=a.createBookmark(),i=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase()&&!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)};a.enlarge(!0);for(var j,k=a.createBookmark(),l=domUtils.getNextDomNode(k.start,!1,i),m=a.cloneRange();l&&!(domUtils.getPosition(l,k.end)&domUtils.POSITION_FOLLOWING);)if(3!=l.nodeType&&b(l))l=domUtils.getNextDomNode(l,!0,i);else{for(m.setStartBefore(l);l&&l!==k.end&&!b(l);)j=l,l=domUtils.getNextDomNode(l,!1,null,function(a){return!b(a)});m.setEndAfter(j),g=a.document.createElement(d),e&&(domUtils.setAttributes(g,e),f&&"customstyle"==f&&e.style&&(g.style.cssText=e.style)),g.appendChild(m.extractContents()),domUtils.isEmptyNode(g)&&domUtils.fillChar(a.document,g),m.insertNode(g);var n=g.parentNode;b(n)&&!domUtils.isBody(g.parentNode)&&utils.indexOf(c,n.tagName)==-1&&(f&&"customstyle"==f||(n.getAttribute("dir")&&g.setAttribute("dir",n.getAttribute("dir")),n.style.cssText&&(g.style.cssText=n.style.cssText+";"+g.style.cssText),n.style.textAlign&&!g.style.textAlign&&(g.style.textAlign=n.style.textAlign),n.style.textIndent&&!g.style.textIndent&&(g.style.textIndent=n.style.textIndent),n.style.padding&&!g.style.padding&&(g.style.padding=n.style.padding)),e&&/h\d/i.test(n.tagName)&&!/h\d/i.test(g.tagName)?(domUtils.setAttributes(n,e),f&&"customstyle"==f&&e.style&&(n.style.cssText=e.style),domUtils.remove(g,!0),g=n):domUtils.remove(g.parentNode,!0)),l=utils.indexOf(c,n.tagName)!=-1?n:g,l=domUtils.getNextDomNode(l,!1,i)}return a.moveToBookmark(k).moveToBookmark(h)};a.setOpt("paragraph",{p:"",h1:"",h2:"",h3:"",h4:"",h5:"",h6:""}),a.commands.paragraph={execCommand:function(a,b,c,e){var f=this.selection.getRange();if(f.collapsed){var g=this.document.createTextNode("p");if(f.insertNode(g),browser.ie){var h=g.previousSibling;h&&domUtils.isWhitespace(h)&&domUtils.remove(h),h=g.nextSibling,h&&domUtils.isWhitespace(h)&&domUtils.remove(h)}}if(f=d(f,b,c,e),g&&(f.setStartBefore(g).collapse(!0),pN=g.parentNode,domUtils.remove(g),domUtils.isBlockElm(pN)&&domUtils.isEmptyNode(pN)&&domUtils.fillNode(this.document,pN)),browser.gecko&&f.collapsed&&1==f.startContainer.nodeType){var i=f.startContainer.childNodes[f.startOffset];i&&1==i.nodeType&&i.tagName.toLowerCase()==b&&f.setStart(i,0).collapse(!0)}return f.select(),!0},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),"p h1 h2 h3 h4 h5 h6");return a?a.tagName.toLowerCase():""}}},function(){var a=domUtils.isBlockElm,b=function(a){return domUtils.filterNodeList(a.selection.getStartElementPath(),function(a){return a&&1==a.nodeType&&a.getAttribute("dir")})},c=function(c,d,e){var f,g=function(a){return 1==a.nodeType?!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)},h=b(d);if(h&&c.collapsed)return h.setAttribute("dir",e),c;f=c.createBookmark(),c.enlarge(!0);for(var i,j=c.createBookmark(),k=domUtils.getNextDomNode(j.start,!1,g),l=c.cloneRange();k&&!(domUtils.getPosition(k,j.end)&domUtils.POSITION_FOLLOWING);)if(3!=k.nodeType&&a(k))k=domUtils.getNextDomNode(k,!0,g);else{for(l.setStartBefore(k);k&&k!==j.end&&!a(k);)i=k,k=domUtils.getNextDomNode(k,!1,null,function(b){return!a(b)});l.setEndAfter(i);var m=l.getCommonAncestor();if(!domUtils.isBody(m)&&a(m))m.setAttribute("dir",e),k=m;else{var n=c.document.createElement("p");n.setAttribute("dir",e);var o=l.extractContents();n.appendChild(o),l.insertNode(n),k=n}k=domUtils.getNextDomNode(k,!1,g)}return c.moveToBookmark(j).moveToBookmark(f)};UE.commands.directionality={execCommand:function(a,b){var d=this.selection.getRange();if(d.collapsed){var e=this.document.createTextNode("d");d.insertNode(e)}return c(d,this,b),e&&(d.setStartBefore(e).collapse(!0),domUtils.remove(e)),d.select(),!0},queryCommandValue:function(){var a=b(this);return a?a.getAttribute("dir"):"ltr"}}}(),UE.plugins.horizontal=function(){var a=this;a.commands.horizontal={execCommand:function(a){var b=this;if(b.queryCommandState(a)!==-1){b.execCommand("insertHtml"," ");var c=b.selection.getRange(),d=c.startContainer;if(1==d.nodeType&&!d.childNodes[c.startOffset]){var e;(e=d.childNodes[c.startOffset-1])&&1==e.nodeType&&"HR"==e.tagName&&("p"==b.options.enterTag?(e=b.document.createElement("p"),c.insertNode(e),c.setStart(e,0).setCursor()):(e=b.document.createElement("br"),c.insertNode(e),c.setStartBefore(e).setCursor()))}return!0}},queryCommandState:function(){return domUtils.filterNodeList(this.selection.getStartElementPath(),"table")?-1:0}},a.addListener("delkeydown",function(a,b){var c=this.selection.getRange();if(c.txtToElmBoundary(!0),domUtils.isStartInblock(c)){var d=c.startContainer,e=d.previousSibling;if(e&&domUtils.isTagNode(e,"hr"))return domUtils.remove(e),c.select(),domUtils.preventDefault(b),!0}})},UE.commands.time=UE.commands.date={execCommand:function(a,b){function c(a,b){var c=("0"+a.getHours()).slice(-2),d=("0"+a.getMinutes()).slice(-2),e=("0"+a.getSeconds()).slice(-2);return b=b||"hh:ii:ss",b.replace(/hh/gi,c).replace(/ii/gi,d).replace(/ss/gi,e)}function d(a,b){var c=("000"+a.getFullYear()).slice(-4),d=c.slice(-2),e=("0"+(a.getMonth()+1)).slice(-2),f=("0"+a.getDate()).slice(-2);return b=b||"yyyy-mm-dd",b.replace(/yyyy/gi,c).replace(/yy/gi,d).replace(/mm/gi,e).replace(/dd/gi,f)}var e=new Date;this.execCommand("insertHtml","time"==a?c(e,b):d(e,b))}},UE.plugins.rowspacing=function(){var a=this;a.setOpt({rowspacingtop:["5","10","15","20","25"],rowspacingbottom:["5","10","15","20","25"]}),a.commands.rowspacing={execCommand:function(a,b,c){return this.execCommand("paragraph","p",{style:"margin-"+c+":"+b+"px"}),!0},queryCommandValue:function(a,b){var c,d=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return domUtils.isBlockElm(a)});return d?(c=domUtils.getComputedStyle(d,"margin-"+b).replace(/[^\d]/g,""),c?c:0):0}}},UE.plugins.lineheight=function(){var a=this;a.setOpt({lineheight:["1","1.5","1.75","2","3","4","5"]}),a.commands.lineheight={execCommand:function(a,b){return this.execCommand("paragraph","p",{style:"line-height:"+("1"==b?"normal":b+"em")}),!0},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return domUtils.isBlockElm(a)});if(a){var b=domUtils.getComputedStyle(a,"line-height");return"normal"==b?1:b.replace(/[^\d.]*/gi,"")}}}},UE.plugins.insertcode=function(){var a=this;a.ready(function(){utils.cssRule("pre","pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}",a.document)}),a.setOpt("insertcode",{as3:"ActionScript3",bash:"Bash/Shell",cpp:"C/C++",css:"Css",cf:"CodeFunction","c#":"C#",delphi:"Delphi",diff:"Diff",erlang:"Erlang",groovy:"Groovy",html:"Html",java:"Java",jfx:"JavaFx",js:"Javascript",pl:"Perl",php:"Php",plain:"Plain Text",ps:"PowerShell",python:"Python",ruby:"Ruby",scala:"Scala",sql:"Sql",vb:"Vb",xml:"Xml"}),a.commands.insertcode={execCommand:function(a,b){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e)e.className="brush:"+b+";toolbar:false;";else{var f="";if(d.collapsed)f=browser.ie&&browser.ie11below?browser.version<=8?" ":"":" ";else{var g=d.extractContents(),h=c.document.createElement("div");h.appendChild(g),utils.each(UE.filterNode(UE.htmlparser(h.innerHTML.replace(/[\r\t]/g,"")),c.options.filterTxtRules).children,function(a){if(browser.ie&&browser.ie11below&&browser.version>8)"element"==a.type?"br"==a.tagName?f+="\n":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="\n":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/\n$/.test(f)||(f+="\n")):f+=a.data+"\n",!a.nextSibling()&&/\n$/.test(f)&&(f=f.replace(/\n$/,""));else if(browser.ie&&browser.ie11below)"element"==a.type?"br"==a.tagName?f+=" ":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+=" ":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/br>$/.test(f)||(f+=" ")):f+=a.data+" ",!a.nextSibling()&&/ $/.test(f)&&(f=f.replace(/ $/,""));else if(f+="element"==a.type?dtd.$empty[a.tagName]?"":a.innerText():a.data,!/br\/?\s*>$/.test(f)){if(!a.nextSibling())return;f+=" "}})}c.execCommand("inserthtml",''+f+" ",!0),e=c.document.getElementById("coder"),domUtils.removeAttributes(e,"id");var i=e.previousSibling;i&&(3==i.nodeType&&1==i.nodeValue.length&&browser.ie&&6==browser.version||domUtils.isEmptyBlock(i))&&domUtils.remove(i);var d=c.selection.getRange();domUtils.isEmptyBlock(e)?d.setStart(e,0).setCursor(!1,!0):d.selectNodeContents(e).select()}},queryCommandValue:function(){var a=this.selection.getStartElementPath(),b="";return utils.each(a,function(a){if("PRE"==a.nodeName){var c=a.className.match(/brush:([^;]+)/);return b=c&&c[1]?c[1]:"",!1}}),b}},a.addInputRule(function(a){utils.each(a.getNodesByTagName("pre"),function(a){var b=a.getNodesByTagName("br");if(b.length)return void(browser.ie&&browser.ie11below&&browser.version>8&&utils.each(b,function(a){var b=UE.uNode.createText("\n");a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}));if(!(browser.ie&&browser.ie11below&&browser.version>8)){var c=a.innerText().split(/\n/);a.innerHTML(""),utils.each(c,function(b){b.length&&a.appendChild(UE.uNode.createText(b)),a.appendChild(UE.uNode.createElement("br"))})}})}),a.addOutputRule(function(a){utils.each(a.getNodesByTagName("pre"),function(a){var b="";utils.each(a.children,function(a){b+="text"==a.type?a.data.replace(/[ ]/g," ").replace(/\n$/,""):"br"==a.tagName?"\n":dtd.$empty[a.tagName]?a.innerText():""}),a.innerText(b.replace(/( |\n)+$/,""))})}),a.notNeedCodeQuery={help:1,undo:1,redo:1,source:1,print:1,searchreplace:1,fullscreen:1,preview:1,insertparagraph:1,elementpath:1,insertcode:1,inserthtml:1,selectall:1};a.queryCommandState;a.queryCommandState=function(a){var b=this;return!b.notNeedCodeQuery[a.toLowerCase()]&&b.selection&&b.queryCommandValue("insertcode")?-1:UE.Editor.prototype.queryCommandState.apply(this,arguments)},a.addListener("beforeenterkeydown",function(){var b=a.selection.getRange(),c=domUtils.findParentByTagName(b.startContainer,"pre",!0);if(c){if(a.fireEvent("saveScene"),b.collapsed||b.deleteContents(),!browser.ie||browser.ie9above){var c,d=a.document.createElement("br");b.insertNode(d).setStartAfter(d).collapse(!0);var e=d.nextSibling;e||browser.ie&&!(browser.version>10)?b.setStartAfter(d):b.insertNode(d.cloneNode(!1)),
-c=d.previousSibling;for(var f;c;)if(f=c,c=c.previousSibling,!c||"BR"==c.nodeName){c=f;break}if(c){for(var g="";c&&"BR"!=c.nodeName&&new RegExp("^[\\s"+domUtils.fillChar+"]*$").test(c.nodeValue);)g+=c.nodeValue,c=c.nextSibling;if("BR"!=c.nodeName){var h=c.nodeValue.match(new RegExp("^([\\s"+domUtils.fillChar+"]+)"));h&&h[1]&&(g+=h[1])}g&&(g=a.document.createTextNode(g),b.insertNode(g).setStartAfter(g))}b.collapse(!0).select(!0)}else if(browser.version>8){var i=a.document.createTextNode("\n"),j=b.startContainer;if(0==b.startOffset){var k=j.previousSibling;if(k){b.insertNode(i);var l=a.document.createTextNode(" ");b.setStartAfter(i).insertNode(l).setStart(l,0).collapse(!0).select(!0)}}else{b.insertNode(i).setStartAfter(i);var l=a.document.createTextNode(" ");j=b.startContainer.childNodes[b.startOffset],j&&!/^\n/.test(j.nodeValue)&&b.setStartBefore(i),b.insertNode(l).setStart(l,0).collapse(!0).select(!0)}}else{var d=a.document.createElement("br");b.insertNode(d),b.insertNode(a.document.createTextNode(domUtils.fillChar)),b.setStartAfter(d),c=d.previousSibling;for(var f;c;)if(f=c,c=c.previousSibling,!c||"BR"==c.nodeName){c=f;break}if(c){for(var g="";c&&"BR"!=c.nodeName&&new RegExp("^[ "+domUtils.fillChar+"]*$").test(c.nodeValue);)g+=c.nodeValue,c=c.nextSibling;if("BR"!=c.nodeName){var h=c.nodeValue.match(new RegExp("^([ "+domUtils.fillChar+"]+)"));h&&h[1]&&(g+=h[1])}g=a.document.createTextNode(g),b.insertNode(g).setStartAfter(g)}b.collapse(!0).select()}return a.fireEvent("saveScene"),!0}}),a.addListener("tabkeydown",function(b,c){var d=a.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e){if(a.fireEvent("saveScene"),c.shiftKey);else if(d.collapsed){var f=a.document.createTextNode(" ");d.insertNode(f).setStartAfter(f).collapse(!0).select(!0)}else{for(var g=d.createBookmark(),h=g.start.previousSibling;h;){if(e.firstChild===h&&!domUtils.isBr(h)){e.insertBefore(a.document.createTextNode(" "),h);break}if(domUtils.isBr(h)){e.insertBefore(a.document.createTextNode(" "),h.nextSibling);break}h=h.previousSibling}var i=g.end;for(h=g.start.nextSibling,e.firstChild===g.start&&e.insertBefore(a.document.createTextNode(" "),h.nextSibling);h&&h!==i;){if(domUtils.isBr(h)&&h.nextSibling){if(h.nextSibling===i)break;e.insertBefore(a.document.createTextNode(" "),h.nextSibling)}h=h.nextSibling}d.moveToBookmark(g).select()}return a.fireEvent("saveScene"),!0}}),a.addListener("beforeinserthtml",function(a,b){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e){d.collapsed||d.deleteContents();var f="";if(browser.ie&&browser.version>8){utils.each(UE.filterNode(UE.htmlparser(b),c.options.filterTxtRules).children,function(a){"element"==a.type?"br"==a.tagName?f+="\n":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="\n":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/\n$/.test(f)||(f+="\n")):f+=a.data+"\n",!a.nextSibling()&&/\n$/.test(f)&&(f=f.replace(/\n$/,""))});var g=c.document.createTextNode(utils.html(f.replace(/ /g," ")));d.insertNode(g).selectNode(g).select()}else{var h=c.document.createDocumentFragment();utils.each(UE.filterNode(UE.htmlparser(b),c.options.filterTxtRules).children,function(a){"element"==a.type?"br"==a.tagName?h.appendChild(c.document.createElement("br")):dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?h.appendChild(c.document.createElement("br")):dtd.$empty[a.tagName]||h.appendChild(c.document.createTextNode(utils.html(b.innerText().replace(/ /g," ")))):h.appendChild(c.document.createTextNode(utils.html(b.data.replace(/ /g," "))))}),"BR"!=h.lastChild.nodeName&&h.appendChild(c.document.createElement("br"))):h.appendChild(c.document.createTextNode(utils.html(a.data.replace(/ /g," ")))),a.nextSibling()||"BR"!=h.lastChild.nodeName||h.removeChild(h.lastChild)}),d.insertNode(h).select()}return!0}}),a.addListener("keydown",function(a,b){var c=this,d=b.keyCode||b.which;if(40==d){var e,f=c.selection.getRange(),g=f.startContainer;if(f.collapsed&&(e=domUtils.findParentByTagName(f.startContainer,"pre",!0))&&!e.nextSibling){for(var h=e.lastChild;h&&"BR"==h.nodeName;)h=h.previousSibling;(h===g||f.startContainer===e&&f.startOffset==e.childNodes.length)&&(c.execCommand("insertparagraph"),domUtils.preventDefault(b))}}}),a.addListener("delkeydown",function(b,c){var d=this.selection.getRange();d.txtToElmBoundary(!0);var e=d.startContainer;if(domUtils.isTagNode(e,"pre")&&d.collapsed&&domUtils.isStartInblock(d)){var f=a.document.createElement("p");return domUtils.fillNode(a.document,f),e.parentNode.insertBefore(f,e),domUtils.remove(e),d.setStart(f,0).setCursor(!1,!0),domUtils.preventDefault(c),!0}})},UE.commands.cleardoc={execCommand:function(a){var b=this,c=b.options.enterTag,d=b.selection.getRange();"br"==c?(b.body.innerHTML=" ",d.setStart(b.body,0).setCursor()):(b.body.innerHTML=""+(ie?"":" ")+"
",d.setStart(b.body.firstChild,0).setCursor(!1,!0)),setTimeout(function(){b.fireEvent("clearDoc")},0)}},UE.plugin.register("anchor",function(){return{bindEvents:{ready:function(){utils.cssRule("anchor",".anchorclass{background: url('"+this.options.themePath+this.options.theme+"/images/anchor.gif') no-repeat scroll left center transparent;cursor: auto;display: inline-block;height: 16px;width: 15px;}",this.document)}},outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){var b;(b=a.getAttr("anchorname"))&&(a.tagName="a",a.setAttr({anchorname:"",name:b,"class":""}))})},inputRule:function(a){utils.each(a.getNodesByTagName("a"),function(a){var b;(b=a.getAttr("name"))&&!a.getAttr("href")&&(a.tagName="img",a.setAttr({anchorname:a.getAttr("name"),"class":"anchorclass"}),a.setAttr("name"))})},commands:{anchor:{execCommand:function(a,b){var c=this.selection.getRange(),d=c.getClosedNode();if(d&&d.getAttribute("anchorname"))b?d.setAttribute("anchorname",b):(c.setStartBefore(d).setCursor(),domUtils.remove(d));else if(b){var e=this.document.createElement("img");c.collapse(!0),domUtils.setAttributes(e,{anchorname:b,"class":"anchorclass"}),c.insertNode(e).setStartAfter(e).setCursor(!1,!0)}}}}}}),UE.plugins.wordcount=function(){var a=this;a.setOpt("wordCount",!0),a.addListener("contentchange",function(){a.fireEvent("wordcount")});var b;a.addListener("ready",function(){var a=this;domUtils.on(a.body,"keyup",function(c){var d=c.keyCode||c.which,e={16:1,18:1,20:1,37:1,38:1,39:1,40:1};d in e||(clearTimeout(b),b=setTimeout(function(){a.fireEvent("wordcount")},200))})})},UE.plugins.pagebreak=function(){function a(a){if(domUtils.isEmptyBlock(a)){for(var b,d=a.firstChild;d&&1==d.nodeType&&domUtils.isEmptyBlock(d);)b=d,d=d.firstChild;!b&&(b=a),domUtils.fillNode(c.document,b)}}function b(a){return a&&1==a.nodeType&&"HR"==a.tagName&&"pagebreak"==a.className}var c=this,d=["td"];c.setOpt("pageBreakTag","_ueditor_page_break_tag_"),c.ready(function(){utils.cssRule("pagebreak",".pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}",c.document)}),c.addInputRule(function(a){a.traversal(function(a){if("text"==a.type&&a.data==c.options.pageBreakTag){var b=UE.uNode.createElement(' ');a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}})}),c.addOutputRule(function(a){utils.each(a.getNodesByTagName("hr"),function(a){if("pagebreak"==a.getAttr("class")){var b=UE.uNode.createText(c.options.pageBreakTag);a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}})}),c.commands.pagebreak={execCommand:function(){var e=c.selection.getRange(),f=c.document.createElement("hr");domUtils.setAttributes(f,{"class":"pagebreak",noshade:"noshade",size:"5"}),domUtils.unSelectable(f);var g,h=domUtils.findParentByTagName(e.startContainer,d,!0),i=[];if(h)switch(h.tagName){case"TD":if(g=h.parentNode,g.previousSibling)g.parentNode.insertBefore(f,g),i=domUtils.findParents(f);else{var j=domUtils.findParentByTagName(g,"table");j.parentNode.insertBefore(f,j),i=domUtils.findParents(f,!0)}g=i[1],f!==g&&domUtils.breakParent(f,g),c.fireEvent("afteradjusttable",c.document)}else{if(!e.collapsed){e.deleteContents();for(var k=e.startContainer;!domUtils.isBody(k)&&domUtils.isBlockElm(k)&&domUtils.isEmptyNode(k);)e.setStartBefore(k).collapse(!0),domUtils.remove(k),k=e.startContainer}e.insertNode(f);for(var l,g=f.parentNode;!domUtils.isBody(g);)domUtils.breakParent(f,g),l=f.nextSibling,l&&domUtils.isEmptyBlock(l)&&domUtils.remove(l),g=f.parentNode;l=f.nextSibling;var m=f.previousSibling;if(b(m)?domUtils.remove(m):m&&a(m),l)b(l)?domUtils.remove(l):a(l),e.setEndAfter(f).collapse(!1);else{var n=c.document.createElement("p");f.parentNode.appendChild(n),domUtils.fillNode(c.document,n),e.setStart(n,0).collapse(!0)}e.select(!0)}}}},UE.plugin.register("wordimage",function(){var a=this,b=[];return{commands:{wordimage:{execCommand:function(){for(var b,c=domUtils.getElementsByTagName(a.body,"img"),d=[],e=0;b=c[e++];){var f=b.getAttribute("word_img");f&&d.push(f)}return d},queryCommandState:function(){b=domUtils.getElementsByTagName(a.body,"img");for(var c,d=0;c=b[d++];)if(c.getAttribute("word_img"))return 1;return-1},notNeedUndo:!0}},inputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c=b.attrs,d=parseInt(c.width)<128||parseInt(c.height)<43,e=a.options,f=e.UEDITOR_HOME_URL+"themes/default/images/spacer.gif";c.src&&/^(?:(file:\/+))/.test(c.src)&&b.setAttr({width:c.width,height:c.height,alt:c.alt,word_img:c.src,src:f,style:"background:url("+(d?e.themePath+e.theme+"/images/word.gif":e.langPath+e.lang+"/images/localimage.png")+") no-repeat center center;border:1px solid #ddd"})})}}}),UE.plugins.dragdrop=function(){var a=this;a.ready(function(){domUtils.on(this.body,"dragend",function(){var b=a.selection.getRange(),c=b.getClosedNode()||a.selection.getStart();if(c&&"IMG"==c.tagName){for(var d,e=c.previousSibling;(d=c.nextSibling)&&1==d.nodeType&&"SPAN"==d.tagName&&!d.firstChild;)domUtils.remove(d);(!e||1!=e.nodeType||domUtils.isEmptyBlock(e))&&e||d&&(!d||domUtils.isEmptyBlock(d))||(e&&"P"==e.tagName&&!domUtils.isEmptyBlock(e)?(e.appendChild(c),domUtils.moveChild(d,e),domUtils.remove(d)):d&&"P"==d.tagName&&!domUtils.isEmptyBlock(d)&&d.insertBefore(c,d.firstChild),e&&"P"==e.tagName&&domUtils.isEmptyBlock(e)&&domUtils.remove(e),d&&"P"==d.tagName&&domUtils.isEmptyBlock(d)&&domUtils.remove(d),b.selectNode(c).select(),a.fireEvent("saveScene"))}})}),a.addListener("keyup",function(b,c){var d=c.keyCode||c.which;if(13==d){var e,f=a.selection.getRange();(e=domUtils.findParentByTagName(f.startContainer,"p",!0))&&"center"==domUtils.getComputedStyle(e,"text-align")&&domUtils.removeStyle(e,"text-align")}})},UE.plugins.undo=function(){function a(a,b){if(a.length!=b.length)return 0;for(var c=0,d=a.length;cf&&this.list.shift(),this.index=this.list.length-1,this.clearKey(),this.update())},this.update=function(){this.hasRedo=!!this.list[this.index+1],this.hasUndo=!!this.list[this.index-1]},this.reset=function(){this.list=[],this.index=0,this.hasUndo=!1,this.hasRedo=!1,this.clearKey()},this.clearKey=function(){m=0,k=null}}var d,e=this,f=e.options.maxUndoCount||20,g=e.options.maxInputCount||20,h=new RegExp(domUtils.fillChar+"|","gi"),i={ol:1,ul:1,table:1,tbody:1,tr:1,body:1},j=e.options.autoClearEmptyNode;e.undoManger=new c,e.undoManger.editor=e,e.addListener("saveScene",function(){var a=Array.prototype.splice.call(arguments,1);this.undoManger.save.apply(this.undoManger,a)}),e.addListener("reset",function(a,b){b||this.undoManger.reset()}),e.commands.redo=e.commands.undo={execCommand:function(a){this.undoManger[a]()},queryCommandState:function(a){return this.undoManger["has"+("undo"==a.toLowerCase()?"Undo":"Redo")]?0:-1},notNeedUndo:1};var k,l={16:1,17:1,18:1,37:1,38:1,39:1,40:1},m=0,n=!1;e.addListener("ready",function(){domUtils.on(this.body,"compositionstart",function(){n=!0}),domUtils.on(this.body,"compositionend",function(){n=!1})}),e.addshortcutkey({Undo:"ctrl+90",Redo:"ctrl+89"});var o=!0;e.addListener("keydown",function(a,b){function c(a){a.undoManger.save(!1,!0),a.fireEvent("selectionchange")}var e=this,f=b.keyCode||b.which;if(!(l[f]||b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){if(n)return;if(!e.selection.getRange().collapsed)return e.undoManger.save(!1,!0),void(o=!1);0==e.undoManger.list.length&&e.undoManger.save(!0),clearTimeout(d),d=setTimeout(function(){if(n)var a=setInterval(function(){n||(c(e),clearInterval(a))},300);else c(e)},200),k=f,m++,m>=g&&c(e)}}),e.addListener("keyup",function(a,b){var c=b.keyCode||b.which;if(!(l[c]||b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){if(n)return;o||(this.undoManger.save(!1,!0),o=!0)}}),e.stopCmdUndo=function(){e.__hasEnterExecCommand=!0},e.startCmdUndo=function(){e.__hasEnterExecCommand=!1}},UE.plugin.register("copy",function(){function a(){ZeroClipboard.config({debug:!1,swfPath:b.options.UEDITOR_HOME_URL+"third-party/zeroclipboard/ZeroClipboard.swf"});var a=b.zeroclipboard=new ZeroClipboard;a.on("copy",function(a){var c=a.client,d=b.selection.getRange(),e=document.createElement("div");e.appendChild(d.cloneContents()),c.setText(e.innerText||e.textContent),c.setHtml(e.innerHTML),d.select()}),a.on("mouseover mouseout",function(a){var b=a.target;"mouseover"==a.type?domUtils.addClass(b,"edui-state-hover"):"mouseout"==a.type&&domUtils.removeClasses(b,"edui-state-hover")}),a.on("wrongflash noflash",function(){ZeroClipboard.destroy()})}var b=this;return{bindEvents:{ready:function(){browser.ie||(window.ZeroClipboard?a():utils.loadFile(document,{src:b.options.UEDITOR_HOME_URL+"third-party/zeroclipboard/ZeroClipboard.js",tag:"script",type:"text/javascript",defer:"defer"},function(){a()}))}},commands:{copy:{execCommand:function(a){b.document.execCommand("copy")||alert(b.getLang("copymsg"))}}}}}),UE.plugins.paste=function(){function a(a){var b=this.document;if(!b.getElementById("baidu_pastebin")){var c=this.selection.getRange(),d=c.createBookmark(),e=b.createElement("div");e.id="baidu_pastebin",browser.webkit&&e.appendChild(b.createTextNode(domUtils.fillChar+domUtils.fillChar)),b.body.appendChild(e),d.start.style.display="",e.style.cssText="position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:"+domUtils.getXY(d.start).y+"px",c.selectNodeContents(e).select(!0),setTimeout(function(){if(browser.webkit)for(var f,g=0,h=b.querySelectorAll("#baidu_pastebin");f=h[g++];){if(!domUtils.isEmptyNode(f)){e=f;break}domUtils.remove(f)}try{e.parentNode.removeChild(e)}catch(i){}c.moveToBookmark(d).select(!0),a(e)},0)}}function b(a){return a.replace(/<(\/?)([\w\-]+)([^>]*)>/gi,function(a,b,c,d){return c=c.toLowerCase(),{img:1}[c]?a:(d=d.replace(/([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi,function(a,b,c){return{src:1,href:1,name:1}[b.toLowerCase()]?b+"="+c+" ":""}),{span:1,div:1}[c]?"":"<"+b+c+" "+utils.trim(d)+">")})}function c(a){var c;if(a.firstChild){for(var h,i=domUtils.getElementsByTagName(a,"span"),j=0;h=i[j++];)"_baidu_cut_start"!=h.id&&"_baidu_cut_end"!=h.id||domUtils.remove(h);if(browser.webkit){for(var k,l=a.querySelectorAll("div br"),j=0;k=l[j++];){var m=k.parentNode;"DIV"==m.tagName&&1==m.childNodes.length&&(m.innerHTML="
",domUtils.remove(m))}for(var n,o=a.querySelectorAll("#baidu_pastebin"),j=0;n=o[j++];){var p=d.document.createElement("p");for(n.parentNode.insertBefore(p,n);n.firstChild;)p.appendChild(n.firstChild);domUtils.remove(n)}for(var q,r=a.querySelectorAll("meta"),j=0;q=r[j++];)domUtils.remove(q);var l=a.querySelectorAll("br");for(j=0;q=l[j++];)/^apple-/i.test(q.className)&&domUtils.remove(q)}if(browser.gecko){var s=a.querySelectorAll("[_moz_dirty]");for(j=0;q=s[j++];)q.removeAttribute("_moz_dirty")}if(!browser.ie)for(var q,t=a.querySelectorAll("span.Apple-style-span"),j=0;q=t[j++];)domUtils.remove(q,!0);c=a.innerHTML,c=UE.filterWord(c);var u=UE.htmlparser(c);if(d.options.filterRules&&UE.filterNode(u,d.options.filterRules),d.filterInputRule(u),browser.webkit){var v=u.lastChild();v&&"element"==v.type&&"br"==v.tagName&&u.removeChild(v),utils.each(d.body.querySelectorAll("div"),function(a){domUtils.isEmptyBlock(a)&&domUtils.remove(a,!0)})}if(c={html:u.toHtml()},d.fireEvent("beforepaste",c,u),!c.html)return;u=UE.htmlparser(c.html,!0),1===d.queryCommandState("pasteplain")?d.execCommand("insertHtml",UE.filterNode(u,d.options.filterTxtRules).toHtml(),!0):(UE.filterNode(u,d.options.filterTxtRules),e=u.toHtml(),f=c.html,g=d.selection.getRange().createAddress(!0),d.execCommand("insertHtml",d.getOpt("retainOnlyLabelPasted")===!0?b(f):f,!0)),d.fireEvent("afterpaste",c)}}var d=this;d.setOpt({retainOnlyLabelPasted:!1});var e,f,g;d.addListener("pasteTransfer",function(a,c){if(g&&e&&f&&e!=f){var h=d.selection.getRange();if(h.moveToAddress(g,!0),!h.collapsed){for(;!domUtils.isBody(h.startContainer);){var i=h.startContainer;if(1==i.nodeType){if(i=i.childNodes[h.startOffset],!i){h.setStartBefore(h.startContainer);continue}var j=i.previousSibling;j&&3==j.nodeType&&new RegExp("^[\n\r\t "+domUtils.fillChar+"]*$").test(j.nodeValue)&&h.setStartBefore(j)}if(0!=h.startOffset)break;h.setStartBefore(h.startContainer)}for(;!domUtils.isBody(h.endContainer);){var k=h.endContainer;if(1==k.nodeType){if(k=k.childNodes[h.endOffset],!k){h.setEndAfter(h.endContainer);continue}var l=k.nextSibling;l&&3==l.nodeType&&new RegExp("^[\n\r\t"+domUtils.fillChar+"]*$").test(l.nodeValue)&&h.setEndAfter(l)}if(h.endOffset!=h.endContainer[3==h.endContainer.nodeType?"nodeValue":"childNodes"].length)break;h.setEndAfter(h.endContainer)}}h.deleteContents(),h.select(!0),d.__hasEnterExecCommand=!0;var m=f;2===c?m=b(m):c&&(m=e),d.execCommand("inserthtml",m,!0),d.__hasEnterExecCommand=!1;for(var n=d.selection.getRange();!domUtils.isBody(n.startContainer)&&!n.startOffset&&n.startContainer[3==n.startContainer.nodeType?"nodeValue":"childNodes"].length;)n.setStartBefore(n.startContainer);var o=n.createAddress(!0);g.endAddress=o.startAddress}}),d.addListener("ready",function(){domUtils.on(d.body,"cut",function(){var a=d.selection.getRange();!a.collapsed&&d.undoManger&&d.undoManger.save()}),domUtils.on(d.body,browser.ie||browser.opera?"keydown":"paste",function(b){(!browser.ie&&!browser.opera||(b.ctrlKey||b.metaKey)&&"86"==b.keyCode)&&a.call(d,function(a){c(a)})})}),d.commands.paste={execCommand:function(b){browser.ie?(a.call(d,function(a){c(a)}),d.document.execCommand("paste")):alert(d.getLang("pastemsg"))}}},UE.plugins.pasteplain=function(){var a=this;a.setOpt({pasteplain:!1,filterTxtRules:function(){function a(a){a.tagName="p",a.setStyle()}function b(a){a.parentNode.removeChild(a,!0)}return{"-":"script style object iframe embed input select",p:{$:{}},br:{$:{}},div:function(a){for(var b,c=UE.uNode.createElement("p");b=a.firstChild();)"text"!=b.type&&UE.dom.dtd.$block[b.tagName]?c.firstChild()?(a.parentNode.insertBefore(c,a),c=UE.uNode.createElement("p")):a.parentNode.insertBefore(b,a):c.appendChild(b);c.firstChild()&&a.parentNode.insertBefore(c,a),a.parentNode.removeChild(a)},ol:b,ul:b,dl:b,dt:b,dd:b,li:b,caption:a,th:a,tr:a,h1:a,h2:a,h3:a,h4:a,h5:a,h6:a,td:function(a){var b=!!a.innerText();b&&a.parentNode.insertAfter(UE.uNode.createText(" "),a),a.parentNode.removeChild(a,a.innerText())}}}()});var b=a.options.pasteplain;a.commands.pasteplain={queryCommandState:function(){return b?1:0},execCommand:function(){b=0|!b},notNeedUndo:1}},UE.plugins.list=function(){function a(a){var b=[];for(var c in a)b.push(c);return b}function b(a){var b=a.className;return domUtils.hasClass(a,/custom_/)?b.match(/custom_(\w+)/)[1]:domUtils.getStyle(a,"list-style-type")}function c(a,c){utils.each(domUtils.getElementsByTagName(a,"ol ul"),function(f){if(domUtils.inDoc(f,a)){var g=f.parentNode;if(g.tagName==f.tagName){var h=b(f)||("OL"==f.tagName?"decimal":"disc"),i=b(g)||("OL"==g.tagName?"decimal":"disc");if(h==i){var l=utils.indexOf(k[f.tagName],h);l=l+1==k[f.tagName].length?0:l+1,e(f,k[f.tagName][l])}}var m=0,n=2;domUtils.hasClass(f,/custom_/)?/[ou]l/i.test(g.tagName)&&domUtils.hasClass(g,/custom_/)||(n=1):/[ou]l/i.test(g.tagName)&&domUtils.hasClass(g,/custom_/)&&(n=3);var o=domUtils.getStyle(f,"list-style-type");o&&(f.style.cssText="list-style-type:"+o),f.className=utils.trim(f.className.replace(/list-paddingleft-\w+/,""))+" list-paddingleft-"+n,utils.each(domUtils.getElementsByTagName(f,"li"),function(a){if(a.style.cssText&&(a.style.cssText=""),!a.firstChild)return void domUtils.remove(a);if(a.parentNode===f){if(m++,domUtils.hasClass(f,/custom_/)){var c=1,d=b(f);if("OL"==f.tagName){if(d)switch(d){case"cn":case"cn1":case"cn2":m>10&&(m%10==0||m>10&&m<20)?c=2:m>20&&(c=3);break;case"num2":m>9&&(c=2)}a.className="list-"+j[d]+m+" list-"+d+"-paddingleft-"+c}else a.className="list-"+j[d]+" list-"+d+"-paddingleft"}else a.className=a.className.replace(/list-[\w\-]+/gi,"");var e=a.getAttribute("class");null===e||e.replace(/\s/g,"")||domUtils.removeAttributes(a,"class")}}),!c&&d(f,f.tagName.toLowerCase(),b(f)||domUtils.getStyle(f,"list-style-type"),!0)}})}function d(a,d,e,f){var g=a.nextSibling;g&&1==g.nodeType&&g.tagName.toLowerCase()==d&&(b(g)||domUtils.getStyle(g,"list-style-type")||("ol"==d?"decimal":"disc"))==e&&(domUtils.moveChild(g,a),0==g.childNodes.length&&domUtils.remove(g)),g&&domUtils.isFillChar(g)&&domUtils.remove(g);var h=a.previousSibling;h&&1==h.nodeType&&h.tagName.toLowerCase()==d&&(b(h)||domUtils.getStyle(h,"list-style-type")||("ol"==d?"decimal":"disc"))==e&&domUtils.moveChild(a,h),h&&domUtils.isFillChar(h)&&domUtils.remove(h),!f&&domUtils.isEmptyBlock(a)&&domUtils.remove(a),b(a)&&c(a.ownerDocument,!0)}function e(a,b){j[b]&&(a.className="custom_"+b);try{domUtils.setStyle(a,"list-style-type",b)}catch(c){}}function f(a){var b=a.previousSibling;b&&domUtils.isEmptyBlock(b)&&domUtils.remove(b),b=a.nextSibling,b&&domUtils.isEmptyBlock(b)&&domUtils.remove(b)}function g(a){for(;a&&!domUtils.isBody(a);){if("TABLE"==a.nodeName)return null;if("LI"==a.nodeName)return a;a=a.parentNode}}var h=this,i={TD:1,PRE:1,BLOCKQUOTE:1},j={cn:"cn-1-",cn1:"cn-2-",cn2:"cn-3-",num:"num-1-",num1:"num-2-",num2:"num-3-",dash:"dash",dot:"dot"};h.setOpt({autoTransWordToList:!1,insertorderedlist:{num:"",num1:"",num2:"",cn:"",cn1:"",cn2:"",decimal:"","lower-alpha":"","lower-roman":"","upper-alpha":"","upper-roman":""},insertunorderedlist:{circle:"",disc:"",square:"",dash:"",dot:""},listDefaultPaddingLeft:"30",listiconpath:"http://bs.baidu.com/listicon/",maxListLevel:-1,disablePInList:!1});var k={OL:a(h.options.insertorderedlist),UL:a(h.options.insertunorderedlist)},l=h.options.listiconpath;for(var m in j)h.options.insertorderedlist.hasOwnProperty(m)||h.options.insertunorderedlist.hasOwnProperty(m)||delete j[m];h.ready(function(){var a=[];for(var b in j){if("dash"==b||"dot"==b)a.push("li.list-"+j[b]+"{background-image:url("+l+j[b]+".gif)}"),a.push("ul.custom_"+b+"{list-style:none;}ul.custom_"+b+" li{background-position:0 3px;background-repeat:no-repeat}");else{for(var c=0;c<99;c++)a.push("li.list-"+j[b]+c+"{background-image:url("+l+"list-"+j[b]+c+".gif)}");a.push("ol.custom_"+b+"{list-style:none;}ol.custom_"+b+" li{background-position:0 3px;background-repeat:no-repeat}")}switch(b){case"cn":a.push("li.list-"+b+"-paddingleft-1{padding-left:25px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:55px}");break;case"cn1":a.push("li.list-"+b+"-paddingleft-1{padding-left:30px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:55px}");break;case"cn2":a.push("li.list-"+b+"-paddingleft-1{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:55px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:68px}");break;case"num":case"num1":a.push("li.list-"+b+"-paddingleft-1{padding-left:25px}");break;case"num2":a.push("li.list-"+b+"-paddingleft-1{padding-left:35px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}");break;case"dash":a.push("li.list-"+b+"-paddingleft{padding-left:35px}");break;case"dot":a.push("li.list-"+b+"-paddingleft{padding-left:20px}")}}a.push(".list-paddingleft-1{padding-left:0}"),a.push(".list-paddingleft-2{padding-left:"+h.options.listDefaultPaddingLeft+"px}"),a.push(".list-paddingleft-3{padding-left:"+2*h.options.listDefaultPaddingLeft+"px}"),utils.cssRule("list","ol,ul{margin:0;pading:0;"+(browser.ie?"":"width:95%")+"}li{clear:both;}"+a.join("\n"),h.document)}),h.ready(function(){domUtils.on(h.body,"cut",function(){setTimeout(function(){var a,b=h.selection.getRange();if(!b.collapsed&&(a=domUtils.findParentByTagName(b.startContainer,"li",!0))&&!a.nextSibling&&domUtils.isEmptyBlock(a)){var c,d=a.parentNode;if(c=d.previousSibling)domUtils.remove(d),b.setStartAtLast(c).collapse(!0),b.select(!0);else if(c=d.nextSibling)domUtils.remove(d),b.setStartAtFirst(c).collapse(!0),b.select(!0);else{var e=h.document.createElement("p");domUtils.fillNode(h.document,e),d.parentNode.insertBefore(e,d),domUtils.remove(d),b.setStart(e,0).collapse(!0),b.select(!0)}}})})}),h.addListener("beforepaste",function(a,c){var d,e=this,f=e.selection.getRange(),g=UE.htmlparser(c.html,!0);if(d=domUtils.findParentByTagName(f.startContainer,"li",!0)){var h=d.parentNode,i="OL"==h.tagName?"ul":"ol";utils.each(g.getNodesByTagName(i),function(c){if(c.tagName=h.tagName,c.setAttr(),c.parentNode===g)a=b(h)||("OL"==h.tagName?"decimal":"disc");else{var d=c.parentNode.getAttr("class");a=d&&/custom_/.test(d)?d.match(/custom_(\w+)/)[1]:c.parentNode.getStyle("list-style-type"),a||(a="OL"==h.tagName?"decimal":"disc")}var e=utils.indexOf(k[h.tagName],a);c.parentNode!==g&&(e=e+1==k[h.tagName].length?0:e+1);var f=k[h.tagName][e];j[f]?c.setAttr("class","custom_"+f):c.setStyle("list-style-type",f)})}c.html=g.toHtml()}),h.getOpt("disablePInList")===!0&&h.addOutputRule(function(a){utils.each(a.getNodesByTagName("li"),function(a){var b=[],c=0;utils.each(a.children,function(d){if("p"==d.tagName){for(var e;e=d.children.pop();)b.splice(c,0,e),e.parentNode=a,lastNode=e;if(e=b[b.length-1],!e||"element"!=e.type||"br"!=e.tagName){var f=UE.uNode.createElement("br");f.parentNode=a,b.push(f)}c=b.length}}),b.length&&(a.children=b)})}),h.addInputRule(function(a){function b(a,b){var e=b.firstChild();if(e&&"element"==e.type&&"span"==e.tagName&&/Wingdings|Symbol/.test(e.getStyle("font-family"))){for(var f in d)if(d[f]==e.data)return f;return"disc"}for(var f in c)if(c[f].test(a))return f}if(utils.each(a.getNodesByTagName("li"),function(a){for(var b,c=UE.uNode.createElement("p"),d=0;b=a.children[d];)"text"==b.type||dtd.p[b.tagName]?c.appendChild(b):c.firstChild()?(a.insertBefore(c,b),c=UE.uNode.createElement("p"),d+=2):d++;(c.firstChild()&&!c.parentNode||!a.firstChild())&&a.appendChild(c),c.firstChild()||c.innerHTML(browser.ie?" ":" ");var e=a.firstChild(),f=e.lastChild();f&&"text"==f.type&&/^\s*$/.test(f.data)&&e.removeChild(f)}),h.options.autoTransWordToList){var c={num1:/^\d+\)/,decimal:/^\d+\./,"lower-alpha":/^[a-z]+\)/,"upper-alpha":/^[A-Z]+\./,cn:/^[\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+[\u3001]/,cn2:/^\([\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+\)/},d={square:"n"};utils.each(a.getNodesByTagName("p"),function(a){function d(a,b,d){if("ol"==a.tagName)if(browser.ie){var e=b.firstChild();"element"==e.type&&"span"==e.tagName&&c[d].test(e.innerText())&&b.removeChild(e)}else b.innerHTML(b.innerHTML().replace(c[d],""));else b.removeChild(b.firstChild());var f=UE.uNode.createElement("li");f.appendChild(b),a.appendChild(f)}if("MsoListParagraph"==a.getAttr("class")){a.setStyle("margin",""),a.setStyle("margin-left",""),a.setAttr("class","");var e,f=a,g=a;if("li"!=a.parentNode.tagName&&(e=b(a.innerText(),a))){var i=UE.uNode.createElement(h.options.insertorderedlist.hasOwnProperty(e)?"ol":"ul");for(j[e]?i.setAttr("class","custom_"+e):i.setStyle("list-style-type",e);a&&"li"!=a.parentNode.tagName&&b(a.innerText(),a);)f=a.nextSibling(),f||a.parentNode.insertBefore(i,a),d(i,a,e),a=f;!i.parentNode&&a&&a.parentNode&&a.parentNode.insertBefore(i,a)}var k=g.firstChild();k&&"element"==k.type&&"span"==k.tagName&&/^\s*( )+\s*$/.test(k.innerText())&&k.parentNode.removeChild(k)}})}}),h.addListener("contentchange",function(){c(h.document)}),h.addListener("keydown",function(a,b){function c(){b.preventDefault?b.preventDefault():b.returnValue=!1,h.fireEvent("contentchange"),h.undoManger&&h.undoManger.save()}function d(a,b){for(;a&&!domUtils.isBody(a);){if(b(a))return null;if(1==a.nodeType&&/[ou]l/i.test(a.tagName))return a;a=a.parentNode}return null}var e=b.keyCode||b.which;if(13==e&&!b.shiftKey){var g=h.selection.getRange(),i=domUtils.findParent(g.startContainer,function(a){return domUtils.isBlockElm(a)},!0),j=domUtils.findParentByTagName(g.startContainer,"li",!0);if(i&&"PRE"!=i.tagName&&!j){var k=i.innerHTML.replace(new RegExp(domUtils.fillChar,"g"),"");/^\s*1\s*\.[^\d]/.test(k)&&(i.innerHTML=k.replace(/^\s*1\s*\./,""),g.setStartAtLast(i).collapse(!0).select(),h.__hasEnterExecCommand=!0,h.execCommand("insertorderedlist"),h.__hasEnterExecCommand=!1)}var l=h.selection.getRange(),m=d(l.startContainer,function(a){return"TABLE"==a.tagName}),n=l.collapsed?m:d(l.endContainer,function(a){return"TABLE"==a.tagName});if(m&&n&&m===n){if(!l.collapsed){if(m=domUtils.findParentByTagName(l.startContainer,"li",!0),n=domUtils.findParentByTagName(l.endContainer,"li",!0),!m||!n||m!==n){var o=l.cloneRange(),p=o.collapse(!1).createBookmark();l.deleteContents(),o.moveToBookmark(p);var j=domUtils.findParentByTagName(o.startContainer,"li",!0);return f(j),o.select(),void c()}if(l.deleteContents(),j=domUtils.findParentByTagName(l.startContainer,"li",!0),j&&domUtils.isEmptyBlock(j))return v=j.previousSibling,next=j.nextSibling,s=h.document.createElement("p"),domUtils.fillNode(h.document,s),q=j.parentNode,v&&next?(l.setStart(next,0).collapse(!0).select(!0),domUtils.remove(j)):((v||next)&&v?j.parentNode.parentNode.insertBefore(s,q.nextSibling):q.parentNode.insertBefore(s,q),domUtils.remove(j),q.firstChild||domUtils.remove(q),l.setStart(s,0).setCursor()),void c()}if(j=domUtils.findParentByTagName(l.startContainer,"li",!0)){
-if(domUtils.isEmptyBlock(j)){p=l.createBookmark();var q=j.parentNode;if(j!==q.lastChild?(domUtils.breakParent(j,q),f(j)):(q.parentNode.insertBefore(j,q.nextSibling),domUtils.isEmptyNode(q)&&domUtils.remove(q)),!dtd.$list[j.parentNode.tagName])if(domUtils.isBlockElm(j.firstChild))domUtils.remove(j,!0);else{for(s=h.document.createElement("p"),j.parentNode.insertBefore(s,j);j.firstChild;)s.appendChild(j.firstChild);domUtils.remove(j)}l.moveToBookmark(p).select()}else{var r=j.firstChild;if(!r||!domUtils.isBlockElm(r)){var s=h.document.createElement("p");for(!j.firstChild&&domUtils.fillNode(h.document,s);j.firstChild;)s.appendChild(j.firstChild);j.appendChild(s),r=s}var t=h.document.createElement("span");l.insertNode(t),domUtils.breakParent(t,j);var u=t.nextSibling;r=u.firstChild,r||(s=h.document.createElement("p"),domUtils.fillNode(h.document,s),u.appendChild(s),r=s),domUtils.isEmptyNode(r)&&(r.innerHTML="",domUtils.fillNode(h.document,r)),l.setStart(r,0).collapse(!0).shrinkBoundary().select(),domUtils.remove(t);var v=u.previousSibling;v&&domUtils.isEmptyBlock(v)&&(v.innerHTML="
",domUtils.fillNode(h.document,v.firstChild))}c()}}}if(8==e&&(l=h.selection.getRange(),l.collapsed&&domUtils.isStartInblock(l)&&(o=l.cloneRange().trimBoundary(),j=domUtils.findParentByTagName(l.startContainer,"li",!0),j&&domUtils.isStartInblock(o)))){if(m=domUtils.findParentByTagName(l.startContainer,"p",!0),m&&m!==j.firstChild){var q=domUtils.findParentByTagName(m,["ol","ul"]);return domUtils.breakParent(m,q),f(m),h.fireEvent("contentchange"),l.setStart(m,0).setCursor(!1,!0),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}if(j&&(v=j.previousSibling)){if(46==e&&j.childNodes.length)return;if(dtd.$list[v.tagName]&&(v=v.lastChild),h.undoManger&&h.undoManger.save(),r=j.firstChild,domUtils.isBlockElm(r))if(domUtils.isEmptyNode(r))for(v.appendChild(r),l.setStart(r,0).setCursor(!1,!0);j.firstChild;)v.appendChild(j.firstChild);else t=h.document.createElement("span"),l.insertNode(t),domUtils.isEmptyBlock(v)&&(v.innerHTML=""),domUtils.moveChild(j,v),l.setStartBefore(t).collapse(!0).select(!0),domUtils.remove(t);else if(domUtils.isEmptyNode(j)){var s=h.document.createElement("p");v.appendChild(s),l.setStart(s,0).setCursor()}else for(l.setEnd(v,v.childNodes.length).collapse().select(!0);j.firstChild;)v.appendChild(j.firstChild);return domUtils.remove(j),h.fireEvent("contentchange"),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}if(j&&!j.previousSibling){var q=j.parentNode,p=l.createBookmark();if(domUtils.isTagNode(q.parentNode,"ol ul"))q.parentNode.insertBefore(j,q),domUtils.isEmptyNode(q)&&domUtils.remove(q);else{for(;j.firstChild;)q.parentNode.insertBefore(j.firstChild,q);domUtils.remove(j),domUtils.isEmptyNode(q)&&domUtils.remove(q)}return l.moveToBookmark(p).setCursor(!1,!0),h.fireEvent("contentchange"),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}}}),h.addListener("keyup",function(a,c){var e=c.keyCode||c.which;if(8==e){var f,g=h.selection.getRange();(f=domUtils.findParentByTagName(g.startContainer,["ol","ul"],!0))&&d(f,f.tagName.toLowerCase(),b(f)||domUtils.getComputedStyle(f,"list-style-type"),!0)}}),h.addListener("tabkeydown",function(){function a(a){if(h.options.maxListLevel!=-1){for(var b=a.parentNode,c=0;/[ou]l/i.test(b.tagName);)c++,b=b.parentNode;if(c>=h.options.maxListLevel)return!0}}var c=h.selection.getRange(),f=domUtils.findParentByTagName(c.startContainer,"li",!0);if(f){var g;if(!c.collapsed){h.fireEvent("saveScene"),g=c.createBookmark();for(var i,j,l=0,m=domUtils.findParents(f);j=m[l++];)if(domUtils.isTagNode(j,"ol ul")){i=j;break}var n=f;if(g.end)for(;n&&!(domUtils.getPosition(n,g.end)&domUtils.POSITION_FOLLOWING);)if(a(n))n=domUtils.getNextDomNode(n,!1,null,function(a){return a!==i});else{var o=n.parentNode,p=h.document.createElement(o.tagName),q=utils.indexOf(k[p.tagName],b(o)||domUtils.getComputedStyle(o,"list-style-type")),r=q+1==k[p.tagName].length?0:q+1,s=k[p.tagName][r];for(e(p,s),o.insertBefore(p,n);n&&!(domUtils.getPosition(n,g.end)&domUtils.POSITION_FOLLOWING);){if(f=n.nextSibling,p.appendChild(n),!f||domUtils.isTagNode(f,"ol ul")){if(f)for(;(f=f.firstChild)&&"LI"!=f.tagName;);else f=domUtils.getNextDomNode(n,!1,null,function(a){return a!==i});break}n=f}d(p,p.tagName.toLowerCase(),s),n=f}return h.fireEvent("contentchange"),c.moveToBookmark(g).select(),!0}if(a(f))return!0;var o=f.parentNode,p=h.document.createElement(o.tagName),q=utils.indexOf(k[p.tagName],b(o)||domUtils.getComputedStyle(o,"list-style-type"));q=q+1==k[p.tagName].length?0:q+1;var s=k[p.tagName][q];if(e(p,s),domUtils.isStartInblock(c))return h.fireEvent("saveScene"),g=c.createBookmark(),o.insertBefore(p,f),p.appendChild(f),d(p,p.tagName.toLowerCase(),s),h.fireEvent("contentchange"),c.moveToBookmark(g).select(!0),!0}}),h.commands.insertorderedlist=h.commands.insertunorderedlist={execCommand:function(a,c){c||(c="insertorderedlist"==a.toLowerCase()?"decimal":"disc");var f=this,h=this.selection.getRange(),j=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase():!domUtils.isWhitespace(a)},k="insertorderedlist"==a.toLowerCase()?"ol":"ul",l=f.document.createDocumentFragment();h.adjustmentBoundary().shrinkBoundary();var m,n,o,p,q=h.createBookmark(!0),r=g(f.document.getElementById(q.start)),s=0,t=g(f.document.getElementById(q.end)),u=0;if(r||t){if(r&&(m=r.parentNode),q.end||(t=r),t&&(n=t.parentNode),m===n){for(;r!==t;){if(p=r,r=r.nextSibling,!domUtils.isBlockElm(p.firstChild)){for(var v=f.document.createElement("p");p.firstChild;)v.appendChild(p.firstChild);p.appendChild(v)}l.appendChild(p)}if(p=f.document.createElement("span"),m.insertBefore(p,t),!domUtils.isBlockElm(t.firstChild)){for(v=f.document.createElement("p");t.firstChild;)v.appendChild(t.firstChild);t.appendChild(v)}l.appendChild(t),domUtils.breakParent(p,m),domUtils.isEmptyNode(p.previousSibling)&&domUtils.remove(p.previousSibling),domUtils.isEmptyNode(p.nextSibling)&&domUtils.remove(p.nextSibling);var w=b(m)||domUtils.getComputedStyle(m,"list-style-type")||("insertorderedlist"==a.toLowerCase()?"decimal":"disc");if(m.tagName.toLowerCase()==k&&w==c){for(var x,y=0,z=f.document.createDocumentFragment();x=l.firstChild;)if(domUtils.isTagNode(x,"ol ul"))z.appendChild(x);else for(;x.firstChild;)z.appendChild(x.firstChild),domUtils.remove(x);p.parentNode.insertBefore(z,p)}else o=f.document.createElement(k),e(o,c),o.appendChild(l),p.parentNode.insertBefore(o,p);return domUtils.remove(p),o&&d(o,k,c),void h.moveToBookmark(q).select()}if(r){for(;r;){if(p=r.nextSibling,domUtils.isTagNode(r,"ol ul"))l.appendChild(r);else{for(var A=f.document.createDocumentFragment(),B=0;r.firstChild;)domUtils.isBlockElm(r.firstChild)&&(B=1),A.appendChild(r.firstChild);if(B)l.appendChild(A);else{var C=f.document.createElement("p");C.appendChild(A),l.appendChild(C)}domUtils.remove(r)}r=p}m.parentNode.insertBefore(l,m.nextSibling),domUtils.isEmptyNode(m)?(h.setStartBefore(m),domUtils.remove(m)):h.setStartAfter(m),s=1}if(t&&domUtils.inDoc(n,f.document)){for(r=n.firstChild;r&&r!==t;){if(p=r.nextSibling,domUtils.isTagNode(r,"ol ul"))l.appendChild(r);else{for(A=f.document.createDocumentFragment(),B=0;r.firstChild;)domUtils.isBlockElm(r.firstChild)&&(B=1),A.appendChild(r.firstChild);B?l.appendChild(A):(C=f.document.createElement("p"),C.appendChild(A),l.appendChild(C)),domUtils.remove(r)}r=p}var D=domUtils.createElement(f.document,"div",{tmpDiv:1});domUtils.moveChild(t,D),l.appendChild(D),domUtils.remove(t),n.parentNode.insertBefore(l,n),h.setEndBefore(n),domUtils.isEmptyNode(n)&&domUtils.remove(n),u=1}}s||h.setStartBefore(f.document.getElementById(q.start)),q.end&&!u&&h.setEndAfter(f.document.getElementById(q.end)),h.enlarge(!0,function(a){return i[a.tagName]}),l=f.document.createDocumentFragment();for(var E,F=h.createBookmark(),G=domUtils.getNextDomNode(F.start,!1,j),H=h.cloneRange(),I=domUtils.isBlockElm;G&&G!==F.end&&domUtils.getPosition(G,F.end)&domUtils.POSITION_PRECEDING;)if(3==G.nodeType||dtd.li[G.tagName]){if(1==G.nodeType&&dtd.$list[G.tagName]){for(;G.firstChild;)l.appendChild(G.firstChild);E=domUtils.getNextDomNode(G,!1,j),domUtils.remove(G),G=E;continue}for(E=G,H.setStartBefore(G);G&&G!==F.end&&(!I(G)||domUtils.isBookmarkNode(G));)E=G,G=domUtils.getNextDomNode(G,!1,null,function(a){return!i[a.tagName]});G&&I(G)&&(p=domUtils.getNextDomNode(E,!1,j),p&&domUtils.isBookmarkNode(p)&&(G=domUtils.getNextDomNode(p,!1,j),E=p)),H.setEndAfter(E),G=domUtils.getNextDomNode(E,!1,j);var J=h.document.createElement("li");if(J.appendChild(H.extractContents()),domUtils.isEmptyNode(J)){for(var E=h.document.createElement("p");J.firstChild;)E.appendChild(J.firstChild);J.appendChild(E)}l.appendChild(J)}else G=domUtils.getNextDomNode(G,!0,j);h.moveToBookmark(F).collapse(!0),o=f.document.createElement(k),e(o,c),o.appendChild(l),h.insertNode(o),d(o,k,c);for(var x,y=0,K=domUtils.getElementsByTagName(o,"div");x=K[y++];)x.getAttribute("tmpDiv")&&domUtils.remove(x,!0);h.moveToBookmark(q).select()},queryCommandState:function(a){for(var b,c="insertorderedlist"==a.toLowerCase()?"ol":"ul",d=this.selection.getStartElementPath(),e=0;b=d[e++];){if("TABLE"==b.nodeName)return 0;if(c==b.nodeName.toLowerCase())return 1}return 0},queryCommandValue:function(a){for(var c,d,e="insertorderedlist"==a.toLowerCase()?"ol":"ul",f=this.selection.getStartElementPath(),g=0;d=f[g++];){if("TABLE"==d.nodeName){c=null;break}if(e==d.nodeName.toLowerCase()){c=d;break}}return c?b(c)||domUtils.getComputedStyle(c,"list-style-type"):null}}},function(){var a={textarea:function(a,b){var c=b.ownerDocument.createElement("textarea");return c.style.cssText="position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;",browser.ie&&browser.version<8&&(c.style.width=b.offsetWidth+"px",c.style.height=b.offsetHeight+"px",b.onresize=function(){c.style.width=b.offsetWidth+"px",c.style.height=b.offsetHeight+"px"}),b.appendChild(c),{setContent:function(a){c.value=a},getContent:function(){return c.value},select:function(){var a;browser.ie?(a=c.createTextRange(),a.collapse(!0),a.select()):(c.setSelectionRange(0,0),c.focus())},dispose:function(){b.removeChild(c),b.onresize=null,c=null,b=null}}},codemirror:function(a,b){var c=window.CodeMirror(b,{mode:"text/html",tabMode:"indent",lineNumbers:!0,lineWrapping:!0}),d=c.getWrapperElement();return d.style.cssText='position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,"Courier new",monospace;font-size:13px;',c.getScrollerElement().style.cssText="position:absolute;left:0;top:0;width:100%;height:100%;",c.refresh(),{getCodeMirror:function(){return c},setContent:function(a){c.setValue(a)},getContent:function(){return c.getValue()},select:function(){c.focus()},dispose:function(){b.removeChild(d),d=null,c=null}}}};UE.plugins.source=function(){function b(b){return a["codemirror"==f.sourceEditor&&window.CodeMirror?"codemirror":"textarea"](e,b)}var c,d,e=this,f=this.options,g=!1;f.sourceEditor=browser.ie?"textarea":f.sourceEditor||"codemirror",e.setOpt({sourceEditorFirst:!1});var h,i,j;e.commands.source={execCommand:function(){if(g=!g){j=e.selection.getRange().createAddress(!1,!0),e.undoManger&&e.undoManger.save(!0),browser.gecko&&(e.body.contentEditable=!1),h=e.iframe.style.cssText,e.iframe.style.cssText+="position:absolute;left:-32768px;top:-32768px;",e.fireEvent("beforegetcontent");var a=UE.htmlparser(e.body.innerHTML);e.filterOutputRule(a),a.traversal(function(a){if("element"==a.type)switch(a.tagName){case"td":case"th":case"caption":a.children&&1==a.children.length&&"br"==a.firstChild().tagName&&a.removeChild(a.firstChild());break;case"pre":a.innerText(a.innerText().replace(/ /g," "))}}),e.fireEvent("aftergetcontent");var f=a.toHtml(!0);c=b(e.iframe.parentNode),c.setContent(f),d=e.setContent,e.setContent=function(a){var b=UE.htmlparser(a);e.filterInputRule(b),a=b.toHtml(),c.setContent(a)},setTimeout(function(){c.select(),e.addListener("fullscreenchanged",function(){try{c.getCodeMirror().refresh()}catch(a){}})}),i=e.getContent,e.getContent=function(){return c.getContent()||""+(browser.ie?"":" ")+"
"}}else{e.iframe.style.cssText=h;var k=c.getContent()||""+(browser.ie?"":" ")+"
";k=k.replace(new RegExp("[\\r\\t\\n ]*?(\\w+)\\s*(?:[^>]*)>","g"),function(a,b){return b&&!dtd.$inlineWithA[b.toLowerCase()]?a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g,""):a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g,"")}),e.setContent=d,e.setContent(k),c.dispose(),c=null,e.getContent=i;var l=e.body.firstChild;if(l||(e.body.innerHTML=""+(browser.ie?"":" ")+"
",l=e.body.firstChild),e.undoManger&&e.undoManger.save(!0),browser.gecko){var m=document.createElement("input");m.style.cssText="position:absolute;left:0;top:-32768px",document.body.appendChild(m),e.body.contentEditable=!1,setTimeout(function(){domUtils.setViewportOffset(m,{left:-32768,top:0}),m.focus(),setTimeout(function(){e.body.contentEditable=!0,e.selection.getRange().moveToAddress(j).select(!0),domUtils.remove(m)})})}else try{e.selection.getRange().moveToAddress(j).select(!0)}catch(n){}}this.fireEvent("sourcemodechanged",g)},queryCommandState:function(){return 0|g},notNeedUndo:1};var k=e.queryCommandState;e.queryCommandState=function(a){return a=a.toLowerCase(),g?a in{source:1,fullscreen:1}?1:-1:k.apply(this,arguments)},"codemirror"==f.sourceEditor&&e.addListener("ready",function(){utils.loadFile(document,{src:f.codeMirrorJsUrl||f.UEDITOR_HOME_URL+"third-party/codemirror/codemirror.js",tag:"script",type:"text/javascript",defer:"defer"},function(){f.sourceEditorFirst&&setTimeout(function(){e.execCommand("source")},0)}),utils.loadFile(document,{tag:"link",rel:"stylesheet",type:"text/css",href:f.codeMirrorCssUrl||f.UEDITOR_HOME_URL+"third-party/codemirror/codemirror.css"})})}}(),UE.plugins.enterkey=function(){var a,b=this,c=b.options.enterTag;b.addListener("keyup",function(c,d){var e=d.keyCode||d.which;if(13==e){var f,g=b.selection.getRange(),h=g.startContainer;if(browser.ie)b.fireEvent("saveScene",!0,!0);else{if(/h\d/i.test(a)){if(browser.gecko){var i=domUtils.findParentByTagName(h,["h1","h2","h3","h4","h5","h6","blockquote","caption","table"],!0);i||(b.document.execCommand("formatBlock",!1,""),f=1)}else if(1==h.nodeType){var j,k=b.document.createTextNode("");if(g.insertNode(k),j=domUtils.findParentByTagName(k,"div",!0)){for(var l=b.document.createElement("p");j.firstChild;)l.appendChild(j.firstChild);j.parentNode.insertBefore(l,j),domUtils.remove(j),g.setStartBefore(k).setCursor(),f=1}domUtils.remove(k)}b.undoManger&&f&&b.undoManger.save()}browser.opera&&g.select()}}}),b.addListener("keydown",function(d,e){var f=e.keyCode||e.which;if(13==f){if(b.fireEvent("beforeenterkeydown"))return void domUtils.preventDefault(e);b.fireEvent("saveScene",!0,!0),a="";var g=b.selection.getRange();if(!g.collapsed){var h=g.startContainer,i=g.endContainer,j=domUtils.findParentByTagName(h,"td",!0),k=domUtils.findParentByTagName(i,"td",!0);if(j&&k&&j!==k||!j&&k||j&&!k)return void(e.preventDefault?e.preventDefault():e.returnValue=!1)}if("p"==c)browser.ie||(h=domUtils.findParentByTagName(g.startContainer,["ol","ul","p","h1","h2","h3","h4","h5","h6","blockquote","caption"],!0),h||browser.opera?(a=h.tagName,"p"==h.tagName.toLowerCase()&&browser.gecko&&domUtils.removeDirtyAttr(h)):(b.document.execCommand("formatBlock",!1,"
"),browser.gecko&&(g=b.selection.getRange(),h=domUtils.findParentByTagName(g.startContainer,"p",!0),h&&domUtils.removeDirtyAttr(h))));else if(e.preventDefault?e.preventDefault():e.returnValue=!1,g.collapsed){m=g.document.createElement("br"),g.insertNode(m);var l=m.parentNode;l.lastChild===m?(m.parentNode.insertBefore(m.cloneNode(!0),m),g.setStartBefore(m)):g.setStartAfter(m),g.setCursor()}else if(g.deleteContents(),h=g.startContainer,1==h.nodeType&&(h=h.childNodes[g.startOffset])){for(;1==h.nodeType;){if(dtd.$empty[h.tagName])return g.setStartBefore(h).setCursor(),b.undoManger&&b.undoManger.save(),!1;if(!h.firstChild){var m=g.document.createElement("br");return h.appendChild(m),g.setStart(h,0).setCursor(),b.undoManger&&b.undoManger.save(),!1}h=h.firstChild}h===g.startContainer.childNodes[g.startOffset]?(m=g.document.createElement("br"),g.insertNode(m).setCursor()):g.setStart(h,0).setCursor()}else m=g.document.createElement("br"),g.insertNode(m).setStartAfter(m).setCursor()}})},UE.plugins.keystrokes=function(){var a=this,b=!0;a.addListener("keydown",function(c,d){var e=d.keyCode||d.which,f=a.selection.getRange();if(!f.collapsed&&!(d.ctrlKey||d.shiftKey||d.altKey||d.metaKey)&&(e>=65&&e<=90||e>=48&&e<=57||e>=96&&e<=111||{13:1,8:1,46:1}[e])){var g=f.startContainer;if(domUtils.isFillChar(g)&&f.setStartBefore(g),g=f.endContainer,domUtils.isFillChar(g)&&f.setEndAfter(g),f.txtToElmBoundary(),f.endContainer&&1==f.endContainer.nodeType&&(g=f.endContainer.childNodes[f.endOffset],g&&domUtils.isBr(g)&&f.setEndAfter(g)),0==f.startOffset&&(g=f.startContainer,domUtils.isBoundaryNode(g,"firstChild")&&(g=f.endContainer,f.endOffset==(3==g.nodeType?g.nodeValue.length:g.childNodes.length)&&domUtils.isBoundaryNode(g,"lastChild"))))return a.fireEvent("saveScene"),a.body.innerHTML="
"+(browser.ie?"":" ")+"
",f.setStart(a.body.firstChild,0).setCursor(!1,!0),void a._selectionChange()}if(e==keymap.Backspace){if(f=a.selection.getRange(),b=f.collapsed,a.fireEvent("delkeydown",d))return;var h,i;if(f.collapsed&&f.inFillChar()&&(h=f.startContainer,domUtils.isFillChar(h)?(f.setStartBefore(h).shrinkBoundary(!0).collapse(!0),domUtils.remove(h)):(h.nodeValue=h.nodeValue.replace(new RegExp("^"+domUtils.fillChar),""),f.startOffset--,f.collapse(!0).select(!0))),h=f.getClosedNode())return a.fireEvent("saveScene"),f.setStartBefore(h),domUtils.remove(h),f.setCursor(),a.fireEvent("saveScene"),void domUtils.preventDefault(d);if(!browser.ie&&(h=domUtils.findParentByTagName(f.startContainer,"table",!0),i=domUtils.findParentByTagName(f.endContainer,"table",!0),h&&!i||!h&&i||h!==i))return void d.preventDefault()}if(e==keymap.Tab){var j={ol:1,ul:1,table:1};if(a.fireEvent("tabkeydown",d))return void domUtils.preventDefault(d);var k=a.selection.getRange();a.fireEvent("saveScene");for(var l=0,m="",n=a.options.tabSize||4,o=a.options.tabNode||" ";l"});d.insertNode(g).setStart(g,0).setCursor(!1,!0)}}if(!b&&(3==d.startContainer.nodeType||1==d.startContainer.nodeType&&domUtils.isEmptyBlock(d.startContainer)))if(browser.ie){var k=d.document.createElement("span");d.insertNode(k).setStartBefore(k).collapse(!0),d.select(),domUtils.remove(k)}else d.select()}})},UE.plugins.fiximgclick=function(){function a(){this.editor=null,this.resizer=null,this.cover=null,this.doc=document,this.prePos={x:0,y:0},this.startPos={x:0,y:0}}var b=!1;return function(){var c=[[0,0,-1,-1],[0,0,0,-1],[0,0,1,-1],[0,0,-1,0],[0,0,1,0],[0,0,-1,1],[0,0,0,1],[0,0,1,1]];a.prototype={init:function(a){var b=this;b.editor=a,b.startPos=this.prePos={x:0,y:0},b.dragId=-1;var c=[],d=b.cover=document.createElement("div"),e=b.resizer=document.createElement("div");for(d.id=b.editor.ui.id+"_imagescale_cover",d.style.cssText="position:absolute;display:none;z-index:"+b.editor.options.zIndex+";filter:alpha(opacity=0); opacity:0;background:#CCC;",domUtils.on(d,"mousedown click",function(){b.hide()}),i=0;i<8;i++)c.push(' ');e.id=b.editor.ui.id+"_imagescale",e.className="edui-editor-imagescale",e.innerHTML=c.join(""),e.style.cssText+=";display:none;border:1px solid #3b77ff;z-index:"+b.editor.options.zIndex+";",b.editor.ui.getDom().appendChild(d),b.editor.ui.getDom().appendChild(e),b.initStyle(),b.initEvents()},initStyle:function(){utils.cssRule("imagescale",".edui-editor-imagescale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}.edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}.edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}.edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}.edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}")},initEvents:function(){var a=this;a.startPos.x=a.startPos.y=0,a.isDraging=!1},_eventHandler:function(a){var c=this;switch(a.type){case"mousedown":var d,d=a.target||a.srcElement;d.className.indexOf("edui-editor-imagescale-hand")!=-1&&c.dragId==-1&&(c.dragId=d.className.slice(-1),c.startPos.x=c.prePos.x=a.clientX,c.startPos.y=c.prePos.y=a.clientY,domUtils.on(c.doc,"mousemove",c.proxy(c._eventHandler,c)));break;case"mousemove":c.dragId!=-1&&(c.updateContainerStyle(c.dragId,{x:a.clientX-c.prePos.x,y:a.clientY-c.prePos.y}),c.prePos.x=a.clientX,c.prePos.y=a.clientY,b=!0,c.updateTargetElement());break;case"mouseup":c.dragId!=-1&&(c.updateContainerStyle(c.dragId,{x:a.clientX-c.prePos.x,y:a.clientY-c.prePos.y}),c.updateTargetElement(),c.target.parentNode&&c.attachTo(c.target),c.dragId=-1),domUtils.un(c.doc,"mousemove",c.proxy(c._eventHandler,c)),b&&(b=!1,c.editor.fireEvent("contentchange"))}},updateTargetElement:function(){var a=this;domUtils.setStyles(a.target,{width:a.resizer.style.width,height:a.resizer.style.height}),a.target.width=parseInt(a.resizer.style.width),a.target.height=parseInt(a.resizer.style.height),a.attachTo(a.target)},updateContainerStyle:function(a,b){var d,e=this,f=e.resizer;0!=c[a][0]&&(d=parseInt(f.style.left)+b.x,f.style.left=e._validScaledProp("left",d)+"px"),0!=c[a][1]&&(d=parseInt(f.style.top)+b.y,f.style.top=e._validScaledProp("top",d)+"px"),0!=c[a][2]&&(d=f.clientWidth+c[a][2]*b.x,f.style.width=e._validScaledProp("width",d)+"px"),0!=c[a][3]&&(d=f.clientHeight+c[a][3]*b.y,f.style.height=e._validScaledProp("height",d)+"px")},_validScaledProp:function(a,b){var c=this.resizer,d=document;switch(b=isNaN(b)?0:b,a){case"left":return b<0?0:b+c.clientWidth>d.clientWidth?d.clientWidth-c.clientWidth:b;case"top":return b<0?0:b+c.clientHeight>d.clientHeight?d.clientHeight-c.clientHeight:b;case"width":return b<=0?1:b+c.offsetLeft>d.clientWidth?d.clientWidth-c.offsetLeft:b;case"height":return b<=0?1:b+c.offsetTop>d.clientHeight?d.clientHeight-c.offsetTop:b}},hideCover:function(){this.cover.style.display="none"},showCover:function(){var a=this,b=domUtils.getXY(a.editor.ui.getDom()),c=domUtils.getXY(a.editor.iframe);domUtils.setStyles(a.cover,{width:a.editor.iframe.offsetWidth+"px",height:a.editor.iframe.offsetHeight+"px",top:c.y-b.y+"px",left:c.x-b.x+"px",position:"absolute",display:""})},show:function(a){var b=this;b.resizer.style.display="block",a&&b.attachTo(a),domUtils.on(this.resizer,"mousedown",b.proxy(b._eventHandler,b)),domUtils.on(b.doc,"mouseup",b.proxy(b._eventHandler,b)),b.showCover(),b.editor.fireEvent("afterscaleshow",b),b.editor.fireEvent("saveScene")},hide:function(){var a=this;a.hideCover(),a.resizer.style.display="none",domUtils.un(a.resizer,"mousedown",a.proxy(a._eventHandler,a)),domUtils.un(a.doc,"mouseup",a.proxy(a._eventHandler,a)),a.editor.fireEvent("afterscalehide",a)},proxy:function(a,b){return function(c){return a.apply(b||this,arguments)}},attachTo:function(a){var b=this,c=b.target=a,d=this.resizer,e=domUtils.getXY(c),f=domUtils.getXY(b.editor.iframe),g=domUtils.getXY(d.parentNode);domUtils.setStyles(d,{width:c.width+"px",height:c.height+"px",left:f.x+e.x-b.editor.document.body.scrollLeft-g.x-parseInt(d.style.borderLeftWidth)+"px",top:f.y+e.y-b.editor.document.body.scrollTop-g.y-parseInt(d.style.borderTopWidth)+"px"})}}}(),function(){var b,c=this;c.setOpt("imageScaleEnabled",!0),!browser.ie&&c.options.imageScaleEnabled&&c.addListener("click",function(d,e){var f=c.selection.getRange(),g=f.getClosedNode();if(g&&"IMG"==g.tagName&&"false"!=c.body.contentEditable){if(g.className.indexOf("edui-faked-music")!=-1||g.getAttribute("anchorname")||domUtils.hasClass(g,"loadingclass")||domUtils.hasClass(g,"loaderrorclass"))return;if(!b){b=new a,b.init(c),c.ui.getDom().appendChild(b.resizer);var h,i=function(a){b.hide(),b.target&&c.selection.getRange().selectNode(b.target).select()},j=function(a){var b=a.target||a.srcElement;!b||void 0!==b.className&&b.className.indexOf("edui-editor-imagescale")!=-1||i(a)};c.addListener("afterscaleshow",function(a){c.addListener("beforekeydown",i),c.addListener("beforemousedown",j),domUtils.on(document,"keydown",i),domUtils.on(document,"mousedown",j),c.selection.getNative().removeAllRanges()}),c.addListener("afterscalehide",function(a){c.removeListener("beforekeydown",i),c.removeListener("beforemousedown",j),domUtils.un(document,"keydown",i),domUtils.un(document,"mousedown",j);var d=b.target;d.parentNode&&c.selection.getRange().selectNode(d).select()}),domUtils.on(b.resizer,"mousedown",function(a){c.selection.getNative().removeAllRanges();var d=a.target||a.srcElement;d&&d.className.indexOf("edui-editor-imagescale-hand")==-1&&(h=setTimeout(function(){b.hide(),b.target&&c.selection.getRange().selectNode(d).select()},200))}),domUtils.on(b.resizer,"mouseup",function(a){var b=a.target||a.srcElement;b&&b.className.indexOf("edui-editor-imagescale-hand")==-1&&clearTimeout(h)})}b.show(g)}else b&&"none"!=b.resizer.style.display&&b.hide()}),browser.webkit&&c.addListener("click",function(a,b){if("IMG"==b.target.tagName&&"false"!=c.body.contentEditable){var d=new dom.Range(c.document);d.selectNode(b.target).select()}})}}(),UE.plugin.register("autolink",function(){var a=0;return browser.ie?{}:{bindEvents:{reset:function(){a=0},keydown:function(a,b){var c=this,d=b.keyCode||b.which;if(32==d||13==d){for(var e,f,g=c.selection.getNative(),h=g.getRangeAt(0).cloneRange(),i=h.startContainer;1==i.nodeType&&h.startOffset>0&&(i=h.startContainer.childNodes[h.startOffset-1]);)h.setStart(i,1==i.nodeType?i.childNodes.length:i.nodeValue.length),h.collapse(!0),i=h.startContainer;do{if(0==h.startOffset){for(i=h.startContainer.previousSibling;i&&1==i.nodeType;)i=i.lastChild;if(!i||domUtils.isFillChar(i))break;e=i.nodeValue.length}else i=h.startContainer,e=h.startOffset;h.setStart(i,e-1),f=h.toString().charCodeAt(0)}while(160!=f&&32!=f);if(h.toString().replace(new RegExp(domUtils.fillChar,"g"),"").match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)){for(;h.toString().length&&!/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(h.toString());)try{h.setStart(h.startContainer,h.startOffset+1)}catch(j){for(var i=h.startContainer;!(next=i.nextSibling);){if(domUtils.isBody(i))return;i=i.parentNode}h.setStart(next,0)}if(domUtils.findParentByTagName(h.startContainer,"a",!0))return;var k,l=c.document.createElement("a"),m=c.document.createTextNode(" ");c.undoManger&&c.undoManger.save(),l.appendChild(h.extractContents()),l.href=l.innerHTML=l.innerHTML.replace(/<[^>]+>/g,""),k=l.getAttribute("href").replace(new RegExp(domUtils.fillChar,"g"),""),k=/^(?:https?:\/\/)/gi.test(k)?k:"http://"+k,l.setAttribute("_src",utils.html(k)),l.href=utils.html(k),h.insertNode(l),l.parentNode.insertBefore(m,l.nextSibling),h.setStart(m,0),h.collapse(!0),g.removeAllRanges(),g.addRange(h),c.undoManger&&c.undoManger.save()}}}}}},function(){function a(a){if(3==a.nodeType)return null;if("A"==a.nodeName)return a;for(var b=a.lastChild;b;){if("A"==b.nodeName)return b;if(3==b.nodeType){if(domUtils.isWhitespace(b)){b=b.previousSibling;continue}return null}b=b.lastChild}}var b={37:1,38:1,39:1,40:1,13:1,32:1};browser.ie&&this.addListener("keyup",function(c,d){var e=this,f=d.keyCode;if(b[f]){var g=e.selection.getRange(),h=g.startContainer;if(13==f){for(;h&&!domUtils.isBody(h)&&!domUtils.isBlockElm(h);)h=h.parentNode;if(h&&!domUtils.isBody(h)&&"P"==h.nodeName){var i=h.previousSibling;if(i&&1==i.nodeType){var i=a(i);i&&!i.getAttribute("_href")&&domUtils.remove(i,!0)}}}else if(32==f)3==h.nodeType&&/^\s$/.test(h.nodeValue)&&(h=h.previousSibling,h&&"A"==h.nodeName&&!h.getAttribute("_href")&&domUtils.remove(h,!0));else if(h=domUtils.findParentByTagName(h,"a",!0),h&&!h.getAttribute("_href")){var j=g.createBookmark();domUtils.remove(h,!0),g.moveToBookmark(j).select(!0)}}})}),UE.plugins.autoheight=function(){function a(){var a=this;clearTimeout(e),f||(!a.queryCommandState||a.queryCommandState&&1!=a.queryCommandState("source"))&&(e=setTimeout(function(){for(var b=a.body.lastChild;b&&1!=b.nodeType;)b=b.previousSibling;b&&1==b.nodeType&&(b.style.clear="both",d=Math.max(domUtils.getXY(b).y+b.offsetHeight+25,Math.max(h.minFrameHeight,h.initialFrameHeight)),d!=g&&(d!==parseInt(a.iframe.parentNode.style.height)&&(a.iframe.parentNode.style.height=d+"px"),a.body.style.height=d+"px",g=d),domUtils.removeStyle(b,"clear"))},50))}var b=this;if(b.autoHeightEnabled=b.options.autoHeightEnabled!==!1,b.autoHeightEnabled){var c,d,e,f,g=0,h=b.options;b.addListener("fullscreenchanged",function(a,b){f=b}),b.addListener("destroy",function(){b.removeListener("contentchange afterinserthtml keyup mouseup",a)}),b.enableAutoHeight=function(){var b=this;if(b.autoHeightEnabled){var d=b.document;b.autoHeightEnabled=!0,c=d.body.style.overflowY,d.body.style.overflowY="hidden",b.addListener("contentchange afterinserthtml keyup mouseup",a),setTimeout(function(){a.call(b)},browser.gecko?100:0),b.fireEvent("autoheightchanged",b.autoHeightEnabled)}},b.disableAutoHeight=function(){b.body.style.overflowY=c||"",b.removeListener("contentchange",a),b.removeListener("keyup",a),b.removeListener("mouseup",a),b.autoHeightEnabled=!1,b.fireEvent("autoheightchanged",b.autoHeightEnabled)},b.on("setHeight",function(){b.disableAutoHeight()}),b.addListener("ready",function(){b.enableAutoHeight();var c;domUtils.on(browser.ie?b.body:b.document,browser.webkit?"dragover":"drop",function(){clearTimeout(c),c=setTimeout(function(){a.call(b)},100)});var d;window.onscroll=function(){
-null===d?d=this.scrollY:0==this.scrollY&&0!=d&&(b.window.scrollTo(0,0),d=null)}})}},UE.plugins.autofloat=function(){function a(){return UE.ui?1:(alert(g.autofloatMsg),0)}function b(){var a=document.body.style;a.backgroundImage='url("about:blank")',a.backgroundAttachment="fixed"}function c(){var a=domUtils.getXY(k),b=domUtils.getComputedStyle(k,"position"),c=domUtils.getComputedStyle(k,"left");k.style.width=k.offsetWidth+"px",k.style.zIndex=1*f.options.zIndex+1,k.parentNode.insertBefore(q,k),o||p&&browser.ie?("absolute"!=k.style.position&&(k.style.position="absolute"),k.style.top=(document.body.scrollTop||document.documentElement.scrollTop)-l+i+"px"):(browser.ie7Compat&&r&&(r=!1,k.style.left=domUtils.getXY(k).x-document.documentElement.getBoundingClientRect().left+2+"px"),"fixed"!=k.style.position&&(k.style.position="fixed",k.style.top=i+"px",("absolute"==b||"relative"==b)&&parseFloat(c)&&(k.style.left=a.x+"px")))}function d(){r=!0,q.parentNode&&q.parentNode.removeChild(q),k.style.cssText=j}function e(){var a=m(f.container),b=f.options.toolbarTopOffset||0;a.top<0&&a.bottom-k.offsetHeight>b?c():d()}var f=this,g=f.getLang();f.setOpt({topOffset:0});var h=f.options.autoFloatEnabled!==!1,i=f.options.topOffset;if(h){var j,k,l,m,n=UE.ui.uiUtils,o=browser.ie&&browser.version<=6,p=browser.quirks,q=document.createElement("div"),r=!0,s=utils.defer(function(){e()},browser.ie?200:100,!0);f.addListener("destroy",function(){domUtils.un(window,["scroll","resize"],e),f.removeListener("keydown",s)}),f.addListener("ready",function(){if(a(f)){if(!f.ui)return;m=n.getClientRect,k=f.ui.getDom("toolbarbox"),l=m(k).top,j=k.style.cssText,q.style.height=k.offsetHeight+"px",o&&b(),domUtils.on(window,["scroll","resize"],e),f.addListener("keydown",s),f.addListener("beforefullscreenchange",function(a,b){b&&d()}),f.addListener("fullscreenchanged",function(a,b){b||e()}),f.addListener("sourcemodechanged",function(a,b){setTimeout(function(){e()},0)}),f.addListener("clearDoc",function(){setTimeout(function(){e()},0)})}})}},UE.plugins.video=function(){function a(a,b,d,e,f,g,h){a=utils.unhtmlForUrl(a),f=utils.unhtml(f),g=utils.unhtml(g),b=parseInt(b,10)||0,d=parseInt(d,10)||0;var i;switch(h){case"image":i=" ';break;case"embed":i='';break;case"video":var j=a.substr(a.lastIndexOf(".")+1);"ogv"==j&&(j="ogg"),i=" '}return i}function b(b,c){utils.each(b.getNodesByTagName(c?"img":"embed video"),function(b){var d=b.getAttr("class");if(d&&d.indexOf("edui-faked-video")!=-1){var e=a(c?b.getAttr("_url"):b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),null,b.getStyle("float")||"",d,c?"embed":"image");b.parentNode.replaceChild(UE.uNode.createElement(e),b)}if(d&&d.indexOf("edui-upload-video")!=-1){var e=a(c?b.getAttr("_url"):b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),null,b.getStyle("float")||"",d,c?"video":"image");b.parentNode.replaceChild(UE.uNode.createElement(e),b)}})}var c=this;c.addOutputRule(function(a){b(a,!0)}),c.addInputRule(function(a){b(a)}),c.commands.insertvideo={execCommand:function(b,d,e){d=utils.isArray(d)?d:[d];for(var f,g,h=[],i="tmpVedio",j=0,k=d.length;j0)return 0;for(var c in dtd.$isNotEmpty)if(dtd.$isNotEmpty.hasOwnProperty(c)&&a.getElementsByTagName(c).length)return 0;return 1},b.getWidth=function(a){return a?parseInt(domUtils.getComputedStyle(a,"width"),10):0},b.getTableCellAlignState=function(a){!utils.isArray(a)&&(a=[a]);var b={},c=["align","valign"],d=null,e=!0;return utils.each(a,function(a){return utils.each(c,function(c){if(d=a.getAttribute(c),!b[c]&&d)b[c]=d;else if(!b[c]||d!==b[c])return e=!1,!1}),e}),e?b:null},b.getTableItemsByRange=function(a){var b=a.selection.getStart();b&&b.id&&0===b.id.indexOf("_baidu_bookmark_start_")&&b.nextSibling&&(b=b.nextSibling);var c=b&&domUtils.findParentByTagName(b,["td","th"],!0),d=c&&c.parentNode,e=b&&domUtils.findParentByTagName(b,"caption",!0),f=e?e.parentNode:d&&d.parentNode.parentNode;return{cell:c,tr:d,table:f,caption:e}},b.getUETableBySelected=function(a){var c=b.getTableItemsByRange(a).table;return c&&c.ueTable&&c.ueTable.selectedTds.length?c.ueTable:null},b.getDefaultValue=function(a,b){var c,d,e,f,g={thin:"0px",medium:"1px",thick:"2px"};if(b)return h=b.getElementsByTagName("td")[0],f=domUtils.getComputedStyle(b,"border-left-width"),c=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"padding-left"),d=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"border-left-width"),e=parseInt(g[f]||f,10),{tableBorder:c,tdPadding:d,tdBorder:e};b=a.document.createElement("table"),b.insertRow(0).insertCell(0).innerHTML="xxx",a.body.appendChild(b);var h=b.getElementsByTagName("td")[0];return f=domUtils.getComputedStyle(b,"border-left-width"),c=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"padding-left"),d=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"border-left-width"),e=parseInt(g[f]||f,10),domUtils.remove(b),{tableBorder:c,tdPadding:d,tdBorder:e}},b.getUETable=function(a){var c=a.tagName.toLowerCase();return a="td"==c||"th"==c||"caption"==c?domUtils.findParentByTagName(a,"table",!0):a,a.ueTable||(a.ueTable=new b(a)),a.ueTable},b.cloneCell=function(a,b,c){if(!a||utils.isString(a))return this.table.ownerDocument.createElement(a||"td");var d=domUtils.hasClass(a,"selectTdClass");d&&domUtils.removeClasses(a,"selectTdClass");var e=a.cloneNode(!0);return b&&(e.rowSpan=e.colSpan=1),!c&&domUtils.removeAttributes(e,"width height"),!c&&domUtils.removeAttributes(e,"style"),e.style.borderLeftStyle="",e.style.borderTopStyle="",e.style.borderLeftColor=a.style.borderRightColor,e.style.borderLeftWidth=a.style.borderRightWidth,e.style.borderTopColor=a.style.borderBottomColor,e.style.borderTopWidth=a.style.borderBottomWidth,d&&domUtils.addClass(a,"selectTdClass"),e},b.prototype={getMaxRows:function(){for(var a,b=this.table.rows,c=1,d=0;a=b[d];d++){for(var e,f=1,g=0;e=a.cells[g++];)f=Math.max(e.rowSpan||1,f);c=Math.max(f+d,c)}return c},getMaxCols:function(){for(var a,b=this.table.rows,c=0,d={},e=0;a=b[e];e++){for(var f,g=0,h=0;f=a.cells[h++];)if(g+=f.colSpan||1,f.rowSpan&&f.rowSpan>1)for(var i=1;ithis.rowsNum-1)?null:(e=c?h?i.endRowIndex+1:g.rowIndex+g.rowSpan:h?i.beginRowIndex-1:g.rowIndex-1,f=h?i.beginColIndex:g.colIndex,this.getCell(this.indexTable[e][f].rowIndex,this.indexTable[e][f].cellIndex))}catch(j){a(j)}},getSameEndPosCells:function(b,c){try{for(var d="x"===c.toLowerCase(),e=domUtils.getXY(b)[d?"x":"y"]+b["offset"+(d?"Width":"Height")],f=this.table.rows,g=null,h=[],i=0;ie&&d)break;if((b==j||e==l)&&(1==j[d?"colSpan":"rowSpan"]&&h.push(j),d))break}}return h}catch(m){a(m)}},setCellContent:function(a,b){a.innerHTML=b||(browser.ie?domUtils.fillChar:" ")},cloneCell:b.cloneCell,getSameStartPosXCells:function(b){try{for(var c,d=domUtils.getXY(b).x+b.offsetWidth,e=this.table.rows,f=[],g=0;gd)break;if(j==d&&1==h.colSpan){f.push(h);break}}}return f}catch(k){a(k)}},update:function(a){this.table=a||this.table,this.selectedTds=[],this.cellsRange={},this.indexTable=[];for(var b=this.table.rows,c=this.getMaxRows(),d=c-b.length,e=this.getMaxCols();d--;)this.table.insertRow(b.length);this.rowsNum=c,this.colsNum=e;for(var f=0,g=b.length;fc&&(j.rowSpan=c);for(var m=k,n=j.rowSpan||1,o=j.colSpan||1;this.indexTable[i][m];)m++;for(var p=0;p0)for(h=b;hf&&(m=Math.max(h,m));if(ee&&(l=Math.max(i,l));if(b>0)for(i=a;ig||d+b.colSpan-1>h)return null;j.push(this.getCell(c,b.cellIndex))}}return j},clearSelected:function(){b.removeSelectedClass(this.selectedTds),this.selectedTds=[],this.cellsRange={}},setSelected:function(a){var c=this.getCells(a);b.addSelectedClass(c),this.selectedTds=c,this.cellsRange=a},isFullRow:function(){var a=this.cellsRange;return a.endColIndex-a.beginColIndex+1==this.colsNum},isFullCol:function(){var a=this.cellsRange,b=this.table,c=b.getElementsByTagName("th"),d=a.endRowIndex-a.beginRowIndex+1;return c.length?d==this.rowsNum||d==this.rowsNum-1:d==this.rowsNum},getNextCell:function(b,c,d){try{var e,f,g=this.getCellInfo(b),h=this.selectedTds.length&&!d,i=this.cellsRange;return!c&&0==g.rowIndex||c&&(h?i.endRowIndex==this.rowsNum-1:g.rowIndex+g.rowSpan>this.rowsNum-1)?null:(e=c?h?i.endRowIndex+1:g.rowIndex+g.rowSpan:h?i.beginRowIndex-1:g.rowIndex-1,f=h?i.beginColIndex:g.colIndex,this.getCell(this.indexTable[e][f].rowIndex,this.indexTable[e][f].cellIndex))}catch(j){a(j)}},getPreviewCell:function(b,c){try{var d,e,f=this.getCellInfo(b),g=this.selectedTds.length,h=this.cellsRange;return!c&&(g?!h.beginColIndex:!f.colIndex)||c&&(g?h.endColIndex==this.colsNum-1:f.rowIndex>this.colsNum-1)?null:(d=c?g?h.beginRowIndex:f.rowIndex<1?0:f.rowIndex-1:g?h.beginRowIndex:f.rowIndex,e=c?g?h.endColIndex+1:f.colIndex:g?h.beginColIndex-1:f.colIndex<1?0:f.colIndex-1,this.getCell(this.indexTable[d][e].rowIndex,this.indexTable[d][e].cellIndex))}catch(i){a(i)}},moveContent:function(a,c){if(!b.isEmptyBlock(c)){if(b.isEmptyBlock(a))return void(a.innerHTML=c.innerHTML);var d=a.lastChild;for(3!=d.nodeType&&dtd.$block[d.tagName]||a.appendChild(a.ownerDocument.createElement("br"));d=c.firstChild;)a.appendChild(d)}},mergeRight:function(a){var b=this.getCellInfo(a),c=b.colIndex+b.colSpan,d=this.indexTable[b.rowIndex][c],e=this.getCell(d.rowIndex,d.cellIndex);a.colSpan=b.colSpan+d.colSpan,a.removeAttribute("width"),this.moveContent(a,e),this.deleteCell(e,d.rowIndex),this.update()},mergeDown:function(a){var b=this.getCellInfo(a),c=b.rowIndex+b.rowSpan,d=this.indexTable[c][b.colIndex],e=this.getCell(d.rowIndex,d.cellIndex);a.rowSpan=b.rowSpan+d.rowSpan,a.removeAttribute("height"),this.moveContent(a,e),this.deleteCell(e,d.rowIndex),this.update()},mergeRange:function(){var a=this.cellsRange,b=this.getCell(a.beginRowIndex,this.indexTable[a.beginRowIndex][a.beginColIndex].cellIndex);if("TH"==b.tagName&&a.endRowIndex!==a.beginRowIndex){var c=this.indexTable,d=this.getCellInfo(b);b=this.getCell(1,c[1][d.colIndex].cellIndex),a=this.getCellsRange(b,this.getCell(c[this.rowsNum-1][d.colIndex].rowIndex,c[this.rowsNum-1][d.colIndex].cellIndex))}for(var e,f=this.getCells(a),g=0;e=f[g++];)e!==b&&(this.moveContent(b,e),this.deleteCell(e));if(b.rowSpan=a.endRowIndex-a.beginRowIndex+1,b.rowSpan>1&&b.removeAttribute("height"),b.colSpan=a.endColIndex-a.beginColIndex+1,b.colSpan>1&&b.removeAttribute("width"),b.rowSpan==this.rowsNum&&1!=b.colSpan&&(b.colSpan=1),b.colSpan==this.colsNum&&1!=b.rowSpan){var h=b.parentNode.rowIndex;if(this.table.deleteRow)for(var g=h+1,i=h+1,j=b.rowSpan;g1&&g.rowIndex==a){var i=h.cloneNode(!0);i.rowSpan=h.rowSpan-1,i.innerHTML="",h.rowSpan=1;var j,k=a+1,l=this.table.rows[k],m=this.getPreviewMergedCellsNum(k,f)-e;m1?l.colSpan--:c[h].deleteCell(j.cellIndex),h+=j.rowSpan||1}}this.table.setAttribute("width",d-e),this.update()},splitToCells:function(a){var b=this,c=this.splitToRows(a);utils.each(c,function(a){b.splitToCols(a)})},splitToRows:function(a){var b=this.getCellInfo(a),c=b.rowIndex,d=b.colIndex,e=[];a.rowSpan=1,e.push(a);for(var f=c,g=c+b.rowSpan;f");for(var g=0;g'+(browser.ie&&browser.version<11?domUtils.fillChar:" ")+"");c.push("")}return""}b||(b=utils.extend({},{numCols:this.options.defaultCols,numRows:this.options.defaultRows,tdvalign:this.options.tdvalign}));var d=this,e=this.selection.getRange(),f=e.startContainer,h=domUtils.findParent(f,function(a){return domUtils.isBlockElm(a)},!0)||d.body,i=g(d),j=h.offsetWidth,k=Math.floor(j/b.numCols-2*i.tdPadding-i.tdBorder);!b.tdvalign&&(b.tdvalign=d.options.tdvalign),d.execCommand("inserthtml",c(b,k))}},UE.commands.insertparagraphbeforetable={queryCommandState:function(){return e(this).cell?0:-1},execCommand:function(){var a=e(this).table;if(a){var b=this.document.createElement("p");b.innerHTML=browser.ie?" ":" ",a.parentNode.insertBefore(b,a),this.selection.getRange().setStart(b,0).setCursor()}}},UE.commands.deletetable={queryCommandState:function(){var a=this.selection.getRange();return domUtils.findParentByTagName(a.startContainer,"table",!0)?0:-1},execCommand:function(a,b){var c=this.selection.getRange();if(b=b||domUtils.findParentByTagName(c.startContainer,"table",!0)){var d=b.nextSibling;d||(d=domUtils.createElement(this.document,"p",{innerHTML:browser.ie?domUtils.fillChar:" "}),b.parentNode.insertBefore(d,b)),domUtils.remove(b),c=this.selection.getRange(),3==d.nodeType?c.setStartBefore(d):c.setStart(d,0),c.setCursor(!1,!0),this.fireEvent("tablehasdeleted")}}},UE.commands.cellalign={queryCommandState:function(){return c(this).length?0:-1},execCommand:function(a,b){var d=c(this);if(d.length)for(var e,f=0;e=d[f++];)e.setAttribute("align",b)}},UE.commands.cellvalign={queryCommandState:function(){return c(this).length?0:-1},execCommand:function(a,b){var d=c(this);if(d.length)for(var e,f=0;e=d[f++];)e.setAttribute("vAlign",b)}},UE.commands.insertcaption={queryCommandState:function(){var a=e(this).table;return a&&0==a.getElementsByTagName("caption").length?1:-1},execCommand:function(){var a=e(this).table;if(a){var b=this.document.createElement("caption");b.innerHTML=browser.ie?domUtils.fillChar:" ",a.insertBefore(b,a.firstChild);var c=this.selection.getRange();c.setStart(b,0).setCursor()}}},UE.commands.deletecaption={queryCommandState:function(){var a=this.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,"table");return b?0==b.getElementsByTagName("caption").length?-1:1:-1},execCommand:function(){var a=this.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,"table");if(b){domUtils.remove(b.getElementsByTagName("caption")[0]);var c=this.selection.getRange();c.setStart(b.rows[0].cells[0],0).setCursor()}}},UE.commands.inserttitle={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[0];return"th"!=b.cells[b.cells.length-1].tagName.toLowerCase()?0:-1}return-1},execCommand:function(){var a=e(this).table;a&&h(a).insertRow(0,"th");var b=a.getElementsByTagName("th")[0];this.selection.getRange().setStart(b,0).setCursor(!1,!0)}},UE.commands.deletetitle={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[0];return"th"==b.cells[b.cells.length-1].tagName.toLowerCase()?0:-1}return-1},execCommand:function(){var a=e(this).table;a&&domUtils.remove(a.rows[0]);var b=a.getElementsByTagName("td")[0];this.selection.getRange().setStart(b,0).setCursor(!1,!0)}},UE.commands.inserttitlecol={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[a.rows.length-1];return b.getElementsByTagName("th").length?-1:0}return-1},execCommand:function(b){var c=e(this).table;c&&h(c).insertCol(0,"th"),a(c,this);var d=c.getElementsByTagName("th")[0];this.selection.getRange().setStart(d,0).setCursor(!1,!0)}},UE.commands.deletetitlecol={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[a.rows.length-1];return b.getElementsByTagName("th").length?0:-1}return-1},execCommand:function(){var b=e(this).table;if(b)for(var c=0;c=f.colsNum)return-1;var j=f.indexTable[g.rowIndex][i],k=c.rows[j.rowIndex].cells[j.cellIndex];return k&&d.tagName==k.tagName&&j.rowIndex==g.rowIndex&&j.rowSpan==g.rowSpan?0:-1},execCommand:function(a){var b=this.selection.getRange(),c=b.createBookmark(!0),d=e(this).cell,f=h(d);f.mergeRight(d),b.moveToBookmark(c).select()}},UE.commands.mergedown={queryCommandState:function(a){var b=e(this),c=b.table,d=b.cell;if(!c||!d)return-1;var f=h(c);if(f.selectedTds.length)return-1;var g=f.getCellInfo(d),i=g.rowIndex+g.rowSpan;if(i>=f.rowsNum)return-1;var j=f.indexTable[i][g.colIndex],k=c.rows[j.rowIndex].cells[j.cellIndex];return k&&d.tagName==k.tagName&&j.colIndex==g.colIndex&&j.colSpan==g.colSpan?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.mergeDown(c),a.moveToBookmark(b).select()}},UE.commands.mergecells={queryCommandState:function(){return f(this)?0:-1},execCommand:function(){var a=f(this);if(a&&a.selectedTds.length){var b=a.selectedTds[0];a.mergeRange();var c=this.selection.getRange();domUtils.isEmptyBlock(b)?c.setStart(b,0).collapse(!0):c.selectNodeContents(b),c.select()}}},UE.commands.insertrow={queryCommandState:function(){var a=e(this),b=a.cell;return b&&("TD"==b.tagName||"TH"==b.tagName&&a.tr!==a.table.rows[0])&&h(a.table).rowsNum0?-1:b&&(b.colSpan>1||b.rowSpan>1)?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToCells(c),a.moveToBookmark(b).select()}},UE.commands.splittorows={queryCommandState:function(){var a=e(this),b=a.cell;if(!b)return-1;var c=h(a.table);return c.selectedTds.length>0?-1:b&&b.rowSpan>1?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToRows(c),a.moveToBookmark(b).select()}},UE.commands.splittocols={queryCommandState:function(){var a=e(this),b=a.cell;if(!b)return-1;var c=h(a.table);return c.selectedTds.length>0?-1:b&&b.colSpan>1?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToCols(c),a.moveToBookmark(b).select()}},UE.commands.adaptbytext=UE.commands.adaptbywindow={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(b){var c=e(this),d=c.table;if(d)if("adaptbywindow"==b)a(d,this);else{var f=domUtils.getElementsByTagName(d,"td th");utils.each(f,function(a){a.removeAttribute("width")}),d.removeAttribute("width")}}},UE.commands.averagedistributecol={queryCommandState:function(){var a=f(this);return a&&(a.isFullRow()||a.isFullCol())?0:-1},execCommand:function(a){function b(){var a,b=e.table,c=0,f=0,h=g(d,b);if(e.isFullRow())c=b.offsetWidth,f=e.colsNum;else for(var i,j=e.cellsRange.beginColIndex,k=e.cellsRange.endColIndex,l=j;l<=k;)i=e.selectedTds[l],c+=i.offsetWidth,l+=i.colSpan,f+=1;return a=Math.ceil(c/f)-2*h.tdBorder-2*h.tdPadding}function c(a){utils.each(domUtils.getElementsByTagName(e.table,"th"),function(a){a.setAttribute("width","")});var b=e.isFullRow()?domUtils.getElementsByTagName(e.table,"td"):e.selectedTds;utils.each(b,function(b){1==b.colSpan&&b.setAttribute("width",a)})}var d=this,e=f(d);e&&e.selectedTds.length&&c(b())}},UE.commands.averagedistributerow={queryCommandState:function(){var a=f(this);return a?a.selectedTds&&/th/gi.test(a.selectedTds[0].tagName)?-1:a.isFullRow()||a.isFullCol()?0:-1:-1},execCommand:function(a){function b(){var a,b,c=0,f=e.table,h=g(d,f),i=parseInt(domUtils.getComputedStyle(f.getElementsByTagName("td")[0],"padding-top"));if(e.isFullCol()){var j,k,l=domUtils.getElementsByTagName(f,"caption"),m=domUtils.getElementsByTagName(f,"th");l.length>0&&(j=l[0].offsetHeight),m.length>0&&(k=m[0].offsetHeight),c=f.offsetHeight-(j||0)-(k||0),b=0==m.length?e.rowsNum:e.rowsNum-1}else{for(var n=e.cellsRange.beginRowIndex,o=e.cellsRange.endRowIndex,p=0,q=domUtils.getElementsByTagName(f,"tr"),r=n;r<=o;r++)c+=q[r].offsetHeight,p+=1;b=p}return a=browser.ie&&browser.version<9?Math.ceil(c/b):Math.ceil(c/b)-2*h.tdBorder-2*i}function c(a){var b=e.isFullCol()?domUtils.getElementsByTagName(e.table,"td"):e.selectedTds;utils.each(b,function(b){1==b.rowSpan&&b.setAttribute("height",a)})}var d=this,e=f(d);e&&e.selectedTds.length&&c(b())}},UE.commands.cellalignment={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this,d=f(c);if(d)utils.each(d.selectedTds,function(a){domUtils.setAttributes(a,b)});else{var e=c.selection.getStart(),g=e&&domUtils.findParentByTagName(e,["td","th","caption"],!0);/caption/gi.test(g.tagName)?(g.style.textAlign=b.align,g.style.verticalAlign=b.vAlign):domUtils.setAttributes(g,b),c.selection.getRange().setCursor(!0)}},queryCommandValue:function(a){var b=e(this).cell;if(b||(b=c(this)[0]),b){var d=UE.UETable.getUETable(b).selectedTds;return!d.length&&(d=b),UE.UETable.getTableCellAlignState(d)}return null}},UE.commands.tablealignment={queryCommandState:function(){return browser.ie&&browser.version<8?-1:e(this).table?0:-1},execCommand:function(a,b){var c=this,d=c.selection.getStart(),e=d&&domUtils.findParentByTagName(d,["table"],!0);e&&e.setAttribute("align",b)}},UE.commands.edittable={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this.selection.getRange(),d=domUtils.findParentByTagName(c.startContainer,"table");if(d){var e=domUtils.getElementsByTagName(d,"td").concat(domUtils.getElementsByTagName(d,"th"),domUtils.getElementsByTagName(d,"caption"));utils.each(e,function(a){a.style.borderColor=b})}}},UE.commands.edittd={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this,d=f(c);if(d)utils.each(d.selectedTds,function(a){a.style.backgroundColor=b});else{var e=c.selection.getStart(),g=e&&domUtils.findParentByTagName(e,["td","th","caption"],!0);g&&(g.style.backgroundColor=b)}}},UE.commands.settablebackground={queryCommandState:function(){return c(this).length>1?0:-1},execCommand:function(a,b){var d,e;d=c(this),e=h(d[0]),e.setBackground(d,b)}},UE.commands.cleartablebackground={queryCommandState:function(){var a=c(this);if(!a.length)return-1;for(var b,d=0;b=a[d++];)if(""!==b.style.backgroundColor)return 0;return-1},execCommand:function(){var a=c(this),b=h(a[0]);b.removeBackground(a)}},UE.commands.interlacetable=UE.commands.uninterlacetable={queryCommandState:function(a){var b=e(this).table;if(!b)return-1;var c=b.getAttribute("interlaced");return"interlacetable"==a?"enabled"===c?-1:0:c&&"disabled"!==c?0:-1},execCommand:function(a,b){var c=e(this).table;"interlacetable"==a?(c.setAttribute("interlaced","enabled"),this.fireEvent("interlacetable",c,b)):(c.setAttribute("interlaced","disabled"),this.fireEvent("uninterlacetable",c))}},UE.commands.setbordervisible={queryCommandState:function(a){var b=e(this).table;return b?0:-1},execCommand:function(){var a=e(this).table;utils.each(domUtils.getElementsByTagName(a,"td"),function(a){a.style.borderWidth="1px",a.style.borderStyle="solid"})}}}(),UE.plugins.table=function(){function a(a){}function b(a,b){c(a,"width",!0),c(a,"height",!0)}function c(a,b,c){a.style[b]&&(c&&a.setAttribute(b,parseInt(a.style[b],10)),a.style[b]="")}function d(a){if("TD"==a.tagName||"TH"==a.tagName)return a;var b;return(b=domUtils.findParentByTagName(a,"td",!0)||domUtils.findParentByTagName(a,"th",!0))?b:null}function e(a){var b=new RegExp(domUtils.fillChar,"g");if(a[browser.ie?"innerText":"textContent"].replace(/^\s*$/,"").replace(b,"").length>0)return 0;for(var c in dtd.$isNotEmpty)if(a.getElementsByTagName(c).length)return 0;return 1}function f(a){return a.pageX||a.pageY?{x:a.pageX,y:a.pageY}:{x:a.clientX+N.document.body.scrollLeft-N.document.body.clientLeft,y:a.clientY+N.document.body.scrollTop-N.document.body.clientTop}}function g(b){if(!A())try{var c,e=d(b.target||b.srcElement);if(R&&(N.body.style.webkitUserSelect="none",(Math.abs(V.x-b.clientX)>T||Math.abs(V.y-b.clientY)>T)&&(t(),R=!1,U=0,v(b))),ca&&ha)return U=0,N.body.style.webkitUserSelect="none",N.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"](),c=f(b),m(N,!0,ca,c,e),void("h"==ca?ga.style.left=k(ha,b)+"px":"v"==ca&&(ga.style.top=l(ha,b)+"px"));if(e){if(N.fireEvent("excludetable",e)===!0)return;c=f(b);var g=n(e,c),i=domUtils.findParentByTagName(e,"table",!0);if(j(i,e,b,!0)){if(N.fireEvent("excludetable",i)===!0)return;N.body.style.cursor="url("+N.options.cursorpath+"h.png),pointer"}else if(j(i,e,b)){if(N.fireEvent("excludetable",i)===!0)return;N.body.style.cursor="url("+N.options.cursorpath+"v.png),pointer"}else{N.body.style.cursor="text";/\d/.test(g)&&(g=g.replace(/\d/,""),e=Y(e).getPreviewCell(e,"v"==g)),m(N,!!e&&!!g,e?g:"",c,e)}}else h(!1,i,N)}catch(o){a(o)}}function h(a,b,c){if(a)i(b,c);else{if(fa)return;la=setTimeout(function(){!fa&&ea&&ea.parentNode&&ea.parentNode.removeChild(ea)},2e3)}}function i(a,b){function c(c,d){clearTimeout(g),g=setTimeout(function(){b.fireEvent("tableClicked",a,d)},300)}function d(c){clearTimeout(g);var d=Y(a),e=a.rows[0].cells[0],f=d.getLastCell(),h=d.getCellsRange(e,f);b.selection.getRange().setStart(e,0).setCursor(!1,!0),d.setSelected(h)}var e=domUtils.getXY(a),f=a.ownerDocument;if(ea&&ea.parentNode)return ea;ea=f.createElement("div"),ea.contentEditable=!1,ea.innerHTML="",ea.style.cssText="width:15px;height:15px;background-image:url("+b.options.UEDITOR_HOME_URL+"dialogs/table/dragicon.png);position: absolute;cursor:move;top:"+(e.y-15)+"px;left:"+e.x+"px;",domUtils.unSelectable(ea),ea.onmouseover=function(a){fa=!0},ea.onmouseout=function(a){fa=!1},domUtils.on(ea,"click",function(a,b){c(b,this)}),domUtils.on(ea,"dblclick",function(a,b){d(b)}),domUtils.on(ea,"dragstart",function(a,b){domUtils.preventDefault(b)});var g;f.body.appendChild(ea)}function j(a,b,c,d){var e=f(c),g=n(b,e);if(d){var h=a.getElementsByTagName("caption")[0],i=h?h.offsetHeight:0;return"v1"==g&&e.y-domUtils.getXY(a).y-i<8}return"h1"==g&&e.x-domUtils.getXY(a).x<8}function k(a,b){var c=Y(a);if(c){var d=c.getSameEndPosCells(a,"x")[0],e=c.getSameStartPosXCells(a)[0],g=f(b).x,h=(d?domUtils.getXY(d).x:domUtils.getXY(c.table).x)+20,i=e?domUtils.getXY(e).x+e.offsetWidth-20:N.body.offsetWidth+5||parseInt(domUtils.getComputedStyle(N.body,"width"),10);return h+=Q,i-=Q,gi?i:g}}function l(b,c){try{var d=domUtils.getXY(b).y,e=f(c).y;return ek[c]?(a=!1,!1):void l.push(d)});var b=a?l:k;utils.each(i,function(a,c){a.width=b[c]-G()})},0)}}}}function q(a){if(_(domUtils.getElementsByTagName(N.body,"td th")),utils.each(N.document.getElementsByTagName("table"),function(a){a.ueTable=null}),aa=M(N,a)){var b=domUtils.findParentByTagName(aa,"table",!0);ut=Y(b),ut&&ut.clearSelected(),da?r(a):(N.document.body.style.webkitUserSelect="",ia=!0,N.addListener("mouseover",x))}}function r(a){browser.ie&&(a=u(a)),t(),R=!0,O=setTimeout(function(){v(a)},W)}function s(a,b){for(var c=[],d=null,e=0,f=a.length;e0&&U--},W),2===U))return U=0,void p(b);if(2!=b.button){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"table",!0),f=domUtils.findParentByTagName(d.endContainer,"table",!0);if((e||f)&&(e===f?(e=domUtils.findParentByTagName(d.startContainer,["td","th","caption"],!0),f=domUtils.findParentByTagName(d.endContainer,["td","th","caption"],!0),e!==f&&c.selection.clearRange()):c.selection.clearRange()),ia=!1,c.document.body.style.webkitUserSelect="",ca&&ha&&(c.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"](),U=0,ga=c.document.getElementById("ue_tableDragLine"))){var g=domUtils.getXY(ha),h=domUtils.getXY(ga);switch(ca){case"h":z(ha,h.x-g.x);break;case"v":B(ha,h.y-g.y-ha.offsetHeight)}return ca="",ha=null,I(c),void c.fireEvent("saveScene")}if(aa){var i=Y(aa),j=i?i.selectedTds[0]:null;if(j)d=new dom.Range(c.document),domUtils.isEmptyBlock(j)?d.setStart(j,0).setCursor(!1,!0):d.selectNodeContents(j).shrinkBoundary().setCursor(!1,!0);else if(d=c.selection.getRange().shrinkBoundary(),!d.collapsed){var e=domUtils.findParentByTagName(d.startContainer,["td","th"],!0),f=domUtils.findParentByTagName(d.endContainer,["td","th"],!0);(e&&!f||!e&&f||e&&f&&e!==f)&&d.setCursor(!1,!0)}aa=null,c.removeListener("mouseover",x)}else{var k=domUtils.findParentByTagName(b.target||b.srcElement,"td",!0);if(k||(k=domUtils.findParentByTagName(b.target||b.srcElement,"th",!0)),k&&("TD"==k.tagName||"TH"==k.tagName)){if(c.fireEvent("excludetable",k)===!0)return;d=new dom.Range(c.document),d.setStart(k,0).setCursor(!1,!0)}}c._selectionChange(250,b)}}}function x(a,b){if(!A()){var c=this,d=b.target||b.srcElement;if(ba=domUtils.findParentByTagName(d,"td",!0)||domUtils.findParentByTagName(d,"th",!0),aa&&ba&&("TD"==aa.tagName&&"TD"==ba.tagName||"TH"==aa.tagName&&"TH"==ba.tagName)&&domUtils.findParentByTagName(aa,"table")==domUtils.findParentByTagName(ba,"table")){var e=Y(ba);if(aa!=ba){c.document.body.style.webkitUserSelect="none",c.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"]();var f=e.getCellsRange(aa,ba);e.setSelected(f)}else c.document.body.style.webkitUserSelect="",e.clearSelected()}b.preventDefault?b.preventDefault():b.returnValue=!1}}function y(a,b,c){var d=parseInt(domUtils.getComputedStyle(a,"line-height"),10),e=c+b;b=ef?(c&&g.push({left:a}),!1):void 0})}),g}function D(a,b,c){if(a-=G(),a<0)return 0;a-=E(b);var d=a<0?"left":"right";return a=Math.abs(a),utils.each(c,function(b){var c=b[d];c&&(a=Math.min(a,E(c)-Q))}),a=a<0?0:a,"left"===d?-a:a}function E(a){var b=0,b=a.offsetWidth-G();a.nextSibling||(b-=F(a)),b=b<0?0:b;try{a.width=b}catch(c){}return b}function F(a){if(tab=domUtils.findParentByTagName(a,"table",!1),void 0===tab.offsetVal){var b=a.previousSibling;b?tab.offsetVal=a.offsetWidth-b.offsetWidth===X.borderWidth?X.borderWidth:0:tab.offsetVal=0}return tab.offsetVal}function G(){if(void 0===X.tabcellSpace){var a=N.document.createElement("table"),b=N.document.createElement("tbody"),c=N.document.createElement("tr"),d=N.document.createElement("td"),e=null;d.style.cssText="border: 0;",d.width=1,c.appendChild(d),c.appendChild(e=d.cloneNode(!1)),b.appendChild(c),a.appendChild(b),a.style.cssText="visibility: hidden;",N.body.appendChild(a),X.paddingSpace=d.offsetWidth-1;var f=a.offsetWidth;d.style.cssText="",e.style.cssText="",X.borderWidth=(a.offsetWidth-f)/3,X.tabcellSpace=X.paddingSpace+X.borderWidth,N.body.removeChild(a)}return G=function(){return X.tabcellSpace},X.tabcellSpace}function H(a,b){ia||(ga=a.document.createElement("div"),domUtils.setAttributes(ga,{id:"ue_tableDragLine",unselectable:"on",contenteditable:!1,onresizestart:"return false",ondragstart:"return false",onselectstart:"return false",style:"background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)"}),a.body.appendChild(ga))}function I(a){if(!ia)for(var b;b=a.document.getElementById("ue_tableDragLine");)domUtils.remove(b)}function J(a,b){if(b){var c,d=domUtils.findParentByTagName(b,"table"),e=d.getElementsByTagName("caption"),f=d.offsetWidth,g=d.offsetHeight-(e.length>0?e[0].offsetHeight:0),h=domUtils.getXY(d),i=domUtils.getXY(b);switch(a){case"h":c="height:"+g+"px;top:"+(h.y+(e.length>0?e[0].offsetHeight:0))+"px;left:"+(i.x+b.offsetWidth),ga.style.cssText=c+"px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)";break;case"v":c="width:"+f+"px;left:"+h.x+"px;top:"+(i.y+b.offsetHeight),ga.style.cssText=c+"px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)"}}}function K(a,b){for(var c,d,e=domUtils.getElementsByTagName(a.body,"table"),f=0;d=e[f++];){var g=domUtils.getElementsByTagName(d,"td");g[0]&&(b?(c=g[0].style.borderColor.replace(/\s/g,""),/(#ffffff)|(rgb\(255,255,255\))/gi.test(c)&&domUtils.addClass(d,"noBorderTable")):domUtils.removeClasses(d,"noBorderTable"))}}function L(a,b,c){var d=a.body;return d.offsetWidth-(b?2*parseInt(domUtils.getComputedStyle(d,"margin-left"),10):0)-2*c.tableBorder-(a.options.offsetWidth||0)}function M(a,b){var c=domUtils.findParentByTagName(b.target||b.srcElement,["td","th"],!0),d=null;if(!c)return null;if(d=n(c,f(b)),!c)return null;if("h1"===d&&c.previousSibling){var e=domUtils.getXY(c),g=c.offsetWidth;Math.abs(e.x+g-b.clientX)>g/3&&(c=c.previousSibling)}else if("v1"===d&&c.parentNode.previousSibling){var e=domUtils.getXY(c),h=c.offsetHeight;Math.abs(e.y+h-b.clientY)>h/3&&(c=c.parentNode.previousSibling.firstChild)}return c&&a.fireEvent("excludetable",c)!==!0?c:null}var N=this,O=null,P=null,Q=5,R=!1,S=5,T=10,U=0,V=null,W=360,X=UE.UETable,Y=function(a){return X.getUETable(a)},Z=function(a){return X.getUETableBySelected(a)},$=function(a,b){return X.getDefaultValue(a,b)},_=function(a){return X.removeSelectedClass(a)};N.ready(function(){var a=this,b=a.selection.getText;a.selection.getText=function(){var c=Z(a);if(c){var d="";return utils.each(c.selectedTds,function(a){d+=a[browser.ie?"innerText":"textContent"]}),d}return b.call(a.selection)}});var aa=null,ba=null,ca="",da=!1,ea=null,fa=!1,ga=null,ha=null,ia=!1,ja=!0;N.setOpt({maxColNum:20,maxRowNum:100,defaultCols:5,defaultRows:5,tdvalign:"top",cursorpath:N.options.UEDITOR_HOME_URL+"themes/default/images/cursor_",tableDragable:!1,classList:["ue-table-interlace-color-single","ue-table-interlace-color-double"]}),N.getUETable=Y;var ka={deletetable:1,inserttable:1,cellvalign:1,insertcaption:1,deletecaption:1,inserttitle:1,deletetitle:1,mergeright:1,mergedown:1,mergecells:1,insertrow:1,insertrownext:1,deleterow:1,insertcol:1,insertcolnext:1,deletecol:1,splittocells:1,splittorows:1,splittocols:1,adaptbytext:1,adaptbywindow:1,adaptbycustomer:1,insertparagraph:1,insertparagraphbeforetable:1,averagedistributecol:1,averagedistributerow:1};N.ready(function(){utils.cssRule("table",".selectTdClass{background-color:#edf5fa !important}table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}table{margin-bottom:10px;border-collapse:collapse;display:table;}td,th{padding: 5px 10px;border: 1px solid #DDD;}caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}th{border-top:1px solid #BBB;background-color:#F7F7F7;}table tr.firstRow th{border-top-width:2px;}.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }td p{margin:0;padding:0;}",N.document);var a,c,f;N.addListener("keydown",function(b,d){var g=this,h=d.keyCode||d.which;if(8==h){var i=Z(g);i&&i.selectedTds.length&&(i.isFullCol()?g.execCommand("deletecol"):i.isFullRow()?g.execCommand("deleterow"):g.fireEvent("delcells"),domUtils.preventDefault(d));var j=domUtils.findParentByTagName(g.selection.getStart(),"caption",!0),k=g.selection.getRange();if(k.collapsed&&j&&e(j)){g.fireEvent("saveScene");var l=j.parentNode;domUtils.remove(j),l&&k.setStart(l.rows[0].cells[0],0).setCursor(!1,!0),g.fireEvent("saveScene")}}if(46==h&&(i=Z(g))){g.fireEvent("saveScene");for(var m,n=0;m=i.selectedTds[n++];)domUtils.fillNode(g.document,m);g.fireEvent("saveScene"),domUtils.preventDefault(d)}if(13==h){var o=g.selection.getRange(),j=domUtils.findParentByTagName(o.startContainer,"caption",!0);if(j){var l=domUtils.findParentByTagName(j,"table");return o.collapsed?j&&o.setStart(l.rows[0].cells[0],0).setCursor(!1,!0):(o.deleteContents(),g.fireEvent("saveScene")),void domUtils.preventDefault(d)}if(o.collapsed){var l=domUtils.findParentByTagName(o.startContainer,"table");if(l){var p=l.rows[0].cells[0],q=domUtils.findParentByTagName(g.selection.getStart(),["td","th"],!0),r=l.previousSibling;if(p===q&&(!r||1==r.nodeType&&"TABLE"==r.tagName)&&domUtils.isStartInblock(o)){var s=domUtils.findParent(g.selection.getStart(),function(a){return domUtils.isBlockElm(a)},!0);s&&(/t(h|d)/i.test(s.tagName)||s===q.firstChild)&&(g.execCommand("insertparagraphbeforetable"),domUtils.preventDefault(d))}}}}if((d.ctrlKey||d.metaKey)&&"67"==d.keyCode){a=null;var i=Z(g);if(i){var t=i.selectedTds;c=i.isFullCol(),f=i.isFullRow(),a=[[i.cloneCell(t[0],null,!0)]];for(var m,n=1;m=t[n];n++)m.parentNode!==t[n-1].parentNode?a.push([i.cloneCell(m,null,!0)]):a[a.length-1].push(i.cloneCell(m,null,!0))}}}),N.addListener("tablehasdeleted",function(){m(this,!1,"",null),ea&&domUtils.remove(ea)}),N.addListener("beforepaste",function(d,g){var h=this,i=h.selection.getRange();if(domUtils.findParentByTagName(i.startContainer,"caption",!0)){var j=h.document.createElement("div");return j.innerHTML=g.html,void(g.html=j[browser.ie9below?"innerText":"textContent"])}var k=Z(h);if(a){h.fireEvent("saveScene");var l,m,i=h.selection.getRange(),n=domUtils.findParentByTagName(i.startContainer,["td","th"],!0);if(n){var o=Y(n);if(f){var p=o.getCellInfo(n).rowIndex;"TH"==n.tagName&&p++;for(var q,r=0;q=a[r++];){for(var s,t=o.insertRow(p++,"td"),u=0;s=q[u];u++){var v=t.cells[u];v||(v=t.insertCell(u)),v.innerHTML=s.innerHTML,s.getAttribute("width")&&v.setAttribute("width",s.getAttribute("width")),s.getAttribute("vAlign")&&v.setAttribute("vAlign",s.getAttribute("vAlign")),s.getAttribute("align")&&v.setAttribute("align",s.getAttribute("align")),s.style.cssText&&(v.style.cssText=s.style.cssText)}for(var s,u=0;(s=t.cells[u])&&q[u];u++)s.innerHTML=q[u].innerHTML,q[u].getAttribute("width")&&s.setAttribute("width",q[u].getAttribute("width")),q[u].getAttribute("vAlign")&&s.setAttribute("vAlign",q[u].getAttribute("vAlign")),q[u].getAttribute("align")&&s.setAttribute("align",q[u].getAttribute("align")),q[u].style.cssText&&(s.style.cssText=q[u].style.cssText)}}else{if(c){y=o.getCellInfo(n);for(var s,w=0,u=0,q=a[0];s=q[u++];)w+=s.colSpan||1;for(h.__hasEnterExecCommand=!0,r=0;r1&&(x.rowSpan=1)}var z=$(h),A=h.body.offsetWidth-(ja?2*parseInt(domUtils.getComputedStyle(h.body,"margin-left"),10):0)-2*z.tableBorder-(h.options.offsetWidth||0);h.execCommand("insertHTML",""+k.innerHTML.replace(/>\s*<").replace(/\bth\b/gi,"td")+"
")}return h.fireEvent("contentchange"),h.fireEvent("saveScene"),g.html="",!0}var B,j=h.document.createElement("div");j.innerHTML=g.html,B=j.getElementsByTagName("table"),domUtils.findParentByTagName(h.selection.getStart(),"table")?(utils.each(B,function(a){domUtils.remove(a)}),domUtils.findParentByTagName(h.selection.getStart(),"caption",!0)&&(j.innerHTML=j[browser.ie?"innerText":"textContent"])):utils.each(B,function(a){b(a,!0),domUtils.removeAttributes(a,["style","border"]),utils.each(domUtils.getElementsByTagName(a,"td"),function(a){e(a)&&domUtils.fillNode(h.document,a),b(a,!0)})}),g.html=j.innerHTML}),N.addListener("afterpaste",function(){utils.each(domUtils.getElementsByTagName(N.body,"table"),function(a){if(a.offsetWidth>N.body.offsetWidth){var b=$(N,a);a.style.width=N.body.offsetWidth-(ja?2*parseInt(domUtils.getComputedStyle(N.body,"margin-left"),10):0)-2*b.tableBorder-(N.options.offsetWidth||0)+"px"}})}),N.addListener("blur",function(){a=null});var i;N.addListener("keydown",function(){clearTimeout(i),i=setTimeout(function(){var a=N.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,["th","td"],!0);if(b){var c=b.parentNode.parentNode.parentNode;c.offsetWidth>c.getAttribute("width")&&(b.style.wordBreak="break-all")}},100)}),N.addListener("selectionchange",function(){m(N,!1,"",null)}),N.addListener("contentchange",function(){var a=this;if(I(a),!Z(a)){var b=a.selection.getRange(),c=b.startContainer;c=domUtils.findParentByTagName(c,["td","th"],!0),utils.each(domUtils.getElementsByTagName(a.document,"table"),function(b){a.fireEvent("excludetable",b)!==!0&&(b.ueTable=new X(b),b.onmouseover=function(){a.fireEvent("tablemouseover",b)},b.onmousemove=function(){a.fireEvent("tablemousemove",b),a.options.tableDragable&&h(!0,this,a),utils.defer(function(){a.fireEvent("contentchange",50)},!0)},b.onmouseout=function(){a.fireEvent("tablemouseout",b),m(a,!1,"",null),I(a)},b.onclick=function(b){b=a.window.event||b;var c=d(b.target||b.srcElement);if(c){var e,f=Y(c),g=f.table,h=f.getCellInfo(c),i=a.selection.getRange();if(j(g,c,b,!0)){var k=f.getCell(f.indexTable[f.rowsNum-1][h.colIndex].rowIndex,f.indexTable[f.rowsNum-1][h.colIndex].cellIndex);return void(b.shiftKey&&f.selectedTds.length?f.selectedTds[0]!==k?(e=f.getCellsRange(f.selectedTds[0],k),f.setSelected(e)):i&&i.selectNodeContents(k).select():c!==k?(e=f.getCellsRange(c,k),f.setSelected(e)):i&&i.selectNodeContents(k).select())}if(j(g,c,b)){var l=f.getCell(f.indexTable[h.rowIndex][f.colsNum-1].rowIndex,f.indexTable[h.rowIndex][f.colsNum-1].cellIndex);b.shiftKey&&f.selectedTds.length?f.selectedTds[0]!==l?(e=f.getCellsRange(f.selectedTds[0],l),f.setSelected(e)):i&&i.selectNodeContents(l).select():c!==l?(e=f.getCellsRange(c,l),f.setSelected(e)):i&&i.selectNodeContents(l).select()}}})}),K(a,!0)}}),domUtils.on(N.document,"mousemove",g),domUtils.on(N.document,"mouseout",function(a){var b=a.target||a.srcElement;"TABLE"==b.tagName&&m(N,!1,"",null)}),N.addListener("interlacetable",function(a,b,c){if(b)for(var d=this,e=b.rows,f=e.length,g=function(a,b,c){return a[b]?a[b]:c?a[b%a.length]:""},h=0;h1?k:f.getCellInfo(d).rowIndex;var g=f.getTabNextCell(d,k);g?e(g)?a.setStart(g,0).setCursor(!1,!0):a.selectNodeContents(g).select():(N.fireEvent("saveScene"),N.__hasEnterExecCommand=!0,this.execCommand("insertrownext"),N.__hasEnterExecCommand=!1,a=this.selection.getRange(),a.setStart(c.rows[c.rows.length-1].cells[0],0).setCursor(),N.fireEvent("saveScene"))}return!0}}),browser.ie&&N.addListener("selectionchange",function(){m(this,!1,"",null)}),N.addListener("keydown",function(a,b){var c=this,d=b.keyCode||b.which;if(8!=d&&46!=d){var e=!(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey);e&&_(domUtils.getElementsByTagName(c.body,"td"));var f=Z(c);f&&e&&f.clearSelected()}}),N.addListener("beforegetcontent",function(){K(this,!1),browser.ie&&utils.each(this.document.getElementsByTagName("caption"),function(a){domUtils.isEmptyNode(a)&&(a.innerHTML=" ")})}),N.addListener("aftergetcontent",function(){K(this,!0)}),N.addListener("getAllHtml",function(){_(N.document.getElementsByTagName("td"))}),N.addListener("fullscreenchanged",function(a,b){if(!b){var c=this.body.offsetWidth/document.body.offsetWidth,d=domUtils.getElementsByTagName(this.body,"table");utils.each(d,function(a){if(a.offsetWidth1||c[e].getAttribute("rowspan")>1)return-1;return b?"enablesort"==a^"sortEnabled"!=b.getAttribute("data-sort")?-1:0:-1},execCommand:function(a){var b=d(this).table;b.setAttribute("data-sort","enablesort"==a?"sortEnabled":"sortDisabled"),"enablesort"==a?domUtils.addClass(b,"sortEnabled"):domUtils.removeClasses(b,"sortEnabled")}}},UE.plugins.contextmenu=function(){var a=this;if(a.setOpt("enableContextMenu",!0),a.getOpt("enableContextMenu")!==!1){var b,c=a.getLang("contextMenu"),d=a.options.contextMenu||[{label:c.selectall,cmdName:"selectall"},{label:c.cleardoc,cmdName:"cleardoc",exec:function(){confirm(c.confirmclear)&&this.execCommand("cleardoc")}},"-",{label:c.unlink,cmdName:"unlink"},"-",{group:c.paragraph,icon:"justifyjustify",subMenu:[{label:c.justifyleft,cmdName:"justify",value:"left"},{label:c.justifyright,cmdName:"justify",value:"right"},{label:c.justifycenter,cmdName:"justify",value:"center"},{label:c.justifyjustify,cmdName:"justify",value:"justify"}]},"-",{group:c.table,icon:"table",subMenu:[{label:c.inserttable,cmdName:"inserttable"},{label:c.deletetable,cmdName:"deletetable"},"-",{label:c.deleterow,cmdName:"deleterow"},{label:c.deletecol,cmdName:"deletecol"},{label:c.insertcol,cmdName:"insertcol"},{label:c.insertcolnext,cmdName:"insertcolnext"},{label:c.insertrow,cmdName:"insertrow"},{label:c.insertrownext,cmdName:"insertrownext"},"-",{label:c.insertcaption,cmdName:"insertcaption"},{label:c.deletecaption,cmdName:"deletecaption"},{label:c.inserttitle,cmdName:"inserttitle"},{label:c.deletetitle,cmdName:"deletetitle"},{label:c.inserttitlecol,cmdName:"inserttitlecol"},{label:c.deletetitlecol,cmdName:"deletetitlecol"},"-",{label:c.mergecells,cmdName:"mergecells"},{label:c.mergeright,cmdName:"mergeright"},{label:c.mergedown,cmdName:"mergedown"},"-",{label:c.splittorows,cmdName:"splittorows"},{label:c.splittocols,cmdName:"splittocols"},{label:c.splittocells,cmdName:"splittocells"},"-",{label:c.averageDiseRow,cmdName:"averagedistributerow"},{label:c.averageDisCol,cmdName:"averagedistributecol"},"-",{label:c.edittd,cmdName:"edittd",exec:function(){UE.ui.edittd&&new UE.ui.edittd(this),this.getDialog("edittd").open()}},{label:c.edittable,cmdName:"edittable",exec:function(){UE.ui.edittable&&new UE.ui.edittable(this),this.getDialog("edittable").open()}},{label:c.setbordervisible,cmdName:"setbordervisible"}]},{group:c.tablesort,icon:"tablesort",subMenu:[{label:c.enablesort,cmdName:"enablesort"},{label:c.disablesort,cmdName:"disablesort"},"-",{label:c.reversecurrent,cmdName:"sorttable",value:"reversecurrent"},{label:c.orderbyasc,cmdName:"sorttable",value:"orderbyasc"},{label:c.reversebyasc,cmdName:"sorttable",value:"reversebyasc"},{label:c.orderbynum,cmdName:"sorttable",value:"orderbynum"},{label:c.reversebynum,cmdName:"sorttable",value:"reversebynum"}]},{group:c.borderbk,icon:"borderBack",subMenu:[{label:c.setcolor,cmdName:"interlacetable",exec:function(){this.execCommand("interlacetable")}},{label:c.unsetcolor,cmdName:"uninterlacetable",exec:function(){this.execCommand("uninterlacetable")}},{label:c.setbackground,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["#bbb","#ccc"]})}},{label:c.unsetbackground,cmdName:"cleartablebackground",exec:function(){this.execCommand("cleartablebackground")}},{label:c.redandblue,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["red","blue"]})}},{label:c.threecolorgradient,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["#aaa","#bbb","#ccc"]})}}]},{group:c.aligntd,icon:"aligntd",subMenu:[{cmdName:"cellalignment",value:{align:"left",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"left",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"left",vAlign:"bottom"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"bottom"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"bottom"}}]},{group:c.aligntable,icon:"aligntable",subMenu:[{cmdName:"tablealignment",className:"left",label:c.tableleft,value:"left"},{cmdName:"tablealignment",className:"center",label:c.tablecenter,value:"center"},{cmdName:"tablealignment",className:"right",label:c.tableright,value:"right"}]},"-",{label:c.insertparagraphbefore,cmdName:"insertparagraph",value:!0},{label:c.insertparagraphafter,cmdName:"insertparagraph"},{label:c.copy,cmdName:"copy"},{label:c.paste,cmdName:"paste"}];if(d.length){var e=UE.ui.uiUtils;a.addListener("contextmenu",function(f,g){var h=e.getViewportOffsetByEvent(g);a.fireEvent("beforeselectionchange"),b&&b.destroy();for(var i,j=0,k=[];i=d[j];j++){var l;!function(b){function d(){switch(b.icon){case"table":return a.getLang("contextMenu.table");case"justifyjustify":return a.getLang("contextMenu.paragraph");case"aligntd":return a.getLang("contextMenu.aligntd");case"aligntable":return a.getLang("contextMenu.aligntable");case"tablesort":return c.tablesort;case"borderBack":return c.borderbk;default:return""}}if("-"==b)(l=k[k.length-1])&&"-"!==l&&k.push("-");else if(b.hasOwnProperty("group")){for(var e,f=0,g=[];e=b.subMenu[f];f++)!function(b){"-"==b?(l=g[g.length-1])&&"-"!==l?g.push("-"):g.splice(g.length-1):(a.commands[b.cmdName]||UE.commands[b.cmdName]||b.query)&&(b.query?b.query():a.queryCommandState(b.cmdName))>-1&&g.push({label:b.label||a.getLang("contextMenu."+b.cmdName+(b.value||""))||"",className:"edui-for-"+b.cmdName+(b.className?" edui-for-"+b.cmdName+"-"+b.className:""),onclick:b.exec?function(){b.exec.call(a)}:function(){a.execCommand(b.cmdName,b.value)}})}(e);g.length&&k.push({label:d(),className:"edui-for-"+b.icon,subMenu:{items:g,editor:a}})}else(a.commands[b.cmdName]||UE.commands[b.cmdName]||b.query)&&(b.query?b.query.call(a):a.queryCommandState(b.cmdName))>-1&&k.push({label:b.label||a.getLang("contextMenu."+b.cmdName),className:"edui-for-"+(b.icon?b.icon:b.cmdName+(b.value||"")),onclick:b.exec?function(){b.exec.call(a)}:function(){a.execCommand(b.cmdName,b.value)}})}(i)}if("-"==k[k.length-1]&&k.pop(),b=new UE.ui.Menu({items:k,className:"edui-contextmenu",editor:a}),b.render(),b.showAt(h),a.fireEvent("aftershowcontextmenu",b),domUtils.preventDefault(g),browser.ie){var m;try{m=a.selection.getNative().createRange()}catch(n){return}if(m.item){var o=new dom.Range(a.document);o.selectNode(m.item(0)).select(!0,!0)}}}),a.addListener("aftershowcontextmenu",function(b,c){if(a.zeroclipboard){var d=c.items;for(var e in d)"edui-for-copy"==d[e].className&&a.zeroclipboard.clip(d[e].getDom())}})}}},UE.plugins.shortcutmenu=function(){var a,b=this,c=b.options.shortcutMenu||[];c.length&&(b.addListener("contextmenu mouseup",function(b,d){var e=this,f={type:b,target:d.target||d.srcElement,screenX:d.screenX,screenY:d.screenY,clientX:d.clientX,clientY:d.clientY};if(setTimeout(function(){var d=e.selection.getRange();d.collapsed!==!1&&"contextmenu"!=b||(a||(a=new baidu.editor.ui.ShortCutMenu({editor:e,items:c,theme:e.options.theme,className:"edui-shortcutmenu"}),a.render(),e.fireEvent("afterrendershortcutmenu",a)),a.show(f,!!UE.plugins.contextmenu))}),"contextmenu"==b&&(domUtils.preventDefault(d),browser.ie9below)){var g;try{g=e.selection.getNative().createRange()}catch(d){return}if(g.item){var h=new dom.Range(e.document);h.selectNode(g.item(0)).select(!0,!0)}}}),b.addListener("keydown",function(b){"keydown"==b&&a&&!a.isHidden&&a.hide()}))},UE.plugins.basestyle=function(){var a={bold:["strong","b"],italic:["em","i"],subscript:["sub"],superscript:["sup"]},b=function(a,b){return domUtils.filterNodeList(a.selection.getStartElementPath(),b)},c=this;c.addshortcutkey({Bold:"ctrl+66",Italic:"ctrl+73",Underline:"ctrl+85"}),c.addInputRule(function(a){utils.each(a.getNodesByTagName("b i"),function(a){switch(a.tagName){case"b":a.tagName="strong";break;case"i":a.tagName="em"}})});for(var d in a)!function(a,d){c.commands[a]={execCommand:function(a){var e=c.selection.getRange(),f=b(this,d);if(e.collapsed){if(f){var g=c.document.createTextNode("");e.insertNode(g).removeInlineStyle(d),e.setStartBefore(g),domUtils.remove(g)}else{var h=e.document.createElement(d[0]);"superscript"!=a&&"subscript"!=a||(g=c.document.createTextNode(""),e.insertNode(g).removeInlineStyle(["sub","sup"]).setStartBefore(g).collapse(!0)),e.insertNode(h).setStart(h,0)}e.collapse(!0)}else"superscript"!=a&&"subscript"!=a||f&&f.tagName.toLowerCase()==a||e.removeInlineStyle(["sub","sup"]),f?e.removeInlineStyle(d):e.applyInlineStyle(d[0]);e.select()},queryCommandState:function(){return b(this,d)?1:0}}}(d,a[d])},UE.plugins.elementpath=function(){var a,b,c=this;c.setOpt("elementPathEnabled",!0),c.options.elementPathEnabled&&(c.commands.elementpath={execCommand:function(d,e){var f=b[e],g=c.selection.getRange();a=1*e,g.selectNode(f).select()},queryCommandValue:function(){var c=[].concat(this.selection.getStartElementPath()).reverse(),d=[];b=c;for(var e,f=0;e=c[f];f++)if(3!=e.nodeType){var g=e.tagName.toLowerCase();if("img"==g&&e.getAttribute("anchorname")&&(g="anchor"),d[f]=g,a==f){a=-1;break}}return d}})},UE.plugins.formatmatch=function(){function a(f,g){function h(a){return m&&a.selectNode(m),a.applyInlineStyle(d[d.length-1].tagName,null,d)}if(browser.webkit)var i="IMG"==g.target.tagName?g.target:null;c.undoManger&&c.undoManger.save();var j=c.selection.getRange(),k=i||j.getClosedNode();if(b&&k&&"IMG"==k.tagName)k.style.cssText+=";float:"+(b.style.cssFloat||b.style.styleFloat||"none")+";display:"+(b.style.display||"inline"),b=null;else if(!b){var l=j.collapsed;if(l){var m=c.document.createTextNode("match");j.insertNode(m).select()}c.__hasEnterExecCommand=!0;var n=c.options.removeFormatAttributes;c.options.removeFormatAttributes="",c.execCommand("removeformat"),c.options.removeFormatAttributes=n,c.__hasEnterExecCommand=!1,j=c.selection.getRange(),d.length&&h(j),m&&j.setStartBefore(m).collapse(!0),j.select(),m&&domUtils.remove(m)}c.undoManger&&c.undoManger.save(),c.removeListener("mouseup",a),e=0}var b,c=this,d=[],e=0;c.addListener("reset",function(){d=[],e=0}),c.commands.formatmatch={execCommand:function(f){if(e)return e=0,d=[],void c.removeListener("mouseup",a);var g=c.selection.getRange();if(b=g.getClosedNode(),!b||"IMG"!=b.tagName){g.collapse(!0).shrinkBoundary();var h=g.startContainer;d=domUtils.findParents(h,!0,function(a){return!domUtils.isBlockElm(a)&&1==a.nodeType});for(var i,j=0;i=d[j];j++)if("A"==i.tagName){d.splice(j,1);break}}c.addListener("mouseup",a),e=1},queryCommandState:function(){return e},notNeedUndo:1}},UE.plugin.register("searchreplace",function(){function a(a,b,c){var d=b.searchStr;b.dir==-1&&(a=a.split("").reverse().join(""),d=d.split("").reverse().join(""),c=a.length-c);for(var e,f=new RegExp(d,"g"+(b.casesensitive?"":"i"));e=f.exec(a);)if(e.index>=c)return b.dir==-1?a.length-e.index-b.searchStr.length:e.index;return-1}function b(b,c,d){var e,f,h=d.all||1==d.dir?"getNextDomNode":"getPreDomNode";domUtils.isBody(b)&&(b=b.firstChild);for(var i=1;b;){if(e=3==b.nodeType?b.nodeValue:b[browser.ie?"innerText":"textContent"],f=a(e,d,c),i=0,f!=-1)return{node:b,index:f};for(b=domUtils[h](b);b&&g[b.nodeName.toLowerCase()];)b=domUtils[h](b,!0);b&&(c=d.dir==-1?(3==b.nodeType?b.nodeValue:b[browser.ie?"innerText":"textContent"]).length:0)}}function c(a,b,d){for(var e,f=0,g=a.firstChild,h=0;g;){if(3==g.nodeType){if(h=g.nodeValue.replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,"").length,f+=h,f>=b)return{node:g,index:h-(f-b)}}else if(!dtd.$empty[g.tagName]&&(h=g[browser.ie?"innerText":"textContent"].replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,"").length,f+=h,f>=b&&(e=c(g,h-(f-b),d))))return e;g=domUtils.getNextDomNode(g)}}function d(a,d){var f,g=a.selection.getRange(),h=d.searchStr,i=a.document.createElement("span");if(i.innerHTML="$$ueditor_searchreplace_key$$",g.shrinkBoundary(!0),!g.collapsed){g.select();var j=a.selection.getText();if(new RegExp("^"+d.searchStr+"$",d.casesensitive?"":"i").test(j)){if(void 0!=d.replaceStr)return e(g,d.replaceStr),g.select(),!0;g.collapse(d.dir==-1)}}g.insertNode(i),g.enlargeToBlockElm(!0),f=g.startContainer;var k=f[browser.ie?"innerText":"textContent"].indexOf("$$ueditor_searchreplace_key$$");g.setStartBefore(i),domUtils.remove(i);var l=b(f,k,d);if(l){var m=c(l.node,l.index,h),n=c(l.node,l.index+h.length,h);return g.setStart(m.node,m.index).setEnd(n.node,n.index),void 0!==d.replaceStr&&e(g,d.replaceStr),g.select(),!0}g.setCursor()}function e(a,b){b=f.document.createTextNode(b),a.deleteContents().insertNode(b)}var f=this,g={table:1,tbody:1,tr:1,ol:1,ul:1};return{commands:{searchreplace:{execCommand:function(a,b){utils.extend(b,{all:!1,casesensitive:!1,dir:1},!0);var c=0;if(b.all){var e=f.selection.getRange(),g=f.body.firstChild;for(g&&1==g.nodeType?(e.setStart(g,0),e.shrinkBoundary(!0)):3==g.nodeType&&e.setStartBefore(g),e.collapse(!0).select(!0),void 0!==b.replaceStr&&f.fireEvent("saveScene");d(this,b);)c++;c&&f.fireEvent("saveScene")}else void 0!==b.replaceStr&&f.fireEvent("saveScene"),d(this,b)&&c++,c&&f.fireEvent("saveScene");return c},notNeedUndo:1}}}}),UE.plugins.customstyle=function(){var a=this;a.setOpt({customstyle:[{tag:"h1",name:"tc",style:"font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;"},{tag:"h1",name:"tl",style:"font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;"},{tag:"span",name:"im",style:"font-size:16px;font-style:italic;font-weight:bold;line-height:18px;"},{tag:"span",name:"hi",style:"font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;"}]}),a.commands.customstyle={execCommand:function(a,b){var c,d,e=this,f=b.tag,g=domUtils.findParent(e.selection.getStart(),function(a){return a.getAttribute("label")},!0),h={};for(var i in b)void 0!==b[i]&&(h[i]=b[i]);if(delete h.tag,g&&g.getAttribute("label")==b.label){if(c=this.selection.getRange(),d=c.createBookmark(),c.collapsed)if(dtd.$block[g.tagName]){var j=e.document.createElement("p");domUtils.moveChild(g,j),g.parentNode.insertBefore(j,g),domUtils.remove(g)}else domUtils.remove(g,!0);else{var k=domUtils.getCommonAncestor(d.start,d.end),l=domUtils.getElementsByTagName(k,f);new RegExp(f,"i").test(k.tagName)&&l.push(k);for(var m,n=0;m=l[n++];)if(m.getAttribute("label")==b.label){var o=domUtils.getPosition(m,d.start),p=domUtils.getPosition(m,d.end);if((o&domUtils.POSITION_FOLLOWING||o&domUtils.POSITION_CONTAINS)&&(p&domUtils.POSITION_PRECEDING||p&domUtils.POSITION_CONTAINS)&&dtd.$block[f]){var j=e.document.createElement("p");domUtils.moveChild(m,j),m.parentNode.insertBefore(j,m)}domUtils.remove(m,!0)}g=domUtils.findParent(k,function(a){return a.getAttribute("label")==b.label},!0),g&&domUtils.remove(g,!0)}c.moveToBookmark(d).select()}else if(dtd.$block[f]){if(this.execCommand("paragraph",f,h,"customstyle"),c=e.selection.getRange(),!c.collapsed){c.collapse(),g=domUtils.findParent(e.selection.getStart(),function(a){return a.getAttribute("label")==b.label},!0);var q=e.document.createElement("p");domUtils.insertAfter(g,q),domUtils.fillNode(e.document,q),c.setStart(q,0).setCursor()}}else{if(c=e.selection.getRange(),c.collapsed)return g=e.document.createElement(f),domUtils.setAttributes(g,h),void c.insertNode(g).setStart(g,0).setCursor();d=c.createBookmark(),c.applyInlineStyle(f,h).moveToBookmark(d).select()}},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return a.getAttribute("label")});return a?a.getAttribute("label"):""}},a.addListener("keyup",function(b,c){var d=c.keyCode||c.which;if(32==d||13==d){var e=a.selection.getRange();if(e.collapsed){var f=domUtils.findParent(a.selection.getStart(),function(a){return a.getAttribute("label")},!0);if(f&&dtd.$block[f.tagName]&&domUtils.isEmptyNode(f)){var g=a.document.createElement("p");domUtils.insertAfter(f,g),domUtils.fillNode(a.document,g),domUtils.remove(f),e.setStart(g,0).setCursor()}}}})},UE.plugins.catchremoteimage=function(){var me=this,ajax=UE.ajax;me.options.catchRemoteImageEnable!==!1&&(me.setOpt({catchRemoteImageEnable:!1}),me.addListener("afterpaste",function(){me.fireEvent("catchRemoteImage")}),me.addListener("catchRemoteImage",function(){function catchremoteimage(a,b){var c=utils.serializeParam(me.queryCommandValue("serverparam"))||"",d=utils.formatUrl(catcherActionUrl+(catcherActionUrl.indexOf("?")==-1?"?":"&")+c),e=utils.isCrossDomainUrl(d),f={method:"POST",dataType:e?"jsonp":"",timeout:6e4,onsuccess:b.success,onerror:b.error};f[catcherFieldName]=a,ajax.request(d,f)}for(var catcherLocalDomain=me.getOpt("catcherLocalDomain"),catcherActionUrl=me.getActionUrl(me.getOpt("catcherActionName")),catcherUrlPrefix=me.getOpt("catcherUrlPrefix"),catcherFieldName=me.getOpt("catcherFieldName"),remoteImages=[],imgs=domUtils.getElementsByTagName(me.document,"img"),test=function(a,b){if(a.indexOf(location.host)!=-1||/(^\.)|(^\/)/.test(a))return!0;if(b)for(var c,d=0;c=b[d++];)if(a.indexOf(c)!==-1)return!0;return!1},i=0,ci;ci=imgs[i++];)if(!ci.getAttribute("word_img")){var src=ci.getAttribute("_src")||ci.src||"";/^(https?|ftp):/i.test(src)&&!test(src,catcherLocalDomain)&&remoteImages.push(src)}remoteImages.length&&catchremoteimage(remoteImages,{success:function(r){try{var info=void 0!==r.state?r:eval("("+r.responseText+")")}catch(e){return}var i,j,ci,cj,oldSrc,newSrc,list=info.list;for(i=0;ci=imgs[i++];)for(oldSrc=ci.getAttribute("_src")||ci.src||"",j=0;cj=list[j++];)if(oldSrc==cj.source&&"SUCCESS"==cj.state){newSrc=catcherUrlPrefix+cj.url,domUtils.setAttributes(ci,{src:newSrc,_src:newSrc});break}me.fireEvent("catchremotesuccess")},error:function(){me.fireEvent("catchremoteerror")}})}))},UE.plugin.register("snapscreen",function(){function getLocation(a){var b,c=document.createElement("a"),d=utils.serializeParam(me.queryCommandValue("serverparam"))||"";return c.href=a,browser.ie&&(c.href=c.href),b=c.search,d&&(b=b+(b.indexOf("?")==-1?"?":"&")+d,b=b.replace(/[&]+/gi,"&")),{port:c.port,hostname:c.hostname,path:c.pathname+b||+c.hash}}var me=this,snapplugin;return{commands:{snapscreen:{execCommand:function(cmd){function onSuccess(rs){try{if(rs=eval("("+rs+")"),"SUCCESS"==rs.state){var opt=me.options;me.execCommand("insertimage",{src:opt.snapscreenUrlPrefix+rs.url,_src:opt.snapscreenUrlPrefix+rs.url,alt:rs.title||"",floatStyle:opt.snapscreenImgAlign})}else alert(rs.state)}catch(e){alert(lang.callBackErrorMsg)}}var url,local,res,lang=me.getLang("snapScreen_plugin");if(!snapplugin){var container=me.container,doc=me.container.ownerDocument||me.container.document;snapplugin=doc.createElement("object");try{snapplugin.type="application/x-pluginbaidusnap"}catch(e){return}snapplugin.style.cssText="position:absolute;left:-9999px;width:0;height:0;",snapplugin.setAttribute("width","0"),snapplugin.setAttribute("height","0"),container.appendChild(snapplugin)}url=me.getActionUrl(me.getOpt("snapscreenActionName")),local=getLocation(url),setTimeout(function(){try{res=snapplugin.saveSnapshot(local.hostname,local.path,local.port)}catch(a){return void me.ui._dialogs.snapscreenDialog.open()}onSuccess(res)},50)},queryCommandState:function(){return navigator.userAgent.indexOf("Windows",0)!=-1?0:-1}}}}}),UE.commands.insertparagraph={execCommand:function(a,b){for(var c,d=this,e=d.selection.getRange(),f=e.startContainer;f&&!domUtils.isBody(f);)c=f,f=f.parentNode;if(c){var g=d.document.createElement("p");b?c.parentNode.insertBefore(g,c):c.parentNode.insertBefore(g,c.nextSibling),domUtils.fillNode(d.document,g),e.setStart(g,0).setCursor(!1,!0)}}},UE.plugin.register("webapp",function(){function a(a,c){return c?'':' "}var b=this;return{outputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c;if("edui-faked-webapp"==b.getAttr("class")){c=a({title:b.getAttr("title"),width:b.getAttr("width"),height:b.getAttr("height"),align:b.getAttr("align"),cssfloat:b.getStyle("float"),url:b.getAttr("_url"),logo:b.getAttr("_logo_url")},!0);var d=UE.uNode.createElement(c);b.parentNode.replaceChild(d,b)}})},inputRule:function(b){utils.each(b.getNodesByTagName("iframe"),function(b){if("edui-faked-webapp"==b.getAttr("class")){var c=UE.uNode.createElement(a({title:b.getAttr("title"),width:b.getAttr("width"),height:b.getAttr("height"),align:b.getAttr("align"),cssfloat:b.getStyle("float"),url:b.getAttr("src"),logo:b.getAttr("logo_url")}));b.parentNode.replaceChild(c,b)}})},commands:{webapp:{execCommand:function(b,c){var d=this,e=a(utils.extend(c,{align:"none"}),!1);d.execCommand("inserthtml",e)},queryCommandState:function(){var a=this,b=a.selection.getRange().getClosedNode(),c=b&&"edui-faked-webapp"==b.className;return c?1:0}}}}}),UE.plugins.template=function(){UE.commands.template={execCommand:function(a,b){b.html&&this.execCommand("inserthtml",b.html)}},this.addListener("click",function(a,b){var c=b.target||b.srcElement,d=this.selection.getRange(),e=domUtils.findParent(c,function(a){if(a.className&&domUtils.hasClass(a,"ue_t"))return a},!0);e&&d.selectNode(e).shrinkBoundary().select()}),this.addListener("keydown",function(a,b){var c=this.selection.getRange();if(!c.collapsed&&!(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){var d=domUtils.findParent(c.startContainer,function(a){if(a.className&&domUtils.hasClass(a,"ue_t"))return a},!0);d&&domUtils.removeClasses(d,["ue_t"])}})},UE.plugin.register("music",function(){function a(a,c,d,e,f,g){return g?'':" '}var b=this;return{outputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c;if("edui-faked-music"==b.getAttr("class")){var d=b.getStyle("float"),e=b.getAttr("align");c=a(b.getAttr("_url"),b.getAttr("width"),b.getAttr("height"),e,d,!0);var f=UE.uNode.createElement(c);b.parentNode.replaceChild(f,b)}})},inputRule:function(b){utils.each(b.getNodesByTagName("embed"),function(b){if("edui-faked-music"==b.getAttr("class")){var c=b.getStyle("float"),d=b.getAttr("align");html=a(b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),d,c,!1);var e=UE.uNode.createElement(html);b.parentNode.replaceChild(e,b)}})},commands:{music:{execCommand:function(b,c){var d=this,e=a(c.url,c.width||400,c.height||95,"none",!1);d.execCommand("inserthtml",e)},queryCommandState:function(){var a=this,b=a.selection.getRange().getClosedNode(),c=b&&"edui-faked-music"==b.className;return c?1:0}}}}}),UE.plugin.register("autoupload",function(){function a(a,b){var c,d,e,f,g,h,i,j,k=b,l=/image\/\w+/i.test(a.type)?"image":"file",m="loading_"+(+new Date).toString(36);if(c=k.getOpt(l+"FieldName"),d=k.getOpt(l+"UrlPrefix"),e=k.getOpt(l+"MaxSize"),f=k.getOpt(l+"AllowFiles"),g=k.getActionUrl(k.getOpt(l+"ActionName")),i=function(a){var b=k.document.getElementById(m);b&&domUtils.remove(b),k.fireEvent("showmessage",{id:m,content:a,type:"error",timeout:4e3})},"image"==l?(h=' ',j=function(a){var b=d+a.url,c=k.document.getElementById(m);c&&(c.setAttribute("src",b),c.setAttribute("_src",b),c.setAttribute("title",a.title||""),c.setAttribute("alt",a.original||""),c.removeAttribute("id"),domUtils.removeClasses(c,"loadingclass"))}):(h='
',j=function(a){var b=d+a.url,c=k.document.getElementById(m),e=k.selection.getRange(),f=e.createBookmark();e.selectNode(c).select(),k.execCommand("insertfile",{url:b}),e.moveToBookmark(f).select()}),k.execCommand("inserthtml",h),!k.getOpt(l+"ActionName"))return void i(k.getLang("autoupload.errorLoadConfig"));if(a.size>e)return void i(k.getLang("autoupload.exceedSizeError"));var n=a.name?a.name.substr(a.name.lastIndexOf(".")):"";if(n&&"image"!=l||f&&(f.join("")+".").indexOf(n.toLowerCase()+".")==-1)return void i(k.getLang("autoupload.exceedTypeError"));var o=new XMLHttpRequest,p=new FormData,q=utils.serializeParam(k.queryCommandValue("serverparam"))||"",r=utils.formatUrl(g+(g.indexOf("?")==-1?"?":"&")+q);p.append(c,a,a.name||"blob."+a.type.substr("image/".length)),p.append("type","ajax"),o.open("post",r,!0),o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.addEventListener("load",function(a){try{var b=new Function("return "+utils.trim(a.target.response))();"SUCCESS"==b.state&&b.url?j(b):i(b.state)}catch(c){i(k.getLang("autoupload.loadError"))}}),o.send(p)}function b(a){return a.clipboardData&&a.clipboardData.items&&1==a.clipboardData.items.length&&/^image\//.test(a.clipboardData.items[0].type)?a.clipboardData.items:null}function c(a){return a.dataTransfer&&a.dataTransfer.files?a.dataTransfer.files:null}return{outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){/\b(loaderrorclass)|(bloaderrorclass)\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)}),utils.each(a.getNodesByTagName("p"),function(a){/\bloadpara\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)})},bindEvents:{ready:function(d){var e=this;window.FormData&&window.FileReader&&(domUtils.on(e.body,"paste drop",function(d){var f,g=!1;if(f="paste"==d.type?b(d):c(d)){for(var h,i=f.length;i--;)h=f[i],h.getAsFile&&(h=h.getAsFile()),h&&h.size>0&&(a(h,e),g=!0);g&&d.preventDefault()}}),domUtils.on(e.body,"dragover",function(a){"Files"==a.dataTransfer.types[0]&&a.preventDefault()}),utils.cssRule("loading",".loadingclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loading.gif') no-repeat center center transparent;border:1px solid #cccccc;margin-left:1px;height: 22px;width: 22px;}\n.loaderrorclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loaderror.png') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}",this.document))}}}}),UE.plugin.register("charts",function(){function a(a){var b=null,c=0;if(a.rows.length<2)return!1;if(a.rows[0].cells.length<2)return!1;b=a.rows[0].cells,c=b.length;for(var d,e=0;d=b[e];e++)if("th"!==d.tagName.toLowerCase())return!1;for(var f,e=1;f=a.rows[e];e++){if(f.cells.length!=c)return!1;if("th"!==f.cells[0].tagName.toLowerCase())return!1;for(var d,g=1;d=f.cells[g];g++){var h=utils.trim(d.innerText||d.textContent||"");if(h=h.replace(new RegExp(UE.dom.domUtils.fillChar,"g"),"").replace(/^\s+|\s+$/g,""),!/^\d*\.?\d+$/.test(h))return!1}}return!0}var b=this;return{bindEvents:{chartserror:function(){}},commands:{charts:{execCommand:function(c,d){var e=domUtils.findParentByTagName(this.selection.getRange().startContainer,"table",!0),f=[],g={};if(!e)return!1;if(!a(e))return b.fireEvent("chartserror"),!1;g.title=d.title||"",g.subTitle=d.subTitle||"",g.xTitle=d.xTitle||"",g.yTitle=d.yTitle||"",g.suffix=d.suffix||"",g.tip=d.tip||"",g.dataFormat=d.tableDataFormat||"",g.chartType=d.chartType||0;for(var h in g)g.hasOwnProperty(h)&&f.push(h+":"+g[h]);e.setAttribute("data-chart",f.join(";")),domUtils.addClass(e,"edui-charts-table")},queryCommandState:function(b,c){
-var d=domUtils.findParentByTagName(this.selection.getRange().startContainer,"table",!0);return d&&a(d)?0:-1}}},inputRule:function(a){utils.each(a.getNodesByTagName("table"),function(a){void 0!==a.getAttr("data-chart")&&a.setAttr("style")})},outputRule:function(a){utils.each(a.getNodesByTagName("table"),function(a){void 0!==a.getAttr("data-chart")&&a.setAttr("style","display: none;")})}}}),UE.plugin.register("section",function(){function a(a){this.tag="",this.level=-1,this.dom=null,this.nextSection=null,this.previousSection=null,this.parentSection=null,this.startAddress=[],this.endAddress=[],this.children=[]}function b(b){var c=new a;return utils.extend(c,b)}function c(a,b){for(var c=b,d=0;d=0){var o=h.selection.getRange().selectNode(i).createAddress(!0).startAddress,p=b({tag:i.tagName,title:i.innerText||i.textContent||"",level:f,dom:i,startAddress:utils.clone(o,[]),endAddress:utils.clone(o,[]),children:[]});for(j.nextSection=p,p.previousSection=j,g=j;f<=g.level;)g=g.parentSection;p.parentSection=g,g.children.push(p),k=j=p}else 1===i.nodeType&&e(i,c),k&&k.endAddress[k.endAddress.length-1]++}for(var f=c||["h1","h2","h3","h4","h5","h6"],g=0;g=c.length);f++){if(c[f]>a[f]){d=!0;break}if(c[f]=c.length);f++){if(c[f] a[f])break}return d&&e}var g,h,i=this;if(b&&d&&d.level!=-1&&(g=e?d.endAddress:d.startAddress,h=c(g,i.body),g&&h&&!f(b.startAddress,b.endAddress,g))){var j,k,l=c(b.startAddress,i.body),m=c(b.endAddress,i.body);if(e)for(j=m;j&&!(domUtils.getPosition(l,j)&domUtils.POSITION_FOLLOWING)&&(k=j.previousSibling,domUtils.insertAfter(h,j),j!=l);)j=k;else for(j=l;j&&!(domUtils.getPosition(j,m)&domUtils.POSITION_FOLLOWING)&&(k=j.nextSibling,h.parentNode.insertBefore(j,h),j!=m);)j=k;i.fireEvent("updateSections")}}},deletesection:{execCommand:function(a,b,c){function d(a){for(var b=e.body,c=0;c ',b.className="edui-"+c.options.theme,b.id=c.ui.id+"_iframeupload",i.style.cssText=g,i.style.width=a+"px",i.style.height=e+"px",i.appendChild(b),i.parentNode&&(i.parentNode.style.width=a+"px",i.parentNode.style.height=a+"px");var k=h.getElementById("edui_form_"+j),l=h.getElementById("edui_input_"+j),m=h.getElementById("edui_iframe_"+j);domUtils.on(l,"change",function(){function a(){try{var e,f,g,h=(m.contentDocument||m.contentWindow.document).body,i=h.innerText||h.textContent||"";f=new Function("return "+i)(),e=c.options.imageUrlPrefix+f.url,"SUCCESS"==f.state&&f.url?(g=c.document.getElementById(d),g.setAttribute("src",e),g.setAttribute("_src",e),g.setAttribute("title",f.title||""),g.setAttribute("alt",f.original||""),g.removeAttribute("id"),domUtils.removeClasses(g,"loadingclass")):b&&b(f.state)}catch(j){b&&b(c.getLang("simpleupload.loadError"))}k.reset(),domUtils.un(m,"load",a)}function b(a){if(d){var b=c.document.getElementById(d);b&&domUtils.remove(b),c.fireEvent("showmessage",{id:d,content:a,type:"error",timeout:4e3})}}if(l.value){var d="loading_"+(+new Date).toString(36),e=utils.serializeParam(c.queryCommandValue("serverparam"))||"",f=c.getActionUrl(c.getOpt("imageActionName")),g=c.getOpt("imageAllowFiles");if(c.focus(),c.execCommand("inserthtml",' '),!c.getOpt("imageActionName"))return void errorHandler(c.getLang("autoupload.errorLoadConfig"));var h=l.value,i=h?h.substr(h.lastIndexOf(".")):"";if(!i||g&&(g.join("")+".").indexOf(i.toLowerCase()+".")==-1)return void b(c.getLang("simpleupload.exceedTypeError"));domUtils.on(m,"load",a),k.action=utils.formatUrl(f+(f.indexOf("?")==-1?"?":"&")+e),k.submit()}});var n;c.addListener("selectionchange",function(){clearTimeout(n),n=setTimeout(function(){var a=c.queryCommandState("simpleupload");a==-1?l.disabled="disabled":l.disabled=!1},400)}),d=!0}),f.style.cssText=g,b.appendChild(f)}var b,c=this,d=!1;return{bindEvents:{ready:function(){utils.cssRule("loading",".loadingclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loading.gif') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}\n.loaderrorclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loaderror.png') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}",this.document)},simpleuploadbtnready:function(d,e){b=e,c.afterConfigReady(a)}},outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){/\b(loaderrorclass)|(bloaderrorclass)\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)})},commands:{simpleupload:{queryCommandState:function(){return d?0:-1}}}}}),UE.plugin.register("serverparam",function(){var a={};return{commands:{serverparam:{execCommand:function(b,c,d){void 0===c||null===c?a={}:utils.isString(c)?void 0===d||null===d?delete a[c]:a[c]=d:utils.isObject(c)?utils.extend(a,c,!0):utils.isFunction(c)&&utils.extend(a,c(),!0)},queryCommandValue:function(){return a||{}}}}}}),UE.plugin.register("insertfile",function(){function a(a){var b=a.substr(a.lastIndexOf(".")+1).toLowerCase(),c={rar:"icon_rar.gif",zip:"icon_rar.gif",tar:"icon_rar.gif",gz:"icon_rar.gif",bz2:"icon_rar.gif",doc:"icon_doc.gif",docx:"icon_doc.gif",pdf:"icon_pdf.gif",mp3:"icon_mp3.gif",xls:"icon_xls.gif",chm:"icon_chm.gif",ppt:"icon_ppt.gif",pptx:"icon_ppt.gif",avi:"icon_mv.gif",rmvb:"icon_mv.gif",wmv:"icon_mv.gif",flv:"icon_mv.gif",swf:"icon_mv.gif",rm:"icon_mv.gif",exe:"icon_exe.gif",psd:"icon_psd.gif",txt:"icon_txt.gif",jpg:"icon_jpg.gif",png:"icon_jpg.gif",jpeg:"icon_jpg.gif",gif:"icon_jpg.gif",ico:"icon_jpg.gif",bmp:"icon_jpg.gif"};return c[b]?c[b]:c.txt}var b=this;return{commands:{insertfile:{execCommand:function(c,d){d=utils.isArray(d)?d:[d];var e,f,g,h,i="",j=b.getOpt("UEDITOR_HOME_URL"),k=j+("/"==j.substr(j.length-1)?"":"/")+"dialogs/attachment/fileTypeImages/";for(e=0;e'+h+" ";b.execCommand("insertHtml",i)}}}}}),UE.plugins.xssFilter=function(){function a(a){var b=a.tagName,d=a.attrs;return c.hasOwnProperty(b)?void UE.utils.each(d,function(d,e){c[b].indexOf(e)===-1&&a.setAttr(e)}):(a.parentNode.removeChild(a),!1)}var b=UEDITOR_CONFIG,c=b.whitList;c&&b.xssFilterRules&&(this.options.filterRules=function(){var b={};return UE.utils.each(c,function(c,d){b[d]=function(b){return a(b)}}),b}());var d=[];UE.utils.each(c,function(a,b){d.push(b)}),c&&b.inputXssFilter&&this.addInputRule(function(b){b.traversal(function(b){return"element"===b.type&&void a(b)})}),c&&b.outputXssFilter&&this.addOutputRule(function(b){b.traversal(function(b){return"element"===b.type&&void a(b)})})};var baidu=baidu||{};baidu.editor=baidu.editor||{},UE.ui=baidu.editor.ui={},function(){function a(){var a=document.getElementById("edui_fixedlayer");i.setViewportOffset(a,{left:0,top:0})}function b(b){d.on(window,"scroll",a),d.on(window,"resize",baidu.editor.utils.defer(a,0,!0))}var c=baidu.editor.browser,d=baidu.editor.dom.domUtils,e="$EDITORUI",f=window[e]={},g="ID"+e,h=0,i=baidu.editor.ui.uiUtils={uid:function(a){return a?a[g]||(a[g]=++h):++h},hook:function(a,b){var c;return a&&a._callbacks?c=a:(c=function(){var b;a&&(b=a.apply(this,arguments));for(var d=c._callbacks,e=d.length;e--;){var f=d[e].apply(this,arguments);void 0===b&&(b=f)}return b},c._callbacks=[]),c._callbacks.push(b),c},createElementByHtml:function(a){var b=document.createElement("div");return b.innerHTML=a,b=b.firstChild,b.parentNode.removeChild(b),b},getViewportElement:function(){return c.ie&&c.quirks?document.body:document.documentElement},getClientRect:function(a){var b;try{b=a.getBoundingClientRect()}catch(c){b={left:0,top:0,height:0,width:0}}for(var e,f={left:Math.round(b.left),top:Math.round(b.top),height:Math.round(b.bottom-b.top),width:Math.round(b.right-b.left)};(e=a.ownerDocument)!==document&&(a=d.getWindow(e).frameElement);)b=a.getBoundingClientRect(),f.left+=b.left,f.top+=b.top;return f.bottom=f.top+f.height,f.right=f.left+f.width,f},getViewportRect:function(){var a=i.getViewportElement(),b=0|(window.innerWidth||a.clientWidth),c=0|(window.innerHeight||a.clientHeight);return{left:0,top:0,height:c,width:b,bottom:c,right:b}},setViewportOffset:function(a,b){var c=i.getFixedLayer();a.parentNode===c?(a.style.left=b.left+"px",a.style.top=b.top+"px"):d.setViewportOffset(a,b)},getEventOffset:function(a){var b=a.target||a.srcElement,c=i.getClientRect(b),d=i.getViewportOffsetByEvent(a);return{left:d.left-c.left,top:d.top-c.top}},getViewportOffsetByEvent:function(a){var b=a.target||a.srcElement,c=d.getWindow(b).frameElement,e={left:a.clientX,top:a.clientY};if(c&&b.ownerDocument!==document){var f=i.getClientRect(c);e.left+=f.left,e.top+=f.top}return e},setGlobal:function(a,b){return f[a]=b,e+'["'+a+'"]'},unsetGlobal:function(a){delete f[a]},copyAttributes:function(a,b){for(var e=b.attributes,f=e.length;f--;){var g=e[f];"style"==g.nodeName||"class"==g.nodeName||c.ie&&!g.specified||a.setAttribute(g.nodeName,g.nodeValue)}b.className&&d.addClass(a,b.className),b.style.cssText&&(a.style.cssText+=";"+b.style.cssText)},removeStyle:function(a,b){if(a.style.removeProperty)a.style.removeProperty(b);else{if(!a.style.removeAttribute)throw"";a.style.removeAttribute(b)}},contains:function(a,b){return a&&b&&a!==b&&(a.contains?a.contains(b):16&a.compareDocumentPosition(b))},startDrag:function(a,b,c){function d(a){var c=a.clientX-g,d=a.clientY-h;b.ondragmove(c,d,a),a.stopPropagation?a.stopPropagation():a.cancelBubble=!0}function e(a){c.removeEventListener("mousemove",d,!0),c.removeEventListener("mouseup",e,!0),window.removeEventListener("mouseup",e,!0),b.ondragstop()}function f(){i.releaseCapture(),i.detachEvent("onmousemove",d),i.detachEvent("onmouseup",f),i.detachEvent("onlosecaptrue",f),b.ondragstop()}var c=c||document,g=a.clientX,h=a.clientY;if(c.addEventListener)c.addEventListener("mousemove",d,!0),c.addEventListener("mouseup",e,!0),window.addEventListener("mouseup",e,!0),a.preventDefault();else{var i=a.srcElement;i.setCapture(),i.attachEvent("onmousemove",d),i.attachEvent("onmouseup",f),i.attachEvent("onlosecaptrue",f),a.returnValue=!1}b.ondragstart()},getFixedLayer:function(){var d=document.getElementById("edui_fixedlayer");return null==d&&(d=document.createElement("div"),d.id="edui_fixedlayer",document.body.appendChild(d),c.ie&&c.version<=8?(d.style.position="absolute",b(),setTimeout(a)):d.style.position="fixed",d.style.left="0",d.style.top="0",d.style.width="0",d.style.height="0"),d},makeUnselectable:function(a){if(c.opera||c.ie&&c.version<9){if(a.unselectable="on",a.hasChildNodes())for(var b=0;b'}},a.inherits(c,b)}(),function(){var a=baidu.editor.utils,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.uiUtils,e=baidu.editor.ui.Mask=function(a){this.initOptions(a),this.initUIBase()};e.prototype={getHtmlTpl:function(){return'
'},postRender:function(){var a=this;b.on(window,"resize",function(){setTimeout(function(){a.isHidden()||a._fill()})})},show:function(a){this._fill(),this.getDom().style.display="",this.getDom().style.zIndex=a},hide:function(){this.getDom().style.display="none",this.getDom().style.zIndex=""},isHidden:function(){return"none"==this.getDom().style.display},_onMouseDown:function(){return!1},_onClick:function(a,b){this.fireEvent("click",a,b)},_fill:function(){var a=this.getDom(),b=d.getViewportRect();a.style.width=b.width+"px",a.style.height=b.height+"px"}},a.inherits(e,c)}(),function(){function a(a,b){for(var c=0;c [\n\r\t]+ <"),c.className&&(b.className=c.className),c.style.cssText&&(b.style.cssText=c.style.cssText),/textarea/i.test(c.tagName)?(d.textarea=c,d.textarea.style.display="none"):c.parentNode.removeChild(c),c.id&&(b.id=c.id,e.removeAttributes(c,"id")),c=b,c.innerHTML=""}e.addClass(c,"edui-"+d.options.theme),d.ui.render(c);var h=d.options;d.container=d.ui.getDom();for(var i,j=e.findParents(c,!0),k=[],l=0;i=j[l];l++)k[l]=i.style.display,i.style.display="block";if(h.initialFrameWidth)h.minFrameWidth=h.initialFrameWidth;else{h.minFrameWidth=h.initialFrameWidth=c.offsetWidth;var m=c.style.width;/%$/.test(m)&&(h.initialFrameWidth=m)}h.initialFrameHeight?h.minFrameHeight=h.initialFrameHeight:h.initialFrameHeight=h.minFrameHeight=c.offsetHeight;for(var i,l=0;i=j[l];l++)i.style.display=k[l];c.style.height&&(c.style.height=""),d.container.style.width=h.initialFrameWidth+(/%$/.test(h.initialFrameWidth)?"":"px"),d.container.style.zIndex=h.zIndex,f.call(d,d.ui.getDom("iframeholder")),d.fireEvent("afteruiready")}d.langIsReady?b():d.addListener("langReady",b)})},d},UE.getEditor=function(a,b){var c=g[a];return c||(c=g[a]=new UE.ui.Editor(b),c.render(a)),c},UE.delEditor=function(a){var b;(b=g[a])&&(b.key&&b.destroy(),delete g[a])},UE.registerUI=function(a,c,d,e){b.each(a.split(/\s+/),function(a){UE._customizeUI[a]={id:e,execFn:c,index:d}})}}(),UE.registerUI("message",function(a){function b(){var a=g.ui.getDom("toolbarbox");a&&(c.style.top=a.offsetHeight+3+"px"),c.style.zIndex=Math.max(g.options.zIndex,g.iframe.style.zIndex)+1}var c,d=baidu.editor.ui,e=d.Message,f=[],g=a;g.addListener("ready",function(){c=document.getElementById(g.ui.id+"_message_holder"),b(),setTimeout(function(){b()},500)}),g.addListener("showmessage",function(a,d){d=utils.isString(d)?{content:d}:d;var h=new e({timeout:d.timeout,type:d.type,content:d.content,keepshow:d.keepshow,editor:g}),i=d.id||"msg_"+(+new Date).toString(36);return h.render(c),f[i]=h,h.reset(d),b(),i}),g.addListener("updatemessage",function(a,b,d){d=utils.isString(d)?{content:d}:d;var e=f[b];e.render(c),e&&e.reset(d)}),g.addListener("hidemessage",function(a,b){var c=f[b];c&&c.hide()})}),UE.registerUI("autosave",function(a){var b=null,c=null;a.on("afterautosave",function(){clearTimeout(b),b=setTimeout(function(){c&&a.trigger("hidemessage",c),c=a.trigger("showmessage",{content:a.getLang("autosave.success"),timeout:2e3})},2e3)})})}();
diff --git a/www/js/ueditor/ueditor.config.js b/www/js/ueditor/ueditor.config.js
deleted file mode 100644
index 1cfdff0f32..0000000000
--- a/www/js/ueditor/ueditor.config.js
+++ /dev/null
@@ -1,498 +0,0 @@
-/**
- * ueditor完整配置项
- * 可以在这里配置整个编辑器的特性
- */
-/**************************提示********************************
- * 所有被注释的配置项均为UEditor默认值。
- * 修改默认配置请首先确保已经完全明确该参数的真实用途。
- * 主要有两种修改方案,一种是取消此处注释,然后修改成对应参数;另一种是在实例化编辑器时传入对应参数。
- * 当升级编辑器时,可直接使用旧版配置文件替换新版配置文件,不用担心旧版配置文件中因缺少新功能所需的参数而导致脚本报错。
- **************************提示********************************/
-
-(function () {
-
- /**
- * 编辑器资源文件根路径。它所表示的含义是:以编辑器实例化页面为当前路径,指向编辑器资源文件(即dialog等文件夹)的路径。
- * 鉴于很多同学在使用编辑器的时候出现的种种路径问题,此处强烈建议大家使用"相对于网站根目录的相对路径"进行配置。
- * "相对于网站根目录的相对路径"也就是以斜杠开头的形如"/myProject/ueditor/"这样的路径。
- * 如果站点中有多个不在同一层级的页面需要实例化编辑器,且引用了同一UEditor的时候,此处的URL可能不适用于每个页面的编辑器。
- * 因此,UEditor提供了针对不同页面的编辑器可单独配置的根路径,具体来说,在需要实例化编辑器的页面最顶部写上如下代码即可。当然,需要令此处的URL等于对应的配置。
- * window.UEDITOR_HOME_URL = "/xxxx/xxxx/";
- */
- var URL = window.UEDITOR_HOME_URL || getUEBasePath();
-
- /**
- * 配置项主体。注意,此处所有涉及到路径的配置别遗漏URL变量。
- */
- window.UEDITOR_CONFIG = {
-
- //为编辑器实例添加一个路径,这个不能被注释
- UEDITOR_HOME_URL: URL
-
- // 服务器统一请求接口路径
- , serverUrl: URL + "php/controller.php"
-
- //工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的重新定义
- , toolbars: [[
- 'fullscreen', 'source', '|', 'undo', 'redo', '|',
- 'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc', '|',
- 'rowspacingtop', 'rowspacingbottom', 'lineheight', '|',
- 'customstyle', 'paragraph', 'fontfamily', 'fontsize', '|',
- 'directionalityltr', 'directionalityrtl', 'indent', '|',
- 'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 'touppercase', 'tolowercase', '|',
- 'link', 'unlink', 'anchor', '|', 'imagenone', 'imageleft', 'imageright', 'imagecenter', '|',
- 'simpleupload', 'insertimage', 'emotion', 'scrawl', 'insertvideo', 'music', 'attachment', 'map', 'gmap', 'insertframe', 'insertcode', 'webapp', 'pagebreak', 'template', 'background', '|',
- 'horizontal', 'date', 'time', 'spechars', 'snapscreen', 'wordimage', '|',
- 'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', 'charts', '|',
- 'print', 'preview', 'searchreplace', 'drafts', 'help'
- ]]
- //当鼠标放在工具栏上时显示的tooltip提示,留空支持自动多语言配置,否则以配置值为准
- //,labelMap:{
- // 'anchor':'', 'undo':''
- //}
-
- //语言配置项,默认是zh-cn。有需要的话也可以使用如下这样的方式来自动多语言切换,当然,前提条件是lang文件夹下存在对应的语言文件:
- //lang值也可以通过自动获取 (navigator.language||navigator.browserLanguage ||navigator.userLanguage).toLowerCase()
- //,lang:"zh-cn"
- //,langPath:URL +"lang/"
-
- //主题配置项,默认是default。有需要的话也可以使用如下这样的方式来自动多主题切换,当然,前提条件是themes文件夹下存在对应的主题文件:
- //现有如下皮肤:default
- //,theme:'default'
- //,themePath:URL +"themes/"
-
- //,zIndex : 900 //编辑器层级的基数,默认是900
-
- //针对getAllHtml方法,会在对应的head标签中增加该编码设置。
- //,charset:"utf-8"
-
- //若实例化编辑器的页面手动修改的domain,此处需要设置为true
- //,customDomain:false
-
- //常用配置项目
- //,isShow : true //默认显示编辑器
-
- //,textarea:'editorValue' // 提交表单时,服务器获取编辑器提交内容的所用的参数,多实例时可以给容器name属性,会将name给定的值最为每个实例的键值,不用每次实例化的时候都设置这个值
-
- //,initialContent:'欢迎使用ueditor!' //初始化编辑器的内容,也可以通过textarea/script给值,看官网例子
-
- //,autoClearinitialContent:true //是否自动清除编辑器初始内容,注意:如果focus属性设置为true,这个也为真,那么编辑器一上来就会触发导致初始化的内容看不到了
-
- //,focus:false //初始化时,是否让编辑器获得焦点true或false
-
- //如果自定义,最好给p标签如下的行高,要不输入中文时,会有跳动感
- //,initialStyle:'p{line-height:1em}'//编辑器层级的基数,可以用来改变字体等
-
- //,iframeCssUrl: URL + '/themes/iframe.css' //给编辑区域的iframe引入一个css文件
-
- //indentValue
- //首行缩进距离,默认是2em
- //,indentValue:'2em'
-
- //,initialFrameWidth:1000 //初始化编辑器宽度,默认1000
- //,initialFrameHeight:320 //初始化编辑器高度,默认320
-
- //,readonly : false //编辑器初始化结束后,编辑区域是否是只读的,默认是false
-
- //,autoClearEmptyNode : true //getContent时,是否删除空的inlineElement节点(包括嵌套的情况)
-
- //启用自动保存
- //,enableAutoSave: true
- //自动保存间隔时间, 单位ms
- //,saveInterval: 500
-
- //,fullscreen : false //是否开启初始化时即全屏,默认关闭
-
- //,imagePopup:true //图片操作的浮层开关,默认打开
-
- //,autoSyncData:true //自动同步编辑器要提交的数据
- //,emotionLocalization:false //是否开启表情本地化,默认关闭。若要开启请确保emotion文件夹下包含官网提供的images表情文件夹
-
- //粘贴只保留标签,去除标签所有属性
- //,retainOnlyLabelPasted: false
-
- //,pasteplain:false //是否默认为纯文本粘贴。false为不使用纯文本粘贴,true为使用纯文本粘贴
- //纯文本粘贴模式下的过滤规则
- //'filterTxtRules' : function(){
- // function transP(node){
- // node.tagName = 'p';
- // node.setStyle();
- // }
- // return {
- // //直接删除及其字节点内容
- // '-' : 'script style object iframe embed input select',
- // 'p': {$:{}},
- // 'br':{$:{}},
- // 'div':{'$':{}},
- // 'li':{'$':{}},
- // 'caption':transP,
- // 'th':transP,
- // 'tr':transP,
- // 'h1':transP,'h2':transP,'h3':transP,'h4':transP,'h5':transP,'h6':transP,
- // 'td':function(node){
- // //没有内容的td直接删掉
- // var txt = !!node.innerText();
- // if(txt){
- // node.parentNode.insertAfter(UE.uNode.createText(' '),node);
- // }
- // node.parentNode.removeChild(node,node.innerText())
- // }
- // }
- //}()
-
- //,allHtmlEnabled:false //提交到后台的数据是否包含整个html字符串
-
- //insertorderedlist
- //有序列表的下拉配置,值留空时支持多语言自动识别,若配置值,则以此值为准
- ,'insertorderedlist':{
- // //自定的样式
- // 'num':'1,2,3...',
- // 'num1':'1),2),3)...',
- // 'num2':'(1),(2),(3)...',
- // 'cn':'一,二,三....',
- // 'cn1':'一),二),三)....',
- // 'cn2':'(一),(二),(三)....',
- // //系统自带
- 'decimal' : '' , //'1,2,3...'
- 'decimal-leading-zero' : '01,02,03...', //'01,02,03...'
- 'lower-alpha' : '' , // 'a,b,c...'
- 'upper-alpha' : '' , //'A,B,C'
- 'lower-roman' : '' , //'i,ii,iii...'
- 'upper-roman' : '' //'I,II,III...'
- }
-
- //insertunorderedlist
- //无序列表的下拉配置,值留空时支持多语言自动识别,若配置值,则以此值为准
- ,insertunorderedlist : { //自定的样式
- // 'dash' :'— 破折号', //-破折号
- // 'dot':' 。 小圆圈', //系统自带
- 'circle' : '', // '○ 小圆圈'
- 'disc' : '', // '● 小圆点'
- 'square' : '' //'■ 小方块'
- }
- //,listDefaultPaddingLeft : '30'//默认的左边缩进的基数倍
- //,listiconpath : 'http://bs.baidu.com/listicon/'//自定义标号的路径
- //,maxListLevel : 3 //限制可以tab的级数, 设置-1为不限制
-
- //,autoTransWordToList:false //禁止word中粘贴进来的列表自动变成列表标签
-
- //fontfamily
- //字体设置 label留空支持多语言自动切换,若配置,则以配置值为准
- //,'fontfamily':[
- // { label:'',name:'songti',val:'宋体,SimSun'},
- // { label:'',name:'kaiti',val:'楷体,楷体_GB2312, SimKai'},
- // { label:'',name:'yahei',val:'微软雅黑,Microsoft YaHei'},
- // { label:'',name:'heiti',val:'黑体, SimHei'},
- // { label:'',name:'lishu',val:'隶书, SimLi'},
- // { label:'',name:'andaleMono',val:'andale mono'},
- // { label:'',name:'arial',val:'arial, helvetica,sans-serif'},
- // { label:'',name:'arialBlack',val:'arial black,avant garde'},
- // { label:'',name:'comicSansMs',val:'comic sans ms'},
- // { label:'',name:'impact',val:'impact,chicago'},
- // { label:'',name:'timesNewRoman',val:'times new roman'}
- //]
-
- //fontsize
- //字号
- //,'fontsize':[10, 11, 12, 14, 16, 18, 20, 24, 36]
-
- //paragraph
- //段落格式 值留空时支持多语言自动识别,若配置,则以配置值为准
- //,'paragraph':{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''}
-
- //rowspacingtop
- //段间距 值和显示的名字相同
- //,'rowspacingtop':['5', '10', '15', '20', '25']
-
- //rowspacingBottom
- //段间距 值和显示的名字相同
- //,'rowspacingbottom':['5', '10', '15', '20', '25']
-
- //lineheight
- //行内间距 值和显示的名字相同
- //,'lineheight':['1', '1.5','1.75','2', '3', '4', '5']
-
- //customstyle
- //自定义样式,不支持国际化,此处配置值即可最后显示值
- //block的元素是依据设置段落的逻辑设置的,inline的元素依据BIU的逻辑设置
- //尽量使用一些常用的标签
- //参数说明
- //tag 使用的标签名字
- //label 显示的名字也是用来标识不同类型的标识符,注意这个值每个要不同,
- //style 添加的样式
- //每一个对象就是一个自定义的样式
- //,'customstyle':[
- // {tag:'h1', name:'tc', label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'},
- // {tag:'h1', name:'tl',label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;margin:0 0 10px 0;'},
- // {tag:'span',name:'im', label:'', style:'font-style:italic;font-weight:bold'},
- // {tag:'span',name:'hi', label:'', style:'font-style:italic;font-weight:bold;color:rgb(51, 153, 204)'}
- //]
-
- //打开右键菜单功能
- //,enableContextMenu: true
- //右键菜单的内容,可以参考plugins/contextmenu.js里边的默认菜单的例子,label留空支持国际化,否则以此配置为准
- //,contextMenu:[
- // {
- // label:'', //显示的名称
- // cmdName:'selectall',//执行的command命令,当点击这个右键菜单时
- // //exec可选,有了exec就会在点击时执行这个function,优先级高于cmdName
- // exec:function () {
- // //this是当前编辑器的实例
- // //this.ui._dialogs['inserttableDialog'].open();
- // }
- // }
- //]
-
- //快捷菜单
- //,shortcutMenu:["fontfamily", "fontsize", "bold", "italic", "underline", "forecolor", "backcolor", "insertorderedlist", "insertunorderedlist"]
-
- //elementPathEnabled
- //是否启用元素路径,默认是显示
- //,elementPathEnabled : true
-
- //wordCount
- //,wordCount:true //是否开启字数统计
- //,maximumWords:10000 //允许的最大字符数
- //字数统计提示,{#count}代表当前字数,{#leave}代表还可以输入多少字符数,留空支持多语言自动切换,否则按此配置显示
- //,wordCountMsg:'' //当前已输入 {#count} 个字符,您还可以输入{#leave} 个字符
- //超出字数限制提示 留空支持多语言自动切换,否则按此配置显示
- //,wordOverFlowMsg:'' //你输入的字符个数已经超出最大允许值,服务器可能会拒绝保存!
-
- //tab
- //点击tab键时移动的距离,tabSize倍数,tabNode什么字符做为单位
- //,tabSize:4
- //,tabNode:' '
-
- //removeFormat
- //清除格式时可以删除的标签和属性
- //removeForamtTags标签
- //,removeFormatTags:'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var'
- //removeFormatAttributes属性
- //,removeFormatAttributes:'class,style,lang,width,height,align,hspace,valign'
-
- //undo
- //可以最多回退的次数,默认20
- //,maxUndoCount:20
- //当输入的字符数超过该值时,保存一次现场
- //,maxInputCount:1
-
- //autoHeightEnabled
- // 是否自动长高,默认true
- //,autoHeightEnabled:true
-
- //scaleEnabled
- //是否可以拉伸长高,默认true(当开启时,自动长高失效)
- //,scaleEnabled:false
- //,minFrameWidth:800 //编辑器拖动时最小宽度,默认800
- //,minFrameHeight:220 //编辑器拖动时最小高度,默认220
-
- //autoFloatEnabled
- //是否保持toolbar的位置不动,默认true
- //,autoFloatEnabled:true
- //浮动时工具栏距离浏览器顶部的高度,用于某些具有固定头部的页面
- //,topOffset:30
- //编辑器底部距离工具栏高度(如果参数大于等于编辑器高度,则设置无效)
- //,toolbarTopOffset:400
-
- //设置远程图片是否抓取到本地保存
- //,catchRemoteImageEnable: true //设置是否抓取远程图片
-
- //pageBreakTag
- //分页标识符,默认是_ueditor_page_break_tag_
- //,pageBreakTag:'_ueditor_page_break_tag_'
-
- //autotypeset
- //自动排版参数
- //,autotypeset: {
- // mergeEmptyline: true, //合并空行
- // removeClass: true, //去掉冗余的class
- // removeEmptyline: false, //去掉空行
- // textAlign:"left", //段落的排版方式,可以是 left,right,center,justify 去掉这个属性表示不执行排版
- // imageBlockLine: 'center', //图片的浮动方式,独占一行剧中,左右浮动,默认: center,left,right,none 去掉这个属性表示不执行排版
- // pasteFilter: false, //根据规则过滤没事粘贴进来的内容
- // clearFontSize: false, //去掉所有的内嵌字号,使用编辑器默认的字号
- // clearFontFamily: false, //去掉所有的内嵌字体,使用编辑器默认的字体
- // removeEmptyNode: false, // 去掉空节点
- // //可以去掉的标签
- // removeTagNames: {标签名字:1},
- // indent: false, // 行首缩进
- // indentValue : '2em', //行首缩进的大小
- // bdc2sb: false,
- // tobdc: false
- //}
-
- //tableDragable
- //表格是否可以拖拽
- //,tableDragable: true
-
-
-
- //sourceEditor
- //源码的查看方式,codemirror 是代码高亮,textarea是文本框,默认是codemirror
- //注意默认codemirror只能在ie8+和非ie中使用
- //,sourceEditor:"codemirror"
- //如果sourceEditor是codemirror,还用配置一下两个参数
- //codeMirrorJsUrl js加载的路径,默认是 URL + "third-party/codemirror/codemirror.js"
- //,codeMirrorJsUrl:URL + "third-party/codemirror/codemirror.js"
- //codeMirrorCssUrl css加载的路径,默认是 URL + "third-party/codemirror/codemirror.css"
- //,codeMirrorCssUrl:URL + "third-party/codemirror/codemirror.css"
- //编辑器初始化完成后是否进入源码模式,默认为否。
- //,sourceEditorFirst:false
-
- //iframeUrlMap
- //dialog内容的路径 ~会被替换成URL,垓属性一旦打开,将覆盖所有的dialog的默认路径
- //,iframeUrlMap:{
- // 'anchor':'~/dialogs/anchor/anchor.html',
- //}
-
- //allowLinkProtocol 允许的链接地址,有这些前缀的链接地址不会自动添加http
- //, allowLinkProtocols: ['http:', 'https:', '#', '/', 'ftp:', 'mailto:', 'tel:', 'git:', 'svn:']
-
- //webAppKey 百度应用的APIkey,每个站长必须首先去百度官网注册一个key后方能正常使用app功能,注册介绍,http://app.baidu.com/static/cms/getapikey.html
- //, webAppKey: ""
-
- //默认过滤规则相关配置项目
- //,disabledTableInTable:true //禁止表格嵌套
- //,allowDivTransToP:true //允许进入编辑器的div标签自动变成p标签
- //,rgb2Hex:true //默认产出的数据中的color自动从rgb格式变成16进制格式
-
- // xss 过滤是否开启,inserthtml等操作
- ,xssFilterRules: true
- //input xss过滤
- ,inputXssFilter: true
- //output xss过滤
- ,outputXssFilter: true
- // xss过滤白名单 名单来源: https://raw.githubusercontent.com/leizongmin/js-xss/master/lib/default.js
- ,whitList: {
- a: ['target', 'href', 'title', 'class', 'style'],
- abbr: ['title', 'class', 'style'],
- address: ['class', 'style'],
- area: ['shape', 'coords', 'href', 'alt'],
- article: [],
- aside: [],
- audio: ['autoplay', 'controls', 'loop', 'preload', 'src', 'class', 'style'],
- b: ['class', 'style'],
- bdi: ['dir'],
- bdo: ['dir'],
- big: [],
- blockquote: ['cite', 'class', 'style'],
- br: [],
- caption: ['class', 'style'],
- center: [],
- cite: [],
- code: ['class', 'style'],
- col: ['align', 'valign', 'span', 'width', 'class', 'style'],
- colgroup: ['align', 'valign', 'span', 'width', 'class', 'style'],
- dd: ['class', 'style'],
- del: ['datetime'],
- details: ['open'],
- div: ['class', 'style'],
- dl: ['class', 'style'],
- dt: ['class', 'style'],
- em: ['class', 'style'],
- font: ['color', 'size', 'face'],
- footer: [],
- h1: ['class', 'style'],
- h2: ['class', 'style'],
- h3: ['class', 'style'],
- h4: ['class', 'style'],
- h5: ['class', 'style'],
- h6: ['class', 'style'],
- header: [],
- hr: [],
- i: ['class', 'style'],
- img: ['src', 'alt', 'title', 'width', 'height', 'id', '_src', 'loadingclass', 'class', 'data-latex'],
- ins: ['datetime'],
- li: ['class', 'style'],
- mark: [],
- nav: [],
- ol: ['class', 'style'],
- p: ['class', 'style'],
- pre: ['class', 'style'],
- s: [],
- section:[],
- small: [],
- span: ['class', 'style'],
- sub: ['class', 'style'],
- sup: ['class', 'style'],
- strong: ['class', 'style'],
- table: ['width', 'border', 'align', 'valign', 'class', 'style'],
- tbody: ['align', 'valign', 'class', 'style'],
- td: ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'],
- tfoot: ['align', 'valign', 'class', 'style'],
- th: ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'],
- thead: ['align', 'valign', 'class', 'style'],
- tr: ['rowspan', 'align', 'valign', 'class', 'style'],
- tt: [],
- u: [],
- ul: ['class', 'style'],
- video: ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width', 'class', 'style']
- }
- };
-
- function getUEBasePath(docUrl, confUrl) {
-
- return getBasePath(docUrl || self.document.URL || self.location.href, confUrl || getConfigFilePath());
-
- }
-
- function getConfigFilePath() {
-
- var configPath = document.getElementsByTagName('script');
-
- return configPath[ configPath.length - 1 ].src;
-
- }
-
- function getBasePath(docUrl, confUrl) {
-
- var basePath = confUrl;
-
-
- if (/^(\/|\\\\)/.test(confUrl)) {
-
- basePath = /^.+?\w(\/|\\\\)/.exec(docUrl)[0] + confUrl.replace(/^(\/|\\\\)/, '');
-
- } else if (!/^[a-z]+:/i.test(confUrl)) {
-
- docUrl = docUrl.split("#")[0].split("?")[0].replace(/[^\\\/]+$/, '');
-
- basePath = docUrl + "" + confUrl;
-
- }
-
- return optimizationPath(basePath);
-
- }
-
- function optimizationPath(path) {
-
- var protocol = /^[a-z]+:\/\//.exec(path)[ 0 ],
- tmp = null,
- res = [];
-
- path = path.replace(protocol, "").split("?")[0].split("#")[0];
-
- path = path.replace(/\\/g, '/').split(/\//);
-
- path[ path.length - 1 ] = "";
-
- while (path.length) {
-
- if (( tmp = path.shift() ) === "..") {
- res.pop();
- } else if (tmp !== ".") {
- res.push(tmp);
- }
-
- }
-
- return protocol + res.join("/");
-
- }
-
- window.UE = {
- getUEBasePath: getUEBasePath
- };
-
-})();
diff --git a/www/js/ueditor/ueditor.parse.js b/www/js/ueditor/ueditor.parse.js
deleted file mode 100644
index 407a466429..0000000000
--- a/www/js/ueditor/ueditor.parse.js
+++ /dev/null
@@ -1,1022 +0,0 @@
-/*!
- * UEditor
- * version: ueditor
- * build: Wed Aug 10 2016 11:06:03 GMT+0800 (CST)
- */
-
-(function(){
-
-(function(){
- UE = window.UE || {};
- var isIE = !!window.ActiveXObject;
- //定义utils工具
- var utils = {
- removeLastbs : function(url){
- return url.replace(/\/$/,'')
- },
- extend : function(t,s){
- var a = arguments,
- notCover = this.isBoolean(a[a.length - 1]) ? a[a.length - 1] : false,
- len = this.isBoolean(a[a.length - 1]) ? a.length - 1 : a.length;
- for (var i = 1; i < len; i++) {
- var x = a[i];
- for (var k in x) {
- if (!notCover || !t.hasOwnProperty(k)) {
- t[k] = x[k];
- }
- }
- }
- return t;
- },
- isIE : isIE,
- cssRule : isIE ? function(key,style,doc){
- var indexList,index;
- doc = doc || document;
- if(doc.indexList){
- indexList = doc.indexList;
- }else{
- indexList = doc.indexList = {};
- }
- var sheetStyle;
- if(!indexList[key]){
- if(style === undefined){
- return ''
- }
- sheetStyle = doc.createStyleSheet('',index = doc.styleSheets.length);
- indexList[key] = index;
- }else{
- sheetStyle = doc.styleSheets[indexList[key]];
- }
- if(style === undefined){
- return sheetStyle.cssText
- }
- sheetStyle.cssText = sheetStyle.cssText + '\n' + (style || '')
- } : function(key,style,doc){
- doc = doc || document;
- var head = doc.getElementsByTagName('head')[0],node;
- if(!(node = doc.getElementById(key))){
- if(style === undefined){
- return ''
- }
- node = doc.createElement('style');
- node.id = key;
- head.appendChild(node)
- }
- if(style === undefined){
- return node.innerHTML
- }
- if(style !== ''){
- node.innerHTML = node.innerHTML + '\n' + style;
- }else{
- head.removeChild(node)
- }
- },
- domReady : function (onready) {
- var doc = window.document;
- if (doc.readyState === "complete") {
- onready();
- }else{
- if (isIE) {
- (function () {
- if (doc.isReady) return;
- try {
- doc.documentElement.doScroll("left");
- } catch (error) {
- setTimeout(arguments.callee, 0);
- return;
- }
- onready();
- })();
- window.attachEvent('onload', function(){
- onready()
- });
- } else {
- doc.addEventListener("DOMContentLoaded", function () {
- doc.removeEventListener("DOMContentLoaded", arguments.callee, false);
- onready();
- }, false);
- window.addEventListener('load', function(){onready()}, false);
- }
- }
-
- },
- each : function(obj, iterator, context) {
- if (obj == null) return;
- if (obj.length === +obj.length) {
- for (var i = 0, l = obj.length; i < l; i++) {
- if(iterator.call(context, obj[i], i, obj) === false)
- return false;
- }
- } else {
- for (var key in obj) {
- if (obj.hasOwnProperty(key)) {
- if(iterator.call(context, obj[key], key, obj) === false)
- return false;
- }
- }
- }
- },
- inArray : function(arr,item){
- var index = -1;
- this.each(arr,function(v,i){
- if(v === item){
- index = i;
- return false;
- }
- });
- return index;
- },
- pushItem : function(arr,item){
- if(this.inArray(arr,item)==-1){
- arr.push(item)
- }
- },
- trim: function (str) {
- return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, '');
- },
- indexOf: function (array, item, start) {
- var index = -1;
- start = this.isNumber(start) ? start : 0;
- this.each(array, function (v, i) {
- if (i >= start && v === item) {
- index = i;
- return false;
- }
- });
- return index;
- },
- hasClass: function (element, className) {
- className = className.replace(/(^[ ]+)|([ ]+$)/g, '').replace(/[ ]{2,}/g, ' ').split(' ');
- for (var i = 0, ci, cls = element.className; ci = className[i++];) {
- if (!new RegExp('\\b' + ci + '\\b', 'i').test(cls)) {
- return false;
- }
- }
- return i - 1 == className.length;
- },
- addClass:function (elm, classNames) {
- if(!elm)return;
- classNames = this.trim(classNames).replace(/[ ]{2,}/g,' ').split(' ');
- for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){
- if(!new RegExp('\\b' + ci + '\\b').test(cls)){
- cls += ' ' + ci;
- }
- }
- elm.className = utils.trim(cls);
- },
- removeClass:function (elm, classNames) {
- classNames = this.isArray(classNames) ? classNames :
- this.trim(classNames).replace(/[ ]{2,}/g,' ').split(' ');
- for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){
- cls = cls.replace(new RegExp('\\b' + ci + '\\b'),'')
- }
- cls = this.trim(cls).replace(/[ ]{2,}/g,' ');
- elm.className = cls;
- !cls && elm.removeAttribute('className');
- },
- on: function (element, type, handler) {
- var types = this.isArray(type) ? type : type.split(/\s+/),
- k = types.length;
- if (k) while (k--) {
- type = types[k];
- if (element.addEventListener) {
- element.addEventListener(type, handler, false);
- } else {
- if (!handler._d) {
- handler._d = {
- els : []
- };
- }
- var key = type + handler.toString(),index = utils.indexOf(handler._d.els,element);
- if (!handler._d[key] || index == -1) {
- if(index == -1){
- handler._d.els.push(element);
- }
- if(!handler._d[key]){
- handler._d[key] = function (evt) {
- return handler.call(evt.srcElement, evt || window.event);
- };
- }
-
-
- element.attachEvent('on' + type, handler._d[key]);
- }
- }
- }
- element = null;
- },
- off: function (element, type, handler) {
- var types = this.isArray(type) ? type : type.split(/\s+/),
- k = types.length;
- if (k) while (k--) {
- type = types[k];
- if (element.removeEventListener) {
- element.removeEventListener(type, handler, false);
- } else {
- var key = type + handler.toString();
- try{
- element.detachEvent('on' + type, handler._d ? handler._d[key] : handler);
- }catch(e){}
- if (handler._d && handler._d[key]) {
- var index = utils.indexOf(handler._d.els,element);
- if(index!=-1){
- handler._d.els.splice(index,1);
- }
- handler._d.els.length == 0 && delete handler._d[key];
- }
- }
- }
- },
- loadFile : function () {
- var tmpList = [];
- function getItem(doc,obj){
- try{
- for(var i= 0,ci;ci=tmpList[i++];){
- if(ci.doc === doc && ci.url == (obj.src || obj.href)){
- return ci;
- }
- }
- }catch(e){
- return null;
- }
-
- }
- return function (doc, obj, fn) {
- var item = getItem(doc,obj);
- if (item) {
- if(item.ready){
- fn && fn();
- }else{
- item.funs.push(fn)
- }
- return;
- }
- tmpList.push({
- doc:doc,
- url:obj.src||obj.href,
- funs:[fn]
- });
- if (!doc.body) {
- var html = [];
- for(var p in obj){
- if(p == 'tag')continue;
- html.push(p + '="' + obj[p] + '"')
- }
- doc.write('<' + obj.tag + ' ' + html.join(' ') + ' >'+obj.tag+'>');
- return;
- }
- if (obj.id && doc.getElementById(obj.id)) {
- return;
- }
- var element = doc.createElement(obj.tag);
- delete obj.tag;
- for (var p in obj) {
- element.setAttribute(p, obj[p]);
- }
- element.onload = element.onreadystatechange = function () {
- if (!this.readyState || /loaded|complete/.test(this.readyState)) {
- item = getItem(doc,obj);
- if (item.funs.length > 0) {
- item.ready = 1;
- for (var fi; fi = item.funs.pop();) {
- fi();
- }
- }
- element.onload = element.onreadystatechange = null;
- }
- };
- element.onerror = function(){
- throw Error('The load '+(obj.href||obj.src)+' fails,check the url')
- };
- doc.getElementsByTagName("head")[0].appendChild(element);
- }
- }()
- };
- utils.each(['String', 'Function', 'Array', 'Number', 'RegExp', 'Object','Boolean'], function (v) {
- utils['is' + v] = function (obj) {
- return Object.prototype.toString.apply(obj) == '[object ' + v + ']';
- }
- });
- var parselist = {};
- UE.parse = {
- register : function(parseName,fn){
- parselist[parseName] = fn;
- },
- load : function(opt){
- utils.each(parselist,function(v){
- v.call(opt,utils);
- })
- }
- };
- uParse = function(selector,opt){
- utils.domReady(function(){
- var contents;
- if(document.querySelectorAll){
- contents = document.querySelectorAll(selector)
- }else{
- if(/^#/.test(selector)){
- contents = [document.getElementById(selector.replace(/^#/,''))]
- }else if(/^\./.test(selector)){
- var contents = [];
- utils.each(document.getElementsByTagName('*'),function(node){
- if(node.className && new RegExp('\\b' + selector.replace(/^\./,'') + '\\b','i').test(node.className)){
- contents.push(node)
- }
- })
- }else{
- contents = document.getElementsByTagName(selector)
- }
- }
- utils.each(contents,function(v){
- UE.parse.load(utils.extend({root:v,selector:selector},opt))
- })
- })
- }
-})();
-
-UE.parse.register('insertcode',function(utils){
- var pres = this.root.getElementsByTagName('pre');
- if(pres.length){
- if(typeof XRegExp == "undefined"){
- var jsurl,cssurl;
- if(this.rootPath !== undefined){
- jsurl = utils.removeLastbs(this.rootPath) + '/third-party/SyntaxHighlighter/shCore.js';
- cssurl = utils.removeLastbs(this.rootPath) + '/third-party/SyntaxHighlighter/shCoreDefault.css';
- }else{
- jsurl = this.highlightJsUrl;
- cssurl = this.highlightCssUrl;
- }
- utils.loadFile(document,{
- id : "syntaxhighlighter_css",
- tag : "link",
- rel : "stylesheet",
- type : "text/css",
- href : cssurl
- });
- utils.loadFile(document,{
- id : "syntaxhighlighter_js",
- src : jsurl,
- tag : "script",
- type : "text/javascript",
- defer : "defer"
- },function(){
- utils.each(pres,function(pi){
- if(pi && /brush/i.test(pi.className)){
- SyntaxHighlighter.highlight(pi);
- }
- });
- });
- }else{
- utils.each(pres,function(pi){
- if(pi && /brush/i.test(pi.className)){
- SyntaxHighlighter.highlight(pi);
- }
- });
- }
- }
-
-});
-UE.parse.register('table', function (utils) {
- var me = this,
- root = this.root,
- tables = root.getElementsByTagName('table');
- if (tables.length) {
- var selector = this.selector;
- //追加默认的表格样式
- utils.cssRule('table',
- selector + ' table.noBorderTable td,' +
- selector + ' table.noBorderTable th,' +
- selector + ' table.noBorderTable caption{border:1px dashed #ddd !important}' +
- selector + ' table.sortEnabled tr.firstRow th,' + selector + ' table.sortEnabled tr.firstRow td{padding-right:20px; background-repeat: no-repeat;' +
- 'background-position: center right; background-image:url(' + this.rootPath + 'themes/default/images/sortable.png);}' +
- selector + ' table.sortEnabled tr.firstRow th:hover,' + selector + ' table.sortEnabled tr.firstRow td:hover{background-color: #EEE;}' +
- selector + ' table{margin-bottom:10px;border-collapse:collapse;display:table;}' +
- selector + ' td,' + selector + ' th{ background:white; padding: 5px 10px;border: 1px solid #DDD;}' +
- selector + ' caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}' +
- selector + ' th{border-top:1px solid #BBB;background:#F7F7F7;}' +
- selector + ' table tr.firstRow th{border-top:2px solid #BBB;background:#F7F7F7;}' +
- selector + ' tr.ue-table-interlace-color-single td{ background: #fcfcfc; }' +
- selector + ' tr.ue-table-interlace-color-double td{ background: #f7faff; }' +
- selector + ' td p{margin:0;padding:0;}',
- document);
- //填充空的单元格
-
- utils.each('td th caption'.split(' '), function (tag) {
- var cells = root.getElementsByTagName(tag);
- cells.length && utils.each(cells, function (node) {
- if (!node.firstChild) {
- node.innerHTML = ' ';
-
- }
- })
- });
-
- //表格可排序
- var tables = root.getElementsByTagName('table');
- utils.each(tables, function (table) {
- if (/\bsortEnabled\b/.test(table.className)) {
- utils.on(table, 'click', function(e){
- var target = e.target || e.srcElement,
- cell = findParentByTagName(target, ['td', 'th']);
- var table = findParentByTagName(target, 'table'),
- colIndex = utils.indexOf(table.rows[0].cells, cell),
- sortType = table.getAttribute('data-sort-type');
- if(colIndex != -1) {
- sortTable(table, colIndex, me.tableSortCompareFn || sortType);
- updateTable(table);
- }
- });
- }
- });
-
- //按照标签名查找父节点
- function findParentByTagName(target, tagNames) {
- var i, current = target;
- tagNames = utils.isArray(tagNames) ? tagNames:[tagNames];
- while(current){
- for(i = 0;i < tagNames.length; i++) {
- if(current.tagName == tagNames[i].toUpperCase()) return current;
- }
- current = current.parentNode;
- }
- return null;
- }
- //表格排序
- function sortTable(table, sortByCellIndex, compareFn) {
- var rows = table.rows,
- trArray = [],
- flag = rows[0].cells[0].tagName === "TH",
- lastRowIndex = 0;
-
- for (var i = 0,len = rows.length; i < len; i++) {
- trArray[i] = rows[i];
- }
-
- var Fn = {
- 'reversecurrent': function(td1,td2){
- return 1;
- },
- 'orderbyasc': function(td1,td2){
- var value1 = td1.innerText||td1.textContent,
- value2 = td2.innerText||td2.textContent;
- return value1.localeCompare(value2);
- },
- 'reversebyasc': function(td1,td2){
- var value1 = td1.innerHTML,
- value2 = td2.innerHTML;
- return value2.localeCompare(value1);
- },
- 'orderbynum': function(td1,td2){
- var value1 = td1[utils.isIE ? 'innerText':'textContent'].match(/\d+/),
- value2 = td2[utils.isIE ? 'innerText':'textContent'].match(/\d+/);
- if(value1) value1 = +value1[0];
- if(value2) value2 = +value2[0];
- return (value1||0) - (value2||0);
- },
- 'reversebynum': function(td1,td2){
- var value1 = td1[utils.isIE ? 'innerText':'textContent'].match(/\d+/),
- value2 = td2[utils.isIE ? 'innerText':'textContent'].match(/\d+/);
- if(value1) value1 = +value1[0];
- if(value2) value2 = +value2[0];
- return (value2||0) - (value1||0);
- }
- };
-
- //对表格设置排序的标记data-sort-type
- table.setAttribute('data-sort-type', compareFn && typeof compareFn === "string" && Fn[compareFn] ? compareFn:'');
-
- //th不参与排序
- flag && trArray.splice(0, 1);
- trArray = sort(trArray,function (tr1, tr2) {
- var result;
- if (compareFn && typeof compareFn === "function") {
- result = compareFn.call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]);
- } else if (compareFn && typeof compareFn === "number") {
- result = 1;
- } else if (compareFn && typeof compareFn === "string" && Fn[compareFn]) {
- result = Fn[compareFn].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]);
- } else {
- result = Fn['orderbyasc'].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]);
- }
- return result;
- });
- var fragment = table.ownerDocument.createDocumentFragment();
- for (var j = 0, len = trArray.length; j < len; j++) {
- fragment.appendChild(trArray[j]);
- }
- var tbody = table.getElementsByTagName("tbody")[0];
- if(!lastRowIndex){
- tbody.appendChild(fragment);
- }else{
- tbody.insertBefore(fragment,rows[lastRowIndex- range.endRowIndex + range.beginRowIndex - 1])
- }
- }
- //冒泡排序
- function sort(array, compareFn){
- compareFn = compareFn || function(item1, item2){ return item1.localeCompare(item2);};
- for(var i= 0,len = array.length; i 0){
- var t = array[i];
- array[i] = array[j];
- array[j] = t;
- }
- }
- }
- return array;
- }
- //更新表格
- function updateTable(table) {
- //给第一行设置firstRow的样式名称,在排序图标的样式上使用到
- if(!utils.hasClass(table.rows[0], "firstRow")) {
- for(var i = 1; i< table.rows.length; i++) {
- utils.removeClass(table.rows[i], "firstRow");
- }
- utils.addClass(table.rows[0], "firstRow");
- }
- }
- }
-});
-UE.parse.register('charts',function( utils ){
-
- utils.cssRule('chartsContainerHeight','.edui-chart-container { height:'+(this.chartContainerHeight||300)+'px}');
- var resourceRoot = this.rootPath,
- containers = this.root,
- sources = null;
-
- //不存在指定的根路径, 则直接退出
- if ( !resourceRoot ) {
- return;
- }
-
- if ( sources = parseSources() ) {
-
- loadResources();
-
- }
-
-
- function parseSources () {
-
- if ( !containers ) {
- return null;
- }
-
- return extractChartData( containers );
-
- }
-
- /**
- * 提取数据
- */
- function extractChartData ( rootNode ) {
-
- var data = [],
- tables = rootNode.getElementsByTagName( "table" );
-
- for ( var i = 0, tableNode; tableNode = tables[ i ]; i++ ) {
-
- if ( tableNode.getAttribute( "data-chart" ) !== null ) {
-
- data.push( formatData( tableNode ) );
-
- }
-
- }
-
- return data.length ? data : null;
-
- }
-
- function formatData ( tableNode ) {
-
- var meta = tableNode.getAttribute( "data-chart" ),
- metaConfig = {},
- data = [];
-
- //提取table数据
- for ( var i = 0, row; row = tableNode.rows[ i ]; i++ ) {
-
- var rowData = [];
-
- for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) {
-
- var value = ( cell.innerText || cell.textContent || '' );
- rowData.push( cell.tagName == 'TH' ? value:(value | 0) );
-
- }
-
- data.push( rowData );
-
- }
-
- //解析元信息
- meta = meta.split( ";" );
- for ( var i = 0, metaData; metaData = meta[ i ]; i++ ) {
-
- metaData = metaData.split( ":" );
- metaConfig[ metaData[ 0 ] ] = metaData[ 1 ];
-
- }
-
-
- return {
- table: tableNode,
- meta: metaConfig,
- data: data
- };
-
- }
-
- //加载资源
- function loadResources () {
-
- loadJQuery();
-
- }
-
- function loadJQuery () {
-
- //不存在jquery, 则加载jquery
- if ( !window.jQuery ) {
-
- utils.loadFile(document,{
- src : resourceRoot + "/third-party/jquery-1.10.2.min.js",
- tag : "script",
- type : "text/javascript",
- defer : "defer"
- },function(){
-
- loadHighcharts();
-
- });
-
- } else {
-
- loadHighcharts();
-
- }
-
- }
-
- function loadHighcharts () {
-
- //不存在Highcharts, 则加载Highcharts
- if ( !window.Highcharts ) {
-
- utils.loadFile(document,{
- src : resourceRoot + "/third-party/highcharts/highcharts.js",
- tag : "script",
- type : "text/javascript",
- defer : "defer"
- },function(){
-
- loadTypeConfig();
-
- });
-
- } else {
-
- loadTypeConfig();
-
- }
-
- }
-
- //加载图表差异化配置文件
- function loadTypeConfig () {
-
- utils.loadFile(document,{
- src : resourceRoot + "/dialogs/charts/chart.config.js",
- tag : "script",
- type : "text/javascript",
- defer : "defer"
- },function(){
-
- render();
-
- });
-
- }
-
- //渲染图表
- function render () {
-
- var config = null,
- chartConfig = null,
- container = null;
-
- for ( var i = 0, len = sources.length; i < len; i++ ) {
-
- config = sources[ i ];
-
- chartConfig = analysisConfig( config );
-
- container = createContainer( config.table );
-
- renderChart( container, typeConfig[ config.meta.chartType ], chartConfig );
-
- }
-
-
- }
-
- /**
- * 渲染图表
- * @param container 图表容器节点对象
- * @param typeConfig 图表类型配置
- * @param config 图表通用配置
- * */
- function renderChart ( container, typeConfig, config ) {
-
-
- $( container ).highcharts( $.extend( {}, typeConfig, {
-
- credits: {
- enabled: false
- },
- exporting: {
- enabled: false
- },
- title: {
- text: config.title,
- x: -20 //center
- },
- subtitle: {
- text: config.subTitle,
- x: -20
- },
- xAxis: {
- title: {
- text: config.xTitle
- },
- categories: config.categories
- },
- yAxis: {
- title: {
- text: config.yTitle
- },
- plotLines: [{
- value: 0,
- width: 1,
- color: '#808080'
- }]
- },
- tooltip: {
- enabled: true,
- valueSuffix: config.suffix
- },
- legend: {
- layout: 'vertical',
- align: 'right',
- verticalAlign: 'middle',
- borderWidth: 1
- },
- series: config.series
-
- } ));
-
- }
-
- /**
- * 创建图表的容器
- * 新创建的容器会替换掉对应的table对象
- * */
- function createContainer ( tableNode ) {
-
- var container = document.createElement( "div" );
- container.className = "edui-chart-container";
-
- tableNode.parentNode.replaceChild( container, tableNode );
-
- return container;
-
- }
-
- //根据config解析出正确的类别和图表数据信息
- function analysisConfig ( config ) {
-
- var series = [],
- //数据类别
- categories = [],
- result = [],
- data = config.data,
- meta = config.meta;
-
- //数据对齐方式为相反的方式, 需要反转数据
- if ( meta.dataFormat != "1" ) {
-
- for ( var i = 0, len = data.length; i < len ; i++ ) {
-
- for ( var j = 0, jlen = data[ i ].length; j < jlen; j++ ) {
-
- if ( !result[ j ] ) {
- result[ j ] = [];
- }
-
- result[ j ][ i ] = data[ i ][ j ];
-
- }
-
- }
-
- data = result;
-
- }
-
- result = {};
-
- //普通图表
- if ( meta.chartType != typeConfig.length - 1 ) {
-
- categories = data[ 0 ].slice( 1 );
-
- for ( var i = 1, curData; curData = data[ i ]; i++ ) {
- series.push( {
- name: curData[ 0 ],
- data: curData.slice( 1 )
- } );
- }
-
- result.series = series;
- result.categories = categories;
- result.title = meta.title;
- result.subTitle = meta.subTitle;
- result.xTitle = meta.xTitle;
- result.yTitle = meta.yTitle;
- result.suffix = meta.suffix;
-
- } else {
-
- var curData = [];
-
- for ( var i = 1, len = data[ 0 ].length; i < len; i++ ) {
-
- curData.push( [ data[ 0 ][ i ], data[ 1 ][ i ] | 0 ] );
-
- }
-
- //饼图
- series[ 0 ] = {
- type: 'pie',
- name: meta.tip,
- data: curData
- };
-
- result.series = series;
- result.title = meta.title;
- result.suffix = meta.suffix;
-
- }
-
- return result;
-
- }
-
-});
-UE.parse.register('background', function (utils) {
- var me = this,
- root = me.root,
- p = root.getElementsByTagName('p'),
- styles;
-
- for (var i = 0,ci; ci = p[i++];) {
- styles = ci.getAttribute('data-background');
- if (styles){
- ci.parentNode.removeChild(ci);
- }
- }
-
- //追加默认的表格样式
- styles && utils.cssRule('ueditor_background', me.selector + '{' + styles + '}', document);
-});
-UE.parse.register('list',function(utils){
- var customCss = [],
- customStyle = {
- 'cn' : 'cn-1-',
- 'cn1' : 'cn-2-',
- 'cn2' : 'cn-3-',
- 'num' : 'num-1-',
- 'num1' : 'num-2-',
- 'num2' : 'num-3-',
- 'dash' : 'dash',
- 'dot' : 'dot'
- };
-
-
- utils.extend(this,{
- liiconpath : 'http://bs.baidu.com/listicon/',
- listDefaultPaddingLeft : '20'
- });
-
- var root = this.root,
- ols = root.getElementsByTagName('ol'),
- uls = root.getElementsByTagName('ul'),
- selector = this.selector;
-
- if(ols.length){
- applyStyle.call(this,ols);
- }
-
- if(uls.length){
- applyStyle.call(this,uls);
- }
-
- if(ols.length || uls.length){
- customCss.push(selector +' .list-paddingleft-1{padding-left:0}');
- customCss.push(selector +' .list-paddingleft-2{padding-left:'+ this.listDefaultPaddingLeft+'px}');
- customCss.push(selector +' .list-paddingleft-3{padding-left:'+ this.listDefaultPaddingLeft*2+'px}');
-
- utils.cssRule('list', selector +' ol,'+selector +' ul{margin:0;padding:0;}li{clear:both;}'+customCss.join('\n'), document);
- }
- function applyStyle(nodes){
- var T = this;
- utils.each(nodes,function(list){
- if(list.className && /custom_/i.test(list.className)){
- var listStyle = list.className.match(/custom_(\w+)/)[1];
- if(listStyle == 'dash' || listStyle == 'dot'){
- utils.pushItem(customCss,selector +' li.list-' + customStyle[listStyle] + '{background-image:url(' + T.liiconpath +customStyle[listStyle]+'.gif)}');
- utils.pushItem(customCss,selector +' ul.custom_'+listStyle+'{list-style:none;} '+ selector +' ul.custom_'+listStyle+' li{background-position:0 3px;background-repeat:no-repeat}');
-
- }else{
- var index = 1;
- utils.each(list.childNodes,function(li){
- if(li.tagName == 'LI'){
- utils.pushItem(customCss,selector + ' li.list-' + customStyle[listStyle] + index + '{background-image:url(' + T.liiconpath + 'list-'+customStyle[listStyle] +index + '.gif)}');
- index++;
- }
- });
- utils.pushItem(customCss,selector + ' ol.custom_'+listStyle+'{list-style:none;}'+selector+' ol.custom_'+listStyle+' li{background-position:0 3px;background-repeat:no-repeat}');
- }
- switch(listStyle){
- case 'cn':
- utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:25px}');
- utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}');
- utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:55px}');
- break;
- case 'cn1':
- utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:30px}');
- utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}');
- utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:55px}');
- break;
- case 'cn2':
- utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:40px}');
- utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:55px}');
- utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:68px}');
- break;
- case 'num':
- case 'num1':
- utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:25px}');
- break;
- case 'num2':
- utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:35px}');
- utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}');
- break;
- case 'dash':
- utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft{padding-left:35px}');
- break;
- case 'dot':
- utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft{padding-left:20px}');
- }
- }
- });
- }
-
-
-});
-UE.parse.register('vedio',function(utils){
- var video = this.root.getElementsByTagName('video'),
- audio = this.root.getElementsByTagName('audio');
-
- document.createElement('video');document.createElement('audio');
- if(video.length || audio.length){
- var sourcePath = utils.removeLastbs(this.rootPath),
- jsurl = sourcePath + '/third-party/video-js/video.js',
- cssurl = sourcePath + '/third-party/video-js/video-js.min.css',
- swfUrl = sourcePath + '/third-party/video-js/video-js.swf';
-
- if(window.videojs) {
- videojs.autoSetup();
- } else {
- utils.loadFile(document,{
- id : "video_css",
- tag : "link",
- rel : "stylesheet",
- type : "text/css",
- href : cssurl
- });
- utils.loadFile(document,{
- id : "video_js",
- src : jsurl,
- tag : "script",
- type : "text/javascript"
- },function(){
- videojs.options.flash.swf = swfUrl;
- videojs.autoSetup();
- });
- }
-
- }
-});
-
-})();