kdayun-compnent-develop/kdayun-compnent-pack/dist/libs/ckplayer/ckplayer.js

9012 lines
257 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
软件名称ckplayer
软件版本X2
软件作者niandeng
软件网站http://www.ckplayer.com
--------------------------------------------------------------------------------------------------------------------
开发说明:
使用的主要程序语言javascript(js)及actionscript3.0(as3.0)(as3.0主要用于flashplayer部分的开发不在该页面呈现)
功能:播放视频
特点兼容HTML5-VIDEO(优先)以及FlashPlayer
--------------------------------------------------------------------------------------------------------------------
使用开源代码部分:
1flashls-http://flashls.org/
=====================================================================================================================
*/
!(function () {
var ckplayerPath = '';
!function () {
var scriptList = document.scripts,
thisPath = scriptList[scriptList.length - 1].src;
for (var i = 0; i < scriptList.length; i++) {
var scriptName = scriptList[i].getAttribute('name') || scriptList[i].getAttribute('data-name');
if (scriptName && scriptName == 'ckplayer') {
thisPath = scriptList[i].src;
}
}
ckplayerPath = thisPath.substring(0, thisPath.lastIndexOf('/') + 1);
}();
var ckplayer = function (obj) {
/*
javascript部分开发所用的注释说明
1初始化-程序调用时即运行的代码部分
2定义样式-定义容器div,p,canvas等的样式表即css
3监听动作-监听元素节点(单击-click鼠标进入-mouseover鼠标离开-mouseout鼠标移动-mousemove等事件
4监听事件-监听视频的状态(播放,暂停,全屏,音量调节等)事件
5共用函数-这类函数在外部也可以使用
6全局变量-定义成全局使用的变量
7其它相关注释
全局变量说明:
在本软件中所使用到的全局变量变量类型包括BooleanStringIntObject包含元素对象和变量对象ArrayFunction等
下面列出重要的全局变量:
V:Object视频对象
VA:Array视频列表包括视频地址类型清晰度说明
ID:String视频ID
CB:Object控制栏各元素的集合对象
PD:Object内部视频容器对象
---------------------------------------------------------------------------------------------
程序开始
下面为需要初始化配置的全局变量
*/
//全局变量:播放器默认配置,在外部传递过来相应配置后,则进行相关替换
this.varsDefault = {
playerID: '',//播放器ID
container: '',//视频容器的ID
variable: 'ckplayer',//播放函数(变量)名称
volume: 0.8,//默认音量范围0-1
poster: '',//封面图片地址
autoplay: false,//是否自动播放
loop: false,//是否需要循环播放
live: false,//是否是直播
duration: 0,//指定总时间
forceduration: 0,//强制使用该时间为总时间
seek: 0,//默认需要跳转的秒数
drag: '',//拖动时支持的前置参数
front: '',//前一集按钮动作
next: '',//下一集按钮动作
loaded: '',//加载播放器后调用的函数
flashplayer: false,//设置成true则强制使用flashplayer
html5m3u8: false,//PC平台上是否使用h5播放器播放m3u8
track: null,//字幕轨道
cktrack: null,//ck字幕
cktrackdelay: 0,//字幕显示延迟时间
preview: null,//预览图片对象
prompt: null,//提示点功能
video: null,//视频地址
config: '',//调用配置函数名称
type: '',//视频格式
crossorigin: '',//设置html5视频的crossOrigin属性
crossdomain: '',//安全策略文件地址
unescape: false,//默认flashplayer里需要解码
mobileCkControls: false,//移动端h5显示控制栏
mobileAutoFull: true,//移动端是否默认全屏播放
playbackrate: 1,//默认倍速
h5container: '',//h5环境中使用自定义容器
debug: false,//是否开启调试模式
overspread: true,//是否让视频铺满播放器
language: '',//语言文件路径
style: '',//风格文件路径
//以下为广告相关配置
adfront: '',
adfronttime: '',
adfrontlink: '',
adpause: '',
adpausetime: '',
adpauselink: '',
adinsert: '',
adinserttime: '',
adinsertlink: '',
inserttime: '',
adend: '',
adendtime: '',
adendlink: '',
advertisements: ''
};
//全局变量:vars
this.vars = {};
//全局变量:配置文件函数
this.ckConfig = {};
this.jsonConfig = {};//该变量为一次性赋值,不再变化
//全局变量:语言配置
this.ckLanguage = {};
this.jsonLanguage = {};//该变量为一次性赋值,不再变化
//全局变量:语言配置
this.ckStyle = {};
this.jsonStyle = {};//该变量为一次性赋值,不再变化
//全局变量:右键菜单:[菜单标题,类型(link:链接default:灰色function调用函数javascript:调用js函数),执行内容(包含链接地址,函数名称),[line(间隔线)]]
this.contextMenu = [['ckplayer', 'link', 'http://www.ckplayer.com', '_blank'], ['version:X2', 'default', 'line']];
//全局变量:错误提示列表
this.errorList = [
['000', 'Object does not exist'],
['001', 'Variables type is not a object'],
['002', 'Video object does not exist'],
['003', 'Video object format error'],
['004', 'Video object format error'],
['005', 'Video object format error'],
['006', '[error] does not exist'],
['007', 'Ajax error'],
['008', 'Ajax error'],
['009', 'Ajax object format error'],
['010', 'Ajax.status:[error]'],
['011', '[error] File loading failed or error'],
['012', '[error]']
];
//全局变量HTML5变速播放的值数组/如果不需要可以设置成null
this.playbackRateArr = [[0.5, '0.5X'], [1, '1X'], [1.25, '1.25X'], [1.5, '1.5X'], [2, '2X'], [4, '4X']];
//全局变量:保存倍速
this.playbackRateTemp = 1;
//全局变量HTML5默认变速播放的值
this.playbackRateDefault = 1;
//全局变量HTML5当前显示的字幕编号
this.subtitlesTemp = -1;
//全局变量定义logo
this.logo = '';
//全局变量:是否加载了播放器
this.loaded = false;
//全局变量:计时器,监听视频加载出错的状态
this.timerError = null;
//全局变量:是否出错
this.error = false;
//全局变量:出错地址的数组
this.errorUrl = [];
//全局变量:计时器,监听全屏与非全屏状态
this.timerFull = null;
//全局变量:是否全屏状态
this.full = false;
//全局变量:计时器,监听当前的月/日 时=分=秒
this.timerTime = null;
//全局变量:计时器,监听视频加载
this.timerBuffer = null;
//全局变量:设置进度按钮及进度条是否跟着时间变化,该属性主要用来在按下进度按钮时暂停进度按钮移动和进度条的长度变化
this.isTimeButtonMove = true;
//全局变量:进度栏是否有效,如果是直播,则不需要监听时间让进度按钮和进度条变化
this.isTimeButtonDown = false;
//全局变量:计时,用来计算鼠标离开清晰度或字幕或倍速按钮后的计算时间标准
this.timeButtonOver = null;
//全局变量:鼠标离开清晰度或字幕或倍速是否需要隐藏
this.buttonHide = false;
//全局变量:用来模拟双击功能的判断
this.isClick = false;
//全局变量:计时器,用来模拟双击功能的计时器
this.timerClick = null;
//全局变量:计时器,监听鼠标在视频上移动显示控制栏
this.timerCBar = null;
//全局变量播放视频时如果该变量的值大于0则进行跳转后设置该值为0
this.needSeek = 0;
//全局变量:当前音量
this.volume = 0;
//全局变量:静音时保存临时音量
this.volumeTemp = 0;
//全局变量/变量类型Number/功能:当前播放时间
this.time = 0;
//全局变量:定义首次调用
this.isFirst = true;
//全局变量是否使用HTML5-VIDEO播放
this.html5Video = true;
//全局变量记录视频容器节点的x;y
this.pdCoor = {
x: 0,
y: 0
};
//全局变量判断当前使用的播放器类型html5video或flashplayer
this.playerType = '';
//全局变量:加载进度条的长度
this.loadTime = 0;
//全局变量body对象
this.body = document.body || document.documentElement;
//全局变量:播放器
this.V = null;
//全局变量保存外部js监听事件数组
this.listenerJsArr = [];
//全局变量:保存控制栏显示元素的总宽度
this.buttonLen = 0;
//全局变量:保存控制栏显示元素的数组
this.buttonArr = [];
//全局变量:保存播放器上新增元件的数组
this.elementArr = [];
//全局变量:保存播放器上弹幕的临时数组
this.elementTempArr = [];
//全局变量:字幕内容
this.track = [];
//全局变量:字幕索引
this.trackIndex = 0;
//全局变量:当前显示的字幕内容
this.nowTrackShow = {
sn: ''
};
//全局变量:保存字幕元件数组
this.trackElement = [];
//全局变量:将视频转换为图片
this.timerVCanvas = null;
//全局变量animate缓动对象数组
this.animateArray = [];
//全局变量保存animate的元件
this.animateElementArray = [];
//全局变量:保存需要在暂停时停止缓动的数组
this.animatePauseArray = [];
//全局变量:预览图片加载状态/0=没有加载1=正在加载2=加载完成
this.previewStart = 0;
//全局变量:预览图片容器
this.previewDiv = null;
//全局变量:预览框
this.previewTop = null;
//全局变量:预览框的宽
this.previewWidth = 120;
//全局变量:预览图片容器缓动函数
this.previewTween = null;
//全局变量是否是m3u8格式是的话则可以加载hls.js
this.isM3u8 = false;
//全局变量:保存提示点数组
this.promptArr = [];
//全局变量:显示提示点文件的容器
this.promptElement = null;
//全局变量:控制栏是否显示
this.conBarShow = true;
//全局变量是否监听过h5的错误
this.errorAdd = false;
//全局变量:是否发送了错误
this.errorSend = false;
//全局变量:控制栏是否隐藏
this.controlBarIsShow = true;
//全局变量,保存当前缩放比例
this.videoScale = 1;
//全局变量:设置字体
this.fontFamily = '"Microsoft YaHei"; YaHei; "\5FAE\8F6F\96C5\9ED1"; SimHei; "\9ED1\4F53";Arial';
//全局变量:记录第一次拖动进度按钮时的位置
this.timeSliderLeftTemp = 0;
//全局变量:判断是否记录了总时间
this.durationSendJS = false;
//全局变量:初始化广告分析是否结束设置
this.adAnalysisEnd = false;
//全局变量:广告变量
this.advertisements = {};
//全局变量:是否是第一次播放视频
this.isFirstTimePlay = true;
//全局变量:当前需要播放的广告类型
this.adType = '';
//全局变量:播放广告计数
this.adI = 0;
//全局变量:要播放的临时地址
this.videoTemp = {
src: '',
source: '',
currentSrc: '',
loop: false
};
//全局变量:当前要播放的广告组总时间
this.adTimeAllTotal = 0;
//全局变量:肖前要播放的广告时间
this.adTimeTotal = 0;
//全局变量:用来做倒计时
this.adCountDownObj = null;
//全局变量:前置,中插,结尾广告是否已开始运行
this.adPlayStart = false;
//全局变量:目前是否在播放广告
this.adPlayerPlay = false;
//全局变量:当前广告是否暂停
this.adIsPause = false;
//全局变量:视频广告是否静音
this.adVideoMute = false;
//全局变量:是否需要记录当前播放的时间供广告播放结束后进行跳转
this.adIsVideoTime = false;
//全局变量:后置广告是否播放
this.endAdPlay = false;
//全局变量:暂停广告是否在显示
this.adPauseShow = false;
//全局变量:是否需要重置广告以实现重新播放时再播放一次
this.adReset = false;
//全局变量:记录鼠标在视频上点击时的坐标
this.videoClickXy = { x: 0, y: 0 };
//全局变量:是否在播放广告时播放过视频广告
this.adVideoPlay = false;
//全局变量:临时存储已加载时间的变量
this.loadTimeTemp = 0;
//全局变量临时存储hls形式下首次加载时是否需要暂停或播放的判断
this.hlsAutoPlay = true;
//全局变量loading是否显示
this.loadingShow = false;
//全局变量,保存视频地址字符串的
this.videoString = '';
//全局变量,保存所有自定义元件的数组
this.customeElement = [];
//全局变量保存PD的宽高
this.cdWH = { w: 0, h: 0 };
//全局变量,保存所有的元素变量
this.CB = {};
if (obj) {
this.embed(obj);
}
};
ckplayer.prototype = {
/*
主要函数部分开始
主接口函数:
调用播放器需初始化该函数
*/
embed: function (c) {
//c:Object是调用接口传递的属性对象
if (window.location.href.substr(0, 7) == 'file://') {//如果是使用的file协议打网页则弹出提示
alert('Please use the HTTP protocol to open the page');
return;
}
if (this.isUndefined(c)) {
this.eject(this.errorList[0]);
return;
}
if (this.varType(c) != 'object') {
this.eject(this.errorList[1]);
}
this.vars = this.standardization(this.varsDefault, c);
if (!this.vars['mobileCkControls'] && this.isMobile()) {
this.vars['flashplayer'] = false;
this.conBarShow = false;
}
var videoStringTemp = this.vars['video'];
if (!videoStringTemp) {
this.eject(this.errorList[2]);
return;
}
if (this.varType(videoStringTemp) == 'string') {
if (videoStringTemp.substr(0, 3) == 'CK:' || videoStringTemp.substr(0, 3) == 'CE:' || videoStringTemp.substr(8, 3) == 'CK:' || videoStringTemp.substr(8, 3) == 'CE:') {
this.vars['flashplayer'] = true;
}
}
if (this.varType(videoStringTemp) == 'object') {
if (videoStringTemp.length > 1) {
if (videoStringTemp[0][0].substr(0, 3) == 'CK:' || videoStringTemp[0][0].substr(0, 3) == 'CE:' || videoStringTemp[0][0].substr(8, 3) == 'CK:' || videoStringTemp[0][0].substr(8, 3) == 'CE:') {
this.vars['flashplayer'] = true;
}
}
}
this.videoString = videoStringTemp;
this.checkUpConfig();
},
/*
内部函数
加载config文件
*/
checkUpConfig: function () {
var thisTemp = this;
var configPath = '';
var jsTemp = null;
if (this.vars['config']) {
if (this.vars['config'].substr(0, 8) != 'website:') {
jsTemp = eval(this.vars['config'] + '()');
if (!this.isUndefined(jsTemp)) {
this.ckConfig = this.newObj(jsTemp);
this.jsonConfig = this.newObj(jsTemp);
this.loadConfig(null);
}
else {
this.loadConfig(ckplayerPath + this.vars['config']);
}
}
else {
this.loadConfig(ckplayerPath + this.vars['config'].substr(8));
}
}
else {
try {
var isFun = false;
try {
if (typeof (ckplayerConfig) === 'function') {
isFun = true;
}
}
catch (e) { }
if (isFun) {
jsTemp = ckplayerConfig();
if (jsTemp) {
this.ckConfig = this.newObj(jsTemp);
this.jsonConfig = this.newObj(jsTemp);
this.loadConfig(null);
}
else {
this.loadConfig(ckplayerPath + 'ckplayer.json');
}
}
else {
this.loadConfig(ckplayerPath + 'ckplayer.json');
}
} catch (e) {
thisTemp.sysError(thisTemp.errorList[12], e);//系统错误
}
}
},
loadConfig: function (file) {
var thisTemp = this;
if (file) {
this.ajax({
url: file,
success: function (data) {
if (data) {
thisTemp.ckConfig = data;
thisTemp.jsonConfig = thisTemp.newObj(data);
if (!thisTemp.isUndefined(data['flashvars'])) {
thisTemp.vars = thisTemp.objectAssign(data['flashvars'], thisTemp.vars);
}
thisTemp.checkUpLanguage();
}
else {
thisTemp.sysError(thisTemp.errorList[11], 'Config');//系统错误
}
},
error: function (data) {
thisTemp.sysError(thisTemp.errorList[12], data);//系统错误
}
});
}
else {
this.checkUpLanguage();
}
},
/*
内部函数
加载语言文件
*/
checkUpLanguage: function () {
var thisTemp = this;
var languagePath = '';
var jsTemp = null;
if (this.vars['language']) {
languagePath = this.vars['language'];
}
else {
if (this.ckConfig['languagePath']) {
languagePath = this.ckConfig['languagePath'];
}
}
if (languagePath) {
if (languagePath.substr(0, 8) != 'website:') {
jsTemp = eval(languagePath + '()');
if (jsTemp) {
this.ckLanguage = this.newObj(jsTemp);
this.jsonLanguage = this.newObj(jsTemp);
this.loadLanguage(null);
}
else {
this.loadLanguage(ckplayerPath + languagePath);
}
}
else {
this.loadLanguage(ckplayerPath + languagePath.substr(8));
}
}
else {
try {
var isFun = false;
try {
if (typeof (ckplayerLanguage) === 'function') {
isFun = true;
}
}
catch (e) { }
if (isFun) {
jsTemp = ckplayerLanguage();
if (jsTemp) {
this.ckLanguage = this.newObj(jsTemp);
this.jsonLanguage = this.newObj(jsTemp);
this.loadLanguage(null);
}
else {
this.loadLanguage(ckplayerPath + 'language.json');
}
}
else {
this.loadLanguage(ckplayerPath + 'language.json');
}
} catch (e) {
thisTemp.sysError(thisTemp.errorList[12], e);//系统错误
}
}
},
loadLanguage: function (file) {
var thisTemp = this;
if (file) {
this.ajax({
url: file,
success: function (data) {
if (data) {
thisTemp.ckLanguage = data;
thisTemp.jsonLanguage = thisTemp.newObj(data);
thisTemp.checkUpStyle();
}
else {
thisTemp.sysError(thisTemp.errorList[11], 'language.json');//系统错误
}
},
error: function (data) {
thisTemp.sysError(thisTemp.errorList[12], data);//系统错误
}
});
}
else {
this.checkUpStyle();
}
},
/*
内部函数
加载皮肤文件
*/
checkUpStyle: function () {
var thisTemp = this;
var stylePath = '';
var jsTemp = null;
var configJs = this.newObj(this.ckConfig);
if (this.vars['style']) {
stylePath = this.vars['style'];
}
else {
if (this.ckConfig['stylePath']) {
stylePath = '' + this.ckConfig['stylePath'];
}
}
if (stylePath) {
if (stylePath.substr(0, 8) != 'website:') {
jsTemp = eval(stylePath + '()');
if (!this.isUndefined(jsTemp)) {
this.jsonStyle = this.newObj(jsTemp);
this.ckStyle = this.newObj(jsTemp);
this.ckStyle['advertisement'] = this.objectAssign(configJs['style']['advertisement'], this.ckStyle['advertisement']);
this.ckStyle = this.objectAssign(configJs['style'], this.ckStyle);
this.loadStyle(null);
}
else {
this.loadStyle(ckplayerPath + stylePath);
}
}
else {
this.loadStyle(ckplayerPath + stylePath.substr(8));
}
}
else {
try {
var isFun = false;
try {
if (typeof (ckplayerStyle) === 'function') {
isFun = true;
}
}
catch (e) { isFun = false; }
if (isFun) {
jsTemp = ckplayerStyle();
if (!this.isUndefined(jsTemp)) {
this.jsonStyle = this.newObj(jsTemp);
this.ckStyle = this.newObj(jsTemp);
this.ckStyle['advertisement'] = this.objectAssign(configJs['style']['advertisement'], this.ckStyle['advertisement']);
this.ckStyle = this.objectAssign(configJs['style'], this.ckStyle);
this.loadStyle(null);
}
else {
this.loadStyle(ckplayerPath + 'style.json');
}
}
else {
this.loadStyle(ckplayerPath + 'style.json');
}
} catch (e) { }
}
},
loadStyle: function (file) {
var thisTemp = this;
if (file) {
var configJs = this.newObj(this.ckConfig);
this.ajax({
url: file,
success: function (data) {
if (data) {
thisTemp.jsonStyle = thisTemp.newObj(data);
thisTemp.ckStyle = thisTemp.newObj(data);
thisTemp.ckStyle['advertisement'] = thisTemp.objectAssign(configJs['style']['advertisement'], thisTemp.ckStyle['advertisement']);
thisTemp.ckStyle = thisTemp.objectAssign(configJs['style'], thisTemp.ckStyle);
thisTemp.loadConfigHandler();
}
else {
thisTemp.sysError(thisTemp.errorList[11], 'Style');//系统错误
}
},
error: function (data) {
thisTemp.sysError(thisTemp.errorList[12], data);//系统错误
}
});
}
else {
this.loadConfigHandler();
}
},
/*
内部函数
当config,language,style三个文件或函数处理完成后执行的动作
*/
loadConfigHandler: function () {
if ((!this.supportVideo() && this.vars['flashplayer'] != '') || (this.vars['flashplayer'] && this.uploadFlash()) || !this.isMsie()) {
this.html5Video = false;
this.getVideo();
}
else if (this.videoString) {
//判断视频数据类型
this.analysedVideoUrl(this.videoString);
}
else {
this.eject(this.errorList[2]);
}
},
/*
内部函数
根据外部传递过来的video开始分析视频地址
*/
analysedVideoUrl: function (video) {
var i = 0,
y = 0;
var thisTemp = this;
this.VA = [];//定义全局变量VA视频列表包括视频地址类型清晰度说明
if (this.varType(video) == 'string') { //如果是字符形式的则判断后缀进行填充
if (video.substr(0, 8) != 'website:') {
this.VA = [[video, '', '', 0]];
var fileExt = this.getFileExt(video);
switch (fileExt) {
case '.mp4':
this.VA[0][1] = 'video/mp4';
break;
case '.ogg':
this.VA[0][1] = 'video/ogg';
break;
case '.webm':
this.VA[0][1] = 'video/webm';
break;
default:
break;
}
this.getVideo();
} else {
if (this.html5Video) {
var ajaxObj = {
url: video.substr(8),
success: function (data) {
if (data) {
thisTemp.analysedUrl(data);
} else {
thisTemp.eject(thisTemp.errorList[5]);
this.VA = video;
thisTemp.getVideo();
}
},
error: function (data) {
thisTemp.eject(thisTemp.errorList[12], data);//系统错误
}
};
this.ajax(ajaxObj);
} else {
this.VA = video;
this.getVideo();
}
}
}
else if (this.varType(video) == 'array') {//如果视频地址是数组
if (this.varType(video[0]) == 'array') { //如果视频地址是二维数组
this.VA = video;
}
this.getVideo();
}
else if (this.varType(video) == 'object') {
/*
如果video格式是对象形式则分二种
如果video对象里包含type则直接播放
*/
if (!this.isUndefined(video['type'])) {
this.VA.push([video['file'], video['type'], '', 0]);
this.getVideo();
} else {
this.eject(this.errorList[5]);
}
}
else {
this.eject(this.errorList[4]);
}
},
/*
对请求到的视频地址进行重新分析
*/
analysedUrl: function (data) {
this.vars = this.standardization(this.vars, data);
if (!this.isUndefined(data['video'])) {
this.vars['video'] = data['video'];
}
this.analysedVideoUrl(this.vars['video']);
},
/*
内部函数
检查浏览器支持的视频格式,如果是则将支持的视频格式重新分组给播放列表
*/
getHtml5Video: function () {
var va = this.VA;
var nva = [];
var mobile = this.isMobile();
var video = document.createElement('video');
var codecs = function (type) {
var cod = '';
switch (type) {
case 'video/mp4':
cod = 'avc1.4D401E, mp4a.40.2';
break;
case 'video/ogg':
cod = 'theora, vorbis';
break;
case 'video/webm':
cod = 'vp8.0, vorbis';
break;
default:
break;
}
return cod;
};
var supportType = function (vidType, codType) {
if (!video.canPlayType) {
this.html5Video = false;
return;
}
var isSupp = video.canPlayType(vidType + ';codecs="' + codType + '"');
if (isSupp == '') {
return false
}
return true;
};
if (this.vars['flashplayer'] || !this.isMsie()) {
this.html5Video = false;
return;
}
for (var i = 0; i < va.length; i++) {
var v = va[i];
if (v) {
if (v[1] != '' && !mobile && supportType(v[1], codecs(v[1])) && v[0].substr(0, 4) != 'rtmp') {
nva.push(v);
}
if ((this.getFileExt(v[0]) == '.m3u8' || this.vars['type'] == 'video/m3u8' || this.vars['type'] == 'm3u8' || v[1] == 'video/m3u8' || v[1] == 'm3u8') && this.vars['html5m3u8'] && !mobile) {
this.isM3u8 = true;
nva.push(v);
}
}
}
if (nva.length > 0) {
this.VA = nva;
} else {
if (!mobile) {
this.html5Video = false;
}
}
},
/*
内部函数
根据视频地址开始构建播放器
*/
getVideo: function () {
var thisTemp = this;
var v = this.vars;
//如果存在广告字段则开始分析广告
if (!this.adAnalysisEnd && (v['adfront'] != '' || v['adpause'] != '' || v['adinsert'] != '' || v['adend'] != '' || v['advertisements'] != '')) {
this.adAnalysisEnd = true;
this.adAnalysis();
return;
}
//如果存在字幕则加载
if (this.V) { //如果播放器已存在则认为是从newVideo函数发送过来的请求
this.changeVideo();
return;
}
if (this.vars['cktrack']) {
this.loadTrack();
}
if (this.supportVideo() && !this.vars['flashplayer']) {
this.getHtml5Video(); //判断浏览器支持的视频格式
}
var src = '',
source = '',
poster = '',
loop = '',
autoplay = '',
track = '',
crossorigin = '';
var video = v['video'];
var i = 0;
var vBg = this.ckStyle['background']['backgroundColor'].replace('0x', '#');
this.CD = this.getByElement(v['container']);
volume = v['volume'];
if (this.isUndefined(this.CD)) {
this.eject(this.errorList[6], v['container']);
return false;
}
//开始构建播放器容器
this.V = undefined;
var thisPd = null;
if (v['h5container'] != '') {
thisPd = this.getByElement(v['h5container']);
if (this.isUndefined(thisPd)) {
thisPd = null;
}
}
var isVideoH5 = null; //isUndefined thisPd
if (v['playerID'] != '') {
isVideoH5 = this.getByElement('#' + v['playerID']);
if (this.isUndefined(isVideoH5)) {
isVideoH5 = null;
}
}
if (thisPd != null && isVideoH5 != null) {
this.PD = thisPd; //PD:定义播放器容器对象全局变量
} else {
var playerID = 'ckplayer-' + this.randomString();
var playerDiv = document.createElement('div');
playerDiv.className = playerID;
this.CD.innerHTML = '';
this.CD.appendChild(playerDiv);
this.PD = playerDiv; //PD:定义播放器容器对象全局变量
}
this.css(this.CD, {
backgroundColor: vBg,
overflow: 'hidden',
position: 'relative'
});
this.css(this.PD, {
backgroundColor: vBg,
width: '100%',
height: '100%',
fontFamily: this.fontFamily
});
if (this.html5Video) { //如果支持HTML5-VIDEO则默认使用HTML5-VIDEO播放器
//禁止播放器容器上鼠标选择文本
this.PD.onselectstart = this.PD.ondrag = function () {
return false;
};
//播放器容器构建完成并且设置好样式
//构建播放器
if (this.VA.length == 1) {
this.videoTemp['src'] = decodeURIComponent(this.VA[0][0]);
src = ' src="' + this.videoTemp['src'] + '"';
} else {
var videoArr = this.VA.slice(0);
videoArr = this.arrSort(videoArr);
for (i = 0; i < videoArr.length; i++) {
var type = '';
var va = videoArr[i];
if (va[1]) {
type = ' type="' + va[1] + '"';
if (type == ' type="video/m3u8"' || type == ' type="m3u8"') {
type = '';
}
}
source += '<source src="' + decodeURIComponent(va[0]) + '"' + type + '>';
}
this.videoTemp['source'] = source;
}
//分析视频地址结束
if (v['autoplay']) {
autoplay = ' autoplay="autoplay"';
}
if (v['poster']) {
poster = ' poster="' + v['poster'] + '"';
}
if (v['loop']) {
loop = ' loop="loop"';
}
if (v['seek'] > 0) {
this.needSeek = v['seek'];
}
if (v['track'] != null && v['cktrack'] == null) {
var trackArr = v['track'];
var trackDefault = '';
var defaultHave = false;
for (i = 0; i < trackArr.length; i++) {
var trackObj = trackArr[i];
if (trackObj['default'] && !defaultHave) {
trackDefault = ' default';
defaultHave = true;
} else {
trackDefault = '';
}
track += '<track kind="' + trackObj['kind'] + '" src="' + trackObj['src'] + '" srclang="' + trackObj['srclang'] + '" label="' + trackObj['label'] + '"' + trackDefault + '>';
}
}
if (v['crossorigin']) {
crossorigin = ' crossorigin="' + v['crossorigin'] + '"';
}
var autoLoad = this.ckConfig['config']['autoLoad'];
var preload = '';
if (!autoLoad) {
preload = ' preload="meta"';
}
var vid = this.randomString();
var controls = '';
var mobileAutoFull = v['mobileAutoFull'];
var mobileautofull = '';
if (!mobileAutoFull) {
mobileautofull = ' x-webkit-airplay="true" playsinline webkit-playsinline="true" x5-video-player-type="h5"';
}
if (this.isMobile()) {
controls = ' controls="controls"';
}
if (isVideoH5 != null && thisPd != null) {
this.V = isVideoH5;
if (v['poster']) {
this.V.poster = v['poster'];
}
} else {
var html = '';
if (!this.isM3u8) {
html = '<video id="' + vid + '"' + src + ' width="100%" height="100%"' + autoplay + poster + loop + preload + controls + mobileautofull + track + crossorigin + '>' + source + '</video>';
} else {
html = '<video id="' + vid + '" width="100%" height="100%"' + poster + loop + preload + controls + mobileautofull + track + crossorigin + '></video>';
}
this.PD.innerHTML = html;
this.V = this.getByElement('#' + vid); //V定义播放器对象全局变量
}
try {
this.V.volume = volume; //定义音量
if (this.playbackRateArr && this.vars['playbackrate'] > -1) {
if (this.vars['playbackrate'] < this.playbackRateArr.length) {
this.playbackRateDefault = this.vars['playbackrate'];
}
this.V.playbackRate = this.playbackRateArr[this.playbackRateDefault][0]; //定义倍速
}
} catch (error) { }
this.css(this.V, {
backgroundColor: vBg,
width: '100%',
height: '100%'
});
if (this.isM3u8) {
var loadJsHandler = function () {
thisTemp.embedHls(thisTemp.VA[0][0], v['autoplay']);
};
this.loadJs(ckplayerPath + 'hls/hls.min.js', loadJsHandler);
}
this.css(this.V, 'backgroundColor', vBg);
//创建一个画布容器
if (this.ckConfig['config']['videoDrawImage']) {
var canvasDiv = document.createElement('div');
this.PD.appendChild(canvasDiv);
this.MD = canvasDiv; //定义画布存储容器
this.css(this.MD, {
backgroundColor: vBg,
width: '100%',
height: '100%',
position: 'absolute',
display: 'none',
cursor: 'pointer',
left: '0px',
top: '0px',
zIndex: '10'
});
var cvid = 'ccanvas' + this.randomString();
this.MD.innerHTML = this.newCanvas(cvid, this.MD.offsetWidth, this.MD.offsetHeight);
this.MDC = this.getByElement(cvid + '-canvas');
this.MDCX = this.MDC.getContext('2d');
}
this.playerType = 'html5video';
//播放器构建完成并且设置好样式
//建立播放器的监听函数,包含操作监听及事件监听
this.addVEvent();
if (this.conBarShow) {
//根据清晰度的值构建清晰度切换按钮
this.definition();
if (!this.vars['live'] && this.playbackRateArr && this.vars['playbackrate'] > -1) {
this.playbackRate();
}
if (v['autoplay']) {
this.loadingStart(true);
}
this.subtitleSwitch();
}
this.playerLoad();
} else { //如果不支持HTML5-VIDEO则调用flashplayer
this.embedSWF();
}
},
/*
分析广告数据
*/
adAnalysis: function () {
var thisTemp = this;
var v = this.vars;
var isAdvShow = [];
var i = 0;
if (v['advertisements'] != '' && v['advertisements'].substr(0, 8) == 'website:') {
var ajaxObj = {
url: v['advertisements'].substr(8),
success: function (data) {
if (data) {
var newData = {};
var val = null;
//对广告进行分析
try {
if (!thisTemp.isUndefined(data['front']) || !thisTemp.isUndefined(data['pause']) || !thisTemp.isUndefined(data['end']) || !thisTemp.isUndefined(data['insert']) || !thisTemp.isUndefined(data['other'])) {
val = thisTemp.arrayDel(data['front']);
if (!thisTemp.isUndefined(val)) {
newData['front'] = val;
}
val = thisTemp.arrayDel(data['pause']);
if (!thisTemp.isUndefined(val)) {
newData['pause'] = val;
}
val = thisTemp.arrayDel(data['insert']);
if (!thisTemp.isUndefined(val)) {
newData['insert'] = val;
if (!thisTemp.isUndefined(data['inserttime'])) {
newData['inserttime'] = thisTemp.arrayInt(data['inserttime']);
isAdvShow = [];
for (i = 0; i < newData['inserttime'].length; i++) {
isAdvShow.push(false);
}
newData['insertPlay'] = isAdvShow;
}
}
val = thisTemp.arrayDel(data['end']);
if (!thisTemp.isUndefined(val)) {
newData['end'] = val;
}
val = thisTemp.arrayDel(data['other']);
if (!thisTemp.isUndefined(val)) {
newData['other'] = val;
isAdvShow = [];
var arrTemp = [];
for (i = 0; i < val.length; i++) {
isAdvShow.push(false);
arrTemp.push(parseInt('0' + val[i]['startTime']));
}
newData['othertime'] = arrTemp;
newData['otherPlay'] = isAdvShow;
}
}
} catch (event) {
thisTemp.log(event)
}
thisTemp.advertisements = newData;
//对广告进行分析结束
}
thisTemp.getVideo();
},
error: function (data) { }
};
this.ajax(ajaxObj);
} else {
//根据广告分析
this.adAnalysisOne('front', 'adfront', 'adfronttime', 'adfrontlink', 'adfronttype');
this.adAnalysisOne('pause', 'adpause', 'adpausetime', 'adpauselink', 'adpausetype');
this.adAnalysisOne('insert', 'adinsert', 'adinserttime', 'adinsertlink', 'adinserttype');
this.adAnalysisOne('end', 'adend', 'adendtime', 'adendlink', 'adendtype');
if (!this.isUndefined(this.advertisements['insert'])) {
if (!this.isUndefined(v['inserttime'])) {
thisTemp.advertisements['inserttime'] = v['inserttime'];
}
}
if (!this.isUndefined(thisTemp.advertisements['inserttime'])) {
thisTemp.advertisements['inserttime'] = thisTemp.arrayInt(thisTemp.advertisements['inserttime']);
isInsert = [];
for (i = 0; i < thisTemp.advertisements['inserttime'].length; i++) {
isInsert.push(false);
}
thisTemp.advertisements['insertPlay'] = isInsert;
}
thisTemp.getVideo();
}
},
/*
将广告数组数据里不是视频和图片的去除
*/
arrayDel: function (arr) {
if (this.isUndefined(arr)) {
return arr;
}
if (arr.length == 0) {
return null;
}
var newArr = [];
for (var i = 0; i < arr.length; i++) {
var type = arr[i]['type'];
if (type == 'mp4' || type == 'mov' || this.isStrImage(type)) {
newArr.push(arr[i]);
}
}
if (newArr.length > 0) {
return newArr;
}
return null;
},
/*分析单个类型的广告*/
adAnalysisOne: function (adType, adName, adTime, adLink, adStype) {
var v = this.vars;
if (this.isUndefined(v[adName])) {
v[adName] = '';
}
if (this.isUndefined(v[adTime])) {
v[adTime] = '';
}
if (this.isUndefined(v[adLink])) {
v[adLink] = '';
}
if (this.isUndefined(v[adStype])) {
v[adStype] = '';
}
if (v[adName] != '') {
var adList = [];
var ad = v[adName].split(',');
var adtime = v[adTime].split(',');
var adlink = v[adLink].split(',');
var adstype = v[adStype].split(',');
var i = 0;
if (ad.length > 0) {
var adLinkLen = adlink.length,
adTimeLen = adtime.length;
if (v[adLink] == '') {
adLinkLen = 0;
adlink = [];
}
if (v[adTime] == '') {
adTimeLen = 0;
adtime = [];
}
if (adLinkLen < ad.length) {
for (i = adLinkLen; i < ad.length; i++) {
adlink.push('');
}
}
if (adTimeLen < ad.length) {
for (i = adTimeLen; i < ad.length; i++) {
adtime.push('');
}
}
var adstypeLen = adstype.length;
if (v[adStype] == '') {
adstypeLen = 0;
adstype = [];
}
if (adstypeLen < ad.length) {
for (i = adstypeLen; i < ad.length; i++) {
adstype.push(this.getFileExt(ad[i]).replace('.', ''));
}
}
for (i = 0; i < ad.length; i++) {
var type = adstype[i];
if (type == 'mp4' || type == 'mov' || this.isStrImage(type)) {
var obj = {
file: ad[i],
type: type,
time: parseInt(adtime[i]) > 0 ? parseInt(adtime[i]) : this.ckStyle['advertisement']['time'],
link: adlink[i]
};
adList.push(obj);
}
}
if (this.isUndefined(this.advertisements)) {
this.advertisements = {};
}
if (adList.length > 0) {
this.advertisements[adType] = adList;
}
}
}
},
/*
内部函数
发送播放器加载成功的消息
*/
playerLoad: function () {
var thisTemp = this;
if (this.isFirst) {
this.isFirst = false;
setTimeout(function () {
thisTemp.loadedHandler();
}, 1);
}
},
/*
内部函数
建立播放器的监听函数,包含操作监听及事件监听
*/
addVEvent: function () {
var thisTemp = this;
var duration = 0;
//监听视频单击事件
var eventVideoClick = function (event) {
thisTemp.videoClickXy = { x: event.clientX, y: event.clientY };
thisTemp.videoClick();
};
this.addListenerInside('click', eventVideoClick);
this.addListenerInside('click', eventVideoClick, this.MDC);
//延迟计算加载失败事件
this.timerErrorFun();
//监听视频加载到元数据事件
var eventJudgeIsLive = function (event) {
thisTemp.sendJS('loadedmetadata');
if (thisTemp.varType(thisTemp.V.duration) == 'number' && thisTemp.V.duration > 1) {
duration = thisTemp.V.duration;
if (!duration) {
if (thisTemp.vars['duration'] > 0) {
duration = thisTemp.vars['duration'];
}
}
if (thisTemp.vars['forceduration'] > 0) {
duration = thisTemp.vars['forceduration'];
}
thisTemp.sendJS('duration', duration);
thisTemp.formatInserttime(duration);
if (thisTemp.adPlayerPlay) {
thisTemp.advertisementsTime(duration + 1);
}
thisTemp.durationSendJS = true;
}
if (thisTemp.conBarShow) {
thisTemp.V.controls = null;
thisTemp.videoCss();
}
thisTemp.judgeIsLive();
};
//监听视频播放事件
var eventPlaying = function (event) {
thisTemp.playingHandler();
thisTemp.sendJS('play');
thisTemp.sendJS('paused', false);
if (!thisTemp.durationSendJS && thisTemp.varType(thisTemp.V.duration) == 'number' && thisTemp.V.duration > 0) {
duration = thisTemp.V.duration;
if (!duration) {
if (thisTemp.vars['duration'] > 0) {
duration = thisTemp.vars['duration'];
}
}
if (thisTemp.vars['forceduration'] > 0) {
duration = thisTemp.vars['forceduration'];
}
thisTemp.durationSendJS = true;
thisTemp.sendJS('duration', duration);
thisTemp.formatInserttime(duration);
}
};
this.addListenerInside('playing', eventPlaying);
//监听视频暂停事件
var eventPause = function (event) {
thisTemp.pauseHandler();
thisTemp.sendJS('pause');
thisTemp.sendJS('paused', true);
};
this.addListenerInside('pause', eventPause);
//监听视频播放结束事件
var eventEnded = function (event) {
thisTemp.endedHandler();
};
this.addListenerInside('ended', eventEnded);
//监听视频播放时间事件
var eventTimeupdate = function (event) {
if (thisTemp.loadingShow) {
thisTemp.loadingStart(false);
}
if (thisTemp.time) {
if (!thisTemp.adPlayerPlay) {
thisTemp.sendJS('time', thisTemp.time);
//监听中间插入广告是否需要播放
if (!thisTemp.isUndefined(thisTemp.advertisements['insert'])) {
thisTemp.checkAdInsert(thisTemp.time);
}
//监听其它广告
if (!thisTemp.isUndefined(thisTemp.advertisements['other'])) {
thisTemp.checkAdOther(thisTemp.time);
}
if (thisTemp.time < 3 && thisTemp.adReset) {
thisTemp.adReset = false;
thisTemp.endedAdReset();
}
} else { //如果是广告则进行广告倒计时
thisTemp.adPlayerTimeHandler(thisTemp.time);
}
}
};
this.addListenerInside('timeupdate', eventTimeupdate);
//监听视频缓冲事件
var eventWaiting = function (event) {
thisTemp.loadingStart(true);
};
this.addListenerInside('waiting', eventWaiting);
//监听视频seek开始事件
var eventSeeking = function (event) {
thisTemp.sendJS('seek', 'start');
};
this.addListenerInside('seeking', eventSeeking);
//监听视频seek结束事件
var eventSeeked = function (event) {
thisTemp.seekedHandler();
thisTemp.sendJS('seek', 'ended');
};
this.addListenerInside('seeked', eventSeeked);
//监听视频音量
var eventVolumeChange = function (event) {
try {
thisTemp.volumechangeHandler();
thisTemp.sendJS('volume', thisTemp.volume || thisTemp.V.volume);
} catch (event) { }
};
this.addListenerInside('volumechange', eventVolumeChange);
//监听全屏事件
var eventFullChange = function (event) {
var fullState = document.fullScreen || document.mozFullScreen || document.webkitIsFullScreen;
thisTemp.sendJS('full', fullState);
};
this.addListenerInside('fullscreenchange', eventFullChange);
this.addListenerInside('webkitfullscreenchange', eventFullChange);
this.addListenerInside('mozfullscreenchange', eventFullChange);
//建立界面
if (this.conBarShow) {
this.interFace();
}
this.addListenerInside('loadedmetadata', eventJudgeIsLive);
},
/*
内部函数
重置界面元素
*/
resetPlayer: function () {
this.timeTextHandler();
if (this.conBarShow) {
this.timeProgress(0, 1); //改变时间进度条宽
this.changeLoad(0);
this.initPlayPause(); //判断显示播放或暂停按钮
this.definition(); //构建清晰度按钮
this.deletePrompt(); //删除提示点
this.deletePreview(); //删除预览图
this.trackHide(); //重置字幕
this.resetTrack();
this.trackElement = [];
this.track = [];
}
},
/*
内部函数
构建界面元素
*/
interFace: function () {
this.conBarShow = true;
var thisTemp = this;
var html = ''; //控制栏内容
var i = 0;
var thisStyle = this.ckStyle;
var styleC = thisStyle['controlBar'];
var styleCB = styleC['button'];
var styleAS = thisStyle['advertisement'];
var styleDF = styleC['definition'];
var bWidth = 38;//按钮的宽
//var timeInto = this.formatTime(0) + ' / ' + this.formatTime(this.vars['duration']); //时间显示框默认显示内容
var timeInto = this.formatTime(0, this.vars['duration'], this.ckLanguage['vod']); //时间显示框默认显示内容
/*
构建一些PD播放器容器里使用的元素
*/
/*
构建播放器内的元素
*/
this.CB = { menu: null };
var divEle = {
controlBarBg: null,
controlBar: null,
pauseCenter: null,
errorText: null,
promptBg: null,
prompt: null,
promptTriangle: null,
definitionP: null,
playbackrateP: null,
subtitlesP: null,
loading: null,
logo: null,
adBackground: null,
adElement: null,
adLink: null,
adPauseClose: null,
adTime: null,
adTimeText: null,
adMute: null,
adEscMute: null,
adSkip: null,
adSkipText: null,
adSkipButton: null
};
var k = '';
for (k in divEle) {
this.CB[k] = divEle[k];
this.CB[k] = document.createElement('div');
this.PD.appendChild(this.CB[k]);
}
/*
构建鼠标右键容器
*/
this.CB['menu'] = document.createElement('div');
this.body.appendChild(this.CB['menu']);
if (this.vars['live']) { //如果是直播,时间显示文本框里显示当前系统时间
timeInto = this.formatTime(0, 0, this.ckLanguage['live']); //时间显示框默认显示内容
}
/*
构建控制栏的按钮
*/
divEle = {
play: null,
pause: null,
mute: null,
escMute: null,
full: null,
escFull: null,
definition: null,
playbackrate: null,
subtitles: null
};
for (k in divEle) {
this.CB[k] = divEle[k];
this.CB[k] = document.createElement('div');
if (!this.isUndefined(this.ckLanguage['buttonOver'][k])) {
this.CB[k].dataset.title = this.ckLanguage['buttonOver'][k];
}
this.CB['controlBar'].appendChild(this.CB[k]);
}
divEle = {
timeProgressBg: null,
timeBoBg: null,
volume: null,
timeText: null
};
for (k in divEle) {
this.CB[k] = divEle[k];
this.CB[k] = document.createElement('div');
this.CB['controlBar'].appendChild(this.CB[k]);
}
this.CB['timeText'].innerHTML = timeInto;//初始化时间
divEle = {
loadProgress: null,
timeProgress: null
};
for (k in divEle) {
this.CB[k] = divEle[k];
this.CB[k] = document.createElement('div');
this.CB['timeProgressBg'].appendChild(this.CB[k]);
}
this.CB['timeButton'] = document.createElement('div');
this.CB['timeBoBg'].appendChild(this.CB['timeButton']);
divEle = {
volumeBg: null,
volumeBO: null
};
for (k in divEle) {
this.CB[k] = divEle[k];
this.CB[k] = document.createElement('div');
this.CB['volume'].appendChild(this.CB[k]);
}
this.CB['volumeUp'] = document.createElement('div');
this.CB['volumeBg'].appendChild(this.CB['volumeUp']);
//构建loading图标
var imgTemp = null;
var imgFile = '';
var imgFile = thisStyle['loading']['file'];
if (!this.isUndefined(thisStyle['loading']['fileH5'])) {
imgFile = thisStyle['loading']['fileH5'];
}
if (imgFile) {
imgTemp = document.createElement('img');
imgTemp.src = imgFile;
imgTemp.border = 0;
this.CB['loading'].appendChild(imgTemp);
}
//构建logo图标
imgFile = thisStyle['logo']['file'];
if (!this.isUndefined(thisStyle['logo']['fileH5'])) {
imgFile = thisStyle['logo']['fileH5'];
}
if (imgFile) {
imgTemp = document.createElement('img');
imgTemp.src = imgFile;
imgTemp.border = 0;
this.CB['logo'].appendChild(imgTemp);
}
//定义界面元素的样式
if (this.ckConfig['config']['buttonMode']['player']) {
this.css(this.PD, { cursor: 'pointer' });
}
//控制栏背景
this.controlBar(); //改变控制栏
var cssTemp = null;
//定义提示语的样式
var promptCss = thisStyle['prompt'];
cssTemp = this.getEleCss(promptCss, { overflow: 'hidden', zIndex: 900, display: 'none' });
this.css(this.CB['promptBg'], cssTemp);
this.css(this.CB['promptBg'], 'padding', '0px');
cssTemp['backgroundColor'] = '';
cssTemp['border'] = '';
cssTemp['borderRadius'] = '';
cssTemp['whiteSpace'] = 'nowrap';
this.css(this.CB['prompt'], cssTemp);
//定义提示语下方的三解形的样式
cssTemp = {
width: 0,
height: 0,
borderLeft: promptCss['triangleWidth'] * 0.5 + 'px solid transparent',
borderRight: promptCss['triangleWidth'] * 0.5 + 'px solid transparent',
borderTop: promptCss['triangleHeight'] + 'px solid ' + promptCss['triangleBackgroundColor'].replace('0x', '#'),
overflow: 'hidden',
opacity: promptCss['triangleAlpha'],
filter: 'alpha(opacity:' + promptCss['triangleAlpha'] + ')',
position: 'absolute',
left: '0px',
top: '0px',
zIndex: 900,
display: 'none'
};
this.css(this.CB['promptTriangle'], cssTemp);
this.elementCoordinate();//中间播放按钮出错文本框logoloading
this.css([this.CB['pauseCenter'], this.CB['loading'], this.CB['errorText']], 'display', 'none');
this.carbarButton();//控制栏按钮
this.playerCustom();//播放器界面自定义元件
this.carbarCustom();//控制栏自定义元件
this.timeProgressDefault();//进度条默认样式
this.videoCss();//计算video的宽高和位置
//初始化判断播放/暂停按钮隐藏项
this.initPlayPause();
if (this.vars['volume'] > 0) {
this.css(this.CB['escMute'], 'display', 'none');
} else {
this.css(this.CB['mute'], 'display', 'none');
}
if (!this.ckConfig['config']['mobileVolumeBarShow'] && this.isMobile()) {
this.css([this.CB['mute'], this.CB['escMute'], this.CB['volume']], {
display: 'none'
});
}
this.css(this.CB['escFull'], 'display', 'none');
//设置广告背景层样式
var cssObj = {
align: 'top',
vAlign: 'left',
width: '100%',
height: '100%',
offsetX: 0,
offsetY: 0,
zIndex: 910,
display: 'none'
};
cssTemp = this.getEleCss(styleAS['background'], cssObj);
this.css(this.CB['adBackground'], cssTemp);
this.css(this.CB['adElement'], {
position: 'absolute',
overflow: 'hidden',
top: '0px',
zIndex: 911,
float: 'center',
display: 'none'
});
//广告控制各元素样式,用一个函数单独定义,这样在播放器尺寸变化时可以重新设置样式
this.advertisementStyle();
//初始化广告控制各元素-隐藏
this.css([this.CB['adTime'], this.CB['adTimeText'], this.CB['adMute'], this.CB['adEscMute'], this.CB['adSkip'], this.CB['adSkipText'], this.CB['adSkipButton'], this.CB['adLink'], this.CB['adPauseClose']], 'display', 'none');
//定义鼠标经过控制栏只显示完整的进度条,鼠标离开进度条则显示简单的进度条
var timeProgressOut = function (event) {
thisTemp.timeProgressMouseOut();
};
this.addListenerInside('mouseout', timeProgressOut, this.CB['timeBoBg']);
var timeProgressOver = function (event) {
thisTemp.timeProgressDefault();
};
this.addListenerInside('mouseover', timeProgressOver, this.CB['controlBar']);
//定义各按钮鼠标经过时的切换样式
this.buttonEventFun(this.CB['play'], styleCB['play']);//播放按钮
this.buttonEventFun(this.CB['pause'], styleCB['pause']);//暂停按钮
this.buttonEventFun(this.CB['mute'], styleCB['mute']);//静音按钮
this.buttonEventFun(this.CB['escMute'], styleCB['escMute']);//恢复音量按钮
this.buttonEventFun(this.CB['full'], styleCB['full']);//全屏按钮
this.buttonEventFun(this.CB['escFull'], styleCB['escFull']);//退出全屏按钮
this.buttonEventFun(this.CB['adMute'], styleAS['muteButton']);//广告静音按钮
this.buttonEventFun(this.CB['adEscMute'], styleAS['escMuteButton']);//恢复广告音量按钮
this.buttonEventFun(this.CB['adSkipButton'], styleAS['skipAdButton']);//跳过广告按钮
this.buttonEventFun(this.CB['adLink'], styleAS['adLinkButton']);//广告查看详情按钮
this.buttonEventFun(this.CB['adPauseClose'], styleAS['closeButton']);//播放暂停时的广告的关闭按钮
this.buttonEventFun(this.CB['pauseCenter'], thisStyle['centerPlay']);//播放器中间暂停时的播放按钮
this.buttonEventFun(this.CB['volumeBO'], styleC['volumeSchedule']['button']);//音量调节框按钮样式
this.buttonEventFun(this.CB['timeButton'], styleC['timeSchedule']['button']);//时间进度调节框按钮样式
this.addButtonEvent(); //注册按钮及音量调节,进度操作事件
this.controlBarHide(); //单独注册控制栏隐藏事件
this.newMenu(); //设置右键的样式和事件
this.keypress(); //注册键盘事件
//初始化音量调节框
this.changeVolume(this.vars['volume']);
setTimeout(function () {
thisTemp.elementCoordinate(); //调整中间暂停按钮/loading的位置/error的位置
},
100);
this.checkBarWidth();
var resize = function () {
thisTemp.log('window.resize');
thisTemp.playerResize();
};
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
var observer = new MutationObserver(function () {
thisTemp.log('video.resize');
var cdW = parseInt(thisTemp.css(thisTemp.CD, 'width')), cdH = parseInt(thisTemp.css(thisTemp.CD, 'height'));
if (cdW != thisTemp.cdWH['w'] || cdH != thisTemp.cdWH['h']) {
thisTemp.cdWH = {
w: cdW,
h: cdH
};
thisTemp.changeSize(cdW, cdH);
}
});
observer.observe(this.CD, { attributes: true, attributeFilter: ['style'], attributeOldValue: true });
this.addListenerInside('resize', resize, window);
},
/*
内部函数
进间进度条默认样式
*/
timeProgressDefault: function () {
var styleCT = this.ckStyle['controlBar']['timeSchedule'];
var cssObj = this.newObj(styleCT['default']);
var loadBackImg = cssObj['loadProgressImg'], playBackImg = cssObj['playProgressImg'];
var cssTemp = null;
this.css(this.CB['timeBoBg'], 'display', 'block');
//时间进度条背景容器
cssTemp = this.getEleCss(this.newObj(cssObj), { overflow: 'hidden', zIndex: 2 }, this.CB['controlBarBg']);
this.css(this.CB['timeProgressBg'], cssTemp);
//加载进度
cssObj = {
align: 'left',
vAlign: 'top',
width: 1,
height: cssObj['height'],
backgroundImg: loadBackImg
};
//加载进度和时间进度
if (this.CB['loadProgress'].offsetWidth > 1) {
cssObj['width'] = this.CB['loadProgress'].offsetWidth;
}
cssTemp = this.getEleCss(this.newObj(cssObj), { overflow: 'hidden', zIndex: 1 }, this.CB['timeProgressBg']);
this.css(this.CB['loadProgress'], cssTemp);
cssObj['width'] = 0;
if (this.CB['timeProgress'].offsetWidth > 1 && parseInt(this.css(this.CB['timeButton'], 'left')) > 0) {
cssObj['width'] = this.CB['timeProgress'].offsetWidth;
}
cssObj['backgroundImg'] = playBackImg;
cssTemp = this.getEleCss(cssObj, { overflow: 'hidden', zIndex: 2 });
this.css(this.CB['timeProgress'], cssTemp);
//时间进度按钮容器
cssTemp = this.getEleCss(styleCT['buttonContainer'], { position: 'absolute', overflow: 'hidden', zIndex: 3 }, this.CB['controlBar']);
if (this.ckConfig['config']['buttonMode']['timeSchedule']) {
cssTemp['cursor'] = 'pointer';
}
this.css(this.CB['timeBoBg'], cssTemp);
//时间进度按钮
cssTemp = this.getEleCss(styleCT['button'], { cursor: 'pointer', overflow: 'hidden', zIndex: 4 }, this.CB['timeBoBg']);
this.css(this.CB['timeButton'], cssTemp);
},
/*
内部函数
进间进度条鼠标离开样式
*/
timeProgressMouseOut: function () {
var styleCT = this.ckStyle['controlBar']['timeSchedule'];
var cssObj = this.newObj(styleCT['mouseOut']);
var loadBackImg = cssObj['loadProgressImg'], playBackImg = cssObj['playProgressImg'];
var cssTemp = null;
this.css(this.CB['timeBoBg'], 'display', 'block');
//时间进度条背景容器
cssTemp = this.getEleCss(this.newObj(cssObj), { overflow: 'hidden', zIndex: 2 }, this.CB['controlBarBg']);
this.css(this.CB['timeProgressBg'], cssTemp);
//加载进度
cssObj = {
align: 'left',
vAlign: 'top',
width: 1,
height: cssObj['height'],
backgroundImg: loadBackImg
};
//加载进度和时间进度
if (this.CB['loadProgress'].offsetWidth > 1) {
cssObj['width'] = this.CB['loadProgress'].offsetWidth;
}
cssTemp = this.getEleCss(this.newObj(cssObj), { overflow: 'hidden', zIndex: 1 }, this.CB['timeProgressBg']);
this.css(this.CB['loadProgress'], cssTemp);
cssObj['width'] = 1;
if (this.CB['timeProgress'].offsetWidth > 1 && parseInt(this.css(this.CB['timeButton'], 'left')) > 0) {
cssObj['width'] = this.CB['timeProgress'].offsetWidth;
cssObj['backgroundImg'] = playBackImg;
}
cssTemp = this.getEleCss(cssObj, { overflow: 'hidden', zIndex: 2 });
this.css(this.CB['timeProgress'], cssTemp);
this.css(this.CB['timeBoBg'], 'display', 'none');
},
/*
统一注册按钮鼠标经过和离开时的切换动作
*/
buttonEventFun: function (ele, cssEle) {
var thisTemp = this;
var overFun = function (event) {
thisTemp.css(ele, {
backgroundImage: 'url(' + cssEle['mouseOver'] + ')'
});
thisTemp.promptShow(ele);
};
var outFun = function (event) {
thisTemp.css(ele, {
backgroundImage: 'url(' + cssEle['mouseOut'] + ')'
});
thisTemp.promptShow(false);
};
outFun();
this.addListenerInside('mouseover', overFun, ele);
this.addListenerInside('mouseout', outFun, ele);
if (!this.isUndefined(cssEle['clickEvent'])) {
var clickFun = function (event) {
thisTemp.runFunction(cssEle['clickEvent']);
};
this.addListenerInside('click', clickFun, ele);
}
},
/*
内部函数
格式化样式用的数字
*/
formatNumPx: function (str, z) {
if (!str) {
return 0;
}
if (str.toString().indexOf('%') > -1) {//说明是根据百分比来计算
if (!this.isUndefined(z)) {//如果有值
return parseInt(str) * z * 0.01 + 'px';
}
return str;
}
else {
return str + 'px';
}
},
/*
内部函数
格式化样式用的数字,返回类型必需是数字或百分比
*/
formatZToNum: function (str, z) {
if (!str) {
return 0;
}
if (str.toString().indexOf('%') > -1) {//说明是根据百分比来计算
if (!this.isUndefined(z)) {//如果有值
return parseInt(str) * z * 0.01;
}
return str;
}
else {
return str;
}
},
/*
内部函数
对对象进行深度复制
*/
newObj: function (obj) {
if (this.isUndefined(obj)) {
return obj;
}
var str, newobj = {};//constructor 属性返回对创建此对象的数组函数的引用。创建相同类型的空数据
if (this.varType(obj) != 'object') {
return obj;
}
else {
for (var k in obj) {
if (this.isUndefined(obj[k])) {
newobj[k] = obj[k];
}
else {
if (this.varType(obj[k]) == 'object') { //判断对象的这条属性是否为对象
newobj[k] = this.newObj(obj[k]);//若是对象进行嵌套调用
}
else {
newobj[k] = obj[k];
}
}
}
}
return newobj;//返回深度克隆后的对象
},
/*
内部函数
统一的显示图片
*/
loadImgBg: function (eleid, obj) {
this.css(this.getByElement(eleid), {
backgroundImage: 'url(' + obj + ')'
});
},
/*
内部函数
格式化css
eleObj=样式,
supplement=补充样式,
rrEle=参考对象,
该函数强制使用position定位的元素
*/
getEleCss: function (eleObj, supplement, rrEle) {
var eleName = null;
var pdW = this.PD.offsetWidth, pdH = this.PD.offsetHeight;
if (rrEle) {
pdW = rrEle.offsetWidth;
pdH = rrEle.offsetHeight;
}
if (this.isUndefined(eleObj)) {
return null;
}
eleName = this.newObj(eleObj);
var cssObject = {};
if (!this.isUndefined(eleName['width'])) {
cssObject['width'] = this.formatZToNum(eleName['width'], pdW) + 'px';
}
if (!this.isUndefined(eleName['height'])) {
cssObject['height'] = this.formatZToNum(eleName['height'], pdH) + 'px';
}
if (!this.isUndefined(eleName['background'])) {
var bg = eleName['background'];
if (!this.isUndefined(bg['backgroundColor'])) {
cssObject['backgroundColor'] = bg['backgroundColor'].replace('0x', '#');
}
if (!this.isUndefined(bg['backgroundImg'])) {
cssObject['backgroundImage'] = 'url(' + bg['backgroundImg'] + ')';
}
if (!this.isUndefined(bg['alpha'])) {
cssObject['filter'] = 'alpha(opacity:' + bg['alpha'] + ')';
cssObject['opacity'] = bg['alpha'];
}
}
if (!this.isUndefined(eleName['backgroundColor'])) {
cssObject['backgroundColor'] = eleName['backgroundColor'].replace('0x', '#');
}
if (!this.isUndefined(eleName['backgroundImg'])) {
cssObject['backgroundImage'] = 'url(' + eleName['backgroundImg'] + ')';
}
if (!this.isUndefined(eleName['color'])) {
cssObject['color'] = eleName['color'].replace('0x', '#');
}
if (!this.isUndefined(eleName['font'])) {
cssObject['fontFamily'] = eleName['font'];
}
if (!this.isUndefined(eleName['size'])) {
cssObject['fontSize'] = eleName['size'] + 'px';
}
if (!this.isUndefined(eleName['alpha'])) {
cssObject['filter'] = 'alpha(opacity:' + eleName['alpha'] + ')';
cssObject['opacity'] = eleName['alpha'];
}
if (!this.isUndefined(eleName['lineHeight'])) {
cssObject['lineHeight'] = eleName['lineHeight'] + 'px';
}
if (!this.isUndefined(eleName['textAlign'])) {
cssObject['textAlign'] = eleName['textAlign'];
}
if (!this.isUndefined(eleName['borderRadius'])) {
cssObject['borderRadius'] = eleName['borderRadius'] + 'px';
}
if (!this.isUndefined(eleName['radius'])) {
cssObject['borderRadius'] = eleName['radius'] + 'px';
}
if (!this.isUndefined(eleName['padding'])) {
cssObject['padding'] = eleName['padding'] + 'px';
}
if (!this.isUndefined(eleName['paddingLeft'])) {
cssObject['paddingLeft'] = eleName['paddingLeft'] + 'px';
}
if (!this.isUndefined(eleName['paddingRight'])) {
cssObject['paddingRight'] = eleName['paddingRight'] + 'px';
}
if (!this.isUndefined(eleName['paddingTop'])) {
cssObject['paddingTop'] = eleName['paddingTop'] + 'px';
}
if (!this.isUndefined(eleName['paddingBottom'])) {
cssObject['paddingBottom'] = eleName['paddingBottom'] + 'px';
}
if (!this.isUndefined(eleName['margin'])) {
cssObject['margin'] = eleName['margin'] + 'px';
}
if (!this.isUndefined(eleName['marginLeft'])) {
cssObject['marginLeft'] = eleName['marginLeft'] + 'px';
}
if (!this.isUndefined(eleName['marginRight'])) {
cssObject['marginRight'] = eleName['marginRight'] + 'px';
}
if (!this.isUndefined(eleName['marginTop'])) {
cssObject['marginTop'] = eleName['marginTop'] + 'px';
}
if (!this.isUndefined(eleName['marginBottom'])) {
cssObject['marginBottom'] = eleName['marginBottom'] + 'px';
}
if (!this.isUndefined(eleName['border']) && !this.isUndefined(eleName['borderColor'])) {
cssObject['border'] = eleName['border'] + 'px solid ' + eleName['borderColor'].replace('0x', '#');
}
if (!this.isUndefined(eleName['borderLeft']) && !this.isUndefined(eleName['borderLeftColor'])) {
cssObject['borderLeft'] = eleName['borderLeft'] + 'px solid ' + eleName['borderLeftColor'].replace('0x', '#');
}
if (!this.isUndefined(eleName['borderRight']) && !this.isUndefined(eleName['borderRightColor'])) {
cssObject['borderRight'] = eleName['borderRight'] + 'px solid ' + eleName['borderRightColor'].replace('0x', '#');
}
if (!this.isUndefined(eleName['borderTop']) && !this.isUndefined(eleName['borderTopColor'])) {
cssObject['borderTop'] = eleName['borderTop'] + 'px solid ' + eleName['borderTopColor'].replace('0x', '#');
}
if (!this.isUndefined(eleName['borderBottom']) && !this.isUndefined(eleName['borderBottomColor'])) {
cssObject['borderBottom'] = eleName['borderBottom'] + 'px solid ' + eleName['borderBottomColor'].replace('0x', '#');
}
if (!this.isUndefined(supplement)) {
for (var k in supplement) {
cssObject[k] = supplement[k];
}
}
cssObject['position'] = 'absolute';
var left = -10000, top = -10000, right = -10000, bottom = -10000;
var offsetX = 0, offsetY = 0;
if (!this.isUndefined(eleName['offsetX'])) {
offsetX = eleName['offsetX'];
}
if (!this.isUndefined(eleName['marginX'])) {
offsetX = eleName['marginX'];
}
if (!this.isUndefined(eleName['offsetY'])) {
offsetY = eleName['offsetY'];
}
if (!this.isUndefined(eleName['marginY'])) {
offsetY = eleName['marginY'];
}
offsetX = this.formatZToNum(offsetX, pdW);
offsetY = this.formatZToNum(offsetY, pdH);
if (!this.isUndefined(eleName['align'])) {
left = 0;
switch (eleName['align']) {
case 'left':
left = offsetX;
break;
case 'center':
left = pdW * 0.5 + offsetX;
break;
case 'right':
left = pdW + offsetX;
break;
case 'right2':
left = -10000;
right = offsetX;
break;
}
}
if (!this.isUndefined(eleName['vAlign'])) {
top = 0;
switch (eleName['vAlign']) {
case 'top':
top = offsetY;
break;
case 'middle':
top = pdH * 0.5 + offsetY;
break;
case 'bottom':
top = pdH + offsetY;
break;
case 'bottom2':
top = -10000;
bottom = offsetY;
break;
}
}
if (left > -10000) {
cssObject['left'] = left + 'px';
}
if (right > -10000) {
cssObject['right'] = right + 'px';
}
if (top > -10000) {
cssObject['top'] = top + 'px';
}
if (bottom > -10000) {
cssObject['bottom'] = bottom + 'px';
}
return cssObject;
},
/*
内部函数
创建按钮使用canvas画布
*/
newCanvas: function (id, width, height) {
return '<canvas class="' + id + '-canvas" width="' + width + '" height="' + height + '"></canvas>';
},
/*
内部函数
注册按钮,音量调节框,进度操作框事件
*/
addButtonEvent: function () {
var thisTemp = this;
//定义按钮的单击事件
//定义各个按钮的鼠标经过/离开事件
var promptHide = function (event) {
thisTemp.promptShow(false);
};
var definitionOver = function (event) {
thisTemp.promptShow(thisTemp.CB['definition']);
};
this.addListenerInside('mouseover', definitionOver, this.CB['definition']);
this.addListenerInside('mouseout', promptHide, this.CB['definition']);
var playbackrateOver = function (event) {
thisTemp.promptShow(thisTemp.CB['playbackrate']);
};
this.addListenerInside('mouseover', playbackrateOver, this.CB['playbackrate']);
this.addListenerInside('mouseout', promptHide, this.CB['playbackrate']);
var subtitlesOver = function (event) {
thisTemp.promptShow(thisTemp.CB['subtitles']);
};
this.addListenerInside('mouseover', subtitlesOver, this.CB['subtitles']);
this.addListenerInside('mouseout', promptHide, this.CB['subtitles']);
//定义音量和进度按钮的滑块事件
var volumePrompt = function (vol) {
var volumeBOXY = thisTemp.getCoor(thisTemp.CB['volumeBO']);
var promptObj = {
title: thisTemp.ckLanguage['volumeSliderOver'].replace('[$volume]', vol),
x: volumeBOXY['x'] + thisTemp.CB['volumeBO'].offsetWidth * 0.5,
y: volumeBOXY['y']
};
thisTemp.promptShow(false, promptObj);
};
var volumeObj = {
slider: this.CB['volumeBO'],
follow: this.CB['volumeUp'],
refer: this.CB['volumeBg'],
grossValue: 'volume',
pd: true,
startFun: function (vol) { },
monitorFun: function (vol) {
thisTemp.changeVolume(vol * 0.01, false, false);
volumePrompt(vol);
},
endFun: function (vol) { },
overFun: function (vol) {
volumePrompt(vol);
}
};
this.slider(volumeObj);
var volumeClickObj = {
refer: this.CB['volumeBg'],
grossValue: 'volume',
fun: function (vol) {
thisTemp.changeVolume(vol * 0.01, true, true);
}
};
this.progressClick(volumeClickObj);
this.timeButtonMouseDown(); //用单击的函数来判断是否需要建立控制栏监听
//鼠标经过/离开音量调节框时的
var volumeBgMove = function (event) {
var volumeBgXY = thisTemp.getCoor(thisTemp.CB['volumeBg']);
var eventX = thisTemp.client(event)['x'];
var eventVolume = parseInt((eventX - volumeBgXY['x']) * 100 / thisTemp.CB['volumeBg'].offsetWidth);
var buttonPromptObj = {
title: thisTemp.ckLanguage['volumeSliderOver'].replace('[$volume]', eventVolume),
x: eventX,
y: volumeBgXY['y']
};
thisTemp.promptShow(false, buttonPromptObj);
};
this.addListenerInside('mousemove', volumeBgMove, this.CB['volumeBg']);
this.addListenerInside('mouseout', promptHide, this.CB['volumeBg']);
this.addListenerInside('mouseout', promptHide, this.CB['volumeBO']);
//注册清晰度相关事件
this.addDefListener();
//注册倍速相关事件
this.addPlaybackrate();
//注册多字幕事件
this.addSubtitles();
},
/*
内部函数
注册单击视频动作
*/
videoClick: function () {
var thisTemp = this;
var clearTimerClick = function () {
if (thisTemp.timerClick != null) {
if (thisTemp.timerClick.runing) {
thisTemp.timerClick.stop();
}
thisTemp.timerClick = null;
}
};
var timerClickFun = function () {
clearTimerClick();
thisTemp.isClick = false;
thisTemp.sendJS('videoClick', thisTemp.videoClickXy);
if (thisTemp.adPlayerPlay) {
var ad = thisTemp.getNowAdvertisements();
try {
if (ad['link'] != '') {
window.open(ad['link']);
}
thisTemp.ajaxSuccessNull(ad['clickMonitor']);
} catch (event) { }
} else {
if (thisTemp.ckConfig['config']['click']) {
thisTemp.playOrPause();
}
}
};
clearTimerClick();
if (this.isClick) {
this.isClick = false;
thisTemp.sendJS('videoDoubleClick', thisTemp.videoClickXy);
if (thisTemp.ckConfig['config']['doubleClick']) {
if (!this.full) {
thisTemp.fullScreen();
} else {
thisTemp.quitFullScreen();
}
}
} else {
this.isClick = true;
this.timerClick = new this.timer(300, timerClickFun, 1)
//this.timerClick.start();
}
},
/*
内部函数
注册鼠标经过进度滑块的事件
*/
timeButtonMouseDown: function () {
var thisTemp = this;
var timePrompt = function (time) {
if (isNaN(time)) {
time = 0;
}
var timeButtonXY = thisTemp.getCoor(thisTemp.CB['timeButton']);
var promptObj = {
title: thisTemp.formatTime(time, 0, thisTemp.ckLanguage['timeSliderOver']),
x: timeButtonXY['x'] - thisTemp.pdCoor['x'] + thisTemp.CB['timeButton'].offsetWidth * 0.5,
y: timeButtonXY['y'] - thisTemp.pdCoor['y']
};
thisTemp.promptShow(false, promptObj);
};
var timeObj = {
slider: this.CB['timeButton'],
follow: this.CB['timeProgress'],
refer: this.CB['timeBoBg'],
grossValue: 'time',
pd: false,
startFun: function (time) {
thisTemp.isTimeButtonMove = false;
},
monitorFun: function (time) { },
endFun: function (time) {
if (thisTemp.V) {
if (thisTemp.V.duration > 0) {
thisTemp.needSeek = 0;
thisTemp.videoSeek(parseInt(time));
}
}
},
overFun: function (time) {
timePrompt(time);
}
};
var timeClickObj = {
refer: this.CB['timeBoBg'],
grossValue: 'time',
fun: function (time) {
if (thisTemp.V) {
if (thisTemp.V.duration > 0) {
thisTemp.needSeek = 0;
thisTemp.videoSeek(parseInt(time));
}
}
}
};
var timeBoBgmousemove = function (event) {
var timeBoBgXY = thisTemp.getCoor(thisTemp.CB['timeBoBg']);
var eventX = thisTemp.client(event)['x'];
var duration = thisTemp.V.duration;
if (isNaN(duration) || parseInt(duration) < 0.2) {
duration = thisTemp.vars['duration'];
}
if (thisTemp.vars['forceduration'] > 0) {
duration = thisTemp.vars['forceduration'];
}
var eventTime = parseInt((eventX - timeBoBgXY['x']) * duration / thisTemp.CB['timeBoBg'].offsetWidth);
var buttonPromptObj = {
title: thisTemp.formatTime(eventTime, 0, thisTemp.ckLanguage['timeSliderOver']),
x: eventX,
y: timeBoBgXY['y']
};
thisTemp.promptShow(false, buttonPromptObj);
var def = false;
if (!thisTemp.isUndefined(thisTemp.CB['definitionP'])) {
if (thisTemp.css(thisTemp.CB['definitionP'], 'display') != 'block') {
def = true;
}
}
if (thisTemp.vars['preview'] != null && def) {
buttonPromptObj['time'] = eventTime;
thisTemp.preview(buttonPromptObj);
}
};
var promptHide = function (event) {
thisTemp.promptShow(false);
if (thisTemp.previewDiv != null) {
thisTemp.css([thisTemp.previewDiv, thisTemp.previewTop], 'display', 'none');
}
};
if (!this.vars['live']) { //如果不是直播
this.isTimeButtonDown = true;
this.addListenerInside('mousemove', timeBoBgmousemove, this.CB['timeBoBg']);
this.addListenerInside('mouseout', promptHide, this.CB['timeBoBg']);
} else {
this.isTimeButtonDown = false;
timeObj['removeListenerInside'] = true;
timeClickObj['removeListenerInside'] = true;
}
this.slider(timeObj);
this.progressClick(timeClickObj);
},
/*
内部函数
注册调节框上单击事件,包含音量调节框和播放时度调节框
*/
progressClick: function (obj) {
/*
refer:参考对象
fun:返回函数
refer:参考元素,即背景
grossValue:调用的参考值类型
pd:
*/
//建立参考元素的mouseClick事件用来做为鼠标在其上按下时触发的状态
var thisTemp = this;
var referMouseClick = function (event) {
var referX = thisTemp.client(event)['x'] - thisTemp.getCoor(obj['refer'])['x'];
var rWidth = obj['refer'].offsetWidth;
var grossValue = 0;
if (obj['grossValue'] == 'volume') {
grossValue = 100;
} else {
if (thisTemp.V) {
grossValue = thisTemp.V.duration;
if (isNaN(grossValue) || parseInt(grossValue) < 0.2) {
grossValue = thisTemp.vars['duration'];
}
if (thisTemp.vars['forceduration'] > 0) {
grossValue = thisTemp.vars['forceduration'];
}
}
}
var nowZ = parseInt(referX * grossValue / rWidth);
if (obj['fun']) {
if (obj['grossValue'] === 'time') {
var sliderXY = thisTemp.getCoor(thisTemp.CB['timeButton']);
sliderLeft = sliderXY['x'];
if (!thisTemp.checkSlideLeft(referX, sliderLeft, rWidth)) {
return;
}
var bimeButtonWB = thisTemp.CB['timeButton'].offsetWidth * 0.5;
thisTemp.css(thisTemp.CB['timeButton'], 'left', (referX - bimeButtonWB) + 'px');
thisTemp.css(thisTemp.CB['timeProgress'], 'width', (referX) + 'px');
}
obj['fun'](nowZ);
}
};
if (this.isUndefined(obj['removeListenerInside'])) {
this.addListenerInside('click', referMouseClick, obj['refer']);
} else {
this.removeListenerInside('click', referMouseClick, obj['refer']);
}
},
/*
内部函数
共用的注册滑块事件
*/
slider: function (obj) {
/*
obj={
slider:滑块元素
follow:跟随滑块的元素
refer:参考元素,即背景
grossValue:调用的参考值类型
startFun:开始调用的元素
monitorFun:监听函数
endFun:结束调用的函数
overFun:鼠标放上去后调用的函数
pd:是否需要修正
}
*/
var thisTemp = this;
var clientX = 0,
criterionWidth = 0,
sliderLeft = 0,
referLeft = 0;
var value = 0;
var calculation = function () { //根据滑块的left计算百分比
var sLeft = parseInt(thisTemp.css(obj['slider'], 'left'));
var rWidth = obj['refer'].offsetWidth - obj['slider'].offsetWidth;
var grossValue = 0;
if (thisTemp.isUndefined(sLeft) || isNaN(sLeft)) {
sLeft = 0;
}
if (obj['grossValue'] == 'volume') {
grossValue = 100;
} else {
if (thisTemp.V) {
grossValue = thisTemp.V.duration;
}
}
return parseInt(sLeft * grossValue / rWidth);
};
var mDown = function (event) {
thisTemp.addListenerInside('mousemove', mMove, document);
thisTemp.addListenerInside('mouseup', mUp, document);
var referXY = thisTemp.getCoor(obj['refer']);
var sliderXY = thisTemp.getCoor(obj['slider']);
clientX = thisTemp.client(event)['x'];
referLeft = referXY['x'];
sliderLeft = sliderXY['x'];
criterionWidth = clientX - sliderLeft;
if (obj['startFun']) {
obj['startFun'](calculation());
}
};
var mMove = function (event) {
clientX = thisTemp.client(event)['x'];
var newX = clientX - criterionWidth - referLeft;
if (newX < 0) {
newX = 0;
}
if (newX > obj['refer'].offsetWidth - obj['slider'].offsetWidth) {
newX = obj['refer'].offsetWidth - obj['slider'].offsetWidth;
}
if (obj['slider'] === thisTemp.CB['timeButton']) {
if (!thisTemp.checkSlideLeft(newX, sliderLeft, obj['refer'].offsetWidth)) {
return;
}
}
thisTemp.css(obj['slider'], 'left', newX + 'px');
thisTemp.css(obj['follow'], 'width', (newX + obj['slider'].offsetWidth * 0.5) + 'px');
var nowZ = calculation();
if (obj['monitorFun']) {
obj['monitorFun'](nowZ);
}
};
var mUp = function (event) {
thisTemp.removeListenerInside('mousemove', mMove, document);
thisTemp.removeListenerInside('mouseup', mUp, document);
if (obj['endFun']) {
obj['endFun'](calculation());
}
};
var mOver = function (event) {
if (obj['overFun']) {
obj['overFun'](calculation());
}
};
if (this.isUndefined(obj['removeListenerInside'])) {
this.addListenerInside('mousedown', mDown, obj['slider']);
this.addListenerInside('mouseover', mOver, obj['slider']);
} else {
this.removeListenerInside('mousedown', mDown, obj['slider']);
this.removeListenerInside('mouseover', mOver, obj['slider']);
}
},
/*
内部函数
判断是否可以拖动进度按钮或点击进度栏
*/
checkSlideLeft: function (newX, sliderLeft, refer) {
var timeSA = this.ckConfig['config']['timeScheduleAdjust'];
switch (timeSA) {
case 0:
return false;
break;
case 2:
if (newX < sliderLeft) {
return false;
}
break;
case 3:
if (newX > sliderLeft) {
return false;
}
break;
case 4:
if (!this.timeSliderLeftTemp) {
this.timeSliderLeftTemp = sliderLeft / refer;
}
if (newX < this.timeSliderLeftTemp * refer) {
return false;
}
break;
case 5:
if (!this.timeSliderLeftTemp) {
this.timeSliderLeftTemp = sliderLeft / refer;
} else {
var timeSliderMax = sliderLeft / refer;
if (timeSliderMax > this.timeSliderLeftTemp) {
this.timeSliderLeftTemp = timeSliderMax;
}
}
if (newX > this.timeSliderLeftTemp * refer) {
return false;
}
break;
default:
return true;
break;
}
return true;
},
/*
内部函数
显示loading
*/
loadingStart: function (rot) {
var thisTemp = this;
if (this.isUndefined(rot)) {
rot = true;
}
if (this.conBarShow) {
this.css(thisTemp.CB['loading'], 'display', 'none');
this.loadingShow = false;
}
var buffer = 0;
if (rot) {
if (this.conBarShow) {
this.css(thisTemp.CB['loading'], 'display', 'block');
this.loadingShow = true;
}
} else {
thisTemp.sendJS('buffer', 100);
}
},
/*
内部函数
显示提示语
*/
promptShow: function (ele, data) {
if (!this.conBarShow) {
return;
}
var obj = {};
var eleTitle = '';
if (!this.isUndefined(ele)) {
eleTitle = this.getDataset(ele, 'title');
if (this.isUndefined(eleTitle)) {
ele = null;
}
}
if (ele || data) {
if (!this.isUndefined(data)) {
obj = data;
} else {
var offsetCoor = this.getCoor(ele);
obj = {
title: eleTitle,
x: offsetCoor['x'] + ele.offsetWidth * 0.5,
y: offsetCoor['y']
};
}
this.CB['prompt'].innerHTML = obj['title'];
this.css(this.CB['prompt'], 'display', 'block');
var promptStye = this.ckStyle['prompt'];
var promoptWidth = this.CB['prompt'].offsetWidth, promoptHeight = this.CB['prompt'].offsetHeight;
this.css(this.CB['promptBg'], { width: promoptWidth + 'px', height: promoptHeight + 'px' });
var x = obj['x'] - (promoptWidth * 0.5);
var y = obj['y'] - this.CB['prompt'].offsetHeight - promptStye['marginBottom'] - promptStye['triangleHeight'];
if (x < 0) {
x = 0;
}
if (x > this.PD.offsetWidth - promoptWidth) {
x = this.PD.offsetWidth - promoptWidth;
}
this.css([this.CB['promptBg'], this.CB['prompt']], {
display: 'block',
left: x + 'px',
top: y + 'px'
});
this.css(this.CB['promptTriangle'], {
display: 'block',
left: x + (promoptWidth - promptStye['triangleWidth']) * 0.5 + parseInt(promptStye['triangleDeviationX']) + 'px',
top: y + promoptHeight + 'px'
});
} else {
this.css([this.CB['promptBg'], this.CB['prompt'], this.CB['promptTriangle']], {
display: 'none'
});
}
},
/*
内部函数
监听错误
*/
timerErrorFun: function () {
var thisTemp = this;
this.errorSend = false;
var clearIntervalError = function (event) {
if (thisTemp.timerError != null) {
if (thisTemp.timerError.runing) {
thisTemp.timerError.stop();
}
thisTemp.timerError = null;
}
};
var errorFun = function (event) {
clearIntervalError();
thisTemp.error = true;
//提取错误播放地址
thisTemp.errorUrl = thisTemp.getVideoUrl();
//提取错误播放地址结束
if (!thisTemp.errorSend) {
thisTemp.errorSend = true;
thisTemp.sendJS('error');
}
if (thisTemp.conBarShow) {
thisTemp.CB['errorText'].innerHTML = thisTemp.ckLanguage['error']['streamNotFound'];
thisTemp.css(thisTemp.CB['errorText'], 'display', 'block');
thisTemp.css([thisTemp.CB['pauseCenter'], thisTemp.CB['loading']], 'display', 'none');
}
thisTemp.V.removeAttribute('poster');
thisTemp.resetPlayer();
};
var errorListenerFun = function (event) {
setTimeout(function () {
if (isNaN(thisTemp.V.duration)) {
errorFun(event);
}
},
500);
};
if (!this.errorAdd) {
this.errorAdd = true;
this.addListenerInside('error', errorListenerFun);
}
clearIntervalError();
var timerErrorFun = function () {
if (thisTemp.V && parseInt(thisTemp.V.networkState) == 3) {
errorFun();
}
};
this.timerError = new this.timer(this.ckConfig['config']['errorTime'], timerErrorFun);
},
/*
内部函数
构建判断全屏还是非全屏的判断
*/
judgeFullScreen: function () {
var thisTemp = this;
if (this.timerFull != null) {
if (this.timerFull.runing) {
this.timerFull.stop();
}
this.timerFull = null;
}
var fullFun = function () {
thisTemp.isFullScreen();
};
this.timerFull = new this.timer(20, fullFun);
},
/*
内部函数
判断是否是全屏
*/
isFullScreen: function () {
if (!this.conBarShow) {
return;
}
var fullState = document.fullScreen || document.mozFullScreen || document.webkitIsFullScreen || document.msFullscreenElement;
if (fullState && !this.full) {
this.full = true;
this.sendJS('full', true);
this.elementCoordinate();
this.carbarButton();
this.customCoor();//控制栏自定义元件
this.css(this.CB['full'], 'display', 'none');
this.css(this.CB['escFull'], 'display', 'block');
if (this.vars['live'] == 0) {
this.timeUpdateHandler();
}
this.PD.appendChild(this.CB['menu']);
}
if (!fullState && this.full) {
this.full = false;
this.sendJS('full', false);
this.elementCoordinate();
this.carbarButton();
this.customCoor();//控制栏自定义元件
this.css(this.CB['full'], 'display', 'block');
this.css(this.CB['escFull'], 'display', 'none');
if (this.timerFull != null) {
if (this.timerFull.runing) {
this.timerFull.stop();
}
this.timerFull = null;
}
if (this.vars['live'] == 0) {
this.timeUpdateHandler();
}
this.body.appendChild(this.CB['menu']);
}
},
/*
内部函数
构建右键内容及注册相关动作事件
*/
newMenu: function () {
var thisTemp = this;
var i = 0;
this.css(this.CB['menu'], {
backgroundColor: '#FFFFFF',
padding: '5px',
position: 'absolute',
left: '10px',
top: '20px',
display: 'none',
zIndex: '999',
color: '#A1A9BE',
boxShadow: '2px 2px 3px #AAAAAA'
});
var mArr = this.contextMenu;
var cMenu = this.ckConfig['menu'];
if (cMenu['name']) {
if (cMenu['link']) {
mArr[0] = [cMenu['name'], 'link', cMenu['link']];
} else {
mArr[0] = [cMenu['name'], 'default'];
}
}
if (cMenu['version']) {
mArr[1] = [cMenu['version'], 'default', 'line'];
}
if (cMenu['more']) {
if (this.varType(cMenu['more']) == 'array') {
if (cMenu['more'].length > 0) {
var moreArr = cMenu['more'];
for (i = 0; i < moreArr.length; i++) {
var mTemp = moreArr[i];
var arrTemp = [];
if (mTemp['name']) {
arrTemp.push(mTemp['name']);
}
if (mTemp['clickEvent'] && mTemp['clickEvent'] != 'none') {
var eveObj = this.clickEvent(mTemp['clickEvent']);
arrTemp.push(eveObj['type']);
if (eveObj['fun']) {
arrTemp.push(eveObj['fun']);
}
if (eveObj['link']) {
arrTemp.push(eveObj['link']);
}
if (eveObj['target']) {
arrTemp.push(' target="' + eveObj['target'] + '"');
}
}
if (mTemp['separatorBefore']) {
arrTemp.push('line');
}
mArr.push(arrTemp);
}
}
}
}
var html = '';
for (i = 0; i < mArr.length; i++) {
var me = mArr[i];
switch (me[1]) {
case 'default':
html += '<p>' + me[0] + '</p>';
break;
case 'link':
if (me[3]) {
me[3] = 'target="' + me[3] + '"';
}
html += '<p><a href="' + me[2] + '"' + me[3] + '>' + me[0] + '</a></p>';
break;
case 'javaScript':
html += '<p><a href="javascript:' + me[2] + '">' + me[0] + '</a></p>';
break;
case 'actionScript':
html += '<p><a href="javascript:' + this.vars['variable'] + me[2].replace('thisTemp', '') + '">' + me[0] + '</a></p>';
break;
default:
break;
}
}
this.CB['menu'].innerHTML = html;
var pArr = this.CB['menu'].childNodes;
for (i = 0; i < pArr.length; i++) {
this.css(pArr[i], {
height: '30px',
lineHeight: '30px',
margin: '0px',
fontFamily: this.fontFamily,
fontSize: '12px',
paddingLeft: '10px',
paddingRight: '30px'
});
if (mArr[i][mArr[i].length - 1] == 'line') {
this.css(pArr[i], 'borderBottom', '1px solid #e9e9e9');
}
var aArr = pArr[i].childNodes;
for (var n = 0; n < aArr.length; n++) {
if (aArr[n].localName == 'a') {
this.css(aArr[n], {
color: '#000000',
textDecoration: 'none'
});
}
}
}
this.PD.oncontextmenu = function (event) {
var eve = event || window.event;
var client = thisTemp.client(event);
if (eve.button == 2) {
eve.returnvalue = false;
var x = client['x'] + thisTemp.pdCoor['x'] - 2;
var y = client['y'] + thisTemp.pdCoor['y'] - 2;
thisTemp.css(thisTemp.CB['menu'], {
display: 'none',
left: x + 'px',
top: y + 'px'
});
return false;
}
return true;
};
var setTimeOutPClose = function () {
if (setTimeOutP) {
window.clearTimeout(setTimeOutP);
setTimeOutP = null;
}
};
var setTimeOutP = null;
var mouseOut = function (event) {
setTimeOutPClose();
setTimeOutP = setTimeout(function (event) {
thisTemp.css(thisTemp.CB['menu'], 'display', 'none');
},
500);
};
this.addListenerInside('mouseout', mouseOut, thisTemp.CB['menu']);
var mouseOver = function (event) {
setTimeOutPClose();
};
this.addListenerInside('mouseover', mouseOver, thisTemp.CB['menu']);
},
/*
内部函数
构建控制栏隐藏事件
*/
controlBarHide: function (hide) {
var thisTemp = this;
var client = {
x: 0,
y: 0
},
oldClient = {
x: 0,
y: 0
};
var cShow = true,
force = false;
var oldCoor = [0, 0];
var controlBarShow = function (show) {
if (show && !cShow && thisTemp.controlBarIsShow) {
cShow = true;
thisTemp.sendJS('controlBar', true);
thisTemp.css(thisTemp.CB['controlBarBg'], 'display', 'block');
thisTemp.css(thisTemp.CB['controlBar'], 'display', 'block');
thisTemp.timeProgressDefault();
//thisTemp.css(thisTemp.CB['timeProgressBg'], 'display', 'block');
//thisTemp.css(thisTemp.CB['timeBoBg'], 'display', 'block');
thisTemp.changeVolume(thisTemp.volume);
thisTemp.changeLoad();
if (!thisTemp.timerBuffer) {
thisTemp.bufferEdHandler();
}
} else {
if (cShow) {
cShow = false;
var paused = thisTemp.getMetaDate()['paused'];
if (force) {
paused = false;
}
if (!paused) {
thisTemp.sendJS('controlBar', false);
thisTemp.css(thisTemp.CB['controlBarBg'], 'display', 'none');
thisTemp.css(thisTemp.CB['controlBar'], 'display', 'none');
thisTemp.promptShow(false);
}
}
}
thisTemp.videoCss();//计算video的宽高和位置
};
var cbarFun = function (event) {
if (client['x'] == oldClient['x'] && client['y'] == oldClient['y']) {
var cdH = parseInt(thisTemp.CD.offsetHeight);
if ((client['y'] < cdH - 50 || client['y'] > cdH - 2) && cShow && !thisTemp.getMetaDate()['paused']) {
controlBarShow(false);
}
} else {
if (!cShow) {
controlBarShow(true);
}
}
oldClient = {
x: client['x'],
y: client['y']
}
};
this.timerCBar = new this.timer(2000, cbarFun);
var cdMove = function (event) {
var getClient = thisTemp.client(event);
client['x'] = getClient['x'];
client['y'] = getClient['y'];
if (!cShow) {
controlBarShow(true);
}
thisTemp.sendJS('mouse', client);
};
this.addListenerInside('mousemove', cdMove, thisTemp.CD);
this.addListenerInside('ended', cdMove);
this.addListenerInside('resize', cdMove, window);
if (hide === true) {
cShow = true;
force = true;
controlBarShow(false);
}
if (hide === false) {
cShow = false;
force = true;
controlBarShow(true);
}
},
/*
内部函数
注册键盘按键事件
*/
keypress: function () {
var thisTemp = this;
var keyDown = function (eve) {
var keycode = eve.keyCode || eve.which;
if (thisTemp.adPlayerPlay) {
return;
}
switch (keycode) {
case 32:
thisTemp.playOrPause();
break;
case 37:
thisTemp.fastBack();
break;
case 39:
thisTemp.fastNext();
break;
case 38:
now = thisTemp.volume + thisTemp.ckConfig['config']['volumeJump'];
thisTemp.changeVolume(now > 1 ? 1 : now);
break;
case 40:
now = thisTemp.volume - thisTemp.ckConfig['config']['volumeJump'];
thisTemp.changeVolume(now < 0 ? 0 : now);
break;
default:
break;
}
};
this.addListenerInside('keydown', keyDown, window || document);
},
/*
内部函数
注册倍速相关
*/
playbackRate: function () {
if (!this.conBarShow || !this.ckConfig['config']['playbackRate']) {
return;
}
var styleCD = this.ckStyle['controlBar']['playbackrate'];
var cssSup = { overflow: 'hidden', display: 'none', zIndex: 995 };
var cssSup2 = { overflow: 'hidden', align: 'top', vAlign: 'left', offsetX: 0, offsetY: 0, zIndex: 1 };
var thisTemp = this;
var dArr = this.playbackRateArr;
var html = '';
var nowD = ''; //当前的倍速
var i = 0, nowI = 0;
nowD = dArr[this.playbackRateDefault][1];
nowI = this.playbackRateDefault;
this.removeChildAll(this.CB['playbackrateP']);
if (dArr.length > 1) {
//设置样式
this.CB['playbackratePB'] = document.createElement('div'), this.CB['playbackratePC'] = document.createElement('div');
this.CB['playbackrateP'].appendChild(this.CB['playbackratePB']);
this.CB['playbackrateP'].appendChild(this.CB['playbackratePC']);
//按钮列表容器样式
var bgCss = this.newObj(styleCD['background']);
bgCss['backgroundColor'] = '';
//内容层样式
cssTemp = this.getEleCss(bgCss, cssSup2);
this.css(this.CB['playbackratePC'], cssTemp);
bgCss['padding'] = 0;
bgCss['paddingLeft'] = 0;
bgCss['paddingTop'] = 0;
bgCss['paddingRight'] = 0;
bgCss['paddingBottom'] = 0;
//容器层样式
cssTemp = this.getEleCss(this.objectAssign(bgCss, styleCD['backgroundCoorH5']), cssSup);
this.css(this.CB['playbackrateP'], cssTemp);
//背景层样式
bgCss = this.newObj(styleCD['background']);
bgCss['alpha'] = bgCss['backgroundAlpha'];
bgCss['padding'] = 0;
bgCss['paddingLeft'] = 0;
bgCss['paddingTop'] = 0;
bgCss['paddingRight'] = 0;
bgCss['paddingBottom'] = 0;
cssTemp = this.getEleCss(bgCss, cssSup2);
this.css(this.CB['playbackratePB'], cssTemp);
//样式设置结束
for (i = 0; i < dArr.length; i++) {
var buttonDiv = document.createElement('div');
buttonDiv.dataset.title = dArr[i][1];
if (nowI != i) {
this.textButton(buttonDiv, styleCD['button'], null, this.CB['playbackrateP'], dArr[i][1], '');
}
else {
this.textButton(buttonDiv, styleCD['buttonHighlight'], null, this.CB['playbackrateP'], dArr[i][1], '');
}
this.css(buttonDiv, 'position', 'static');
this.CB['playbackratePC'].appendChild(buttonDiv);
//构建间隔线
if (i < dArr.length - 1) {
var separate = styleCD['separate'];
separate['borderTop'] = separate['border'];
separate['borderTopColor'] = separate['color'];
var separateDiv = document.createElement('div');
this.CB['playbackratePC'].appendChild(separateDiv);
var cssTemp = this.getEleCss(separate, { width: '100%' });
cssTemp['position'] = 'static';
this.css(separateDiv, cssTemp);
}
var subClick = function () {
var dName = thisTemp.getDataset(this, 'title');
if (nowD != dName) {
thisTemp.css(thisTemp.CB['playbackrateP'], 'display', 'none');
thisTemp.newPlaybackrate(dName);
}
};
this.addListenerInside('click', subClick, buttonDiv);
}
//下面三角形样式
this.CB['playbackrateTriangle'] = document.createElement('div');
this.CB['playbackrateP'].appendChild(this.CB['playbackrateTriangle']);
var tbCss = styleCD['background'];
cssTemp = {
width: 0,
height: 0,
borderLeft: tbCss['triangleWidth'] * 0.5 + 'px solid transparent',
borderRight: tbCss['triangleWidth'] * 0.5 + 'px solid transparent',
borderTop: tbCss['triangleHeight'] + 'px solid ' + tbCss['triangleBackgroundColor'].replace('0x', '#'),
overflow: 'hidden',
opacity: tbCss['triangleAlpha'],
filter: 'alpha(opacity:' + tbCss['triangleAlpha'] + ')',
position: 'absolute',
left: '0px',
top: '0px',
zIndex: 2
};
this.css(this.CB['playbackrateTriangle'], cssTemp);
this.CB['playbackrateButtonText'].innerHTML = nowD;
} else {
this.CB['playbackrateButtonText'].innerHTML = this.ckLanguage['playbackrate'];
}
},
/*
内部函数
注册切换倍速播放相关事件
*/
addPlaybackrate: function () {
var thisTemp = this;
var setTimeOutP = null;
var defClick = function (event) {
if (thisTemp.css(thisTemp.CB['playbackrateP'], 'display') != 'block' && !thisTemp.isUndefined(thisTemp.CB['playbackratePC'])) {
thisTemp.css(thisTemp.CB['playbackrateP'], 'display', 'block');
var tbCss = thisTemp.ckStyle['controlBar']['playbackrate']['background'];
thisTemp.css(thisTemp.CB['playbackratePB'], {
width: thisTemp.CB['playbackratePC'].offsetWidth + 'px',
height: thisTemp.CB['playbackratePC'].offsetHeight + 'px'
});
thisTemp.css(thisTemp.CB['playbackrateP'], {
width: (thisTemp.CB['playbackratePC'].offsetWidth + tbCss['triangleDeviationX'] + tbCss['triangleWidth']) + 'px',
height: (thisTemp.CB['playbackratePC'].offsetHeight + tbCss['triangleDeviationY'] + tbCss['triangleHeight']) + 'px'
});
thisTemp.promptShow(false);
//设置三角形样式
var tempELe = thisTemp.CB['playbackratePB'];
var tempWidth = tempELe.offsetWidth, tempHeight = tempELe.offsetHeight;
var x = ((tempWidth - tbCss['triangleWidth']) * 0.5) + tbCss['triangleDeviationX'];
var y = tempELe.offsetHeight + tbCss['triangleDeviationY'];
var cssTemp = {
left: x + 'px',
top: y + 'px'
};
thisTemp.css(thisTemp.CB['playbackrateTriangle'], cssTemp);
}
else {
thisTemp.css(thisTemp.CB['playbackrateP'], 'display', 'none');
}
};
this.addListenerInside('click', defClick, this.CB['playbackrate']);
var defMouseOut = function (event) {
if (setTimeOutP) {
window.clearTimeout(setTimeOutP);
setTimeOutP = null;
}
setTimeOutP = setTimeout(function (event) {
thisTemp.css(thisTemp.CB['playbackrateP'], 'display', 'none');
},
500);
};
this.addListenerInside('mouseout', defMouseOut, thisTemp.CB['playbackrateP']);
var defMouseOver = function (event) {
if (setTimeOutP) {
thisTemp.buttonHide = false;
window.clearTimeout(setTimeOutP);
setTimeOutP = null;
}
};
this.addListenerInside('mouseover', defMouseOver, thisTemp.CB['playbackrateP']);
},
/*
内部函数
切换倍速后发生的动作
*/
newPlaybackrate: function (title) {
var vArr = this.playbackRateArr;
var nVArr = [];
var i = 0;
for (i = 0; i < vArr.length; i++) {
var v = vArr[i];
if (v[1] == title) {
this.playbackRateDefault = i;
this.V.playbackRate = v[0];
if (this.conBarShow) {
this.CB['playbackrateButtonText'].innerHTML = v[1];
this.playbackRate();
}
this.sendJS('playbackRate', v);
this.playbackRateTemp = v[0];
}
}
},
/*
内部函数
注册多字幕切换相关
*/
subtitleSwitch: function () {
if (!this.conBarShow || !this.ckConfig['config']['subtitle']) {
return;
}
var thisTemp = this;
var dArr = this.vars['cktrack'];//字幕数组
if (this.varType(dArr) != 'array') {
return;
}
if (dArr[0][1] == '') {
return;
}
var styleCD = this.ckStyle['controlBar']['subtitle'];
var cssSup = { overflow: 'hidden', display: 'none', zIndex: 995 };
var cssSup2 = { overflow: 'hidden', align: 'top', vAlign: 'left', offsetX: 0, offsetY: 0, zIndex: 1 };
var html = '';
var nowD = ''; //当前的字幕
var i = 0, nowI = 0;
if (this.subtitlesTemp == -1 && dArr.length > 0) {
this.subtitlesTemp = dArr.length - 1;
}
for (i = 0; i < dArr.length; i++) {
if (this.subtitlesTemp == i) {
nowD = dArr[i][1];
nowI = i;
}
}
if (!nowD) {
nowD = dArr[0][1];
}
this.removeChildAll(this.CB['subtitlesP']);
if (dArr.length > 1) {
//设置样式
this.CB['subtitlesPB'] = document.createElement('div'), this.CB['subtitlesPC'] = document.createElement('div');
this.CB['subtitlesP'].appendChild(this.CB['subtitlesPB']);
this.CB['subtitlesP'].appendChild(this.CB['subtitlesPC']);
//按钮列表容器样式
var bgCss = this.newObj(styleCD['background']);
bgCss['backgroundColor'] = '';
//内容层样式
cssTemp = this.getEleCss(bgCss, cssSup2);
this.css(this.CB['subtitlesPC'], cssTemp);
bgCss['padding'] = 0;
bgCss['paddingLeft'] = 0;
bgCss['paddingTop'] = 0;
bgCss['paddingRight'] = 0;
bgCss['paddingBottom'] = 0;
//容器层样式
cssTemp = this.getEleCss(this.objectAssign(bgCss, styleCD['backgroundCoorH5']), cssSup);
this.css(this.CB['subtitlesP'], cssTemp);
//背景层样式
bgCss = this.newObj(styleCD['background']);
bgCss['alpha'] = bgCss['backgroundAlpha'];
bgCss['padding'] = 0;
bgCss['paddingLeft'] = 0;
bgCss['paddingTop'] = 0;
bgCss['paddingRight'] = 0;
bgCss['paddingBottom'] = 0;
cssTemp = this.getEleCss(bgCss, cssSup2);
this.css(this.CB['subtitlesPB'], cssTemp);
//样式设置结束
for (i = 0; i < dArr.length; i++) {
var buttonDiv = document.createElement('div');
buttonDiv.dataset.title = dArr[i][1];
if (nowI != i) {
this.textButton(buttonDiv, styleCD['button'], null, this.CB['subtitlesP'], dArr[i][1], '');
}
else {
this.textButton(buttonDiv, styleCD['buttonHighlight'], null, this.CB['subtitlesP'], dArr[i][1], '');
}
this.css(buttonDiv, 'position', 'static');
this.CB['subtitlesPC'].appendChild(buttonDiv);
//构建间隔线
if (i < dArr.length - 1) {
var separate = styleCD['separate'];
separate['borderTop'] = separate['border'];
separate['borderTopColor'] = separate['color'];
var separateDiv = document.createElement('div');
this.CB['subtitlesPC'].appendChild(separateDiv);
var cssTemp = this.getEleCss(separate, { width: '100%' });
cssTemp['position'] = 'static';
this.css(separateDiv, cssTemp);
}
var subClick = function () {
var dName = thisTemp.getDataset(this, 'title');
if (nowD != dName) {
thisTemp.css(thisTemp.CB['subtitlesP'], 'display', 'none');
thisTemp.newSubtitles(dName);
}
};
this.addListenerInside('click', subClick, buttonDiv);
}
//下面三角形样式
this.CB['subtitlesTriangle'] = document.createElement('div');
this.CB['subtitlesP'].appendChild(this.CB['subtitlesTriangle']);
var tbCss = styleCD['background'];
cssTemp = {
width: 0,
height: 0,
borderLeft: tbCss['triangleWidth'] * 0.5 + 'px solid transparent',
borderRight: tbCss['triangleWidth'] * 0.5 + 'px solid transparent',
borderTop: tbCss['triangleHeight'] + 'px solid ' + tbCss['triangleBackgroundColor'].replace('0x', '#'),
overflow: 'hidden',
opacity: tbCss['triangleAlpha'],
filter: 'alpha(opacity:' + tbCss['triangleAlpha'] + ')',
position: 'absolute',
left: '0px',
top: '0px',
zIndex: 2
};
this.css(this.CB['subtitlesTriangle'], cssTemp);
this.CB['subtitleButtonText'].innerHTML = nowD;
} else {
this.CB['subtitleButtonText'].innerHTML = this.ckLanguage['subtitle'];
}
},
/*
内部函数
注册多字幕切换事件
*/
addSubtitles: function () {
var thisTemp = this;
var setTimeOutP = null;
var defClick = function (event) {
if (thisTemp.css(thisTemp.CB['subtitlesP'], 'display') != 'block' && !thisTemp.isUndefined(thisTemp.CB['subtitlesPC'])) {
var tbCss = thisTemp.ckStyle['controlBar']['subtitle']['background'];
thisTemp.css(thisTemp.CB['subtitlesP'], 'display', 'block');
thisTemp.css(thisTemp.CB['subtitlesPB'], {
width: thisTemp.CB['subtitlesPC'].offsetWidth + 'px',
height: thisTemp.CB['subtitlesPC'].offsetHeight + 'px'
});
thisTemp.css(thisTemp.CB['subtitlesP'], {
width: (thisTemp.CB['subtitlesPC'].offsetWidth + tbCss['triangleDeviationX'] + tbCss['triangleWidth']) + 'px',
height: (thisTemp.CB['subtitlesPC'].offsetHeight + tbCss['triangleDeviationY'] + tbCss['triangleHeight']) + 'px'
});
thisTemp.promptShow(false);
//设置三角形样式
var tempELe = thisTemp.CB['subtitlesPB'];
var tempWidth = tempELe.offsetWidth, tempHeight = tempELe.offsetHeight;
var x = ((tempWidth - tbCss['triangleWidth']) * 0.5) + tbCss['triangleDeviationX'];
var y = tempELe.offsetHeight + tbCss['triangleDeviationY'];
var cssTemp = {
left: x + 'px',
top: y + 'px'
};
thisTemp.css(thisTemp.CB['subtitlesTriangle'], cssTemp);
}
else {
thisTemp.css(thisTemp.CB['subtitlesP'], 'display', 'none');
}
};
this.addListenerInside('click', defClick, this.CB['subtitles']);
var defMouseOut = function (event) {
if (setTimeOutP) {
window.clearTimeout(setTimeOutP);
setTimeOutP = null;
}
setTimeOutP = setTimeout(function (event) {
thisTemp.css(thisTemp.CB['subtitlesP'], 'display', 'none');
},
500);
};
this.addListenerInside('mouseout', defMouseOut, thisTemp.CB['subtitlesP']);
var defMouseOver = function (event) {
thisTemp.buttonHide = false;
if (setTimeOutP) {
window.clearTimeout(setTimeOutP);
setTimeOutP = null;
}
};
this.addListenerInside('mouseover', defMouseOver, thisTemp.CB['subtitlesP']);
},
/*
接口函数:修改字幕,按数组编号来
提供给外部api
*/
changeSubtitles: function (n) {
if (!this.loaded || n < 0) {
return;
}
var vArr = this.vars['cktrack'];//字幕数组
if (this.varType(vArr) != 'array') {
return;
}
if (this.playerType == 'flashplayer') {
this.V.changeSubtitles(n);
return;
}
if (vArr.length > n) {
var arr = vArr[n];
if (arr.length > 2) {
var title = arr[1];
if (title) {
this.newSubtitles(title);
}
}
}
},
/*
接口函数:修改字幕大小
提供给外部api
*/
changeSubtitlesSize: function (n, m) {
if (!this.loaded || n < 0) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.changeSubtitlesSize(n, m);
return;
}
this.ckStyle['cktrack']['size'] = n;
if (!this.isUndefined(m)) {
this.ckStyle['cktrack']['leading'] = m;
}
this.trackShowAgain();
},
/*
当切换字幕时的动作
*/
newSubtitles: function (title) {
var vArr = this.vars['cktrack'];//字幕数组
var i = 0;
for (i = 0; i < vArr.length; i++) {
var v = vArr[i];
if (v[1] == title) {
this.subtitlesTemp = i;
if (this.conBarShow) {
this.CB['subtitleButtonText'].innerHTML = v[1];
this.subtitleSwitch();
this.loadTrack(i);
}
this.sendJS('subtitles', v);
}
}
},
/*
内部函数
构建清晰度按钮及切换事件(Click事件)
*/
definition: function () {
if (!this.conBarShow || !this.ckConfig['config']['definition']) {
return;
}
var styleCD = this.ckStyle['controlBar']['definition'];
var cssSup = { overflow: 'hidden', display: 'none', zIndex: 995 };
var cssSup2 = { overflow: 'hidden', align: 'top', vAlign: 'left', offsetX: 0, offsetY: 0, zIndex: 1 };
var thisTemp = this;
var vArr = this.VA;
var dArr = [];
var html = '';
var nowD = ''; //当前的清晰度
var i = 0, nowI = 0;
for (i = 0; i < vArr.length; i++) {
var d = vArr[i][2];
if (dArr.indexOf(d) == -1) {
dArr.push(d);
}
if (this.V) {
if (vArr[i][0] == this.V.currentSrc) {
nowD = d;
nowI = i;
}
}
}
if (!nowD) {
nowD = dArr[0];
}
this.removeChildAll(this.CB['definitionP']);
if (dArr.length > 1) {
//设置样式
this.CB['definitionPB'] = document.createElement('div'), this.CB['definitionPC'] = document.createElement('div');
this.CB['definitionP'].appendChild(this.CB['definitionPB']);
this.CB['definitionP'].appendChild(this.CB['definitionPC']);
//按钮列表容器样式
var bgCss = this.newObj(styleCD['background']);
bgCss['backgroundColor'] = '';
//内容层样式
cssTemp = this.getEleCss(bgCss, cssSup2);
this.css(this.CB['definitionPC'], cssTemp);
bgCss['padding'] = 0;
bgCss['paddingLeft'] = 0;
bgCss['paddingTop'] = 0;
bgCss['paddingRight'] = 0;
bgCss['paddingBottom'] = 0;
//容器层样式
cssTemp = this.getEleCss(this.objectAssign(bgCss, styleCD['backgroundCoorH5']), cssSup);
this.css(this.CB['definitionP'], cssTemp);
//背景层样式
bgCss = this.newObj(styleCD['background']);
bgCss['alpha'] = bgCss['backgroundAlpha'];
bgCss['padding'] = 0;
bgCss['paddingLeft'] = 0;
bgCss['paddingTop'] = 0;
bgCss['paddingRight'] = 0;
bgCss['paddingBottom'] = 0;
cssTemp = this.getEleCss(bgCss, cssSup2);
this.css(this.CB['definitionPB'], cssTemp);
//样式设置结束
for (i = 0; i < dArr.length; i++) {
var buttonDiv = document.createElement('div');
buttonDiv.dataset.title = dArr[i];
if (nowI != i) {
this.textButton(buttonDiv, styleCD['button'], null, this.CB['definitionP'], dArr[i], '');
}
else {
this.textButton(buttonDiv, styleCD['buttonHighlight'], null, this.CB['definitionP'], dArr[i], '');
}
this.css(buttonDiv, 'position', 'static');
this.CB['definitionPC'].appendChild(buttonDiv);
//构建间隔线
if (i < dArr.length - 1) {
var separate = styleCD['separate'];
separate['borderTop'] = separate['border'];
separate['borderTopColor'] = separate['color'];
var separateDiv = document.createElement('div');
this.CB['definitionPC'].appendChild(separateDiv);
var cssTemp = this.getEleCss(separate, { width: '100%' });
cssTemp['position'] = 'static';
this.css(separateDiv, cssTemp);
}
var defClick = function () {
var dName = thisTemp.getDataset(this, 'title');
if (nowD != dName) {
thisTemp.css(thisTemp.CB['definitionP'], 'display', 'none');
thisTemp.newDefinition(dName);
}
};
this.addListenerInside('click', defClick, buttonDiv);
}
//下面三角形样式
this.CB['definitionTriangle'] = document.createElement('div');
this.CB['definitionP'].appendChild(this.CB['definitionTriangle']);
var tbCss = styleCD['background'];
cssTemp = {
width: 0,
height: 0,
borderLeft: tbCss['triangleWidth'] * 0.5 + 'px solid transparent',
borderRight: tbCss['triangleWidth'] * 0.5 + 'px solid transparent',
borderTop: tbCss['triangleHeight'] + 'px solid ' + tbCss['triangleBackgroundColor'].replace('0x', '#'),
overflow: 'hidden',
opacity: tbCss['triangleAlpha'],
filter: 'alpha(opacity:' + tbCss['triangleAlpha'] + ')',
position: 'absolute',
left: '0px',
top: '0px',
zIndex: 2
};
this.css(this.CB['definitionTriangle'], cssTemp);
this.CB['defaultButtonText'].innerHTML = nowD;
this.css(this.CB['definition'], 'display', 'block');
} else {
this.CB['defaultButtonText'].innerHTML = this.ckLanguage['definition'];
}
},
/*
内部函数
删除节点内容
*/
removeChildAll: function (ele) {
for (var i = ele.childNodes.length - 1; i >= 0; i--) {
var childNode = ele.childNodes[i];
ele.removeChild(childNode);
}
},
/*
内部函数
注册清晰度相关事件
*/
addDefListener: function () {
var thisTemp = this;
var setTimeOutP = null;
var defClick = function (event) {
if (thisTemp.css(thisTemp.CB['definitionP'], 'display') != 'block' && !thisTemp.isUndefined(thisTemp.CB['definitionPC'])) {
thisTemp.css(thisTemp.CB['definitionP'], 'display', 'block');
var tbCss = thisTemp.ckStyle['controlBar']['definition']['background'];
thisTemp.css(thisTemp.CB['definitionPB'], {
width: thisTemp.CB['definitionPC'].offsetWidth + 'px',
height: thisTemp.CB['definitionPC'].offsetHeight + 'px'
});
thisTemp.css(thisTemp.CB['definitionP'], {
width: (thisTemp.CB['definitionPC'].offsetWidth + tbCss['triangleDeviationX'] + tbCss['triangleWidth']) + 'px',
height: (thisTemp.CB['definitionPC'].offsetHeight + tbCss['triangleDeviationY'] + tbCss['triangleHeight']) + 'px'
});
thisTemp.promptShow(false);
//设置三角形样式
var tempELe = thisTemp.CB['definitionPB'];
var tempWidth = tempELe.offsetWidth, tempHeight = tempELe.offsetHeight;
var x = ((tempWidth - tbCss['triangleWidth']) * 0.5) + tbCss['triangleDeviationX'];
var y = tempELe.offsetHeight + tbCss['triangleDeviationY'];
var cssTemp = {
left: x + 'px',
top: y + 'px'
};
thisTemp.css(thisTemp.CB['definitionTriangle'], cssTemp);
}
else {
thisTemp.css(thisTemp.CB['definitionP'], 'display', 'none');
}
};
this.addListenerInside('click', defClick, this.CB['definition']);
var defMouseOut = function (event) {
if (setTimeOutP) {
window.clearTimeout(setTimeOutP);
setTimeOutP = null;
}
setTimeOutP = setTimeout(function (event) {
thisTemp.css(thisTemp.CB['definitionP'], 'display', 'none');
},
500);
};
this.addListenerInside('mouseout', defMouseOut, thisTemp.CB['definitionP']);
var defMouseOver = function (event) {
thisTemp.buttonHide = false;
if (setTimeOutP) {
window.clearTimeout(setTimeOutP);
setTimeOutP = null;
}
};
this.addListenerInside('mouseover', defMouseOver, thisTemp.CB['definitionP']);
},
/*
接口函数
提供给外部api
*/
changeDefinition: function (n) {
if (!this.loaded || n < 0) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.changeDefinition(n);
return;
}
if (this.VA.length > n) {
var arr = this.VA[n];
if (arr.length > 3) {
var title = arr[2];
if (title) {
this.newDefinition(title);
}
}
}
},
/*
内部函数
切换清晰度后发生的动作
*/
newDefinition: function (title) {
var vArr = this.VA;
var nVArr = [];
var i = 0;
for (i = 0; i < vArr.length; i++) {
var v = vArr[i];
if (v[2] == title) {
nVArr.push(v);
this.sendJS('definitionChange', i + '');
}
}
if (nVArr.length < 1) {
return;
}
if (this.V != null && this.needSeek == 0) {
this.needSeek = this.V.currentTime;
}
if (this.getFileExt(nVArr[0][0]) != '.m3u8') {
this.isM3u8 = false;
}
if (!this.isM3u8) {
if (nVArr.length == 1) {
this.V.innerHTML = '';
this.V.src = nVArr[0][0];
this.V.currentSrc = nVArr[0][0];
} else {
var source = '';
nVArr = this.arrSort(nVArr);
for (i = 0; i < nVArr.length; i++) {
var type = '';
var va = nVArr[i];
if (va[1]) {
type = ' type="' + va[1] + '"';
}
source += '<source src="' + va[0] + '"' + type + '>';
}
this.V.removeAttribute('src');
this.V.innerHTML = source;
this.V.currentSrc = nVArr[0][0];
}
} else {
this.embedHls(vArr[0][0], this.vars['autoplay']);
}
this.V.autoplay = 'autoplay';
this.V.load();
if (this.playbackRateTemp != 1) {
this.V.playbackRate = this.playbackRateTemp; //定义倍速
}
this.timerErrorFun();
},
/*
内置函数
播放hls
*/
embedHls: function (url, autoplay) {
var thisTemp = this;
thisTemp.hlsAutoPlay = autoplay;
if (Hls.isSupported()) {
var hls = new Hls();
hls.loadSource(url);
hls.attachMedia(this.V);
hls.on(Hls.Events.MANIFEST_PARSED,
function () {
thisTemp.playerLoad();
if (autoplay) {
thisTemp.videoPlay();
}
});
}
},
/*
内部函数
构建提示点
*/
prompt: function () {
if (!this.conBarShow) {
return;
}
var thisTemp = this;
var prompt = this.vars['promptSpot'];
if (prompt == null || this.promptArr.length > 0) {
return;
}
var showPrompt = function (event) {
if (thisTemp.promptElement == null) {
var random2 = 'prompte-' + thisTemp.randomString(5);
var ele2 = document.createElement('div');
ele2.className = random2;
thisTemp.PD.appendChild(ele2);
thisTemp.promptElement = thisTemp.getByElement(random2);
thisTemp.css(thisTemp.promptElement, {
overflowX: 'hidden',
lineHeight: thisTemp.ckStyle['previewPrompt']['lineHeight'] + 'px',
fontFamily: thisTemp.ckStyle['previewPrompt']['font'],
fontSize: thisTemp.ckStyle['previewPrompt']['size'] + 'px',
color: thisTemp.ckStyle['previewPrompt']['color'].replace('0x', '#'),
position: 'absolute',
display: 'block',
zIndex: '90'
});
}
var pcon = thisTemp.getPromptTest();
var pW = pcon['pW'],
pT = pcon['pT'],
pL = parseInt(thisTemp.css(this, 'left')) - parseInt(pW * 0.5);
if (pcon['pL'] > 10) {
pL = pcon['pL'];
}
if (pL < 0) {
pL = 0;
}
thisTemp.css(thisTemp.promptElement, {
width: pW + 'px',
left: (- pW - 10) + 'px',
display: 'block'
});
thisTemp.promptElement.innerHTML = thisTemp.getDataset(this, 'words');
thisTemp.css(thisTemp.promptElement, {
left: pL + 'px',
top: (pT - thisTemp.promptElement.offsetHeight - thisTemp.ckStyle['previewPrompt']['marginBottom']) + 'px'
});
};
var hidePrompt = function (event) {
if (thisTemp.promptElement != null) {
thisTemp.css(thisTemp.promptElement, {
display: 'none'
});
}
};
var i = 0;
for (i = 0; i < prompt.length; i++) {
var pr = prompt[i];
var words = pr['words'];
var time = pr['time'];
var random = 'prompttitle-' + this.randomString(5);
var ele = document.createElement('div');
ele.className = random;
this.CB['timeBoBg'].appendChild(ele);
var div = this.getByElement(random);
try {
div.setAttribute('data-time', time);
if (this.ckConfig['config']['promptSpotTime']) {
words = this.formatTime(time, 0, this.ckLanguage['timeSliderOver']) + ' ' + words;
}
div.setAttribute('data-words', words);
}
catch (event) { }
var pCss = this.getEleCss(this.ckStyle['promptSpotH5'], { marginY: -10000, zIndex: 1 });
try {
this.css(div, pCss);
}
catch (event) { }
this.addListenerInside('mouseover', showPrompt, div);
this.addListenerInside('mouseout', hidePrompt, div);
this.promptArr.push(div);
}
this.changePrompt();
},
/*
内部函数
计算提示文本的位置
*/
getPromptTest: function () {
var pW = this.previewWidth,
pT = this.getCoor(this.CB['timeProgressBg'])['y'],
pL = 0;
if (this.previewTop != null) {
pT = parseInt(this.css(this.previewTop, 'top'));
pL = parseInt(this.css(this.previewTop, 'left'));
} else {
pT -= 35;
}
pL += 2;
if (pL < 0) {
pL = 0;
}
if (pL > this.PD.offsetWidth - pW) {
pL = this.PD.offsetWidth - pW;
}
return {
pW: pW,
pT: pT,
pL: pL
};
},
/*
内部函数
删除提示点
*/
deletePrompt: function () {
var arr = this.promptArr;
if (arr.length > 0) {
for (var i = 0; i < arr.length; i++) {
if (arr[i]) {
this.deleteChild(arr[i]);
}
}
}
this.promptArr = [];
},
/*
内部函数
计算提示点坐标
*/
changePrompt: function () {
if (this.promptArr.length == 0) {
return;
}
var arr = this.promptArr;
var duration = this.getMetaDate()['duration'];
var bw = this.CB['timeBoBg'].offsetWidth;
for (var i = 0; i < arr.length; i++) {
var time = parseInt(this.getDataset(arr[i], 'time'));
var left = parseInt(time * bw / duration) - parseInt(arr[i].offsetWidth * 0.5);
if (left < 0) {
left = 0;
}
if (left > bw - parseInt(arr[i].offsetWidth * 0.5)) {
left = bw - parseInt(arr[i].offsetWidth * 0.5);
}
this.css(arr[i], {
left: left + 'px',
display: 'block'
});
}
},
/*
内部函数
构建预览图片效果
*/
preview: function (obj) {
var thisTemp = this;
var preview = {
file: null,
scale: 0
};
preview = this.standardization(preview, this.vars['preview']);
if (preview['file'] == null || preview['scale'] <= 0) {
return;
}
var srcArr = preview['file'];
if (this.previewStart == 0) { //如果还没有构建,则先进行构建
this.previewStart = 1;
if (srcArr.length > 0) {
var i = 0;
var imgW = 0,
imgH = 0;
var random = 'preview-' + thisTemp.randomString(10);
var loadNum = 0;
var loadImg = function (i) {
srcArr[i] = thisTemp.getNewUrl(srcArr[i]);
var n = 0;
var img = new Image();
img.src = srcArr[i];
img.className = random + i;
img.onload = function (event) {
loadNum++;
if (thisTemp.previewDiv == null) { //如果没有建立DIV则建
imgW = img.width;
imgH = img.height;
thisTemp.previewWidth = parseInt(imgW * 0.1);
var ele = document.createElement('div');
ele.className = random;
thisTemp.PD.appendChild(ele);
thisTemp.previewDiv = thisTemp.getByElement(random);
var eleTop = 0;
eleTop = thisTemp.PD.offsetHeight - thisTemp.ckStyle['preview']['bottom'];
thisTemp.css(thisTemp.previewDiv, {
width: srcArr.length * imgW * 10 + 'px',
height: parseInt(imgH * 0.1) + 'px',
backgroundColor: '#000000',
position: 'absolute',
left: '0px',
top: eleTop + 'px',
display: 'none',
zIndex: '80'
});
ele.setAttribute('data-x', '0');
ele.setAttribute('data-y', eleTop);
var ele2 = document.createElement('div');
ele2.className = random + 'd2';
thisTemp.PD.appendChild(ele2);
thisTemp.previewTop = thisTemp.getByElement(ele2.className);
thisTemp.css(thisTemp.previewTop, {
width: parseInt(imgW * 0.1) + 'px',
height: parseInt(imgH * 0.1) + 'px',
position: 'absolute',
border: thisTemp.ckStyle['preview']['border'] + 'px solid ' + thisTemp.ckStyle['preview']['borderColor'].replace('0x', '#'),
left: '0px',
top: eleTop + 'px',
display: 'none',
zIndex: '81'
});
var html = '';
for (n = 0; n < srcArr.length; n++) {
html += thisTemp.newCanvas(random + n, imgW * 10, parseInt(imgH * 0.1))
}
thisTemp.previewDiv.innerHTML = html;
}
thisTemp.previewDiv.appendChild(img);
var cimg = thisTemp.getByElement(img.className);
var canvas = thisTemp.getByElement(img.className + '-canvas');
var context = canvas.getContext('2d');
var sx = 0,
sy = 0,
x = 0,
h = parseInt(imgH * 0.1);
for (n = 0; n < 100; n++) {
x = parseInt(n * imgW * 0.1);
context.drawImage(cimg, sx, sy, parseInt(imgW * 0.1), h, x, 0, parseInt(imgW * 0.1), h);
sx += parseInt(imgW * 0.1);
if (sx >= imgW) {
sx = 0;
sy += h;
}
thisTemp.css(cimg, 'display', 'none');
}
if (loadNum == srcArr.length) {
thisTemp.previewStart = 2;
} else {
i++;
loadImg(i);
}
};
};
}
loadImg(i);
return;
}
if (this.previewStart == 2) {
var isTween = true;
var nowNum = parseInt(obj['time'] / this.vars['preview']['scale']);
var numTotal = parseInt(thisTemp.getMetaDate()['duration'] / this.vars['preview']['scale']);
if (thisTemp.css(thisTemp.previewDiv, 'display') == 'none') {
isTween = false;
}
thisTemp.css(thisTemp.previewDiv, 'display', 'block');
var imgWidth = thisTemp.previewDiv.offsetWidth * 0.01 / srcArr.length;
var left = (imgWidth * nowNum) - obj['x'] + parseInt(imgWidth * 0.5),
top = thisTemp.PD.offsetHeight - thisTemp.previewDiv.offsetHeight - thisTemp.ckStyle['preview']['bottom'];
thisTemp.css(thisTemp.previewDiv, 'top', top + 2 + 'px');
var topLeft = obj['x'] - parseInt(imgWidth * 0.5);
var timepieces = 0;
if (topLeft < 0) {
topLeft = 0;
timepieces = obj['x'] - topLeft - imgWidth * 0.5;
}
if (topLeft > thisTemp.PD.offsetWidth - imgWidth) {
topLeft = thisTemp.PD.offsetWidth - imgWidth;
timepieces = obj['x'] - topLeft - imgWidth * 0.5;
}
if (left < 0) {
left = 0;
}
if (left > numTotal * imgWidth - thisTemp.PD.offsetWidth) {
left = numTotal * imgWidth - thisTemp.PD.offsetWidth;
}
thisTemp.css(thisTemp.previewTop, {
left: topLeft + 'px',
top: top + 2 + 'px',
display: 'block'
});
if (thisTemp.previewTop.offsetHeight > thisTemp.previewDiv.offsetHeight) {
thisTemp.css(thisTemp.previewTop, {
height: thisTemp.previewDiv.offsetHeight - (thisTemp.previewTop.offsetHeight - thisTemp.previewDiv.offsetHeight) + 'px'
});
}
if (this.previewTween != null) {
this.animatePause(this.previewTween);
this.previewTween = null
}
var nowLeft = parseInt(thisTemp.css(thisTemp.previewDiv, 'left'));
var leftC = nowLeft + left;
if (nowLeft == -(left + timepieces)) {
return;
}
if (isTween) {
var obj = {
element: thisTemp.previewDiv,
start: null,
end: -(left + timepieces),
speed: 0.3
};
this.previewTween = this.animate(obj);
} else {
thisTemp.css(thisTemp.previewDiv, 'left', -(left + timepieces) + 'px')
}
}
},
/*
内部函数
删除预览图节点
*/
deletePreview: function () {
if (this.previewDiv != null) {
this.deleteChild(this.previewDiv);
this.previewDiv = null;
this.previewStart = 0;
}
},
/*
内部函数
修改视频地址,属性
*/
changeVideo: function () {
if (!this.html5Video) {
this.getVarsObject();
this.V.newVideo(this.vars);
return;
}
var vArr = this.VA;
var v = this.vars;
var i = 0;
if (vArr.length < 1) {
return;
}
if (this.V != null && this.needSeek == 0) {
this.needSeek = this.V.currentTime;
}
if (v['poster']) {
this.V.poster = v['poster'];
} else {
this.V.removeAttribute('poster');
}
if (v['loop']) {
this.V.loop = 'loop';
} else {
this.V.removeAttribute('loop');
}
if (v['seek'] > 0) {
this.needSeek = v['seek'];
} else {
this.needSeek = 0;
}
if (this.getFileExt(vArr[0][0]) != '.m3u8') {
this.isM3u8 = false;
}
if (!this.isM3u8) {
if (vArr.length == 1) {
this.V.innerHTML = '';
this.V.src = vArr[0][0];
} else {
var source = '';
vArr = this.arrSort(vArr);
for (i = 0; i < vArr.length; i++) {
var type = '';
var va = vArr[i];
if (va[1]) {
type = ' type="' + va[1] + '"';
}
source += '<source src="' + va[0] + '"' + type + '>';
}
this.V.removeAttribute('src');
this.V.innerHTML = source;
}
//分析视频地址结束
if (v['autoplay']) {
this.V.autoplay = 'autoplay';
} else {
this.V.removeAttribute('autoplay');
}
this.V.load();
} else {
this.embedHls(vArr[0][0], v['autoplay']);
}
if (!this.isUndefined(v['volume'])) {
this.changeVolume(v['volume']);
}
this.resetPlayer(); //重置界面元素
this.timerErrorFun();
//如果存在字幕则加载
if (this.vars['cktrack']) {
this.loadTrack();
}
},
/*
内部函数
调整中间暂停按钮,缓冲loading错误提示文本框的位置
*/
elementCoordinate: function () {
this.pdCoor = this.getXY(this.PD);
var cssTemp = null;
try {
cssTemp = this.getEleCss(this.ckStyle['centerPlay'], { cursor: 'pointer' });
this.css(this.CB['pauseCenter'], cssTemp);
} catch (event) { this.log(event); }
try {
cssTemp = this.getEleCss(this.ckStyle['loading']);
this.css(this.CB['loading'], cssTemp);
} catch (event) { this.log(event); }
try {
cssTemp = this.getEleCss(this.ckStyle['error']);
this.css(this.CB['errorText'], cssTemp);
} catch (event) { this.log(event); }
try {
cssTemp = this.getEleCss(this.ckStyle['logo']);
//this.css(this.CB['logo'], cssTemp);
} catch (event) { this.log(event); }
this.checkBarWidth();
},
/*
内部函数
控制栏内各按钮的位置
*/
carbarButton: function () {
var styleC = this.ckStyle['controlBar'];
var styleCB = styleC['button'];
var cssTemp = null;
var cssSup = { overflow: 'hidden', cursor: 'pointer', zIndex: 1 };
var cssSup2 = { overflow: 'hidden', cursor: 'default', zIndex: 1 };
var cssSup4 = { overflow: 'hidden', cursor: 'pointer', display: 'none', zIndex: 995 };
//播放/暂停按钮
cssTemp = this.getEleCss(styleCB['play'], cssSup, this.CB['controlBarBg']);
this.css(this.CB['play'], cssTemp);
cssTemp = this.getEleCss(styleCB['pause'], cssSup, this.CB['controlBarBg']);
this.css(this.CB['pause'], cssTemp);
//设置静音/取消静音的按钮样式
cssTemp = this.getEleCss(styleCB['mute'], cssSup, this.CB['controlBarBg']);
this.css(this.CB['mute'], cssTemp);
cssTemp = this.getEleCss(styleCB['escMute'], cssSup, this.CB['controlBarBg']);
this.css(this.CB['escMute'], cssTemp);
//设置全屏/退出全屏按钮样式
cssTemp = this.getEleCss(styleCB['full'], cssSup, this.CB['controlBarBg']);
this.css(this.CB['full'], cssTemp);
cssTemp = this.getEleCss(styleCB['escFull'], cssSup, this.CB['controlBarBg']);
this.css(this.CB['escFull'], cssTemp);
cssTemp = this.getEleCss(styleC['timeText']['vod'], cssSup2, this.CB['controlBarBg']);
this.css(this.CB['timeText'], cssTemp);
//音量调节框
var volumeSchedule = this.newObj(styleC['volumeSchedule']);
volumeSchedule['backgroundImg'] = '';
cssTemp = this.getEleCss(volumeSchedule, cssSup2, this.CB['controlBarBg']);
this.css(this.CB['volume'], cssTemp);
cssTemp = {
width: cssTemp['width'],
height: styleC['volumeSchedule']['backgroundHeight'] + 'px',
overflow: 'hidden',
backgroundRepeat: 'no-repeat',
backgroundPosition: 'left center'
};
if (this.ckConfig['config']['buttonMode']['volumeSchedule']) {
cssTemp['cursor'] = 'pointer';
}
this.css(this.CB['volumeBg'], cssTemp);
this.css(this.CB['volumeBg'], {
position: 'absolute'
});
cssTemp['width'] = (this.CB['volumeBO'].offsetWidth * 0.5 + parseInt(this.css(this.CB['volumeBO'], 'left'))) + 'px';
this.css(this.CB['volumeUp'], cssTemp);
this.css(this.CB['volumeBg'], 'backgroundImage', 'url(' + styleC['volumeSchedule']['backgroundImg'] + ')');
this.css(this.CB['volumeUp'], 'backgroundImage', 'url(' + styleC['volumeSchedule']['maskImg'] + ')');
//音量调节按钮
cssTemp = this.getEleCss(styleC['volumeSchedule']['button'], { overflow: 'hidden', cursor: 'pointer', backgroundRepeat: 'no-repeat', backgroundPosition: 'left center' });
this.css(this.CB['volumeBO'], cssTemp);
//倍速容器
if (this.ckConfig['config']['playbackRate']) {
if (!this.CB['playbackrateButtonText']) {
this.textButton(this.CB['playbackrate'], styleC['playbackrate']['defaultButton'], this.objectAssign({ overflow: 'hidden', cursor: 'pointer', zIndex: 1 }, styleC['playbackrate']['defaultButtonCoor']), this.CB['controlBarBg'], this.ckLanguage['playbackrate'], 'playbackrateButtonText');
}
cssTemp = this.getEleCss(styleC['playbackrate']['defaultButtonCoor'], cssSup, this.CB['controlBarBg']);
this.css(this.CB['playbackrate'], {
left: cssTemp['left'],
top: cssTemp['top']
});
this.css(this.CB['playbackrateP'], 'display', 'none');
cssTemp = this.getEleCss(styleC['playbackrate']['backgroundCoorH5'], cssSup4);
this.css(this.CB['playbackrateP'], cssTemp);
}
//初始化清晰度按钮
if (this.ckConfig['config']['definition']) {
if (!this.CB['defaultButtonText']) {
this.textButton(this.CB['definition'], styleC['definition']['defaultButton'], this.objectAssign({ overflow: 'hidden', cursor: 'pointer', zIndex: 1 }, styleC['definition']['defaultButtonCoor']), this.CB['controlBarBg'], this.ckLanguage['definition'], 'defaultButtonText');
}
cssTemp = this.getEleCss(styleC['definition']['defaultButtonCoor'], cssSup, this.CB['controlBarBg']);
this.css(this.CB['definition'], {
left: cssTemp['left'],
top: cssTemp['top']
});
this.css(this.CB['definitionP'], 'display', 'none');
cssTemp = this.getEleCss(styleC['definition']['backgroundCoorH5'], cssSup4);
this.css(this.CB['definitionP'], cssTemp);
}
//初始化字幕切换按钮
if (this.ckConfig['config']['subtitle']) {
if (!this.CB['subtitleButtonText']) {
this.textButton(this.CB['subtitles'], styleC['subtitle']['defaultButton'], this.objectAssign({ overflow: 'hidden', cursor: 'pointer', zIndex: 1 }, styleC['subtitle']['defaultButtonCoor']), this.CB['controlBarBg'], this.ckLanguage['subtitle'], 'subtitleButtonText');
}
//字幕按钮列表容器样式
cssTemp = this.getEleCss(styleC['subtitle']['defaultButtonCoor'], cssSup, this.CB['controlBarBg']);
this.css(this.CB['subtitles'], {
left: cssTemp['left'],
top: cssTemp['top']
});
this.css(this.CB['subtitlesP'], 'display', 'none');
cssTemp = this.getEleCss(styleC['subtitle']['backgroundCoorH5'], cssSup4);
this.css(this.CB['subtitlesP'], cssTemp);
}
},
/*
构造一个文字按钮
ele:当前按钮
css:样式
cssSup:补充样式
upEle上一级容器对象
text:显示的文本
newName:文本框名称
*/
textButton: function (ele, css, cssSup, upEle, text, newName) {
var thisTemp = this;
var bgCss = {
width: css['width'],
height: css['height']
};
if (cssSup) {
bgCss = {
width: css['width'],
height: css['height'],
align: cssSup['align'],
vAlign: cssSup['vAlign'],
marginX: cssSup['marginX'],
marginY: cssSup['marginY'],
offsetX: cssSup['offsetX'],
offsetY: cssSup['offsetY'],
zIndex: 2
};
}
cssTemp = this.getEleCss(bgCss, null, upEle);
thisTemp.css(ele, cssTemp);
var outCss = this.newObj(css);
var overCss = this.newObj(css);
var textOutCss = this.newObj(css);
var textOverCss = this.newObj(css);
var cssTemp = null;
outCss['alpha'] = css['backgroundAlpha'];
overCss['backgroundColor'] = css['overBackgroundColor'];
overCss['alpha'] = css['backgroundAlpha'];
textOutCss['color'] = css['textColor'];
textOverCss['color'] = css['overTextColor'];
textOutCss['textAlign'] = css['align'];
textOverCss['textAlign'] = css['align'];
//修正文字
textOutCss['backgroundColor'] = textOverCss['backgroundColor'] = '';
var bgEle = document.createElement('div');//按钮背景层
this.removeChildAll(ele);
ele.appendChild(bgEle);
if (newName) {
this.CB[newName] = document.createElement('div');//文字层
ele.appendChild(this.CB[newName]);
this.CB[newName].innerHTML = text;
}
else {
var newEle = document.createElement('div');//文字层
ele.appendChild(newEle);
newEle.innerHTML = text;
}
var outFun = function () {
cssTemp = thisTemp.getEleCss(outCss, { cursor: 'pointer', zIndex: 1 }, bgEle);
cssTemp['left'] = '';
cssTemp['top'] = '';
thisTemp.css(bgEle, cssTemp);
cssTemp = thisTemp.getEleCss(textOutCss, { cursor: 'pointer', zIndex: 2 }, bgEle);
cssTemp['left'] = '';
cssTemp['top'] = '';
if (newName) {
thisTemp.css(thisTemp.CB[newName], cssTemp, bgEle);
}
else {
thisTemp.css(newEle, cssTemp, bgEle);
}
thisTemp.buttonHide = true;//显示的列表框需要隐藏
if (thisTemp.timeButtonOver) {
window.clearTimeout(thisTemp.timeButtonOver);
thisTemp.timeButtonOver = null;
}
thisTemp.timeButtonOver = window.setTimeout(function () { thisTemp.buttonListHide() }, 1000);
};
var overFun = function () {
cssTemp = thisTemp.getEleCss(overCss, { zIndex: 1 }, bgEle);
cssTemp['left'] = '';
cssTemp['top'] = '';
thisTemp.css(bgEle, cssTemp);
cssTemp = thisTemp.getEleCss(textOverCss, { zIndex: 2 }, bgEle);
cssTemp['left'] = '';
cssTemp['top'] = '';
if (newName) {
thisTemp.css(thisTemp.CB[newName], cssTemp);
}
else {
thisTemp.css(newEle, cssTemp);
}
};
outFun();
this.addListenerInside('mouseout', outFun, ele);
this.addListenerInside('mouseover', overFun, ele);
},
/*
隐藏所有的列表框
*/
buttonListHide: function () {
if (this.buttonHide) {
this.css([this.CB['definitionP'], this.CB['subtitlesP'], this.CB['playbackrateP']], 'display', 'none');
}
if (this.timeButtonOver) {
window.clearTimeout(this.timeButtonOver);
this.timeButtonOver = null;
}
this.buttonHide = false;
},
/*
计算视频的宽高
*/
videoCss: function () {
var cssTemp = {};
if (this.css(this.CB['controlBar'], 'display') == 'none') {
cssTemp = this.ckStyle['video']['controlBarHideReserve'];
}
else {
cssTemp = this.ckStyle['video']['reserve'];
}
var spacingBottom = cssTemp['spacingBottom'];
if (this.V.controls && this.isMobile()) {
spacingBottom -= 40;
}
var pW = this.PD.offsetWidth, pH = this.PD.offsetHeight;
var vW = pW - cssTemp['spacingLeft'] - cssTemp['spacingRight'];
var vH = pH - cssTemp['spacingTop'] - spacingBottom;
if (!this.MD) {
this.css(this.V, {
width: vW + 'px',
height: vH + 'px',
marginLeft: cssTemp['spacingLeft'] + 'px',
marginTop: cssTemp['spacingTop'] + 'px'
});
}
else {
this.css([this.MD, this.MDC], {
width: vW + 'px',
height: vH + 'px',
marginLeft: cssTemp['spacingLeft'] + 'px',
marginTop: cssTemp['spacingTop'] + 'px'
});
}
},
/*
播放器界面自定义元素
*/
playerCustom: function () {
var custom = this.ckStyle['custom'];
var button = custom['button'];
var images = custom['images'];
var cssTemp = null;
var cssSup = null;
var k = '', tempID = '';
var b = {};
var tempDiv;
var i = 0;
for (k in button) {
b = button[k];
cssSup = { overflow: 'hidden', cursor: 'pointer', zIndex: 1 };
cssTemp = this.getEleCss(b, cssSup);
tempDiv = document.createElement('div');
this.css(tempDiv, cssTemp);
this.customeElement.push({ ele: tempDiv, css: b, cssSup: cssSup, type: 'player-button', name: k });
this.PD.appendChild(tempDiv);
if (!this.isUndefined(this.ckLanguage['buttonOver'][k])) {
tempDiv.dataset.title = this.ckLanguage['buttonOver'][k];
}
i++;
this.buttonEventFun(tempDiv, b);
}
for (k in images) {
b = images[k];
cssSup = { overflow: 'hidden', zIndex: 1 };
cssTemp = this.getEleCss(b, cssSup);
tempDiv = document.createElement('div');
this.css(tempDiv, cssTemp);
this.customeElement.push({ ele: tempDiv, css: b, cssSup: cssSup, type: 'player-images', name: k });
this.PD.appendChild(tempDiv);
var img = new Image();
img.src = images[k]['img'];
tempDiv.appendChild(img);
i++
}
},
/*
控制栏自定义元素
*/
carbarCustom: function () {
var custom = this.ckStyle['controlBar']['custom'];
var button = custom['button'];
var images = custom['images'];
var cssTemp = null;
var cssSup = null;
var k = '', tempID = '';
var b = {};
var tempDiv;
var i = 0;
for (k in button) {
b = button[k];
cssSup = { overflow: 'hidden', cursor: 'pointer', zIndex: 1 };
cssTemp = this.getEleCss(b, cssSup, this.CB['controlBarBg']);
tempDiv = document.createElement('div');
this.css(tempDiv, cssTemp);
this.customeElement.push({ ele: tempDiv, css: b, cssSup: cssSup, type: 'controlBar-button', name: k });
this.CB['controlBar'].appendChild(tempDiv);
if (!this.isUndefined(this.ckLanguage['buttonOver'][k])) {
tempDiv.dataset.title = this.ckLanguage['buttonOver'][k];
}
i++;
this.buttonEventFun(tempDiv, b);
}
for (k in images) {
b = images[k];
cssSup = { overflow: 'hidden', zIndex: 1 };
cssTemp = this.getEleCss(b, cssSup, this.CB['controlBarBg']);
tempDiv = document.createElement('div');
this.css(tempDiv, cssTemp);
this.customeElement.push({ ele: tempDiv, css: b, cssSup: cssSup, type: 'controlBar-images', name: k });
this.CB['controlBar'].appendChild(tempDiv);
var img = new Image();
img.src = images[k]['img'];
tempDiv.appendChild(img);
i++;
}
},
/*
控制栏自定义元素的位置
*/
customCoor: function () {
var cssTemp = null;
if (this.customeElement.length > 0) {
for (var i = 0; i < this.customeElement.length; i++) {
if (this.customeElement[i]['type'] == 'controlBar') {
cssTemp = this.getEleCss(this.customeElement[i]['css'], this.customeElement[i]['cssSup'], this.CB['controlBarBg']);
}
else {
cssTemp = this.getEleCss(this.customeElement[i]['css'], this.customeElement[i]['cssSup']);
}
this.css(this.customeElement[i]['ele'], cssTemp);
}
}
},
/*
控制栏自定义元素的显示和隐藏,只对播放器界面的有效,作用是当播放视频广告时隐藏,广告播放完成后显示
*/
customShow: function (show) {
if (this.customeElement.length > 0) {
for (var i = 0; i < this.customeElement.length; i++) {
if (this.customeElement[i]['type'] == 'player') {
this.css(this.customeElement[i]['ele'], 'display', show ? 'block' : 'none');
}
}
}
},
/*
广告控制栏样式
*/
advertisementStyle: function () {
var asArr = ['muteButton', 'escMuteButton', 'adLinkButton', 'closeButton', 'skipAdButton', 'countDown', 'countDownText', 'skipDelay', 'skipDelayText'];
var eleArr = ['adMute', 'adEscMute', 'adLink', 'adPauseClose', 'adSkipButton', 'adTime', 'adTimeText', 'adSkip', 'adSkipText'];
for (var i = 0; i < eleArr.length; i++) {
var cssUp = { overflow: 'hidden', zIndex: 999 };
if (i < 5) {
cssUp['cursor'] = 'pointer';
}
var cssTemp = this.getEleCss(this.ckStyle['advertisement'][asArr[i]], cssUp);
this.css(this.CB[eleArr[i]], cssTemp);
}
},
/*
内部函数
当播放器尺寸变化时,显示和隐藏相关节点
*/
checkBarWidth: function () {
if (!this.conBarShow) {
return;
}
},
/*
内部函数
初始化暂停或播放按钮
*/
initPlayPause: function () {
if (!this.conBarShow) {
return;
}
if (this.vars['autoplay']) {
this.css([this.CB['play'], this.CB['pauseCenter']], 'display', 'none');
this.css(this.CB['pause'], 'display', 'block');
} else {
this.css(this.CB['play'], 'display', 'block');
if (this.css(this.CB['errorText'], 'display') == 'none') {
this.css(this.CB['pauseCenter'], 'display', 'block');
}
this.css(this.CB['pause'], 'display', 'none');
}
},
/*
下面为监听事件
内部函数
监听元数据已加载
*/
loadedHandler: function () {
this.loaded = true;
if (this.vars['loaded'] != '') {
try {
eval(this.vars['loaded'] + '(\'' + this.vars['variable'] + '\')');
} catch (event) {
this.log(event);
}
}
},
/*
内部函数
监听播放
*/
playingHandler: function () {
this.playShow(true);
//如果是第一次播放
if (this.isFirstTimePlay && !this.isUndefined(this.advertisements['front'])) {
this.isFirstTimePlay = false;
//调用播放前置广告组件
this.adI = 0;
this.adType = 'front';
this.adMuteInto();
this.adIsVideoTime = true;
this.adPlayStart = true;
this.adVideoPlay = false;
this.videoPause();
this.advertisementsTime();
this.advertisementsPlay();
this.adSkipButtonShow();
//调用播放前置广告组件结束
return;
}
if (this.adPlayerPlay) {
return;
}
//判断第一次播放结束
if (this.needSeek > 0) {
this.videoSeek(this.needSeek);
this.needSeek = 0;
}
if (this.animatePauseArray.length > 0) {
this.animateResume('pause');
}
if (this.playerType == 'html5video' && this.V != null && this.ckConfig['config']['videoDrawImage']) {
this.sendVCanvas();
}
if (!this.isUndefined(this.advertisements['pause']) && !this.adPlayStart) { //如果存在暂停广告
this.closePauseAd();
}
},
/*暂停时播放暂停广告*/
adPausePlayer: function () {
this.adI = 0;
this.adType = 'pause';
this.adPauseShow = true;
this.loadAdPause();
this.sendJS('pauseAd', 'play');
},
loadAdPause: function () {
var ad = this.getNowAdvertisements();
var type = ad['type'];
var thisTemp = this;
var width = this.PD.offsetWidth,
height = this.PD.offsetHeight;
if (this.isStrImage(type) && this.adPauseShow) {
this.css(this.CB['adElement'], 'display', 'block');
var imgClass = 'adimg' + this.randomString(10);
var imgHtml = '<img src="' + ad['file'] + '" class="' + imgClass + '">';
if (ad['link']) {
imgHtml = '<a href="' + ad['link'] + '" target="_blank">' + imgHtml + '</a>';
}
this.CB['adElement'].innerHTML = imgHtml;
this.addListenerInside('load',
function () {
var imgObj = new Image();
imgObj.src = this.src;
var imgWH = thisTemp.adjustmentWH(imgObj.width, imgObj.height);
thisTemp.css([thisTemp.getByElement(imgClass), thisTemp.CB['adElement']], {
width: imgWH['width'] + 'px',
height: imgWH['height'] + 'px',
border: '0px'
});
if (thisTemp.ckStyle['advertisement']['closeButtonShow'] && thisTemp.adPauseShow) {
thisTemp.css(thisTemp.CB['adPauseClose'], {
display: 'block'
});
}
thisTemp.ajaxSuccessNull(ad['exhibitionMonitor']);
thisTemp.adPauseCoor();
},
this.getByElement(imgClass));
this.addListenerInside('click',
function () {
thisTemp.ajaxSuccessNull(ad['clickMonitor']);
},
this.CB['adElement']);
var newI = this.adI;
if (this.adI < this.advertisements['pause'].length - 1) {
newI++;
} else {
newI = 0;
}
if (ad['time'] > 0) {
setTimeout(function () {
if (thisTemp.adPauseShow) {
thisTemp.adI = newI;
thisTemp.loadAdPause();
}
},
ad['time'] * 1000);
}
}
},
/*调整暂停广告的位置*/
adPauseCoor: function () {
if (this.css(this.CB['adElement'], 'display') == 'block') {
var w = this.CB['adElement'].offsetWidth,
h = this.CB['adElement'].offsetHeight;
var pw = this.PD.offsetWidth,
ph = this.PD.offsetHeight;
this.css(this.CB['adElement'], {
top: (ph - h) * 0.5 + 'px',
left: (pw - w) * 0.5 + 'px'
});
if (this.css(this.CB['adPauseClose'], 'display') == 'block') {
var rr = this.ckStyle['advertisement']['closeButton'];
var cxy = this.getPosition(rr, this.CB['adElement']);
this.css(this.CB['adPauseClose'], {
top: cxy['y'] + 'px',
left: cxy['x'] + 'px'
});
}
}
},
/*
关闭暂停广告
*/
closePauseAd: function () {
this.CB['adElement'].innerHTML = '';
this.css([this.CB['adElement'], this.CB['adPauseClose']], 'display', 'none');
this.adPauseShow = false;
this.sendJS('pauseAd', 'ended');
},
/*计算广告时间*/
advertisementsTime: function (nt) {
if (this.isUndefined(nt)) {
nt = 0;
}
var ad = this.advertisements[this.adType];
if (nt > 0) {
ad[this.adI]['time'] = Math.ceil(nt);
}
this.adTimeAllTotal = 0;
for (var i = this.adI; i < ad.length; i++) {
if (!this.isUndefined(ad[i]['time'])) {
this.adTimeAllTotal += Math.ceil(ad[i]['time']);
}
}
if (this.adTimeAllTotal > 0) {
this.CB['adTimeText'].innerHTML = this.ckLanguage['adCountdown'].replace('[$second]', this.adTimeAllTotal).replace('[$Second]', this.adTimeAllTotal > 9 ? this.adTimeAllTotal : '0' + this.adTimeAllTotal);
}
if (this.adPauseShow) {
this.closePauseAd();
}
this.adOtherCloseAll();
this.adTimeTotal = -1;
},
/*判断是否需要显示跳过广告按钮*/
adSkipButtonShow: function () {
var thisTemp = this;
var skipConfig = this.ckStyle['advertisement'];
var delayTimeTemp = skipConfig[this.adType + 'SkipButtonDelay'];
var timeFun = function () {
if (delayTimeTemp >= 0) {
thisTemp.CB['adSkipText'].innerHTML = thisTemp.ckLanguage['skipDelay'].replace('[$second]', delayTimeTemp).replace('[$Second]', delayTimeTemp > 9 ? delayTimeTemp : '0' + delayTimeTemp);
thisTemp.css([thisTemp.CB['adSkip'], thisTemp.CB['adSkipText']], 'display', 'block');
thisTemp.css(thisTemp.CB['adSkipButton'], 'display', 'none');
setTimeout(timeFun, 1000);
} else {
thisTemp.css([thisTemp.CB['adSkip'], thisTemp.CB['adSkipText']], 'display', 'none');
if (thisTemp.css(thisTemp.CB['adTime'], 'display') == 'block') {
thisTemp.css(thisTemp.CB['adSkipButton'], 'display', 'block');
}
}
delayTimeTemp--;
};
if (skipConfig['skipButtonShow']) {
if (skipConfig[this.adType + 'SkipButtonDelay'] > 0 && this.isUndefined(this.adSkipButtonTime)) {
thisTemp.css([thisTemp.CB['adSkip'], thisTemp.CB['adSkipText']], 'display', 'block');
timeFun();
} else {
thisTemp.css([thisTemp.CB['adSkip'], thisTemp.CB['adSkipText']], 'display', 'none');
thisTemp.css(thisTemp.CB['adSkipButton'], 'display', 'block');
}
}
},
/*播放广告*/
advertisementsPlay: function () {
this.css([this.CB['adBackground'], this.CB['adElement'], this.CB['adTime'], this.CB['adTimeText'], this.CB['adSkip'], this.CB['adSkipText'], this.CB['adSkipButton'], this.CB['adLink']], 'display', 'none');
this.adPlayerPlay = false;
var ad = this.advertisements[this.adType];
if (this.adI == 0 && (this.adType == 'front' || this.adType == 'insert' || this.adType == 'end')) {
this.sendJS('process', this.adType + ' ad play');
this.sendJS(this.adType + 'Ad', 'play');
}
this.trackHide();
if (this.adI < ad.length) {
if (!this.isUndefined(ad[this.adI]['time'])) {
this.adTimeTotal = parseInt(ad[this.adI]['time']);
}
this.loadAdvertisements();
} else {
this.adEnded();
}
},
/*清除当前所有广告*/
eliminateAd: function () {
if (this.adType) {
var ad = this.advertisements[this.adType];
this.adI = ad.length;
this.advertisementsPlay();
}
},
/*广告播放结束*/
adEnded: function () {
var thisTemp = this;
this.adPlayStart = false;
if (this.adType == 'front') {
this.time = 0;
}
this.adPlayerPlay = false;
if (this.adVideoPlay) {
if (this.videoTemp['src'] != '') {
this.V.src = this.videoTemp['src'];
} else {
if (this.V.src) {
this.V.removeAttribute('src');
}
}
if (this.videoTemp['source'] != '') {
this.V.innerHTML = this.videoTemp['source'];
}
if (this.videoTemp['currentSrc'] != '') {
this.V.src = this.videoTemp['currentSrc'];
this.V.currentSrc = this.videoTemp['currentSrc'];
}
if (this.videoTemp['loop']) {
this.V.loop = true;
this.videoTemp['loop'] = false;
}
if (this.adType == 'end') {
this.endedHandler();
} else {
this.videoPlay();
}
} else {
this.videoPlay();
}
this.changeVolume(this.vars['volume']);
this.sendJS('process', this.adType + ' ad ended');
this.sendJS(this.adType + 'Ad', 'ended');
this.changeControlBarShow(true);
this.css(this.CB['logo'], 'display', 'none');
this.customShow(true);
this.css([this.CB['adBackground'], this.CB['adElement'], this.CB['adTime'], this.CB['adTimeText'], this.CB['adSkip'], this.CB['adSkipText'], this.CB['adSkipButton'], this.CB['adLink'], this.CB['adMute'], this.CB['adEscMute']], 'display', 'none');
},
/*加载广告*/
loadAdvertisements: function () {
//this.videoTemp
var ad = this.getNowAdvertisements();
var type = ad['type'];
var thisTemp = this;
var width = this.PD.offsetWidth,
height = this.PD.offsetHeight;
this.changeControlBarShow(false);
this.adPlayerPlay = true;
this.css(this.CB['logo'], 'display', 'none');
this.customShow(false);
if (this.isStrImage(type)) {
this.css([this.CB['adBackground'], this.CB['adElement'], this.CB['adTime'], this.CB['adTimeText']], 'display', 'block');
this.css([this.CB['adMute'], this.CB['adEscMute']], 'display', 'none');
var imgClass = 'adimg' + this.randomString(10);
var imgHtml = '<img src="' + ad['file'] + '" class="' + imgClass + '">';
if (ad['link']) {
imgHtml = '<a href="' + ad['link'] + '" target="_blank">' + imgHtml + '</a>';
}
this.CB['adElement'].innerHTML = imgHtml;
this.addListenerInside('load',
function () {
var imgObj = new Image();
imgObj.src = this.src;
var imgWH = thisTemp.adjustmentWH(imgObj.width, imgObj.height);
thisTemp.css(thisTemp.getByElement(imgClass), {
width: imgWH['width'] + 'px',
height: imgWH['height'] + 'px',
border: '0px'
});
thisTemp.css(thisTemp.CB['adElement'], {
width: imgWH['width'] + 'px',
height: imgWH['height'] + 'px',
top: (height - imgWH['height']) * 0.5 + 'px',
left: (width - imgWH['width']) * 0.5 + 'px'
});
thisTemp.ajaxSuccessNull(ad['exhibitionMonitor']);
},
this.getByElement(imgClass));
this.addListenerInside('click',
function () {
thisTemp.ajaxSuccessNull(ad['clickMonitor']);
},
this.CB['adElement']);
if (!this.isUndefined(ad['time'])) {
this.adCountDown();
}
} else {
this.css([this.CB['adTime'], this.CB['adTimeText']], 'display', 'block');
//判断是否静音
if (this.adVideoMute) {
this.css(this.CB['adEscMute'], 'display', 'block');
this.css(this.CB['adMute'], 'display', 'none');
} else {
this.css(this.CB['adEscMute'], 'display', 'none');
this.css(this.CB['adMute'], 'display', 'block');
}
this.CB['adElement'].innerHTML = '';
if (this.videoTemp['currentSrc'] == '') {
this.videoTemp['currentSrc'] = this.getCurrentSrc();
}
if (this.V.loop) {
this.videoTemp['loop'] = true;
this.V.loop = false;
}
if (this.V != null && this.V.currentTime > 0 && this.adIsVideoTime && this.adType != 'front') { //当有视频广告时而又没有记录下已播放的时间则进行记录
this.adIsVideoTime = false;
this.needSeek = this.V.currentTime;
}
this.V.src = ad['file'];
this.V.currentSrc = ad['file'];
this.V.innerHTML = '';
this.V.play();
this.adVideoPlay = true;
this.ajaxSuccessNull(ad['exhibitionMonitor']);
if (!this.adVideoMute) {
this.escAdMute();
}
}
if (ad['link']) {
this.css(this.CB['adLink'], 'display', 'block');
var adLinkClick = function (event) {
thisTemp.sendJS('clickEvent', 'javaScript->adLinkClick');
};
this.addListenerInside('click', adLinkClick, this.CB['adLink']);
this.adLinkTemp = ad['link'];
var linkTemp = '<a href="' + ad['link'] + '" target="_blank" class="ckadmorelink"><img src="' + this.ckStyle['png-1-1'] + '" width="' + this.ckStyle['advertisement']['adLinkButton']['width'] + '" height="' + this.ckStyle['advertisement']['adLinkButton']['height'] + '"></a>';
this.CB['adLink'].innerHTML = linkTemp;
this.css(this.getByElement('ckadmorelink'), {
color: '#FFFFFF',
textDecoration: 'none'
});
this.addListenerInside('click',
function () {
thisTemp.ajaxSuccessNull(ad['clickMonitor']);
},
this.CB['adLink']);
} else {
this.css(this.CB['adLink'], 'display', 'none');
}
},
/*普通广告倒计时*/
adCountDown: function () {
var thisTemp = this;
if (this.adTimeTotal > 0) {
if (!this.adIsPause) {
this.adTimeTotal--;
this.showAdTime();
this.adCountDownObj = null;
this.adCountDownObj = setTimeout(function () {
thisTemp.adCountDown();
},
1000);
}
} else {
this.adI++;
this.advertisementsPlay();
}
},
/*视频广告倒计时*/
adPlayerTimeHandler: function (time) {
var ad = this.getNowAdvertisements();
var type = ad['type'];
if (this.isStrImage(type)) {
return;
}
if (this.adTimeTotal != parseInt(time)) {
this.adTimeTotal = parseInt(time);
this.showAdTime();
}
},
/*格式化广告倒计时显示*/
showAdTime: function () {
this.adTimeAllTotal--;
var n = this.adTimeAllTotal;
if (n < 0) {
n = 0;
}
this.CB['adTimeText'].innerHTML = this.ckLanguage['adCountdown'].replace('[$second]', n).replace('[$Second]', n < 10 ? '0' + n : n);
},
/*
单独监听其它广告
*/
checkAdOther: function (t) {
if (this.adPlayerPlay) {
return;
}
var adTime = this.advertisements['othertime'];
var adPlay = this.advertisements['otherPlay'];
for (var i = 0; i < adTime.length; i++) {
if (t >= adTime[i] && !adPlay[i]) { //如果播放时间大于广告时间而该广告还没有播放,则开始播放
adPlay[i] = true;
this.newAdOther(i);
}
}
},
/*
新建其它广告
*/
newAdOther: function (i) {
var thisTemp = this;
var ad = this.advertisements['other'][i];
var randomS = this.randomString(10); //获取一个随机字符串
var adDivID = 'adother' + randomS; //广告容器
imgClassName = 'adimgother' + randomS;
var adDiv = document.createElement('div');
adDiv.className = adDivID;
this.PD.appendChild(adDiv);
ad['div'] = adDivID;
ad['element'] = imgClassName;
var adHtml = '<img src="' + ad['file'] + '" class="' + imgClassName + '">';
if (ad['link']) {
adHtml = '<a href="' + ad['link'] + '" target="blank">' + adHtml + '</a>';
}
this.getByElement(adDivID).innerHTML = adHtml;
this.css(adDivID, {
position: 'absolute',
overflow: 'hidden',
zIndex: '996',
top: '-600px',
left: '-600px',
cursor: 'pointer'
});
if (this.ckStyle['advertisement']['closeOtherButtonShow']) {
var closeAdDivID = 'adotherclose-' + randomS; //广告容器
var closeAdDiv = document.createElement('div');
closeAdDiv.className = closeAdDivID;
this.PD.appendChild(closeAdDiv);
ad['closeDiv'] = closeAdDivID;
ad['close'] = false;
var closeAdDivCss = this.getEleCss(this.ckStyle['advertisement']['closeOtherButton'], { offsetX: -10000, offsetY: -10000, cursor: 'pointer', zIndex: 997 });
this.css(closeAdDivID, closeAdDivCss);
var adOtherCloseOver = function () {
thisTemp.loadImgBg(closeAdDivID, thisTemp.ckStyle['advertisement']['closeOtherButton']['mouseOver']);
};
var adOtherCloseOut = function () {
thisTemp.loadImgBg(closeAdDivID, thisTemp.ckStyle['advertisement']['closeOtherButton']['mouseOut']);
};
adOtherCloseOut();
this.addListenerInside('mouseover', adOtherCloseOver, this.getByElement(closeAdDivID));
this.addListenerInside('mouseout', adOtherCloseOut, this.getByElement(closeAdDivID));
}
this.addListenerInside('load',
function () {
var imgObj = new Image();
imgObj.src = this.src;
var imgWH = thisTemp.adjustmentWH(imgObj.width, imgObj.height);
thisTemp.css([thisTemp.getByElement(imgClassName), thisTemp.getByElement(adDivID)], {
width: imgWH['width'] + 'px',
height: imgWH['height'] + 'px',
border: '0px'
});
thisTemp.advertisements['other'][i] = ad;
thisTemp.ajaxSuccessNull(ad['exhibitionMonitor']);
thisTemp.adOtherCoor();
},
this.getByElement(imgClassName));
this.addListenerInside('click',
function () {
thisTemp.adOtherClose(i);
},
this.getByElement(closeAdDivID));
this.addListenerInside('click',
function () {
thisTemp.ajaxSuccessNull(ad['clickMonitor']);
},
this.getByElement(imgClassName));
if (ad['time'] > 0) {
setTimeout(function () {
thisTemp.adOtherClose(i);
},
ad['time'] * 1000);
}
},
/*
关闭其它广告
*/
adOtherClose: function (i) {
var ad = this.advertisements['other'][i];
if (!this.isUndefined(ad['close'])) {
if (!ad['close']) {
ad['close'] = true;
this.PD.removeChild(this.getByElement(ad['div']));
this.PD.removeChild(this.getByElement(ad['closeDiv']));
}
}
},
adOtherCloseAll: function () {
if (!this.isUndefined(this.advertisements['other'])) {
var ad = this.advertisements['other'];
for (var i = 0; i < ad.length; i++) {
this.adOtherClose(i);
}
}
},
/*
计算其它广告的坐标
*/
adOtherCoor: function () {
if (!this.isUndefined(this.advertisements['other'])) {
var arr = this.advertisements['other'];
for (var i = 0; i < arr.length; i++) {
var ad = arr[i];
if (!this.isUndefined(ad['close'])) {
if (!ad['close']) {
var rr = this.ckStyle['advertisement']['closeOtherButton'];
var coor = this.getPosition(ad);
var x = coor['x'],
y = coor['y'];
this.css(this.getByElement(ad['div']), {
left: x + 'px',
top: y + 'px'
});
var cxy = this.getPosition(rr, this.getByElement(ad['div']));
if (!this.isUndefined(ad['closeDiv'])) {
this.css(this.getByElement(ad['closeDiv']), {
left: cxy['x'] + 'px',
top: cxy['y'] + 'px'
});
}
}
}
}
}
},
/*
单独监听中间插入广告
*/
checkAdInsert: function (t) {
if (this.adPlayerPlay) {
return;
}
var adTime = this.advertisements['inserttime'];
var adPlay = this.advertisements['insertPlay'];
var duration = this.getMetaDate()['duration'];
for (var i = adTime.length - 1; i > -1; i--) {
if (t >= adTime[i] && t < duration - 2 && t > 1 && !adPlay[i]) { //如果播放时间大于广告时间而该广告还没有播放,则开始播放
this.adI = 0;
this.adType = 'insert';
this.adMuteInto();
this.adIsVideoTime = true;
this.adPlayStart = true;
this.adVideoPlay = false;
this.videoPause();
this.advertisementsTime();
this.advertisementsPlay();
this.adSkipButtonShow();
adPlay[i] = true;
for (var n = 0; n < i + 1; n++) {
adPlay[n] = true;
}
break;
}
}
},
/*格式化中间插入广告的播放时间*/
formatInserttime: function (duration) {
if (!this.isUndefined(this.advertisements['inserttime'])) {
var arr = this.advertisements['inserttime'];
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i].toString().substr(- 1) == '%') {
newArr.push(parseInt(duration * parseInt(arr[i]) * 0.01));
} else {
newArr.push(parseInt(arr[i]));
}
}
this.advertisements['inserttime'] = newArr;
}
},
/*获取当前的广告*/
getNowAdvertisements: function () {
if (this.adI == -1) {
return {
file: '',
time: 0,
link: ''
};
}
return this.advertisements[this.adType][this.adI];
},
/*根据元件尺寸和播放器尺寸调整大小*/
adjustmentWH: function (w, h) {
var width = this.PD.offsetWidth,
height = this.PD.offsetHeight;
var nw = 0,
nh = 0;
if (w >= width || h >= height) {
if (width / w > height / h) {
nh = height - 20;
nw = w * nh / h;
} else {
nw = width - 20;
nh = h * nw / w;
}
} else {
nw = w;
nh = h;
}
return {
width: nw,
height: nh
}
},
/*单独请求一次地址,但不处理返回的数据*/
ajaxSuccessNull: function (url) {
if (!this.isUndefined(url)) {
var ajaxObj = {
url: url,
success: function (data) { }
};
this.ajax(ajaxObj);
}
},
/*
内部函数
运行指定函数
*/
runFunction: function (s) {
try {
var arr = s.split('->');
if (arr.length == 2) {
switch (arr[0]) {
case 'javaScript':
if (arr[1].substr(0, 11) != '[flashvars]') {
eval(arr[1] + '()');
}
else {
eval(this.vars[arr[1].substr(11)] + '()');
}
break;
case 'actionScript':
eval('this.' + arr[1] + '()');
break;
}
}
this.sendJS('clickEvent', s);
} catch (event) { }
},
/*
内部函数
使用画布附加视频
*/
sendVCanvas: function () {
if (this.timerVCanvas == null) {
this.css(this.V, 'display', 'none');
this.css(this.MD, 'display', 'block');
var thisTemp = this;
var videoCanvas = function () {
if (thisTemp.MDCX.width != thisTemp.MD.offsetWidth) {
thisTemp.MDC.width = thisTemp.MD.offsetWidth;
}
if (thisTemp.MDCX.height != thisTemp.MD.offsetHeight) {
thisTemp.MDC.height = thisTemp.MD.offsetHeight;
}
thisTemp.MDCX.clearRect(0, 0, thisTemp.MDCX.width, thisTemp.MDCX.height);
var coor = thisTemp.getProportionCoor(thisTemp.PD.offsetWidth, thisTemp.PD.offsetHeight, thisTemp.V.videoWidth, thisTemp.V.videoHeight);
thisTemp.MDCX.drawImage(thisTemp.V, 0, 0, thisTemp.V.videoWidth, thisTemp.V.videoHeight, coor['x'], coor['y'], coor['width'], coor['height']);
};
this.timerVCanvas = new this.timer(0, videoCanvas);
}
},
/*
内部函数
监听暂停
*/
pauseHandler: function () {
var thisTemp = this;
this.playShow(false);
if (this.animatePauseArray.length > 0) {
this.animatePause('pause');
}
if (this.playerType == 'html5video' && this.V != null && this.ckConfig['config']['videoDrawImage']) {
this.stopVCanvas();
}
if (!this.isUndefined(this.advertisements['pause']) && !this.adPlayStart && !this.adPauseShow) { //如果存在暂停广告
setTimeout(function () {
if (!thisTemp.isUndefined(thisTemp.advertisements['pause']) && !thisTemp.adPlayStart && !thisTemp.adPauseShow && thisTemp.time > 1) { //如果存在暂停广告
thisTemp.adPausePlayer();
}
},
300);
}
},
/*
内部函数
停止画布
*/
stopVCanvas: function () {
if (this.timerVCanvas != null) {
this.css(this.V, 'display', 'block');
this.css(this.MD, 'display', 'none');
if (this.timerVCanvas.runing) {
this.timerVCanvas.stop();
}
this.timerVCanvas = null;
}
},
/*
内部函数
根据当前播放还是暂停确认图标显示
*/
playShow: function (b) {
if (!this.conBarShow) {
return;
}
if (b) {
this.css(this.CB['play'], 'display', 'none');
this.css(this.CB['pauseCenter'], 'display', 'none');
this.css(this.CB['pause'], 'display', 'block');
} else {
this.css(this.CB['play'], 'display', 'block');
if (this.css(this.CB['errorText'], 'display') == 'none') {
if (!this.adPlayerPlay) {
this.css(this.CB['pauseCenter'], 'display', 'block');
}
} else {
this.css(this.CB['pauseCenter'], 'display', 'none');
}
this.css(this.CB['pause'], 'display', 'none');
}
},
/*
内部函数
监听seek结束
*/
seekedHandler: function () {
this.resetTrack();
this.isTimeButtonMove = true;
if (this.V.paused) {
if (this.hlsAutoPlay) {
this.videoPlay();
}
else {
this.hlsAutoPlay = true;
}
}
},
/*
内部函数
监听播放结束
*/
endedHandler: function () {
this.sendJS('ended');
if (this.adPlayerPlay) {
this.adI++;
this.advertisementsPlay();
return;
}
if (!this.endAdPlay && !this.isUndefined(this.advertisements['end'])) {
this.endAdPlay = true;
this.adI = 0;
this.adType = 'end';
this.adMuteInto();
this.adIsVideoTime = true;
this.adPlayStart = true;
this.adVideoPlay = false;
this.videoPause();
this.advertisementsTime();
this.advertisementsPlay();
this.adSkipButtonShow();
this.adReset = true;
return;
}
this.endedAdReset();
if (this.vars['loop']) {
this.videoSeek(0);
}
},
/*
重置结束后相关的设置
*/
endedAdReset: function () {
var arr = [];
var i = 0;
if (!this.isUndefined(this.advertisements['insertPlay'])) {
arr = this.advertisements['insertPlay'];
for (i = 0; i < arr.length; i++) {
this.advertisements['insertPlay'][i] = false;
}
}
if (!this.isUndefined(this.advertisements['otherPlay'])) {
arr = this.advertisements['otherPlay'];
for (i = 0; i < arr.length; i++) {
this.advertisements['otherPlay'][i] = false;
}
}
//this.endAdPlay=false;
},
/*
内部函数
监听音量改变
*/
volumechangeHandler: function () {
if (!this.conBarShow) {
return;
}
if ((this.ckConfig['config']['mobileVolumeBarShow'] || !this.isMobile()) && this.css(this.CB['volume'], 'display') != 'none') {
try {
var volume = this.volume || this.V.volume;
if (volume > 0) {
this.css(this.CB['mute'], 'display', 'block');
this.css(this.CB['escMute'], 'display', 'none');
} else {
this.css(this.CB['mute'], 'display', 'none');
this.css(this.CB['escMute'], 'display', 'block');
}
} catch (event) { }
}
},
/*
内部函数
监听播放时间调节进度条
*/
timeUpdateHandler: function () {
var duration = 0;
if (this.playerType == 'html5video') {
try {
duration = this.V.duration;
} catch (event) { }
}
if (isNaN(duration) || parseInt(duration) < 0.2) {
duration = this.vars['duration'];
}
if (this.vars['forceduration'] > 0) {
duration = this.vars['forceduration'];
}
if (duration > 0) {
this.time = this.V.currentTime;
this.timeTextHandler();
this.trackShowHandler();
if (this.isTimeButtonMove) {
this.timeProgress(this.time, duration);
}
}
},
/*
内部函数
改变控制栏坐标
*/
controlBar: function () {
//控制栏背景
var cb = this.ckStyle['controlBar'];
var cssObjTemp = {
align: cb['align'],
vAlign: cb['vAlign'],
width: cb['width'],
height: cb['height'],
offsetX: cb['offsetX'],
offsetY: cb['offsetY']
};
var bgCss = {
backgroundColor: cb['background']['backgroundColor'],
backgroundImg: cb['background']['backgroundImg'],
alpha: cb['background']['alpha']
};
var cssTemp = this.getEleCss(this.objectAssign(cssObjTemp, bgCss), { zIndex: 888 });
this.css(this.CB['controlBarBg'], cssTemp);
//控制栏容器
cssTemp = this.getEleCss(cssObjTemp, { zIndex: 889 });
this.css(this.CB['controlBar'], cssTemp);
},
/*
内部函数
按时间改变进度条
*/
timeProgress: function (time, duration) {
if (!this.conBarShow) {
return;
}
var timeProgressBgW = this.CB['timeProgressBg'].offsetWidth;
var timeBOW = parseInt((time * timeProgressBgW / duration) - (this.CB['timeButton'].offsetWidth * 0.5));
if (timeBOW > timeProgressBgW - this.CB['timeButton'].offsetWidth) {
timeBOW = timeProgressBgW - this.CB['timeButton'].offsetWidth;
}
if (timeBOW < 0) {
timeBOW = 0;
}
this.css(this.CB['timeProgress'], 'width', timeBOW + 'px');
this.css(this.CB['timeButton'], 'left', parseInt(timeBOW) + 'px');
},
/*
内部函数
监听播放时间改变时间显示文本框
*/
timeTextHandler: function () { //显示时间/总时间
if (!this.conBarShow) {
return;
}
var duration = this.V.duration;
var time = this.V.currentTime;
if (isNaN(duration) || parseInt(duration) < 0.2) {
duration = this.vars['duration'];
}
if (this.vars['forceduration'] > 0) {
duration = this.vars['forceduration'];
}
this.CB['timeText'].innerHTML = this.formatTime(time, duration, this.ckLanguage['vod']);
},
/*
内部函数
监听是否是缓冲状态
*/
bufferEdHandler: function () {
if (!this.conBarShow || this.playerType == 'flashplayer') {
return;
}
var thisTemp = this;
var clearTimerBuffer = function () {
if (thisTemp.timerBuffer != null) {
if (thisTemp.timerBuffer.runing) {
thisTemp.sendJS('buffer', 100);
thisTemp.timerBuffer.stop();
}
thisTemp.timerBuffer = null;
}
};
clearTimerBuffer();
var bufferFun = function () {
if (!thisTemp.isUndefined(thisTemp.V) && thisTemp.V.buffered.length > 0) {
var duration = thisTemp.V.duration;
var len = thisTemp.V.buffered.length;
var bufferStart = thisTemp.V.buffered.start(len - 1);
var bufferEnd = thisTemp.V.buffered.end(len - 1);
var loadTime = bufferStart + bufferEnd;
var loadProgressBgW = thisTemp.CB['timeProgressBg'].offsetWidth;
var timeButtonW = thisTemp.CB['timeButton'].offsetWidth;
var loadW = parseInt((loadTime * loadProgressBgW / duration) + timeButtonW);
if (loadW >= loadProgressBgW) {
loadW = loadProgressBgW;
clearTimerBuffer();
}
thisTemp.changeLoad(loadTime);
}
};
this.timerBuffer = new this.timer(200, bufferFun);
},
/*
内部函数
单独计算加载进度
*/
changeLoad: function (loadTime) {
if (this.V == null) {
return;
}
if (!this.conBarShow) {
return;
}
var loadProgressBgW = this.CB['timeProgressBg'].offsetWidth;
var timeButtonW = this.CB['timeButton'].offsetWidth;
var duration = this.V.duration;
if (isNaN(duration) || parseInt(duration) < 0.2) {
duration = this.vars['duration'];
}
if (this.vars['forceduration'] > 0) {
duration = this.vars['forceduration'];
}
if (this.isUndefined(loadTime)) {
loadTime = this.loadTime;
} else {
this.loadTime = loadTime;
}
var loadW = parseInt((loadTime * loadProgressBgW / duration) + timeButtonW);
this.css(this.CB['loadProgress'], 'width', loadW + 'px');
this.sendJS('loadTime', loadTime);
this.loadTimeTemp = loadTime;
},
/*
内部函数
判断是否是直播
*/
judgeIsLive: function () {
var thisTemp = this;
if (this.timerError != null) {
if (this.timerError.runing) {
this.timerError.stop();
}
this.timerError = null;
}
this.error = false;
if (this.conBarShow) {
this.css(this.CB['errorText'], 'display', 'none');
}
var timeupdate = function (event) {
thisTemp.timeUpdateHandler();
};
if (!this.vars['live']) {
if (this.V != null && this.playerType == 'html5video') {
this.addListenerInside('timeupdate', timeupdate);
thisTemp.timeTextHandler();
thisTemp.prompt(); //添加提示点
setTimeout(function () {
thisTemp.bufferEdHandler();
},
200);
}
} else {
this.removeListenerInside('timeupdate', timeupdate);
if (this.timerTime != null) {
window.clearInterval(this.timerTime);
timerTime = null;
}
if (this.timerTime != null) {
if (this.timerTime.runing) {
this.timerTime.stop();
}
this.timerTime = null;
}
var timeFun = function () {
if (thisTemp.V != null && !thisTemp.V.paused && thisTemp.conBarShow) {
thisTemp.CB['timeText'].innerHTML = thisTemp.formatTime(0, 0, thisTemp.ckLanguage['live']); //时间显示框默认显示内容
}
};
this.timerTime = new this.timer(1000, timeFun);
//timerTime.start();
}
this.definition();
},
/*
内部函数
加载字幕
*/
loadTrack: function (def) {
if (this.playerType == 'flashplayer' || this.vars['flashplayer'] == true) {
return;
}
if (this.isUndefined(def)) {
def = -1;
}
var track = this.vars['cktrack'];
var loadTrackUrl = '';
var type = this.varType(track);
var thisTemp = this;
if (type == 'array') {
if (def == -1) {
var index = 0;
var indexN = 0;
for (var i = 0; i < track.length; i++) {
var li = track[i];
if (li.length == 3 && li[2] > indexN) {
indexN = li[2];
index = i;
}
}
}
else {
index = def;
}
loadTrackUrl = track[index][0];
}
else {
loadTrackUrl = track;
}
var obj = {
method: 'get',
dataType: 'text',
url: loadTrackUrl,
charset: 'utf-8',
success: function (data) {
if (data) {
thisTemp.track = thisTemp.parseSrtSubtitles(data);
thisTemp.trackIndex = 0;
thisTemp.nowTrackShow = {
sn: ''
}
}
}
};
this.ajax(obj);
},
/*
内部函数
重置字幕
*/
resetTrack: function () {
this.trackIndex = 0;
this.nowTrackShow = {
sn: ''
};
},
/*
内部函数
根据时间改变读取显示字幕
*/
trackShowHandler: function () {
if (!this.conBarShow || this.adPlayerPlay) {
return;
}
if (this.track.length < 1) {
return;
}
if (this.trackIndex >= this.track.length) {
this.trackIndex = 0;
}
var nowTrack = this.track[this.trackIndex]; //当前编号对应的字幕内容
/*
this.nowTrackShow=当前显示在界面上的内容
如果当前时间正好在nowTrack时间内则需要判断
*/
if (this.time >= nowTrack['startTime'] && this.time <= nowTrack['endTime']) {
/*
如果当前显示的内容不等于当前需要显示的内容时,则需要显示正确的内容
*/
var nowShow = this.nowTrackShow;
if (nowShow['sn'] != nowTrack['sn']) {
this.trackHide();
this.trackShow(nowTrack);
this.nowTrackTemp = nowTrack;
}
} else {
/*
如果当前播放时间不在当前编号字幕内,则需要先清空当前的字幕内容,再显示新的字幕内容
*/
this.trackHide();
this.checkTrack();
}
},
trackShowAgain: function () {
this.trackHide();
this.trackShow(this.nowTrackTemp);
},
/*
内部函数
显示字幕内容
*/
trackShow: function (track) {
this.nowTrackShow = track;
var arr = track['content'];
for (var i = 0; i < arr.length; i++) {
var obj = {
list: [{
type: 'text',
text: arr[i],
color: this.ckStyle['cktrack']['color'],
size: this.ckStyle['cktrack']['size'],
fontFamily: this.ckStyle['cktrack']['font'],
lineHeight: this.ckStyle['cktrack']['leading'] + 'px'
}],
position: [1, 2, null, -(arr.length - i) * this.ckStyle['cktrack']['leading'] - this.ckStyle['cktrack']['marginBottom']]
};
var ele = this.addElement(obj);
this.trackElement.push(ele);
}
},
/*
内部函数
隐藏字幕内容
*/
trackHide: function () {
for (var i = 0; i < this.trackElement.length; i++) {
this.deleteElement(this.trackElement[i]);
}
this.trackElement = [];
},
/*
内部函数
重新计算字幕的编号
*/
checkTrack: function () {
var num = this.trackIndex;
var arr = this.track;
var i = 0;
for (i = num; i < arr.length; i++) {
if (this.time >= arr[i]['startTime'] && this.time <= arr[i]['endTime']) {
this.trackIndex = i;
break;
}
}
},
/*
-----------------------------------------------------------------------------接口函数开始
接口函数
在播放和暂停之间切换
*/
playOrPause: function () {
if (!this.loaded) {
return;
}
if (this.V == null) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.playOrPause();
return;
}
if (this.V.paused) {
this.videoPlay();
} else {
this.videoPause();
}
},
/*
接口函数
播放动作
*/
videoPlay: function () {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.videoPlay();
return;
}
if (this.adPlayerPlay) {
this.eliminateAd(); //清除广告
return;
}
try {
if (this.V.currentSrc) {
this.V.play();
}
} catch (event) { }
},
/*
接口函数
暂停动作
*/
videoPause: function () {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.videoPause();
return;
}
try {
this.V.pause();
} catch (event) { }
},
/*
接口函数
跳转时间动作
*/
videoSeek: function (time) {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.videoSeek(time);
return;
}
var duration = this.V.duration > 0.2 ? this.V.duration : this.getMetaDate()['duration'];
if (duration > 0 && time > duration) {
if (this.vars['forceduration'] > 0) {
time = 0;
this.sendJS('ended');
}
else {
time = duration - 0.1;
}
}
if (time >= 0) {
this.V.currentTime = time;
this.sendJS('seekTime', time);
}
},
/*
接口函数
调节音量/获取音量
*/
changeVolume: function (vol, bg, button) {
if (this.loaded) {
if (this.playerType == 'flashplayer') {
this.V.changeVolume(vol);
return;
}
}
if (isNaN(vol) || this.isUndefined(vol)) {
vol = 0;
}
if (!this.loaded) {
this.vars['volume'] = vol;
}
if (!this.html5Video) {
this.V.changeVolume(vol);
return;
}
try {
if (this.isUndefined(bg)) {
bg = true;
}
} catch (e) { }
try {
if (this.isUndefined(button)) {
button = true;
}
} catch (e) { }
if (!vol) {
vol = 0;
}
if (vol < 0) {
vol = 0;
}
if (vol > 1) {
vol = 1;
}
try {
this.V.volume = vol;
} catch (error) { }
this.volume = vol;
if (bg && this.conBarShow) {
var bgW = vol * this.CB['volumeBg'].offsetWidth;
if (bgW < 0) {
bgW = 0;
}
if (bgW > this.CB['volumeBg'].offsetWidth) {
bgW = this.CB['volumeBg'].offsetWidth;
}
this.css(this.CB['volumeUp'], 'width', bgW + 'px');
}
if (button && this.conBarShow) {
var buLeft = parseInt(this.CB['volumeUp'].offsetWidth - (this.CB['volumeBO'].offsetWidth * 0.5));
if (buLeft > this.CB['volumeBg'].offsetWidth - this.CB['volumeBO'].offsetWidth) {
buLeft = this.CB['volumeBg'].offsetWidth - this.CB['volumeBO'].offsetWidth
}
if (buLeft < 0) {
buLeft = 0;
}
this.css(this.CB['volumeBO'], 'left', buLeft + 'px');
}
},
/*
接口函数
静音
*/
videoMute: function () {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.videoMute();
return;
}
this.volumeTemp = this.V ? (this.V.volume > 0 ? this.V.volume : this.vars['volume']) : this.vars['volume'];
this.changeVolume(0);
},
/*
接口函数
取消静音
*/
videoEscMute: function () {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.videoEscMute();
return;
}
this.changeVolume(this.volumeTemp > 0 ? this.volumeTemp : this.vars['volume']);
},
/*
接口函数
视频广告静音
*/
adMute: function () {
if (!this.loaded) {
return;
}
this.changeVolume(0);
this.adVideoMute = true;
this.css(this.CB['adEscMute'], 'display', 'block');
this.css(this.CB['adMute'], 'display', 'none');
},
/*
接口函数
视频广告取消静音
*/
escAdMute: function () {
if (!this.loaded) {
return;
}
var v = this.ckStyle['advertisement']['videoVolume'];
this.changeVolume(v);
this.adMuteInto();
},
/*
初始化广告的音量按钮
*/
adMuteInto: function () {
this.adVideoMute = false;
this.css(this.CB['adEscMute'], 'display', 'none');
this.css(this.CB['adMute'], 'display', 'block');
},
/*
接口函数
快退
*/
fastBack: function () {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.fastBack();
return;
}
var time = this.time - this.ckConfig['config']['timeJump'];
if (time < 0) {
time = 0;
}
this.videoSeek(time);
},
/*
接口函数
快进
*/
fastNext: function () {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.fastNext();
return;
}
var time = this.time + this.ckConfig['config']['timeJump'];
if (time > this.V.duration) {
time = this.V.duration;
}
this.videoSeek(time);
},
/*
接口函数
获取当前播放的地址
*/
getCurrentSrc: function () {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
return this.V.getCurrentSrc();
}
return this.V.currentSrc;
},
/*
内置函数
全屏/退出全屏动作,该动作只能是用户操作才可以触发,比如用户点击按钮触发该事件
*/
switchFull: function () {
if (this.full) {
this.quitFullScreen();
} else {
this.fullScreen();
}
},
/*
内置函数
全屏动作,该动作只能是用户操作才可以触发,比如用户点击按钮触发该事件
*/
fullScreen: function () {
if (this.html5Video && this.playerType == 'html5video') {
var element = this.PD;
if (element.requestFullscreen) {
element.requestFullscreen();
} else if (element.mozRequestFullScreen) {
element.mozRequestFullScreen();
} else if (element.webkitRequestFullscreen) {
element.webkitRequestFullscreen();
} else if (element.msRequestFullscreen) {
element.msRequestFullscreen();
} else if (element.oRequestFullscreen) {
element.oRequestFullscreen();
}
this.judgeFullScreen();
} else {
//this.V.fullScreen();
}
},
/*
接口函数
退出全屏动作
*/
quitFullScreen: function () {
if (this.html5Video && this.playerType == 'html5video') {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.oRequestFullscreen) {
document.oCancelFullScreen();
} else if (document.requestFullscreen) {
document.requestFullscreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
} else {
this.css(document.documentElement, 'cssText', '');
this.css(document.document.body, 'cssText', '');
this.css(this.PD, 'cssText', '');
}
this.judgeFullScreen();
}
},
/*
下面列出只有flashplayer里支持的
*/
videoRotation: function (n) {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.videoRotation(n);
return;
}
if (this.isUndefined(n)) {
n = 0;
}
var tf = this.css(this.V, 'transform');
if (this.isUndefined(tf) && !tf) {
tf = 'rotate(0deg)';
}
var reg = tf.match(/rotate\([^)]+\)/);
reg = reg ? reg[0].replace('rotate(', '').replace('deg)', '') : '';
if (reg == '') {
reg = 0;
} else {
reg = parseInt(reg);
}
if (n == -1) {
reg -= 90;
} else if (n == 1) {
reg += 90;
} else {
if (n != 90 && n != 180 && n != 270 && n != -90 && n != -180 && n != -270) {
reg = 0;
} else {
reg = n;
}
}
n = reg;
var y90 = n % 90,
y180 = n % 180,
y270 = n % 270;
var ys = false;
if (y90 == 0 && y180 == 90 && y270 == 90) {
ys = true;
}
if (y90 == 0 && y180 == 90 && y270 == 0) {
ys = true;
}
if (y90 == -0 && y180 == -90 && y270 == -90) {
ys = true;
}
if (y90 == -0 && y180 == -90 && y270 == -0) {
ys = true;
}
tf = tf.replace(/rotate\([^)]+\)/, '').replace(/scale\([^)]+\)/, '') + ' rotate(' + n + 'deg)';
var cdW = this.CD.offsetWidth,
cdH = this.CD.offsetHeight,
vW = this.V.videoWidth,
vH = this.V.videoHeight;
if (vW > 0 && vH > 0) {
if (ys) {
if (cdW / cdH > vH / vW) {
nH = cdH;
nW = vH * nH / vW;
} else {
nW = cdW;
nH = vW * nW / vH;
}
this.css(this.V, 'transform', 'rotate(0deg)');
this.css(this.V, 'transform', 'scale(' + nH / cdW + ',' + nW / cdH + ')' + tf);
} else {
this.css(this.V, 'transform', tf);
}
} else {
this.css(this.V, 'transform', tf);
}
return;
},
videoBrightness: function (n) {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.videoBrightness(n);
return;
}
},
videoContrast: function (n) {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.videoContrast(n);
return;
}
},
videoSaturation: function (n) {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.videoSaturation(n);
return;
}
},
videoHue: function (n) {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.videoHue(n);
return;
}
},
videoZoom: function (n) {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.videoZoom(n);
return;
}
if (this.isUndefined(n)) {
n = 1;
}
if (n < 0) {
n = 0;
}
if (n > 2) {
n = 2;
}
var tf = this.css(this.V, 'transform');
tf = tf.replace(/scale\([^)]+\)/, '') + ' scale(' + n + ')';
this.videoScale = n;
this.css(this.V, 'transform', tf);
return;
},
videoProportion: function (w, h) {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.videoProportion(w, h);
return;
}
},
adPlay: function () {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.adPlay();
return;
}
if (this.adPlayerPlay) {
this.adIsPause = false;
var ad = this.getNowAdvertisements();
var type = ad['type'];
if (this.isStrImage(type)) {
this.adCountDown();
} else {
this.V.play();
}
}
},
adPause: function () {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.adPause();
return;
}
if (this.adPlayerPlay) {
this.adIsPause = true;
var ad = this.getNowAdvertisements();
var type = ad['type'];
if (type != 'jpg' && type != 'jpeg' && type != 'png' && type != 'svg' && type != 'gif') {
this.videoPause();
}
}
},
videoError: function (n) {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.videoError(n);
return;
}
},
changeConfig: function () {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
var args = Array.prototype.slice.call(arguments);
switch (args.length) {
case 1:
this.V.changeConfig(args[0]);
break;
case 2:
this.V.changeConfig(args[0], args[1]);
break;
case 3:
this.V.changeConfig(args[0], args[1], args[2]);
break;
case 4:
this.V.changeConfig(args[0], args[1], args[2], args[3]);
break;
case 5:
this.V.changeConfig(args[0], args[1], args[2], args[3], args[4]);
break;
case 6:
this.V.changeConfig(args[0], args[1], args[2], args[3], args[4], args[5]);
break;
case 7:
this.V.changeConfig(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
break;
case 8:
this.V.changeConfig(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);
break;
case 8:
this.V.changeConfig(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]);
break;
}
return;
}
var obj = this.ckConfig;
var arg = arguments;
for (var i = 0; i < arg.length - 1; i++) {
if (obj.hasOwnProperty(arg[i])) {
obj = obj[arg[i]];
} else {
return;
}
}
var val = arg[arg.length - 1];
switch (arg.length) {
case 2:
this.ckConfig[arg[0]] = val;
break;
case 3:
this.ckConfig[arg[0]][arg[1]] = val;
break;
case 4:
this.ckConfig[arg[0]][arg[1]][arg[2]] = val;
break;
case 5:
this.ckConfig[arg[0]][arg[1]][arg[2]][arg[3]] = val;
break;
case 6:
this.ckConfig[arg[0]][arg[1]][arg[2]][arg[3]][arg[4]] = val;
break;
case 7:
this.ckConfig[arg[0]][arg[1]][arg[2]][arg[3]][arg[4]][arg[5]] = val;
break;
case 8:
this.ckConfig[arg[0]][arg[1]][arg[2]][arg[3]][arg[4]][arg[5]][arg[6]] = val;
break;
case 9:
this.ckConfig[arg[0]][arg[1]][arg[2]][arg[3]][arg[4]][arg[5]][arg[6]][arg[7]] = val;
break;
case 10:
this.ckConfig[arg[0]][arg[1]][arg[2]][arg[3]][arg[4]][arg[5]][arg[6]][arg[7]][arg[8]] = val;
break;
default:
break;
}
this.sendJS('configChange', this.ckConfig);
},
custom: function () {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.custom(arguments);
return;
}
if (this.isUndefined(arguments)) {
return;
}
var type = '', name = '', display = '';
if (arguments.length == 4) {//控制栏
type = 'controlBar-' + arguments[1];
name = arguments[2];
display = arguments[3] ? 'block' : 'none';
}
else if (arguments.length == 3) {//播放器
type = 'player-' + arguments[0];
name = arguments[1];
display = arguments[2] ? 'block' : 'none';
}
else {
return;
}
for (var k in this.customeElement) {
var obj = this.customeElement[k];
if (obj['type'] == type && obj['name'] == name) {
this.css(obj['ele'], 'display', display);
}
}
},
getConfig: function () {
if (!this.loaded) {
return null;
}
if (this.playerType == 'flashplayer') {
return this.V.getConfig(arguments);
}
else {
var temp = this.ckConfig;
for (var index in arguments) {
try {
temp = temp[arguments[index]];
}
catch (error) {
temp = null;
}
};
return temp;
}
},
openUrl: function (n) {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.openUrl(n);
return;
}
},
/*
接口函数
清除视频
*/
videoClear: function () {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.videoClear();
return;
}
this.V.innerHTML = '';
this.V.src = '';
},
/*
接口函数
向播放器传递新的视频地址
*/
newVideo: function (c) {
if (this.playerType == 'flashplayer') {
this.V.newVideo(c);
return;
} else {
this.embed(c);
}
},
/*
接口函数
截图
*/
screenshot: function (obj, save, name) {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
try {
this.V.screenshot(obj, save, name);
} catch (error) {
this.log(error);
}
return;
}
if (obj == 'video') {
var newCanvas = document.createElement('canvas');
newCanvas.width = this.V.videoWidth;
newCanvas.height = this.V.videoHeight;
newCanvas.getContext('2d').drawImage(this.V, 0, 0, this.V.videoWidth, this.V.videoHeight);
try {
var base64 = newCanvas.toDataURL('image/jpeg');
this.sendJS('screenshot', {
object: obj,
save: save,
name: name,
base64: base64
});
} catch (error) {
this.log(error);
}
}
},
/*
接口函数
改变播放器尺寸
*/
changeSize: function (w, h) {
if (this.isUndefined(w)) {
w = 0;
}
if (this.isUndefined(h)) {
h = 0;
}
if (w > 0) {
this.css(this.CD, 'width', w + 'px');
}
if (h > 0) {
this.css(this.CD, 'height', h + 'px');
}
if (this.html5Video) {
this.playerResize();
}
},
/*
重置播放器界面
*/
playerResize: function () {
this.controlBar();//控制栏按钮
this.elementCoordinate();
this.carbarButton();
this.customCoor();//自定义元件的位置重置
this.timeProgressDefault();//进度条默认样式
this.videoCss();//计算video的宽高和位置
this.timeUpdateHandler();//修改进度条样式
this.changeElementCoor(); //修改新加元件的坐标
this.changePrompt();//重置提示点
this.advertisementStyle();//广告控制样式
this.adPauseCoor();
this.adOtherCoor();
this.changeLoad();
this.sendJS('resize');
},
/*
接口函数
改变视频播放速度
*/
changePlaybackRate: function (n) {
if (this.html5Video) {
var arr = this.playbackRateArr;
n = parseInt(n);
if (n < arr.length) {
this.newPlaybackrate(arr[n][1]);
}
}
},
/*
内部函数
注册控制控制栏显示与隐藏函数
*/
changeControlBarShow: function (show) {
if (!this.loaded) {
return;
}
if (this.playerType == 'flashplayer') {
this.V.changeControlBarShow(show);
return;
}
if (show) {
this.controlBarIsShow = true;
this.controlBarHide(false);
} else {
this.controlBarIsShow = false;
this.controlBarHide(true);
}
},
/*
-----------------------------------------------------------------------
调用flashplayer
*/
embedSWF: function () {
var vid = 'ckplayer-' + this.randomString();
var flashvars = this.getFlashVars();
var param = this.getFlashplayerParam();
var flashplayerUrl = 'http://www.macromedia.com/go/getflashplayer';
var html = '',
src = ckplayerPath + 'ckplayer.swf';
id = 'id="' + vid + '" name="' + vid + '" ';
html += '<object pluginspage="' + flashplayerUrl + '" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=11,3,0,0" width="100%" height="100%" ' + id + ' align="middle" wmode="transparent">';
html += param['v'];
html += '<param name="movie" value="' + src + '">';
html += '<param name="flashvars" value="' + flashvars + '">';
html += '<param name="wmode" value="transparent">';
html += '<embed wmode="transparent" ' + param['w'] + ' src="' + src + '" flashvars="' + flashvars + '" width="100%" height="100%" ' + id + ' align="middle" type="application/x-shockwave-flash" pluginspage="' + flashplayerUrl + '" />';
html += '</object>';
this.PD.innerHTML = html;
this.V = this.getObjectById(vid); //V定义播放器对象全局变量
this.playerType = 'flashplayer';
},
/*
判断浏览器是否支持flashplayer
*/
checkShockwaveFlash: function () {
if (window.ActiveXObject) {
try {
var s = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
if (s) {
return true;
}
} catch (e) { }
} else {
try {
var s = navigator.plugins['Shockwave Flash'];
if (s) {
return true;
}
} catch (e) { }
}
return false;
},
/*
内置函数
将vars对象转换成字符
*/
getFlashVars: function () {
this.getVarsObject();
var v = this.vars;
var z = '';
for (k in v) {
if (k != 'flashplayer' && k != 'container' && v[k] != '') {
if (z != '') {
z += '&';
}
var vk = v[k];
if (vk == true) {
vk = 1;
}
if (vk == false) {
vk = 0;
}
z += k + '=' + vk;
}
}
if (!v.hasOwnProperty('volume') || !v['volume']) {
if (z != '') {
z += '&';
}
z += 'volume=0';
}
return z;
},
/*判断字符串是否是图片*/
isStrImage: function (s) {
if (s == 'jpg' || s == 'jpeg' || s == 'png' || s == 'svg' || s == 'gif') {
return true;
}
return false;
},
/*
内置函数
将vars格式化成flash能接受的对象。再由getFlashVars函数转化成字符串或由newVideo直接使用
*/
getVarsObject: function () {
var v = this.vars;
var f = '',
d = '',
w = ''; //f=视频地址d=清晰度地址,w=权重z=最终地址
var arr = this.VA;
var prompt = v['promptSpot'];
var i = 0;
var video = this.vars['video'];
if (this.varType(video) == 'array') { //对象或数组
var arr = video;
for (i = 0; i < arr.length; i++) {
var arr2 = arr[i];
if (arr2) {
if (f != '') {
f += this.ckConfig['config']['split'];
d += ',';
w += ',';
v['type'] += this.ckConfig['config']['split'];
}
f += encodeURIComponent(decodeURIComponent(arr2[0]));
d += arr2[2];
w += arr2[3];
v['type'] += arr2[1].replace('video/', '');
}
}
}
else if (this.varType(video) == 'object') { //对象或数组
f = encodeURIComponent(decodeURIComponent(video['file']));
if (!this.isUndefined(video['type'])) {
v['type'] = video['type'];
}
d = '';
w = '';
}
else {
f = encodeURIComponent(decodeURIComponent(video));
}
if (v['preview'] != null) {
v['previewscale'] = v['preview']['scale'];
v['preview'] = v['preview']['file'].join(',');
}
if (prompt != null) {
v['promptspot'] = '';
v['promptspottime'] = '';
for (i = 0; i < prompt.length; i++) {
if (v['promptspot'] != '') {
v['promptspot'] += ',';
v['promptspottime'] += ',';
}
v['promptspot'] += prompt[i]['words'];
v['promptspottime'] += prompt[i]['time'];
}
}
if (f != '') {
v['video'] = f;
v['definition'] = d;
v['weight'] = w;
}
if (!v['volume']) {
v['volume'] = 0;
}
var newV = {};
for (var k in v) {
if (v[k] != null) {
newV[k] = v[k];
}
if (k == 'type') {
newV[k] = v[k].replace('video/m3u8', 'm3u8');
}
}
this.vars = newV;
},
/*
内置函数
将embedSWF里的param的对象进行转换
*/
getFlashplayerParam: function () {
var w = '',
v = '',
o = {
allowScriptAccess: 'always',
allowFullScreen: true,
quality: 'high',
bgcolor: '#000'
};
for (var e in o) {
w += e + '="' + o[e] + '" ';
v += '<param name="' + e + '" value="' + o[e] + '" />';
}
w = w.replace('movie=', 'src=');
return {
w: w,
v: v
};
},
/*
操作动作结束
-----------------------------------------------------------------------
接口函数
获取元数据部分
*/
getMetaDate: function () {
if (!this.loaded || this.V == null) {
return false;
}
if (this.playerType == 'html5video') {
var duration = 0;
try {
duration = !isNaN(this.V.duration) ? this.V.duration : 0;
if (isNaN(duration) || parseInt(duration) < 0.2) {
if (this.vars['duration'] > 0) {
duration = this.vars['duration'];
}
}
if (this.vars['forceduration'] > 0) {
duration = this.vars['forceduration'];
}
} catch (event) {
this.log(event);
}
var data = {
duration: duration,
volume: this.V.volume,
playbackRate: this.V.playbackRate,
width: this.PD.offsetWidth || this.V.offsetWidth || this.V.width,
height: this.PD.offsetHeight || this.V.offsetHeight || this.V.height,
streamWidth: this.V.videoWidth,
streamHeight: this.V.videoHeight,
videoWidth: this.V.offsetWidth,
videoHeight: this.V.offsetHeight,
paused: this.V.paused,
loadTime: this.loadTimeTemp
};
return data;
} else {
try {
return this.V.getMetaDate();
} catch (event) {
this.log(event);
}
}
return false;
},
/*
接口函数
取当前提供给播放器播放的视频列表
*/
getVideoUrl: function () {
if (this.playerType == 'flashplayer') {
return this.V.getVideoUrl();
}
var arr = [];
if (this.V.src) {
arr.push(this.V.src);
} else {
var uArr = this.V.childNodes;
for (var i = 0; i < uArr.length; i++) {
arr.push(uArr[i].src);
}
}
return arr;
},
/*
内置函数
格式化函数
*/
clickEvent: function (call) {
if (call == 'none' || call == '' || call == null) {
return {
type: 'none'
};
}
var callArr = call.split('->');
var type = '',
fun = '',
link = '',
target = '';
if (callArr.length == 2) {
var callM = callArr[0];
var callE = callArr[1];
if (!callE) {
return {
type: 'none'
};
}
var val = '';
var eArr = [];
type = callM;
switch (callM) {
case 'actionScript':
//trace(THIS.hasOwnProperty(callE));
if (callE.indexOf('(') > -1) {
eArr = callE.split('(');
callE = eArr[0];
val = eArr[1].replace(')', '');
}
if (val == '') {
fun = 'thisTemp.' + callE + '()';
} else {
fun = 'thisTemp.' + callE + '(' + val + ')';
}
break;
case 'javaScript':
if (callE.substr(0, 11) == '[flashvars]') {
callE = callE.substr(11);
if (this.vars.hasOwnProperty(callE)) {
callE = this.vars[callE];
} else {
break;
}
}
if (callE.indexOf('(') > -1) {
eArr = callE.split('(');
callE = eArr[0];
val = eArr[1].replace(')', '');
}
if (val == '') {
fun = callE + '()';
} else {
fun = callE + '(' + val + ')';
}
break;
case "link":
var callLink = (callE + ',').split(',');
if (callLink[0].substr(0, 11) == '[flashvars]') {
var fl = callLink[0].replace('[flashvars]', '');
if (this.vars.hasOwnProperty(fl)) {
callLink[0] = this.vars[fl];
} else {
break;
}
}
if (!callLink[1]) {
callLink[1] = '_blank';
}
link = callLink[0];
target = callLink[1];
break;
}
}
return {
type: type,
fun: fun,
link: link,
target: target
}
},
/*
内置函数
根据指定的align,valign,offsetX,offsetY计算坐标
*/
getPosition: function (obj, rEle) {
/*
{
"align": "right",
"vAlign": "right",
"offsetX": -60,
"offsetY": -60
}
*/
var pw = this.PD.offsetWidth,
ph = this.PD.offsetHeight;
var x = 0,
y = 0;
var left = 0, top = 0, rw = 0, rh = 0;
if (!this.isUndefined(rEle)) {
left = parseInt(this.css(rEle, 'left')), top = parseInt(this.css(rEle, 'top')), rw = rEle.offsetWidth, rh = rEle.offsetHeight;
}
switch (obj['align']) {
case 'left':
x = obj['offsetX'] + left;
break;
case 'center':
x = pw * 0.5 + obj['offsetX'];
if (left) {
x -= (pw * 0.5 - rw * 0.5 - left);
}
break;
case 'right':
x = pw + obj['offsetX'];
if (left) {
x -= (pw - left - rw);
}
break;
}
switch (obj['vAlign']) {
case 'top':
y = obj['offsetY'] + top;
break;
case 'middle':
y = ph * 0.5 + obj['offsetY'] - top - (rh * 0.5);
if (top) {
x -= (ph * 0.5 - rh * 0.5 - top);
}
break;
case 'bottom':
y = ph + obj['offsetY'];
if (top) {
y -= (ph - top - rh);
}
break;
}
return {
x: x,
y: y
};
},
/*
内置函数
向播放器界面添加一个文本
*/
addElement: function (attribute) {
var thisTemp = this;
if (this.playerType == 'flashplayer') {
return this.V.addElement(attribute);
}
var i = 0;
var obj = {
list: null,
x: '100%',
y: "50%",
position: null,
alpha: 1,
backgroundColor: '',
backAlpha: 1,
backRadius: 0,
clickEvent: ''
};
obj = this.standardization(obj, attribute);
var list = obj['list'];
if (list == null) {
return '';
}
var id = 'element-' + this.randomString(10);
var ele = document.createElement('div');
ele.className = id;
if (obj['x']) {
ele.setAttribute('data-x', obj['x']);
}
if (obj['y']) {
ele.setAttribute('data-y', obj['y']);
}
if (obj['position'] != null) {
ele.setAttribute('data-position', obj['position'].join(','));
}
this.PD.appendChild(ele);
this.css(ele, {
position: 'absolute',
filter: 'alpha(opacity:' + obj['alpha'] + ')',
opacity: obj['alpha'].toString(),
width: '800px',
zIndex: '20'
});
var bgid = 'elementbg' + this.randomString(10);
var bgAlpha = obj['alpha'].toString();
var bgColor = obj['backgroundColor'].replace('0x', '#');
var html = '';
var idArr = [];
var clickArr = [];
if (!this.isUndefined(list) && list.length > 0) {
var textObj, returnObj, clickEvent;
for (i = 0; i < list.length; i++) {
var newEleid = 'elementnew' + this.randomString(10);
switch (list[i]['type']) {
case 'image':
case 'png':
case 'jpg':
case 'jpeg':
case 'gif':
textObj = {
type: 'image',
file: '',
radius: 0,//圆角弧度
width: 30,//定义宽,必需要定义
height: 30,//定义高,必需要定义
alpha: 1,//透明度
paddingLeft: 0,//左边距离
paddingRight: 0,//右边距离
paddingTop: 0,
paddingBottom: 0,
marginLeft: 0,
marginRight: 0,
marginTop: 0,
marginBottom: 0,
backgroundColor: '',
clickEvent: ''
};
list[i] = this.standardization(textObj, list[i]);
clickEvent = this.clickEvent(list[i]['clickEvent']);
clickArr.push(clickEvent);
if (clickEvent['type'] == 'link') {
html += '<div class="' + newEleid + '" data-i="' + i + '"><a href="' + clickEvent['link'] + '" target="' + clickEvent['target'] + '"><img class="' + newEleid + '_image" src="' + list[i]['file'] + '" style="border:0;"></a></div>';
} else {
html += '<div class="' + newEleid + '" data-i="' + i + '"><img class="' + newEleid + '_image" src="' + list[i]['file'] + '" style="border:0;"></div>';
}
break;
case 'text':
textObj = {
type: 'text',//说明是文本
text: '',//文本内容
color: '0xFFFFFF',
size: 14,
fontFamily: this.fontFamily,
leading: 0,
alpha: 1,//透明度
paddingLeft: 0,//左边距离
paddingRight: 0,//右边距离
paddingTop: 0,
paddingBottom: 0,
marginLeft: 0,
marginRight: 0,
marginTop: 0,
marginBottom: 0,
backgroundColor: '',
backAlpha: 1,
backRadius: 0,//背景圆角弧度,支持数字统一设置,也支持分开设置[30,20,20,50],对应上左,上右,下右,下左
clickEvent: ''
};
list[i] = this.standardization(textObj, list[i]);
clickEvent = this.clickEvent(list[i]['clickEvent']);
clickArr.push(clickEvent);
if (clickEvent['type'] == 'link') {
html += '<div class="' + newEleid + '" data-i="' + i + '"><div class="' + newEleid + '_bg"></div><div class="' + newEleid + '_text"><a href="' + clickEvent['link'] + '" target="' + clickEvent['target'] + '">' + list[i]['text'] + '</a></div></div>';
} else {
html += '<div class="' + newEleid + '" data-i="' + i + '"><div class="' + newEleid + '_bg"></div><div class="' + newEleid + '_text">' + list[i]['text'] + '</div></div>';
}
break;
default:
break;
}
idArr.push(newEleid);
}
}
var objClickEvent = this.clickEvent(obj['clickEvent']);
ele.innerHTML = '<div class="' + bgid + '"></div><div class="' + bgid + '_c">' + html + '</div>';
if (objClickEvent['type'] == 'javaScript' || objClickEvent['type'] == 'actionScript') {
var objClickHandler = function () {
eval(objClickEvent['fun']);
thisTemp.sendJS('clickEvent', clk['type'] + '->' + clk['fun'].replace('thisTemp.', '').replace('()', ''));
};
this.addListenerInside('click', objClickHandler, this.getByElement(bgid + '_c'))
}
this.css(bgid + '_c', {
position: 'absolute',
zIndex: '2'
});
for (i = 0; i < idArr.length; i++) {
var clk = clickArr[i];
if (clk['type'] == 'javaScript' || clk['type'] == 'actionScript') {
var clickHandler = function () {
//clk = clickArr[this.getAttribute('data-i')];
clk = clickArr[thisTemp.getDataset(this, 'i')];
eval(clk['fun']);
thisTemp.sendJS('clickEvent', clk['type'] + '->' + clk['fun'].replace('thisTemp.', '').replace('()', ''));
};
this.addListenerInside('click', clickHandler, this.getByElement(idArr[i]))
}
switch (list[i]['type']) {
case 'image':
case 'png':
case 'jpg':
case 'jpeg':
case 'gif':
this.css(idArr[i], {
float: 'left',
width: list[i]['width'] + 'px',
height: list[i]['height'] + 'px',
filter: 'alpha(opacity:' + list[i]['alpha'] + ')',
opacity: list[i]['alpha'].toString(),
marginLeft: list[i]['marginLeft'] + 'px',
marginRight: list[i]['marginRight'] + 'px',
marginTop: list[i]['marginTop'] + 'px',
marginBottom: list[i]['marginBottom'] + 'px',
borderRadius: list[i]['radius'] + 'px',
cursor: 'pointer'
});
this.css(idArr[i] + '_image', {
width: list[i]['width'] + 'px',
height: list[i]['height'] + 'px',
borderRadius: list[i]['radius'] + 'px'
});
break;
case 'text':
this.css(idArr[i] + '_text', {
filter: 'alpha(opacity:' + list[i]['alpha'] + ')',
opacity: list[i]['alpha'].toString(),
borderRadius: list[i]['radius'] + 'px',
fontFamily: list[i]['font'],
fontSize: list[i]['size'] + 'px',
color: list[i]['color'].replace('0x', '#'),
lineHeight: list[i]['leading'] > 0 ? list[i]['leading'] + 'px' : '',
paddingLeft: list[i]['paddingLeft'] + 'px',
paddingRight: list[i]['paddingRight'] + 'px',
paddingTop: list[i]['paddingTop'] + 'px',
paddingBottom: list[i]['paddingBottom'] + 'px',
whiteSpace: 'nowrap',
position: 'absolute',
zIndex: '3',
cursor: 'pointer'
});
this.css(idArr[i], {
float: 'left',
width: this.getByElement(idArr[i] + '_text').offsetWidth + 'px',
height: this.getByElement(idArr[i] + '_text').offsetHeight + 'px',
marginLeft: list[i]['marginLeft'] + 'px',
marginRight: list[i]['marginRight'] + 'px',
marginTop: list[i]['marginTop'] + 'px',
marginBottom: list[i]['marginBottom'] + 'px'
});
this.css(idArr[i] + '_bg', {
width: this.getByElement(idArr[i] + '_text').offsetWidth + 'px',
height: this.getByElement(idArr[i] + '_text').offsetHeight + 'px',
filter: 'alpha(opacity:' + list[i]['backAlpha'] + ')',
opacity: list[i]['backAlpha'].toString(),
borderRadius: list[i]['backRadius'] + 'px',
backgroundColor: list[i]['backgroundColor'].replace('0x', '#'),
position: 'absolute',
zIndex: '2'
});
break;
default:
break;
}
}
this.css(bgid, {
width: this.getByElement(bgid + '_c').offsetWidth + 'px',
height: this.getByElement(bgid + '_c').offsetHeight + 'px',
position: 'absolute',
filter: 'alpha(opacity:' + bgAlpha + ')',
opacity: bgAlpha,
backgroundColor: bgColor.replace('0x', '#'),
borderRadius: obj['backRadius'] + 'px',
zIndex: '1'
});
this.css(ele, {
width: this.getByElement(bgid).offsetWidth + 'px',
height: this.getByElement(bgid).offsetHeight + 'px'
});
var eidCoor = this.calculationCoor(ele);
this.css(ele, {
left: eidCoor['x'] + 'px',
top: eidCoor['y'] + 'px'
});
this.elementArr.push(ele.className);
return ele;
},
/*
内置函数
获取元件的属性包括x,y,width,height,alpha
*/
getElement: function (element) {
if (this.playerType == 'flashplayer') {
return this.V.getElement(element);
}
var ele = element;
if (this.varType(element) == 'string') {
ele = this.getByElement(element);
}
var coor = this.getCoor(ele);
return {
x: coor['x'],
y: coor['y'],
width: ele.offsetWidth,
height: ele.offsetHeight,
alpha: !this.isUndefined(this.css(ele, 'opacity')) ? parseFloat(this.css(ele, 'opacity')) : 1,
show: this.css(ele, 'display') == 'none' ? false : true
};
},
/*
内置函数
控制元件显示和隐藏
*/
elementShow: function (element, show) {
if (this.playerType == 'flashplayer') {
this.V.elementShow(element, show);
return;
}
if (this.varType(element) == 'string') {
if (element) {
this.css(ele, 'display', show == true ? 'block' : 'none');
} else {
var arr = this.elementTempArr;
for (var i = 0; i < arr.length; i++) {
this.css(arr[i], 'display', show == true ? 'block' : 'none');
}
}
}
},
/*
内置函数
根据节点的x,y计算在播放器里的坐标
*/
calculationCoor: function (ele) {
if (this.playerType == 'flashplayer') {
return this.V.calculationCoor(ele);
}
if (this.isUndefined(ele)) {
return;
}
if (ele == []) {
return;
}
var x, y, position = [];
var w = this.PD.offsetWidth,
h = this.PD.offsetHeight;
var ew = ele.offsetWidth,
eh = ele.offsetHeight;
if (!this.isUndefined(this.getDataset(ele, 'x'))) {
x = this.getDataset(ele, 'x');
}
if (!this.isUndefined(this.getDataset(ele, 'y'))) {
y = this.getDataset(ele, 'y');
}
if (!this.isUndefined(this.getDataset(ele, 'position'))) {
try {
position = this.getDataset(ele, 'position').toString().split(',');
} catch (event) { }
}
if (position.length > 0) {
position.push(null, null, null, null);
var i = 0;
for (i = 0; i < position.length; i++) {
if (this.isUndefined(position[i]) || position[i] == null || position[i] == 'null' || position[i] == '') {
position[i] = null;
} else {
position[i] = parseFloat(position[i]);
}
}
if (position[2] == null) {
switch (position[0]) {
case 0:
x = 0;
break;
case 1:
x = parseInt((w - ew) * 0.5);
break;
default:
x = w - ew;
break;
}
} else {
switch (position[0]) {
case 0:
x = position[2];
break;
case 1:
x = parseInt(w * 0.5) + position[2];
break;
default:
x = w + position[2];
break;
}
}
if (position[3] == null) {
switch (position[1]) {
case 0:
y = 0;
break;
case 1:
y = parseInt((h - eh) * 0.5);
break;
default:
y = h - eh;
break;
}
} else {
switch (position[1]) {
case 0:
y = position[3];
break;
case 1:
y = parseInt(h * 0.5) + position[3];
break;
default:
y = h + position[3];
break;
}
}
} else {
if (x.substring(x.length - 1, x.length) == '%') {
x = Math.floor(parseInt(x.substring(0, x.length - 1)) * w * 0.01);
}
if (y.substring(y.length - 1, y.length) == '%') {
y = Math.floor(parseInt(y.substring(0, y.length - 1)) * h * 0.01);
}
}
return {
x: x,
y: y
}
},
/*
内置函数
修改新增元件的坐标
*/
changeElementCoor: function () {
for (var i = 0; i < this.elementArr.length; i++) {
if (!this.isUndefined(this.getByElement(this.elementArr[i]))) {
if (this.getByElement(this.elementArr[i]) != []) {
var c = this.calculationCoor(this.getByElement(this.elementArr[i]));
if (c['x'] && c['y']) {
this.css(this.elementArr[i], {
top: c['y'] + 'px',
left: c['x'] + 'px'
});
}
}
}
}
},
/*
内置函数
缓动效果集
*/
tween: function () {
var Tween = {
None: { //均速运动
easeIn: function (t, b, c, d) {
return c * t / d + b;
},
easeOut: function (t, b, c, d) {
return c * t / d + b;
},
easeInOut: function (t, b, c, d) {
return c * t / d + b;
}
},
Quadratic: {
easeIn: function (t, b, c, d) {
return c * (t /= d) * t + b;
},
easeOut: function (t, b, c, d) {
return - c * (t /= d) * (t - 2) + b;
},
easeInOut: function (t, b, c, d) {
if ((t /= d / 2) < 1) return c / 2 * t * t + b;
return - c / 2 * ((--t) * (t - 2) - 1) + b;
}
},
Cubic: {
easeIn: function (t, b, c, d) {
return c * (t /= d) * t * t + b;
},
easeOut: function (t, b, c, d) {
return c * ((t = t / d - 1) * t * t + 1) + b;
},
easeInOut: function (t, b, c, d) {
if ((t /= d / 2) < 1) return c / 2 * t * t * t + b;
return c / 2 * ((t -= 2) * t * t + 2) + b;
}
},
Quartic: {
easeIn: function (t, b, c, d) {
return c * (t /= d) * t * t * t + b;
},
easeOut: function (t, b, c, d) {
return - c * ((t = t / d - 1) * t * t * t - 1) + b;
},
easeInOut: function (t, b, c, d) {
if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b;
return - c / 2 * ((t -= 2) * t * t * t - 2) + b;
}
},
Quintic: {
easeIn: function (t, b, c, d) {
return c * (t /= d) * t * t * t * t + b;
},
easeOut: function (t, b, c, d) {
return c * ((t = t / d - 1) * t * t * t * t + 1) + b;
},
easeInOut: function (t, b, c, d) {
if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b;
return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;
}
},
Sine: {
easeIn: function (t, b, c, d) {
return - c * Math.cos(t / d * (Math.PI / 2)) + c + b;
},
easeOut: function (t, b, c, d) {
return c * Math.sin(t / d * (Math.PI / 2)) + b;
},
easeInOut: function (t, b, c, d) {
return - c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;
}
},
Exponential: {
easeIn: function (t, b, c, d) {
return (t == 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;
},
easeOut: function (t, b, c, d) {
return (t == d) ? b + c : c * (- Math.pow(2, -10 * t / d) + 1) + b;
},
easeInOut: function (t, b, c, d) {
if (t == 0) return b;
if (t == d) return b + c;
if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b;
return c / 2 * (- Math.pow(2, -10 * --t) + 2) + b;
}
},
Circular: {
easeIn: function (t, b, c, d) {
return - c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;
},
easeOut: function (t, b, c, d) {
return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;
},
easeInOut: function (t, b, c, d) {
if ((t /= d / 2) < 1) return - c / 2 * (Math.sqrt(1 - t * t) - 1) + b;
return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;
}
},
Elastic: {
easeIn: function (t, b, c, d, a, p) {
if (t == 0) return b;
if ((t /= d) == 1) return b + c;
if (!p) p = d * .3;
if (!a || a < Math.abs(c)) {
a = c;
var s = p / 4;
} else var s = p / (2 * Math.PI) * Math.asin(c / a);
return - (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
},
easeOut: function (t, b, c, d, a, p) {
if (t == 0) return b;
if ((t /= d) == 1) return b + c;
if (!p) p = d * .3;
if (!a || a < Math.abs(c)) {
a = c;
var s = p / 4;
} else var s = p / (2 * Math.PI) * Math.asin(c / a);
return (a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b);
},
easeInOut: function (t, b, c, d, a, p) {
if (t == 0) return b;
if ((t /= d / 2) == 2) return b + c;
if (!p) p = d * (.3 * 1.5);
if (!a || a < Math.abs(c)) {
a = c;
var s = p / 4;
} else var s = p / (2 * Math.PI) * Math.asin(c / a);
if (t < 1) return - .5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b;
}
},
Back: {
easeIn: function (t, b, c, d, s) {
if (s == undefined) s = 1.70158;
return c * (t /= d) * t * ((s + 1) * t - s) + b;
},
easeOut: function (t, b, c, d, s) {
if (s == undefined) s = 1.70158;
return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;
},
easeInOut: function (t, b, c, d, s) {
if (s == undefined) s = 1.70158;
if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;
return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;
}
},
Bounce: {
easeIn: function (t, b, c, d) {
return c - Tween.Bounce.easeOut(d - t, 0, c, d) + b;
},
easeOut: function (t, b, c, d) {
if ((t /= d) < (1 / 2.75)) {
return c * (7.5625 * t * t) + b;
} else if (t < (2 / 2.75)) {
return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b;
} else if (t < (2.5 / 2.75)) {
return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b;
} else {
return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b;
}
},
easeInOut: function (t, b, c, d) {
if (t < d / 2) return Tween.Bounce.easeIn(t * 2, 0, c, d) * .5 + b;
else return Tween.Bounce.easeOut(t * 2 - d, 0, c, d) * .5 + c * .5 + b;
}
}
};
return Tween;
},
/*
接口函数
缓动效果
ele:Object=需要缓动的对象,
parameter:String=需要改变的属性x,y,width,height,alpha,
effect:String=效果名称,
start:Int=起始值,
end:Int=结束值,
speed:Number=运动的总秒数,支持小数
*/
animate: function (attribute) {
if (this.playerType == 'flashplayer') {
return this.V.animate(attribute);
}
var thisTemp = this;
var animateId = 'animate_' + this.randomString();
var obj = {
element: null,
parameter: 'x',
static: false,
effect: 'None.easeIn',
start: null,
end: null,
speed: 0,
overStop: false,
pauseStop: false,
//暂停播放时缓动是否暂停
callBack: null
};
obj = this.standardization(obj, attribute);
if (obj['element'] == null || obj['speed'] == 0) {
return false;
}
var w = this.PD.offsetWidth,
h = this.PD.offsetHeight;
var effArr = (obj['effect'] + '.').split('.');
var tweenFun = this.tween()[effArr[0]][effArr[1]];
var eleCoor = {
x: 0,
y: 0
};
if (this.isUndefined(tweenFun)) {
return false;
}
//先将该元件从元件数组里删除,让其不再跟随播放器的尺寸改变而改变位置
var def = this.arrIndexOf(this.elementArr, obj['element'].className);
if (def > -1) {
this.elementTempArr.push(obj['element'].className);
this.elementArr.splice(def, 1);
}
//var run = true;
var css = {};
//对传递的参数进行转化x和y转化成left,top
var pm = this.getElement(obj['element']); //包含x,y,width,height,alpha属性
var t = 0; //当前时间
var b = 0; //初始值
var c = 0; //变化量
var d = obj['speed'] * 1000; //持续时间
var timerTween = null;
var tweenObj = null;
var start = obj['start'] == null ? '' : obj['start'].toString();
var end = obj['end'] == null ? '' : obj['end'].toString();
switch (obj['parameter']) {
case 'x':
if (obj['start'] == null) {
b = pm['x'];
} else {
if (start.substring(start.length - 1, start.length) == '%') {
b = parseInt(start) * w * 0.01;
} else {
b = parseInt(start);
}
}
if (obj['end'] == null) {
c = pm['x'] - b;
} else {
if (end.substring(end.length - 1, end.length) == '%') {
c = parseInt(end) * w * 0.01 - b;
} else if (end.substring(0, 1) == '-' || end.substring(0, 1) == '+') {
if (this.varType(obj['end']) == 'number') {
c = parseInt(obj['end']) - b;
} else {
c = parseInt(end);
}
} else {
c = parseInt(end) - b;
}
}
break;
case 'y':
if (obj['start'] == null) {
b = pm['y'];
} else {
if (start.substring(start.length - 1, start.length) == '%') {
b = parseInt(start) * h * 0.01;
} else {
b = parseInt(start);
}
}
if (obj['end'] == null) {
c = pm['y'] - b;
} else {
if (end.substring(end.length - 1, end.length) == '%') {
c = parseInt(end) * h * 0.01 - b;
} else if (end.substring(0, 1) == '-' || end.substring(0, 1) == '+') {
if (this.varType(obj['end']) == 'number') {
c = parseInt(obj['end']) - b;
} else {
c = parseInt(end);
}
} else {
c = parseInt(end) - b;
}
}
break;
case 'alpha':
if (obj['start'] == null) {
b = pm['alpha'] * 100;
} else {
if (start.substring(start.length - 1, start.length) == '%') {
b = parseInt(obj['start']);
} else {
b = parseInt(obj['start'] * 100);
}
}
if (obj['end'] == null) {
c = pm['alpha'] * 100 - b;
} else {
if (end.substring(end.length - 1, end.length) == '%') {
c = parseInt(end) - b;
} else if (end.substring(0, 1) == '-' || end.substring(0, 1) == '+') {
if (this.varType(obj['end']) == 'number') {
c = parseInt(obj['end']) * 100 - b;
} else {
c = parseInt(obj['end']) * 100;
}
} else {
c = parseInt(obj['end']) * 100 - b;
}
}
break;
}
var callBack = function () {
var index = thisTemp.arrIndexOf(thisTemp.animateElementArray, animateId);
if (index > -1) {
thisTemp.animateArray.splice(index, 1);
thisTemp.animateElementArray.splice(index, 1);
}
index = thisTemp.arrIndexOf(thisTemp.animatePauseArray, animateId);
if (index > -1) {
thisTemp.animatePauseArray.splice(index, 1);
}
if (obj['callBack'] != null && obj['element'] && obj['callBack'] != 'callBack' && obj['callBack'] != 'tweenX' && obj['tweenY'] != 'callBack' && obj['callBack'] != 'tweenAlpha') {
var cb = eval(obj['callBack']);
cb(obj['element']);
obj['callBack'] = null;
}
};
var stopTween = function () {
if (timerTween != null) {
if (timerTween.runing) {
timerTween.stop();
}
timerTween = null;
}
};
var tweenX = function () {
if (t < d) {
t += 10;
css = {
left: Math.ceil(tweenFun(t, b, c, d)) + 'px'
};
if (obj['static']) {
eleCoor = thisTemp.calculationCoor(obj['element']);
css['top'] = eleCoor['y'] + 'px';
}
thisTemp.css(obj['element'], css);
} else {
stopTween();
try {
var defX = this.arrIndexOf(this.elementTempArr, obj['element'].className);
if (defX > -1) {
this.elementTempArr.splice(defX, 1);
}
} catch (event) { }
thisTemp.elementArr.push(obj['element'].className);
callBack();
}
};
var tweenY = function () {
if (t < d) {
t += 10;
css = {
top: Math.ceil(tweenFun(t, b, c, d)) + 'px'
};
if (obj['static']) {
eleCoor = thisTemp.calculationCoor(obj['element']);
css['left'] = eleCoor['x'] + 'px';
}
thisTemp.css(obj['element'], css);
} else {
stopTween();
try {
var defY = this.arrIndexOf(this.elementTempArr, obj['element'].className);
if (defY > -1) {
this.elementTempArr.splice(defY, 1);
}
} catch (event) { }
thisTemp.elementArr.push(obj['element'].className);
callBack();
}
};
var tweenAlpha = function () {
if (t < d) {
t += 10;
eleCoor = thisTemp.calculationCoor(obj['element']);
var ap = Math.ceil(tweenFun(t, b, c, d)) * 0.01;
css = {
filter: 'alpha(opacity:' + ap + ')',
opacity: ap.toString()
};
if (obj['static']) {
eleCoor = thisTemp.calculationCoor(obj['element']);
css['top'] = eleCoor['y'] + 'px';
css['left'] = eleCoor['x'] + 'px';
}
thisTemp.css(obj['element'], css);
} else {
stopTween();
try {
var defA = this.arrIndexOf(this.elementTempArr, obj['element'].className);
if (defA > -1) {
this.elementTempArr.splice(defA, 1);
}
} catch (event) { }
thisTemp.elementArr.push(obj['element'].className);
callBack();
}
};
switch (obj['parameter']) {
case 'x':
tweenObj = tweenX;
break;
case 'y':
tweenObj = tweenY;
break;
case 'alpha':
tweenObj = tweenAlpha;
break;
default:
break;
}
timerTween = new thisTemp.timer(10, tweenObj);
timerTween.callBackFunction = callBack;
if (obj['overStop']) {
var mouseOver = function () {
if (timerTween != null && timerTween.runing) {
timerTween.stop();
}
};
this.addListenerInside('mouseover', mouseOver, obj['element']);
var mouseOut = function () {
var start = true;
if (obj['pauseStop'] && thisTemp.getMetaDate()['paused']) {
start = false;
}
if (timerTween != null && !timerTween.runing && start) {
timerTween.start();
}
};
this.addListenerInside('mouseout', mouseOut, obj['element']);
}
this.animateArray.push(timerTween);
this.animateElementArray.push(animateId);
if (obj['pauseStop']) {
this.animatePauseArray.push(animateId);
}
return animateId;
},
/*
接口函数函数
继续运行animate
*/
animateResume: function (id) {
if (this.playerType == 'flashplayer') {
this.V.animateResume(this.isUndefined(id) ? '' : id);
return;
}
var arr = [];
if (id != '' && !this.isUndefined(id) && id != 'pause') {
arr.push(id);
} else {
if (id === 'pause') {
arr = this.animatePauseArray;
} else {
arr = this.animateElementArray;
}
}
for (var i = 0; i < arr.length; i++) {
var index = this.arrIndexOf(this.animateElementArray, arr[i]);
if (index > -1) {
this.animateArray[index].start();
}
}
},
/*
接口函数
暂停运行animate
*/
animatePause: function (id) {
if (this.playerType == 'flashplayer') {
this.V.animatePause(this.isUndefined(id) ? '' : id);
return;
}
var arr = [];
if (id != '' && !this.isUndefined(id) && id != 'pause') {
arr.push(id);
} else {
if (id === 'pause') {
arr = this.animatePauseArray;
} else {
arr = this.animateElementArray;
}
}
for (var i = 0; i < arr.length; i++) {
var index = this.arrIndexOf(this.animateElementArray, arr[i]);
if (index > -1) {
this.animateArray[index].stop();
}
}
},
/*
内置函数
根据ID删除数组里对应的内容
*/
deleteAnimate: function (id) {
if (this.playerType == 'flashplayer' && this.V) {
try {
this.V.deleteAnimate(id);
} catch (event) {
this.log(event);
}
return;
}
var index = this.arrIndexOf(this.animateElementArray, id);
if (index > -1) {
this.animateArray[index].callBackFunction();
this.animateArray.splice(index, 1);
this.animateElementArray.splice(index, 1);
}
},
/*
内置函数
删除外部新建的元件
*/
deleteElement: function (ele) {
if (this.playerType == 'flashplayer' && this.V) {
try {
this.V.deleteElement(ele);
} catch (event) { }
return;
}
//先将该元件从元件数组里删除,让其不再跟随播放器的尺寸改变而改变位置
var def = this.arrIndexOf(this.elementArr, ele.className);
if (def > -1) {
this.elementArr.splice(def, 1);
}
try {
def = this.arrIndexOf(this.elementTempArr, ele.className);
if (def > -1) {
this.elementTempArr.splice(def, 1);
}
} catch (event) { }
this.deleteAnimate(ele.className);
this.deleteChild(ele);
},
/*
--------------------------------------------------------------
共用函数部分
以下函数并非只能在本程序中使用,也可以在页面其它项目中使用
根据ID或className获取元素对象
*/
getByElement: function (obj, parent) {
if (this.isUndefined(parent)) {
parent = document;
}
var num = obj.substr(0, 1);
var res = [];
if (num != '#') {
if (num == '.') {
obj = obj.substr(1, obj.length);
}
if (parent.getElementsByClassName) {
res = parent.getElementsByClassName(obj);
if (!res.length) {
return null;
}
} else {
var reg = new RegExp(' ' + obj + ' ', 'i');
var ele = parent.getElementsByTagName('*');
for (var i = 0; i < ele.length; i++) {
if (reg.test(' ' + ele[i].className + ' ')) {
res.push(ele[i]);
}
}
}
if (res.length > 0) {
res = res[0];
}
else {
res = null;
}
} else {
if (num == '#') {
obj = obj.substr(1, obj.length);
}
try {
res = document.getElementById(obj);
}
catch (event) {
res = null;
}
}
return res;
},
/*
共用函数
功能:修改样式或获取指定样式的值,
elemID对象或ID对应的字符如果多个对象一起设置则可以使用数组
attribute样式名称或对象如果是对象则省略掉value值
valueattribute为样式名称时定义的样式值
示例一:
this.css(ID,'width','100px');
示例二:
this.css('id','width','100px');
示例三:
this.css([ID1,ID2,ID3],'width','100px');
示例四:
this.css(ID,{
width:'100px',
height:'100px'
});
示例五(获取宽度)
var width=this.css(ID,'width');
*/
css: function (elem, attribute, value) {
var i = 0;
var k = '';
if (this.varType(elem) == 'array') { //数组
for (i = 0; i < elem.length; i++) {
var el;
if (typeof (elem[i]) == 'string') {
el = this.getByElement(elem[i])
} else {
el = elem[i];
}
if (typeof (attribute) != 'object') {
if (!this.isUndefined(value)) {
el.style[attribute] = value;
}
} else {
for (k in attribute) {
if (!this.isUndefined(attribute[k])) {
try {
el.style[k] = attribute[k];
} catch (event) {
this.log(event);
}
}
}
}
}
return;
}
if (this.varType(elem) == 'string') {
elem = this.getByElement(elem);
}
if (this.varType(attribute) != 'object') {
if (!this.isUndefined(value)) {
elem.style[attribute] = value;
} else {
if (!this.isUndefined(this.getStyle(elem, attribute))) {
return this.getStyle(elem, attribute);
} else {
return false;
}
}
} else {
for (k in attribute) {
if (!this.isUndefined(attribute[k])) {
elem.style[k] = attribute[k];
}
}
}
},
/*
内置函数
兼容型获取style
*/
getStyle: function (obj, attr) {
if (!this.isUndefined(obj.style[attr])) {
return obj.style[attr];
} else {
if (obj.currentStyle) {
return obj.currentStyle[attr];
} else {
return getComputedStyle(obj, false)[attr];
}
}
},
/*
共用函数
判断变量是否存在或值是否为undefined
*/
isUndefined: function (value) {
try {
if (value === 'undefined' || value === undefined || value === null || value === 'NaN' || value === NaN) {
return true;
}
} catch (event) {
this.log(event);
return true;
}
return false;
},
/*
共用函数
外部监听函数
*/
addListener: function (name, funName) {
if (name && funName) {
if (this.playerType == 'flashplayer') {
var ff = ''; //定义用来向flashplayer传递的函数字符
if (this.varType(funName) == 'function') {
ff = this.getParameterNames(funName);
}
this.V.addListener(name, ff);
return;
}
var have = false;
for (var i = 0; i < this.listenerJsArr.length; i++) {
var arr = this.listenerJsArr[i];
if (arr[0] == name && arr[1] == funName) {
have = true;
break;
}
}
if (!have) {
this.listenerJsArr.push([name, funName]);
}
}
},
/*
共用函数
外部删除监听函数
*/
removeListener: function (name, funName) {
if (name && funName) {
if (this.playerType == 'flashplayer') {
var ff = ''; //定义用来向flashplayer传递的函数字符
if (this.varType(funName) == 'function') {
ff = this.getParameterNames(funName);
}
this.V.removeListener(name, ff);
return;
}
for (var i = 0; i < this.listenerJsArr.length; i++) {
var arr = this.listenerJsArr[i];
if (arr[0] == name && arr[1] == funName) {
this.listenerJsArr.splice(i, 1);
break;
}
}
}
},
/*
内部监听函数,调用方式:
this.addListenerInside('click',function(event){},[ID]);
d值为空时则表示监听当前的视频播放器
*/
addListenerInside: function (e, f, d, t) {
if (this.isUndefined(t)) {
t = false;
}
var o = this.V;
if (!this.isUndefined(d)) {
o = d;
}
if (o.addEventListener) {
try {
o.addEventListener(e, f, t);
} catch (event) { this.log(event) }
} else if (o.attachEvent) {
try {
o.attachEvent('on' + e, f);
} catch (event) { this.log(event) }
} else {
o['on' + e] = f;
}
},
/*
删除内部监听函数,调用方式:
this.removeListenerInside('click',function(event){}[,ID]);
d值为空时则表示监听当前的视频播放器
*/
removeListenerInside: function (e, f, d, t) {
/*if(this.playerType=='flashplayer' && this.getParameterNames(f) && this.isUndefined(d)) {
return;
}*/
if (this.isUndefined(t)) {
t = false;
}
var o = this.V;
if (!this.isUndefined(d)) {
o = d;
}
if (o.removeEventListener) {
try {
this.addNum--;
o.removeEventListener(e, f, t);
} catch (e) { }
} else if (o.detachEvent) {
try {
o.detachEvent('on' + e, f);
} catch (e) { }
} else {
o['on' + e] = null;
}
},
/*
共用函数
统一分配监听以达到跟as3同样效果
*/
sendJS: function (name, val) {
if (this.adPlayerPlay && name.substr(- 2) != 'Ad') {
return;
}
if (this.isUndefined(name)) {
return;
}
var list = this.listenerJsArr;
var obj = this.vars['variable'];
if (this.vars['debug']) {
this.log(name + ':' + val);
}
for (var i = 0; i < list.length; i++) {
var arr = list[i];
if (arr[0] == name) {
if (!this.isUndefined(val)) {
switch (arr[1].length) {
case 1:
arr[1](val);
break;
case 2:
arr[1](val, obj);
break;
default:
arr[1]();
break;
}
} else {
arr[1](obj);
}
}
}
},
/*
共用函数
获取函数名称,如 function ckplayer(){} var fun=ckplayer则getParameterNames(fun)=ckplayer
*/
getParameterNames: function (fn) {
if (this.varType(fn) !== 'function') {
return false;
}
var COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
var code = fn.toString().replace(COMMENTS, '');
var result = code.slice(code.indexOf(' ') + 1, code.indexOf('('));
return result === null ? false : result;
},
/*
共用函数
时间替换
*/
replaceTime: function (str, obj) {
//var timeStrArr = ['[$timeh]', '[$timei]', '[$timeI]', '[$times]', '[$timeS]', '[$durationh]', '[$durationi]', '[$durationI]', '[$durations]', '[$durationS]','[$liveTimey]', '[$liveTimeY]', '[$liveTimem]', '[$liveTimed]', '[$liveTimeh]', '[$liveTimei]', '[$liveTimes]', '[$liveLanguage]'];
for (var k in obj) {
str = str.replace('[$' + k + ']', obj[k])
}
return str;
},
/*
共用函数
格式化时分秒
t:Int秒数,dt:总时间的秒数
*/
formatTime: function (t, dt, str) {
if (this.isUndefined(t) || isNaN(t)) {
seconds = 0;
}
if (this.isUndefined(dt) || isNaN(dt)) {
dt = 0;
}
var minuteS = Math.floor(t / 60);//将秒数直接转化成分钟取整这个可以得到如80分钟
var minute = minuteS;//获取准确的分钟
var hourS = Math.floor(t / 3600);//将秒数直接转化成小时取整这个可以得到100小时
var second = t % 60;
if (minuteS >= 60) {
minute = Math.floor(minuteS % 60);
}
//总时间
var hminuteS = Math.floor(dt / 60);//将秒数直接转化成分钟取整这个可以得到如80分钟
var hminute = hminuteS;//获取准确的分钟
var hhourS = Math.floor(dt / 3600);//将秒数直接转化成小时取整这个可以得到100小时
var hsecond = dt % 60;
if (hminuteS >= 60) {
hminute = Math.floor(hminuteS % 60);
}
//当前时间
var nowDate = new Date();
var obj = {
timeh: hourS,//时
timei: minute,//分
timeI: minuteS,//只有分
times: second,//秒
timeS: t,//只有秒
durationh: hhourS,//时
durationi: hminute,//分
durationI: hminuteS,//只有分
durations: hsecond,//秒
durationS: dt,//只有秒
liveTimey: nowDate.getYear(),//获取当前年份(2位)
liveTimeY: nowDate.getFullYear(),//获取完整的年份(4位,1970-????)
liveTimem: nowDate.getMonth() + 1,//获取当前月份(0-11,0代表1月)
liveTimed: nowDate.getDate(),// 获取当前日(1-31)
liveTimeh: nowDate.getHours(), // 获取当前小时数(0-23)
liveTimei: nowDate.getMinutes(),// 获取当前分钟数(0-59)
liveTimes: nowDate.getSeconds()// 获取当前秒数(0-59)
};
for (var k in obj) {
if (obj[k] < 10) {
obj[k] = '0' + Math.floor(obj[k]);
}
else {
obj[k] = Math.floor(obj[k]).toString();
}
}
return this.replaceTime(str, obj);
},
/*
共用函数
获取一个随机字符
len随机字符长度
*/
randomString: function (len) {
len = len || 16;
var chars = 'abcdefghijklmnopqrstuvwxyz';
var maxPos = chars.length;
var val = '';
for (i = 0; i < len; i++) {
val += chars.charAt(Math.floor(Math.random() * maxPos));
}
return 'ch' + val;
},
/*
共用函数
获取字符串长度,中文算两,英文数字算1
*/
getStringLen: function (str) {
if (this.isUndefined(str)) {
return 0;
}
var len = 0;
for (var i = 0; i < str.length; i++) {
if (str.charCodeAt(i) > 127 || str.charCodeAt(i) == 94) {
len += 2;
} else {
len++;
}
}
return len;
},
/*
内部函数
用来为ajax提供支持
*/
createXHR: function () {
if (window.XMLHttpRequest) {
//IE7+、Firefox、Opera、Chrome 和Safari
return new XMLHttpRequest();
} else if (window.ActiveXObject) {
//IE6 及以下
try {
return new ActiveXObject('Microsoft.XMLHTTP');
} catch (event) {
try {
return new ActiveXObject('Msxml2.XMLHTTP');
} catch (event) {
this.eject(this.errorList[7]);
}
}
} else {
this.eject(this.errorList[8]);
}
},
/*
共用函数
ajax调用
*/
ajax: function (cObj) {
var thisTemp = this;
var callback = null;
var obj = {
method: 'get',//请求类型
dataType: 'json',//请求的数据类型
charset: 'utf-8',
async: false,//true表示异步false表示同步
url: '',
data: null,
success: null,
error: null
};
if (this.varType(cObj) != 'object') {
this.eject(this.errorList[9]);
return;
}
obj = this.standardization(obj, cObj);
if (obj.dataType === 'json' || obj.dataType === 'text' || obj.dataType === 'html' || obj.dataType === 'xml') {
var xhr = this.createXHR();
callback = function () {
//判断http的交互是否成功
if (xhr.status == 200) {
if (thisTemp.isUndefined(obj.success)) {
return;
}
if (obj.dataType === 'json') {
try {
obj.success(eval('(' + xhr.responseText + ')')); //回调传递参数
} catch (event) {
if (!thisTemp.isUndefined(obj['error'])) {
obj.error(event);
}
}
} else {
obj.success(xhr.responseText); //回调传递参数
}
}
else {
obj.success(null);
thisTemp.eject(thisTemp.errorList[10], 'Ajax.status:' + xhr.status);
}
};
obj.url = obj.url.indexOf('?') == -1 ? obj.url + '?rand=' + this.randomString(6) : obj.url;
obj.data = this.formatParams(obj.data); //通过params()将名值对转换成字符串
if (obj.method === 'get' && !this.isUndefined(obj.data)) {
if (obj.data != '') {
if (obj.url.indexOf('?') == -1) {
obj.url += '?' + obj.data
} else {
obj.url += '&' + obj.data;
}
}
}
if (obj.async === true) { //true表示异步false表示同步
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && callback != null) { //判断对象的状态是否交互完成
callback(); //回调
}
};
}
xhr.open(obj.method, obj.url, obj.async);
if (obj.method === 'post') {
try {
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.setRequestHeader('charset', obj['charset']);
xhr.send(obj.data);
}
catch (event) {
callback();
}
}
else {
try {
xhr.send(null); //get方式则填null
}
catch (event) {
callback();
}
}
if (obj.async === false) { //同步
callback();
}
}
else if (obj.dataType === 'jsonp') {
var oHead = document.getElementsByTagName('head')[0];
var oScript = document.createElement('script');
var callbackName = 'callback' + new Date().getTime();
var params = this.formatParams(obj.data) + '&callback=' + callbackName; //按时间戳拼接字符串
callback = obj.success;
//拼接好src
oScript.src = obj.url.split('?') + '?' + params;
//插入script标签
oHead.insertBefore(oScript, oHead.firstChild);
//jsonp的回调函数
window[callbackName] = function (json) {
callback(json);
oHead.removeChild(oScript);
};
}
},
/*
内置函数
动态加载js
*/
loadJs: function (path, success) {
var oHead = document.getElementsByTagName('HEAD').item(0);
var oScript = document.createElement('script');
oScript.type = 'text/javascript';
oScript.src = this.getNewUrl(path);
oHead.appendChild(oScript);
oScript.onload = function () {
success();
}
},
/*
共用函数
排除IE6-9
*/
isMsie: function () {
var browser = navigator.appName;
var b_version = navigator.appVersion;
var version = b_version.split(';');
var trim_Version = '';
if (version.length > 1) {
trim_Version = version[1].replace(/[ ]/g, '');
}
if (browser == 'Microsoft Internet Explorer' && (trim_Version == 'MSIE6.0' || trim_Version == 'MSIE7.0' || trim_Version == 'MSIE8.0' || trim_Version == 'MSIE9.0' || trim_Version == 'MSIE10.0')) {
return false;
}
return true;
},
/*
共用函数
判断是否安装了flashplayer
*/
uploadFlash: function () {
var swf;
if (navigator.userAgent.indexOf('MSIE') > 0) {
try {
var swf = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
return true;
} catch (e) {
return false;
}
}
if (navigator.userAgent.indexOf('Firefox') > 0) {
swf = navigator.plugins['Shockwave Flash'];
if (swf) {
return true
} else {
return false;
}
}
return true;
},
/*
共用函数
检测浏览器是否支持HTML5-Video
*/
supportVideo: function () {
if (!this.isMsie()) {
return false;
}
if (!!document.createElement('video').canPlayType) {
var vidTest = document.createElement('video');
var oggTest;
try {
oggTest = vidTest.canPlayType('video/ogg; codecs="theora, vorbis"');
} catch (error) {
oggTest = false;
}
if (!oggTest) {
var h264Test;
try {
h264Test = vidTest.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"');
} catch (error) {
h264Test = false;
}
if (!h264Test) {
return false;
} else {
if (h264Test == "probably") {
return true;
} else {
return false;
}
}
} else {
if (oggTest == "probably") {
return true;
} else {
return false;
}
}
} else {
return false;
}
},
/*
共用函数
获取属性值
*/
getDataset: function (ele, z) {
try {
return ele.dataset[z];
} catch (error) {
try {
return ele.getAttribute('data-' + z)
} catch (error) {
return false;
}
}
},
/*
共用函数
返回flashplayer的对象
*/
getObjectById: function (id) {
var x = null;
var y = this.getByElement('#' + id);
var r = 'embed';
if (y && y.nodeName == 'OBJECT') {
if (this.varType(y.SetVariable) != 'undefined') {
x = y;
} else {
var z = y.getElementsByTagName(r)[0];
if (z) {
x = z;
}
}
}
return x;
},
/*
共用函数
对象转地址字符串
*/
formatParams: function (data) {
var arr = [];
for (var i in data) {
arr.push(encodeURIComponent(i) + '=' + encodeURIComponent(data[i]));
}
return arr.join('&');
},
/*
内置函数
对地址进行冒泡排序
*/
arrSort: function (arr) {
var temp = [];
for (var i = 0; i < arr.length; i++) {
for (var j = 0; j < arr.length - i; j++) {
if (!this.isUndefined(arr[j + 1]) && arr[j][3] < arr[j + 1][3]) {
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
},
/*
共用函数
获取文件名称
*/
getFileName: function (filepath) {
if (!filepath) return '';
return filepath.replace(/(.*\/)*([^.]+).*/ig, '$2');
},
/*
内置函数
判断文件后缀
*/
getFileExt: function (filepath) {
if (filepath != '' && !this.isUndefined(filepath)) {
if (filepath.indexOf('?') > -1) {
filepath = filepath.split('?')[0];
}
var pos = '.' + filepath.replace(/.+\./, '');
return pos.toLowerCase();
}
return '';
},
/*
内置函数
判断是否是移动端
*/
isMobile: function () {
if (navigator.userAgent.toLowerCase().match(/(iphone|ipad|ipod|android|ios|midp|windows mobile|windows ce|rv:1.2.3.4|ucweb)/i)) {
return true;
}
return false;
},
/*
内置函数
搜索字符串str是否包含key
*/
isContains: function (str, key) {
return str.indexOf(key) > -1;
},
/*
内置函数
给地址添加随机数
*/
getNewUrl: function (url) {
if (this.isContains(url, '?')) {
return url += '&' + this.randomString(8) + '=' + this.randomString(8);
} else {
return url += '?' + this.randomString(8) + '=' + this.randomString(8);
}
},
/*
共用函数
获取clientX和clientY
*/
client: function (event) {
var eve = event || window.event;
if (this.isUndefined(eve)) {
eve = {
clientX: 0,
clientY: 0
};
}
return {
x: eve.clientX + (document.documentElement.scrollLeft || this.body.scrollLeft) - this.pdCoor['x'],
y: eve.clientY + (document.documentElement.scrollTop || this.body.scrollTop) - this.pdCoor['y']
}
},
/*
内置函数
获取节点的绝对坐标
*/
getCoor: function (obj) {
var coor = this.getXY(obj);
return {
x: coor['x'] - this.pdCoor['x'],
y: coor['y'] - this.pdCoor['y']
};
},
getXY: function (obj) {
var parObj = obj;
var left = obj.offsetLeft;
var top = obj.offsetTop;
while (parObj = parObj.offsetParent) {
left += parObj.offsetLeft;
top += parObj.offsetTop;
}
return {
x: left,
y: top
};
},
/*
内置函数
删除本对象的所有属性
*/
removeChild: function () {
if (this.playerType == 'html5video') {
//删除计时器
var i = 0;
var timerArr = [this.timerError, this.timerFull, this.timerTime, this.timerBuffer, this.timerClick, this.timerCBar, this.timerVCanvas];
for (i = 0; i < timerArr.length; i++) {
if (timerArr[i] != null) {
if (timerArr[i].runing) {
timerArr[i].stop();
}
timerArr[i] = null;
}
}
//删除事件监听
var ltArr = this.listenerJsArr;
for (i = 0; i < ltArr.length; i++) {
this.removeListener(ltArr[i][0], ltArr[i][1]);
}
}
this.playerType == '';
this.V = null;
if (this.conBarShow) {
this.deleteChild(this.CB['menu']);
}
this.deleteChild(this.PD);
this.CD.innerHTML = '';
},
/*
内置函数
画封闭的图形
*/
canvasFill: function (name, path) {
name.beginPath();
for (var i = 0; i < path.length; i++) {
var d = path[i];
if (i > 0) {
name.lineTo(d[0], d[1]);
} else {
name.moveTo(d[0], d[1]);
}
}
name.closePath();
name.fill();
},
/*
内置函数
画矩形
*/
canvasFillRect: function (name, path) {
for (var i = 0; i < path.length; i++) {
var d = path[i];
name.fillRect(d[0], d[1], d[2], d[3]);
}
},
/*
共用函数
删除容器节点
*/
deleteChild: function (f) {
var def = this.arrIndexOf(this.elementArr, f.className);
if (def > -1) {
this.elementArr.splice(def, 1);
}
var childs = f.childNodes;
for (var i = childs.length - 1; i >= 0; i--) {
f.removeChild(childs[i]);
}
if (f && f != null && f.parentNode) {
try {
if (f.parentNode) {
f.parentNode.removeChild(f);
}
} catch (event) { }
}
},
/*
内置函数
根据容器的宽高,内部节点的宽高计算出内部节点的宽高及坐标
*/
getProportionCoor: function (stageW, stageH, vw, vh) {
var w = 0,
h = 0,
x = 0,
y = 0;
if (stageW / stageH < vw / vh) {
w = stageW;
h = w * vh / vw;
} else {
h = stageH;
w = h * vw / vh;
}
x = (stageW - w) * 0.5;
y = (stageH - h) * 0.5;
return {
width: parseInt(w),
height: parseInt(h),
x: parseInt(x),
y: parseInt(y)
};
},
/*
共用函数
将字幕文件内容转换成数组
*/
parseSrtSubtitles: function (srt) {
var subtitlesArr = [];
var textSubtitles = [];
var i = 0;
var arrs = srt.split('\n');
var arr = [];
var delHtmlTag = function (str) {
return str.replace(/<[^>]+>/g, ''); //去掉所有的html标记
};
for (i = 0; i < arrs.length; i++) {
if (arrs[i].replace(/\s/g, '').length > 0) {
arr.push(arrs[i]);
} else {
if (arr.length > 0) {
textSubtitles.push(arr);
}
arr = [];
}
}
for (i = 0; i < textSubtitles.length; ++i) {
var textSubtitle = textSubtitles[i];
if (textSubtitle.length >= 2) {
var sn = textSubtitle[0]; // 字幕的序号
var startTime = this.toSeconds(this.trim(textSubtitle[1].split(' --> ')[0])); // 字幕的开始时间
var endTime = this.toSeconds(this.trim(textSubtitle[1].split(' --> ')[1])); // 字幕的结束时间
var content = [delHtmlTag(textSubtitle[2])]; // 字幕的内容
var cktrackdelay = this.vars['cktrackdelay'];
if (cktrackdelay != 0) {
startTime += cktrackdelay;
endTime += cktrackdelay;
}
// 字幕可能有多行
if (textSubtitle.length > 2) {
for (var j = 3; j < textSubtitle.length; j++) {
content.push(delHtmlTag(textSubtitle[j]));
}
}
// 字幕对象
var subtitle = {
sn: sn,
startTime: startTime,
endTime: endTime,
content: content
};
subtitlesArr.push(subtitle);
}
}
return subtitlesArr;
},
/*
共用函数
计时器,该函数模拟as3中的timer原理
time:计时时间,单位:毫秒
fun:接受函数
number:运行次数,不设置则无限运行
*/
timer: function (time, fun, number) {
var thisTemp = this;
this.time = 10; //运行间隔
this.fun = null; //监听函数
this.timeObj = null; //setInterval对象
this.number = 0; //已运行次数
this.numberTotal = null; //总至需要次数
this.runing = false; //当前状态
this.startFun = function () {
thisTemp.number++;
thisTemp.fun();
if (thisTemp.numberTotal != null && thisTemp.number >= thisTemp.numberTotal) {
thisTemp.stop();
}
};
this.start = function () {
if (!thisTemp.runing) {
thisTemp.runing = true;
thisTemp.timeObj = window.setInterval(thisTemp.startFun, time);
}
};
this.stop = function () {
if (thisTemp.runing) {
thisTemp.runing = false;
window.clearInterval(thisTemp.timeObj);
thisTemp.timeObj = null;
}
};
if (time) {
this.time = time;
}
if (fun) {
this.fun = fun;
}
if (number) {
this.numberTotal = number;
}
this.start();
},
/*
共用函数
将时分秒转换成秒
*/
toSeconds: function (t) {
var s = 0.0;
if (t) {
var p = t.split(':');
for (i = 0; i < p.length; i++) {
s = s * 60 + parseFloat(p[i].replace(',', '.'));
}
}
return s;
},
/*将字符变成数字形式的数组*/
arrayInt: function (str) {
var a = str.split(',');
var b = [];
for (var i = 0; i < a.length; i++) {
if (this.isUndefined(a[i])) {
a[i] = 0;
}
if (a[i].substr(- 1) != '%') {
a[i] = parseInt(a[i]);
}
b.push(a[i]);
}
return b;
},
/*
共用函数
将对象Object标准化
*/
standardization: function (o, n) { //n替换进o
var h = {};
var k;
for (k in o) {
h[k] = o[k];
}
for (k in n) {
var type = '';
if (h[k]) {
type = this.varType(h[k]);
}
switch (type) {
case 'number':
h[k] = parseFloat(n[k]);
break;
default:
h[k] = n[k];
break;
}
}
return h;
},
objectAssign: function (o, n) {
if (this.varType(o) != 'object' || this.varType(n) != 'object') {
return null;
}
var obj1 = this.newObj(o), obj2 = this.newObj(n);
for (var k in obj2) {
if (this.varType(obj2[k]) == 'object') {
if (this.varType(obj1[k]) != 'object') {
obj1[k] = {};
}
obj1[k] = this.objectAssign(obj1[k], obj2[k]);
}
else {
obj1[k] = obj2[k];
}
}
return obj1;
},
/*
共用函数
搜索数组
*/
arrIndexOf: function (arr, key) {
if (this.isUndefined(arr) || this.isUndefined(key)) {
return -1;
}
var re = new RegExp(key, ['']);
return (arr.toString().replace(re, '┢').replace(/[^,┢]/g, '')).indexOf('┢');
},
/*
共用函数
去掉空格
*/
trim: function (str) {
if (str != '') {
return str.replace(/(^\s*)|(\s*$)/g, '');
}
return '';
},
/*
共用函数
输出内容到控制台
*/
log: function (val) {
try {
console.log(val);
} catch (e) { }
},
/*
共用函数
弹出提示
*/
eject: function (er, val) {
if (!this.vars['debug']) {
return;
}
var errorVal = er[1];
if (!this.isUndefined(val)) {
errorVal = errorVal.replace('[error]', val);
}
var value = 'error ' + er[0] + ':' + errorVal;
try {
this.log(value);
} catch (e) { }
},
/*
共用函数
系统错误
*/
sysError: function (er, val) {
var ele = this.getByElement(this.vars['container']);
var errorVal = er[1];
if (!this.isUndefined(val)) {
errorVal = errorVal.replace('[error]', val);
}
var value = 'error ' + er[0] + ':' + errorVal;
ele.innerHTML = value;
this.css(ele, {
backgroundColor: '#000',
color: '#FFF',
textAlign: 'center',
lineHeight: ele.offsetHeight + 'px'
});
},
/*
共用函数
判断变量类型
*/
varType: function (val) {
if (val === null) {
return 'string';
}
var type = typeof (val);
switch (type) {
case 'string':
return 'string';
break;
case 'number':
return 'number';
break;
case 'boolean':
return 'boolean';
break;
case 'function':
return 'function';
break;
case 'symbol':
return 'symbol';
break;
case 'object':
if (!this.isUndefined(typeof (val.length))) {
return 'array';
}
return 'object';
break;
case 'undefined':
return 'undefined';
break;
default:
return typeof (val);
break;
}
},
getConfigObject: function () {
return this.jsonConfig;
},
getStyleObject: function () {
return this.jsonStyle;
},
getLanguageObject: function () {
return this.jsongLanguage;
}
};
window.ckplayer = ckplayer;
})();