| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934 | /** * Created by JetBrains PhpStorm. * User: taoqili * Date: 12-2-20 * Time: 上午11:19 * To change this template use File | Settings | File Templates. */;(function () {  var video = {},    uploadVideoList = [],    isModifyUploadVideo = false,    uploadFile  window.onload = function () {    $focus($G('videoUrl'))    initTabs()    initVideo()    initUpload()  }  /* 初始化tab标签 */  function initTabs() {    var tabs = $G('tabHeads').children    for (var i = 0; i < tabs.length; i++) {      domUtils.on(tabs[i], 'click', function (e) {        var j,          bodyId,          target = e.target || e.srcElement        for (j = 0; j < tabs.length; j++) {          bodyId = tabs[j].getAttribute('data-content-id')          if (tabs[j] == target) {            domUtils.addClass(tabs[j], 'focus')            domUtils.addClass($G(bodyId), 'focus')          } else {            domUtils.removeClasses(tabs[j], 'focus')            domUtils.removeClasses($G(bodyId), 'focus')          }        }      })    }  }  function initVideo() {    createAlignButton(['videoFloat', 'upload_alignment'])    addUrlChangeListener($G('videoUrl'))    addOkListener()    //编辑视频时初始化相关信息    ;(function () {      var img = editor.selection.getRange().getClosedNode(),        url      if (img && img.className) {        var hasFakedClass = img.className == 'edui-faked-video',          hasUploadClass = img.className.indexOf('edui-upload-video') != -1        if (hasFakedClass || hasUploadClass) {          $G('videoUrl').value = url = img.getAttribute('_url')          $G('videoWidth').value = img.width          $G('videoHeight').value = img.height          var align = domUtils.getComputedStyle(img, 'float'),            parentAlign = domUtils.getComputedStyle(              img.parentNode,              'text-align'            )          updateAlignButton(parentAlign === 'center' ? 'center' : align)        }        if (hasUploadClass) {          isModifyUploadVideo = true        }      }      createPreviewVideo(url)    })()  }  /**   * 监听确认和取消两个按钮事件,用户执行插入或者清空正在播放的视频实例操作   */  function addOkListener() {    dialog.onok = function () {      $G('preview').innerHTML = ''      var currentTab = findFocus('tabHeads', 'tabSrc')      switch (currentTab) {        case 'video':          return insertSingle()          break        case 'videoSearch':          return insertSearch('searchList')          break        case 'upload':          return insertUpload()          break      }    }    dialog.oncancel = function () {      $G('preview').innerHTML = ''    }  }  /**   * 依据传入的align值更新按钮信息   * @param align   */  function updateAlignButton(align) {    var aligns = $G('videoFloat').children    for (var i = 0, ci; (ci = aligns[i++]); ) {      if (ci.getAttribute('name') == align) {        if (ci.className != 'focus') {          ci.className = 'focus'        }      } else {        if (ci.className == 'focus') {          ci.className = ''        }      }    }  }  /**   * 将单个视频信息插入编辑器中   */  function insertSingle() {    var width = $G('videoWidth'),      height = $G('videoHeight'),      url = $G('videoUrl').value,      align = findFocus('videoFloat', 'name')    if (!url) return false    if (!checkNum([width, height])) return false    editor.execCommand(      'insertvideo',      {        url: convert_url(url),        width: width.value,        height: height.value,        align: align      },      isModifyUploadVideo ? 'upload' : null    )  }  /**   * 将元素id下的所有代表视频的图片插入编辑器中   * @param id   */  function insertSearch(id) {    var imgs = domUtils.getElementsByTagName($G(id), 'img'),      videoObjs = []    for (var i = 0, img; (img = imgs[i++]); ) {      if (img.getAttribute('selected')) {        videoObjs.push({          url: img.getAttribute('ue_video_url'),          width: 420,          height: 280,          align: 'none'        })      }    }    editor.execCommand('insertvideo', videoObjs)  }  /**   * 找到id下具有focus类的节点并返回该节点下的某个属性   * @param id   * @param returnProperty   */  function findFocus(id, returnProperty) {    var tabs = $G(id).children,      property    for (var i = 0, ci; (ci = tabs[i++]); ) {      if (ci.className == 'focus') {        property = ci.getAttribute(returnProperty)        break      }    }    return property  }  function convert_url(url) {    if (!url) return ''    url = utils      .trim(url)      .replace(        /v\.youku\.com\/v_show\/id_([\w\-=]+)\.html/i,        'player.youku.com/player.php/sid/$1/v.swf'      )      .replace(        /(www\.)?youtube\.com\/watch\?v=([\w\-]+)/i,        'www.youtube.com/v/$2'      )      .replace(/youtu.be\/(\w+)$/i, 'www.youtube.com/v/$1')      .replace(        /v\.ku6\.com\/.+\/([\w\.]+)\.html.*$/i,        'player.ku6.com/refer/$1/v.swf'      )      .replace(        /www\.56\.com\/u\d+\/v_([\w\-]+)\.html/i,        'player.56.com/v_$1.swf'      )      .replace(        /www.56.com\/w\d+\/play_album\-aid\-\d+_vid\-([^.]+)\.html/i,        'player.56.com/v_$1.swf'      )      .replace(        /v\.pps\.tv\/play_([\w]+)\.html.*$/i,        'player.pps.tv/player/sid/$1/v.swf'      )      .replace(        /www\.letv\.com\/ptv\/vplay\/([\d]+)\.html.*$/i,        'i7.imgs.letv.com/player/swfPlayer.swf?id=$1&autoplay=0'      )      .replace(        /www\.tudou\.com\/programs\/view\/([\w\-]+)\/?/i,        'www.tudou.com/v/$1'      )      .replace(        /v\.qq\.com\/cover\/[\w]+\/[\w]+\/([\w]+)\.html/i,        'static.video.qq.com/TPout.swf?vid=$1'      )      .replace(        /v\.qq\.com\/.+[\?\&]vid=([^&]+).*$/i,        'static.video.qq.com/TPout.swf?vid=$1'      )      .replace(        /my\.tv\.sohu\.com\/[\w]+\/[\d]+\/([\d]+)\.shtml.*$/i,        'share.vrs.sohu.com/my/v.swf&id=$1'      )    return url  }  /**   * 检测传入的所有input框中输入的长宽是否是正数   * @param nodes input框集合,   */  function checkNum(nodes) {    for (var i = 0, ci; (ci = nodes[i++]); ) {      var value = ci.value      if (!isNumber(value) && value) {        alert(lang.numError)        ci.value = ''        ci.focus()        return false      }    }    return true  }  /**   * 数字判断   * @param value   */  function isNumber(value) {    return /(0|^[1-9]\d*$)/.test(value)  }  /**   * 创建图片浮动选择按钮   * @param ids   */  function createAlignButton(ids) {    for (var i = 0, ci; (ci = ids[i++]); ) {      var floatContainer = $G(ci),        nameMaps = {          none: lang['default'],          left: lang.floatLeft,          right: lang.floatRight,          center: lang.block        }      for (var j in nameMaps) {        var div = document.createElement('div')        div.setAttribute('name', j)        if (j == 'none') div.className = 'focus'        div.style.cssText = 'background:url(images/' + j + '_focus.jpg);'        div.setAttribute('title', nameMaps[j])        floatContainer.appendChild(div)      }      switchSelect(ci)    }  }  /**   * 选择切换   * @param selectParentId   */  function switchSelect(selectParentId) {    var selects = $G(selectParentId).children    for (var i = 0, ci; (ci = selects[i++]); ) {      domUtils.on(ci, 'click', function () {        for (var j = 0, cj; (cj = selects[j++]); ) {          cj.className = ''          cj.removeAttribute && cj.removeAttribute('class')        }        this.className = 'focus'      })    }  }  /**   * 监听url改变事件   * @param url   */  function addUrlChangeListener(url) {    if (browser.ie) {      url.onpropertychange = function () {        createPreviewVideo(this.value)      }    } else {      url.addEventListener(        'input',        function () {          createPreviewVideo(this.value)        },        false      )    }  }  /**   * 根据url生成视频预览   * @param url   */  function createPreviewVideo(url) {    if (!url) return    var conUrl = convert_url(url)    conUrl = utils.unhtmlForUrl(conUrl)    $G('preview').innerHTML =      '<div class="previewMsg"><span>' +      lang.urlError +      '</span></div>' +      '<embed class="previewVideo" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"' +      ' src="' +      conUrl +      '"' +      ' width="' +      420 +      '"' +      ' height="' +      280 +      '"' +      ' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >' +      '</embed>'  }  /* 插入上传视频 */  function insertUpload() {    var videoObjs = [],      uploadDir = editor.getOpt('videoUrlPrefix'),      width = parseInt($G('upload_width').value, 10) || 420,      height = parseInt($G('upload_height').value, 10) || 280,      align = findFocus('upload_alignment', 'name') || 'none'    for (var key in uploadVideoList) {      var file = uploadVideoList[key]      videoObjs.push({        url: file.url,        width: width,        height: height,        align: align      })    }    var count = uploadFile.getQueueCount()    if (count) {      $('.info', '#queueList').html(        '<span style="color:red;">' +          '还有2个未上传文件'.replace(/[\d]/, count) +          '</span>'      )      return false    } else {      editor.execCommand('insertvideo', videoObjs, 'upload')    }  }  /*初始化上传标签*/  function initUpload() {    uploadFile = new UploadFile('queueList')  }  /* 上传附件 */  function UploadFile(target) {    this.$wrap = target.constructor == String ? $('#' + target) : $(target)    this.init()  }  UploadFile.prototype = {    init: function () {      this.fileList = []      this.initContainer()      this.initUploader()    },    initContainer: function () {      this.$queue = this.$wrap.find('.filelist')    },    /* 初始化容器 */    initUploader: function () {      var _this = this,        $ = jQuery, // just in case. Make sure it's not an other libaray.        $wrap = _this.$wrap,        // 图片容器        $queue = $wrap.find('.filelist'),        // 状态栏,包括进度和控制按钮        $statusBar = $wrap.find('.statusBar'),        // 文件总体选择信息。        $info = $statusBar.find('.info'),        // 上传按钮        $upload = $wrap.find('.uploadBtn'),        // 上传按钮        $filePickerBtn = $wrap.find('.filePickerBtn'),        // 上传按钮        $filePickerBlock = $wrap.find('.filePickerBlock'),        // 没选择文件之前的内容。        $placeHolder = $wrap.find('.placeholder'),        // 总体进度条        $progress = $statusBar.find('.progress').hide(),        // 添加的文件数量        fileCount = 0,        // 添加的文件总大小        fileSize = 0,        // 优化retina, 在retina下这个值是2        ratio = window.devicePixelRatio || 1,        // 缩略图大小        thumbnailWidth = 113 * ratio,        thumbnailHeight = 113 * ratio,        // 可能有pedding, ready, uploading, confirm, done.        state = '',        // 所有文件的进度信息,key为file id        percentages = {},        supportTransition = (function () {          var s = document.createElement('p').style,            r =              'transition' in s ||              'WebkitTransition' in s ||              'MozTransition' in s ||              'msTransition' in s ||              'OTransition' in s          s = null          return r        })(),        // WebUploader实例        uploader,        actionUrl = editor.getActionUrl(editor.getOpt('videoActionName')),        fileMaxSize = editor.getOpt('videoMaxSize'),        acceptExtensions = (editor.getOpt('videoAllowFiles') || [])          .join('')          .replace(/\./g, ',')          .replace(/^[,]/, '')      if (!WebUploader.Uploader.support()) {        $('#filePickerReady')          .after($('<div>').html(lang.errorNotSupport))          .hide()        return      } else if (!editor.getOpt('videoActionName')) {        $('#filePickerReady')          .after($('<div>').html(lang.errorLoadConfig))          .hide()        return      }      uploader = _this.uploader = WebUploader.create({        pick: {          id: '#filePickerReady',          label: lang.uploadSelectFile        },        swf: '../../third-party/webuploader/Uploader.swf',        server: actionUrl,        fileVal: editor.getOpt('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 = $(            '<li id="' +              file.id +              '">' +              '<p class="title">' +              file.name +              '</p>' +              '<p class="imgWrap"></p>' +              '<p class="progress"><span></span></p>' +              '</li>'          ),          $btns = $(            '<div class="file-panel">' +              '<span class="cancel">' +              lang.uploadDelete +              '</span>' +              '<span class="rotateRight">' +              lang.uploadTurnRight +              '</span>' +              '<span class="rotateLeft">' +              lang.uploadTurnLeft +              '</span></div>'          ).appendTo($li),          $prgress = $li.find('p.progress span'),          $wrap = $li.find('p.imgWrap'),          $info = $('<p class="error"></p>').hide().appendTo($li),          showError = function (code) {            switch (code) {              case 'exceed_size':                text = lang.errorExceedSize                break              case 'interrupt':                text = lang.errorInterrupt                break              case 'http':                text = lang.errorHttp                break              case 'not_allow_type':                text = lang.errorFileType                break              default:                text = lang.errorUploadRetry                break            }            $info.text(text).show()          }        if (file.getStatus() === 'invalid') {          showError(file.statusText)        } else {          $wrap.text(lang.uploadPreview)          if (            '|png|jpg|jpeg|bmp|gif|'.indexOf(              '|' + file.ext.toLowerCase() + '|'            ) == -1          ) {            $wrap              .empty()              .addClass('notimage')              .append(                '<i class="file-preview file-type-' +                  file.ext.toLowerCase() +                  '"></i>' +                  '<span class="file-title">' +                  file.name +                  '</span>'              )          } else {            if (browser.ie && browser.version <= 7) {              $wrap.text(lang.uploadNoPreview)            } else {              uploader.makeThumb(                file,                function (error, src) {                  if (                    error ||                    !src ||                    (/^data:/.test(src) && browser.ie && browser.version <= 7)                  ) {                    $wrap.text(lang.uploadNoPreview)                  } else {                    var $img = $('<img src="' + src + '">')                    $wrap.empty().append($img)                    $img.on('error', function () {                      $wrap.text(lang.uploadNoPreview)                    })                  }                },                thumbnailWidth,                thumbnailHeight              )            }          }          percentages[file.id] = [file.size, 0]          file.rotation = 0          /* 检查文件格式 */          if (            !file.ext ||            acceptExtensions.indexOf(file.ext.toLowerCase()) == -1          ) {            showError('not_allow_type')            uploader.removeFile(file)          }        }        file.on('statuschange', function (cur, prev) {          if (prev === 'progress') {            $prgress.hide().width(0)          } else if (prev === 'queued') {            $li.off('mouseenter mouseleave')            $btns.remove()          }          // 成功          if (cur === 'error' || cur === 'invalid') {            showError(file.statusText)            percentages[file.id][1] = 1          } else if (cur === 'interrupt') {            showError('interrupt')          } else if (cur === 'queued') {            percentages[file.id][1] = 0          } else if (cur === 'progress') {            $info.hide()            $prgress.css('display', 'block')          } else if (cur === 'complete') {          }          $li.removeClass('state-' + prev).addClass('state-' + cur)        })        $li.on('mouseenter', function () {          $btns.stop().animate({ height: 30 })        })        $li.on('mouseleave', function () {          $btns.stop().animate({ height: 0 })        })        $btns.on('click', 'span', function () {          var index = $(this).index(),            deg          switch (index) {            case 0:              uploader.removeFile(file)              return            case 1:              file.rotation += 90              break            case 2:              file.rotation -= 90              break          }          if (supportTransition) {            deg = 'rotate(' + file.rotation + 'deg)'            $wrap.css({              '-webkit-transform': deg,              '-mos-transform': deg,              '-o-transform': deg,              transform: deg            })          } else {            $wrap.css(              'filter',              'progid:DXImageTransform.Microsoft.BasicImage(rotation=' +                (~~(((file.rotation / 90) % 4) + 4) % 4) +                ')'            )          }        })        $li.insertBefore($filePickerBlock)      }      // 负责view的销毁      function removeFile(file) {        var $li = $('#' + file.id)        delete percentages[file.id]        updateTotalProgress()        $li.off().find('.file-panel').off().end().remove()      }      function updateTotalProgress() {        var loaded = 0,          total = 0,          spans = $progress.children(),          percent        $.each(percentages, function (k, v) {          total += v[0]          loaded += v[0] * v[1]        })        percent = total ? loaded / total : 0        spans.eq(0).text(Math.round(percent * 100) + '%')        spans.eq(1).css('width', Math.round(percent * 100) + '%')        updateStatus()      }      function setState(val, files) {        if (val != state) {          var stats = uploader.getStats()          $upload.removeClass('state-' + state)          $upload.addClass('state-' + val)          switch (val) {            /* 未选择文件 */            case 'pedding':              $queue.addClass('element-invisible')              $statusBar.addClass('element-invisible')              $placeHolder.removeClass('element-invisible')              $progress.hide()              $info.hide()              uploader.refresh()              break            /* 可以开始上传 */            case 'ready':              $placeHolder.addClass('element-invisible')              $queue.removeClass('element-invisible')              $statusBar.removeClass('element-invisible')              $progress.hide()              $info.show()              $upload.text(lang.uploadStart)              uploader.refresh()              break            /* 上传中 */            case 'uploading':              $progress.show()              $info.hide()              $upload.text(lang.uploadPause)              break            /* 暂停上传 */            case 'paused':              $progress.show()              $info.hide()              $upload.text(lang.uploadContinue)              break            case 'confirm':              $progress.show()              $info.hide()              $upload.text(lang.uploadStart)              stats = uploader.getStats()              if (stats.successNum && !stats.uploadFailNum) {                setState('finish')                return              }              break            case 'finish':              $progress.hide()              $info.show()              if (stats.uploadFailNum) {                $upload.text(lang.uploadRetry)              } else {                $upload.text(lang.uploadStart)              }              break          }          state = val          updateStatus()        }        if (!_this.getQueueCount()) {          $upload.addClass('disabled')        } else {          $upload.removeClass('disabled')        }      }      function updateStatus() {        var text = '',          stats        if (state === 'ready') {          text = lang.updateStatusReady            .replace('_', fileCount)            .replace('_KB', WebUploader.formatSize(fileSize))        } else if (state === 'confirm') {          stats = uploader.getStats()          if (stats.uploadFailNum) {            text = lang.updateStatusConfirm              .replace('_', stats.successNum)              .replace('_', stats.successNum)          }        } else {          stats = uploader.getStats()          text = lang.updateStatusFinish            .replace('_', fileCount)            .replace('_KB', WebUploader.formatSize(fileSize))            .replace('_', stats.successNum)          if (stats.uploadFailNum) {            text += lang.updateStatusError.replace('_', stats.uploadFailNum)          }        }        $info.html(text)      }      uploader.on('fileQueued', function (file) {        fileCount++        fileSize += file.size        if (fileCount === 1) {          $placeHolder.addClass('element-invisible')          $statusBar.show()        }        addFile(file)      })      uploader.on('fileDequeued', function (file) {        fileCount--        fileSize -= file.size        removeFile(file)        updateTotalProgress()      })      uploader.on('filesQueued', function (file) {        if (          !uploader.isInProgress() &&          (state == 'pedding' ||            state == 'finish' ||            state == 'confirm' ||            state == 'ready')        ) {          setState('ready')        }        updateTotalProgress()      })      uploader.on('all', function (type, files) {        switch (type) {          case 'uploadFinished':            setState('confirm', files)            break          case 'startUpload':            /* 添加额外的GET参数 */            var params =                utils.serializeParam(editor.queryCommandValue('serverparam')) ||                '',              url = utils.formatUrl(                actionUrl +                  (actionUrl.indexOf('?') == -1 ? '?' : '&') +                  'encode=utf-8&' +                  params              )            uploader.option('server', url)            setState('uploading', files)            break          case 'stopUpload':            setState('paused', files)            break        }      })      uploader.on('uploadBeforeSend', function (file, data, header) {        //这里可以通过data对象添加POST参数        header['X_Requested_With'] = 'XMLHttpRequest'        // HaoChuan9421        if (          editor.options.headers &&          Object.prototype.toString.apply(editor.options.headers) ===            '[object Object]'        ) {          for (var key in editor.options.headers) {            header[key] = editor.options.headers[key]          }        }      })      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.data          if (ret.code == 200) {            uploadVideoList.push({              url: responseText.url,              type: responseText.type,              original: responseText.original            })            $file.append('<span class="success"></span>')          } else {            $file.find('.error').text(json.state).show()          }        } catch (e) {          $file.find('.error').text(lang.errorServerUpload).show()        }      })      uploader.on('uploadError', function (file, code) {})      uploader.on('error', function (code, 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()    }  }})()
 |