475 lines
18 KiB
JavaScript
475 lines
18 KiB
JavaScript
/**
|
||
* Created by JetBrains PhpStorm.
|
||
* User: taoqili
|
||
* Date: 12-2-20
|
||
* Time: 上午11:19
|
||
* To change this template use File | Settings | File Templates.
|
||
*/
|
||
|
||
(function () {
|
||
|
||
editor.setOpt({
|
||
videoFieldName: "upfile"
|
||
});
|
||
|
||
var video = {},
|
||
uploadVideoList = [],
|
||
isModifyUploadVideo = false;
|
||
|
||
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 target = e.target || e.srcElement;
|
||
for (var j = 0; j < tabs.length; j++) {
|
||
if (tabs[j] == target) {
|
||
tabs[j].className = "focus";
|
||
$G(tabs[j].getAttribute('data-content-id')).style.display = "block";
|
||
} else {
|
||
tabs[j].className = "";
|
||
$G(tabs[j].getAttribute('data-content-id')).style.display = "none";
|
||
}
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
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 = "";
|
||
};
|
||
}
|
||
|
||
function selectTxt(node) {
|
||
if (node.select) {
|
||
node.select();
|
||
} else {
|
||
var r = node.createTextRange && node.createTextRange();
|
||
r.select();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 依据传入的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(s) {
|
||
return s.replace(/http:\/\/www\.tudou\.com\/programs\/view\/([\w\-]+)\/?/i, "http://www.tudou.com/v/$1")
|
||
.replace(/http:\/\/www\.youtube\.com\/watch\?v=([\w\-]+)/i, "http://www.youtube.com/v/$1")
|
||
.replace(/http:\/\/v\.youku\.com\/v_show\/id_([\w\-=]+)\.html/i, "http://static.youku.com/v1.0.0149/v/swf/loader.swf?VideoIDS=$1w&winType=adshow&isAutoPlay=true")
|
||
.replace(/http:\/\/www\.56\.com\/u\d+\/v_([\w\-]+)\.html/i, "http://player.56.com/v_$1.swf")
|
||
.replace(/http:\/\/www.56.com\/w\d+\/play_album\-aid\-\d+_vid\-([^.]+)\.html/i, "http://player.56.com/v_$1.swf")
|
||
.replace(/http:\/\/v\.ku6\.com\/.+\/([^.]+)\.html/i, "http://player.ku6.com/refer/$1/v.swf")
|
||
.replace(/http:\/\/v\.qq\.com\/boke\/page\/f\/c\/l\/([\w\-=]+)\.html/i, "http://static.video.qq.com/TPout.swf?vid=$1&auto=1");
|
||
}
|
||
|
||
/**
|
||
* 检测传入的所有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 matches = url.match(/youtu.be\/(\w+)$/) || url.match(/youtube\.com\/watch\?v=(\w+)/) || url.match(/youtube.com\/v\/(\w+)/),
|
||
youku = url.match(/youku\.com\/v_show\/id_(\w+)/),
|
||
qqplay = url.match(/v\.qq\.com\/boke\/page\/f\/c\/l\/(\w+)\.html/),
|
||
youkuPlay = /player\.youku\.com/ig.test(url);
|
||
if (!youkuPlay) {
|
||
if (matches) {
|
||
url = "https://www.youtube.com/v/" + matches[1] + "?version=3&feature=player_embedded";
|
||
} else if (youku) {
|
||
url = "http://player.youku.com/player.php/sid/" + youku[1] + "/v.swf"
|
||
} else if (qqplay) {
|
||
url = "http://static.video.qq.com/TPout.swf?vid=" + youku[1] + "&auto=1"
|
||
} else if (!endWith(url, [".swf", ".flv", ".wmv"])) {
|
||
$G("preview").innerHTML = lang.urlError;
|
||
return;
|
||
}
|
||
} else {
|
||
url = url.replace(/\?f=.*/, "");
|
||
}
|
||
$G("preview").innerHTML = '<embed type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"' +
|
||
' src="' + url + '"' +
|
||
' width="' + 420 + '"' +
|
||
' height="' + 280 + '"' +
|
||
' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" ></embed>';
|
||
}
|
||
|
||
/**
|
||
* 末尾字符检测
|
||
* @param str
|
||
* @param endStrArr
|
||
*/
|
||
function endWith(str, endStrArr) {
|
||
for (var i = 0, len = endStrArr.length; i < len; i++) {
|
||
var tmp = endStrArr[i];
|
||
if (str.length - tmp.length < 0) return false;
|
||
|
||
if (str.substring(str.length - tmp.length) == tmp) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* ajax获取视频信息
|
||
*/
|
||
function getMovie() {
|
||
var keywordInput = $G("videoSearchTxt");
|
||
if (!keywordInput.getAttribute("hasClick") || !keywordInput.value) {
|
||
selectTxt(keywordInput);
|
||
return;
|
||
}
|
||
$G("searchList").innerHTML = lang.loading;
|
||
var keyword = keywordInput.value,
|
||
type = $G("videoType").value,
|
||
str = "";
|
||
ajax.request(editor.options.getMovieUrl, {
|
||
searchKey: keyword,
|
||
videoType: type,
|
||
onsuccess: function (xhr) {
|
||
try {
|
||
var info = eval("(" + xhr.responseText + ")");
|
||
} catch (e) {
|
||
return;
|
||
}
|
||
|
||
var videos = info.multiPageResult.results;
|
||
var html = ["<table width='530'>"];
|
||
for (var i = 0, ci; ci = videos[i++]; ) {
|
||
html.push(
|
||
"<tr>" +
|
||
"<td><img title='" + lang.clickToSelect + "' ue_video_url='" + ci.outerPlayerUrl + "' alt='" + ci.tags + "' width='106' height='80' src='" + ci.picUrl + "' /> </td>" +
|
||
"<td>" +
|
||
"<p><a target='_blank' title='" + lang.goToSource + "' href='" + ci.itemUrl + "'>" + ci.title.substr(0, 30) + "</a></p>" +
|
||
"<p style='height: 62px;line-height: 20px' title='" + ci.description + "'> " + ci.description.substr(0, 95) + " </p>" +
|
||
"</td>" +
|
||
"</tr>"
|
||
);
|
||
}
|
||
html.push("</table>");
|
||
$G("searchList").innerHTML = str = html.length == 2 ? lang.noVideo : html.join("");
|
||
var imgs = domUtils.getElementsByTagName($G("searchList"), "img");
|
||
if (!imgs) return;
|
||
for (var i = 0, img; img = imgs[i++]; ) {
|
||
domUtils.on(img, "click", function () {
|
||
changeSelected(this);
|
||
})
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 改变对象o的选中状态
|
||
* @param o
|
||
*/
|
||
function changeSelected(o) {
|
||
if (o.getAttribute("selected")) {
|
||
o.removeAttribute("selected");
|
||
o.style.cssText = "filter:alpha(Opacity=100);-moz-opacity:1;opacity: 1;border: 2px solid #fff";
|
||
} else {
|
||
o.setAttribute("selected", "true");
|
||
o.style.cssText = "filter:alpha(Opacity=50);-moz-opacity:0.5;opacity: 0.5;border:2px solid blue;";
|
||
}
|
||
}
|
||
|
||
|
||
/* 插入上传视频 */
|
||
function insertUpload() {
|
||
var videoObjs = [],
|
||
uploadDir = editor.options.videoPath,
|
||
width = $G('upload_width').value || 420,
|
||
height = $G('upload_height').value || 280,
|
||
align = findFocus("upload_alignment", "name") || 'none';
|
||
for (var key in uploadVideoList) {
|
||
var file = uploadVideoList[key];
|
||
videoObjs.push({
|
||
url: uploadDir + "swf/player.swf?vcastr_title=&vcastr_file=" + uploadDir + file.url,
|
||
width: width,
|
||
height: height,
|
||
align: align
|
||
});
|
||
}
|
||
editor.execCommand('insertvideo', videoObjs);
|
||
}
|
||
|
||
/*初始化上传标签*/
|
||
function initUpload() {
|
||
var settings = {
|
||
upload_url: editor.options.videoUrl, //附件上传服务器地址
|
||
file_post_name: editor.options.videoFieldName, //向后台提交的表单名
|
||
flash_url: "../../third-party/swfupload/swfupload.swf",
|
||
flash9_url: "../../third-party/swfupload/swfupload_fp9.swf",
|
||
post_params: { "PHPSESSID": "<?php echo session_id(); ?>", "fileNameFormat": editor.options.fileNameFormat }, //解决session丢失问题
|
||
file_size_limit: "100 MB", //文件大小限制,此处仅是前端flash选择时候的限制,具体还需要和后端结合判断
|
||
file_types: "*.*", //允许的扩展名,多个扩展名之间用分号隔开,支持*通配符
|
||
file_types_description: "Video Files", //扩展名描述
|
||
file_upload_limit: 100, //单次可同时上传的文件数目
|
||
file_queue_limit: 10, //队列中可同时上传的文件数目
|
||
custom_settings: { //自定义设置,用户可在此向服务器传递自定义变量
|
||
progressTarget: "fsUploadProgress",
|
||
startUploadId: "startUpload"
|
||
},
|
||
debug: false,
|
||
|
||
// 按钮设置
|
||
button_image_url: "../../themes/default/images/filescan.png",
|
||
button_width: "100",
|
||
button_height: "25",
|
||
button_placeholder_id: "spanButtonPlaceHolder",
|
||
button_text: '<span class="theFont">' + lang.browseFiles + '</span>',
|
||
button_text_style: ".theFont { font-size:14px;}",
|
||
button_text_left_padding: 10,
|
||
button_text_top_padding: 4,
|
||
// 所有回调函数
|
||
swfupload_preload_handler: preLoad,
|
||
swfupload_load_failed_handler: loadFailed,
|
||
file_queued_handler: fileQueued,
|
||
file_queue_error_handler: fileQueueError,
|
||
//选择文件完成回调
|
||
file_dialog_complete_handler: function (numFilesSelected, numFilesQueued) {
|
||
var me = this; //此处的this是swfupload对象
|
||
if (numFilesQueued > 0) {
|
||
dialog.buttons[0].setDisabled(true);
|
||
var start = $G(this.customSettings.startUploadId);
|
||
start.style.display = "";
|
||
start.onclick = function () {
|
||
me.startUpload();
|
||
start.style.display = "none";
|
||
}
|
||
}
|
||
},
|
||
upload_start_handler: uploadStart,
|
||
upload_progress_handler: uploadProgress,
|
||
upload_error_handler: uploadError,
|
||
upload_success_handler: function (file, serverData) {
|
||
try {
|
||
var info = eval("(" + serverData + ")");
|
||
} catch (e) { }
|
||
var progress = new FileProgress(file, this.customSettings.progressTarget);
|
||
if (info.state == "SUCCESS") {
|
||
progress.setComplete();
|
||
progress.setStatus("<span style='color: #0b0;font-weight: bold'>" + lang.uploadSuccess + "</span>");
|
||
uploadVideoList.push({ url: info.url, type: info.fileType, original: info.original });
|
||
progress.toggleCancel(true, this, lang.delSuccessFile);
|
||
} else {
|
||
progress.setError();
|
||
progress.setStatus(info.state);
|
||
progress.toggleCancel(true, this, lang.delFailSaveFile);
|
||
}
|
||
},
|
||
//上传完成回调
|
||
upload_complete_handler: uploadComplete,
|
||
//队列完成回调
|
||
queue_complete_handler: function (numFilesUploaded) {
|
||
dialog.buttons[0].setDisabled(false);
|
||
// var status = $G("divStatus");
|
||
// var num = status.innerHTML.match(/\d+/g);
|
||
// status.innerHTML = ((num && num[0] ?parseInt(num[0]):0) + numFilesUploaded) +lang.statusPrompt;
|
||
}
|
||
};
|
||
var swfupload = new SWFUpload(settings);
|
||
};
|
||
|
||
})(); |