From 159603341e7fcc8ebdda41ec8efae6a1207e6e59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E9=98=B3?= Date: Tue, 21 Jul 2026 11:16:25 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=B6=E6=AE=B52:=E6=8B=86=E5=88=86=E4=B8=BA?= =?UTF-8?q?=20ES=20Module=20+=20Rollup=20=E6=9E=84=E5=BB=BA,=E9=87=8D?= =?UTF-8?q?=E5=86=99=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - src/ 下拆分为入口/语言包/默认配置/主函数/工具模块,主函数整体搬入零改动 - rollup 打包 UMD(moeplayer.js + moeplayer.min.js),用户使用方式不变 - 库拷贝逻辑移至 scripts/copy-libs.js - README 重写:中文文档、快速开始、路线图、致谢原作者 - index.html 增加皮肤切换演示(默认/红色/西瓜) --- AGENTS.md | 31 +- README.md | 78 +- index.html | 12 +- moeplayer/js/moeplayer.js | 14711 ++++++++++++++------------- moeplayer/js/moeplayer.min.js | 8 +- package-lock.json | 502 +- package.json | 5 +- rollup.config.js | 49 + scripts/{build.js => copy-libs.js} | 38 +- src/core/moeplayerEmbed.js | 6484 ++++++++++++ src/defaults.js | 62 + src/index.js | 9 + src/language.js | 69 + src/utils/cookie.js | 64 + src/utils/dom.js | 220 + src/utils/format.js | 260 + src/utils/net.js | 186 + src/utils/path.js | 26 + src/utils/type.js | 99 + 19 files changed, 15507 insertions(+), 7406 deletions(-) create mode 100644 rollup.config.js rename scripts/{build.js => copy-libs.js} (59%) create mode 100644 src/core/moeplayerEmbed.js create mode 100644 src/defaults.js create mode 100644 src/index.js create mode 100644 src/language.js create mode 100644 src/utils/cookie.js create mode 100644 src/utils/dom.js create mode 100644 src/utils/format.js create mode 100644 src/utils/net.js create mode 100644 src/utils/path.js create mode 100644 src/utils/type.js diff --git a/AGENTS.md b/AGENTS.md index cd5dc84..3f8a58b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -6,17 +6,24 @@ MoePlayer —— 一款中文友好的开源网页视频播放器(MIT 协议 目标定位:中文文档 + 主流浏览器/手机 H5 支持 + 官方 Moodle media 插件(`media_moeplayer`,独立仓库)。 -**注意**:当前处于改造阶段 2(改名 + 模块化)。改名已完成:目录 `moeplayer/`、全局变量/API 为 `MoePlayer`(语言包全局变量 `moeplayerLanguage`);单文件拆分为 ES Module 待做。 +**注意**:当前处于改造阶段 2(改名 + 模块化)。改名已完成:目录 `moeplayer/`、全局变量/API 为 `MoePlayer`(语言包全局变量 `moeplayerLanguage`);单文件已拆分为 ES Module(源码在 `src/`,经 rollup 打包为 UMD 产物)。**主函数 `moeplayerEmbed` 尚未内部拆分**,仍是一个 ~6400 行的巨大函数,位于 `src/core/moeplayerEmbed.js`。 ## 目录结构 ``` ├── index.html # 演示/测试页(含 API 调用示例) ├── package.json # npm 工程化入口,依赖与构建脚本 -├── scripts/build.js # 构建脚本:压缩核心 + 从 node_modules 拷贝运行时库 +├── rollup.config.js # rollup 配置:src/ 打包为 UMD 产物 + terser 压缩 +├── scripts/copy-libs.js # 构建脚本第二步:从 node_modules 拷贝运行时库 +├── src/ # 播放器源码(ES Module,2026-07 由单文件拆分而来) +│ ├── index.js # 入口:export default moeplayerEmbed +│ ├── language.js # 默认中文语言包 +│ ├── defaults.js # videoObjectDefault 默认配置 +│ ├── core/moeplayerEmbed.js # 主函数,【整体搬自旧单文件,内部未拆分,逻辑零改动】 +│ └── utils/ # 工具函数:type/dom/format/net/cookie/path ├── moeplayer/ # 播放器本体,部署时整个上传到网站 -│ ├── js/moeplayer.js # 核心源码(UMD 模块,~7400 行,ES5) -│ ├── js/moeplayer.min.js # 压缩版,【由 npm run build 自动生成,勿手改】 +│ ├── js/moeplayer.js # UMD 产物,【由 npm run build 自动生成,勿手改】 +│ ├── js/moeplayer.min.js # 压缩版,同上 │ ├── css/moeplayer.css # 默认皮肤;另有 moeplayer.red.css、moeplayer.ixigua.css │ ├── css/images/ # 皮肤图片资源 │ ├── language/ # 语言包:zh.cn.js(默认内嵌)、zh.hk.js、en.js @@ -29,12 +36,13 @@ MoePlayer —— 一款中文友好的开源网页视频播放器(MIT 协议 ## 构建与依赖 - 安装:`npm install` -- 构建:`npm run build` —— 做两件事: - 1. terser 压缩 `moeplayer/js/moeplayer.js` → `moeplayer.min.js` - 2. 从 node_modules 拷贝 hls.js / flv.js / mpegts.js 的产物及 LICENSE 到 `moeplayer/` 对应目录 -- **改动 `moeplayer.js` 后必须执行 `npm run build`** 重新生成 min 版 +- 构建:`npm run build`(即 `rollup -c && node scripts/copy-libs.js`) —— 做两件事: + 1. rollup 把 `src/` 的 ES Module 打包为 UMD:`moeplayer/js/moeplayer.js`,并经 @rollup/plugin-terser 生成 `moeplayer.min.js`(保留 `软件名称|版权` 头部注释) + 2. `scripts/copy-libs.js` 从 node_modules 拷贝 hls.js / flv.js / mpegts.js 的产物及 LICENSE 到 `moeplayer/` 对应目录 +- **改动 `src/` 后必须执行 `npm run build`** 重新生成两个产物;`moeplayer/js/` 下两个 js 均为生成物,勿手改 - 升级依赖:改 `package.json` 版本号后 `npm install && npm run build` - 运行时机制:播放器用 `getPath()` 定位自身所在目录,按需动态 ` +```html + +
播放器容器
``` +更多配置与 API 可参考本仓库的 `index.html` 演示页;原 ckplayer 手册(http://www.ckplayer.com/manual/ )在改造期内仍有参考价值。 -#### 使用说明 -使用过程中碰到问题,请至官网查看手册:http://www.ckplayer.com/manual/ +### 语言 -#### 参与贡献 -niandeng +默认中文。引入语言包可切换其它语言(需在引入 moeplayer.js 之前引入): +```html + +``` + +### 皮肤 + +默认皮肤 `moeplayer.css`,另有红色 `moeplayer.red.css`、西瓜风格 `moeplayer.ixigua.css`,替换 CSS 文件即可换肤。 + +## 从源码构建 + +```bash +npm install +npm run build +``` + +源码在 `src/`(ES Module),构建产物输出到 `moeplayer/js/`(UMD,含未压缩版与 min 版),同时从 npm 依赖拷贝 hls.js / flv.js / mpegts.js 运行时库到 `moeplayer/` 对应目录。 + +## 改造路线图 + +- [x] 工程化:npm + rollup 构建,依赖 npm 化管理 +- [x] 改名 ckplayer → MoePlayer,单文件拆分为 ES Module +- [ ] 核心与 UI 分层,皮肤改用 CSS 变量 + SVG 图标 +- [ ] 协议插件化(hls/mpegts 按需加载,移除已停维护的 flv.js) +- [ ] 移动端 H5 兼容性专项 +- [ ] Moodle media 插件(独立仓库 moodle-media_moeplayer) +- [ ] 完整中文文档 + +## 致谢 + +感谢 ckplayer 原作者 [niandeng](http://www.ckplayer.com) 的开源工作,本项目在其 X3 版本基础上继续演进。 + +## 协议 + +[MIT](LICENSE) © MoePlayer 项目 & ckplayer 原作者 niandeng diff --git a/index.html b/index.html index 4c45c42..3eb39b0 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ MoePlayer - + @@ -44,12 +44,22 @@ player.ended(function(){ document.getElementById('state').innerHTML='监听到播放结束'; }); + //皮肤切换:替换引入的CSS文件 + function changeSkin(css){ + document.getElementById('skin').href='moeplayer/css/'+css; + }

以下链接指向原 ckplayer 项目:

官网:www.ckplayer.com

手册:www.ckplayer.com/manual/

社区:bbs.ckplayer.com

全功能演示:www.ckplayer.com/demo.html

+

皮肤切换:

+

+ + + +

控制示例:

diff --git a/moeplayer/js/moeplayer.js b/moeplayer/js/moeplayer.js index b38b253..c01eb3c 100644 --- a/moeplayer/js/moeplayer.js +++ b/moeplayer/js/moeplayer.js @@ -1,6511 +1,251 @@ -/* - * 软件名称:MoePlayer - * 版本:X3 - * 版权:MoePlayer 项目(fork 自 ckplayer, www.ckplayer.com) - * 开源协议:MIT - */ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global = global || self, global.MoePlayer = factory()); -}(this, function () { 'use strict'; +/* + * 软件名称:MoePlayer + * 版本:X3 + * 版权:MoePlayer 项目(fork 自 ckplayer, www.ckplayer.com) + * 开源协议:MIT + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.MoePlayer = factory()); +})(this, (function () { 'use strict'; + /* - * language - * 功能:静态变量,包含播放器用到的默认语言包 - * 引入其它语言js后该变量将被替换成新引入的语言包 - */ - var language={ - play:'%E6%92%AD%E6%94%BE', - pause:'%E6%9A%82%E5%81%9C', - refresh:'%E9%87%8D%E6%92%AD', - full:'%E5%85%A8%E5%B1%8F', - exitFull:'%E9%80%80%E5%87%BA%E5%85%A8%E5%B1%8F', - webFull:'%E9%A1%B5%E9%9D%A2%E5%85%A8%E5%B1%8F', - exitWebFull:'%E9%80%80%E5%87%BA%E9%A1%B5%E9%9D%A2%E5%85%A8%E5%B1%8F', - theatre:'%E5%89%A7%E5%9C%BA%E6%A8%A1%E5%BC%8F', - exitTheatre:'%E9%80%80%E5%87%BA%E5%89%A7%E5%9C%BA%E6%A8%A1%E5%BC%8F', - volume:'%E9%9F%B3%E9%87%8F%EF%BC%9A', - muted:'%E9%9D%99%E9%9F%B3', - exitmuted:'%E6%81%A2%E5%A4%8D%E9%9F%B3%E9%87%8F', - seek:'seek%EF%BC%9A', - waiting:'%E7%BC%93%E5%86%B2', - live:'%E7%9B%B4%E6%92%AD%E4%B8%AD', - backLive:'%E8%BF%94%E5%9B%9E%E7%9B%B4%E6%92%AD', - lookBack:'%E5%9B%9E%E7%9C%8B%EF%BC%9A', - next:'%E4%B8%8B%E4%B8%80%E9%9B%86', - screenshot:'%E8%A7%86%E9%A2%91%E6%88%AA%E5%9B%BE', - smallwindows:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E6%92%AD%E6%94%BE%E5%8A%9F%E8%83%BD', - playbackrate:'%E5%80%8D%E9%80%9F', - playbackrateSuffix:'%E5%80%8D', - track:'%E5%AD%97%E5%B9%95', - noTrack:'%E6%97%A0%E5%AD%97%E5%B9%95', - definition:'%E6%B8%85%E6%99%B0%E5%BA%A6', - switchTo:'%E5%88%87%E6%8D%A2%E6%88%90%EF%BC%9A', - closeTime:'%7Bseconds%7D%E7%A7%92%E5%90%8E%E5%8F%AF%E5%85%B3%E9%97%AD%E5%B9%BF%E5%91%8A', - closeAd:'%E5%85%B3%E9%97%AD%E5%B9%BF%E5%91%8A', - second:'%E7%A7%92', - details:'%E6%9F%A5%E7%9C%8B%E8%AF%A6%E6%83%85', - copy:'%E5%A4%8D%E5%88%B6', - copySucceeded:'%E5%A4%8D%E5%88%B6%E6%88%90%E5%8A%9F%EF%BC%8C%E5%8F%AF%E8%B4%B4%E7%B2%98%EF%BC%81', - smallwindowsOpen:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%BC%80%E5%90%AF', - smallwindowsClose:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%85%B3%E9%97%AD', - screenshotStart:'%E6%88%AA%E5%9B%BE%E4%B8%AD%EF%BC%8C%E8%AF%B7%E7%A8%8D%E5%80%99...', - screenshotClose:'%E6%88%AA%E5%9B%BE%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%85%B3%E9%97%AD', - loopOpen:'%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE', - loopClose:'%E5%B7%B2%E5%85%B3%E9%97%AD%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE', - close:'%E5%85%B3%E9%97%AD', - down:'%E4%B8%8B%E8%BD%BD', - p50:'50%25', - p75:'75%25', - p100:'100%25', - timeScheduleAdjust:{ - prohibit:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%8B%96%E5%8A%A8', - prohibitBackOff:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E9%87%8D%E5%A4%8D%E8%A7%82%E7%9C%8B', - prohibitForward:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E5%BF%AB%E8%BF%9B', - prohibitLookBack:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%92%AD%E6%94%BE%E9%83%A8%E5%88%86%E5%86%85%E5%AE%B9', - prohibitForwardNotViewed:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%92%AD%E6%94%BE%E6%9C%AA%E8%A7%82%E7%9C%8B%E7%9A%84%E9%83%A8%E5%88%86' - }, - error:{ - noMessage:'%E6%9C%AA%E7%9F%A5%E9%94%99%E8%AF%AF', - supportVideoError:'%E8%AF%A5%E6%B5%8F%E8%A7%88%E5%99%A8%E7%89%88%E6%9C%AC%E5%A4%AA%E4%BD%8E%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%9B%B4%E6%8D%A2%E6%88%90%E5%85%B6%E5%AE%83%E6%B5%8F%E8%A7%88%E5%99%A8', - videoTypeError:'%E8%AF%A5%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%8D%E6%94%AF%E6%8C%81%E6%92%AD%E6%94%BE%E8%AF%A5%E8%A7%86%E9%A2%91%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%9B%B4%E6%8D%A2%E6%88%90%E5%85%B6%E5%AE%83%E6%B5%8F%E8%A7%88%E5%99%A8', - loadingFailed:'%E5%8A%A0%E8%BD%BD%E5%A4%B1%E8%B4%A5', - emptied:'%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B%E4%B8%AD%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF', - screenshot:'%E8%A7%86%E9%A2%91%E6%88%AA%E5%9B%BE%E5%A4%B1%E8%B4%A5', - ajax:'Ajax%E6%95%B0%E6%8D%AE%E8%AF%B7%E6%B1%82%E9%94%99%E8%AF%AF', - noVideoContainer:'%E6%9C%AA%E6%89%BE%E5%88%B0%E6%94%BE%E7%BD%AE%E8%A7%86%E9%A2%91%E7%9A%84%E5%AE%B9%E5%99%A8' - } - }; + * language + * 功能:静态变量,包含播放器用到的默认语言包 + * 引入其它语言js后该变量将被替换成新引入的语言包 + */ + var language$1={ + play:'%E6%92%AD%E6%94%BE', + pause:'%E6%9A%82%E5%81%9C', + refresh:'%E9%87%8D%E6%92%AD', + full:'%E5%85%A8%E5%B1%8F', + exitFull:'%E9%80%80%E5%87%BA%E5%85%A8%E5%B1%8F', + webFull:'%E9%A1%B5%E9%9D%A2%E5%85%A8%E5%B1%8F', + exitWebFull:'%E9%80%80%E5%87%BA%E9%A1%B5%E9%9D%A2%E5%85%A8%E5%B1%8F', + theatre:'%E5%89%A7%E5%9C%BA%E6%A8%A1%E5%BC%8F', + exitTheatre:'%E9%80%80%E5%87%BA%E5%89%A7%E5%9C%BA%E6%A8%A1%E5%BC%8F', + volume:'%E9%9F%B3%E9%87%8F%EF%BC%9A', + muted:'%E9%9D%99%E9%9F%B3', + exitmuted:'%E6%81%A2%E5%A4%8D%E9%9F%B3%E9%87%8F', + seek:'seek%EF%BC%9A', + waiting:'%E7%BC%93%E5%86%B2', + live:'%E7%9B%B4%E6%92%AD%E4%B8%AD', + backLive:'%E8%BF%94%E5%9B%9E%E7%9B%B4%E6%92%AD', + lookBack:'%E5%9B%9E%E7%9C%8B%EF%BC%9A', + next:'%E4%B8%8B%E4%B8%80%E9%9B%86', + screenshot:'%E8%A7%86%E9%A2%91%E6%88%AA%E5%9B%BE', + smallwindows:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E6%92%AD%E6%94%BE%E5%8A%9F%E8%83%BD', + playbackrate:'%E5%80%8D%E9%80%9F', + playbackrateSuffix:'%E5%80%8D', + track:'%E5%AD%97%E5%B9%95', + noTrack:'%E6%97%A0%E5%AD%97%E5%B9%95', + definition:'%E6%B8%85%E6%99%B0%E5%BA%A6', + switchTo:'%E5%88%87%E6%8D%A2%E6%88%90%EF%BC%9A', + closeTime:'%7Bseconds%7D%E7%A7%92%E5%90%8E%E5%8F%AF%E5%85%B3%E9%97%AD%E5%B9%BF%E5%91%8A', + closeAd:'%E5%85%B3%E9%97%AD%E5%B9%BF%E5%91%8A', + second:'%E7%A7%92', + details:'%E6%9F%A5%E7%9C%8B%E8%AF%A6%E6%83%85', + copy:'%E5%A4%8D%E5%88%B6', + copySucceeded:'%E5%A4%8D%E5%88%B6%E6%88%90%E5%8A%9F%EF%BC%8C%E5%8F%AF%E8%B4%B4%E7%B2%98%EF%BC%81', + smallwindowsOpen:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%BC%80%E5%90%AF', + smallwindowsClose:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%85%B3%E9%97%AD', + screenshotStart:'%E6%88%AA%E5%9B%BE%E4%B8%AD%EF%BC%8C%E8%AF%B7%E7%A8%8D%E5%80%99...', + screenshotClose:'%E6%88%AA%E5%9B%BE%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%85%B3%E9%97%AD', + loopOpen:'%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE', + loopClose:'%E5%B7%B2%E5%85%B3%E9%97%AD%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE', + close:'%E5%85%B3%E9%97%AD', + down:'%E4%B8%8B%E8%BD%BD', + p50:'50%25', + p75:'75%25', + p100:'100%25', + timeScheduleAdjust:{ + prohibit:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%8B%96%E5%8A%A8', + prohibitBackOff:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E9%87%8D%E5%A4%8D%E8%A7%82%E7%9C%8B', + prohibitForward:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E5%BF%AB%E8%BF%9B', + prohibitLookBack:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%92%AD%E6%94%BE%E9%83%A8%E5%88%86%E5%86%85%E5%AE%B9', + prohibitForwardNotViewed:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%92%AD%E6%94%BE%E6%9C%AA%E8%A7%82%E7%9C%8B%E7%9A%84%E9%83%A8%E5%88%86' + }, + error:{ + noMessage:'%E6%9C%AA%E7%9F%A5%E9%94%99%E8%AF%AF', + supportVideoError:'%E8%AF%A5%E6%B5%8F%E8%A7%88%E5%99%A8%E7%89%88%E6%9C%AC%E5%A4%AA%E4%BD%8E%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%9B%B4%E6%8D%A2%E6%88%90%E5%85%B6%E5%AE%83%E6%B5%8F%E8%A7%88%E5%99%A8', + videoTypeError:'%E8%AF%A5%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%8D%E6%94%AF%E6%8C%81%E6%92%AD%E6%94%BE%E8%AF%A5%E8%A7%86%E9%A2%91%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%9B%B4%E6%8D%A2%E6%88%90%E5%85%B6%E5%AE%83%E6%B5%8F%E8%A7%88%E5%99%A8', + loadingFailed:'%E5%8A%A0%E8%BD%BD%E5%A4%B1%E8%B4%A5', + emptied:'%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B%E4%B8%AD%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF', + screenshot:'%E8%A7%86%E9%A2%91%E6%88%AA%E5%9B%BE%E5%A4%B1%E8%B4%A5', + ajax:'Ajax%E6%95%B0%E6%8D%AE%E8%AF%B7%E6%B1%82%E9%94%99%E8%AF%AF', + noVideoContainer:'%E6%9C%AA%E6%89%BE%E5%88%B0%E6%94%BE%E7%BD%AE%E8%A7%86%E9%A2%91%E7%9A%84%E5%AE%B9%E5%99%A8' + } + }; + /* - * videoObjectDefault - * 功能:静态变量,默认播放配置,当外部传递过来的配置有未包含在varsDefault里的,则使用varsDefault里的配置 - */ - var videoObjectDefault= { - container: '',//视频容器的ID - volume: 0.8,//默认音量,范围0-1 - poster: '',//封面图片地址 - autoplay: false,//是否自动播放 - loop: false,//是否需要循环播放 - live: false,//是否是直播 - rotate:0,//视频旋转角度 - zoom:0,//默认缩放比例 - ad:null,//广告 - backLive:false,//显示返回直播按钮 - seek: 0,//默认需要跳转的秒数 - next: null,//下一集按钮动作 - loaded: '',//加载播放器后调用的函数 - plug: '',//使用插件 - duration:0,//视频总时间 - preview: null,//预览图片对象 - prompt: null,//提示点功能 - crossOrigin:'',//跨域请求字符 - video: null,//视频地址 - type:'',//视频类型 - playbackrate: 1,//默认倍速 - ended:null,//结束显示的内容 - webFull:false,//页面全屏按钮事件 - theatre:null,//剧场模式 - controls:false,//是否显示自带控制栏 - rightBar:null,//是否开启右边控制栏 - smallWindows:null,//是否启用小窗口模式 - smallWindowsDrag:true,//当处于小窗口模式时是否可拖动播放器 - screenshot:false,//截图功能是否开启 - timeScheduleAdjust:1,//是否可调节播放进度,0不启用,1是启用,2是只能前进(向右拖动),3是只能后退,4是只能前进但能回到第一次拖动时的位置,5是看过的地方可以随意拖动 - logo:'',//logo - menu:null,//右键菜单 - information:{//关于 - 'Load:':'{loadTime} second', - 'Duration:':'{duration} second', - 'Size:':'{videoWidth}x{videoHeight}', - 'Volume:':'{volume}%', - 'Fps:':'{fps}fps', - 'Sudio decoded:':'{audioDecodedByteCount} Byte', - 'Video decoded:':'{videoDecodedByteCount} Byte' - }, - track:null,//字幕 - title:'',//视频标题 - language:'',//语言包文件 - barHideTime:1500,//控制栏隐藏时间 - playbackrateOpen:true,//是否开启控制栏倍速选项 - playbackrateList:[0.75,1,1.25,1.5,2,4],//倍速配置值 - cookie:null,//开启cookie功能 - domain:null,//指定cookie保存的域 - cookiePath:'/',//指定cookie保存路径 - documentFocusPause:false,//窗口失去焦点后暂停播放 - mouseWheelVolume:2,//是否启用鼠标滚轮调节音量功能,0=不启用,1=启用,2=全屏时才启用 - keyVolume:2,//是否启用键盘控制音量调节,0=不启用,1=启用,2=全屏时才启用 - errorShow:true//是否显示错误信息 - }; - function moeplayerEmbed(videoObj){ - /* - * rightMenu - * 功能:全局变量,右键内容 - * 初始化设置menu可替换该变量内容 + * videoObjectDefault + * 功能:静态变量,默认播放配置,当外部传递过来的配置有未包含在varsDefault里的,则使用varsDefault里的配置 */ - var rightMenu=[ - { - title:'MoePlayer' + var videoObjectDefault= { + container: '',//视频容器的ID + volume: 0.8,//默认音量,范围0-1 + poster: '',//封面图片地址 + autoplay: false,//是否自动播放 + loop: false,//是否需要循环播放 + live: false,//是否是直播 + rotate:0,//视频旋转角度 + zoom:0,//默认缩放比例 + ad:null,//广告 + backLive:false,//显示返回直播按钮 + seek: 0,//默认需要跳转的秒数 + next: null,//下一集按钮动作 + loaded: '',//加载播放器后调用的函数 + plug: '',//使用插件 + duration:0,//视频总时间 + preview: null,//预览图片对象 + prompt: null,//提示点功能 + crossOrigin:'',//跨域请求字符 + video: null,//视频地址 + type:'',//视频类型 + playbackrate: 1,//默认倍速 + ended:null,//结束显示的内容 + webFull:false,//页面全屏按钮事件 + theatre:null,//剧场模式 + controls:false,//是否显示自带控制栏 + rightBar:null,//是否开启右边控制栏 + smallWindows:null,//是否启用小窗口模式 + smallWindowsDrag:true,//当处于小窗口模式时是否可拖动播放器 + screenshot:false,//截图功能是否开启 + timeScheduleAdjust:1,//是否可调节播放进度,0不启用,1是启用,2是只能前进(向右拖动),3是只能后退,4是只能前进但能回到第一次拖动时的位置,5是看过的地方可以随意拖动 + logo:'',//logo + menu:null,//右键菜单 + information:{//关于 + 'Load:':'{loadTime} second', + 'Duration:':'{duration} second', + 'Size:':'{videoWidth}x{videoHeight}', + 'Volume:':'{volume}%', + 'Fps:':'{fps}fps', + 'Sudio decoded:':'{audioDecodedByteCount} Byte', + 'Video decoded:':'{videoDecodedByteCount} Byte' }, - { - title:'version:X3', - underline:true - }, - { - title:'about', - click:'aboutShow' - } - ]; - var vars={},varsTemp={};//保存传递过来的videoObject - var video=null;//视频播放器对象 - var duration=0;//总时间 - var mutedState='';//默认静音状态 - var recoveryVolume=false;//是否需要在播放时恢复音量 - var waited=true;//是否缓冲结束 - var paused=true;//默认暂停状态 - var loadTime=0;//已加载部分 - var seekTime=0;//需要跳转的时间,初次播放以及切换清晰度后会用该变量记录需要seek的时间 - var oldTime=0,playTime=0,firstSeekTime=-1,maxSeeTime=0;//oldTime=记录上次播放时间,playTime=当前播放时间,firstSeekTime=记录第一次拖动的时间,maxSeeTime=看过的最大时间 - var isChangeDef=true;//是否需要重置清晰度 - var playType='';//播放类别,默认='',是通过api接口播放,='button'则判定是通过点击按钮播放 - var msgSetTime=null,tipSetTime=null,mouseSetTime=null;//用于显示提示后自动隐藏的计时器 - var adFrontSetTime=null,adPauseSetTime=null;//贴片广告和暂停广告的计时器 - var closeTipFun=null;//关闭提示的函数 - var closeTipMouseOut=null;//鼠标离开节点时执行的函数 - var waitingMessage=true;//显示缓冲提示 - var hidePreviewSetTime=null;//隐藏预览图的计时器 - var pSliderMouseDown=false;//判断是否在进度条上的滑块上按下 - var playbackTime=0;//记录回放时间 - var loadedmetadataNum=0;//记录元数据加载成功次数,记录视频播放数量 - var screenshotImg=null;//记录最新一张截图 - var ad=null;//广告对象 - var frontAdPlay=false,pauseAdPlay=false;//贴片广告是否播放,暂停广告是否播放 - var barShow=true,rightBarShow=true; - var EventTarget=null,newEvent=null,eventTargetList=null;//注册监听 - var loadedTrack=false;//默认未加载字幕 - var C={};//保存播放器界面上的所有节点 - var CT=null,CK=null,CM=null,CV=null;//CT=播放器容器,页面中已存的,CT>CK>CM>CV>video - var pugPlayer=null;//插件播放器 - var hls=null;//播放hls - var loadMeta=true;//第一次加载到元数据 - var app='';//平台类型 - var nowRotate=0;//当前视频旋转角度 - var nowZoom=100;//当前缩放比例 - var smallWindowsState=false;//当前是否处理小窗口状态 - var isDrag=false;//是否在播放器上按下并且拖动 - var moeplayerCookie='moeplayer-player-cookie'; - var cookieName='';//cookie名称 - var cookieTime=0;//cookie保存时间,单位:秒 - var cookieArray=[];//保存当前所有记录 - var focusPause=true;//失去焦点前是否是暂停状态 - var existenceObj=false;//是否使用源码里已有的dom - /* - * into - * 功能:初始化,调用播放器则首先调用该函数 - * @obj=初始化时的配置对象:videoObject + track:null,//字幕 + title:'',//视频标题 + language:'',//语言包文件 + barHideTime:1500,//控制栏隐藏时间 + playbackrateOpen:true,//是否开启控制栏倍速选项 + playbackrateList:[0.75,1,1.25,1.5,2,4],//倍速配置值 + cookie:null,//开启cookie功能 + domain:null,//指定cookie保存的域 + cookiePath:'/',//指定cookie保存路径 + documentFocusPause:false,//窗口失去焦点后暂停播放 + mouseWheelVolume:2,//是否启用鼠标滚轮调节音量功能,0=不启用,1=启用,2=全屏时才启用 + keyVolume:2,//是否启用键盘控制音量调节,0=不启用,1=启用,2=全屏时才启用 + errorShow:true//是否显示错误信息 + }; + + /* + * standardization + * 功能:将对象Object标准化,将n对象替换进o对象 + * @o:标准化对象,@n:外部传递对象 */ - var into=function(obj){ - /* - * 如果未传递初始化配置对象,则为player变量增加一个add函数,功能相当于into - */ - if(isUndefined(obj)){ - player.add=player.into=into; - return player; + function standardization(o, n) { //n替换进o + var h = {}; + var k; + for (k in o) { + h[k] = o[k]; } - /* - * 转码默认语言包 - */ - language=decodeURIString(language); - /* - * 检查是否在顶部引入了外部语言包文件,如果引入了,则使用外部语言包替换进language变量 - */ - if(!isUndefined(window.moeplayerLanguage)){ - language=mergeObj(language,window.moeplayerLanguage); - } - /* - * 初始化注册事件函数,该函数的作用是将所有相关的事件都注册进一个变量newEvent - * newEvent是提供给播放器外部监听函数使用的,如监听时间player.time(function(t){console.log('已播放:'+t);}); - */ - eventTarget(); - /* - * 监听页面标签状态(判断是否失去焦点) - */ - documentHidden(function(state){ - eventTarget('visibilityState',state); - }); - /* - * 判断平台类型,主要是判断是否是iphone类型的平台 - */ - app=getApp(); - /* - * 简单复制一下初始化时的默认配置 - */ - varsTemp={}; - for(var key in videoObjectDefault){ - varsTemp[key]=videoObjectDefault[key]; - } - /* - * 如果初始化配置是字符串并且是以website:开头或url:开头的,则认为需要请求一个json文件来获取配置 - */ - if(valType(obj)=='string' && (obj.substr(0,8)=='website:' || obj.substr(0,4)=='url:')){ - var ajaxUrl=''; - if(obj.substr(0,8)=='website:'){ - ajaxUrl=obj.substring(8); - } - if(obj.substr(0,4)=='url:'){ - ajaxUrl=obj.substring(4); - } - ajax({url:ajaxUrl,success:function(data){ - if(data){ - return into(data); - } - else{ - showWindowsError(language['error']['ajax']+',url:'+ajaxUrl); - return null; - } - }}); - } - /* - * 如果初始化配置是一个object,则进行下面的操作 - */ - else if(valType(obj)=='object'){ - varsTemp = standardization(varsTemp, obj);//将obj合并到varsTemp对象里 - if(!isUndefined(obj['container']) && obj['container']){ - CT=$(obj['container']); - if(CT){//如果播放容器存在,则调用语言判断函数 - return loadLanguage(obj); - } - else{//如果播放容器不存在,则则等页面加载完成后运行 - return bodyReady(obj); - } - } - else{//不存在播放容器配置则等页面加载完成后运行 - return bodyReady(obj); - } - } - else{ - showWindowsError(language['error']['noVideoContainer']); - return null; - } - }, - /* - * bodyReady - * 功能:页面加载完成后构建播放器 - * @obj=初始化时的配置对象 - */ - bodyReady=function (obj){ - documentReady(function(){ - if(!isUndefined(obj['container'])){ - CT=$(obj['container']); - if(CT){//如果播放容器存在,则调用语言判断函数 - return loadLanguage(obj); - } - else{ - showWindowsError(language['error']['noVideoContainer']); - return null; - } - } - else{//不存在播放容器则重新判断 - return ajaxWebsite(obj); - } - }); - return null; - }, - /* - * ajaxWebsite - * 功能:页面加载完成后重新初始化 - * @obj=初始化时的配置对象 - */ - ajaxWebsite=function (obj){ - if(valType(obj['video'])=='string' && (obj['video'].substr(0,8)=='website:' || obj['video'].substr(0,4)=='url:')){ - varsTemp = standardization(varsTemp, obj); - var ajaxUrl=''; - if(obj['video'].substr(0,8)=='website:'){ - ajaxUrl=obj['video'].substring(8); - } - if(obj['video'].substr(0,4)=='url:'){ - ajaxUrl=obj['video'].substring(4); - } - ajax({url:ajaxUrl,success:function(data){ - if(data){ - return into(data); - } - else{ - showWindowsError(language['error']['ajax']+',url:'+ajaxUrl); - return null; - } - }}); - } - else{ - showWindowsError(language['error']['noVideoContainer']); - return null; - } - }, - /* - * loadLanguage - * 功能:加载Language - * @obj=初始化时的配置对象 - */ - loadLanguage=function (obj){ - vars = standardization(varsTemp, obj); - if(vars['language']){ - var path=getPath('language')+vars['language']+'.js'; - loadJs(path,function(){ - if(!isUndefined(window['moeplayerLanguage'])){ - language=mergeObj(language,window['moeplayerLanguage']); - } - return embed(obj); - }); - } - else{ - return embed(obj); - } - }, - /* - * embed - * 功能:构建播放器 - * @obj=初始化时的配置对象 - */ - embed=function (obj){ - /* - * 判断静音状态 - */ - mutedState=vars['volume']>0?false:true; - if(!isUndefined(CT) && CT!=null){ - if(valType(CT)=='htmlarray'){ - CT=CT.eq(0); - } - } - else{ - return null; - } - /* - * 注册获取fps的函数 - */ - calculationFps(); - /* - * 如果video指向一个已存在的video标签对象 - */ - existenceObj=valType(vars['video'])=='string' && ((vars['video'].substr(0,1)=='.' && vars['video'].indexOf('/')==-1) || vars['video'].substr(0,1)=='#'); - /* - * 清空容器 - */ - if(existenceObj){ - CK=CT.find('.moeplayer')?CT.find('.moeplayer').eq(0):null; - if(CK){ - CM=CK.find('.ck-main')?CK.find('.ck-main').eq(0):null; - } - if(CM){ - CV=CM.find('.ck-video')?CM.find('.ck-video').eq(0):null; - } - } - if(!CK || !CM || !CV){ - CT.htm(''); - /* - * 在播放容器里新建一个总的容器 - */ - CK=createlDiv('moeplayer'); - CT.append(CK); - /* - * 在总容器里再新建一个容器 - */ - CM=createlDiv('ck-main'); - CK.append(CM); - /* - * 新建一个放置video标签的容器 - */ - CV=createlDiv('ck-video'); - CM.append(CV); - } - /* - * 如果已存在video.则先设置成空 - */ - if(video){ - video.remove(); - video=null; - } - /* - * 如果video指向一个已存在的video标签对象,则直接调用该对象 - */ - if(existenceObj){ - video=$(vars['video'])?$(vars['video']).eq(0):null; - } - /* - * 新建一个video标签 - */ - if(!video){ - video = createlVideo(); - video.attr('width','100%').attr('height','100%'); - CV.append(video); - } - video.volume=vars['volume']; - if(vars['autoplay']){ - player.volume(0); - player.muted(); - recoveryVolume=true; - video.attr('autoplay','autoplay'); - paused=false; - } - else{ - video.attr('preload','metadata'); - } - CT.loop=vars['loop']; - if(CT.loop){ - video.attr('loop','loop'); - } - if(vars['controls']){ - video.controls=true; - } - else{ - video.controls=false; - } - try{ - if(!existenceObj){ - video.attr('controlslist','nodownload'); - video.attr('x-webkit-airplay','true'); - video.attr('x5-video-orientation','portraint'); - video.attr('playsinline','true'); - video.attr('webkit-playsinline','true'); - video.attr('x5-playsinline','true'); - } - if(vars['crossOrigin']){ - video.useCORS=true;//解决跨域 - video.crossOrigin=vars['crossOrigin'];//解决跨域 - } - } - catch(event){} - /* - * 默认设置支持小窗口模式 - */ - CT.smallWindows=true; - /* - * 默认设置不显示页面全屏按钮 - */ - CT.webFull=false; - /* - * 默认设置不显示剧场模式按钮 - */ - CT.theatre=false; - /* - * 加载播放器界面 - */ - loadFace(); - /* - * 判断是否需要默认旋转视频 - */ - if(vars['rotate']>0){ - player.rotate(vars['rotate']); - } - /* - * 判断是否需要默认缩放视频 - */ - if(vars['zoom']>0){ - player.zoom(vars['zoom']); - } - /* - * 判断是否支持video标签 - */ - if(isUndefined(video.canPlayType)){ - CT.error={code:5,message:language['error']['supportVideoError']}; - eventTarget('error',CT.error);//注册监听error - showError(); - return player; - } - /* - * 注册视频播放器内部监听,监听到事件后注册给CT使用 - */ - addAllListener(); - /* - * 如果需要在视频播放器加载成功后调用相关函数,此时则开始调用 - */ - if(!isUndefined(vars['loaded'])){ - if(valType(vars['loaded'])=='function'){ - try{ - vars['loaded'](player); - } - catch(event){} - } - else if(valType(vars['loaded'])=='string'){ - try{ - eval(vars['loaded']+ '(player)'); - } - catch(event){} - } - } - /* - * 播放视频 - */ - if(!existenceObj){ - changeVideo(vars['video']); - } - else{ - changeVideo(video.attr('src')); - } - /* - * 返回 播放器 - */ - return player; - }, - /* - * changeVideo - * 功能:初始化视频地址或修改视频地址 - */ - changeVideo=function (vstr){ - var i=0; - if(video.attr('src') || video.htm()){ - player.pause(); - } - if(video.attr('src') && !existenceObj){ - video.attr('src',''); - video.removeAttr('src'); - } - if(!isUndefined(video.textTracks) && video.textTracks.length>0){ - for(i=video.find('track').length-1;i>-1;i--){ - video.find('track').eq(i).remove(); - } - } - if(!existenceObj){ - video.htm(''); - } - if(!isUndefined(vars['ad'])){ - ad=vars['ad']; - } - var source=''; - if(valType(vstr)=='string'){ - if(vstr.substr(0,8)=='website:' || vstr.substr(0,4)=='url:'){ - var ajaxUrl=''; - if(vstr.substr(0,8)=='website:'){ - ajaxUrl=vstr.substring(8); - } - if(vstr.substr(0,4)=='url:'){ - ajaxUrl=vstr.substring(4); - } - ajax({url:ajaxUrl,success:function(data){ - if(data!=null){ - vars = standardization(varsTemp, data); - changeVideo(vars['video']); - } - else{ - CT.error={code:8,message:language['error']['ajax']}; - eventTarget('error',CT.error);//注册监听error - showError(); - } - }}); - return; - } - else{ - if(vars['plug'] && !canPlay(vstr)){ - plugPlayer(vstr); - } - else{ - if(!existenceObj){ - video.attr('src',vstr); - } - } - loadTrack(); - } - } - else if(valType(vstr)=='array'){ - for(i=0;i1){ - source += ''; - } - } - } - } - if(source){ - video.htm(source); - } - loadTrack(); - } - else if(valType(vstr)=='object'){ - if(vars['plug']){ - plugPlayer(vstr); - } - else{ - CT.error={code:10,message:language['error']['emptied']}; - eventTarget('error',CT.error);//注册监听error - showError(); - } - loadTrack(); - } - if(!isUndefined(video.find('source')) && video.find('source').length>0){ - video.find('source').eq(video.find('source').length-1).addListener('error',videoHandler.error); - } - checkBar(); - loadLogo(); - if(isChangeDef){ - checkDefinition(); - } - /* - * 对cookie进行相关分析 - */ - if(vars['cookie']){ - if(valType(vars['cookie'])=='array' && vars['cookie'].length>=2){ - if(vars['cookie'][0] && valType(vars['cookie'][0])=='string'){ - cookieName=vars['cookie'][0]; - } - if(vars['cookie'][1] && valType(vars['cookie'][1])=='number'){ - cookieTime=vars['cookie'][1]; - } - } - if(valType(vars['cookie'])=='object' && !isUndefined(vars['cookie']['name'])){ - cookieName=vars['cookie']['name']; - if(!isUndefined(vars['cookie']['hour']) && valType(vars['cookie']['hour'])=='number'){ - cookieTime=vars['cookie']['hour']; - } - } - if(valType(vars['cookie'])=='string'){ - cookieName=vars['cookie']; - } - if(cookieName){ - cookieName=cookieName.replace(/[ ]*,[ ]*|[ ]+/g, '').replace(/[ ]*;[ ]*|[ ]+/g, ''); - } - } - if(!isUndefined(vars['seek']) && !seekTime){ - if(valType(vars['seek'])=='number' && vars['seek']>0){ - seekTime=vars['seek']; - } - if(valType(vars['seek'])=='string' && vars['seek']=='cookie' && cookieName){ - var cke=player.cookie(cookieName); - if(cke){ - seekTime=cke['time']; - } - - } - } - }, - /* - * plugPlayer - * 功能:使用插件进行播放 - */ - plugPlayer=function (url){ - switch(vars['plug']){ - case 'hls.js': - hlsPlayer(url); - break; - case 'flv.js': - flvPlayer(url); - break; - case 'mpegts.js': - mpegtsPlayer(url); - break; - case 'dash.js': - dashPlayer(url); - break; - default: - if(valType(vars['plug'])=='function'){ - vars['plug'](video,url); - } - else{ - CT.error={code:10,message:language['error']['emptied']}; - eventTarget('error',CT.error);//注册监听error - showError(); - } - - break; - } - }, - /* - * hlsPlayer - * 功能:使用hls.js插件进行播放 - */ - hlsPlayer=function (url){ - var path=getPath('hls.js')+'hls.min.js'; - loadJs(path,function(){ - if (!isUndefined(Hls) && Hls.isSupported()) { - hls = new Hls(); - hls.loadSource(url); - hls.attachMedia(video); - hls.on(Hls.Events.ERROR, function(event, data){ - var code=9; - var message=language['error']['loadingFailed']; - var fatal=data.fatal; - if(!isUndefined(data.response)){ - if(!isUndefined(data.response.code)){ - code=data.response.code; - } - if(!isUndefined(data.response.text) && data.response.text){ - message=data.response.text; - } - else{ - if(!isUndefined(event)){ - message=event; - } - } - } - CT.error={code:code,message:message}; - eventTarget('error',CT.error);//注册监听error - if(fatal){ - showError(); - } - }); - } - else if(canPlay(url)){ - video.attr('src',url); - } - }); - }, - /* - * flvPlayer - * 功能:使用flv.js插件进行播放 - */ - flvPlayer=function (url){ - var path=getPath('flv.js')+'flv.min.js'; - loadJs(path,function(){ - if (typeof(flvjs)!='undefined' && !isUndefined(flvjs) && flvjs.isSupported()) { - var config={ - type: 'flv', - url: url - }; - if(valType(url)=='object'){ - config=url; - } - if(vars['live']){ - config['isLive']=true; - } - if(pugPlayer){ - pugPlayer.pause(); - pugPlayer.unload(); - pugPlayer.detachMediaElement(); - pugPlayer.destroy(); - pugPlayer=null; - } - pugPlayer = flvjs.createPlayer(config); - pugPlayer.attachMediaElement(video); - pugPlayer.load(); - pugPlayer.on(flvjs.Events.METADATA_ARRIVED, function(res){ - videoHandler.loadedMetaData(); - }); - pugPlayer.on(flvjs.Events.ERROR, function(errorType, errorDetail, errorInfo){ - CT.error={code:errorInfo['code'],message:errorInfo['msg']}; - eventTarget('error',CT.error);//注册监听error - showError(); - }); - } - }); - }, - /* - * mpegtsPlayer - * 功能:使用mpegts.js插件进行播放 - */ - mpegtsPlayer=function (url){ - var path=getPath('mpegts.js')+'mpegts.js'; - loadJs(path,function(){ - if (typeof(mpegts)!='undefined' && !isUndefined(mpegts) && mpegts.getFeatureList().mseLivePlayback) { - var config={ - type: 'mse', - url: url - }; - if(valType(url)=='object'){ - config=url; - } - if(vars['live']){ - config['isLive']=true; - } - if(pugPlayer){ - pugPlayer.pause(); - pugPlayer.unload(); - pugPlayer.detachMediaElement(); - pugPlayer.destroy(); - pugPlayer=null; - } - pugPlayer = mpegts.createPlayer(config); - pugPlayer.attachMediaElement(video); - pugPlayer.load(); - - pugPlayer.on(mpegts.Events.METADATA_ARRIVED, function(res){ - videoHandler.loadedMetaData(); - }); - pugPlayer.on(mpegts.Events.ERROR, function(errorType, errorDetail, errorInfo){ - CT.error={code:errorInfo['code'],message:errorInfo['msg']}; - eventTarget('error',CT.error);//注册监听error - showError(); - }); - } - }); - }, - /* - * canPlay - * 功能:判断是否能支持相关视频格式 - */ - canPlay=function(vStr,num){ - var vTypeArr=[ - {vidType:'video/ogg',codType:'theora, vorbis'}, - {vidType:'video/mp4',codType:'avc1.4D401E, mp4a.40.2'}, - {vidType:'video/mp4',codType:'avc1'}, - {vidType:'video/mp4',codType:'hevc'}, - {vidType:'video/webm',codType:'vp8.0, vorbis'}, - {vidType:'video/webm',codType:'vp9'}, - {vidType:'',codType:'application/x-mpegURL'}, - {vidType:'',codType:'application/vnd.apple.mpegurl'} - ]; - var vType={ - ogg:vTypeArr[0], - mp4:[vTypeArr[1],vTypeArr[2],vTypeArr[3]], - webm:[vTypeArr[4],vTypeArr[5]], - m3u8:[vTypeArr[6],vTypeArr[7]] - }; - var arr=[]; - var k=''; - var supportType=function(obj){ - var vType=obj['vidType']; - var str=''; - if(vType){ - str=vType+'; '+ 'codecs="' + obj['codType'] + '"'; - } - else{ - str=obj['codType']; - } - var sup = video.canPlayType(str); - if(sup == '') { - sup = 'no'; - } - return sup; - }; - var getExtension=function(filepath) { - return filepath.replace(/.+\./, ''); - }; - if(isUndefined(num)){ - if(valType(vStr)=='string'){ - if(vars['type']){ - for(k in vTypeArr){ - if(vTypeArr[k]['vidType']==vars['type']){ - arr.push(vTypeArr[k]); - } - } - } - else{ - if(getExtension(vStr) && getExtension(vStr) in vType){ - var temp=vType[getExtension(vStr)]; - if(valType(temp)=='array'){ - for(var i=0;i0){ - for(var i=0;icTime && arr[i][0]!=cookieName && y<19){ - tempArr.push(arr[i]); - y++; - } - } - arr=tempArr; - } - if(arr.length>0){ - cookie(moeplayerCookie,'delete',vars['domain'],vars['cookiePath']); - cookie(moeplayerCookie,arrayToString(arr),vars['domain'],vars['cookiePath']); - } - cookieArray=arr; - }, - /* - * loadTrack - * 功能:加载track - */ - loadTrack=function(){ - if(isUndefined(video.textTracks)){ - return; - } - var i=0; - if(!isUndefined(vars['track']) && valType(vars['track'])=='array' && !video.find('track')){ - var track=''; - var arr=vars['track']; - C['bar']['track'].show(); - for(i=0;i'; - } - if(video){ - var html=video.htm()+track; - video.htm(html); - } - if(video.find('track') && !loadedTrack){ - loadedTrack=true; - checkTrack(); - } - } - }, - /* - * loadedMetaData - * 功能:获取元数据后执行的函数 - */ - loadedMetaData=function(){ - eventTarget('loadedMetaData',{ - width:CK.getWidth(), - height:CK.getHeight(), - videoWidth:CT.videoWidth, - videoHeight:CT.videoHeight, - duration:duration, - volume:CT.volume - }); - eventTarget('duration',duration); - if('error' in C){ - C['error'].hide(); - } - replaceInformation('videoWidth',CT.videoWidth); - replaceInformation('videoHeight',CT.videoHeight); - replaceInformation('volume',parseInt(CT.volume*100)); - replaceInformation('duration',parseInt(duration)); - documentHidden(function(state){ - if(vars['documentFocusPause']){ - if(state=='show'){ - if(!focusPause && paused){ - player.play(); - } - } - else{ - focusPause=paused; - player.pause(); - } - } - }); - }; - /* - * videoHandler - * 功能:视频播放对象video注册内部监听调用函数 - */ - var videoHandler={ - loadStart:function(){ - if(!vars['controls'] && app!='iphone'){ - C['loading'].show(); - } - C['centerPlay'].hide(); - eventTarget('loadstart'); - - }, - canPlay:function(){ - C['loading'].hide(); - eventTarget('canplay'); - }, - loadedData:function(){ - eventTarget('loadeddata'); - }, - loadedMetaData:function(){ - duration=this.duration; - if(!isUndefined(this.duration) && vars['duration']){ - duration=vars['duration']; - } - if(!vars['live']){ - C['time'].htm(formatSeconds(this.currentTime)+'/'+formatSeconds(duration)); - C['tempTime'].htm(formatSeconds(this.currentTime)+'/'+formatSeconds(duration)); - } - C['loading'].hide(); - if(vars['poster']){ - video.attr('poster',vars['poster']); - } - if(!vars['autoplay'] && !vars['controls']){ - C['centerPlay'].show(); - C['buffer'].hide(); - } - - CT.duration=duration; - CT.videoWidth=this.videoWidth; - CT.videoHeight=this.videoHeight; - CT.volume=this.volume; - if(CT.videoWidth || CT.videoHeight || duration){ - loadedMetaData(); - } - var len = 0; - if(!isUndefined(this.buffered)){ - len=this.buffered.length; - } - if(len>0){ - changeLoad(); - } - if(!vars['live']){ - changePreview(vars['preview']);//修改预览图片 - } - else{ - changePreview();//修改预览图片 - } - if(!isUndefined(vars['prompt']) && valType(vars['prompt'])=='array' && !vars['live']){ - changePrompt(); - } - else{ - deletePrompt(); - } - if(isChangeDef){ - checkDefinition(); - isChangeDef=false; - } - pSliderMouseDown=false; - loadedmetadataNum++; - if(!isUndefined(ad) && !isUndefined(ad['frontPlay']) && ad['frontPlay'] && loadedmetadataNum>1){//如果是贴片广告播放中,则进行播放和计算 - player.play(); - calculationAdFrontTime(duration);//计算贴片广告的时间 - } - if(!isUndefined(ad) && !isUndefined(ad['frontPlay']) && !ad['frontPlay']){//如果广告播放结束则播放正片 - player.volume(vars['volume']); - player.play(); - } - if(!vars['autoplay'] && loadMeta){ - loadMeta=false; - player.pause(); - setTimeout(player.pause,300); - } - }, - timeUpDate:function(){//监听播放时间 - if(!waited){ - waited=true; - C['buffer'].hide(); - eventTarget('buffer','end'); - } - var len = this.buffered.length; - if(len>0){ - changeLoad(); - } - if(!duration && this.duration){ - duration=this.duration; - CT.duration=duration; - CT.videoWidth=this.videoWidth; - CT.videoHeight=this.videoHeight; - if(CT.videoWidth || CT.videoHeight || duration){ - loadedMetaData(); - } - } - oldTime=playTime; - playTime=this.currentTime; - if(maxSeeTime1){//如果是贴片广告播放中,则进行播放 - calculationAdFrontTime(duration-playTime);//计算贴片广告的时间 - } - if(!isUndefined(C['error']) && C['error'].css('display')=='block'){ - C['error'].hide(); - } - if(cookieName){ - changeCookie(playTime); - } - replaceInformation('audioDecodedByteCount',this.webkitAudioDecodedByteCount || this.audioDecodedByteCount || 0); - replaceInformation('videoDecodedByteCount',this.webkitVideoDecodedByteCount || this.videoDecodedByteCount || 0); - }, - ended:function(){//监听播放结束 - if(!isUndefined(ad) && !isUndefined(ad['frontPlay']) && ad['frontPlay']){//如果是贴片广告播放中,则用广告结束函数对此进行判断 - adFrontEnded(); - } - else{ - C['bar']['playAndPause']['pause'].hide(); - C['bar']['playAndPause']['play'].hide(); - C['bar']['playAndPause']['refresh'].show(); - eventTarget('ended'); - showEnded(); - message(); - } - }, - error:function(event){ - if(!isUndefined(event.type)){ - var errorInfo=this.error; - var errorBak=function(){ - var code=12; - var msg=language['error']['loadingFailed']; - if(!isUndefined(errorInfo)){ - if(!isUndefined(errorInfo.code)){ - code=errorInfo.code; - } - if(!isUndefined(errorInfo.message)){ - msg=errorInfo.message; - } - CT.error={code:code,message:msg}; - showError(); - } - else{ - CT.error={code:code,message:msg}; - if(event.target.attr('src')){ - showError(); - } - } - eventTarget('error',CT.error);//注册监听error - }; - if(event.type=='error'){ - try{ - if(video.currentSrc){ - ajax({url:video.currentSrc,error:function(info){ - if(info && valType(info)=='object' && 'code' in info && info['code']){ - CT.error=info; - eventTarget('error',CT.error);//注册监听error - showError(); - } - else{ - errorBak(); - } - },success:function(data){ - if(!data){ - errorBak(); - } - }}); - } - else{ - errorBak(); - } - } - catch(event){ - errorBak(); - } - } - } - }, - stalled:function(){ - eventTarget('stalled');//注册监听error - CT.error={code:13,message:'load:stalled'}; - eventTarget('error',CT.error);//注册监听error - }, - suspend:function(){ - eventTarget('suspend');//注册监听error - }, - emptied:function(){ - eventTarget('emptied');//注册监听error - CT.error={code:7,message:language['error']['emptied']}; - eventTarget('error',CT.error);//注册监听error - }, - seeked:function(){ - if(paused){ - player.play(); - } - pSliderMouseDown=false; - eventTarget('seek',{time:this.currentTime,state:'seeked'}); - eventTarget('seeked'); - }, - seeking:function(){ - if(paused){ - player.play(); - } - var seekingTime=this.currentTime; - if(firstSeekTime==-1){ - firstSeekTime=seekingTime;//记录第一次拖动的时间 - } - switch(vars['timeScheduleAdjust']){ - case 0://禁止拖动 - if(oldTime!=seekingTime){ - waitingMessage=false; - player.seek(oldTime); - message(language['timeScheduleAdjust']['prohibit']); - return; - } - break; - case 2://只能前进(向右拖动 - if(seekingTimeoldTime){ - waitingMessage=false; - player.seek(oldTime); - message(language['timeScheduleAdjust']['prohibitForward']); - return; - } - break; - case 4://只能前进但能回到第一次拖动时的位置 - if(seekingTimemaxSeeTime){ - waitingMessage=false; - player.seek(maxSeeTime); - message(language['timeScheduleAdjust']['prohibitForwardNotViewed']); - return; - } - break; - } - eventTarget('seek',{time:seekingTime,state:'seeking'}); - eventTarget('seeking'); - if(!vars['live']){ - C['time'].htm(formatSeconds(seekingTime)+'/'+formatSeconds(duration)); - C['tempTime'].htm(formatSeconds(seekingTime)+'/'+formatSeconds(duration)); - } - - }, - waiting:function(){ - waited=false; - eventTarget('buffer','start');//注册监听视频缓冲 - C['centerPlay'].hide(); - if(!vars['controls']){ - C['buffer'].show(); - } - if(!waitingMessage){ - waitingMessage=true; - } - else{ - message(language['waiting']); - } - - }, - play:function(){ - paused=false; - C['bar']['playAndPause']['play'].hide(); - C['bar']['playAndPause']['pause'].show(); - C['bar']['playAndPause']['refresh'].hide(); - C['centerPlay'].hide(); - if(playType=='button'){ - C['bar']['pbox'].removeClass('ck-bar-progress-out'); - } - else{ - C['bar']['pbox'].addClass('ck-bar-progress-out'); - } - if(recoveryVolume){ - recoveryVolume=false; - player.exitMuted(); - } - hideBar(); - closePauseAd();//关闭暂停广告 - playType=''; - if(!isUndefined(C['ended'])){ - player.closeLayer(C['ended']); - } - if('error' in C){ - C['error'].hide(); - } - eventTarget('play'); - if(!isUndefined(ad)){//如果存在广告 - if(!isUndefined(ad['front'])){//如果存在贴片广告 - if(isUndefined(ad['frontPlay'])){//如果贴片广告还未播放 - ad['frontPlayI']=0; - ad['frontPlay']=true;//开始播放贴片广告 - player.pause();//暂停视频 - adFrontPlay(); - return; - } - } - } - if(seekTime && (isUndefined(vars['live']) || (!isUndefined(vars['live']) && valType(vars['live'])=='boolean' && !vars['live'])) && seekTime0 && mutedState){ - this.muted=false; - } - if(mutedState!=this.muted){ - mutedState=this.muted; - changeMuted(this.muted); - CT.muted=this.muted; - eventTarget('muted',CT.muted);//注册静音事件 - } - CT.volume=this.volume; - eventTarget('volume',this.volume);//注册音量事件 - if(!isUndefined(C['bar']['vbox'])){ - var vol=parseInt(this.volume*100); - C['bar']['vbox']['volume']['txt'].htm(vol); - if(!C['bar']['vbox']['mouseDown']){ - changeVolumeSlider(this.muted?0:this.volume); - } - if(!this.muted){//如果非静音状态 - message(language['volume']+vol+'%'); - } - } - replaceInformation('volume',parseInt(this.volume*100)); - }, - resize:function(){ - var fullState = document.fullScreen || document.mozFullScreen || document.webkitIsFullScreen || document.msFullscreenElement; - if(fullState) { - C['bar']['fullAndExit']['exitFull'].show(); - C['bar']['fullAndExit']['full'].hide(); - C['ad']['bottom']['fullAndExit']['exitFull'].show(); - C['ad']['bottom']['fullAndExit']['full'].hide(); - if(!CM.hasClass('ck-main-full')){ - CM.addClass('ck-main-full'); - } - message(language['full']); - C['bar']['webFullAndExit'].hide(); - C['bar']['theatreAndExit'].hide(); - if(!isUndefined(C['menu'])){ - CM.append(C['menu']); - } - } - else { - fullState=false; - C['bar']['fullAndExit']['full'].show(); - C['bar']['fullAndExit']['exitFull'].hide(); - C['ad']['bottom']['fullAndExit']['full'].show(); - C['ad']['bottom']['fullAndExit']['exitFull'].hide(); - if(CM.hasClass('ck-main-full')){ - CM.removeClass('ck-main-full'); - } - if(!isUndefined(vars['webFull']) && vars['webFull']){ - C['bar']['webFullAndExit'].show(); - } - if(!isUndefined(vars['theatre']) && !CT.webFull){ - C['bar']['theatreAndExit'].show(); - } - if(!isUndefined(C['menu'])){ - $('body').append(C['menu']); - } - if(CV.css('width')!=CM.css('width')){ - player.zoom(100); - } - } - if(CT.full!=fullState){ - CT.full=fullState; - eventTarget('full',fullState);//注册播放事件 - } - checkVideoRotate(); - changeProgress(player.time()); - }, - keydown:function(event){ - event=window.event || event; - var keycode = event.keyCode || event.which; - var v=player.volume(); - var pre=function(){ - if(event.preventDefault){ - event.preventDefault(); - } - else{ - event.returnValue = false; - } - }; - switch(keycode) { - case 32: - pre(); - player.playOrPause(); - break; - case 37: - player.fastBack(); - break; - case 39: - player.fastNext(); - break; - case 38: - if(valType(vars['keyVolume'])=='number' && (vars['keyVolume']==1 || (vars['keyVolume']==2 && CT.full))){ - pre(); - player.volume(v+.1<1?v+=.1:1); - } - break; - case 40: - if(valType(vars['keyVolume'])=='number' && (vars['keyVolume']==1 || (vars['keyVolume']==2 && CT.full))){ - pre(); - player.volume(v-.1>0?v-=.1:0); - } - break; - default: - break; - } - }, - mouseWheel:function(event){ - if(valType(vars['mouseWheelVolume'])=='number' && (vars['mouseWheelVolume']==1 || (vars['mouseWheelVolume']==2 && CT.full))){ - event=window.event || event; - var v=player.volume(); - if(event.preventDefault){ - event.preventDefault(); - } - else{ - event.returnValue = false; - } - if(event.wheelDelta) { - if(event.wheelDelta > 0) { - player.volume(v+.1<1?v+=.1:1); - } - if(event.wheelDelta < 0) { - player.volume(v-.1>0?v-=.1:0); - } - } else if(event.detail) { - if(event.detail > 0) { - player.volume(v-.1>0?v-=.1:0); - } - if(event.detail < 0) { - player.volume(v+.1<1?v+=.1:1); - } - } - } - - } - }; - /* - * adFrontPlay - * 功能:播放贴片广告 - */ - var adFrontPlay=function(){ - if(ad['frontPlayI']==0){//如果是播放第一个广告,则显示相关组件 - allBarHide(false); - C['ad'].show(); - ad['front']['video']=false;//初始化,不包含视频广告 - //判断是否需要启用固定时间后关闭广告按钮 - if(!isUndefined(ad['front']['closeTime'])){ - if(ad['front']['closeTime']>0){ - C['ad']['top']['closeTime'].show(); - adFrontCloseTime(); - } - else{ - C['ad']['top']['closeAd'].show(); - } - } - } - if(!isUndefined(ad['front']['node']) && ad['front']['node']!=null){ - CM.append(ad['front']['node']); - player.closeLayer(ad['front']['node']); - ad['front']['node']=null; - } - C['ad']['picture'].htm(''); - C['ad']['picture'].hide(); - C['ad']['link'].hide(); - if(!isUndefined(ad['front']['list'][ad['frontPlayI']])){ - var adv=ad['front']['list'][ad['frontPlayI']]; - frontAdPlay=true;//贴片广告播放状态 - eventTarget('frontAd',adv); - if(adv['type']=='picture'){ - adPicturePlay(adv); - } - else if(adv['type']=='node'){ - adNode(adv); - } - else{ - C['ad']['link'].attr('data-link',adv['link']); - adVideoPlay(adv['file']); - } - if(!isUndefined(adv['link'])){ - C['ad']['bottom']['details'].show(); - C['ad']['bottom']['details'].htm(''+language['details']+''); - } - else{ - C['ad']['bottom']['details'].hide(); - } - } - }, - /* - * adFrontCloseTime - * 功能:播放贴片广告时按指定时间后显示关闭广告按钮 - */ - adFrontCloseTime=function(){ - if(!isUndefined(ad['front']['closeSetTime'])){ - clearTimeout(ad['front']['closeSetTime']); - ad['front']['closeSetTime']=null; - } - C['ad']['top']['closeTime'].htmReplace('{seconds}',ad['front']['closeTime'],language['closeTime']); - ad['front']['closeTime']--; - if(ad['front']['closeTime']>0){ - ad['front']['closeSetTime']=setTimeout(adFrontCloseTime,1000); - } - else{ - C['ad']['top']['closeAd'].show(); - C['ad']['top']['closeTime'].hide(); - } - }, - /* - * calculationAdFrontTime - * 功能:计算贴片广告倒计时时间以及广告是视频时用于倒计时 - */ - calculationAdFrontTime=function(t){ - if(!isUndefined(t)){ - ad['front']['list'][ad['frontPlayI']]['time']=t; - } - ad['front']['countDown']=0; - for(var i=ad['frontPlayI'];i0){ - adv['time']--; - ad['front']['countDown']--; - C['ad']['top']['countDown'].htm(ad['front']['countDown']+language['second']); - adFrontSetTime=setTimeout(adFrontCountDown,1000); - } - else{ - adFrontEnded(); - } - }, - /* - * adFrontEnded - * 功能:贴片广告单个播放完成后进行判断是否需要播放下一个广告还是播放正片 - */ - adFrontEnded=function(){ - if(ad['frontPlayI']0 || h>0){ - if(adv['link']){ - var a=createlA('',adv['link']); - a.append(this); - C['ad']['picture'].append(a); - } - else{ - C['ad']['picture'].append(this) - } - img.unbind(); - img.click(function(){ - eventTarget('frontAdClick',adv); - }); - } - else{ - if(imgloadNum<10){ - imgloadNum++; - imgLoadHandler(); - } - } - }); - }; - imgLoadHandler(); - calculationAdFrontTime();//计算时间 - adFrontCountDown();//开启倒计时 - C['ad']['bottom']['mutedAndExit'].hide(); - }, - /* - * adNode - * 功能:贴片广告播放外部节点 - */ - adNode=function(adv){ - if(isUndefined(adv['content'])) return; - ad['front']['node']=player.layer(adv); - ad['front']['node'].css({'z-index':1}); - C['ad'].append(ad['front']['node']); - ad['front']['node'].unbind(); - ad['front']['node'].click(function(){ - eventTarget('frontAdClick',adv); - }); - calculationAdFrontTime();//计算时间 - adFrontCountDown();//开启倒计时 - C['ad']['bottom']['mutedAndExit'].hide(); - }, - /* - * frontVideoClickHandler - * 功能:视频广告上方层单击事件 - */ - frontVideoClickHandler=function(){ - var url=C['ad']['link'].attr('data-link'); - window.open(url,'_blank'); - }, - /* - * closeFrontAd - * 功能:关闭贴片广告 - */ - closeFrontAd=function(){ - if(!isUndefined(ad) && !isUndefined(ad['front']) && !isUndefined(ad['front']['closeButtonClick'])){ - if(valType(ad['front']['closeButtonClick'])=='function'){ - try{ - ad['front']['closeButtonClick'](); - } - catch(event){console.error(event);} - } - else if(valType(ad['front']['closeButtonClick'])=='string'){ - try{ - eval(ad['front']['closeButtonClick']+ '()'); - } - catch(event){console.error(event);} - } - } - else{ - player.closeFrontAd(); - } - }, - /* - * adPausePlay - * 功能:播放暂停广告 - */ - adPausePlay=function(){ - closePauseAd(); - if(!isUndefined(ad) && !isUndefined(ad['pause']) && !isUndefined(ad['pause']['list']) && ad['pause']['list'].length-1>=ad['pausePlayI']){ - var adv=ad['pause']['list'][ad['pausePlayI']]; - if(!isUndefined(ad['pause']['close']) && ad['pause']['close']){ - ad['pauseClose']=createlButton('ck-pause-close'); - ad['pauseClose'].click(function(){ - C['centerPlay'].show(); - C['buffer'].hide(); - closePauseAd(); - }); - } - if(!isUndefined(adv['file'])){//图片 - var img = null; - var imgloadNum=0; - var imgLoadHandler=function(){ - img = createlImg(adv['file']); - C['adPause'].show(); - C['adPause'].htm(''); - C['adPause'].append(img); - img.addListener('load',function(){ - var w=this.getWidth(),h=this.getHeight(); - if(w>0 || h>0){ - C['adPause'].htm(''); - if(adv['link']){ - var a=createlA('',adv['link']); - a.append(this); - C['adPause'].append(a); - } - else{ - C['adPause'].append(this) - } - - C['adPause'].css({ - 'width':w+'px', - 'height':h+'px' - }); - if(ad['pauseClose']){ - C['adPause'].append(ad['pauseClose']); - } - img.click(function(){ - eventTarget('pauseAdClick',adv); - }); - } - else{ - if(imgloadNum<10){ - imgloadNum++; - imgLoadHandler(); - } - } - }); - }; - imgLoadHandler(); - } - else if(!isUndefined(adv['content'])){ - ad['pause']['node']=player.layer(adv); - if(ad['pauseClose']){ - ad['pause']['node'].append(ad['pauseClose']); - } - ad['pause']['node'].click(function(){ - eventTarget('pauseAdClick',adv); - }); - } - eventTarget('pauseAd',adv); - if(!isUndefined(adv['time']) && adv['time']>0){ - adPauseSetTime=setTimeout(function(){ - ad['pausePlayI']++; - if(ad['pausePlayI']>ad['pause']['list'].length-1){ - ad['pausePlayI']=0; - } - adPausePlay(); - },adv['time']*1000) - } - } - }, - /* - * closePauseAd - * 功能:关闭暂停广告 - */ - closePauseAd=function(){ - if(adPauseSetTime){ - clearTimeout(adPauseSetTime); - adPauseSetTime=null; - } - C['adPause'].hide(); - if(!isUndefined(ad) && !isUndefined(ad['pauseClose']) && ad['pauseClose']!=null){ - ad['pauseClose'].remove(); - ad['pauseClose']=null; - } - if(!isUndefined(ad) && !isUndefined(ad['pause']) && !isUndefined(ad['pause']['node']) && ad['pause']['node']){ - ad['pause']['node'].unbind(); - player.closeLayer(ad['pause']['node']); - eventTarget('pauseAdClose'); - } - }; - /* - * player - * 功能:开放接口,向外部提供播放器的交互功能列表,包含获取,执行,监听这三种功能 - */ - var player={ - /* - * width - * 功能:获取或设置播放器宽度 - * 这是一个动态的值,会随着全屏切换或播放器本身尺寸变化而变化 - * @value,支持数字,字符,当存在@value时则设置播放器宽度,@value为空时则获取播放器宽度 - */ - width:function(value){ - if(!isUndefined(value)){ - if(valType(value)=='number'){ - value+='px'; - } - CT.css({'width':value}); - checkVideoRotate(); - } - return CK.getWidth(); - }, - /* - * height - * 功能:获取或设置播放器显示高度 - * 这是一个动态的值,会随着全屏切换或播放器本身尺寸变化而变化 - * @value,支持数字,字符,当存在@value时则设置播放器高度,@value为空时则获取播放器高度 - */ - height:function(value){ - if(!isUndefined(value)){ - if(valType(value)=='number'){ - value+='px'; - } - CT.css({'height':value}); - checkVideoRotate(); - } - return CK.getHeight(); - }, - /* - * videoWidth - * 功能:获取视频本身的宽度,这是一个固定值 - */ - videoWidth:function(){ - if(video){ - return video.videoWidth; - } - return null; - }, - /* - * videoHeight - * 功能:获取视频本身的高度,这是一个固定值 - */ - videoHeight:function(){ - if(video){ - return video.videoHeight; - } - return null; - }, - /* - * height - * 功能:获取或设置播放器显示高度 - * 这是一个动态的值,会随着全屏切换或播放器本身尺寸变化而变化 - * @value,支持数字,字符,当存在@value时则设置播放器高度,@value为空时则获取播放器高度 - */ - zoom:function(fn){ - if(!isUndefined(fn)){ - if(valType(fn)=='function'){ - newEvent.addEventListener('zoom',fn); - } - if(valType(fn)=='number'){ - var arr=[C['topBar']['zoomEle']['zoom50'],C['topBar']['zoomEle']['zoom75'],C['topBar']['zoomEle']['zoom100']]; - for(var i=0;ifn && fn>0){ - rot=arr[fn]; - } - else{ - if(arr.indexOf(fn)>-1){ - rot=fn; - } - } - if(rot!=nowRotate){ - eventTarget('rotate',rot); - nowRotate=rot; - checkVideoRotate();//调整视频尺寸 - } - } - } - }, - /* - * vars - * 提供给播放器外部使用 - * 修改vars,动态切换视频地址 - * @obj为新的播放配置对象 - */ - vars:function(obj,val){ - if(isUndefined(obj)){ - return; - } - if(valType(obj)=='string' && !isUndefined(val)){ - var temp={}; - temp[obj]=val; - obj=temp; - } - var isChange=false; - for(var k in obj){ - if(k in vars && obj[k]!=vars[k]){ - isChange=true; - break; - } - } - if(isChange){ - vars = standardization(vars, obj); - } - if(!isUndefined(obj['video'])){ - isChangeDef=true; - changeVideo(vars['video']); - } - if(!isUndefined(obj['title'])){ - C['topBar']['titleEle'].htm(obj['title']); - } - }, - /* - * 提供给播放器外部使用 - * 功能:监听视频准备加载 - */ - loadstart:function(fn){ - if(!isUndefined(fn) && valType(fn)=='function'){ - newEvent.addEventListener('loadstart',fn); - } - }, - /* - * 提供给播放器外部使用 - * 功能:监听视频加载 - */ - loadeddata:function(fn){ - if(!isUndefined(fn) && valType(fn)=='function'){ - newEvent.addEventListener('loadeddata',fn); - } - }, - /* - * 提供给播放器外部使用 - * 功能:监听视频元数据加载成功 - */ - loadedMetaData:function(fn){ - if(!isUndefined(fn) && valType(fn)=='function'){ - newEvent.addEventListener('loadedMetaData',fn); - } - }, - /* - * 提供给播放器外部使用 - * 功能:监听视频可以播放 - */ - canplay:function(fn){ - if(!isUndefined(fn) && valType(fn)=='function'){ - newEvent.addEventListener('canplay',fn); - } - }, - /* - * 提供给播放器外部使用 - * 功能:执行播放操作/监听播放 - * @fn为函数时则监听视频播放,@fn为空时,则控制视频播放 - */ - play:function(fn){ - if(valType(fn)=='object'){ - if(fn['target']==C['bar']['playAndPause']['play'] || fn['target']==C['bar']['playAndPause']['refresh']){ - playType='button'; - } - } - if(!isUndefined(fn) && valType(fn)=='function'){ - newEvent.addEventListener('play',fn); - } - else{ - if(loadedmetadataNum>0 && video){ - try{video.play();}catch(event){console.error(event)} - } - } - return player; - }, - /* - * puase - * 功能:执行暂停操作/监听暂停 - * @fn为函数时则监听视频暂停,@fn为空时,则控制视频暂停 - */ - pause:function(fn){ - if(!isUndefined(fn) && valType(fn)=='function'){ - newEvent.addEventListener('pause',fn); - } - else{ - if(loadedmetadataNum>0 && video){ - try{video.pause();}catch(event){console.error(event)} - } - } - return player; - }, - /* - * playOrPause - * 功能:在播放和暂停动作之间进行切换 - */ - playOrPause:function(){ - if(paused){ - player.play(); - } - else{ - player.pause(); - } - return player; - }, - /* - * volume - * 功能:调节和监听以及获取音量 - * @fn为函数时,则进行音量变化的监听,@fn为数字时,则进行音量调节,@fn为空时,则获取当前音量 - */ - volume:function(fn){ - if(!isUndefined(fn)){ - if(valType(fn)=='function'){ - newEvent.addEventListener('volume', fn); - } - else if(valType(fn)=='number' && video){ - if(fn<0)fn=0; - if(fn>1)fn=1; - if(video.muted){ - video.volume=fn*.5; - } - video.volume=fn; - } - } - else if(video){ - return video.volume; - } - return player; - }, - /* - * muted - * 功能:执行静音操作/监听静音 - * @fn为函数时则监听视频静音,@fn为空时,则控制视频静音 - */ - muted:function(fn){ - if(!isUndefined(fn) && valType(fn)=='function'){ - newEvent.addEventListener('muted', fn); - } - else if(video){ - video.muted=true; - } - return player; - }, - /* - * exitMuted - * 功能:执行取消静音操作 - */ - exitMuted:function(){ - if(video){ - video.muted=false; - if(video.volume==0){ - player.volume(vars['volume']>0?vars['volume']:.8); - } - } - return player; - }, - /* - * time - * 功能:获取当前播放时间/监听播放时间 - * @fn为函数时监听当前播放时间,为空时获取当前播放时间 - */ - time:function(fn){ - if(!isUndefined(fn) && valType(fn)=='function'){ - newEvent.addEventListener('time',fn); - } - else if(video){ - return video.currentTime || 0; - } - }, - /* - * seek - * 功能:监听跳转/执行跳转操作 - * @fn为函数时则监听视频跳转动作,@fn为数字时执行跳转操作 - */ - seek:function(fn){ - if(!isUndefined(fn)){ - if(valType(fn)=='function'){ - newEvent.addEventListener('seek',fn); - } - if(valType(fn)=='number' && video){ - switch(vars['timeScheduleAdjust']){ - case 0://禁止拖动 - message(language['timeScheduleAdjust']['prohibit']); - return; - break; - case 1://可以拖动 - break; - case 2://只能前进(向右拖动 - if(fnoldTime){ - message(language['timeScheduleAdjust']['prohibitForward']); - return; - } - break; - case 4://只能前进但能回到第一次拖动时的位置 - if(fnmaxSeeTime){ - waitingMessage=false; - video.currentTime=maxSeeTime; - message(language['timeScheduleAdjust']['prohibitForwardNotViewed']); - return; - } - break; - } - pSliderMouseDown=false; - video.currentTime=fn; - } - } - return player; - }, - /* - * buffer - * 功能:监听视频缓冲 - * @fn为监听执行的函数 - */ - buffer:function(fn){ - if(!isUndefined(fn) && valType(fn)=='function'){ - newEvent.addEventListener('buffer',fn); - } - return player; - }, - /* - * ended - * 功能:监听视频播放结束 - * @fn为监听执行的函数 - */ - ended:function(fn){ - if(!isUndefined(fn) && valType(fn)=='function'){ - newEvent.addEventListener('ended',fn); - } - return player; - }, - /* - * 提供给播放器外部使用 - * 功能:监听点击下一集按钮的动作 - */ - next:function(fn){ - if(!isUndefined(fn) && valType(fn)=='function'){ - newEvent.addEventListener('next',fn); - } - return player; - }, - /* - * error - * 功能,监听播放器在加载视频过程和播放视频过程中出现的错误 - * @fn为监听执行的函数 - */ - error:function(fn){ - if(!isUndefined(fn) && valType(fn)=='function'){ - newEvent.addEventListener('error',fn); - } - return player; - }, - /* - * emptied - * 功能,监听播放器播放的视频文件发生故障并且文件突然不可用时 - * @fn为监听执行的函数 - */ - emptied:function(fn){ - if(!isUndefined(fn) && valType(fn)=='function'){ - newEvent.addEventListener('emptied',fn); - } - return player; - }, - /* - * duration - * 功能:获取视频总时间/监听视频总时间 - * @fn为函数时执行监听视频总时间,为空时获取视频总时间 - */ - duration:function(fn){ - if(!isUndefined(fn) && valType(fn)=='function'){ - newEvent.addEventListener('duration',fn); - } - else{ - return duration || 0; - } - }, - /* - * playbackRate - * 功能:监听或返回视频播放速度 - * @fn为函数时执行监听视频播放速度,为数字时切换播放速度,为空时获取视频播放速度 - */ - playbackRate:function(fn){ - if(!isUndefined(fn)){ - if(valType(fn)=='function'){ - newEvent.addEventListener('playbackRate',fn); - } - else if(valType(fn)=='number' && video){ - video.playbackRate=fn; - CT.playbackRate=fn; - eventTarget('playbackRate',fn); - changePlaybackrateVal(fn); - } - - } - else{ - return video.playbackRate; - } - }, - /* - * track - * 功能:监听或返回视频的字幕 - * @fn为函数时执行监听视频字幕,为数字时切换字幕,为空时获取字幕 - */ - track:function(fn){ - if(!isUndefined(fn)){ - if(valType(fn)=='function'){ - newEvent.addEventListener('track',fn); - } - else if(valType(fn)=='number' && video){ - var track=null; - if(!isUndefined(video.textTracks)){ - track=video.textTracks; - } - if(track && valType(track)=='texttracklist'){ - var arr=vars['track']; - for(var i=track.length-1;i>-1;i--){ - video.find('track').eq(i).remove(); - } - for(var i=0;i'; - } - if(video){ - var html=video.htm()+track; - video.htm(html); - } - changeTrackVal(fn); - } - } - - } - else{ - return CT.track; - } - }, - /* - * fastBack - * 功能:快退 - * @num为数字时快退指定秒数,为空时快退20秒 - */ - fastBack:function(num){ - if(duration==0) return; - if(isUndefined(num) || valType(num)!='number'){ - num=20; - } - var time=player.time(); - if(time-num>0){ - time-=num; - } - else{ - time=0; - } - player.seek(time); - return player; - }, - /* - * fastNext - * 功能:快进 - * @num为数字时快进指定秒数,为空时快进20秒 - */ - fastNext:function(num){ - if(duration==0) return; - if(isUndefined(num) || valType(num)!='number'){ - num=20; - } - var time=player.time(); - if(time+num200) zIndex=200; - if(isUndefined(ele.cssDisplay)){ - ele.cssPosition=ele.css('position'); - ele.cssDisplay=ele.css('display'); - } - ele.css({ - 'position': 'absolute', - 'z-index':zIndex - }); - if(!cBar){ - CM.append(ele); - } - else{ - C['bar'].append(ele); - } - ele.CK=CK; - ele.show(); - } - return ele; - }, - /* - * closeLayer - * 功能:关闭一个层 - */ - closeLayer:function(ele){ - if(valType(ele)=='string'){ - var temp=$(ele); - if(!isUndefined(temp)){ - if(temp.length>0){ - ele=temp.eq(0); - } - } - } - if(!isUndefined(ele) && valType(ele)=='htmlobject'){ - if(!isUndefined(ele.captureParentNode)){ - var eleP=ele.captureParentNode; - if (ele.nextElement) { - try { - eleP.insertBefore(ele, ele.nextElement); - } - catch (event) { - eleP.append(ele); - } - } - else if (ele.prevElement) { - try { - eleP.insertAfter(ele, ele.prevElement); - } - catch (event) { - eleP.append(ele); - } - } - else { - eleP.append(ele); - } - ele.css({'display':ele.cssDisplay}); - } - else{ - ele.remove(); - } - if(!isUndefined(ele.cssDisplay)){ - ele.css({ - 'display':ele.cssDisplay, - 'position':ele.cssPosition - }); - } - } - return player; - }, - /* - * message - * 在播放器内部显示一条提示信息 - */ - message:function(str){ - message(str); - return player; - }, - /* - * closeFrontAd - * 功能:关闭贴片广告 - */ - closeFrontAd:function(){ - if(frontAdPlay && !isUndefined(ad) && !isUndefined(ad['front']) && !isUndefined(ad['front']['list'])){ - ad['frontPlayI']=ad['front']['list'].length-1; - adFrontEnded(); - clearAdFrontSetTime(); - } - return player; - }, - /* - * addListener - * 功能:监听功能 - */ - addListener:function(name,fn){ - newEvent.addEventListener(name,fn); - }, - /* - * removeListener - * 功能:监听功能 - */ - removeListener:function(name,fn){ - newEvent.removeEventListener(name,fn); - }, - /* - * bar - * 功能:显示/关闭底部控制栏 - */ - bar:function(bool){ - barShow=bool; - if(bool){ - C['bar'].show(); - } - else{ - C['bar'].hide(); - } - }, - /* - * rightBar - * 功能:显示/关闭右边控制栏 - */ - rightBar:function(bool){ - rightBarShow=bool; - if(bool){ - C['rightBar'].show(); - } - else{ - C['rightBar'].hide(); - } - }, - /* - * mouseActive - * 功能,监听鼠标是否经过播放器 - */ - mouseActive:function(fn){ - if(!isUndefined(fn) && valType(fn)=='function'){ - newEvent.addEventListener('mouseActive',fn); - } - return this; - }, - /* - * cookie - * 功能,读取cookie - */ - cookie:function(name){ - if(name=='delete'){ - cookie(moeplayerCookie,'delete',vars['domain']); - return null; - } - if(!isUndefined(name) && name){ - name=name.replace(/[ ]*,[ ]*|[ ]+/g, '').replace(/[ ]*;[ ]*|[ ]+/g, ''); - } - var cStr=cookie(moeplayerCookie); - if(cStr){ - var arr=stringToArray(cStr); - var tempArr=[]; - var cTime=parseInt(Date.now()*0.001); - for(i=0;icTime){ - tempArr.push(arr[i]); - } - } - arr=tempArr; - if(arr.length>0){ - cookie(moeplayerCookie,'delete',vars['domain'],vars['cookiePath']); - cookie(moeplayerCookie,arrayToString(arr),vars['domain'],vars['cookiePath']); - for(var i=0;i-1;i--){ - var pTemp=createlButton('ck-list-p',playbackrate[i]+language['playbackrateSuffix']); - pTemp.attr('data-i',i).attr('data-val',playbackrate[i]); - C['bar']['playbackrate']['bg']['p'].push(pTemp); - C['bar']['playbackrate']['bg'].append(pTemp); - pTemp.click(playbackrateClick); - } - C['bar']['playbackrate'].hide(); - if(!isUndefined(vars['playbackrateOpen']) && vars['playbackrateOpen']){ - C['bar']['playbackrate'].show(); - C['bar']['playbackrate']['bgbox'].show(); - var w=C['bar']['playbackrate']['bg'].getWidth(),h=C['bar']['playbackrate']['bg'].getHeight(); - var bw=C['bar']['playbackrate']['button'].getWidth(); - C['bar']['playbackrate']['bg'].css({'width':w+10+'px'}); - w=C['bar']['playbackrate']['bg'].getWidth(); - if(getBarHeight()>C['bar'].getHeight()){ - h+=(getBarHeight()-C['bar'].getHeight()); - } - C['bar']['playbackrate']['bgbox'].attr('style',''); - C['bar']['playbackrate']['bgbox'].css({ - 'width':w+'px', - 'height':(h+2)+'px', - 'left':-(w-bw)*0.5+'px' - }); - C['bar']['playbackrate']['button'].mouseover(function(){ - w=C['bar']['playbackrate']['bg'].getWidth(); - bw=C['bar']['playbackrate']['button'].getWidth(); - C['bar']['playbackrate']['bgbox'].css({ - 'left':-(w-bw)*0.5+'px' - }); - }); - changePlaybackrateVal(pbr); - } - }, - /* - * playbackrateClick - * 功能:选择播速 - */ - playbackrateClick=function(e){ - C['bar']['playbackrate']['bgbox'].hide(); - setTimeout(function(){C['bar']['playbackrate']['bgbox'].removeCss('display');},300); - message(language['switchTo']+$(this).htm()); - player.playbackRate(parseFloat($(this).attr('data-val'))); - }, - /* - * changePlaybackrateVal - * 功能:根据速度检查播速 - */ - changePlaybackrateVal=function(num){ - C['bar']['playbackrate']['bg'].find('button').each(function(index,ele){ - var val=parseFloat(ele.attr('data-val')); - ele.removeClass('ck-list-p-focus'); - if(num==val){ - ele.addClass('ck-list-p-focus'); - if(num!=1){ - C['bar']['playbackrate']['button'].htm(ele.htm()); - } - else{ - C['bar']['playbackrate']['button'].htm(language['playbackrate']); - } - } - else{ - ele.removeClass('ck-list-p-focus'); - } - }); - }, - /* - * checkTrack - * 功能:初始化或重置字幕组件内容 - */ - checkTrack=function(){ - var track=vars['track']; - var pbr=-1; - C['bar']['track']['bgbox'].htm(''); - C['bar']['track']['bg']=createlDiv('ck-list-bg'); - C['bar']['track']['bgbox'].append(C['bar']['track']['bg']); - C['bar']['track']['bg']['p']=[]; - var pTemp=null; - for(var i=track.length-1;i>-1;i--){ - pTemp=createlButton('ck-list-p',track[i]['label']); - pTemp.attr('data-i',i).attr('data-title',track[i]['label']); - C['bar']['track']['bg']['p'].push(pTemp); - C['bar']['track']['bg'].append(pTemp); - if(!isUndefined(track[i]['default']) && track[i]['default']){ - pbr=i; - } - pTemp.click(trackClick); - } - // - pTemp=createlButton('ck-list-p',language['noTrack']); - pTemp.attr('data-i',-1).attr('data-title',language['noTrack']); - C['bar']['track']['bg']['p'].push(pTemp); - C['bar']['track']['bg'].append(pTemp); - pTemp.click(trackClick); - // - C['bar']['track'].hide(); - C['bar']['track'].show(); - C['bar']['track']['bgbox'].show(); - var w=C['bar']['track']['bg'].getWidth(),h=C['bar']['track']['bg'].getHeight(); - var bw=C['bar']['track']['button'].getWidth(); - C['bar']['track']['bg'].css({'width':w+10+'px'}); - w=C['bar']['track']['bg'].getWidth(); - if(getBarHeight()>C['bar'].getHeight()){ - h+=(getBarHeight()-C['bar'].getHeight()); - } - C['bar']['track']['bgbox'].attr('style',''); - C['bar']['track']['bgbox'].css({ - 'width':w+'px', - 'height':(h+2)+'px', - 'left':-(w-bw)*0.5+'px' - }); - C['bar']['track']['button'].mouseover(function(){ - w=C['bar']['track']['bg'].getWidth(); - bw=C['bar']['track']['button'].getWidth(); - C['bar']['track']['bgbox'].css({ - 'left':-(w-bw)*0.5+'px' - }); - }); - changeTrackVal(pbr); - }, - /* - * trackClick - * 功能:选择字幕 - */ - trackClick=function(e){ - C['bar']['track']['bgbox'].hide(); - setTimeout(function(){C['bar']['track']['bgbox'].removeCss('display');},300); - message(language['switchTo']+$(this).attr('data-title')); - player.track(parseFloat($(this).attr('data-i'))); - }, - /* - * changeTrackVal - * 功能:根据字幕检查 - */ - changeTrackVal=function(num){ - C['bar']['track']['bg'].find('button').each(function(index,ele){ - var i=parseInt(ele.attr('data-i')); - if(num==i){ - C['bar']['track']['button'].htm(ele.attr('data-title')); - if(i>-1){ - CT.track=vars['track'][i]; - eventTarget('track',vars['track'][i]); - } - else{ - CT.track=null; - eventTarget('track',null); - } - ele.addClass('ck-list-p-focus'); - } - else{ - ele.removeClass('ck-list-p-focus'); - } - }); - }, - /* - * checkDefinition - * 功能:初始化或重置清晰度组件内容 - */ - checkDefinition=function(){ - var pi=-1; - var videoUrl=video['currentSrc']; - if(!isUndefined(C['bar']['definition']['bg'])){ - C['bar']['definition']['bgbox'].htm(''); - C['bar']['definition']['bgbox'].attr('style',''); - C['bar']['definition']['button'].htm(language['definition']); - } - if(valType(vars['video'])=='array'){ - var arr=vars['video']; - C['bar']['definition']['bg']=createlDiv('ck-list-bg'); - C['bar']['definition']['bgbox'].append(C['bar']['definition']['bg']); - C['bar']['definition']['bg']['p']=[]; - for(var i=arr.length-1;i>-1;i--){ - var pTemp=createlButton('ck-list-p',arr[i][2]); - pTemp.attr('data-i',i).attr('data-video',arr[i][0]).attr('data-type',arr[i][1]).attr('data-title',arr[i][2]); - C['bar']['definition']['bg']['p'].push(pTemp); - C['bar']['definition']['bg'].append(pTemp); - if(videoUrl && videoUrl.indexOf(arr[i][0])>-1){ - pi=i; - } - pTemp.click(definitionClick); - } - C['bar']['definition'].show(); - C['bar']['definition']['bgbox'].show(); - var w=C['bar']['definition']['bg'].getWidth(),h=C['bar']['definition']['bg'].getHeight(); - var bw=C['bar']['definition']['button'].getWidth(); - C['bar']['definition']['bg'].css({'width':w+10+'px'}); - w=C['bar']['definition']['bg'].getWidth(); - if(getBarHeight()>C['bar'].getHeight()){ - h+=(getBarHeight()-C['bar'].getHeight()); - } - C['bar']['definition']['bgbox'].attr('style',''); - C['bar']['definition']['bgbox'].css({ - 'width':w+'px', - 'height':(h+2)+'px', - 'left':-(w-bw)*0.5+'px' - }); - C['bar']['definition']['button'].mouseover(function(){ - w=C['bar']['definition']['bg'].getWidth(); - bw=C['bar']['definition']['button'].getWidth(); - C['bar']['definition']['bgbox'].css({ - 'left':-(w-bw)*0.5+'px' - }); - }); - } - if(pi>-1){ - C['bar']['definition']['bg'].find('button').each(function(index,ele){ - var i=parseInt(ele.attr('data-i')); - if(pi==i){ - ele.addClass('ck-list-p-focus'); - } - else{ - ele.removeClass('ck-list-p-focus'); - } - }); - } - }, - /* - * definitionClick - * 功能:选择清晰度 - */ - definitionClick=function(e){ - C['bar']['definition']['bgbox'].hide(); - setTimeout(function(){ - C['bar']['definition']['bgbox'].removeCss('display'); - },300); - changeDefinition(parseInt($(this).attr('data-i'))); - }, - /* - * changeDefinition - * 功能:检查清晰度 - */ - changeDefinition=function(num){ - C['bar']['definition']['bg'].find('button').each(function(index,ele){ - var i=parseInt(ele.attr('data-i')); - if(num==i){ - if(!isUndefined(video.textTracks) && video.textTracks.length>0){ - for(var y=video.find('track').length-1;y>-1;y--){ - video.find('track').eq(y).remove(); - } - } - seekTime=player.time(); - video.attr('autoplay','autoplay'); - changeVideo(ele.attr('data-video')); - message(language['switchTo']+ele.htm()); - C['bar']['definition']['button'].htm(ele.htm()); - ele.addClass('ck-list-p-focus'); - eventTarget('definition',{id:i,video:ele.attr('data-video'),title:ele.attr('data-title')}); - } - else{ - ele.removeClass('ck-list-p-focus'); - } - }); - }, - /* - * deletePrompt - * 功能:删除关键点 - */ - deletePrompt=function(){ - var i=0; - if(!isUndefined(C['prompt']) && valType(C['prompt'])=='array'){ - for(i=C['prompt'].length;i>-1;i--){ - if(!isUndefined(C['prompt'][i])){ - C['prompt'][i].remove(); - } - } - C['prompt']=null; - } - C['prompt']=[]; - }, - /* - * changePrompt - * 功能:构建关键点 - */ - changePrompt=function(){ - deletePrompt(); - for(var i=0;i100) left=100; - ele.css({'left':left+'%'}); - ele.mouseover(function(){ - if(this.attr('data-words')){ - showPromptWords(this); - } - }); - ele.mouseout(function(){ - if(this.attr('data-words')){ - showPromptWords(); - } - }); - C['prompt'].push(ele); - } - } - }, - /* - * showPromptWords - * 功能:显示关键点提示 - */ - showPromptWords=function(ele){ - if(isUndefined(C['promptWords'])){ - C['promptWords']=createlDiv('ck-prompt-words'); - CM.append(C['promptWords']); - C['promptWords']['content']=createlDiv('ck-prompt-content'); - C['promptWords'].append(C['promptWords']['content']); - } - if(isUndefined(ele)){ - C['promptWords']['content'].htm(''); - C['promptWords'].hide(); - return; - } - C['promptWords']['content'].htm(ele.attr('data-words')); - C['promptWords'].show(); - var pW=C['promptWords'].getWidth(),pH=C['promptWords'].getHeight(); - var bg=C['bar']['pbox']['bg']; - var time=parseFloat(ele.attr('data-time')); - var top=CK.getHeight()-getBarHeight(); - var left=ele.offset()['left']-CK.offset()['left']+ele.getWidth()*.5-pW*.5; - if(!isUndefined(C['preview'])){ - top=CK.getHeight()-parseFloat((getBarHeight()+C['preview']['smallHight']+parseInt(C['preview'].css('margin-bottom')))); - } - else{ - top=CK.getHeight()-parseFloat((getBarHeight()+C['tip']['minHeight']+parseInt(C['tip'].css('margin-bottom')))); - top-=(getBarHeight()-C['bar'].getHeight()); - } - top-=parseFloat(C['promptWords'].css('margin-bottom')); - top-=pH; - left-=parseFloat(C['promptWords'].css('margin-right')); - if(left<0)left=0; - if(left>CK.getWidth()-pW)left=CK.getWidth()-pW; - C['promptWords'].css({ - 'top':top+'px', - 'left':left+'px' - }); - }, - /* - * changePreview - * 功能:加载或重置预览图片 - */ - changePreview=function(preview){ - if(!isUndefined(C['preview'])){ - C['preview'].remove(); - C['preview']=null; - } - if(!isUndefined(preview)){ - C['preview']=createlDiv('ck-preview'); - CM.append(C['preview']); - if(isUndefined(vars['preview']['type'])){ - vars['preview']['type']=0; - } - if(vars['preview']['type']==1){ - C['preview']['bg']=createlDiv('ck-preview-bg'); - C['preview'].append(C['preview']['bg']); - } - var files=[]; - var loadImg=function(bigW,bigH,smallW,smallH){ - if(vars['preview']['type']==1){ - C['preview']['bg']['img']=[]; - for(var i=0;i1){ - if(valType(vars['preview']['thumbnail'][0])=='number'){ - thumbnail[0]=vars['preview']['thumbnail'][0]; - } - if(valType(vars['preview']['thumbnail'][1])=='number'){ - thumbnail[1]=vars['preview']['thumbnail'][1]; - } - vars['preview']['thumbnail']=thumbnail; - } - if(files[0]){ - var img = createlImg(files[0],'ck-preview-load-img').addListener('load',function(){ - loadImg(this.getWidth(),this.getHeight(),this.getWidth()/thumbnail[0],this.getHeight()/thumbnail[1]); - this.remove(); - }); - CM.append(img); - } - } - else{ - C['preview'].removeChild(); - C['preview']=null; - } - } - else{ - C['preview'].removeChild(); - C['preview']=null; - } - } - }, - /* - * showPreview - * 功能:显示预览图 - */ - showPreview=function(time){ - if(hidePreviewSetTime){ - clearTimeout(hidePreviewSetTime); - hidePreviewSetTime=null; - } - if(time<0){ - if(!isUndefined(C['preview'])){ - hidePreviewSetTime=setTimeout(function(){ - C['preview'].hide(); - hidePreviewSetTime=null; - },200); - return; - } - } - if(!isUndefined(C['preview']) && !isUndefined(vars['preview']['thumbnail']) && duration>0){ - if(isUndefined(vars['preview']['type'])){ - vars['preview']['type']=0; - } - var scale=2,thumbnail=vars['preview']['thumbnail']; - if(!isUndefined(vars['preview']['scale'])){ - scale=vars['preview']['scale']; - } - var divI=0,imgI=0; - var left=0,frameLeft=0; - var pW=0; - var smallW=C['preview']['smallWidth'],smallH=C['preview']['smallHight']; - var bgXw=time*C['bar']['pbox']['bg'].getWidth()/duration+(C['bar']['pbox']['bg'].offset()['left']-CK.offset()['left']); - if(C['preview'].css('display')=='none'){ - C['preview'].show(); - } - C['preview'].css({ - 'height':smallH+'px', - }); - if(vars['preview']['type']==1){ - divI=parseInt(time/(scale*thumbnail[0])); - imgI=parseInt(time/scale); - var minI=divI-5,maxI=divI+5; - if(minI<0) minI=0; - if(maxI>C['preview']['bg']['img'].length-1){ - maxI=C['preview']['bg']['img'].length-1; - } - for(var i=minI;iC['preview'].getWidth()-C['preview']['frame'].getWidth()){ - var xz=frameLeft-(C['preview'].getWidth()-C['preview']['frame'].getWidth()); - frameLeft=C['preview'].getWidth()-C['preview']['frame'].getWidth(); - left-=xz; - } - C['preview']['bg'].css({'left':left+'px'}); - C['preview']['frame'].css({'left':frameLeft+'px'}); - } - else{ - var temp=(time/scale)/(thumbnail[0]*thumbnail[1]); - imgI=parseInt(temp);//计算显示的图片编号 - var smallI=parseInt((temp-imgI)*100); - var rows=parseInt(smallI/thumbnail[0]); - var column=smallI%thumbnail[0]; - var files=vars['preview']['file']; - left=bgXw-smallW*.5; - if(left<0){ - left=0; - } - if(left>CK.getWidth()-smallW){ - left=CK.getWidth()-smallW; - } - C['preview'].css({ - 'width':C['preview']['smallWidth']+'px', - 'background':'url('+files[imgI]+') no-repeat', - 'background-position':'-'+column*smallW+'px -'+rows*smallH+'px', - 'left':left+'px' - }); - } - } - }, - /* - * showError - * 功能:显示错误信息 - */ - showError=function(){ - C['loading'].hide(); - if(vars['controls'] || !vars['errorShow']){ - return; - } - if(isUndefined(C['error'])){ - C['error']=createlDiv('ck-error'); - CM.append(C['error']); - } - var msg=CT.error['message']; - if(!msg) msg=language['error']['noMessage']; - var html=msg+'(code:'+CT.error['code']+')'; - C['error'].htm(html); - C['error'].show(); - }, - /* - * showWindowsError - * 功能:显示错误信息 - */ - showWindowsError=function(error){ - var ele=createlDiv('moeplayer-error',error); - $('body').append(ele); - }, - /* - * showNextEpisode - * 功能:鼠标经过下一集按钮的动作 - */ - showNextEpisode=function(){ - if(isUndefined(vars['next'])) return; - if(valType(vars['next'])=='object'){ - if('content' in vars['next']){ - C['next']=player.layer(vars['next']); - return; - } - if('title' in vars['next']){ - tip(C['bar']['nextEpisode'],vars['next']['title']); - return; - } - } - tip(C['bar']['nextEpisode'],language['next']); - }, - /* - * nextClick - * 功能:点击下一集按钮的动作 - */ - nextClick=function(){ - if(valType(vars['next'])=='object'){ - if('click' in vars['next']){ - if(valType(vars['next']['click'])=='function'){ - vars['next']['click'](); - } - else if(valType(vars['next']['click'])=='string'){ - eval(vars['next']['click']+'()'); - } - } - if('link' in vars['next']){ - window.location.href=vars['next']['link']; - } - eventTarget('next'); - } - }, - /* - * showEnded - * 功能:播放结束后的显示内容 - */ - showEnded=function() { - if(!CT.loop && !isUndefined(vars['ended'])){ - closePauseAd(); - C['ended']=player.layer(vars['ended']); - if(C['ended']){ - C['centerPlay'].hide(); - } - return; - } - }, - /* - * windowScroll - * 功能:监听页面滚动 - */ - windowScroll=function() { - if(!CT.smallWindows) return; - if(CT.webFull || CT.theatre || CT.full){ - exitSmallWindows(); - return; - } - var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; - if(scrollTop>CT.offset()['top']+CT.getHeight()){ - if(!CK.hasClass('moeplayer-smallwindow')){ - CK.addClass('moeplayer-smallwindow'); - eventTarget('smallWindows',true); - smallWindowsState=true; - if(vars['smallWindowsDrag']){ - drag(true); - } - allBarHide(); - checkVideoRotate(); - } - } - else{ - exitSmallWindows(); - } - }, - /* - * exitSmallWindows - * 退出小窗口模式 - */ - exitSmallWindows=function(){ - if(CK.hasClass('moeplayer-smallwindow')){ - CK.removeClass('moeplayer-smallwindow'); - if(vars['smallWindowsDrag']){ - drag(); - } - eventTarget('smallWindows',false); - smallWindowsState=false; - allBarShow(); - checkVideoRotate(); - } - }, - /* - * drag - * 功能,使节点可拖动 - * state:是否开启可拖动,默认=false,关闭状态 - */ - drag=function(state) { - var doc=$(document); - var posX = 0,posY = 0, - posXRecord = 0,posYRecord = 0; - var open=false; - if(!isUndefined(state)){ - open=state; - } - var mouseDown = function(e) { - e.preventDefault && e.preventDefault(); - e = e || window.event; - var client = getClient(e); - posXRecord = client['x']; - posYRecord = client['y']; - doc.mousemove(docMouseMove); - doc.mouseup(docMouseUp); - CK.css({ - 'cursor':'move' - }); - }; - var docMouseMove = function(e) { - e = e || window.event; - var client = getClient(e); - var eleOffset = CK.offset(); - posY = client['y']-posYRecord; - posX = client['x']-posXRecord; - posXRecord = client['x']; - posYRecord = client['y']; - var left=eleOffset['left']+posX; - var top=eleOffset['top']+posY; - CK.css({ - 'left':left+'px', - 'top':top+'px' - }); - if(CK.css('position')!='fixed'){ - CK.css({ - 'position':'fixed' - }); - } - isDrag=true; - }; - var docMouseUp = function() { - doc.removeListener('mousemove', docMouseMove); - doc.removeListener('mouseup', docMouseUp); - CK.css({ - 'cursor':'default' - }); - }; - if(open){ - CK.mousedown(mouseDown); - } - else{ - CK.unbind('mousedown'); - } - }, - /* - * checkVideoRotate - * 检查播放器尺寸 - */ - checkVideoRotate=function(){ - var ckW=CK.getWidth()*nowZoom*0.01,ckH=CK.getHeight()*nowZoom*0.01; - var vW=CV.getWidth(),vH=CV.getHeight(); - CV.css({ - 'transform':'rotate('+nowRotate+'deg)', - '-ms-transform':'rotate('+nowRotate+'deg)', - '-moz-transform':'rotate('+nowRotate+'deg)', - '-webkit-transform':'rotate('+nowRotate+'deg)', - '-o-transform':'rotate('+nowRotate+'deg)', - 'width':nowZoom+'%', - 'height':nowZoom+'%' - }); - if(nowRotate!=0 && nowRotate!=180){ - if(vH>ckW && vW>ckH){ - if(vH / ckW > vW / ckH) { - CV.css({ - 'height':nowZoom+'%', - 'width':ckH+'px' - }); - } - else { - CV.css({ - 'width':nowZoom+'%', - 'height':ckW+'px' - }); - } - return; - } - if(vHckH){ - CV.css({ - 'height':nowZoom+'%', - 'width':ckH+'px' - }); - } - else{ - if(vH / vW >= ckW / ckH) { - CV.css({ - 'width':nowZoom+'%', - 'height':ckW+'px' - }); - } - else { - CV.css({ - 'height':nowZoom+'%', - 'width':ckH+'px' - }); - } - } - return; - } - if(vH>=ckW && vW<=ckH){ - CV.css({ - 'width':nowZoom+'%', - 'height':ckW+'px' - }); - return; - } - if(vW>=ckH && vHC['bar'].getHeight()){ - top-=(getBarHeight()-C['bar'].getHeight()); - } - if(w>ew){ - left=offset['left']-ckOffset['left']-(w-ew)*.5; - } - else{ - left=offset['left']-ckOffset['left']+(ew-w)*.5; - } - if(align=='left'){ - left=offset['left']-ckOffset['left']-w; - top=offset['top']-ckOffset['top']; - } - if(!isUndefined(cl)){ - left=cl['x']-ckOffset['left']-w*.5; - } - if(left<0){ - left=0; - } - if(top<0){ - top=0; - } - if(left>CM.getWidth()-w){ - left=CM.getWidth()-w; - } - if(top>CM.getHeight()-h){ - top=CM.getHeight()-h; - } - C['tip'].css({ - 'left':left+'px', - 'top':top-parseInt(C['tip'].css('margin-bottom'))+'px' - }); - }, - /* - * progressDragX - * 功能:制作进度调节框事件 - */ - progressDragX=function(){ - var bg=C['bar']['pbox']['bg'], - play=C['bar']['pbox']['play'], - slider=C['bar']['pbox']['slider'], - mouseLine=C['bar']['pbox']['mouseLine']; - slider.unbind(); - bg.unbind(); - var pos = 0, - posRecord = 0; - var doc=$(document); - var sliderDownTime=0; - var sliderMouseDown = function(e) { - e.preventDefault && e.preventDefault(); - if(!vars['timeScheduleAdjust']){//禁止拖动 - return; - } - e = e || window.event; - var eleOffset = slider.offset(),bgOffset=bg.offset(),client = getClient(e); - pSliderMouseDown=true; - posRecord = client['x']; - //供比较 - var left = eleOffset['left']-bgOffset['left']; - sliderDownTime=left*duration/(bg.getWidth()-slider.getWidth()); - slider.removeListener('mousedown', sliderMouseDown); - slider.removeListener('touchstart', sliderMouseDown); - doc.mousemove(docMouseMove); - doc.mouseup(docMouseUp); - slider.touchmove(docMouseMove); - slider.touchend(docMouseUp); - noScrolling(true); - }; - var docMouseMove = function(e) { - e = e || window.event; - var eleOffset = slider.offset(),bgOffset=bg.offset(),client = getClient(e); - pSliderMouseDown=true; - pos = posRecord - client['x']; - posRecord = client['x']; - var left = eleOffset['left'] - pos-bgOffset['left']; - if(left<0){ - left=0; - } - if(left>bg.getWidth()-slider.getWidth()){ - left=bg.getWidth()-slider.getWidth(); - } - C['bar']['pbox'].addClass('ck-bar-progress-slider-move'); - //预览时间 - var time=''; - if(!vars['live']){ - time=left*duration/(bg.getWidth()-slider.getWidth()); - switch(vars['timeScheduleAdjust']){ - case 2://只能前进(向右拖动 - if(timesliderDownTime){ - left=-1000; - message(language['timeScheduleAdjust']['prohibitForward']); - return; - } - break; - case 4://只能前进但能回到第一次拖动时的位置 - if(timemaxSeeTime){ - left=-1000; - player.seek(maxSeeTime); - message(language['timeScheduleAdjust']['prohibitForwardNotViewed']); - return; - } - break; - } - time=formatSeconds(time); - } - else{ - time=formatLiveTime(left*getLiveTime()/(bg.getWidth()-slider.getWidth())); - } - tip(slider,time); - if(left>=0){ - slider.css({ - 'left': left + 'px' - }); - play.css({ - 'width': left+ slider.getWidth()*.5+ 'px' - }); - } - else{ - pSliderMouseDown=false; - } - - }; - var docMouseUp = function() { - noScrolling(); - doc.removeListener('mousemove', docMouseMove); - doc.removeListener('mouseup', docMouseUp); - slider.removeListener('touchmove', docMouseMove); - slider.removeListener('touchend', docMouseUp); - slider.mousedown(sliderMouseDown); - slider.touchstart(sliderMouseDown); - if(!vars['live']){ - var time=play.getWidth()*duration/(bg.getWidth()-slider.getWidth()*.5); - if(time>duration){ - time=duration; - } - seekTime=0; - player.seek(time); - } - else{ - var playbackTime=parseInt(vars['live']+play.getWidth()*getLiveTime()/(bg.getWidth()-slider.getWidth()*.5)); - eventTarget('playback',{time:playbackTime,date:date('Y-m-d H:i:s',playbackTime)}); - eventTarget('seek',{time:playbackTime,state:'seeking',date:date('Y-m-d H:i:s',playbackTime)}); - } - C['bar']['pbox'].removeClass('ck-bar-progress-slider-move'); - if(isMouseLeave){ - tip(); - } - }; - var isMouseLeave=true;//默认鼠标离开了进度按钮上 - var sliderMouseOver=function(){ - var time=''; - if(!vars['live']){ - time=formatSeconds(parseInt(slider.css('left'))*duration/(bg.getWidth()-slider.getWidth())); - } - else{ - time=language['live']; - } - isMouseLeave=false; - tip(slider,time); - }; - - var sliderMouseLeave=function(){ - isMouseLeave=true; - }; - slider.mousedown(sliderMouseDown); - slider.mouseover(sliderMouseOver); - slider.mouseleave(sliderMouseLeave); - slider.touchstart(sliderMouseDown); - var bgMouseDown=function(e){ - e = e || window.event; - var client = getClient(e); - var bgOffset=bg.offset(); - var w=client['x']-bgOffset['left']; - if(CT.full){ - w+=CK.offset()['left']; - } - if(!vars['live']){ - var time=duration*w/bg.getWidth(); - switch(vars['timeScheduleAdjust']){ - case 0://禁止拖动 - message(language['timeScheduleAdjust']['prohibit']); - return; - break; - case 2://只能前进(向右拖动 - if(timeoldTime){ - message(language['timeScheduleAdjust']['prohibitForward']); - return; - } - break; - case 4://只能前进但能回到第一次拖动时的位置 - if(timemaxSeeTime){ - message(language['timeScheduleAdjust']['prohibitForwardNotViewed']); - return; - } - break; - } - seekTime=0; - player.seek(time); - } - else{ - var playbackTime=parseInt(vars['live']+getLiveTime()*w/bg.getWidth()); - eventTarget('playback',{time:playbackTime,date:date('Y-m-d H:i:s',playbackTime)}); - eventTarget('seek',{time:playbackTime,state:'seeking',date:date('Y-m-d H:i:s',playbackTime)}); - } - if(w>bg.getWidth()-slider.getWidth()*.5){ - w=bg.getWidth()-slider.getWidth()*.5 - } - if(wmaxTop){ - sliderTop=maxTop; - } - slider.css({ - 'top':sliderTop+'px' - }); - var ppMarginTop=sliderTop-minTop+slider.getHeight()*0.5; - pp.css({ - 'margin-top':ppMarginTop+'px' - }); - var vol=(bg.getHeight()-ppMarginTop-slider.getHeight()*0.5)/(bg.getHeight()-slider.getHeight()); - player.volume(vol); - }; - var docMouseUp = function() { - noScrolling(); - doc.removeListener('mousemove', docMouseMove); - doc.removeListener('mouseup', docMouseUp); - slider.removeListener('touchmove', docMouseMove); - slider.removeListener('touchend', docMouseUp); - slider.mousedown(sliderMouseDown); - slider.touchstart(sliderMouseDown); - C['bar']['vbox']['mouseDown']=false; - }; - slider.mousedown(sliderMouseDown); - slider.touchstart(sliderMouseDown); - var bgMouseDown=function(e){ - e = e || window.event; - var client = getClient(e); - var bgOffset=bg.offset(); - var h=client['y']-bgOffset['top']; - var max=bg.getHeight(); - var vol=1-h/max; - player.volume(vol); - }; - bg.mousedown(bgMouseDown); - }, - /* - * changeProgress - * 功能:根据时间调节播放进度 - */ - changeProgress=function(time){ - if((valType(vars['live'])=='boolean' && vars['live'])){ - return; - } - if(!pSliderMouseDown){ - var bg=C['bar']['pbox']['bg'],slider=C['bar']['pbox']['slider']; - var playW=(time/duration)*100; - - if(valType(vars['live'])=='number'){ - playW='100'; - } - C['bar']['pbox']['play'].css({'width':playW+'%'}); - var sliderW=(slider.getWidth()/bg.getWidth())*100; - var sliderLeft=playW-sliderW*.5; - if(sliderLeft<0){ - sliderLeft=0; - } - if(sliderLeft>100-sliderW){ - sliderLeft=100-sliderW; - } - C['bar']['pbox']['slider'].css({'left':sliderLeft+'%'}); - checkProgressSlider(); - } - }, - /* - * checkProgressSlider - * 功能:检查设置播放进度条位置 - */ - checkProgressSlider=function(){ - var bg=C['bar']['pbox']['bg'],slider=C['bar']['pbox']['slider']; - var st=0; - if(C['bar']['pbox'].css('transition-duration')){ - st=parseFloat(C['bar']['pbox'].css('transition-duration'))*1000+20; - } - var checkThis=function(){ - var sliderLeft=parseInt(C['bar']['pbox']['slider'].css('left')); - if(sliderLeft<0){ - sliderLeft=0; - C['bar']['pbox']['slider'].css({'left':sliderLeft+'px'}); - } - if(sliderLeft>bg.getWidth()-slider.getWidth()){ - sliderLeft=bg.getWidth()-slider.getWidth(); - C['bar']['pbox']['slider'].css({'left':sliderLeft+'px'}); - } - }; - setTimeout(checkThis,st); - }, - /* - * changeTopTime - * 功能:修改顶部右侧时间 - */ - changeTopTime=function(){ - C['topBar']['timeEle'].htm(date('H:i:s')); - setTimeout(changeTopTime,1000); - }, - /* - * changeVolumeSlider - * 功能:根据音量改变滑块位置 - */ - changeVolumeSlider=function(vol){ - if(!isUndefined(C['bar']['vbox'])){ - var box=C['bar']['vbox']['volume']['box'], - bg=C['bar']['vbox']['volume']['bg'], - pp=C['bar']['vbox']['volume']['pp'], - slider=C['bar']['vbox']['volume']['slider']; - C['bar']['vbox']['volume']['txt'].htm(parseInt(vol*100)); - var bgH=bg.getHeight(); - if(bgH){ - var ppMarginTop=bgH-vol*bgH; - pp.css({ - 'margin-top':ppMarginTop+'px' - }); - var sliderTop=bg.offset()['top']-box.offset()['top']+ppMarginTop-slider.getHeight()*0.5; - slider.css({ - 'top':sliderTop+'px' - }); - } - } - }, - /* - * changeLoad - * 功能:获取视频已加载部分并修改加载进度栏 - */ - changeLoad=function(){ - if(video){ - var len = video.buffered.length; - if(len>0){ - var bufferEnd = video.buffered.end(len-1); - if(loadTime= 1000) { - last += offset; - appendFps(fps); - fps = 0; - } - requestAnimationFrame(step); - }; - var appendFps = function(fps) { - if(fps!=CT.fps){ - CT.fps=fps; - replaceInformation('fps',fps); - eventTarget('fps',fps); - } - - }; - if(isUndefined(CT.fps)){ - CT.fps=0; - } - step(); - }, - /* - * getElement - * 功能:获取一个外部节点 - */ - getElement=function(content){ - var ele=$(content); - if(isUndefined(ele)) return; - if(valType(ele)=='htmlarray'){ - ele=ele[0]; - } - if(isUndefined(ele.captureParentNode)){ - ele.captureParentNode = ele.parentNode; - ele.prevElement=ele.prev(); - ele.nextElement=ele.next(); - } - return ele; - }, - /* - * $ - * 功能:根据ID或className或节点节点名称获取对象 - */ - $=function(obj, eL) { - var parent = null; - if (document) { - parent = document; - } - if (!isUndefined(eL)) { - parent = eL; - } - var res = []; - if (obj) { - if (valType(obj) == 'htmlobject' || valType(obj)=='object') { - res = obj; - if (!isUndefined(res.moeplayer)) { - return res; - } - } - else if (valType(obj) == 'string' && obj!='') { - switch (obj.substr(0, 1)) { - case '.': - obj = obj.substr(1, obj.length); - if (parent.getElementsByClassName) { - res = parent.getElementsByClassName(obj); - if (!res.length) { - return null; - } - } - else if (!parent && document.getElementsByClassName) { - res = document.getElementsByClassName(obj); - if (!res.length) { - return null; - } - } - else { - var reg = new RegExp(' ' + obj + ' ', 'i'); - var ele = null; - if (parent.getElementsByTagName) { - ele = parent.getElementsByTagName('*'); - } else { - ele = document.getElementsByTagName('*'); - } - for (var i = 0; i < ele.length; i++) { - if (reg.test(' ' + ele[i].className + ' ')) { - res.push(ele[i]); - } - } - } - if (res) { - if (res.length === 0) { - res = null; - } - } - break; - case '#': - obj = obj.substr(1, obj.length); - if (parent.getElementById) { - res = parent.getElementById(obj); - } else { - res=document.getElementById(obj); + function mergeObj(o,n){ + var h = {}; + var k; + for (k in o) { + h[k] = o[k]; + } + for (k in n) { + if(k in h){ + switch(valType(h[k])){ + case 'object': + if(valType(n[k])=='object'){ + h[k] = mergeObj(h[k],n[k]); } break; default: - var reg = new RegExp(' ' + obj + ' ', 'i'); - if (parent.getElementsByTagName) { - res = parent.getElementsByTagName(obj); - } else { - res = document.getElementsByTagName(obj); - } - if (res) { - if (obj == 'body' || obj == 'document' || obj == 'html') { - res = res[0]; - } else if (res.length === 0) { - res = null; - } - } else { - res = null; + if(valType(h[k])==valType(n[k])){ + h[k] = n[k]; } break; } } - else { - res = obj; + } + return h; + } + + /* + * valType + * 功能:判断变量类型 + */ + function valType(val) { + if(typeof val==='undefined') return 'undefined'; + var str=Object.prototype.toString.call(val).split(' ')[1].replace(']','').toLowerCase(); + if(str.substr(0,4)=='html' && (str.substr(-7)=='element' || str.substr(-8)=='document' || str=='window')){ + str='htmlobject'; + } + if(str=='htmlcollection' || str=='nodelist'){ + str='htmlarray'; + } + return str; + } + + /* + * isUndefined + * 功能:判断变量是否存在或值是否为undefined + */ + function isUndefined(val) { + try { + return valType(val)==='undefined' || val === undefined || val === null || (valType(val)==='number' && isNaN(val)); + } catch (event) { + return true; + } + return false; + } + + /* + * decodeURIString + * 功能,解码中文 + */ + function decodeURIString(obj){ + for(var k in obj){ + if(valType(obj[k])=='string' && obj[k]){ + try{ + obj[k]=decodeURI(obj[k]); + } + catch(event){} + } + if(valType(obj[k])=='object'){ + obj[k]=decodeURIString(obj[k]); } } - else { - res = document; - } - - if (res) { - if (valType(res) == 'htmlobject' || valType(res) == 'object' || valType(res) == 'document') { - res.moeplayer = 'Thanks for using'; - /* - * find - * 功能:在当前节点中查找指定节点 - */ - res.find = function(obj) { - return $(obj, this); - }; - /* - * attr - * 功能:修改或获取节点的属性值 - * @key不能为空,指属性名称,$value不为空则设置属性值,为空则获取属性值 - */ - res.attr = function(key, value) { - if (isUndefined(value)) { - return this.getAttribute(key); - } - else { - this.setAttribute(key, value); - return this; - } - }; - /* - * removeAtt - * 功能:删除节点的属性值 - * @key不能为空,指属性名称 - */ - res.removeAttr = function(key) { - this.removeAttribute(key); - return this; - }; - /* - * css - * 功能:修改或获取节点的样式样式 - * @key不能为空,指属性名称,$value不为空则设置属性值,为空则获取属性值 - */ - res.css = function(key, value) { - // 拆解字符串并将第二单词首字母大写 - var keyNew = function(str) { - // 当属性名有横杠时 - if (str.indexOf('-') != -1) { - var arr = str.split('-'); - var a = arr[0]; - var b = '', - c = ''; - if (arr.length > 1) { - b = arr[1].substr(0, 1).toLocaleUpperCase() + arr[1].substr(1, arr[1].length - 1); - } - if (arr.length > 2) { - b = arr[2].substr(0, 1).toLocaleUpperCase() + arr[2].substr(1, arr[2].length - 1); - } - return a + b + c; - } - // 没有横杠就不进行字符串拆解 - return str; - }; - if (isUndefined(value)){ - if (!isUndefined(key) && valType(key) == 'string') { - if (this.currentStyle) { - return this.currentStyle[key]; - } else { - return document.defaultView.getComputedStyle(this, null)[key]; - } - } - if (isUndefined(key)) { - if (this.currentStyle) { - return this.currentStyle; - } else { - return document.defaultView.getComputedStyle(this, null); - } - } - } - // 当传进来的参数key不是一个对象,给节点添加css样式 - if (valType(key) != 'object') { - var newKey = keyNew(key); - if (this.length > 1) { - // 如果this有多个值,那给每个节点都添加样式 - for (var i = 0; i < this.length; i++) { - this[i].style[newKey] = value; - } - } else { - this.style[newKey] = value; - } - } else { - //如果第一个值是一个对象,遍历这个对象,并将属性名传进函数进行拆解 - for (var item in key) { - var objKey = keyNew(item); - if (valType(this) == 'htmlarray') { - for (var i = 0; i < this.length; i++) { - this[i].style[objKey] = key[item]; - } - } else { - this.style[objKey] = key[item]; - } - } - } - return this; - }; - res.hasClass = function(cName) { - if (isUndefined(cName)) return false; - var reg = new RegExp('(\\s|^)' + cName + '(\\s|$)'); - if (this.className && this.className.match(reg)) { - return true; - } - return false; - }; - res.addClass = function(cName) { - if (!this.hasClass(cName)) { - if (this.className && this.className.substr(this.className.length - 1, 1) != ' ') { - this.className += ' '; - } - this.className += cName; - }; - return this; - }; - res.removeClass = function(cName) { - if (this.hasClass(cName)) { - this.className = this.className.replace(new RegExp('(\\s|^)' + cName + '(\\s|$)'), ' '); - if (this.className.substr(this.className.length - 1, 1) == ' ') { - this.className = this.className.substr(0, this.className.length - 1); - } - if (!this.className) { - this.removeAttribute('class'); - } - }; - return this; - }; - res.searchClass = function(cName) { - var arr = this.className.split(' '); - for (var i = 0; i < arr.length; i++) { - if (arr[i].substr(0, cName.length) == cName) { - return arr[i]; - } - } - return this; - }; - res.removeCss=function(cName){ - var cs=this.attr('style'); - if(cs){ - var arr=cs.split(';'); - var obj={}; - for(var i=0;i= m + 1) { - return this[m]; - } - return null; - } - return null; - }; - for (var i = 0; i < res.length; i++) { - if ($) { - try { - res[i] = $(res[i]); - } catch (event) {} - } - } - } - - } - return res; - }, - /* - * createlDiv - * 功能:新建一个DIV节点 + return obj; + } + + /* + * documentReady + * 功能:判断页面加载完成 + * @fn:页面加载完成后执行的函数 */ - createlDiv=function(className,html) { - var ele = document.createElement('div'); - var eleObject = $(ele); - if (className) { - eleObject.addClass(className); - } - if(html){ - eleObject.htm(html); - } - return eleObject; - }, - /* - * createlVideo - * 功能:新建一个video节点 - */ - createlVideo=function() { - var ele = document.createElement('video'); - var eleObject = $(ele); - return eleObject; - }, - /* - * createlButton - * 功能新建一个button节点 - */ - createlButton=function(className,html) { - var ele = document.createElement('button'); - var eleObject = $(ele); - eleObject.attr('type','button'); - if (className) { - eleObject.addClass(className); - } - if(html){ - eleObject.htm(html); - } - return eleObject; - }, - /* - * createlA - * 功能新建一个a节点 - */ - createlA=function(html,href,className) { - var ele = document.createElement('a'); - var eleObject = $(ele); - if(html){ - eleObject.htm(html); - } - if(!isUndefined(href) && href){ - eleObject.attr('href',href); - eleObject.attr('target','_blank'); - } - if (className) { - eleObject.addClass(className); - } - return eleObject; - }, - /* - * createlJsLink - * 功能新建一个a节点 - */ - createlJsLink=function(html,js) { - var ele = document.createElement('a'); - var eleObject = $(ele); - if(html){ - eleObject.htm(html); - } - if(!isUndefined(js) && js){ - eleObject.attr('href','javascript:'+js+'()'); - } - else{ - eleObject.attr('href','javascript:;'); - } - return eleObject; - }, - /* - * createlImg - * 功能新建一个img节点 - */ - createlImg=function(file,className) { - var ele = document.createElement('img'); - var eleObject = $(ele); - if (className) { - ele.className = className; - } - if(file){ - ele.src=file; - } - return eleObject; - }, - /* - * getClient - * 功能:获取clientX和clientY - */ - getClient=function(event) { - var eve = event || window.event; - if (isUndefined(eve)) { - eve = { - clientX: 0, - clientY: 0 - }; - } - var x=eve.clientX + (document.documentElement.scrollLeft || $('body').scrollLeft), - y=eve.clientY + (document.documentElement.scrollTop || $('body').scrollTop); - if(isUndefined(x.toString()) || x.toString()=='NaN'){ - x=eve.touches[0].clientX - } - if(isUndefined(y.toString()) || y.toString()=='NaN'){ - y=eve.touches[0].clientY - } - if(x.toString()=='NaN'){ - x=0; - } - if(y.toString()=='NaN'){ - y=0; - } - return { - x: x, - y: y - } - }, - /* - * getLiveTime - * 功能:获取直播回放时间 - */ - getLiveTime=function(){ - var notTime=Date.now(); - var varsTime=vars['live']; - if(varsTime.toString().length<13){ - varsTime=varsTime*1000; - } - return notTime-varsTime; - }, - /* - * formatLiveTime - * 功能:将直播的时间戳格式化成标准时间 - */ - formatLiveTime=function(time){ - var varsTime=vars['live']; - if(varsTime.toString().length<13){ - varsTime=varsTime*1000; - } - varsTime+=time; - return language['lookBack']+date('H:i:s',varsTime); - }, - /* - * loadJs - * 功能:加载js文件并在加载完成后执行callback函数 - * @file:js文件地址 - * @callback:加载完成后执行的函数 - */ - loadJs=function(file, callback) { - var fn =function() {}; - if(!isUndefined(callback)){ - fn=callback; - } - if(checkJs(file)){ - fn(); - return; - } - var script = document.createElement('script'); - script.type = 'text/javascript'; + function documentReady(fn) { var isReady = false; var timer = null; var doReady = function() { - if(timer){ - clearInterval(timer); - } + if(timer) clearInterval(timer); if(isReady) return; isReady = true; if(valType(fn) == 'function') { @@ -6515,906 +255,7203 @@ var bodyLoad = function() { timer = setInterval(function() { try { - if(!isUndefined(script.readyState) && script.readyState == 'complete') { + if(!isUndefined(document.readyState) && document.readyState == 'complete') { doReady(); } } catch(event) {}; }, 10); }; var w3c = function() { + if(valType(fn) == 'function') { fn(); } - removeListener(script, 'load', w3c); - removeListener(script, 'error', w3cError); + removeListener(window, 'load', w3c); }; - var w3cError = function() { + if(!isUndefined(document.body)){ if(valType(fn) == 'function') { fn(); } - removeListener(script, 'load', w3c); - removeListener(script, 'error', w3cError); - }; - try { - addListener(script, 'load', w3c); - addListener(script, 'error', w3cError); - } catch(event) { - bodyLoad(); - } - script.src = file; - $('head').eq(0).append(script); - }, - - /* - * doubleClickEvent - * 功能:注册对象双击功能 - * @ele:注册对象,可以是页面中的任意节点,不支持数组形式 - */ - doubleClickEvent=function(ele){ - var setTime=null;//注册延时函数 - var clickTime=0;//记录点击时间 - ele=$(ele); - ele.click(function(){ - if(!setTime){ - setTime=setTimeout(function(){ - try{ - ele.dispatchEvent(new Event('sigClick'));//注册单击,针对视频播放器使用 - } - catch(event){ - var e = document.createEvent('HTMLEvents'); - e.initEvent('sigClick', false, true); - ele.dispatchEvent(e); - } - clickTime=0; - setTime=null; - },260); - } - if(!clickTime){ - clickTime=new Date().getTime(); - } - else{ - if(new Date().getTime()-clickTime<230){//认为是双击 - try{ - ele.dispatchEvent(new Event('dobClick'));//注册双击 - } - catch(event){ - var e = document.createEvent('HTMLEvents'); - e.initEvent('dobClick', false, true); - ele.dispatchEvent(e); - } - clearTimeout(setTime); - clickTime=0; - setTime=null; - } - } - }); - }, - /* - * noScrolling - * 功能,禁止页面滚动操作 - */ - noScrolling=function(b){ - if(isUndefined(b)) b=false; - var bodyScroll=function (event){ - event.preventDefault(); - }; - if(b){ //禁止滚动 - $('body').addListener('touchmove', bodyScroll, {passive: false }); - } - else{ //开启滚动 - $('body').removeListener('touchmove',bodyScroll, {passive: false}); - } - }; - return into(videoObj); - } - /* - * ajax - * 功能:ajax功能 - * @cObj:传递的参数,包含请求地址,请求类型,编码等 - */ - function ajax(cObj) { - var callback = null; - var obj = { - method: 'get',//请求类型 - dataType: 'json',//请求的数据类型 - charset: 'utf-8', - async: true,//true表示异步,false表示同步 - url: '', - data: null, - success: null, - error:null - }; - obj = standardization(obj, cObj); - if (isUndefined(obj['url'])) { - return; - } - /* - * errorFun - *功能:执行error - */ - var errorFun=function(info){ - if(!isUndefined(obj['error']) && valType(obj['error'])=='function'){ - obj['error'](info); - } - else{ - obj['success'](null); - } - }; - /* - * successFun - *功能:执行success - */ - var successFun=function(success){ - if(!isUndefined(obj['success']) && valType(obj['success'])=='function'){ - obj['success'](success); - } - }; - /* - * createXHR - *功能:用来为ajax函数提供支持 - */ - var createXHR=function() { - if (window.XMLHttpRequest) { - return new XMLHttpRequest(); - } else if (window.ActiveXObject) { - try { - return new ActiveXObject('Microsoft.XMLHTTP'); - } catch(event) { - try { - return new ActiveXObject('Msxml2.XMLHTTP'); - } catch(event) {} - } - } - }; - /* - * formatParams - * 功能:将对象转成地址字符串,为ajax函数提供支持 - * @obj:传递一个对象 - */ - var formatParams=function(obj) { - var arr = []; - for (var key in obj) { - arr.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key])); - } - return arr.join('&'); - }; - if (valType(cObj) != 'object') { - if(!isUndefined(obj['error'])){ - obj.error(event); - } - return; - } - - if (obj.dataType === 'json' || obj.dataType === 'text' || obj.dataType === 'html' || obj.dataType === 'xml') { - var xhr = createXHR(); - callback = function() { - //判断http的交互是否成功 - if (xhr.status === 200) { - if (obj.dataType === 'json') { - try { - successFun(eval('(' + xhr.responseText + ')')); //回调传递参数 - } - catch(event) { - successFun(null); - } - } else { - successFun(xhr.responseText); //回调传递参数 - } - } - else { - errorFun({code:xhr.status,message:xhr.statusText}); - } - }; - obj.data = formatParams(obj.data); //通过params()将名值对转换成字符串 - if (obj.method === 'get' && !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表示同步 - addListener(xhr,'readystatechange',function(event){ - if (this.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(); + try { + addListener(window, 'load', w3c); + } catch(event) { + bodyLoad(); } } - 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 = formatParams(obj.data) + '&callback=' + callbackName; //按时间戳拼接字符串 - //拼接好src - oScript.src = obj.url.split('?') + '?' + params; - //插入script标签 - oHead.insertBefore(oScript, oHead.firstChild); - //jsonp的回调函数 - window[callbackName] = function(json) { - if(!isUndefined(obj['success']) && valType(obj['success'])==='function'){ - obj['success'](json); + + /* + * checkJs + * 功能:判断js是否已加载 + * @file:js文件路径 + */ + function checkJs(file) { + var scriptList = document.scripts; + for (var i = 0; i < scriptList.length; i++) { + if(scriptList[i].src==file){ + return scriptList[i]; } - oHead.removeChild(oScript); + } + return false; + } + + /* + * getMaxZIndex + * 功能:获取当前页面最大深度 + */ + function getMaxZIndex() { + var arr = document.all || document.querySelectorAll('*'); + var maxZ = -1; + for (var i = 0; i < arr.length; i++) { + var temp = null; + try { + temp = window.getComputedStyle(arr[i], null).zIndex; + } catch (event) { + if (arr[i].style) { + temp = arr[i].style.zIndex; + } + } + if (temp != 'auto' && parseInt(temp) > maxZ) { + maxZ = parseInt(temp); + } + } + return maxZ; + } + + /* + * getWindowSize + * 功能:获取window的宽和高 + */ + function getWindowSize() { + return { + width: window.innerWidth, + height: window.innerHeight }; } - } - /* - * documentReady - * 功能:判断页面加载完成 - * @fn:页面加载完成后执行的函数 - */ - function documentReady(fn) { - var isReady = false; - var timer = null; - var doReady = function() { - if(timer) clearInterval(timer); - if(isReady) return; - isReady = true; - if(valType(fn) == 'function') { - fn(); + + /* + * prev + * 功能:获取指定节点前一个同胞节点 + * @ele:要获取的节点 + */ + function prev(ele) { + var e = ele.previousSibling; + if (e == null) { //测试同胞节点是否存在,否则返回空 + return null; } - }; - var bodyLoad = function() { - timer = setInterval(function() { + if (e.nodeType == 3) { //如果同胞节点为文本节点 + var t = prev(e); + if (t && t.nodeType == 1) { + return t; + } + } else { + if (e.nodeType == 1) { //确认节点为节点节点才返回 + return e; + } else { + return false; + } + } + } + + /* + * next + * 功能:获取指定节点下一个同胞节点 + * @ele:要获取的节点 + */ + function next(ele) { + var e = ele.nextSibling; + if (e == null) { //测试同胞节点是否存在,否则返回空 + return null; + } + if (e.nodeType == 3) { //如果同胞节点为文本节点 + var t = next(e); + if (t && t.nodeType == 1) { + return t; + } + } else { + if (e.nodeType == 1) { //确认节点为节点才返回 + return e; + } else { + return false; + } + } + } + + /* + * addListener + * 功能:事件监听 + * @ele:监听对象,@e:事件名称,@f:返回事件函数 + */ + function addListener(ele, e, f, t) { + if (isUndefined(t)) { + t = false; + } + if (ele.addEventListener) { try { - if(!isUndefined(document.readyState) && document.readyState == 'complete') { - doReady(); - } - } catch(event) {}; - }, 10); + ele.addEventListener(e, f, t); + } catch (event) {} + } else if (ele.attachEvent) { + try { + ele.attachEvent('on' + e, f); + } catch (event) {} + } else { + ele['on' + e] = f; + } + if(isUndefined(ele.listenerList)){ + ele.listenerList=[]; + } + ele.listenerList.push([e,f]); + return ele; }; - var w3c = function() { + + /* + * removeListener + * 功能:删除事件监听 + * @ele:监听对象,@e:事件名称,@f:返回事件函数 + */ + function removeListener(ele, e, f, t) { + if (isUndefined(t)) { + t = false; + } + if (ele.removeEventListener) { + try { + ele.removeEventListener(e, f, t); + } catch (e) {} + } else if (ele.detachEvent) { + try { + ele.detachEvent('on' + e, f); + } catch (e) {} + } else { + ele['on' + e] = null; + } + if(!isUndefined(ele.listenerList)){ + var temp=[]; + for(var i=0;i-1){ + return 'iphone'; + } + } + + /* + * formatSeconds + * 功能:將秒转化成时分秒 + */ + function formatSeconds(val) { + if(isUndefined(val)) val=0; + var result = parseInt(val); + if(isUndefined(result)) result=0; + if(result<0) result=0; + var h = Math.floor(result / 3600) < 10 ? '0' + Math.floor(result / 3600) : Math.floor(result / 3600), + m = Math.floor((result / 60 % 60)) < 10 ? '0' + Math.floor((result / 60 % 60)) : Math.floor((result / 60 % 60)), + s = Math.floor((result % 60)) < 10 ? '0' + Math.floor((result % 60)) : Math.floor((result % 60)), + res = ''; + if(h !== '00') res += h+':'; + res += m+':'+s; + return res; + } + + /* + * date + * 功能:格式化的时间字符串 + */ + function date(format, timestamp) { + if(isUndefined(timestamp)){ + timestamp=new Date(); + } + if(timestamp.toString().length<13) timestamp=timestamp*1000; + var a, jsdate = ((timestamp) ? new Date(timestamp) : new Date()); + var pad = function(n, c) { + if((n = n + '').length < c) { + return new Array(++c - n.length).join('0') + n; + } else { + return n; + } + }; + var txt_weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; + var txt_ordin = { + 1: 'st', + 2: 'nd', + 3: 'rd', + 21: 'st', + 22: 'nd', + 23: 'rd', + 31: 'st' + }; + var txt_months = ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + var f = { + // Day + d: function() { + return pad(f.j(), 2) + }, + D: function() { + return f.l().substr(0, 3) + }, + j: function() { + return jsdate.getDate() + }, + l: function() { + return txt_weekdays[f.w()] + }, + N: function() { + return f.w() + 1 + }, + S: function() { + return txt_ordin[f.j()] ? txt_ordin[f.j()] : 'th' + }, + w: function() { + return jsdate.getDay() + }, + z: function() { + return (jsdate - new Date(jsdate.getFullYear() + '/1/1')) / 864e5 >> 0 + }, - } - /* - * getPath - * 功能:获取该js文件所在路径 - */ - function getPath(siz) { - 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'); - var src = scriptList[i].src.slice(scriptList[i].src.lastIndexOf('/') + 1, scriptList[i].src.lastIndexOf('.')); - if ((scriptName && (scriptName == 'moeplayer' || scriptName == 'moeplayer.min')) || (scriptList[i].src && (src == 'moeplayer' || src == 'moeplayer.min'))) { - thisPath = scriptList[i].src; - break; - } - } - var path=thisPath.substring(0, thisPath.lastIndexOf('/js/') + 1); - if(!isUndefined(siz)){ - path+=siz+'/'; - } - return path; - } - /* - * checkJs - * 功能:判断js是否已加载 - * @file:js文件路径 - */ - function checkJs(file) { - var scriptList = document.scripts; - for (var i = 0; i < scriptList.length; i++) { - if(scriptList[i].src==file){ - return scriptList[i]; - } - } - return false; - } - /* - * getMaxZIndex - * 功能:获取当前页面最大深度 - */ - function getMaxZIndex() { - var arr = document.all || document.querySelectorAll('*'); - var maxZ = -1; - for (var i = 0; i < arr.length; i++) { - var temp = null; - try { - temp = window.getComputedStyle(arr[i], null).zIndex; - } catch (event) { - if (arr[i].style) { - temp = arr[i].style.zIndex; - } - } - if (temp != 'auto' && parseInt(temp) > maxZ) { - maxZ = parseInt(temp); - } - } - return maxZ; - } - /* - * getWindowSize - * 功能:获取window的宽和高 - */ - function getWindowSize() { - return { - width: window.innerWidth, - height: window.innerHeight - }; - } - /* - * standardization - * 功能:将对象Object标准化,将n对象替换进o对象 - * @o:标准化对象,@n:外部传递对象 - */ - function standardization(o, n) { //n替换进o - var h = {}; - var k; - for (k in o) { - h[k] = o[k]; - } - for (k in n) { - if(k in h){ - h[k] = n[k]; - } - } - return h; - } - /* - * mergeObj - * 功能:将新对象合并到原对象中,需要确保原对像里有对应的值并且类型一样 - * @o:原对象,@n:新对象 - */ - function mergeObj(o,n){ - var h = {}; - var k; - for (k in o) { - h[k] = o[k]; - } - for (k in n) { - if(k in h){ - switch(valType(h[k])){ - case 'object': - if(valType(n[k])=='object'){ - h[k] = mergeObj(h[k],n[k]); - } - break; - default: - if(valType(h[k])==valType(n[k])){ - h[k] = n[k]; - } - break; - } - } - } - return h; - } - /* - * valType - * 功能:判断变量类型 - */ - function valType(val) { - if(typeof val==='undefined') return 'undefined'; - var str=Object.prototype.toString.call(val).split(' ')[1].replace(']','').toLowerCase(); - if(str.substr(0,4)=='html' && (str.substr(-7)=='element' || str.substr(-8)=='document' || str=='window')){ - str='htmlobject'; - } - if(str=='htmlcollection' || str=='nodelist'){ - str='htmlarray'; - } - return str; - } - /* - * isUndefined - * 功能:判断变量是否存在或值是否为undefined - */ - function isUndefined(val) { - try { - return valType(val)==='undefined' || val === undefined || val === null || (valType(val)==='number' && isNaN(val)); - } catch (event) { - return true; - } - return false; - } - /* - * prev - * 功能:获取指定节点前一个同胞节点 - * @ele:要获取的节点 - */ - function prev(ele) { - var e = ele.previousSibling; - if (e == null) { //测试同胞节点是否存在,否则返回空 - return null; - } - if (e.nodeType == 3) { //如果同胞节点为文本节点 - var t = prev(e); - if (t && t.nodeType == 1) { - return t; - } - } else { - if (e.nodeType == 1) { //确认节点为节点节点才返回 - return e; - } else { - return false; - } - } - } - /* - * next - * 功能:获取指定节点下一个同胞节点 - * @ele:要获取的节点 - */ - function next(ele) { - var e = ele.nextSibling; - if (e == null) { //测试同胞节点是否存在,否则返回空 - return null; - } - if (e.nodeType == 3) { //如果同胞节点为文本节点 - var t = next(e); - if (t && t.nodeType == 1) { - return t; - } - } else { - if (e.nodeType == 1) { //确认节点为节点才返回 - return e; - } else { - return false; - } - } - } - /* - * addListener - * 功能:事件监听 - * @ele:监听对象,@e:事件名称,@f:返回事件函数 - */ - function addListener(ele, e, f, t) { - if (isUndefined(t)) { - t = false; - } - if (ele.addEventListener) { - try { - ele.addEventListener(e, f, t); - } catch (event) {} - } else if (ele.attachEvent) { - try { - ele.attachEvent('on' + e, f); - } catch (event) {} - } else { - ele['on' + e] = f; - } - if(isUndefined(ele.listenerList)){ - ele.listenerList=[]; - } - ele.listenerList.push([e,f]); - return ele; - }; - /* - * removeListener - * 功能:删除事件监听 - * @ele:监听对象,@e:事件名称,@f:返回事件函数 - */ - function removeListener(ele, e, f, t) { - if (isUndefined(t)) { - t = false; - } - if (ele.removeEventListener) { - try { - ele.removeEventListener(e, f, t); - } catch (e) {} - } else if (ele.detachEvent) { - try { - ele.detachEvent('on' + e, f); - } catch (e) {} - } else { - ele['on' + e] = null; - } - if(!isUndefined(ele.listenerList)){ - var temp=[]; - for(var i=0;i> 0 - }, - - // Week - W: function() { - var a = f.z(), - b = 364 + f.L() - a; - var nd2, nd = (new Date(jsdate.getFullYear() + '/1/1').getDay() || 7) - 1; - if(b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b) { - return 1; - } else { - if(a <= 2 && nd >= 4 && a >= (6 - nd)) { - nd2 = new Date(jsdate.getFullYear() - 1 + '/12/31'); - return date('W', Math.round(nd2.getTime() / 1000)); + // Week + W: function() { + var a = f.z(), + b = 364 + f.L() - a; + var nd2, nd = (new Date(jsdate.getFullYear() + '/1/1').getDay() || 7) - 1; + if(b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b) { + return 1; } else { - return(1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0); + if(a <= 2 && nd >= 4 && a >= (6 - nd)) { + nd2 = new Date(jsdate.getFullYear() - 1 + '/12/31'); + return date('W', Math.round(nd2.getTime() / 1000)); + } else { + return(1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0); + } + } + }, + + // Month + F: function() { + return txt_months[f.n()] + }, + m: function() { + return pad(f.n(), 2) + }, + M: function() { + return f.F().substr(0, 3) + }, + n: function() { + return jsdate.getMonth() + 1 + }, + t: function() { + var n; + if((n = jsdate.getMonth() + 1) == 2) { + return 28 + f.L(); + } else { + if(n & 1 && n < 8 || !(n & 1) && n > 7) { + return 31; + } else { + return 30; + } + } + }, + + // Year + L: function() { + var y = f.Y(); + return (!(y & 3) && (y % 1e2 || !(y % 4e2))) ? 1 : 0 + }, + //o not supported yet + Y: function() { + return jsdate.getFullYear() + }, + y: function() { + return (jsdate.getFullYear() + '').slice(2) + }, + + // Time + a: function() { + return jsdate.getHours() > 11 ? 'pm' : 'am' + }, + A: function() { + return f.a().toUpperCase() + }, + B: function() { + // peter paul koch: + var off = (jsdate.getTimezoneOffset() + 60) * 60; + var theSeconds = (jsdate.getHours() * 3600) + (jsdate.getMinutes() * 60) + jsdate.getSeconds() + off; + var beat = Math.floor(theSeconds / 86.4); + if(beat > 1000) beat -= 1000; + if(beat < 0) beat += 1000; + if((String(beat)).length == 1) beat = '00' + beat; + if((String(beat)).length == 2) beat = '0' + beat; + return beat; + }, + g: function() { + return jsdate.getHours() % 12 || 12 + }, + G: function() { + return jsdate.getHours() + }, + h: function() { + return pad(f.g(), 2) + }, + H: function() { + return pad(jsdate.getHours(), 2) + }, + i: function() { + return pad(jsdate.getMinutes(), 2) + }, + s: function() { + return pad(jsdate.getSeconds(), 2) + }, + //u not supported yet + + // Timezone + //e not supported yet + //I not supported yet + O: function() { + var t = pad(Math.abs(jsdate.getTimezoneOffset() / 60 * 100), 4); + if(jsdate.getTimezoneOffset() > 0) t = '-' + t; + else t = '+' + t; + return t; + }, + P: function() { + var O = f.O(); + return(O.substr(0, 3) + ':' + O.substr(3, 2)) + }, + //T not supported yet + //Z not supported yet + + // Full Date/Time + c: function() { + return f.Y() + '-' + f.m() + '-' + f.d() + 'T' + f.h() + ':' + f.i() + ':' + f.s() + f.P() + }, + //r not supported yet + U: function() { + return Math.round(jsdate.getTime() / 1000) + } + }; + + return format.replace(/([a-zA-Z])/g,function(t, s) { + var ret=''; + if(t != s) { + // escaped + ret = s; + } else if(f[s]) { + // a date function exists + ret = f[s](); + } else { + // nothing special + ret = s; + } + return ret; + }); + } + + /* + * arrayToString + * 功能,二维数组传化成字符串 + */ + function arrayToString(arr) { + var str=''; + if(!isUndefined(arr)){ + for(var i=0;i0){ + str+=','; + } + for(var y=0;y0){ + str+=';'; + } + if(valType(temp[y])=='number'){ + str+=parseInt(temp[y]*100); + } + else { + str+=temp[y]; + } + } } - }, - - // Month - F: function() { - return txt_months[f.n()] - }, - m: function() { - return pad(f.n(), 2) - }, - M: function() { - return f.F().substr(0, 3) - }, - n: function() { - return jsdate.getMonth() + 1 - }, - t: function() { - var n; - if((n = jsdate.getMonth() + 1) == 2) { - return 28 + f.L(); - } else { - if(n & 1 && n < 8 || !(n & 1) && n > 7) { - return 31; - } else { - return 30; - } - } - }, - - // Year - L: function() { - var y = f.Y(); - return(!(y & 3) && (y % 1e2 || !(y % 4e2))) ? 1 : 0 - }, - //o not supported yet - Y: function() { - return jsdate.getFullYear() - }, - y: function() { - return(jsdate.getFullYear() + '').slice(2) - }, - - // Time - a: function() { - return jsdate.getHours() > 11 ? 'pm' : 'am' - }, - A: function() { - return f.a().toUpperCase() - }, - B: function() { - // peter paul koch: - var off = (jsdate.getTimezoneOffset() + 60) * 60; - var theSeconds = (jsdate.getHours() * 3600) + (jsdate.getMinutes() * 60) + jsdate.getSeconds() + off; - var beat = Math.floor(theSeconds / 86.4); - if(beat > 1000) beat -= 1000; - if(beat < 0) beat += 1000; - if((String(beat)).length == 1) beat = '00' + beat; - if((String(beat)).length == 2) beat = '0' + beat; - return beat; - }, - g: function() { - return jsdate.getHours() % 12 || 12 - }, - G: function() { - return jsdate.getHours() - }, - h: function() { - return pad(f.g(), 2) - }, - H: function() { - return pad(jsdate.getHours(), 2) - }, - i: function() { - return pad(jsdate.getMinutes(), 2) - }, - s: function() { - return pad(jsdate.getSeconds(), 2) - }, - //u not supported yet - - // Timezone - //e not supported yet - //I not supported yet - O: function() { - var t = pad(Math.abs(jsdate.getTimezoneOffset() / 60 * 100), 4); - if(jsdate.getTimezoneOffset() > 0) t = '-' + t; - else t = '+' + t; - return t; - }, - P: function() { - var O = f.O(); - return(O.substr(0, 3) + ':' + O.substr(3, 2)) - }, - //T not supported yet - //Z not supported yet - - // Full Date/Time - c: function() { - return f.Y() + '-' + f.m() + '-' + f.d() + 'T' + f.h() + ':' + f.i() + ':' + f.s() + f.P() - }, - //r not supported yet - U: function() { - return Math.round(jsdate.getTime() / 1000) } - }; - - return format.replace(/([a-zA-Z])/g,function(t, s) { - var ret=''; - if(t != s) { - // escaped - ret = s; - } else if(f[s]) { - // a date function exists - ret = f[s](); - } else { - // nothing special - ret = s; - } - return ret; - }); - } - /* - * dataURLtoBlob - * 功能,base64转blob - */ - function dataURLtoBlob(dataurl) { - var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); - while (n--) { - u8arr[n] = bstr.charCodeAt(n); + return str; } - return new Blob([u8arr], { type: mime }); - } + + /* + * stringToArray + * 功能,字符串转化成二维数组 + */ + function stringToArray(str) { + var newArr=[]; + if(!isUndefined(str)){ + var arr=str.split(','); + for(var i=0;i-1){ - return 'iphone'; - } - } - /* - * cookie - * 功能,操作cookie - */ - function cookie(name,value,domain,path){ - if(isUndefined(domain)){ - domain=''; - } - if(isUndefined(path)){ - path='/'; - } - var ckStr=';domain='+domain+';path='+path; - if(location.protocol=='https'){ - ckStr+=';SameSite=None;Secure=true'; - } - var set=function(name,value){ - var time = 360*24*60*60*1000; - var exp = new Date(); - exp.setTime(exp.getTime() + time); - try{ - document.cookie = name + '='+ escape (value) + ';expires=' + exp.toGMTString()+ckStr; - } - catch(event){console.error(event)} - }, - get=function(name){ - var arr,reg=new RegExp('(^| )'+name+'=([^;]*)(;|$)'); - if(arr=document.cookie.match(reg)){ - return unescape(arr[2]); - } - else{ - return null; - } - }, - del=function(name){ - var exp = new Date(); - exp.setTime(exp.getTime() - 1); - var cval=get(name); - if(cval!=null){ - document.cookie= name + '='+cval+';expires='+exp.toGMTString()+ckStr; - } - }; - if(!isUndefined(name) && !isUndefined(value)){ - if(value=='delete'){ - del(name); - return null; - } - else{ - set(name,value); + else if(!isUndefined(name) && isUndefined(value)){ return get(name); } - - } - else if(!isUndefined(name) && isUndefined(value)){ - return get(name); - } - else if(!isUndefined(name)){ - - } - } + else if(!isUndefined(name)){ + + } + } + /* - * arrayToString - * 功能,二维数组传化成字符串 - */ - function arrayToString(arr) { - var str=''; - if(!isUndefined(arr)){ - for(var i=0;i0){ - str+=','; + * getPath + * 功能:获取该js文件所在路径 + */ + function getPath(siz) { + 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'); + var src = scriptList[i].src.slice(scriptList[i].src.lastIndexOf('/') + 1, scriptList[i].src.lastIndexOf('.')); + if ((scriptName && (scriptName == 'moeplayer' || scriptName == 'moeplayer.min')) || (scriptList[i].src && (src == 'moeplayer' || src == 'moeplayer.min'))) { + thisPath = scriptList[i].src; + break; } - for(var y=0;y0){ - str+=';'; + } + var path=thisPath.substring(0, thisPath.lastIndexOf('/js/') + 1); + if(!isUndefined(siz)){ + path+=siz+'/'; + } + return path; + } + + var language = language$1; + + function moeplayerEmbed(videoObj){ + /* + * rightMenu + * 功能:全局变量,右键内容 + * 初始化设置menu可替换该变量内容 + */ + var rightMenu=[ + { + title:'MoePlayer' + }, + { + title:'version:X3', + underline:true + }, + { + title:'about', + click:'aboutShow' + } + ]; + var vars={},varsTemp={};//保存传递过来的videoObject + var video=null;//视频播放器对象 + var duration=0;//总时间 + var mutedState='';//默认静音状态 + var recoveryVolume=false;//是否需要在播放时恢复音量 + var waited=true;//是否缓冲结束 + var paused=true;//默认暂停状态 + var loadTime=0;//已加载部分 + var seekTime=0;//需要跳转的时间,初次播放以及切换清晰度后会用该变量记录需要seek的时间 + var oldTime=0,playTime=0,firstSeekTime=-1,maxSeeTime=0;//oldTime=记录上次播放时间,playTime=当前播放时间,firstSeekTime=记录第一次拖动的时间,maxSeeTime=看过的最大时间 + var isChangeDef=true;//是否需要重置清晰度 + var playType='';//播放类别,默认='',是通过api接口播放,='button'则判定是通过点击按钮播放 + var msgSetTime=null,tipSetTime=null,mouseSetTime=null;//用于显示提示后自动隐藏的计时器 + var adFrontSetTime=null,adPauseSetTime=null;//贴片广告和暂停广告的计时器 + var closeTipFun=null;//关闭提示的函数 + var closeTipMouseOut=null;//鼠标离开节点时执行的函数 + var waitingMessage=true;//显示缓冲提示 + var hidePreviewSetTime=null;//隐藏预览图的计时器 + var pSliderMouseDown=false;//判断是否在进度条上的滑块上按下 + var playbackTime=0;//记录回放时间 + var loadedmetadataNum=0;//记录元数据加载成功次数,记录视频播放数量 + var screenshotImg=null;//记录最新一张截图 + var ad=null;//广告对象 + var frontAdPlay=false,pauseAdPlay=false;//贴片广告是否播放,暂停广告是否播放 + var barShow=true,rightBarShow=true; + var EventTarget=null,newEvent=null,eventTargetList=null;//注册监听 + var loadedTrack=false;//默认未加载字幕 + var C={};//保存播放器界面上的所有节点 + var CT=null,CK=null,CM=null,CV=null;//CT=播放器容器,页面中已存的,CT>CK>CM>CV>video + var pugPlayer=null;//插件播放器 + var hls=null;//播放hls + var loadMeta=true;//第一次加载到元数据 + var app='';//平台类型 + var nowRotate=0;//当前视频旋转角度 + var nowZoom=100;//当前缩放比例 + var smallWindowsState=false;//当前是否处理小窗口状态 + var isDrag=false;//是否在播放器上按下并且拖动 + var moeplayerCookie='moeplayer-player-cookie'; + var cookieName='';//cookie名称 + var cookieTime=0;//cookie保存时间,单位:秒 + var cookieArray=[];//保存当前所有记录 + var focusPause=true;//失去焦点前是否是暂停状态 + var existenceObj=false;//是否使用源码里已有的dom + /* + * into + * 功能:初始化,调用播放器则首先调用该函数 + * @obj=初始化时的配置对象:videoObject + */ + var into=function(obj){ + /* + * 如果未传递初始化配置对象,则为player变量增加一个add函数,功能相当于into + */ + if(isUndefined(obj)){ + player.add=player.into=into; + return player; + } + /* + * 转码默认语言包 + */ + language=decodeURIString(language); + /* + * 检查是否在顶部引入了外部语言包文件,如果引入了,则使用外部语言包替换进language变量 + */ + if(!isUndefined(window.moeplayerLanguage)){ + language=mergeObj(language,window.moeplayerLanguage); + } + /* + * 初始化注册事件函数,该函数的作用是将所有相关的事件都注册进一个变量newEvent + * newEvent是提供给播放器外部监听函数使用的,如监听时间player.time(function(t){console.log('已播放:'+t);}); + */ + eventTarget(); + /* + * 监听页面标签状态(判断是否失去焦点) + */ + documentHidden(function(state){ + eventTarget('visibilityState',state); + }); + /* + * 判断平台类型,主要是判断是否是iphone类型的平台 + */ + app=getApp(); + /* + * 简单复制一下初始化时的默认配置 + */ + varsTemp={}; + for(var key in videoObjectDefault){ + varsTemp[key]=videoObjectDefault[key]; + } + /* + * 如果初始化配置是字符串并且是以website:开头或url:开头的,则认为需要请求一个json文件来获取配置 + */ + if(valType(obj)=='string' && (obj.substr(0,8)=='website:' || obj.substr(0,4)=='url:')){ + var ajaxUrl=''; + if(obj.substr(0,8)=='website:'){ + ajaxUrl=obj.substring(8); } - if(valType(temp[y])=='number'){ - str+=parseInt(temp[y]*100); + if(obj.substr(0,4)=='url:'){ + ajaxUrl=obj.substring(4); } - else{ - str+=temp[y]; + ajax({url:ajaxUrl,success:function(data){ + if(data){ + return into(data); + } + else { + showWindowsError(language['error']['ajax']+',url:'+ajaxUrl); + return null; + } + }}); + } + /* + * 如果初始化配置是一个object,则进行下面的操作 + */ + else if(valType(obj)=='object'){ + varsTemp = standardization(varsTemp, obj);//将obj合并到varsTemp对象里 + if(!isUndefined(obj['container']) && obj['container']){ + CT=$(obj['container']); + if(CT){//如果播放容器存在,则调用语言判断函数 + return loadLanguage(obj); + } + else {//如果播放容器不存在,则则等页面加载完成后运行 + return bodyReady(obj); + } + } + else {//不存在播放容器配置则等页面加载完成后运行 + return bodyReady(obj); + } + } + else { + showWindowsError(language['error']['noVideoContainer']); + return null; + } + }, + /* + * bodyReady + * 功能:页面加载完成后构建播放器 + * @obj=初始化时的配置对象 + */ + bodyReady=function (obj){ + documentReady(function(){ + if(!isUndefined(obj['container'])){ + CT=$(obj['container']); + if(CT){//如果播放容器存在,则调用语言判断函数 + return loadLanguage(obj); + } + else { + showWindowsError(language['error']['noVideoContainer']); + return null; + } + } + else {//不存在播放容器则重新判断 + return ajaxWebsite(obj); + } + }); + return null; + }, + /* + * ajaxWebsite + * 功能:页面加载完成后重新初始化 + * @obj=初始化时的配置对象 + */ + ajaxWebsite=function (obj){ + if(valType(obj['video'])=='string' && (obj['video'].substr(0,8)=='website:' || obj['video'].substr(0,4)=='url:')){ + varsTemp = standardization(varsTemp, obj); + var ajaxUrl=''; + if(obj['video'].substr(0,8)=='website:'){ + ajaxUrl=obj['video'].substring(8); + } + if(obj['video'].substr(0,4)=='url:'){ + ajaxUrl=obj['video'].substring(4); + } + ajax({url:ajaxUrl,success:function(data){ + if(data){ + return into(data); + } + else { + showWindowsError(language['error']['ajax']+',url:'+ajaxUrl); + return null; + } + }}); + } + else { + showWindowsError(language['error']['noVideoContainer']); + return null; + } + }, + /* + * loadLanguage + * 功能:加载Language + * @obj=初始化时的配置对象 + */ + loadLanguage=function (obj){ + vars = standardization(varsTemp, obj); + if(vars['language']){ + var path=getPath('language')+vars['language']+'.js'; + loadJs(path,function(){ + if(!isUndefined(window['moeplayerLanguage'])){ + language=mergeObj(language,window['moeplayerLanguage']); + } + return embed(obj); + }); + } + else { + return embed(obj); + } + }, + /* + * embed + * 功能:构建播放器 + * @obj=初始化时的配置对象 + */ + embed=function (obj){ + /* + * 判断静音状态 + */ + mutedState=vars['volume']>0?false:true; + if(!isUndefined(CT) && CT!=null){ + if(valType(CT)=='htmlarray'){ + CT=CT.eq(0); + } + } + else { + return null; + } + /* + * 注册获取fps的函数 + */ + calculationFps(); + /* + * 如果video指向一个已存在的video标签对象 + */ + existenceObj=valType(vars['video'])=='string' && ((vars['video'].substr(0,1)=='.' && vars['video'].indexOf('/')==-1) || vars['video'].substr(0,1)=='#'); + /* + * 清空容器 + */ + if(existenceObj){ + CK=CT.find('.moeplayer')?CT.find('.moeplayer').eq(0):null; + if(CK){ + CM=CK.find('.ck-main')?CK.find('.ck-main').eq(0):null; + } + if(CM){ + CV=CM.find('.ck-video')?CM.find('.ck-video').eq(0):null; + } + } + if(!CK || !CM || !CV){ + CT.htm(''); + /* + * 在播放容器里新建一个总的容器 + */ + CK=createlDiv('moeplayer'); + CT.append(CK); + /* + * 在总容器里再新建一个容器 + */ + CM=createlDiv('ck-main'); + CK.append(CM); + /* + * 新建一个放置video标签的容器 + */ + CV=createlDiv('ck-video'); + CM.append(CV); + } + /* + * 如果已存在video.则先设置成空 + */ + if(video){ + video.remove(); + video=null; + } + /* + * 如果video指向一个已存在的video标签对象,则直接调用该对象 + */ + if(existenceObj){ + video=$(vars['video'])?$(vars['video']).eq(0):null; + } + /* + * 新建一个video标签 + */ + if(!video){ + video = createlVideo(); + video.attr('width','100%').attr('height','100%'); + CV.append(video); + } + video.volume=vars['volume']; + if(vars['autoplay']){ + player.volume(0); + player.muted(); + recoveryVolume=true; + video.attr('autoplay','autoplay'); + paused=false; + } + else { + video.attr('preload','metadata'); + } + CT.loop=vars['loop']; + if(CT.loop){ + video.attr('loop','loop'); + } + if(vars['controls']){ + video.controls=true; + } + else { + video.controls=false; + } + try{ + if(!existenceObj){ + video.attr('controlslist','nodownload'); + video.attr('x-webkit-airplay','true'); + video.attr('x5-video-orientation','portraint'); + video.attr('playsinline','true'); + video.attr('webkit-playsinline','true'); + video.attr('x5-playsinline','true'); + } + if(vars['crossOrigin']){ + video.useCORS=true;//解决跨域 + video.crossOrigin=vars['crossOrigin'];//解决跨域 + } + } + catch(event){} + /* + * 默认设置支持小窗口模式 + */ + CT.smallWindows=true; + /* + * 默认设置不显示页面全屏按钮 + */ + CT.webFull=false; + /* + * 默认设置不显示剧场模式按钮 + */ + CT.theatre=false; + /* + * 加载播放器界面 + */ + loadFace(); + /* + * 判断是否需要默认旋转视频 + */ + if(vars['rotate']>0){ + player.rotate(vars['rotate']); + } + /* + * 判断是否需要默认缩放视频 + */ + if(vars['zoom']>0){ + player.zoom(vars['zoom']); + } + /* + * 判断是否支持video标签 + */ + if(isUndefined(video.canPlayType)){ + CT.error={code:5,message:language['error']['supportVideoError']}; + eventTarget('error',CT.error);//注册监听error + showError(); + return player; + } + /* + * 注册视频播放器内部监听,监听到事件后注册给CT使用 + */ + addAllListener(); + /* + * 如果需要在视频播放器加载成功后调用相关函数,此时则开始调用 + */ + if(!isUndefined(vars['loaded'])){ + if(valType(vars['loaded'])=='function'){ + try{ + vars['loaded'](player); + } + catch(event){} + } + else if(valType(vars['loaded'])=='string'){ + try{ + eval(vars['loaded']+ '(player)'); + } + catch(event){} + } + } + /* + * 播放视频 + */ + if(!existenceObj){ + changeVideo(vars['video']); + } + else { + changeVideo(video.attr('src')); + } + /* + * 返回 播放器 + */ + return player; + }, + /* + * changeVideo + * 功能:初始化视频地址或修改视频地址 + */ + changeVideo=function (vstr){ + var i=0; + if(video.attr('src') || video.htm()){ + player.pause(); + } + if(video.attr('src') && !existenceObj){ + video.attr('src',''); + video.removeAttr('src'); + } + if(!isUndefined(video.textTracks) && video.textTracks.length>0){ + for(i=video.find('track').length-1;i>-1;i--){ + video.find('track').eq(i).remove(); + } + } + if(!existenceObj){ + video.htm(''); + } + if(!isUndefined(vars['ad'])){ + ad=vars['ad']; + } + var source=''; + if(valType(vstr)=='string'){ + if(vstr.substr(0,8)=='website:' || vstr.substr(0,4)=='url:'){ + var ajaxUrl=''; + if(vstr.substr(0,8)=='website:'){ + ajaxUrl=vstr.substring(8); + } + if(vstr.substr(0,4)=='url:'){ + ajaxUrl=vstr.substring(4); + } + ajax({url:ajaxUrl,success:function(data){ + if(data!=null){ + vars = standardization(varsTemp, data); + changeVideo(vars['video']); + } + else { + CT.error={code:8,message:language['error']['ajax']}; + eventTarget('error',CT.error);//注册监听error + showError(); + } + }}); + return; + } + else { + if(vars['plug'] && !canPlay(vstr)){ + plugPlayer(vstr); + } + else { + if(!existenceObj){ + video.attr('src',vstr); + } + } + loadTrack(); + } + } + else if(valType(vstr)=='array'){ + for(i=0;i1){ + source += ''; + } + } + } + } + if(source){ + video.htm(source); + } + loadTrack(); + } + else if(valType(vstr)=='object'){ + if(vars['plug']){ + plugPlayer(vstr); + } + else { + CT.error={code:10,message:language['error']['emptied']}; + eventTarget('error',CT.error);//注册监听error + showError(); + } + loadTrack(); + } + if(!isUndefined(video.find('source')) && video.find('source').length>0){ + video.find('source').eq(video.find('source').length-1).addListener('error',videoHandler.error); + } + checkBar(); + loadLogo(); + if(isChangeDef){ + checkDefinition(); + } + /* + * 对cookie进行相关分析 + */ + if(vars['cookie']){ + if(valType(vars['cookie'])=='array' && vars['cookie'].length>=2){ + if(vars['cookie'][0] && valType(vars['cookie'][0])=='string'){ + cookieName=vars['cookie'][0]; + } + if(vars['cookie'][1] && valType(vars['cookie'][1])=='number'){ + cookieTime=vars['cookie'][1]; + } + } + if(valType(vars['cookie'])=='object' && !isUndefined(vars['cookie']['name'])){ + cookieName=vars['cookie']['name']; + if(!isUndefined(vars['cookie']['hour']) && valType(vars['cookie']['hour'])=='number'){ + cookieTime=vars['cookie']['hour']; + } + } + if(valType(vars['cookie'])=='string'){ + cookieName=vars['cookie']; + } + if(cookieName){ + cookieName=cookieName.replace(/[ ]*,[ ]*|[ ]+/g, '').replace(/[ ]*;[ ]*|[ ]+/g, ''); + } + } + if(!isUndefined(vars['seek']) && !seekTime){ + if(valType(vars['seek'])=='number' && vars['seek']>0){ + seekTime=vars['seek']; + } + if(valType(vars['seek'])=='string' && vars['seek']=='cookie' && cookieName){ + var cke=player.cookie(cookieName); + if(cke){ + seekTime=cke['time']; + } + + } + } + }, + /* + * plugPlayer + * 功能:使用插件进行播放 + */ + plugPlayer=function (url){ + switch(vars['plug']){ + case 'hls.js': + hlsPlayer(url); + break; + case 'flv.js': + flvPlayer(url); + break; + case 'mpegts.js': + mpegtsPlayer(url); + break; + case 'dash.js': + dashPlayer(url); + break; + default: + if(valType(vars['plug'])=='function'){ + vars['plug'](video,url); + } + else { + CT.error={code:10,message:language['error']['emptied']}; + eventTarget('error',CT.error);//注册监听error + showError(); + } + + break; + } + }, + /* + * hlsPlayer + * 功能:使用hls.js插件进行播放 + */ + hlsPlayer=function (url){ + var path=getPath('hls.js')+'hls.min.js'; + loadJs(path,function(){ + if (!isUndefined(Hls) && Hls.isSupported()) { + hls = new Hls(); + hls.loadSource(url); + hls.attachMedia(video); + hls.on(Hls.Events.ERROR, function(event, data){ + var code=9; + var message=language['error']['loadingFailed']; + var fatal=data.fatal; + if(!isUndefined(data.response)){ + if(!isUndefined(data.response.code)){ + code=data.response.code; + } + if(!isUndefined(data.response.text) && data.response.text){ + message=data.response.text; + } + else { + if(!isUndefined(event)){ + message=event; + } + } + } + CT.error={code:code,message:message}; + eventTarget('error',CT.error);//注册监听error + if(fatal){ + showError(); + } + }); + } + else if(canPlay(url)){ + video.attr('src',url); + } + }); + }, + /* + * flvPlayer + * 功能:使用flv.js插件进行播放 + */ + flvPlayer=function (url){ + var path=getPath('flv.js')+'flv.min.js'; + loadJs(path,function(){ + if (typeof(flvjs)!='undefined' && !isUndefined(flvjs) && flvjs.isSupported()) { + var config={ + type: 'flv', + url: url + }; + if(valType(url)=='object'){ + config=url; + } + if(vars['live']){ + config['isLive']=true; + } + if(pugPlayer){ + pugPlayer.pause(); + pugPlayer.unload(); + pugPlayer.detachMediaElement(); + pugPlayer.destroy(); + pugPlayer=null; + } + pugPlayer = flvjs.createPlayer(config); + pugPlayer.attachMediaElement(video); + pugPlayer.load(); + pugPlayer.on(flvjs.Events.METADATA_ARRIVED, function(res){ + videoHandler.loadedMetaData(); + }); + pugPlayer.on(flvjs.Events.ERROR, function(errorType, errorDetail, errorInfo){ + CT.error={code:errorInfo['code'],message:errorInfo['msg']}; + eventTarget('error',CT.error);//注册监听error + showError(); + }); + } + }); + }, + /* + * mpegtsPlayer + * 功能:使用mpegts.js插件进行播放 + */ + mpegtsPlayer=function (url){ + var path=getPath('mpegts.js')+'mpegts.js'; + loadJs(path,function(){ + if (typeof(mpegts)!='undefined' && !isUndefined(mpegts) && mpegts.getFeatureList().mseLivePlayback) { + var config={ + type: 'mse', + url: url + }; + if(valType(url)=='object'){ + config=url; + } + if(vars['live']){ + config['isLive']=true; + } + if(pugPlayer){ + pugPlayer.pause(); + pugPlayer.unload(); + pugPlayer.detachMediaElement(); + pugPlayer.destroy(); + pugPlayer=null; + } + pugPlayer = mpegts.createPlayer(config); + pugPlayer.attachMediaElement(video); + pugPlayer.load(); + + pugPlayer.on(mpegts.Events.METADATA_ARRIVED, function(res){ + videoHandler.loadedMetaData(); + }); + pugPlayer.on(mpegts.Events.ERROR, function(errorType, errorDetail, errorInfo){ + CT.error={code:errorInfo['code'],message:errorInfo['msg']}; + eventTarget('error',CT.error);//注册监听error + showError(); + }); + } + }); + }, + /* + * canPlay + * 功能:判断是否能支持相关视频格式 + */ + canPlay=function(vStr,num){ + var vTypeArr=[ + {vidType:'video/ogg',codType:'theora, vorbis'}, + {vidType:'video/mp4',codType:'avc1.4D401E, mp4a.40.2'}, + {vidType:'video/mp4',codType:'avc1'}, + {vidType:'video/mp4',codType:'hevc'}, + {vidType:'video/webm',codType:'vp8.0, vorbis'}, + {vidType:'video/webm',codType:'vp9'}, + {vidType:'',codType:'application/x-mpegURL'}, + {vidType:'',codType:'application/vnd.apple.mpegurl'} + ]; + var vType={ + ogg:vTypeArr[0], + mp4:[vTypeArr[1],vTypeArr[2],vTypeArr[3]], + webm:[vTypeArr[4],vTypeArr[5]], + m3u8:[vTypeArr[6],vTypeArr[7]] + }; + var arr=[]; + var k=''; + var supportType=function(obj){ + var vType=obj['vidType']; + var str=''; + if(vType){ + str=vType+'; '+ 'codecs="' + obj['codType'] + '"'; + } + else { + str=obj['codType']; + } + var sup = video.canPlayType(str); + if(sup == '') { + sup = 'no'; + } + return sup; + }; + var getExtension=function(filepath) { + return filepath.replace(/.+\./, ''); + }; + if(isUndefined(num)){ + if(valType(vStr)=='string'){ + if(vars['type']){ + for(k in vTypeArr){ + if(vTypeArr[k]['vidType']==vars['type']){ + arr.push(vTypeArr[k]); + } + } + } + else { + if(getExtension(vStr) && getExtension(vStr) in vType){ + var temp=vType[getExtension(vStr)]; + if(valType(temp)=='array'){ + for(var i=0;i0){ + for(var i=0;icTime && arr[i][0]!=cookieName && y<19){ + tempArr.push(arr[i]); + y++; + } + } + arr=tempArr; + } + if(arr.length>0){ + cookie(moeplayerCookie,'delete',vars['domain'],vars['cookiePath']); + cookie(moeplayerCookie,arrayToString(arr),vars['domain'],vars['cookiePath']); + } + cookieArray=arr; + }, + /* + * loadTrack + * 功能:加载track + */ + loadTrack=function(){ + if(isUndefined(video.textTracks)){ + return; + } + var i=0; + if(!isUndefined(vars['track']) && valType(vars['track'])=='array' && !video.find('track')){ + var track=''; + var arr=vars['track']; + C['bar']['track'].show(); + for(i=0;i'; + } + if(video){ + var html=video.htm()+track; + video.htm(html); + } + if(video.find('track') && !loadedTrack){ + loadedTrack=true; + checkTrack(); + } + } + }, + /* + * loadedMetaData + * 功能:获取元数据后执行的函数 + */ + loadedMetaData=function(){ + eventTarget('loadedMetaData',{ + width:CK.getWidth(), + height:CK.getHeight(), + videoWidth:CT.videoWidth, + videoHeight:CT.videoHeight, + duration:duration, + volume:CT.volume + }); + eventTarget('duration',duration); + if('error' in C){ + C['error'].hide(); + } + replaceInformation('videoWidth',CT.videoWidth); + replaceInformation('videoHeight',CT.videoHeight); + replaceInformation('volume',parseInt(CT.volume*100)); + replaceInformation('duration',parseInt(duration)); + documentHidden(function(state){ + if(vars['documentFocusPause']){ + if(state=='show'){ + if(!focusPause && paused){ + player.play(); + } + } + else { + focusPause=paused; + player.pause(); + } + } + }); + }; + /* + * videoHandler + * 功能:视频播放对象video注册内部监听调用函数 + */ + var videoHandler={ + loadStart:function(){ + if(!vars['controls'] && app!='iphone'){ + C['loading'].show(); + } + C['centerPlay'].hide(); + eventTarget('loadstart'); + + }, + canPlay:function(){ + C['loading'].hide(); + eventTarget('canplay'); + }, + loadedData:function(){ + eventTarget('loadeddata'); + }, + loadedMetaData:function(){ + duration=this.duration; + if(!isUndefined(this.duration) && vars['duration']){ + duration=vars['duration']; + } + if(!vars['live']){ + C['time'].htm(formatSeconds(this.currentTime)+'/'+formatSeconds(duration)); + C['tempTime'].htm(formatSeconds(this.currentTime)+'/'+formatSeconds(duration)); + } + C['loading'].hide(); + if(vars['poster']){ + video.attr('poster',vars['poster']); + } + if(!vars['autoplay'] && !vars['controls']){ + C['centerPlay'].show(); + C['buffer'].hide(); + } + + CT.duration=duration; + CT.videoWidth=this.videoWidth; + CT.videoHeight=this.videoHeight; + CT.volume=this.volume; + if(CT.videoWidth || CT.videoHeight || duration){ + loadedMetaData(); + } + var len = 0; + if(!isUndefined(this.buffered)){ + len=this.buffered.length; + } + if(len>0){ + changeLoad(); + } + if(!vars['live']){ + changePreview(vars['preview']);//修改预览图片 + } + else { + changePreview();//修改预览图片 + } + if(!isUndefined(vars['prompt']) && valType(vars['prompt'])=='array' && !vars['live']){ + changePrompt(); + } + else { + deletePrompt(); + } + if(isChangeDef){ + checkDefinition(); + isChangeDef=false; + } + pSliderMouseDown=false; + loadedmetadataNum++; + if(!isUndefined(ad) && !isUndefined(ad['frontPlay']) && ad['frontPlay'] && loadedmetadataNum>1){//如果是贴片广告播放中,则进行播放和计算 + player.play(); + calculationAdFrontTime(duration);//计算贴片广告的时间 + } + if(!isUndefined(ad) && !isUndefined(ad['frontPlay']) && !ad['frontPlay']){//如果广告播放结束则播放正片 + player.volume(vars['volume']); + player.play(); + } + if(!vars['autoplay'] && loadMeta){ + loadMeta=false; + player.pause(); + setTimeout(player.pause,300); + } + }, + timeUpDate:function(){//监听播放时间 + if(!waited){ + waited=true; + C['buffer'].hide(); + eventTarget('buffer','end'); + } + var len = this.buffered.length; + if(len>0){ + changeLoad(); + } + if(!duration && this.duration){ + duration=this.duration; + CT.duration=duration; + CT.videoWidth=this.videoWidth; + CT.videoHeight=this.videoHeight; + if(CT.videoWidth || CT.videoHeight || duration){ + loadedMetaData(); + } + } + oldTime=playTime; + playTime=this.currentTime; + if(maxSeeTime1){//如果是贴片广告播放中,则进行播放 + calculationAdFrontTime(duration-playTime);//计算贴片广告的时间 + } + if(!isUndefined(C['error']) && C['error'].css('display')=='block'){ + C['error'].hide(); + } + if(cookieName){ + changeCookie(playTime); + } + replaceInformation('audioDecodedByteCount',this.webkitAudioDecodedByteCount || this.audioDecodedByteCount || 0); + replaceInformation('videoDecodedByteCount',this.webkitVideoDecodedByteCount || this.videoDecodedByteCount || 0); + }, + ended:function(){//监听播放结束 + if(!isUndefined(ad) && !isUndefined(ad['frontPlay']) && ad['frontPlay']){//如果是贴片广告播放中,则用广告结束函数对此进行判断 + adFrontEnded(); + } + else { + C['bar']['playAndPause']['pause'].hide(); + C['bar']['playAndPause']['play'].hide(); + C['bar']['playAndPause']['refresh'].show(); + eventTarget('ended'); + showEnded(); + message(); + } + }, + error:function(event){ + if(!isUndefined(event.type)){ + var errorInfo=this.error; + var errorBak=function(){ + var code=12; + var msg=language['error']['loadingFailed']; + if(!isUndefined(errorInfo)){ + if(!isUndefined(errorInfo.code)){ + code=errorInfo.code; + } + if(!isUndefined(errorInfo.message)){ + msg=errorInfo.message; + } + CT.error={code:code,message:msg}; + showError(); + } + else { + CT.error={code:code,message:msg}; + if(event.target.attr('src')){ + showError(); + } + } + eventTarget('error',CT.error);//注册监听error + }; + if(event.type=='error'){ + try{ + if(video.currentSrc){ + ajax({url:video.currentSrc,error:function(info){ + if(info && valType(info)=='object' && 'code' in info && info['code']){ + CT.error=info; + eventTarget('error',CT.error);//注册监听error + showError(); + } + else { + errorBak(); + } + },success:function(data){ + if(!data){ + errorBak(); + } + }}); + } + else { + errorBak(); + } + } + catch(event){ + errorBak(); + } + } + } + }, + stalled:function(){ + eventTarget('stalled');//注册监听error + CT.error={code:13,message:'load:stalled'}; + eventTarget('error',CT.error);//注册监听error + }, + suspend:function(){ + eventTarget('suspend');//注册监听error + }, + emptied:function(){ + eventTarget('emptied');//注册监听error + CT.error={code:7,message:language['error']['emptied']}; + eventTarget('error',CT.error);//注册监听error + }, + seeked:function(){ + if(paused){ + player.play(); + } + pSliderMouseDown=false; + eventTarget('seek',{time:this.currentTime,state:'seeked'}); + eventTarget('seeked'); + }, + seeking:function(){ + if(paused){ + player.play(); + } + var seekingTime=this.currentTime; + if(firstSeekTime==-1){ + firstSeekTime=seekingTime;//记录第一次拖动的时间 + } + switch(vars['timeScheduleAdjust']){ + case 0://禁止拖动 + if(oldTime!=seekingTime){ + waitingMessage=false; + player.seek(oldTime); + message(language['timeScheduleAdjust']['prohibit']); + return; + } + break; + case 2://只能前进(向右拖动 + if(seekingTimeoldTime){ + waitingMessage=false; + player.seek(oldTime); + message(language['timeScheduleAdjust']['prohibitForward']); + return; + } + break; + case 4://只能前进但能回到第一次拖动时的位置 + if(seekingTimemaxSeeTime){ + waitingMessage=false; + player.seek(maxSeeTime); + message(language['timeScheduleAdjust']['prohibitForwardNotViewed']); + return; + } + break; + } + eventTarget('seek',{time:seekingTime,state:'seeking'}); + eventTarget('seeking'); + if(!vars['live']){ + C['time'].htm(formatSeconds(seekingTime)+'/'+formatSeconds(duration)); + C['tempTime'].htm(formatSeconds(seekingTime)+'/'+formatSeconds(duration)); + } + + }, + waiting:function(){ + waited=false; + eventTarget('buffer','start');//注册监听视频缓冲 + C['centerPlay'].hide(); + if(!vars['controls']){ + C['buffer'].show(); + } + if(!waitingMessage){ + waitingMessage=true; + } + else { + message(language['waiting']); + } + + }, + play:function(){ + paused=false; + C['bar']['playAndPause']['play'].hide(); + C['bar']['playAndPause']['pause'].show(); + C['bar']['playAndPause']['refresh'].hide(); + C['centerPlay'].hide(); + if(playType=='button'){ + C['bar']['pbox'].removeClass('ck-bar-progress-out'); + } + else { + C['bar']['pbox'].addClass('ck-bar-progress-out'); + } + if(recoveryVolume){ + recoveryVolume=false; + player.exitMuted(); + } + hideBar(); + closePauseAd();//关闭暂停广告 + playType=''; + if(!isUndefined(C['ended'])){ + player.closeLayer(C['ended']); + } + if('error' in C){ + C['error'].hide(); + } + eventTarget('play'); + if(!isUndefined(ad)){//如果存在广告 + if(!isUndefined(ad['front'])){//如果存在贴片广告 + if(isUndefined(ad['frontPlay'])){//如果贴片广告还未播放 + ad['frontPlayI']=0; + ad['frontPlay']=true;//开始播放贴片广告 + player.pause();//暂停视频 + adFrontPlay(); + return; + } + } + } + if(seekTime && (isUndefined(vars['live']) || (!isUndefined(vars['live']) && valType(vars['live'])=='boolean' && !vars['live'])) && seekTime0 && mutedState){ + this.muted=false; + } + if(mutedState!=this.muted){ + mutedState=this.muted; + changeMuted(this.muted); + CT.muted=this.muted; + eventTarget('muted',CT.muted);//注册静音事件 + } + CT.volume=this.volume; + eventTarget('volume',this.volume);//注册音量事件 + if(!isUndefined(C['bar']['vbox'])){ + var vol=parseInt(this.volume*100); + C['bar']['vbox']['volume']['txt'].htm(vol); + if(!C['bar']['vbox']['mouseDown']){ + changeVolumeSlider(this.muted?0:this.volume); + } + if(!this.muted){//如果非静音状态 + message(language['volume']+vol+'%'); + } + } + replaceInformation('volume',parseInt(this.volume*100)); + }, + resize:function(){ + var fullState = document.fullScreen || document.mozFullScreen || document.webkitIsFullScreen || document.msFullscreenElement; + if(fullState) { + C['bar']['fullAndExit']['exitFull'].show(); + C['bar']['fullAndExit']['full'].hide(); + C['ad']['bottom']['fullAndExit']['exitFull'].show(); + C['ad']['bottom']['fullAndExit']['full'].hide(); + if(!CM.hasClass('ck-main-full')){ + CM.addClass('ck-main-full'); + } + message(language['full']); + C['bar']['webFullAndExit'].hide(); + C['bar']['theatreAndExit'].hide(); + if(!isUndefined(C['menu'])){ + CM.append(C['menu']); + } + } + else { + fullState=false; + C['bar']['fullAndExit']['full'].show(); + C['bar']['fullAndExit']['exitFull'].hide(); + C['ad']['bottom']['fullAndExit']['full'].show(); + C['ad']['bottom']['fullAndExit']['exitFull'].hide(); + if(CM.hasClass('ck-main-full')){ + CM.removeClass('ck-main-full'); + } + if(!isUndefined(vars['webFull']) && vars['webFull']){ + C['bar']['webFullAndExit'].show(); + } + if(!isUndefined(vars['theatre']) && !CT.webFull){ + C['bar']['theatreAndExit'].show(); + } + if(!isUndefined(C['menu'])){ + $('body').append(C['menu']); + } + if(CV.css('width')!=CM.css('width')){ + player.zoom(100); + } + } + if(CT.full!=fullState){ + CT.full=fullState; + eventTarget('full',fullState);//注册播放事件 + } + checkVideoRotate(); + changeProgress(player.time()); + }, + keydown:function(event){ + event=window.event || event; + var keycode = event.keyCode || event.which; + var v=player.volume(); + var pre=function(){ + if(event.preventDefault){ + event.preventDefault(); + } + else { + event.returnValue = false; + } + }; + switch(keycode) { + case 32: + pre(); + player.playOrPause(); + break; + case 37: + player.fastBack(); + break; + case 39: + player.fastNext(); + break; + case 38: + if(valType(vars['keyVolume'])=='number' && (vars['keyVolume']==1 || (vars['keyVolume']==2 && CT.full))){ + pre(); + player.volume(v+.1<1?v+=.1:1); + } + break; + case 40: + if(valType(vars['keyVolume'])=='number' && (vars['keyVolume']==1 || (vars['keyVolume']==2 && CT.full))){ + pre(); + player.volume(v-.1>0?v-=.1:0); + } + break; + default: + break; + } + }, + mouseWheel:function(event){ + if(valType(vars['mouseWheelVolume'])=='number' && (vars['mouseWheelVolume']==1 || (vars['mouseWheelVolume']==2 && CT.full))){ + event=window.event || event; + var v=player.volume(); + if(event.preventDefault){ + event.preventDefault(); + } + else { + event.returnValue = false; + } + if(event.wheelDelta) { + if(event.wheelDelta > 0) { + player.volume(v+.1<1?v+=.1:1); + } + if(event.wheelDelta < 0) { + player.volume(v-.1>0?v-=.1:0); + } + } else if(event.detail) { + if(event.detail > 0) { + player.volume(v-.1>0?v-=.1:0); + } + if(event.detail < 0) { + player.volume(v+.1<1?v+=.1:1); + } + } } } - } - } - return str; - } + }; + /* + * adFrontPlay + * 功能:播放贴片广告 + */ + var adFrontPlay=function(){ + if(ad['frontPlayI']==0){//如果是播放第一个广告,则显示相关组件 + allBarHide(false); + C['ad'].show(); + ad['front']['video']=false;//初始化,不包含视频广告 + //判断是否需要启用固定时间后关闭广告按钮 + if(!isUndefined(ad['front']['closeTime'])){ + if(ad['front']['closeTime']>0){ + C['ad']['top']['closeTime'].show(); + adFrontCloseTime(); + } + else { + C['ad']['top']['closeAd'].show(); + } + } + } + if(!isUndefined(ad['front']['node']) && ad['front']['node']!=null){ + CM.append(ad['front']['node']); + player.closeLayer(ad['front']['node']); + ad['front']['node']=null; + } + C['ad']['picture'].htm(''); + C['ad']['picture'].hide(); + C['ad']['link'].hide(); + if(!isUndefined(ad['front']['list'][ad['frontPlayI']])){ + var adv=ad['front']['list'][ad['frontPlayI']]; + frontAdPlay=true;//贴片广告播放状态 + eventTarget('frontAd',adv); + if(adv['type']=='picture'){ + adPicturePlay(adv); + } + else if(adv['type']=='node'){ + adNode(adv); + } + else { + C['ad']['link'].attr('data-link',adv['link']); + adVideoPlay(adv['file']); + } + if(!isUndefined(adv['link'])){ + C['ad']['bottom']['details'].show(); + C['ad']['bottom']['details'].htm(''+language['details']+''); + } + else { + C['ad']['bottom']['details'].hide(); + } + } + }, + /* + * adFrontCloseTime + * 功能:播放贴片广告时按指定时间后显示关闭广告按钮 + */ + adFrontCloseTime=function(){ + if(!isUndefined(ad['front']['closeSetTime'])){ + clearTimeout(ad['front']['closeSetTime']); + ad['front']['closeSetTime']=null; + } + C['ad']['top']['closeTime'].htmReplace('{seconds}',ad['front']['closeTime'],language['closeTime']); + ad['front']['closeTime']--; + if(ad['front']['closeTime']>0){ + ad['front']['closeSetTime']=setTimeout(adFrontCloseTime,1000); + } + else { + C['ad']['top']['closeAd'].show(); + C['ad']['top']['closeTime'].hide(); + } + }, + /* + * calculationAdFrontTime + * 功能:计算贴片广告倒计时时间以及广告是视频时用于倒计时 + */ + calculationAdFrontTime=function(t){ + if(!isUndefined(t)){ + ad['front']['list'][ad['frontPlayI']]['time']=t; + } + ad['front']['countDown']=0; + for(var i=ad['frontPlayI'];i0){ + adv['time']--; + ad['front']['countDown']--; + C['ad']['top']['countDown'].htm(ad['front']['countDown']+language['second']); + adFrontSetTime=setTimeout(adFrontCountDown,1000); + } + else { + adFrontEnded(); + } + }, + /* + * adFrontEnded + * 功能:贴片广告单个播放完成后进行判断是否需要播放下一个广告还是播放正片 + */ + adFrontEnded=function(){ + if(ad['frontPlayI']0 || h>0){ + if(adv['link']){ + var a=createlA('',adv['link']); + a.append(this); + C['ad']['picture'].append(a); + } + else { + C['ad']['picture'].append(this); + } + img.unbind(); + img.click(function(){ + eventTarget('frontAdClick',adv); + }); + } + else { + if(imgloadNum<10){ + imgloadNum++; + imgLoadHandler(); + } + } + }); + }; + imgLoadHandler(); + calculationAdFrontTime();//计算时间 + adFrontCountDown();//开启倒计时 + C['ad']['bottom']['mutedAndExit'].hide(); + }, + /* + * adNode + * 功能:贴片广告播放外部节点 + */ + adNode=function(adv){ + if(isUndefined(adv['content'])) return; + ad['front']['node']=player.layer(adv); + ad['front']['node'].css({'z-index':1}); + C['ad'].append(ad['front']['node']); + ad['front']['node'].unbind(); + ad['front']['node'].click(function(){ + eventTarget('frontAdClick',adv); + }); + calculationAdFrontTime();//计算时间 + adFrontCountDown();//开启倒计时 + C['ad']['bottom']['mutedAndExit'].hide(); + }, + /* + * frontVideoClickHandler + * 功能:视频广告上方层单击事件 + */ + frontVideoClickHandler=function(){ + var url=C['ad']['link'].attr('data-link'); + window.open(url,'_blank'); + }, + /* + * closeFrontAd + * 功能:关闭贴片广告 + */ + closeFrontAd=function(){ + if(!isUndefined(ad) && !isUndefined(ad['front']) && !isUndefined(ad['front']['closeButtonClick'])){ + if(valType(ad['front']['closeButtonClick'])=='function'){ + try{ + ad['front']['closeButtonClick'](); + } + catch(event){console.error(event);} + } + else if(valType(ad['front']['closeButtonClick'])=='string'){ + try{ + eval(ad['front']['closeButtonClick']+ '()'); + } + catch(event){console.error(event);} + } + } + else { + player.closeFrontAd(); + } + }, + /* + * adPausePlay + * 功能:播放暂停广告 + */ + adPausePlay=function(){ + closePauseAd(); + if(!isUndefined(ad) && !isUndefined(ad['pause']) && !isUndefined(ad['pause']['list']) && ad['pause']['list'].length-1>=ad['pausePlayI']){ + var adv=ad['pause']['list'][ad['pausePlayI']]; + if(!isUndefined(ad['pause']['close']) && ad['pause']['close']){ + ad['pauseClose']=createlButton('ck-pause-close'); + ad['pauseClose'].click(function(){ + C['centerPlay'].show(); + C['buffer'].hide(); + closePauseAd(); + }); + } + if(!isUndefined(adv['file'])){//图片 + var img = null; + var imgloadNum=0; + var imgLoadHandler=function(){ + img = createlImg(adv['file']); + C['adPause'].show(); + C['adPause'].htm(''); + C['adPause'].append(img); + img.addListener('load',function(){ + var w=this.getWidth(),h=this.getHeight(); + if(w>0 || h>0){ + C['adPause'].htm(''); + if(adv['link']){ + var a=createlA('',adv['link']); + a.append(this); + C['adPause'].append(a); + } + else { + C['adPause'].append(this); + } + + C['adPause'].css({ + 'width':w+'px', + 'height':h+'px' + }); + if(ad['pauseClose']){ + C['adPause'].append(ad['pauseClose']); + } + img.click(function(){ + eventTarget('pauseAdClick',adv); + }); + } + else { + if(imgloadNum<10){ + imgloadNum++; + imgLoadHandler(); + } + } + }); + }; + imgLoadHandler(); + } + else if(!isUndefined(adv['content'])){ + ad['pause']['node']=player.layer(adv); + if(ad['pauseClose']){ + ad['pause']['node'].append(ad['pauseClose']); + } + ad['pause']['node'].click(function(){ + eventTarget('pauseAdClick',adv); + }); + } + eventTarget('pauseAd',adv); + if(!isUndefined(adv['time']) && adv['time']>0){ + adPauseSetTime=setTimeout(function(){ + ad['pausePlayI']++; + if(ad['pausePlayI']>ad['pause']['list'].length-1){ + ad['pausePlayI']=0; + } + adPausePlay(); + },adv['time']*1000); + } + } + }, + /* + * closePauseAd + * 功能:关闭暂停广告 + */ + closePauseAd=function(){ + if(adPauseSetTime){ + clearTimeout(adPauseSetTime); + adPauseSetTime=null; + } + C['adPause'].hide(); + if(!isUndefined(ad) && !isUndefined(ad['pauseClose']) && ad['pauseClose']!=null){ + ad['pauseClose'].remove(); + ad['pauseClose']=null; + } + if(!isUndefined(ad) && !isUndefined(ad['pause']) && !isUndefined(ad['pause']['node']) && ad['pause']['node']){ + ad['pause']['node'].unbind(); + player.closeLayer(ad['pause']['node']); + eventTarget('pauseAdClose'); + } + }; + /* + * player + * 功能:开放接口,向外部提供播放器的交互功能列表,包含获取,执行,监听这三种功能 + */ + var player={ + /* + * width + * 功能:获取或设置播放器宽度 + * 这是一个动态的值,会随着全屏切换或播放器本身尺寸变化而变化 + * @value,支持数字,字符,当存在@value时则设置播放器宽度,@value为空时则获取播放器宽度 + */ + width:function(value){ + if(!isUndefined(value)){ + if(valType(value)=='number'){ + value+='px'; + } + CT.css({'width':value}); + checkVideoRotate(); + } + return CK.getWidth(); + }, + /* + * height + * 功能:获取或设置播放器显示高度 + * 这是一个动态的值,会随着全屏切换或播放器本身尺寸变化而变化 + * @value,支持数字,字符,当存在@value时则设置播放器高度,@value为空时则获取播放器高度 + */ + height:function(value){ + if(!isUndefined(value)){ + if(valType(value)=='number'){ + value+='px'; + } + CT.css({'height':value}); + checkVideoRotate(); + } + return CK.getHeight(); + }, + /* + * videoWidth + * 功能:获取视频本身的宽度,这是一个固定值 + */ + videoWidth:function(){ + if(video){ + return video.videoWidth; + } + return null; + }, + /* + * videoHeight + * 功能:获取视频本身的高度,这是一个固定值 + */ + videoHeight:function(){ + if(video){ + return video.videoHeight; + } + return null; + }, + /* + * height + * 功能:获取或设置播放器显示高度 + * 这是一个动态的值,会随着全屏切换或播放器本身尺寸变化而变化 + * @value,支持数字,字符,当存在@value时则设置播放器高度,@value为空时则获取播放器高度 + */ + zoom:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('zoom',fn); + } + if(valType(fn)=='number'){ + var arr=[C['topBar']['zoomEle']['zoom50'],C['topBar']['zoomEle']['zoom75'],C['topBar']['zoomEle']['zoom100']]; + for(var i=0;ifn && fn>0){ + rot=arr[fn]; + } + else { + if(arr.indexOf(fn)>-1){ + rot=fn; + } + } + if(rot!=nowRotate){ + eventTarget('rotate',rot); + nowRotate=rot; + checkVideoRotate();//调整视频尺寸 + } + } + } + }, + /* + * vars + * 提供给播放器外部使用 + * 修改vars,动态切换视频地址 + * @obj为新的播放配置对象 + */ + vars:function(obj,val){ + if(isUndefined(obj)){ + return; + } + if(valType(obj)=='string' && !isUndefined(val)){ + var temp={}; + temp[obj]=val; + obj=temp; + } + var isChange=false; + for(var k in obj){ + if(k in vars && obj[k]!=vars[k]){ + isChange=true; + break; + } + } + if(isChange){ + vars = standardization(vars, obj); + } + if(!isUndefined(obj['video'])){ + isChangeDef=true; + changeVideo(vars['video']); + } + if(!isUndefined(obj['title'])){ + C['topBar']['titleEle'].htm(obj['title']); + } + }, + /* + * 提供给播放器外部使用 + * 功能:监听视频准备加载 + */ + loadstart:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('loadstart',fn); + } + }, + /* + * 提供给播放器外部使用 + * 功能:监听视频加载 + */ + loadeddata:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('loadeddata',fn); + } + }, + /* + * 提供给播放器外部使用 + * 功能:监听视频元数据加载成功 + */ + loadedMetaData:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('loadedMetaData',fn); + } + }, + /* + * 提供给播放器外部使用 + * 功能:监听视频可以播放 + */ + canplay:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('canplay',fn); + } + }, + /* + * 提供给播放器外部使用 + * 功能:执行播放操作/监听播放 + * @fn为函数时则监听视频播放,@fn为空时,则控制视频播放 + */ + play:function(fn){ + if(valType(fn)=='object'){ + if(fn['target']==C['bar']['playAndPause']['play'] || fn['target']==C['bar']['playAndPause']['refresh']){ + playType='button'; + } + } + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('play',fn); + } + else { + if(loadedmetadataNum>0 && video){ + try{video.play();}catch(event){console.error(event);} + } + } + return player; + }, + /* + * puase + * 功能:执行暂停操作/监听暂停 + * @fn为函数时则监听视频暂停,@fn为空时,则控制视频暂停 + */ + pause:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('pause',fn); + } + else { + if(loadedmetadataNum>0 && video){ + try{video.pause();}catch(event){console.error(event);} + } + } + return player; + }, + /* + * playOrPause + * 功能:在播放和暂停动作之间进行切换 + */ + playOrPause:function(){ + if(paused){ + player.play(); + } + else { + player.pause(); + } + return player; + }, + /* + * volume + * 功能:调节和监听以及获取音量 + * @fn为函数时,则进行音量变化的监听,@fn为数字时,则进行音量调节,@fn为空时,则获取当前音量 + */ + volume:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('volume', fn); + } + else if(valType(fn)=='number' && video){ + if(fn<0)fn=0; + if(fn>1)fn=1; + if(video.muted){ + video.volume=fn*.5; + } + video.volume=fn; + } + } + else if(video){ + return video.volume; + } + return player; + }, + /* + * muted + * 功能:执行静音操作/监听静音 + * @fn为函数时则监听视频静音,@fn为空时,则控制视频静音 + */ + muted:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('muted', fn); + } + else if(video){ + video.muted=true; + } + return player; + }, + /* + * exitMuted + * 功能:执行取消静音操作 + */ + exitMuted:function(){ + if(video){ + video.muted=false; + if(video.volume==0){ + player.volume(vars['volume']>0?vars['volume']:.8); + } + } + return player; + }, + /* + * time + * 功能:获取当前播放时间/监听播放时间 + * @fn为函数时监听当前播放时间,为空时获取当前播放时间 + */ + time:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('time',fn); + } + else if(video){ + return video.currentTime || 0; + } + }, + /* + * seek + * 功能:监听跳转/执行跳转操作 + * @fn为函数时则监听视频跳转动作,@fn为数字时执行跳转操作 + */ + seek:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('seek',fn); + } + if(valType(fn)=='number' && video){ + switch(vars['timeScheduleAdjust']){ + case 0://禁止拖动 + message(language['timeScheduleAdjust']['prohibit']); + return; + break; + case 1://可以拖动 + break; + case 2://只能前进(向右拖动 + if(fnoldTime){ + message(language['timeScheduleAdjust']['prohibitForward']); + return; + } + break; + case 4://只能前进但能回到第一次拖动时的位置 + if(fnmaxSeeTime){ + waitingMessage=false; + video.currentTime=maxSeeTime; + message(language['timeScheduleAdjust']['prohibitForwardNotViewed']); + return; + } + break; + } + pSliderMouseDown=false; + video.currentTime=fn; + } + } + return player; + }, + /* + * buffer + * 功能:监听视频缓冲 + * @fn为监听执行的函数 + */ + buffer:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('buffer',fn); + } + return player; + }, + /* + * ended + * 功能:监听视频播放结束 + * @fn为监听执行的函数 + */ + ended:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('ended',fn); + } + return player; + }, + /* + * 提供给播放器外部使用 + * 功能:监听点击下一集按钮的动作 + */ + next:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('next',fn); + } + return player; + }, + /* + * error + * 功能,监听播放器在加载视频过程和播放视频过程中出现的错误 + * @fn为监听执行的函数 + */ + error:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('error',fn); + } + return player; + }, + /* + * emptied + * 功能,监听播放器播放的视频文件发生故障并且文件突然不可用时 + * @fn为监听执行的函数 + */ + emptied:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('emptied',fn); + } + return player; + }, + /* + * duration + * 功能:获取视频总时间/监听视频总时间 + * @fn为函数时执行监听视频总时间,为空时获取视频总时间 + */ + duration:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('duration',fn); + } + else { + return duration || 0; + } + }, + /* + * playbackRate + * 功能:监听或返回视频播放速度 + * @fn为函数时执行监听视频播放速度,为数字时切换播放速度,为空时获取视频播放速度 + */ + playbackRate:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('playbackRate',fn); + } + else if(valType(fn)=='number' && video){ + video.playbackRate=fn; + CT.playbackRate=fn; + eventTarget('playbackRate',fn); + changePlaybackrateVal(fn); + } + + } + else { + return video.playbackRate; + } + }, + /* + * track + * 功能:监听或返回视频的字幕 + * @fn为函数时执行监听视频字幕,为数字时切换字幕,为空时获取字幕 + */ + track:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('track',fn); + } + else if(valType(fn)=='number' && video){ + var track=null; + if(!isUndefined(video.textTracks)){ + track=video.textTracks; + } + if(track && valType(track)=='texttracklist'){ + var arr=vars['track']; + for(var i=track.length-1;i>-1;i--){ + video.find('track').eq(i).remove(); + } + for(var i=0;i'; + } + if(video){ + var html=video.htm()+track; + video.htm(html); + } + changeTrackVal(fn); + } + } + + } + else { + return CT.track; + } + }, + /* + * fastBack + * 功能:快退 + * @num为数字时快退指定秒数,为空时快退20秒 + */ + fastBack:function(num){ + if(duration==0) return; + if(isUndefined(num) || valType(num)!='number'){ + num=20; + } + var time=player.time(); + if(time-num>0){ + time-=num; + } + else { + time=0; + } + player.seek(time); + return player; + }, + /* + * fastNext + * 功能:快进 + * @num为数字时快进指定秒数,为空时快进20秒 + */ + fastNext:function(num){ + if(duration==0) return; + if(isUndefined(num) || valType(num)!='number'){ + num=20; + } + var time=player.time(); + if(time+num200) zIndex=200; + if(isUndefined(ele.cssDisplay)){ + ele.cssPosition=ele.css('position'); + ele.cssDisplay=ele.css('display'); + } + ele.css({ + 'position': 'absolute', + 'z-index':zIndex + }); + if(!cBar){ + CM.append(ele); + } + else { + C['bar'].append(ele); + } + ele.CK=CK; + ele.show(); + } + return ele; + }, + /* + * closeLayer + * 功能:关闭一个层 + */ + closeLayer:function(ele){ + if(valType(ele)=='string'){ + var temp=$(ele); + if(!isUndefined(temp)){ + if(temp.length>0){ + ele=temp.eq(0); + } + } + } + if(!isUndefined(ele) && valType(ele)=='htmlobject'){ + if(!isUndefined(ele.captureParentNode)){ + var eleP=ele.captureParentNode; + if (ele.nextElement) { + try { + eleP.insertBefore(ele, ele.nextElement); + } + catch (event) { + eleP.append(ele); + } + } + else if (ele.prevElement) { + try { + eleP.insertAfter(ele, ele.prevElement); + } + catch (event) { + eleP.append(ele); + } + } + else { + eleP.append(ele); + } + ele.css({'display':ele.cssDisplay}); + } + else { + ele.remove(); + } + if(!isUndefined(ele.cssDisplay)){ + ele.css({ + 'display':ele.cssDisplay, + 'position':ele.cssPosition + }); + } + } + return player; + }, + /* + * message + * 在播放器内部显示一条提示信息 + */ + message:function(str){ + message(str); + return player; + }, + /* + * closeFrontAd + * 功能:关闭贴片广告 + */ + closeFrontAd:function(){ + if(frontAdPlay && !isUndefined(ad) && !isUndefined(ad['front']) && !isUndefined(ad['front']['list'])){ + ad['frontPlayI']=ad['front']['list'].length-1; + adFrontEnded(); + clearAdFrontSetTime(); + } + return player; + }, + /* + * addListener + * 功能:监听功能 + */ + addListener:function(name,fn){ + newEvent.addEventListener(name,fn); + }, + /* + * removeListener + * 功能:监听功能 + */ + removeListener:function(name,fn){ + newEvent.removeEventListener(name,fn); + }, + /* + * bar + * 功能:显示/关闭底部控制栏 + */ + bar:function(bool){ + barShow=bool; + if(bool){ + C['bar'].show(); + } + else { + C['bar'].hide(); + } + }, + /* + * rightBar + * 功能:显示/关闭右边控制栏 + */ + rightBar:function(bool){ + rightBarShow=bool; + if(bool){ + C['rightBar'].show(); + } + else { + C['rightBar'].hide(); + } + }, + /* + * mouseActive + * 功能,监听鼠标是否经过播放器 + */ + mouseActive:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('mouseActive',fn); + } + return this; + }, + /* + * cookie + * 功能,读取cookie + */ + cookie:function(name){ + if(name=='delete'){ + cookie(moeplayerCookie,'delete',vars['domain']); + return null; + } + if(!isUndefined(name) && name){ + name=name.replace(/[ ]*,[ ]*|[ ]+/g, '').replace(/[ ]*;[ ]*|[ ]+/g, ''); + } + var cStr=cookie(moeplayerCookie); + if(cStr){ + var arr=stringToArray(cStr); + var tempArr=[]; + var cTime=parseInt(Date.now()*0.001); + for(i=0;icTime){ + tempArr.push(arr[i]); + } + } + arr=tempArr; + if(arr.length>0){ + cookie(moeplayerCookie,'delete',vars['domain'],vars['cookiePath']); + cookie(moeplayerCookie,arrayToString(arr),vars['domain'],vars['cookiePath']); + for(var i=0;i-1;i--){ + var pTemp=createlButton('ck-list-p',playbackrate[i]+language['playbackrateSuffix']); + pTemp.attr('data-i',i).attr('data-val',playbackrate[i]); + C['bar']['playbackrate']['bg']['p'].push(pTemp); + C['bar']['playbackrate']['bg'].append(pTemp); + pTemp.click(playbackrateClick); + } + C['bar']['playbackrate'].hide(); + if(!isUndefined(vars['playbackrateOpen']) && vars['playbackrateOpen']){ + C['bar']['playbackrate'].show(); + C['bar']['playbackrate']['bgbox'].show(); + var w=C['bar']['playbackrate']['bg'].getWidth(),h=C['bar']['playbackrate']['bg'].getHeight(); + var bw=C['bar']['playbackrate']['button'].getWidth(); + C['bar']['playbackrate']['bg'].css({'width':w+10+'px'}); + w=C['bar']['playbackrate']['bg'].getWidth(); + if(getBarHeight()>C['bar'].getHeight()){ + h+=(getBarHeight()-C['bar'].getHeight()); + } + C['bar']['playbackrate']['bgbox'].attr('style',''); + C['bar']['playbackrate']['bgbox'].css({ + 'width':w+'px', + 'height':(h+2)+'px', + 'left':-(w-bw)*0.5+'px' + }); + C['bar']['playbackrate']['button'].mouseover(function(){ + w=C['bar']['playbackrate']['bg'].getWidth(); + bw=C['bar']['playbackrate']['button'].getWidth(); + C['bar']['playbackrate']['bgbox'].css({ + 'left':-(w-bw)*0.5+'px' + }); + }); + changePlaybackrateVal(pbr); + } + }, + /* + * playbackrateClick + * 功能:选择播速 + */ + playbackrateClick=function(e){ + C['bar']['playbackrate']['bgbox'].hide(); + setTimeout(function(){C['bar']['playbackrate']['bgbox'].removeCss('display');},300); + message(language['switchTo']+$(this).htm()); + player.playbackRate(parseFloat($(this).attr('data-val'))); + }, + /* + * changePlaybackrateVal + * 功能:根据速度检查播速 + */ + changePlaybackrateVal=function(num){ + C['bar']['playbackrate']['bg'].find('button').each(function(index,ele){ + var val=parseFloat(ele.attr('data-val')); + ele.removeClass('ck-list-p-focus'); + if(num==val){ + ele.addClass('ck-list-p-focus'); + if(num!=1){ + C['bar']['playbackrate']['button'].htm(ele.htm()); + } + else { + C['bar']['playbackrate']['button'].htm(language['playbackrate']); + } + } + else { + ele.removeClass('ck-list-p-focus'); + } + }); + }, + /* + * checkTrack + * 功能:初始化或重置字幕组件内容 + */ + checkTrack=function(){ + var track=vars['track']; + var pbr=-1; + C['bar']['track']['bgbox'].htm(''); + C['bar']['track']['bg']=createlDiv('ck-list-bg'); + C['bar']['track']['bgbox'].append(C['bar']['track']['bg']); + C['bar']['track']['bg']['p']=[]; + var pTemp=null; + for(var i=track.length-1;i>-1;i--){ + pTemp=createlButton('ck-list-p',track[i]['label']); + pTemp.attr('data-i',i).attr('data-title',track[i]['label']); + C['bar']['track']['bg']['p'].push(pTemp); + C['bar']['track']['bg'].append(pTemp); + if(!isUndefined(track[i]['default']) && track[i]['default']){ + pbr=i; + } + pTemp.click(trackClick); + } + // + pTemp=createlButton('ck-list-p',language['noTrack']); + pTemp.attr('data-i',-1).attr('data-title',language['noTrack']); + C['bar']['track']['bg']['p'].push(pTemp); + C['bar']['track']['bg'].append(pTemp); + pTemp.click(trackClick); + // + C['bar']['track'].hide(); + C['bar']['track'].show(); + C['bar']['track']['bgbox'].show(); + var w=C['bar']['track']['bg'].getWidth(),h=C['bar']['track']['bg'].getHeight(); + var bw=C['bar']['track']['button'].getWidth(); + C['bar']['track']['bg'].css({'width':w+10+'px'}); + w=C['bar']['track']['bg'].getWidth(); + if(getBarHeight()>C['bar'].getHeight()){ + h+=(getBarHeight()-C['bar'].getHeight()); + } + C['bar']['track']['bgbox'].attr('style',''); + C['bar']['track']['bgbox'].css({ + 'width':w+'px', + 'height':(h+2)+'px', + 'left':-(w-bw)*0.5+'px' + }); + C['bar']['track']['button'].mouseover(function(){ + w=C['bar']['track']['bg'].getWidth(); + bw=C['bar']['track']['button'].getWidth(); + C['bar']['track']['bgbox'].css({ + 'left':-(w-bw)*0.5+'px' + }); + }); + changeTrackVal(pbr); + }, + /* + * trackClick + * 功能:选择字幕 + */ + trackClick=function(e){ + C['bar']['track']['bgbox'].hide(); + setTimeout(function(){C['bar']['track']['bgbox'].removeCss('display');},300); + message(language['switchTo']+$(this).attr('data-title')); + player.track(parseFloat($(this).attr('data-i'))); + }, + /* + * changeTrackVal + * 功能:根据字幕检查 + */ + changeTrackVal=function(num){ + C['bar']['track']['bg'].find('button').each(function(index,ele){ + var i=parseInt(ele.attr('data-i')); + if(num==i){ + C['bar']['track']['button'].htm(ele.attr('data-title')); + if(i>-1){ + CT.track=vars['track'][i]; + eventTarget('track',vars['track'][i]); + } + else { + CT.track=null; + eventTarget('track',null); + } + ele.addClass('ck-list-p-focus'); + } + else { + ele.removeClass('ck-list-p-focus'); + } + }); + }, + /* + * checkDefinition + * 功能:初始化或重置清晰度组件内容 + */ + checkDefinition=function(){ + var pi=-1; + var videoUrl=video['currentSrc']; + if(!isUndefined(C['bar']['definition']['bg'])){ + C['bar']['definition']['bgbox'].htm(''); + C['bar']['definition']['bgbox'].attr('style',''); + C['bar']['definition']['button'].htm(language['definition']); + } + if(valType(vars['video'])=='array'){ + var arr=vars['video']; + C['bar']['definition']['bg']=createlDiv('ck-list-bg'); + C['bar']['definition']['bgbox'].append(C['bar']['definition']['bg']); + C['bar']['definition']['bg']['p']=[]; + for(var i=arr.length-1;i>-1;i--){ + var pTemp=createlButton('ck-list-p',arr[i][2]); + pTemp.attr('data-i',i).attr('data-video',arr[i][0]).attr('data-type',arr[i][1]).attr('data-title',arr[i][2]); + C['bar']['definition']['bg']['p'].push(pTemp); + C['bar']['definition']['bg'].append(pTemp); + if(videoUrl && videoUrl.indexOf(arr[i][0])>-1){ + pi=i; + } + pTemp.click(definitionClick); + } + C['bar']['definition'].show(); + C['bar']['definition']['bgbox'].show(); + var w=C['bar']['definition']['bg'].getWidth(),h=C['bar']['definition']['bg'].getHeight(); + var bw=C['bar']['definition']['button'].getWidth(); + C['bar']['definition']['bg'].css({'width':w+10+'px'}); + w=C['bar']['definition']['bg'].getWidth(); + if(getBarHeight()>C['bar'].getHeight()){ + h+=(getBarHeight()-C['bar'].getHeight()); + } + C['bar']['definition']['bgbox'].attr('style',''); + C['bar']['definition']['bgbox'].css({ + 'width':w+'px', + 'height':(h+2)+'px', + 'left':-(w-bw)*0.5+'px' + }); + C['bar']['definition']['button'].mouseover(function(){ + w=C['bar']['definition']['bg'].getWidth(); + bw=C['bar']['definition']['button'].getWidth(); + C['bar']['definition']['bgbox'].css({ + 'left':-(w-bw)*0.5+'px' + }); + }); + } + if(pi>-1){ + C['bar']['definition']['bg'].find('button').each(function(index,ele){ + var i=parseInt(ele.attr('data-i')); + if(pi==i){ + ele.addClass('ck-list-p-focus'); + } + else { + ele.removeClass('ck-list-p-focus'); + } + }); + } + }, + /* + * definitionClick + * 功能:选择清晰度 + */ + definitionClick=function(e){ + C['bar']['definition']['bgbox'].hide(); + setTimeout(function(){ + C['bar']['definition']['bgbox'].removeCss('display'); + },300); + changeDefinition(parseInt($(this).attr('data-i'))); + }, + /* + * changeDefinition + * 功能:检查清晰度 + */ + changeDefinition=function(num){ + C['bar']['definition']['bg'].find('button').each(function(index,ele){ + var i=parseInt(ele.attr('data-i')); + if(num==i){ + if(!isUndefined(video.textTracks) && video.textTracks.length>0){ + for(var y=video.find('track').length-1;y>-1;y--){ + video.find('track').eq(y).remove(); + } + } + seekTime=player.time(); + video.attr('autoplay','autoplay'); + changeVideo(ele.attr('data-video')); + message(language['switchTo']+ele.htm()); + C['bar']['definition']['button'].htm(ele.htm()); + ele.addClass('ck-list-p-focus'); + eventTarget('definition',{id:i,video:ele.attr('data-video'),title:ele.attr('data-title')}); + } + else { + ele.removeClass('ck-list-p-focus'); + } + }); + }, + /* + * deletePrompt + * 功能:删除关键点 + */ + deletePrompt=function(){ + var i=0; + if(!isUndefined(C['prompt']) && valType(C['prompt'])=='array'){ + for(i=C['prompt'].length;i>-1;i--){ + if(!isUndefined(C['prompt'][i])){ + C['prompt'][i].remove(); + } + } + C['prompt']=null; + } + C['prompt']=[]; + }, + /* + * changePrompt + * 功能:构建关键点 + */ + changePrompt=function(){ + deletePrompt(); + for(var i=0;i100) left=100; + ele.css({'left':left+'%'}); + ele.mouseover(function(){ + if(this.attr('data-words')){ + showPromptWords(this); + } + }); + ele.mouseout(function(){ + if(this.attr('data-words')){ + showPromptWords(); + } + }); + C['prompt'].push(ele); + } + } + }, + /* + * showPromptWords + * 功能:显示关键点提示 + */ + showPromptWords=function(ele){ + if(isUndefined(C['promptWords'])){ + C['promptWords']=createlDiv('ck-prompt-words'); + CM.append(C['promptWords']); + C['promptWords']['content']=createlDiv('ck-prompt-content'); + C['promptWords'].append(C['promptWords']['content']); + } + if(isUndefined(ele)){ + C['promptWords']['content'].htm(''); + C['promptWords'].hide(); + return; + } + C['promptWords']['content'].htm(ele.attr('data-words')); + C['promptWords'].show(); + var pW=C['promptWords'].getWidth(),pH=C['promptWords'].getHeight(); + var bg=C['bar']['pbox']['bg']; + var time=parseFloat(ele.attr('data-time')); + var top=CK.getHeight()-getBarHeight(); + var left=ele.offset()['left']-CK.offset()['left']+ele.getWidth()*.5-pW*.5; + if(!isUndefined(C['preview'])){ + top=CK.getHeight()-parseFloat((getBarHeight()+C['preview']['smallHight']+parseInt(C['preview'].css('margin-bottom')))); + } + else { + top=CK.getHeight()-parseFloat((getBarHeight()+C['tip']['minHeight']+parseInt(C['tip'].css('margin-bottom')))); + top-=(getBarHeight()-C['bar'].getHeight()); + } + top-=parseFloat(C['promptWords'].css('margin-bottom')); + top-=pH; + left-=parseFloat(C['promptWords'].css('margin-right')); + if(left<0)left=0; + if(left>CK.getWidth()-pW)left=CK.getWidth()-pW; + C['promptWords'].css({ + 'top':top+'px', + 'left':left+'px' + }); + }, + /* + * changePreview + * 功能:加载或重置预览图片 + */ + changePreview=function(preview){ + if(!isUndefined(C['preview'])){ + C['preview'].remove(); + C['preview']=null; + } + if(!isUndefined(preview)){ + C['preview']=createlDiv('ck-preview'); + CM.append(C['preview']); + if(isUndefined(vars['preview']['type'])){ + vars['preview']['type']=0; + } + if(vars['preview']['type']==1){ + C['preview']['bg']=createlDiv('ck-preview-bg'); + C['preview'].append(C['preview']['bg']); + } + var files=[]; + var loadImg=function(bigW,bigH,smallW,smallH){ + if(vars['preview']['type']==1){ + C['preview']['bg']['img']=[]; + for(var i=0;i1){ + if(valType(vars['preview']['thumbnail'][0])=='number'){ + thumbnail[0]=vars['preview']['thumbnail'][0]; + } + if(valType(vars['preview']['thumbnail'][1])=='number'){ + thumbnail[1]=vars['preview']['thumbnail'][1]; + } + vars['preview']['thumbnail']=thumbnail; + } + if(files[0]){ + var img = createlImg(files[0],'ck-preview-load-img').addListener('load',function(){ + loadImg(this.getWidth(),this.getHeight(),this.getWidth()/thumbnail[0],this.getHeight()/thumbnail[1]); + this.remove(); + }); + CM.append(img); + } + } + else { + C['preview'].removeChild(); + C['preview']=null; + } + } + else { + C['preview'].removeChild(); + C['preview']=null; + } + } + }, + /* + * showPreview + * 功能:显示预览图 + */ + showPreview=function(time){ + if(hidePreviewSetTime){ + clearTimeout(hidePreviewSetTime); + hidePreviewSetTime=null; + } + if(time<0){ + if(!isUndefined(C['preview'])){ + hidePreviewSetTime=setTimeout(function(){ + C['preview'].hide(); + hidePreviewSetTime=null; + },200); + return; + } + } + if(!isUndefined(C['preview']) && !isUndefined(vars['preview']['thumbnail']) && duration>0){ + if(isUndefined(vars['preview']['type'])){ + vars['preview']['type']=0; + } + var scale=2,thumbnail=vars['preview']['thumbnail']; + if(!isUndefined(vars['preview']['scale'])){ + scale=vars['preview']['scale']; + } + var divI=0,imgI=0; + var left=0,frameLeft=0; + var pW=0; + var smallW=C['preview']['smallWidth'],smallH=C['preview']['smallHight']; + var bgXw=time*C['bar']['pbox']['bg'].getWidth()/duration+(C['bar']['pbox']['bg'].offset()['left']-CK.offset()['left']); + if(C['preview'].css('display')=='none'){ + C['preview'].show(); + } + C['preview'].css({ + 'height':smallH+'px', + }); + if(vars['preview']['type']==1){ + divI=parseInt(time/(scale*thumbnail[0])); + imgI=parseInt(time/scale); + var minI=divI-5,maxI=divI+5; + if(minI<0) minI=0; + if(maxI>C['preview']['bg']['img'].length-1){ + maxI=C['preview']['bg']['img'].length-1; + } + for(var i=minI;iC['preview'].getWidth()-C['preview']['frame'].getWidth()){ + var xz=frameLeft-(C['preview'].getWidth()-C['preview']['frame'].getWidth()); + frameLeft=C['preview'].getWidth()-C['preview']['frame'].getWidth(); + left-=xz; + } + C['preview']['bg'].css({'left':left+'px'}); + C['preview']['frame'].css({'left':frameLeft+'px'}); + } + else { + var temp=(time/scale)/(thumbnail[0]*thumbnail[1]); + imgI=parseInt(temp);//计算显示的图片编号 + var smallI=parseInt((temp-imgI)*100); + var rows=parseInt(smallI/thumbnail[0]); + var column=smallI%thumbnail[0]; + var files=vars['preview']['file']; + left=bgXw-smallW*.5; + if(left<0){ + left=0; + } + if(left>CK.getWidth()-smallW){ + left=CK.getWidth()-smallW; + } + C['preview'].css({ + 'width':C['preview']['smallWidth']+'px', + 'background':'url('+files[imgI]+') no-repeat', + 'background-position':'-'+column*smallW+'px -'+rows*smallH+'px', + 'left':left+'px' + }); + } + } + }, + /* + * showError + * 功能:显示错误信息 + */ + showError=function(){ + C['loading'].hide(); + if(vars['controls'] || !vars['errorShow']){ + return; + } + if(isUndefined(C['error'])){ + C['error']=createlDiv('ck-error'); + CM.append(C['error']); + } + var msg=CT.error['message']; + if(!msg) msg=language['error']['noMessage']; + var html=msg+'(code:'+CT.error['code']+')'; + C['error'].htm(html); + C['error'].show(); + }, + /* + * showWindowsError + * 功能:显示错误信息 + */ + showWindowsError=function(error){ + var ele=createlDiv('moeplayer-error',error); + $('body').append(ele); + }, + /* + * showNextEpisode + * 功能:鼠标经过下一集按钮的动作 + */ + showNextEpisode=function(){ + if(isUndefined(vars['next'])) return; + if(valType(vars['next'])=='object'){ + if('content' in vars['next']){ + C['next']=player.layer(vars['next']); + return; + } + if('title' in vars['next']){ + tip(C['bar']['nextEpisode'],vars['next']['title']); + return; + } + } + tip(C['bar']['nextEpisode'],language['next']); + }, + /* + * nextClick + * 功能:点击下一集按钮的动作 + */ + nextClick=function(){ + if(valType(vars['next'])=='object'){ + if('click' in vars['next']){ + if(valType(vars['next']['click'])=='function'){ + vars['next']['click'](); + } + else if(valType(vars['next']['click'])=='string'){ + eval(vars['next']['click']+'()'); + } + } + if('link' in vars['next']){ + window.location.href=vars['next']['link']; + } + eventTarget('next'); + } + }, + /* + * showEnded + * 功能:播放结束后的显示内容 + */ + showEnded=function() { + if(!CT.loop && !isUndefined(vars['ended'])){ + closePauseAd(); + C['ended']=player.layer(vars['ended']); + if(C['ended']){ + C['centerPlay'].hide(); + } + return; + } + }, + /* + * windowScroll + * 功能:监听页面滚动 + */ + windowScroll=function() { + if(!CT.smallWindows) return; + if(CT.webFull || CT.theatre || CT.full){ + exitSmallWindows(); + return; + } + var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; + if(scrollTop>CT.offset()['top']+CT.getHeight()){ + if(!CK.hasClass('moeplayer-smallwindow')){ + CK.addClass('moeplayer-smallwindow'); + eventTarget('smallWindows',true); + smallWindowsState=true; + if(vars['smallWindowsDrag']){ + drag(true); + } + allBarHide(); + checkVideoRotate(); + } + } + else { + exitSmallWindows(); + } + }, + /* + * exitSmallWindows + * 退出小窗口模式 + */ + exitSmallWindows=function(){ + if(CK.hasClass('moeplayer-smallwindow')){ + CK.removeClass('moeplayer-smallwindow'); + if(vars['smallWindowsDrag']){ + drag(); + } + eventTarget('smallWindows',false); + smallWindowsState=false; + allBarShow(); + checkVideoRotate(); + } + }, + /* + * drag + * 功能,使节点可拖动 + * state:是否开启可拖动,默认=false,关闭状态 + */ + drag=function(state) { + var doc=$(document); + var posX = 0,posY = 0, + posXRecord = 0,posYRecord = 0; + var open=false; + if(!isUndefined(state)){ + open=state; + } + var mouseDown = function(e) { + e.preventDefault && e.preventDefault(); + e = e || window.event; + var client = getClient(e); + posXRecord = client['x']; + posYRecord = client['y']; + doc.mousemove(docMouseMove); + doc.mouseup(docMouseUp); + CK.css({ + 'cursor':'move' + }); + }; + var docMouseMove = function(e) { + e = e || window.event; + var client = getClient(e); + var eleOffset = CK.offset(); + posY = client['y']-posYRecord; + posX = client['x']-posXRecord; + posXRecord = client['x']; + posYRecord = client['y']; + var left=eleOffset['left']+posX; + var top=eleOffset['top']+posY; + CK.css({ + 'left':left+'px', + 'top':top+'px' + }); + if(CK.css('position')!='fixed'){ + CK.css({ + 'position':'fixed' + }); + } + isDrag=true; + }; + var docMouseUp = function() { + doc.removeListener('mousemove', docMouseMove); + doc.removeListener('mouseup', docMouseUp); + CK.css({ + 'cursor':'default' + }); + }; + if(open){ + CK.mousedown(mouseDown); + } + else { + CK.unbind('mousedown'); + } + }, + /* + * checkVideoRotate + * 检查播放器尺寸 + */ + checkVideoRotate=function(){ + var ckW=CK.getWidth()*nowZoom*0.01,ckH=CK.getHeight()*nowZoom*0.01; + var vW=CV.getWidth(),vH=CV.getHeight(); + CV.css({ + 'transform':'rotate('+nowRotate+'deg)', + '-ms-transform':'rotate('+nowRotate+'deg)', + '-moz-transform':'rotate('+nowRotate+'deg)', + '-webkit-transform':'rotate('+nowRotate+'deg)', + '-o-transform':'rotate('+nowRotate+'deg)', + 'width':nowZoom+'%', + 'height':nowZoom+'%' + }); + if(nowRotate!=0 && nowRotate!=180){ + if(vH>ckW && vW>ckH){ + if(vH / ckW > vW / ckH) { + CV.css({ + 'height':nowZoom+'%', + 'width':ckH+'px' + }); + } + else { + CV.css({ + 'width':nowZoom+'%', + 'height':ckW+'px' + }); + } + return; + } + if(vHckH){ + CV.css({ + 'height':nowZoom+'%', + 'width':ckH+'px' + }); + } + else { + if(vH / vW >= ckW / ckH) { + CV.css({ + 'width':nowZoom+'%', + 'height':ckW+'px' + }); + } + else { + CV.css({ + 'height':nowZoom+'%', + 'width':ckH+'px' + }); + } + } + return; + } + if(vH>=ckW && vW<=ckH){ + CV.css({ + 'width':nowZoom+'%', + 'height':ckW+'px' + }); + return; + } + if(vW>=ckH && vHC['bar'].getHeight()){ + top-=(getBarHeight()-C['bar'].getHeight()); + } + if(w>ew){ + left=offset['left']-ckOffset['left']-(w-ew)*.5; + } + else { + left=offset['left']-ckOffset['left']+(ew-w)*.5; + } + if(align=='left'){ + left=offset['left']-ckOffset['left']-w; + top=offset['top']-ckOffset['top']; + } + if(!isUndefined(cl)){ + left=cl['x']-ckOffset['left']-w*.5; + } + if(left<0){ + left=0; + } + if(top<0){ + top=0; + } + if(left>CM.getWidth()-w){ + left=CM.getWidth()-w; + } + if(top>CM.getHeight()-h){ + top=CM.getHeight()-h; + } + C['tip'].css({ + 'left':left+'px', + 'top':top-parseInt(C['tip'].css('margin-bottom'))+'px' + }); + }, + /* + * progressDragX + * 功能:制作进度调节框事件 + */ + progressDragX=function(){ + var bg=C['bar']['pbox']['bg'], + play=C['bar']['pbox']['play'], + slider=C['bar']['pbox']['slider'], + mouseLine=C['bar']['pbox']['mouseLine']; + slider.unbind(); + bg.unbind(); + var pos = 0, + posRecord = 0; + var doc=$(document); + var sliderDownTime=0; + var sliderMouseDown = function(e) { + e.preventDefault && e.preventDefault(); + if(!vars['timeScheduleAdjust']){//禁止拖动 + return; + } + e = e || window.event; + var eleOffset = slider.offset(),bgOffset=bg.offset(),client = getClient(e); + pSliderMouseDown=true; + posRecord = client['x']; + //供比较 + var left = eleOffset['left']-bgOffset['left']; + sliderDownTime=left*duration/(bg.getWidth()-slider.getWidth()); + slider.removeListener('mousedown', sliderMouseDown); + slider.removeListener('touchstart', sliderMouseDown); + doc.mousemove(docMouseMove); + doc.mouseup(docMouseUp); + slider.touchmove(docMouseMove); + slider.touchend(docMouseUp); + noScrolling(true); + }; + var docMouseMove = function(e) { + e = e || window.event; + var eleOffset = slider.offset(),bgOffset=bg.offset(),client = getClient(e); + pSliderMouseDown=true; + pos = posRecord - client['x']; + posRecord = client['x']; + var left = eleOffset['left'] - pos-bgOffset['left']; + if(left<0){ + left=0; + } + if(left>bg.getWidth()-slider.getWidth()){ + left=bg.getWidth()-slider.getWidth(); + } + C['bar']['pbox'].addClass('ck-bar-progress-slider-move'); + //预览时间 + var time=''; + if(!vars['live']){ + time=left*duration/(bg.getWidth()-slider.getWidth()); + switch(vars['timeScheduleAdjust']){ + case 2://只能前进(向右拖动 + if(timesliderDownTime){ + left=-1000; + message(language['timeScheduleAdjust']['prohibitForward']); + return; + } + break; + case 4://只能前进但能回到第一次拖动时的位置 + if(timemaxSeeTime){ + left=-1000; + player.seek(maxSeeTime); + message(language['timeScheduleAdjust']['prohibitForwardNotViewed']); + return; + } + break; + } + time=formatSeconds(time); + } + else { + time=formatLiveTime(left*getLiveTime()/(bg.getWidth()-slider.getWidth())); + } + tip(slider,time); + if(left>=0){ + slider.css({ + 'left': left + 'px' + }); + play.css({ + 'width': left+ slider.getWidth()*.5+ 'px' + }); + } + else { + pSliderMouseDown=false; + } + + }; + var docMouseUp = function() { + noScrolling(); + doc.removeListener('mousemove', docMouseMove); + doc.removeListener('mouseup', docMouseUp); + slider.removeListener('touchmove', docMouseMove); + slider.removeListener('touchend', docMouseUp); + slider.mousedown(sliderMouseDown); + slider.touchstart(sliderMouseDown); + if(!vars['live']){ + var time=play.getWidth()*duration/(bg.getWidth()-slider.getWidth()*.5); + if(time>duration){ + time=duration; + } + seekTime=0; + player.seek(time); + } + else { + var playbackTime=parseInt(vars['live']+play.getWidth()*getLiveTime()/(bg.getWidth()-slider.getWidth()*.5)); + eventTarget('playback',{time:playbackTime,date:date('Y-m-d H:i:s',playbackTime)}); + eventTarget('seek',{time:playbackTime,state:'seeking',date:date('Y-m-d H:i:s',playbackTime)}); + } + C['bar']['pbox'].removeClass('ck-bar-progress-slider-move'); + if(isMouseLeave){ + tip(); + } + }; + var isMouseLeave=true;//默认鼠标离开了进度按钮上 + var sliderMouseOver=function(){ + var time=''; + if(!vars['live']){ + time=formatSeconds(parseInt(slider.css('left'))*duration/(bg.getWidth()-slider.getWidth())); + } + else { + time=language['live']; + } + isMouseLeave=false; + tip(slider,time); + }; + + var sliderMouseLeave=function(){ + isMouseLeave=true; + }; + slider.mousedown(sliderMouseDown); + slider.mouseover(sliderMouseOver); + slider.mouseleave(sliderMouseLeave); + slider.touchstart(sliderMouseDown); + var bgMouseDown=function(e){ + e = e || window.event; + var client = getClient(e); + var bgOffset=bg.offset(); + var w=client['x']-bgOffset['left']; + if(CT.full){ + w+=CK.offset()['left']; + } + if(!vars['live']){ + var time=duration*w/bg.getWidth(); + switch(vars['timeScheduleAdjust']){ + case 0://禁止拖动 + message(language['timeScheduleAdjust']['prohibit']); + return; + break; + case 2://只能前进(向右拖动 + if(timeoldTime){ + message(language['timeScheduleAdjust']['prohibitForward']); + return; + } + break; + case 4://只能前进但能回到第一次拖动时的位置 + if(timemaxSeeTime){ + message(language['timeScheduleAdjust']['prohibitForwardNotViewed']); + return; + } + break; + } + seekTime=0; + player.seek(time); + } + else { + var playbackTime=parseInt(vars['live']+getLiveTime()*w/bg.getWidth()); + eventTarget('playback',{time:playbackTime,date:date('Y-m-d H:i:s',playbackTime)}); + eventTarget('seek',{time:playbackTime,state:'seeking',date:date('Y-m-d H:i:s',playbackTime)}); + } + if(w>bg.getWidth()-slider.getWidth()*.5){ + w=bg.getWidth()-slider.getWidth()*.5; + } + if(wmaxTop){ + sliderTop=maxTop; + } + slider.css({ + 'top':sliderTop+'px' + }); + var ppMarginTop=sliderTop-minTop+slider.getHeight()*0.5; + pp.css({ + 'margin-top':ppMarginTop+'px' + }); + var vol=(bg.getHeight()-ppMarginTop-slider.getHeight()*0.5)/(bg.getHeight()-slider.getHeight()); + player.volume(vol); + }; + var docMouseUp = function() { + noScrolling(); + doc.removeListener('mousemove', docMouseMove); + doc.removeListener('mouseup', docMouseUp); + slider.removeListener('touchmove', docMouseMove); + slider.removeListener('touchend', docMouseUp); + slider.mousedown(sliderMouseDown); + slider.touchstart(sliderMouseDown); + C['bar']['vbox']['mouseDown']=false; + }; + slider.mousedown(sliderMouseDown); + slider.touchstart(sliderMouseDown); + var bgMouseDown=function(e){ + e = e || window.event; + var client = getClient(e); + var bgOffset=bg.offset(); + var h=client['y']-bgOffset['top']; + var max=bg.getHeight(); + var vol=1-h/max; + player.volume(vol); + }; + bg.mousedown(bgMouseDown); + }, + /* + * changeProgress + * 功能:根据时间调节播放进度 + */ + changeProgress=function(time){ + if((valType(vars['live'])=='boolean' && vars['live'])){ + return; + } + if(!pSliderMouseDown){ + var bg=C['bar']['pbox']['bg'],slider=C['bar']['pbox']['slider']; + var playW=(time/duration)*100; + + if(valType(vars['live'])=='number'){ + playW='100'; + } + C['bar']['pbox']['play'].css({'width':playW+'%'}); + var sliderW=(slider.getWidth()/bg.getWidth())*100; + var sliderLeft=playW-sliderW*.5; + if(sliderLeft<0){ + sliderLeft=0; + } + if(sliderLeft>100-sliderW){ + sliderLeft=100-sliderW; + } + C['bar']['pbox']['slider'].css({'left':sliderLeft+'%'}); + checkProgressSlider(); + } + }, + /* + * checkProgressSlider + * 功能:检查设置播放进度条位置 + */ + checkProgressSlider=function(){ + var bg=C['bar']['pbox']['bg'],slider=C['bar']['pbox']['slider']; + var st=0; + if(C['bar']['pbox'].css('transition-duration')){ + st=parseFloat(C['bar']['pbox'].css('transition-duration'))*1000+20; + } + var checkThis=function(){ + var sliderLeft=parseInt(C['bar']['pbox']['slider'].css('left')); + if(sliderLeft<0){ + sliderLeft=0; + C['bar']['pbox']['slider'].css({'left':sliderLeft+'px'}); + } + if(sliderLeft>bg.getWidth()-slider.getWidth()){ + sliderLeft=bg.getWidth()-slider.getWidth(); + C['bar']['pbox']['slider'].css({'left':sliderLeft+'px'}); + } + }; + setTimeout(checkThis,st); + }, + /* + * changeTopTime + * 功能:修改顶部右侧时间 + */ + changeTopTime=function(){ + C['topBar']['timeEle'].htm(date('H:i:s')); + setTimeout(changeTopTime,1000); + }, + /* + * changeVolumeSlider + * 功能:根据音量改变滑块位置 + */ + changeVolumeSlider=function(vol){ + if(!isUndefined(C['bar']['vbox'])){ + var box=C['bar']['vbox']['volume']['box'], + bg=C['bar']['vbox']['volume']['bg'], + pp=C['bar']['vbox']['volume']['pp'], + slider=C['bar']['vbox']['volume']['slider']; + C['bar']['vbox']['volume']['txt'].htm(parseInt(vol*100)); + var bgH=bg.getHeight(); + if(bgH){ + var ppMarginTop=bgH-vol*bgH; + pp.css({ + 'margin-top':ppMarginTop+'px' + }); + var sliderTop=bg.offset()['top']-box.offset()['top']+ppMarginTop-slider.getHeight()*0.5; + slider.css({ + 'top':sliderTop+'px' + }); + } + } + }, + /* + * changeLoad + * 功能:获取视频已加载部分并修改加载进度栏 + */ + changeLoad=function(){ + if(video){ + var len = video.buffered.length; + if(len>0){ + var bufferEnd = video.buffered.end(len-1); + if(loadTime= 1000) { + last += offset; + appendFps(fps); + fps = 0; + } + requestAnimationFrame(step); + }; + var appendFps = function(fps) { + if(fps!=CT.fps){ + CT.fps=fps; + replaceInformation('fps',fps); + eventTarget('fps',fps); + } + + }; + if(isUndefined(CT.fps)){ + CT.fps=0; + } + step(); + }, + /* + * getElement + * 功能:获取一个外部节点 + */ + getElement=function(content){ + var ele=$(content); + if(isUndefined(ele)) return; + if(valType(ele)=='htmlarray'){ + ele=ele[0]; + } + if(isUndefined(ele.captureParentNode)){ + ele.captureParentNode = ele.parentNode; + ele.prevElement=ele.prev(); + ele.nextElement=ele.next(); + } + return ele; + }, + /* + * $ + * 功能:根据ID或className或节点节点名称获取对象 + */ + $=function(obj, eL) { + var parent = null; + if (document) { + parent = document; + } + if (!isUndefined(eL)) { + parent = eL; + } + var res = []; + if (obj) { + if (valType(obj) == 'htmlobject' || valType(obj)=='object') { + res = obj; + if (!isUndefined(res.moeplayer)) { + return res; + } + } + else if (valType(obj) == 'string' && obj!='') { + switch (obj.substr(0, 1)) { + case '.': + obj = obj.substr(1, obj.length); + if (parent.getElementsByClassName) { + res = parent.getElementsByClassName(obj); + if (!res.length) { + return null; + } + } + else if (!parent && document.getElementsByClassName) { + res = document.getElementsByClassName(obj); + if (!res.length) { + return null; + } + } + else { + var reg = new RegExp(' ' + obj + ' ', 'i'); + var ele = null; + if (parent.getElementsByTagName) { + ele = parent.getElementsByTagName('*'); + } else { + ele = document.getElementsByTagName('*'); + } + for (var i = 0; i < ele.length; i++) { + if (reg.test(' ' + ele[i].className + ' ')) { + res.push(ele[i]); + } + } + } + if (res) { + if (res.length === 0) { + res = null; + } + } + break; + case '#': + obj = obj.substr(1, obj.length); + if (parent.getElementById) { + res = parent.getElementById(obj); + } else { + res=document.getElementById(obj); + } + break; + default: + var reg = new RegExp(' ' + obj + ' ', 'i'); + if (parent.getElementsByTagName) { + res = parent.getElementsByTagName(obj); + } else { + res = document.getElementsByTagName(obj); + } + if (res) { + if (obj == 'body' || obj == 'document' || obj == 'html') { + res = res[0]; + } else if (res.length === 0) { + res = null; + } + } else { + res = null; + } + break; + } + } + else { + res = obj; + } + } + else { + res = document; + } + + if (res) { + if (valType(res) == 'htmlobject' || valType(res) == 'object' || valType(res) == 'document') { + res.moeplayer = 'Thanks for using'; + /* + * find + * 功能:在当前节点中查找指定节点 + */ + res.find = function(obj) { + return $(obj, this); + }; + /* + * attr + * 功能:修改或获取节点的属性值 + * @key不能为空,指属性名称,$value不为空则设置属性值,为空则获取属性值 + */ + res.attr = function(key, value) { + if (isUndefined(value)) { + return this.getAttribute(key); + } + else { + this.setAttribute(key, value); + return this; + } + }; + /* + * removeAtt + * 功能:删除节点的属性值 + * @key不能为空,指属性名称 + */ + res.removeAttr = function(key) { + this.removeAttribute(key); + return this; + }; + /* + * css + * 功能:修改或获取节点的样式样式 + * @key不能为空,指属性名称,$value不为空则设置属性值,为空则获取属性值 + */ + res.css = function(key, value) { + // 拆解字符串并将第二单词首字母大写 + var keyNew = function(str) { + // 当属性名有横杠时 + if (str.indexOf('-') != -1) { + var arr = str.split('-'); + var a = arr[0]; + var b = '', + c = ''; + if (arr.length > 1) { + b = arr[1].substr(0, 1).toLocaleUpperCase() + arr[1].substr(1, arr[1].length - 1); + } + if (arr.length > 2) { + b = arr[2].substr(0, 1).toLocaleUpperCase() + arr[2].substr(1, arr[2].length - 1); + } + return a + b + c; + } + // 没有横杠就不进行字符串拆解 + return str; + }; + if (isUndefined(value)){ + if (!isUndefined(key) && valType(key) == 'string') { + if (this.currentStyle) { + return this.currentStyle[key]; + } else { + return document.defaultView.getComputedStyle(this, null)[key]; + } + } + if (isUndefined(key)) { + if (this.currentStyle) { + return this.currentStyle; + } else { + return document.defaultView.getComputedStyle(this, null); + } + } + } + // 当传进来的参数key不是一个对象,给节点添加css样式 + if (valType(key) != 'object') { + var newKey = keyNew(key); + if (this.length > 1) { + // 如果this有多个值,那给每个节点都添加样式 + for (var i = 0; i < this.length; i++) { + this[i].style[newKey] = value; + } + } else { + this.style[newKey] = value; + } + } else { + //如果第一个值是一个对象,遍历这个对象,并将属性名传进函数进行拆解 + for (var item in key) { + var objKey = keyNew(item); + if (valType(this) == 'htmlarray') { + for (var i = 0; i < this.length; i++) { + this[i].style[objKey] = key[item]; + } + } else { + this.style[objKey] = key[item]; + } + } + } + return this; + }; + res.hasClass = function(cName) { + if (isUndefined(cName)) return false; + var reg = new RegExp('(\\s|^)' + cName + '(\\s|$)'); + if (this.className && this.className.match(reg)) { + return true; + } + return false; + }; + res.addClass = function(cName) { + if (!this.hasClass(cName)) { + if (this.className && this.className.substr(this.className.length - 1, 1) != ' ') { + this.className += ' '; + } + this.className += cName; + }; + return this; + }; + res.removeClass = function(cName) { + if (this.hasClass(cName)) { + this.className = this.className.replace(new RegExp('(\\s|^)' + cName + '(\\s|$)'), ' '); + if (this.className.substr(this.className.length - 1, 1) == ' ') { + this.className = this.className.substr(0, this.className.length - 1); + } + if (!this.className) { + this.removeAttribute('class'); + } + }; + return this; + }; + res.searchClass = function(cName) { + var arr = this.className.split(' '); + for (var i = 0; i < arr.length; i++) { + if (arr[i].substr(0, cName.length) == cName) { + return arr[i]; + } + } + return this; + }; + res.removeCss=function(cName){ + var cs=this.attr('style'); + if(cs){ + var arr=cs.split(';'); + var obj={}; + for(var i=0;i= m + 1) { + return this[m]; + } + return null; + } + return null; + }; + for (var i = 0; i < res.length; i++) { + if ($) { + try { + res[i] = $(res[i]); + } catch (event) {} + } + } + } + + } + return res; + }, + /* + * createlDiv + * 功能:新建一个DIV节点 + */ + createlDiv=function(className,html) { + var ele = document.createElement('div'); + var eleObject = $(ele); + if (className) { + eleObject.addClass(className); + } + if(html){ + eleObject.htm(html); + } + return eleObject; + }, + /* + * createlVideo + * 功能:新建一个video节点 + */ + createlVideo=function() { + var ele = document.createElement('video'); + var eleObject = $(ele); + return eleObject; + }, + /* + * createlButton + * 功能新建一个button节点 + */ + createlButton=function(className,html) { + var ele = document.createElement('button'); + var eleObject = $(ele); + eleObject.attr('type','button'); + if (className) { + eleObject.addClass(className); + } + if(html){ + eleObject.htm(html); + } + return eleObject; + }, + /* + * createlA + * 功能新建一个a节点 + */ + createlA=function(html,href,className) { + var ele = document.createElement('a'); + var eleObject = $(ele); + if(html){ + eleObject.htm(html); + } + if(!isUndefined(href) && href){ + eleObject.attr('href',href); + eleObject.attr('target','_blank'); + } + if (className) { + eleObject.addClass(className); + } + return eleObject; + }, + /* + * createlJsLink + * 功能新建一个a节点 + */ + createlJsLink=function(html,js) { + var ele = document.createElement('a'); + var eleObject = $(ele); + if(html){ + eleObject.htm(html); + } + if(!isUndefined(js) && js){ + eleObject.attr('href','javascript:'+js+'()'); + } + else { + eleObject.attr('href','javascript:;'); + } + return eleObject; + }, + /* + * createlImg + * 功能新建一个img节点 + */ + createlImg=function(file,className) { + var ele = document.createElement('img'); + var eleObject = $(ele); + if (className) { + ele.className = className; + } + if(file){ + ele.src=file; + } + return eleObject; + }, + /* + * getClient + * 功能:获取clientX和clientY + */ + getClient=function(event) { + var eve = event || window.event; + if (isUndefined(eve)) { + eve = { + clientX: 0, + clientY: 0 + }; + } + var x=eve.clientX + (document.documentElement.scrollLeft || $('body').scrollLeft), + y=eve.clientY + (document.documentElement.scrollTop || $('body').scrollTop); + if(isUndefined(x.toString()) || x.toString()=='NaN'){ + x=eve.touches[0].clientX; + } + if(isUndefined(y.toString()) || y.toString()=='NaN'){ + y=eve.touches[0].clientY; + } + if(x.toString()=='NaN'){ + x=0; + } + if(y.toString()=='NaN'){ + y=0; + } + return { + x: x, + y: y + } + }, + /* + * getLiveTime + * 功能:获取直播回放时间 + */ + getLiveTime=function(){ + var notTime=Date.now(); + var varsTime=vars['live']; + if(varsTime.toString().length<13){ + varsTime=varsTime*1000; + } + return notTime-varsTime; + }, + /* + * formatLiveTime + * 功能:将直播的时间戳格式化成标准时间 + */ + formatLiveTime=function(time){ + var varsTime=vars['live']; + if(varsTime.toString().length<13){ + varsTime=varsTime*1000; + } + varsTime+=time; + return language['lookBack']+date('H:i:s',varsTime); + }, + /* + * loadJs + * 功能:加载js文件并在加载完成后执行callback函数 + * @file:js文件地址 + * @callback:加载完成后执行的函数 + */ + loadJs=function(file, callback) { + var fn =function() {}; + if(!isUndefined(callback)){ + fn=callback; + } + if(checkJs(file)){ + fn(); + return; + } + var script = document.createElement('script'); + script.type = 'text/javascript'; + var isReady = false; + var timer = null; + var doReady = function() { + if(timer){ + clearInterval(timer); + } + if(isReady) return; + isReady = true; + if(valType(fn) == 'function') { + fn(); + } + }; + var bodyLoad = function() { + timer = setInterval(function() { + try { + if(!isUndefined(script.readyState) && script.readyState == 'complete') { + doReady(); + } + } catch(event) {}; + }, 10); + }; + var w3c = function() { + if(valType(fn) == 'function') { + fn(); + } + removeListener(script, 'load', w3c); + removeListener(script, 'error', w3cError); + }; + var w3cError = function() { + if(valType(fn) == 'function') { + fn(); + } + removeListener(script, 'load', w3c); + removeListener(script, 'error', w3cError); + }; + try { + addListener(script, 'load', w3c); + addListener(script, 'error', w3cError); + } catch(event) { + bodyLoad(); + } + script.src = file; + $('head').eq(0).append(script); + }, + + /* + * doubleClickEvent + * 功能:注册对象双击功能 + * @ele:注册对象,可以是页面中的任意节点,不支持数组形式 + */ + doubleClickEvent=function(ele){ + var setTime=null;//注册延时函数 + var clickTime=0;//记录点击时间 + ele=$(ele); + ele.click(function(){ + if(!setTime){ + setTime=setTimeout(function(){ + try{ + ele.dispatchEvent(new Event('sigClick'));//注册单击,针对视频播放器使用 + } + catch(event){ + var e = document.createEvent('HTMLEvents'); + e.initEvent('sigClick', false, true); + ele.dispatchEvent(e); + } + clickTime=0; + setTime=null; + },260); + } + if(!clickTime){ + clickTime=new Date().getTime(); + } + else { + if(new Date().getTime()-clickTime<230){//认为是双击 + try{ + ele.dispatchEvent(new Event('dobClick'));//注册双击 + } + catch(event){ + var e = document.createEvent('HTMLEvents'); + e.initEvent('dobClick', false, true); + ele.dispatchEvent(e); + } + clearTimeout(setTime); + clickTime=0; + setTime=null; + } + } + }); + }, + /* + * noScrolling + * 功能,禁止页面滚动操作 + */ + noScrolling=function(b){ + if(isUndefined(b)) b=false; + var bodyScroll=function (event){ + event.preventDefault(); + }; + if(b){ //禁止滚动 + $('body').addListener('touchmove', bodyScroll, {passive: false }); + } + else { //开启滚动 + $('body').removeListener('touchmove',bodyScroll, {passive: false}); + } + }; + return into(videoObj); + } + /* - * stringToArray - * 功能,字符串转化成二维数组 - */ - function stringToArray(str) { - var newArr=[]; - if(!isUndefined(str)){ - var arr=str.split(','); - for(var i=0;i0),isUndefined(CT)||null==CT)return null;"htmlarray"==valType(CT)&&(CT=CT.eq(0)),calculationFps(),existenceObj="string"==valType(vars.video)&&("."==vars.video.substr(0,1)&&-1==vars.video.indexOf("/")||"#"==vars.video.substr(0,1)),existenceObj&&(CK=CT.find(".moeplayer")?CT.find(".moeplayer").eq(0):null,CK&&(CM=CK.find(".ck-main")?CK.find(".ck-main").eq(0):null),CM&&(CV=CM.find(".ck-video")?CM.find(".ck-video").eq(0):null)),CK&&CM&&CV||(CT.htm(""),CK=createlDiv("moeplayer"),CT.append(CK),CM=createlDiv("ck-main"),CK.append(CM),CV=createlDiv("ck-video"),CM.append(CV)),video&&(video.remove(),video=null),existenceObj&&(video=$(vars.video)?$(vars.video).eq(0):null),video||(video=createlVideo(),video.attr("width","100%").attr("height","100%"),CV.append(video)),video.volume=vars.volume,vars.autoplay?(player.volume(0),player.muted(),recoveryVolume=!0,video.attr("autoplay","autoplay"),paused=!1):video.attr("preload","metadata"),CT.loop=vars.loop,CT.loop&&video.attr("loop","loop"),vars.controls?video.controls=!0:video.controls=!1;try{existenceObj||(video.attr("controlslist","nodownload"),video.attr("x-webkit-airplay","true"),video.attr("x5-video-orientation","portraint"),video.attr("playsinline","true"),video.attr("webkit-playsinline","true"),video.attr("x5-playsinline","true")),vars.crossOrigin&&(video.useCORS=!0,video.crossOrigin=vars.crossOrigin)}catch(e){}if(CT.smallWindows=!0,CT.webFull=!1,CT.theatre=!1,loadFace(),vars.rotate>0&&player.rotate(vars.rotate),vars.zoom>0&&player.zoom(vars.zoom),isUndefined(video.canPlayType))return CT.error={code:5,message:language.error.supportVideoError},eventTarget("error",CT.error),showError(),player;if(addAllListener(),!isUndefined(vars.loaded))if("function"==valType(vars.loaded))try{vars.loaded(player)}catch(e){}else if("string"==valType(vars.loaded))try{eval(vars.loaded+"(player)")}catch(e){}return changeVideo(existenceObj?video.attr("src"):vars.video),player},changeVideo=function(e){var t=0;if((video.attr("src")||video.htm())&&player.pause(),video.attr("src")&&!existenceObj&&(video.attr("src",""),video.removeAttr("src")),!isUndefined(video.textTracks)&&video.textTracks.length>0)for(t=video.find("track").length-1;t>-1;t--)video.find("track").eq(t).remove();existenceObj||video.htm(""),isUndefined(vars.ad)||(ad=vars.ad);var a="";if("string"==valType(e)){if("website:"==e.substr(0,8)||"url:"==e.substr(0,4)){var n="";return"website:"==e.substr(0,8)&&(n=e.substring(8)),"url:"==e.substr(0,4)&&(n=e.substring(4)),void ajax({url:n,success:function(e){null!=e?(vars=standardization(varsTemp,e),changeVideo(vars.video)):(CT.error={code:8,message:language.error.ajax},eventTarget("error",CT.error),showError())}})}vars.plug&&!canPlay(e)?plugPlayer(e):existenceObj||video.attr("src",e),loadTrack()}else if("array"==valType(e)){for(t=0;t1&&(a+='")}a&&video.htm(a),loadTrack()}else"object"==valType(e)&&(vars.plug?plugPlayer(e):(CT.error={code:10,message:language.error.emptied},eventTarget("error",CT.error),showError()),loadTrack());if(!isUndefined(video.find("source"))&&video.find("source").length>0&&video.find("source").eq(video.find("source").length-1).addListener("error",videoHandler.error),checkBar(),loadLogo(),isChangeDef&&checkDefinition(),vars.cookie&&("array"==valType(vars.cookie)&&vars.cookie.length>=2&&(vars.cookie[0]&&"string"==valType(vars.cookie[0])&&(cookieName=vars.cookie[0]),vars.cookie[1]&&"number"==valType(vars.cookie[1])&&(cookieTime=vars.cookie[1])),"object"!=valType(vars.cookie)||isUndefined(vars.cookie.name)||(cookieName=vars.cookie.name,isUndefined(vars.cookie.hour)||"number"!=valType(vars.cookie.hour)||(cookieTime=vars.cookie.hour)),"string"==valType(vars.cookie)&&(cookieName=vars.cookie),cookieName&&(cookieName=cookieName.replace(/[ ]*,[ ]*|[ ]+/g,"").replace(/[ ]*;[ ]*|[ ]+/g,""))),!isUndefined(vars.seek)&&!seekTime&&("number"==valType(vars.seek)&&vars.seek>0&&(seekTime=vars.seek),"string"==valType(vars.seek)&&"cookie"==vars.seek&&cookieName)){var i=player.cookie(cookieName);i&&(seekTime=i.time)}},plugPlayer=function(e){switch(vars.plug){case"hls.js":hlsPlayer(e);break;case"flv.js":flvPlayer(e);break;case"mpegts.js":mpegtsPlayer(e);break;case"dash.js":dashPlayer(e);break;default:"function"==valType(vars.plug)?vars.plug(video,e):(CT.error={code:10,message:language.error.emptied},eventTarget("error",CT.error),showError())}},hlsPlayer=function(e){var t=getPath("hls.js")+"hls.min.js";loadJs(t,function(){!isUndefined(Hls)&&Hls.isSupported()?((hls=new Hls).loadSource(e),hls.attachMedia(video),hls.on(Hls.Events.ERROR,function(e,t){var a=9,n=language.error.loadingFailed,r=t.fatal;isUndefined(t.response)||(isUndefined(t.response.code)||(a=t.response.code),!isUndefined(t.response.text)&&t.response.text?n=t.response.text:isUndefined(e)||(n=e)),CT.error={code:a,message:n},eventTarget("error",CT.error),r&&showError()})):canPlay(e)&&video.attr("src",e)})},flvPlayer=function(e){var t=getPath("flv.js")+"flv.min.js";loadJs(t,function(){if("undefined"!=typeof flvjs&&!isUndefined(flvjs)&&flvjs.isSupported()){var t={type:"flv",url:e};"object"==valType(e)&&(t=e),vars.live&&(t.isLive=!0),pugPlayer&&(pugPlayer.pause(),pugPlayer.unload(),pugPlayer.detachMediaElement(),pugPlayer.destroy(),pugPlayer=null),(pugPlayer=flvjs.createPlayer(t)).attachMediaElement(video),pugPlayer.load(),pugPlayer.on(flvjs.Events.METADATA_ARRIVED,function(e){videoHandler.loadedMetaData()}),pugPlayer.on(flvjs.Events.ERROR,function(e,t,a){CT.error={code:a.code,message:a.msg},eventTarget("error",CT.error),showError()})}})},mpegtsPlayer=function(e){var t=getPath("mpegts.js")+"mpegts.js";loadJs(t,function(){if("undefined"!=typeof mpegts&&!isUndefined(mpegts)&&mpegts.getFeatureList().mseLivePlayback){var t={type:"mse",url:e};"object"==valType(e)&&(t=e),vars.live&&(t.isLive=!0),pugPlayer&&(pugPlayer.pause(),pugPlayer.unload(),pugPlayer.detachMediaElement(),pugPlayer.destroy(),pugPlayer=null),(pugPlayer=mpegts.createPlayer(t)).attachMediaElement(video),pugPlayer.load(),pugPlayer.on(mpegts.Events.METADATA_ARRIVED,function(e){videoHandler.loadedMetaData()}),pugPlayer.on(mpegts.Events.ERROR,function(e,t,a){CT.error={code:a.code,message:a.msg},eventTarget("error",CT.error),showError()})}})},canPlay=function(e,t){var a=[{vidType:"video/ogg",codType:"theora, vorbis"},{vidType:"video/mp4",codType:"avc1.4D401E, mp4a.40.2"},{vidType:"video/mp4",codType:"avc1"},{vidType:"video/mp4",codType:"hevc"},{vidType:"video/webm",codType:"vp8.0, vorbis"},{vidType:"video/webm",codType:"vp9"},{vidType:"",codType:"application/x-mpegURL"},{vidType:"",codType:"application/vnd.apple.mpegurl"}],n={ogg:a[0],mp4:[a[1],a[2],a[3]],webm:[a[4],a[5]],m3u8:[a[6],a[7]]},r=[],i="",o=function(e){var t=e.vidType,a="";a=t?t+'; codecs="'+e.codType+'"':e.codType;var n=video.canPlayType(a);return""==n&&(n="no"),n},s=function(e){return e.replace(/.+\./,"")};if(isUndefined(t)){if("string"==valType(e))if(vars.type)for(i in a)a[i].vidType==vars.type&&r.push(a[i]);else if(s(e)&&s(e)in n){var l=n[s(e)];if("array"==valType(l))for(var d=0;d0)for(d=0;di&&t[n][0]!=cookieName&&r<19&&(o.push(t[n]),r++);t=o}else t.push([cookieName,e,i+3600*cookieTime]);t.length>0&&(cookie(moeplayerCookie,"delete",vars.domain,vars.cookiePath),cookie(moeplayerCookie,arrayToString(t),vars.domain,vars.cookiePath)),cookieArray=t},loadTrack=function(){if(!isUndefined(video.textTracks)){var e=0;if(!isUndefined(vars.track)&&"array"==valType(vars.track)&&!video.find("track")){var t="",a=vars.track;for(C.bar.track.show(),e=0;e"}if(video){var r=video.htm()+t;video.htm(r)}video.find("track")&&!loadedTrack&&(loadedTrack=!0,checkTrack())}}},loadedMetaData=function(){eventTarget("loadedMetaData",{width:CK.getWidth(),height:CK.getHeight(),videoWidth:CT.videoWidth,videoHeight:CT.videoHeight,duration:duration,volume:CT.volume}),eventTarget("duration",duration),"error"in C&&C.error.hide(),replaceInformation("videoWidth",CT.videoWidth),replaceInformation("videoHeight",CT.videoHeight),replaceInformation("volume",parseInt(100*CT.volume)),replaceInformation("duration",parseInt(duration)),documentHidden(function(e){vars.documentFocusPause&&("show"==e?!focusPause&&paused&&player.play():(focusPause=paused,player.pause()))})},videoHandler={loadStart:function(){vars.controls||"iphone"==app||C.loading.show(),C.centerPlay.hide(),eventTarget("loadstart")},canPlay:function(){C.loading.hide(),eventTarget("canplay")},loadedData:function(){eventTarget("loadeddata")},loadedMetaData:function(){duration=this.duration,!isUndefined(this.duration)&&vars.duration&&(duration=vars.duration),vars.live||(C.time.htm(formatSeconds(this.currentTime)+"/"+formatSeconds(duration)),C.tempTime.htm(formatSeconds(this.currentTime)+"/"+formatSeconds(duration))),C.loading.hide(),vars.poster&&video.attr("poster",vars.poster),vars.autoplay||vars.controls||(C.centerPlay.show(),C.buffer.hide()),CT.duration=duration,CT.videoWidth=this.videoWidth,CT.videoHeight=this.videoHeight,CT.volume=this.volume,(CT.videoWidth||CT.videoHeight||duration)&&loadedMetaData();var e=0;isUndefined(this.buffered)||(e=this.buffered.length),e>0&&changeLoad(),vars.live?changePreview():changePreview(vars.preview),isUndefined(vars.prompt)||"array"!=valType(vars.prompt)||vars.live?deletePrompt():changePrompt(),isChangeDef&&(checkDefinition(),isChangeDef=!1),pSliderMouseDown=!1,loadedmetadataNum++,!isUndefined(ad)&&!isUndefined(ad.frontPlay)&&ad.frontPlay&&loadedmetadataNum>1&&(player.play(),calculationAdFrontTime(duration)),isUndefined(ad)||isUndefined(ad.frontPlay)||ad.frontPlay||(player.volume(vars.volume),player.play()),!vars.autoplay&&loadMeta&&(loadMeta=!1,player.pause(),setTimeout(player.pause,300))},timeUpDate:function(){waited||(waited=!0,C.buffer.hide(),eventTarget("buffer","end")),this.buffered.length>0&&changeLoad(),!duration&&this.duration&&(duration=this.duration,CT.duration=duration,CT.videoWidth=this.videoWidth,CT.videoHeight=this.videoHeight,(CT.videoWidth||CT.videoHeight||duration)&&loadedMetaData()),oldTime=playTime,playTime=this.currentTime,maxSeeTime1&&calculationAdFrontTime(duration-playTime),isUndefined(C.error)||"block"!=C.error.css("display")||C.error.hide(),cookieName&&changeCookie(playTime),replaceInformation("audioDecodedByteCount",this.webkitAudioDecodedByteCount||this.audioDecodedByteCount||0),replaceInformation("videoDecodedByteCount",this.webkitVideoDecodedByteCount||this.videoDecodedByteCount||0)},ended:function(){isUndefined(ad)||isUndefined(ad.frontPlay)||!ad.frontPlay?(C.bar.playAndPause.pause.hide(),C.bar.playAndPause.play.hide(),C.bar.playAndPause.refresh.show(),eventTarget("ended"),showEnded(),message()):adFrontEnded()},error:function(e){if(!isUndefined(e.type)){var t=this.error,a=function(){var a=12,n=language.error.loadingFailed;isUndefined(t)?(CT.error={code:a,message:n},e.target.attr("src")&&showError()):(isUndefined(t.code)||(a=t.code),isUndefined(t.message)||(n=t.message),CT.error={code:a,message:n},showError()),eventTarget("error",CT.error)};if("error"==e.type)try{video.currentSrc?ajax({url:video.currentSrc,error:function(e){e&&"object"==valType(e)&&"code"in e&&e.code?(CT.error=e,eventTarget("error",CT.error),showError()):a()},success:function(e){e||a()}}):a()}catch(e){a()}}},stalled:function(){eventTarget("stalled"),CT.error={code:13,message:"load:stalled"},eventTarget("error",CT.error)},suspend:function(){eventTarget("suspend")},emptied:function(){eventTarget("emptied"),CT.error={code:7,message:language.error.emptied},eventTarget("error",CT.error)},seeked:function(){paused&&player.play(),pSliderMouseDown=!1,eventTarget("seek",{time:this.currentTime,state:"seeked"}),eventTarget("seeked")},seeking:function(){paused&&player.play();var e=this.currentTime;switch(-1==firstSeekTime&&(firstSeekTime=e),vars.timeScheduleAdjust){case 0:if(oldTime!=e)return waitingMessage=!1,player.seek(oldTime),void message(language.timeScheduleAdjust.prohibit);break;case 2:if(eoldTime)return waitingMessage=!1,player.seek(oldTime),void message(language.timeScheduleAdjust.prohibitForward);break;case 4:if(emaxSeeTime)return waitingMessage=!1,player.seek(maxSeeTime),void message(language.timeScheduleAdjust.prohibitForwardNotViewed)}eventTarget("seek",{time:e,state:"seeking"}),eventTarget("seeking"),vars.live||(C.time.htm(formatSeconds(e)+"/"+formatSeconds(duration)),C.tempTime.htm(formatSeconds(e)+"/"+formatSeconds(duration)))},waiting:function(){waited=!1,eventTarget("buffer","start"),C.centerPlay.hide(),vars.controls||C.buffer.show(),waitingMessage?message(language.waiting):waitingMessage=!0},play:function(){if(paused=!1,C.bar.playAndPause.play.hide(),C.bar.playAndPause.pause.show(),C.bar.playAndPause.refresh.hide(),C.centerPlay.hide(),"button"==playType?C.bar.pbox.removeClass("ck-bar-progress-out"):C.bar.pbox.addClass("ck-bar-progress-out"),recoveryVolume&&(recoveryVolume=!1,player.exitMuted()),hideBar(),closePauseAd(),playType="",isUndefined(C.ended)||player.closeLayer(C.ended),"error"in C&&C.error.hide(),eventTarget("play"),!isUndefined(ad)&&!isUndefined(ad.front)&&isUndefined(ad.frontPlay))return ad.frontPlayI=0,ad.frontPlay=!0,player.pause(),void adFrontPlay();seekTime&&(isUndefined(vars.live)||!isUndefined(vars.live)&&"boolean"==valType(vars.live)&&!vars.live)&&seekTime<.01*parseInt(100*duration)&&(player.seek(seekTime),seekTime=0)},pause:function(){paused=!0,isUndefined(ad)||isUndefined(ad.frontPlay)||!isUndefined(ad.frontPlay)&&!ad.frontPlay?isUndefined(ad)||isUndefined(ad.pause)?vars.controls||(C.centerPlay.show(),C.buffer.hide()):(isUndefined(ad.pausePlayI)&&(ad.pausePlayI=0),adPausePlay()):vars.controls||(C.centerPlay.show(),C.buffer.hide()),C.bar.playAndPause.pause.hide(),C.bar.playAndPause.play.show(),C.bar.playAndPause.refresh.hide(),C.bar.pbox.removeClass("ck-bar-progress-out"),checkProgressSlider(),eventTarget("pause"),C.bar.removeClass("ck-bar-out"),CM.removeClass("ck-nocursor")},volumeChange:function(){if(0!=this.volume||mutedState||(this.muted=!0),this.volume>0&&mutedState&&(this.muted=!1),mutedState!=this.muted&&(mutedState=this.muted,changeMuted(this.muted),CT.muted=this.muted,eventTarget("muted",CT.muted)),CT.volume=this.volume,eventTarget("volume",this.volume),!isUndefined(C.bar.vbox)){var e=parseInt(100*this.volume);C.bar.vbox.volume.txt.htm(e),C.bar.vbox.mouseDown||changeVolumeSlider(this.muted?0:this.volume),this.muted||message(language.volume+e+"%")}replaceInformation("volume",parseInt(100*this.volume))},resize:function(){var e=document.fullScreen||document.mozFullScreen||document.webkitIsFullScreen||document.msFullscreenElement;e?(C.bar.fullAndExit.exitFull.show(),C.bar.fullAndExit.full.hide(),C.ad.bottom.fullAndExit.exitFull.show(),C.ad.bottom.fullAndExit.full.hide(),CM.hasClass("ck-main-full")||CM.addClass("ck-main-full"),message(language.full),C.bar.webFullAndExit.hide(),C.bar.theatreAndExit.hide(),isUndefined(C.menu)||CM.append(C.menu)):(e=!1,C.bar.fullAndExit.full.show(),C.bar.fullAndExit.exitFull.hide(),C.ad.bottom.fullAndExit.full.show(),C.ad.bottom.fullAndExit.exitFull.hide(),CM.hasClass("ck-main-full")&&CM.removeClass("ck-main-full"),!isUndefined(vars.webFull)&&vars.webFull&&C.bar.webFullAndExit.show(),isUndefined(vars.theatre)||CT.webFull||C.bar.theatreAndExit.show(),isUndefined(C.menu)||$("body").append(C.menu),CV.css("width")!=CM.css("width")&&player.zoom(100)),CT.full!=e&&(CT.full=e,eventTarget("full",e)),checkVideoRotate(),changeProgress(player.time())},keydown:function(e){var t=(e=window.event||e).keyCode||e.which,a=player.volume(),n=function(){e.preventDefault?e.preventDefault():e.returnValue=!1};switch(t){case 32:n(),player.playOrPause();break;case 37:player.fastBack();break;case 39:player.fastNext();break;case 38:"number"==valType(vars.keyVolume)&&(1==vars.keyVolume||2==vars.keyVolume&&CT.full)&&(n(),player.volume(a+.1<1?a+=.1:1));break;case 40:"number"==valType(vars.keyVolume)&&(1==vars.keyVolume||2==vars.keyVolume&&CT.full)&&(n(),player.volume(a-.1>0?a-=.1:0))}},mouseWheel:function(e){if("number"==valType(vars.mouseWheelVolume)&&(1==vars.mouseWheelVolume||2==vars.mouseWheelVolume&&CT.full)){e=window.event||e;var t=player.volume();e.preventDefault?e.preventDefault():e.returnValue=!1,e.wheelDelta?(e.wheelDelta>0&&player.volume(t+.1<1?t+=.1:1),e.wheelDelta<0&&player.volume(t-.1>0?t-=.1:0)):e.detail&&(e.detail>0&&player.volume(t-.1>0?t-=.1:0),e.detail<0&&player.volume(t+.1<1?t+=.1:1))}}},adFrontPlay=function(){if(0==ad.frontPlayI&&(allBarHide(!1),C.ad.show(),ad.front.video=!1,isUndefined(ad.front.closeTime)||(ad.front.closeTime>0?(C.ad.top.closeTime.show(),adFrontCloseTime()):C.ad.top.closeAd.show())),isUndefined(ad.front.node)||null==ad.front.node||(CM.append(ad.front.node),player.closeLayer(ad.front.node),ad.front.node=null),C.ad.picture.htm(""),C.ad.picture.hide(),C.ad.link.hide(),!isUndefined(ad.front.list[ad.frontPlayI])){var e=ad.front.list[ad.frontPlayI];frontAdPlay=!0,eventTarget("frontAd",e),"picture"==e.type?adPicturePlay(e):"node"==e.type?adNode(e):(C.ad.link.attr("data-link",e.link),adVideoPlay(e.file)),isUndefined(e.link)?C.ad.bottom.details.hide():(C.ad.bottom.details.show(),C.ad.bottom.details.htm(''+language.details+""))}},adFrontCloseTime=function(){isUndefined(ad.front.closeSetTime)||(clearTimeout(ad.front.closeSetTime),ad.front.closeSetTime=null),C.ad.top.closeTime.htmReplace("{seconds}",ad.front.closeTime,language.closeTime),ad.front.closeTime--,ad.front.closeTime>0?ad.front.closeSetTime=setTimeout(adFrontCloseTime,1e3):(C.ad.top.closeAd.show(),C.ad.top.closeTime.hide())},calculationAdFrontTime=function(e){isUndefined(e)||(ad.front.list[ad.frontPlayI].time=e),ad.front.countDown=0;for(var t=ad.frontPlayI;t0?(e.time--,ad.front.countDown--,C.ad.top.countDown.htm(ad.front.countDown+language.second),adFrontSetTime=setTimeout(adFrontCountDown,1e3)):adFrontEnded()},adFrontEnded=function(){ad.frontPlayI0||i>0){if(e.link){var o=createlA("",e.link);o.append(this),C.ad.picture.append(o)}else C.ad.picture.append(this);t.unbind(),t.click(function(){eventTarget("frontAdClick",e)})}else a<10&&(a++,n())})};n(),calculationAdFrontTime(),adFrontCountDown(),C.ad.bottom.mutedAndExit.hide()}},adNode=function(e){isUndefined(e.content)||(ad.front.node=player.layer(e),ad.front.node.css({"z-index":1}),C.ad.append(ad.front.node),ad.front.node.unbind(),ad.front.node.click(function(){eventTarget("frontAdClick",e)}),calculationAdFrontTime(),adFrontCountDown(),C.ad.bottom.mutedAndExit.hide())},frontVideoClickHandler=function(){var e=C.ad.link.attr("data-link");window.open(e,"_blank")},closeFrontAd=function(){if(isUndefined(ad)||isUndefined(ad.front)||isUndefined(ad.front.closeButtonClick))player.closeFrontAd();else if("function"==valType(ad.front.closeButtonClick))try{ad.front.closeButtonClick()}catch(e){console.error(e)}else if("string"==valType(ad.front.closeButtonClick))try{eval(ad.front.closeButtonClick+"()")}catch(e){console.error(e)}},adPausePlay=function(){if(closePauseAd(),!isUndefined(ad)&&!isUndefined(ad.pause)&&!isUndefined(ad.pause.list)&&ad.pause.list.length-1>=ad.pausePlayI){var e=ad.pause.list[ad.pausePlayI];if(!isUndefined(ad.pause.close)&&ad.pause.close&&(ad.pauseClose=createlButton("ck-pause-close"),ad.pauseClose.click(function(){C.centerPlay.show(),C.buffer.hide(),closePauseAd()})),isUndefined(e.file))isUndefined(e.content)||(ad.pause.node=player.layer(e),ad.pauseClose&&ad.pause.node.append(ad.pauseClose),ad.pause.node.click(function(){eventTarget("pauseAdClick",e)}));else{var t=null,a=0,n=function(){t=createlImg(e.file),C.adPause.show(),C.adPause.htm(""),C.adPause.append(t),t.addListener("load",function(){var r=this.getWidth(),i=this.getHeight();if(r>0||i>0){if(C.adPause.htm(""),e.link){var o=createlA("",e.link);o.append(this),C.adPause.append(o)}else C.adPause.append(this);C.adPause.css({width:r+"px",height:i+"px"}),ad.pauseClose&&C.adPause.append(ad.pauseClose),t.click(function(){eventTarget("pauseAdClick",e)})}else a<10&&(a++,n())})};n()}eventTarget("pauseAd",e),!isUndefined(e.time)&&e.time>0&&(adPauseSetTime=setTimeout(function(){ad.pausePlayI++,ad.pausePlayI>ad.pause.list.length-1&&(ad.pausePlayI=0),adPausePlay()},1e3*e.time))}},closePauseAd=function(){adPauseSetTime&&(clearTimeout(adPauseSetTime),adPauseSetTime=null),C.adPause.hide(),isUndefined(ad)||isUndefined(ad.pauseClose)||null==ad.pauseClose||(ad.pauseClose.remove(),ad.pauseClose=null),isUndefined(ad)||isUndefined(ad.pause)||isUndefined(ad.pause.node)||!ad.pause.node||(ad.pause.node.unbind(),player.closeLayer(ad.pause.node),eventTarget("pauseAdClose"))},player={width:function(e){return isUndefined(e)||("number"==valType(e)&&(e+="px"),CT.css({width:e}),checkVideoRotate()),CK.getWidth()},height:function(e){return isUndefined(e)||("number"==valType(e)&&(e+="px"),CT.css({height:e}),checkVideoRotate()),CK.getHeight()},videoWidth:function(){return video?video.videoWidth:null},videoHeight:function(){return video?video.videoHeight:null},zoom:function(e){if(!isUndefined(e)&&("function"==valType(e)&&newEvent.addEventListener("zoom",e),"number"==valType(e))){for(var t=[C.topBar.zoomEle.zoom50,C.topBar.zoomEle.zoom75,C.topBar.zoomEle.zoom100],a=0;ae&&e>0?a=t[e]:t.indexOf(e)>-1&&(a=e),a!=nowRotate&&(eventTarget("rotate",a),nowRotate=a,checkVideoRotate())}},vars:function(e,t){if(!isUndefined(e)){if("string"==valType(e)&&!isUndefined(t)){var a={};a[e]=t,e=a}var n=!1;for(var r in e)if(r in vars&&e[r]!=vars[r]){n=!0;break}n&&(vars=standardization(vars,e)),isUndefined(e.video)||(isChangeDef=!0,changeVideo(vars.video)),isUndefined(e.title)||C.topBar.titleEle.htm(e.title)}},loadstart:function(e){isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("loadstart",e)},loadeddata:function(e){isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("loadeddata",e)},loadedMetaData:function(e){isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("loadedMetaData",e)},canplay:function(e){isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("canplay",e)},play:function(e){if("object"==valType(e)&&(e.target!=C.bar.playAndPause.play&&e.target!=C.bar.playAndPause.refresh||(playType="button")),isUndefined(e)||"function"!=valType(e)){if(loadedmetadataNum>0&&video)try{video.play()}catch(e){console.error(e)}}else newEvent.addEventListener("play",e);return player},pause:function(e){if(isUndefined(e)||"function"!=valType(e)){if(loadedmetadataNum>0&&video)try{video.pause()}catch(e){console.error(e)}}else newEvent.addEventListener("pause",e);return player},playOrPause:function(){return paused?player.play():player.pause(),player},volume:function(e){if(isUndefined(e)){if(video)return video.volume}else"function"==valType(e)?newEvent.addEventListener("volume",e):"number"==valType(e)&&video&&(e<0&&(e=0),e>1&&(e=1),video.muted&&(video.volume=.5*e),video.volume=e);return player},muted:function(e){return isUndefined(e)||"function"!=valType(e)?video&&(video.muted=!0):newEvent.addEventListener("muted",e),player},exitMuted:function(){return video&&(video.muted=!1,0==video.volume&&player.volume(vars.volume>0?vars.volume:.8)),player},time:function(e){if(isUndefined(e)||"function"!=valType(e)){if(video)return video.currentTime||0}else newEvent.addEventListener("time",e)},seek:function(e){if(!isUndefined(e)&&("function"==valType(e)&&newEvent.addEventListener("seek",e),"number"==valType(e)&&video)){switch(vars.timeScheduleAdjust){case 0:return void message(language.timeScheduleAdjust.prohibit);case 1:break;case 2:if(eoldTime)return void message(language.timeScheduleAdjust.prohibitForward);break;case 4:if(emaxSeeTime)return waitingMessage=!1,video.currentTime=maxSeeTime,void message(language.timeScheduleAdjust.prohibitForwardNotViewed)}pSliderMouseDown=!1,video.currentTime=e}return player},buffer:function(e){return isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("buffer",e),player},ended:function(e){return isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("ended",e),player},next:function(e){return isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("next",e),player},error:function(e){return isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("error",e),player},emptied:function(e){return isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("emptied",e),player},duration:function(e){if(isUndefined(e)||"function"!=valType(e))return duration||0;newEvent.addEventListener("duration",e)},playbackRate:function(e){if(isUndefined(e))return video.playbackRate;"function"==valType(e)?newEvent.addEventListener("playbackRate",e):"number"==valType(e)&&video&&(video.playbackRate=e,CT.playbackRate=e,eventTarget("playbackRate",e),changePlaybackrateVal(e))},track:function(e){if(isUndefined(e))return CT.track;if("function"==valType(e))newEvent.addEventListener("track",e);else if("number"==valType(e)&&video){var t=null;if(isUndefined(video.textTracks)||(t=video.textTracks),t&&"texttracklist"==valType(t)){for(var a=vars.track,n=t.length-1;n>-1;n--)video.find("track").eq(n).remove();for(n=0;n"}if(video){var i=video.htm()+t;video.htm(i)}changeTrackVal(e)}}},fastBack:function(e){if(0!=duration){(isUndefined(e)||"number"!=valType(e))&&(e=20);var t=player.time();return t-e>0?t-=e:t=0,player.seek(t),player}},fastNext:function(e){if(0!=duration){(isUndefined(e)||"number"!=valType(e))&&(e=20);var t=player.time();return t+e200&&(r=200),isUndefined(n.cssDisplay)&&(n.cssPosition=n.css("position"),n.cssDisplay=n.css("display")),n.css({position:"absolute","z-index":r}),a?C.bar.append(n):CM.append(n),n.CK=CK,n.show()}return n},closeLayer:function(e){if("string"==valType(e)){var t=$(e);isUndefined(t)||t.length>0&&(e=t.eq(0))}if(!isUndefined(e)&&"htmlobject"==valType(e)){if(isUndefined(e.captureParentNode))e.remove();else{var a=e.captureParentNode;if(e.nextElement)try{a.insertBefore(e,e.nextElement)}catch(t){a.append(e)}else if(e.prevElement)try{a.insertAfter(e,e.prevElement)}catch(t){a.append(e)}else a.append(e);e.css({display:e.cssDisplay})}isUndefined(e.cssDisplay)||e.css({display:e.cssDisplay,position:e.cssPosition})}return player},message:function(e){return message(e),player},closeFrontAd:function(){return!frontAdPlay||isUndefined(ad)||isUndefined(ad.front)||isUndefined(ad.front.list)||(ad.frontPlayI=ad.front.list.length-1,adFrontEnded(),clearAdFrontSetTime()),player},addListener:function(e,t){newEvent.addEventListener(e,t)},removeListener:function(e,t){newEvent.removeEventListener(e,t)},bar:function(e){barShow=e,e?C.bar.show():C.bar.hide()},rightBar:function(e){rightBarShow=e,e?C.rightBar.show():C.rightBar.hide()},mouseActive:function(e){return isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("mouseActive",e),this},cookie:function(e){if("delete"==e)return cookie(moeplayerCookie,"delete",vars.domain),null;!isUndefined(e)&&e&&(e=e.replace(/[ ]*,[ ]*|[ ]+/g,"").replace(/[ ]*;[ ]*|[ ]+/g,""));var t=cookie(moeplayerCookie);if(t){var a=stringToArray(t),n=[],r=parseInt(.001*Date.now());for(i=0;ir&&n.push(a[i]);if((a=n).length>0){cookie(moeplayerCookie,"delete",vars.domain,vars.cookiePath),cookie(moeplayerCookie,arrayToString(a),vars.domain,vars.cookiePath);for(var i=0;i-1;a--){var n=createlButton("ck-list-p",e[a]+language.playbackrateSuffix);n.attr("data-i",a).attr("data-val",e[a]),C.bar.playbackrate.bg.p.push(n),C.bar.playbackrate.bg.append(n),n.click(playbackrateClick)}if(C.bar.playbackrate.hide(),!isUndefined(vars.playbackrateOpen)&&vars.playbackrateOpen){C.bar.playbackrate.show(),C.bar.playbackrate.bgbox.show();var r=C.bar.playbackrate.bg.getWidth(),i=C.bar.playbackrate.bg.getHeight(),o=C.bar.playbackrate.button.getWidth();C.bar.playbackrate.bg.css({width:r+10+"px"}),r=C.bar.playbackrate.bg.getWidth(),getBarHeight()>C.bar.getHeight()&&(i+=getBarHeight()-C.bar.getHeight()),C.bar.playbackrate.bgbox.attr("style",""),C.bar.playbackrate.bgbox.css({width:r+"px",height:i+2+"px",left:.5*-(r-o)+"px"}),C.bar.playbackrate.button.mouseover(function(){r=C.bar.playbackrate.bg.getWidth(),o=C.bar.playbackrate.button.getWidth(),C.bar.playbackrate.bgbox.css({left:.5*-(r-o)+"px"})}),changePlaybackrateVal(t)}},playbackrateClick=function(e){C.bar.playbackrate.bgbox.hide(),setTimeout(function(){C.bar.playbackrate.bgbox.removeCss("display")},300),message(language.switchTo+$(this).htm()),player.playbackRate(parseFloat($(this).attr("data-val")))},changePlaybackrateVal=function(e){C.bar.playbackrate.bg.find("button").each(function(t,a){var n=parseFloat(a.attr("data-val"));a.removeClass("ck-list-p-focus"),e==n?(a.addClass("ck-list-p-focus"),1!=e?C.bar.playbackrate.button.htm(a.htm()):C.bar.playbackrate.button.htm(language.playbackrate)):a.removeClass("ck-list-p-focus")})},checkTrack=function(){var e=vars.track,t=-1;C.bar.track.bgbox.htm(""),C.bar.track.bg=createlDiv("ck-list-bg"),C.bar.track.bgbox.append(C.bar.track.bg),C.bar.track.bg.p=[];for(var a=null,n=e.length-1;n>-1;n--)(a=createlButton("ck-list-p",e[n].label)).attr("data-i",n).attr("data-title",e[n].label),C.bar.track.bg.p.push(a),C.bar.track.bg.append(a),!isUndefined(e[n].default)&&e[n].default&&(t=n),a.click(trackClick);(a=createlButton("ck-list-p",language.noTrack)).attr("data-i",-1).attr("data-title",language.noTrack),C.bar.track.bg.p.push(a),C.bar.track.bg.append(a),a.click(trackClick),C.bar.track.hide(),C.bar.track.show(),C.bar.track.bgbox.show();var r=C.bar.track.bg.getWidth(),i=C.bar.track.bg.getHeight(),o=C.bar.track.button.getWidth();C.bar.track.bg.css({width:r+10+"px"}),r=C.bar.track.bg.getWidth(),getBarHeight()>C.bar.getHeight()&&(i+=getBarHeight()-C.bar.getHeight()),C.bar.track.bgbox.attr("style",""),C.bar.track.bgbox.css({width:r+"px",height:i+2+"px",left:.5*-(r-o)+"px"}),C.bar.track.button.mouseover(function(){r=C.bar.track.bg.getWidth(),o=C.bar.track.button.getWidth(),C.bar.track.bgbox.css({left:.5*-(r-o)+"px"})}),changeTrackVal(t)},trackClick=function(e){C.bar.track.bgbox.hide(),setTimeout(function(){C.bar.track.bgbox.removeCss("display")},300),message(language.switchTo+$(this).attr("data-title")),player.track(parseFloat($(this).attr("data-i")))},changeTrackVal=function(e){C.bar.track.bg.find("button").each(function(t,a){var n=parseInt(a.attr("data-i"));e==n?(C.bar.track.button.htm(a.attr("data-title")),n>-1?(CT.track=vars.track[n],eventTarget("track",vars.track[n])):(CT.track=null,eventTarget("track",null)),a.addClass("ck-list-p-focus")):a.removeClass("ck-list-p-focus")})},checkDefinition=function(){var e=-1,t=video.currentSrc;if(isUndefined(C.bar.definition.bg)||(C.bar.definition.bgbox.htm(""),C.bar.definition.bgbox.attr("style",""),C.bar.definition.button.htm(language.definition)),"array"==valType(vars.video)){var a=vars.video;C.bar.definition.bg=createlDiv("ck-list-bg"),C.bar.definition.bgbox.append(C.bar.definition.bg),C.bar.definition.bg.p=[];for(var n=a.length-1;n>-1;n--){var r=createlButton("ck-list-p",a[n][2]);r.attr("data-i",n).attr("data-video",a[n][0]).attr("data-type",a[n][1]).attr("data-title",a[n][2]),C.bar.definition.bg.p.push(r),C.bar.definition.bg.append(r),t&&t.indexOf(a[n][0])>-1&&(e=n),r.click(definitionClick)}C.bar.definition.show(),C.bar.definition.bgbox.show();var i=C.bar.definition.bg.getWidth(),o=C.bar.definition.bg.getHeight(),s=C.bar.definition.button.getWidth();C.bar.definition.bg.css({width:i+10+"px"}),i=C.bar.definition.bg.getWidth(),getBarHeight()>C.bar.getHeight()&&(o+=getBarHeight()-C.bar.getHeight()),C.bar.definition.bgbox.attr("style",""),C.bar.definition.bgbox.css({width:i+"px",height:o+2+"px",left:.5*-(i-s)+"px"}),C.bar.definition.button.mouseover(function(){i=C.bar.definition.bg.getWidth(),s=C.bar.definition.button.getWidth(),C.bar.definition.bgbox.css({left:.5*-(i-s)+"px"})})}e>-1&&C.bar.definition.bg.find("button").each(function(t,a){var n=parseInt(a.attr("data-i"));e==n?a.addClass("ck-list-p-focus"):a.removeClass("ck-list-p-focus")})},definitionClick=function(e){C.bar.definition.bgbox.hide(),setTimeout(function(){C.bar.definition.bgbox.removeCss("display")},300),changeDefinition(parseInt($(this).attr("data-i")))},changeDefinition=function(e){C.bar.definition.bg.find("button").each(function(t,a){var n=parseInt(a.attr("data-i"));if(e==n){if(!isUndefined(video.textTracks)&&video.textTracks.length>0)for(var r=video.find("track").length-1;r>-1;r--)video.find("track").eq(r).remove();seekTime=player.time(),video.attr("autoplay","autoplay"),changeVideo(a.attr("data-video")),message(language.switchTo+a.htm()),C.bar.definition.button.htm(a.htm()),a.addClass("ck-list-p-focus"),eventTarget("definition",{id:n,video:a.attr("data-video"),title:a.attr("data-title")})}else a.removeClass("ck-list-p-focus")})},deletePrompt=function(){var e=0;if(!isUndefined(C.prompt)&&"array"==valType(C.prompt)){for(e=C.prompt.length;e>-1;e--)isUndefined(C.prompt[e])||C.prompt[e].remove();C.prompt=null}C.prompt=[]},changePrompt=function(){deletePrompt();for(var e=0;e100&&(r=100),a.css({left:r+"%"}),a.mouseover(function(){this.attr("data-words")&&showPromptWords(this)}),a.mouseout(function(){this.attr("data-words")&&showPromptWords()}),C.prompt.push(a)}}},showPromptWords=function(e){if(isUndefined(C.promptWords)&&(C.promptWords=createlDiv("ck-prompt-words"),CM.append(C.promptWords),C.promptWords.content=createlDiv("ck-prompt-content"),C.promptWords.append(C.promptWords.content)),isUndefined(e))return C.promptWords.content.htm(""),void C.promptWords.hide();C.promptWords.content.htm(e.attr("data-words")),C.promptWords.show();var t=C.promptWords.getWidth(),a=C.promptWords.getHeight(),n=(C.bar.pbox.bg,parseFloat(e.attr("data-time")),CK.getHeight()-getBarHeight()),r=e.offset().left-CK.offset().left+.5*e.getWidth()-.5*t;isUndefined(C.preview)?(n=CK.getHeight()-parseFloat(getBarHeight()+C.tip.minHeight+parseInt(C.tip.css("margin-bottom"))),n-=getBarHeight()-C.bar.getHeight()):n=CK.getHeight()-parseFloat(getBarHeight()+C.preview.smallHight+parseInt(C.preview.css("margin-bottom"))),n-=parseFloat(C.promptWords.css("margin-bottom")),n-=a,(r-=parseFloat(C.promptWords.css("margin-right")))<0&&(r=0),r>CK.getWidth()-t&&(r=CK.getWidth()-t),C.promptWords.css({top:n+"px",left:r+"px"})},changePreview=function(e){if(isUndefined(C.preview)||(C.preview.remove(),C.preview=null),!isUndefined(e)){C.preview=createlDiv("ck-preview"),CM.append(C.preview),isUndefined(vars.preview.type)&&(vars.preview.type=0),1==vars.preview.type&&(C.preview.bg=createlDiv("ck-preview-bg"),C.preview.append(C.preview.bg));var t=[];if("object"==valType(vars.preview))if("array"==valType(vars.preview.file)){t=vars.preview.file;var a=[10,10];if("array"==valType(vars.preview.thumbnail)&&vars.preview.thumbnail.length>1&&("number"==valType(vars.preview.thumbnail[0])&&(a[0]=vars.preview.thumbnail[0]),"number"==valType(vars.preview.thumbnail[1])&&(a[1]=vars.preview.thumbnail[1]),vars.preview.thumbnail=a),t[0]){var n=createlImg(t[0],"ck-preview-load-img").addListener("load",function(){!function(e,a,n,r){if(1==vars.preview.type){C.preview.bg.img=[];for(var i=0;i0){isUndefined(vars.preview.type)&&(vars.preview.type=0);var t=2,a=vars.preview.thumbnail;isUndefined(vars.preview.scale)||(t=vars.preview.scale);var n=0,r=0,i=0,o=0,s=0,l=C.preview.smallWidth,d=C.preview.smallHight,u=e*C.bar.pbox.bg.getWidth()/duration+(C.bar.pbox.bg.offset().left-CK.offset().left);if("none"==C.preview.css("display")&&C.preview.show(),C.preview.css({height:d+"px"}),1==vars.preview.type){n=parseInt(e/(t*a[0])),r=parseInt(e/t);var c=n-5,p=n+5;c<0&&(c=0),p>C.preview.bg.img.length-1&&(p=C.preview.bg.img.length-1);for(var v=c;vC.preview.getWidth()-C.preview.frame.getWidth()){var m=o-(C.preview.getWidth()-C.preview.frame.getWidth());o=C.preview.getWidth()-C.preview.frame.getWidth(),i-=m}C.preview.bg.css({left:i+"px"}),C.preview.frame.css({left:o+"px"})}else{var h=e/t/(a[0]*a[1]);r=parseInt(h);var b=parseInt(100*(h-r)),g=parseInt(b/a[0]),y=b%a[0],k=vars.preview.file;(i=u-.5*l)<0&&(i=0),i>CK.getWidth()-l&&(i=CK.getWidth()-l),C.preview.css({width:C.preview.smallWidth+"px",background:"url("+k[r]+") no-repeat","background-position":"-"+y*l+"px -"+g*d+"px",left:i+"px"})}}},showError=function(){if(C.loading.hide(),!vars.controls&&vars.errorShow){isUndefined(C.error)&&(C.error=createlDiv("ck-error"),CM.append(C.error));var e=CT.error.message;e||(e=language.error.noMessage);var t=e+"(code:"+CT.error.code+")";C.error.htm(t),C.error.show()}},showWindowsError=function(e){var t=createlDiv("moeplayer-error",e);$("body").append(t)},showNextEpisode=function(){if(!isUndefined(vars.next)){if("object"==valType(vars.next)){if("content"in vars.next)return void(C.next=player.layer(vars.next));if("title"in vars.next)return void tip(C.bar.nextEpisode,vars.next.title)}tip(C.bar.nextEpisode,language.next)}},nextClick=function(){"object"==valType(vars.next)&&("click"in vars.next&&("function"==valType(vars.next.click)?vars.next.click():"string"==valType(vars.next.click)&&eval(vars.next.click+"()")),"link"in vars.next&&(window.location.href=vars.next.link),eventTarget("next"))},showEnded=function(){if(!CT.loop&&!isUndefined(vars.ended))return closePauseAd(),C.ended=player.layer(vars.ended),void(C.ended&&C.centerPlay.hide())},windowScroll=function(){CT.smallWindows&&(CT.webFull||CT.theatre||CT.full?exitSmallWindows():(document.documentElement.scrollTop||document.body.scrollTop)>CT.offset().top+CT.getHeight()?CK.hasClass("moeplayer-smallwindow")||(CK.addClass("moeplayer-smallwindow"),eventTarget("smallWindows",!0),smallWindowsState=!0,vars.smallWindowsDrag&&drag(!0),allBarHide(),checkVideoRotate()):exitSmallWindows())},exitSmallWindows=function(){CK.hasClass("moeplayer-smallwindow")&&(CK.removeClass("moeplayer-smallwindow"),vars.smallWindowsDrag&&drag(),eventTarget("smallWindows",!1),smallWindowsState=!1,allBarShow(),checkVideoRotate())},drag=function(e){var t=$(document),a=0,n=0,r=0,i=0,o=!1;isUndefined(e)||(o=e);var s=function(e){e=e||window.event;var t=getClient(e),o=CK.offset();n=t.y-i,a=t.x-r,r=t.x,i=t.y;var s=o.left+a,l=o.top+n;CK.css({left:s+"px",top:l+"px"}),"fixed"!=CK.css("position")&&CK.css({position:"fixed"}),isDrag=!0},l=function(){t.removeListener("mousemove",s),t.removeListener("mouseup",l),CK.css({cursor:"default"})};o?CK.mousedown(function(e){e.preventDefault&&e.preventDefault(),e=e||window.event;var a=getClient(e);r=a.x,i=a.y,t.mousemove(s),t.mouseup(l),CK.css({cursor:"move"})}):CK.unbind("mousedown")},checkVideoRotate=function(){var e=CK.getWidth()*nowZoom*.01,t=CK.getHeight()*nowZoom*.01,a=CV.getWidth(),n=CV.getHeight();if(CV.css({transform:"rotate("+nowRotate+"deg)","-ms-transform":"rotate("+nowRotate+"deg)","-moz-transform":"rotate("+nowRotate+"deg)","-webkit-transform":"rotate("+nowRotate+"deg)","-o-transform":"rotate("+nowRotate+"deg)",width:nowZoom+"%",height:nowZoom+"%"}),0!=nowRotate&&180!=nowRotate){if(n>e&&a>t)return void(n/e>a/t?CV.css({height:nowZoom+"%",width:t+"px"}):CV.css({width:nowZoom+"%",height:e+"px"}));if(nt?CV.css({height:nowZoom+"%",width:t+"px"}):n/a>=e/t?CV.css({width:nowZoom+"%",height:e+"px"}):CV.css({height:nowZoom+"%",width:t+"px"}));if(n>=e&&a<=t)return void CV.css({width:nowZoom+"%",height:e+"px"});a>=t&&nC.bar.getHeight()&&(d-=getBarHeight()-C.bar.getHeight()),l=i>s?n.left-r.left-.5*(i-s):n.left-r.left+.5*(s-i),"left"==a&&(l=n.left-r.left-i,d=n.top-r.top),isUndefined(t)||(l=t.x-r.left-.5*i),l<0&&(l=0),d<0&&(d=0),l>CM.getWidth()-i&&(l=CM.getWidth()-i),d>CM.getHeight()-o&&(d=CM.getHeight()-o),C.tip.css({left:l+"px",top:d-parseInt(C.tip.css("margin-bottom"))+"px"})},progressDragX=function(){var e=C.bar.pbox.bg,t=C.bar.pbox.play,a=C.bar.pbox.slider,n=C.bar.pbox.mouseLine;a.unbind(),e.unbind();var r=0,i=0,o=$(document),s=0,l=function(t){if(t.preventDefault&&t.preventDefault(),vars.timeScheduleAdjust){t=t||window.event;var n=a.offset(),r=e.offset(),c=getClient(t);pSliderMouseDown=!0,i=c.x;var p=n.left-r.left;s=p*duration/(e.getWidth()-a.getWidth()),a.removeListener("mousedown",l),a.removeListener("touchstart",l),o.mousemove(d),o.mouseup(u),a.touchmove(d),a.touchend(u),noScrolling(!0)}},d=function(n){n=n||window.event;var o=a.offset(),l=e.offset(),d=getClient(n);pSliderMouseDown=!0,r=i-d.x,i=d.x;var u=o.left-r-l.left;u<0&&(u=0),u>e.getWidth()-a.getWidth()&&(u=e.getWidth()-a.getWidth()),C.bar.pbox.addClass("ck-bar-progress-slider-move");var c="";if(vars.live)c=formatLiveTime(u*getLiveTime()/(e.getWidth()-a.getWidth()));else{switch(c=u*duration/(e.getWidth()-a.getWidth()),vars.timeScheduleAdjust){case 2:cs)return u=-1e3,void message(language.timeScheduleAdjust.prohibitForward);break;case 4:if(cmaxSeeTime)return u=-1e3,player.seek(maxSeeTime),void message(language.timeScheduleAdjust.prohibitForwardNotViewed)}c=formatSeconds(c)}tip(a,c),u>=0?(a.css({left:u+"px"}),t.css({width:u+.5*a.getWidth()+"px"})):pSliderMouseDown=!1},u=function(){if(noScrolling(),o.removeListener("mousemove",d),o.removeListener("mouseup",u),a.removeListener("touchmove",d),a.removeListener("touchend",u),a.mousedown(l),a.touchstart(l),vars.live){var n=parseInt(vars.live+t.getWidth()*getLiveTime()/(e.getWidth()-.5*a.getWidth()));eventTarget("playback",{time:n,date:date("Y-m-d H:i:s",n)}),eventTarget("seek",{time:n,state:"seeking",date:date("Y-m-d H:i:s",n)})}else{var r=t.getWidth()*duration/(e.getWidth()-.5*a.getWidth());r>duration&&(r=duration),seekTime=0,player.seek(r)}C.bar.pbox.removeClass("ck-bar-progress-slider-move"),c&&tip()},c=!0;a.mousedown(l),a.mouseover(function(){var t="";t=vars.live?language.live:formatSeconds(parseInt(a.css("left"))*duration/(e.getWidth()-a.getWidth())),c=!1,tip(a,t)}),a.mouseleave(function(){c=!0}),a.touchstart(l);var p=null,v=(p=null,function(){p&&(clearTimeout(p),p=null),closeTipFun()});e.mousedown(function(n){n=n||window.event;var r=getClient(n),i=e.offset(),o=r.x-i.left;if(CT.full&&(o+=CK.offset().left),vars.live){var s=parseInt(vars.live+getLiveTime()*o/e.getWidth());eventTarget("playback",{time:s,date:date("Y-m-d H:i:s",s)}),eventTarget("seek",{time:s,state:"seeking",date:date("Y-m-d H:i:s",s)})}else{var l=duration*o/e.getWidth();switch(vars.timeScheduleAdjust){case 0:return void message(language.timeScheduleAdjust.prohibit);case 2:if(loldTime)return void message(language.timeScheduleAdjust.prohibitForward);break;case 4:if(lmaxSeeTime)return void message(language.timeScheduleAdjust.prohibitForwardNotViewed)}seekTime=0,player.seek(l)}o>e.getWidth()-.5*a.getWidth()&&(o=e.getWidth()-.5*a.getWidth()),o<.5*a.getWidth()&&(o=.5*a.getWidth()),pSliderMouseDown=!0,t.css({width:o+"px"}),a.css({left:o-.5*a.getWidth()+"px"})}),e.mousemove(function(t){t=t||window.event;var a=getClient(t),r=e.offset(),i=a.x-r.left;v(),CT.full&&(i+=CK.offset().left);var o=0;vars.live?o=formatLiveTime(getLiveTime()*i/e.getWidth()):(o=duration*i/e.getWidth(),showPreview(o),o=formatSeconds(o)),tip(e,o,a),n.css({left:i-.5*C.bar.pbox.mouseLine.getWidth()+"px"})}),e.mouseout(function(e){v(),p=setTimeout(function(){showPreview(-1)},30)}),n.mouseover(v)},volumeDragY=function(){var e=C.bar.vbox.volume.box,t=C.bar.vbox.volume.bg,a=C.bar.vbox.volume.pp,n=C.bar.vbox.volume.slider,r=$(document),i=0,o=0,s=function(e){e.preventDefault&&e.preventDefault(),noScrolling(!0),e=e||window.event;var t=getClient(e);o=t.y,n.removeListener("mousedown",s),n.removeListener("touchstart",s),C.bar.vbox.mouseDown=!0,r.mousemove(l),r.mouseup(d),n.touchmove(l),n.touchend(d)},l=function(r){r=r||window.event;var s=getClient(r),l=n.offset(),d=e.offset(),u=t.offset();i=s.y-o,o=s.y;var c=l.top-d.top+i,p=u.top-d.top,v=u.top+t.getHeight()-d.top-n.getHeight();cv&&(c=v),n.css({top:c+"px"});var f=c-p+.5*n.getHeight();a.css({"margin-top":f+"px"});var m=(t.getHeight()-f-.5*n.getHeight())/(t.getHeight()-n.getHeight());player.volume(m)},d=function(){noScrolling(),r.removeListener("mousemove",l),r.removeListener("mouseup",d),n.removeListener("touchmove",l),n.removeListener("touchend",d),n.mousedown(s),n.touchstart(s),C.bar.vbox.mouseDown=!1};n.mousedown(s),n.touchstart(s);t.mousedown(function(e){e=e||window.event;var a=getClient(e),n=t.offset(),r=1-(a.y-n.top)/t.getHeight();player.volume(r)})},changeProgress=function(e){if(!("boolean"==valType(vars.live)&&vars.live||pSliderMouseDown)){var t=C.bar.pbox.bg,a=C.bar.pbox.slider,n=e/duration*100;"number"==valType(vars.live)&&(n="100"),C.bar.pbox.play.css({width:n+"%"});var r=a.getWidth()/t.getWidth()*100,i=n-.5*r;i<0&&(i=0),i>100-r&&(i=100-r),C.bar.pbox.slider.css({left:i+"%"}),checkProgressSlider()}},checkProgressSlider=function(){var e=C.bar.pbox.bg,t=C.bar.pbox.slider,a=0;C.bar.pbox.css("transition-duration")&&(a=1e3*parseFloat(C.bar.pbox.css("transition-duration"))+20);setTimeout(function(){var a=parseInt(C.bar.pbox.slider.css("left"));a<0&&(a=0,C.bar.pbox.slider.css({left:a+"px"})),a>e.getWidth()-t.getWidth()&&(a=e.getWidth()-t.getWidth(),C.bar.pbox.slider.css({left:a+"px"}))},a)},changeTopTime=function(){C.topBar.timeEle.htm(date("H:i:s")),setTimeout(changeTopTime,1e3)},changeVolumeSlider=function(e){if(!isUndefined(C.bar.vbox)){var t=C.bar.vbox.volume.box,a=C.bar.vbox.volume.bg,n=C.bar.vbox.volume.pp,r=C.bar.vbox.volume.slider;C.bar.vbox.volume.txt.htm(parseInt(100*e));var i=a.getHeight();if(i){var o=i-e*i;n.css({"margin-top":o+"px"});var s=a.offset().top-t.offset().top+o-.5*r.getHeight();r.css({top:s+"px"})}}},changeLoad=function(){if(video){var e=video.buffered.length;if(e>0){var t=video.buffered.end(e-1);loadTime=1e3&&(t+=a,i(e),e=0),n(r)},i=function(e){e!=CT.fps&&(CT.fps=e,replaceInformation("fps",e),eventTarget("fps",e))};isUndefined(CT.fps)&&(CT.fps=0),r()},getElement=function(e){var t=$(e);if(!isUndefined(t))return"htmlarray"==valType(t)&&(t=t[0]),isUndefined(t.captureParentNode)&&(t.captureParentNode=t.parentNode,t.prevElement=t.prev(),t.nextElement=t.next()),t},$=function(e,t){var a=null;document&&(a=document),isUndefined(t)||(a=t);var n=[];if(e)if("htmlobject"==valType(e)||"object"==valType(e)){if(!isUndefined((n=e).moeplayer))return n}else if("string"==valType(e)&&""!=e)switch(e.substr(0,1)){case".":if(e=e.substr(1,e.length),a.getElementsByClassName){if(!(n=a.getElementsByClassName(e)).length)return null}else if(!a&&document.getElementsByClassName){if(!(n=document.getElementsByClassName(e)).length)return null}else{var r=new RegExp(" "+e+" ","i"),i=null;i=a.getElementsByTagName?a.getElementsByTagName("*"):document.getElementsByTagName("*");for(var o=0;o1&&(n=t[1].substr(0,1).toLocaleUpperCase()+t[1].substr(1,t[1].length-1)),t.length>2&&(n=t[2].substr(0,1).toLocaleUpperCase()+t[2].substr(1,t[2].length-1)),a+n+""}return e};if(isUndefined(t)){if(!isUndefined(e)&&"string"==valType(e))return this.currentStyle?this.currentStyle[e]:document.defaultView.getComputedStyle(this,null)[e];if(isUndefined(e))return this.currentStyle?this.currentStyle:document.defaultView.getComputedStyle(this,null)}if("object"!=valType(e)){var n=a(e);if(this.length>1)for(var r=0;r=e+1?this[e]:null};for(o=0;ot&&(t=parseInt(n))}return t}function getWindowSize(){return{width:window.innerWidth,height:window.innerHeight}}function standardization(e,t){var a,n={};for(a in e)n[a]=e[a];for(a in t)a in n&&(n[a]=t[a]);return n}function mergeObj(e,t){var a,n={};for(a in e)n[a]=e[a];for(a in t)if(a in n)if("object"===valType(n[a]))"object"==valType(t[a])&&(n[a]=mergeObj(n[a],t[a]));else valType(n[a])==valType(t[a])&&(n[a]=t[a]);return n}function valType(e){if(void 0===e)return"undefined";var t=Object.prototype.toString.call(e).split(" ")[1].replace("]","").toLowerCase();return"html"!=t.substr(0,4)||"element"!=t.substr(-7)&&"document"!=t.substr(-8)&&"window"!=t||(t="htmlobject"),"htmlcollection"!=t&&"nodelist"!=t||(t="htmlarray"),t}function isUndefined(e){try{return"undefined"===valType(e)||null==e||"number"===valType(e)&&isNaN(e)}catch(e){return!0}return!1}function prev(e){var t=e.previousSibling;if(null==t)return null;if(3!=t.nodeType)return 1==t.nodeType&&t;var a=prev(t);return a&&1==a.nodeType?a:void 0}function next(e){var t=e.nextSibling;if(null==t)return null;if(3!=t.nodeType)return 1==t.nodeType&&t;var a=next(t);return a&&1==a.nodeType?a:void 0}function addListener(e,t,a,n){if(isUndefined(n)&&(n=!1),e.addEventListener)try{e.addEventListener(t,a,n)}catch(e){}else if(e.attachEvent)try{e.attachEvent("on"+t,a)}catch(e){}else e["on"+t]=a;return isUndefined(e.listenerList)&&(e.listenerList=[]),e.listenerList.push([t,a]),e}function removeListener(e,t,a,n){if(isUndefined(n)&&(n=!1),e.removeEventListener)try{e.removeEventListener(t,a,n)}catch(t){}else if(e.detachEvent)try{e.detachEvent("on"+t,a)}catch(t){}else e["on"+t]=null;if(!isUndefined(e.listenerList)){for(var r=[],i=0;i=4&&t>=6-r?(e=new Date(a.getFullYear()-1+"/12/31"),date("W",Math.round(e.getTime()/1e3))):1+(r<=3?(t+r)/7:(t-(7-r))/7)|0},F:function(){return o[s.n()]},m:function(){return n(s.n(),2)},M:function(){return s.F().substr(0,3)},n:function(){return a.getMonth()+1},t:function(){var e;return 2==(e=a.getMonth()+1)?28+s.L():1&e&&e<8||!(1&e)&&e>7?31:30},L:function(){var e=s.Y();return 3&e||!(e%100)&&e%400?0:1},Y:function(){return a.getFullYear()},y:function(){return(a.getFullYear()+"").slice(2)},a:function(){return a.getHours()>11?"pm":"am"},A:function(){return s.a().toUpperCase()},B:function(){var e=60*(a.getTimezoneOffset()+60),t=3600*a.getHours()+60*a.getMinutes()+a.getSeconds()+e,n=Math.floor(t/86.4);return n>1e3&&(n-=1e3),n<0&&(n+=1e3),1==String(n).length&&(n="00"+n),2==String(n).length&&(n="0"+n),n},g:function(){return a.getHours()%12||12},G:function(){return a.getHours()},h:function(){return n(s.g(),2)},H:function(){return n(a.getHours(),2)},i:function(){return n(a.getMinutes(),2)},s:function(){return n(a.getSeconds(),2)},O:function(){var e=n(Math.abs(a.getTimezoneOffset()/60*100),4);return e=a.getTimezoneOffset()>0?"-"+e:"+"+e},P:function(){var e=s.O();return e.substr(0,3)+":"+e.substr(3,2)},c:function(){return s.Y()+"-"+s.m()+"-"+s.d()+"T"+s.h()+":"+s.i()+":"+s.s()+s.P()},U:function(){return Math.round(a.getTime()/1e3)}};return e.replace(/([a-zA-Z])/g,function(e,t){return e!=t?t:s[t]?s[t]():t})}function dataURLtoBlob(e){for(var t=e.split(","),a=t[0].match(/:(.*?);/)[1],n=atob(t[1]),r=n.length,i=new Uint8Array(r);r--;)i[r]=n.charCodeAt(r);return new Blob([i],{type:a})}function decodeURIString(e){for(var t in e){if("string"==valType(e[t])&&e[t])try{e[t]=decodeURI(e[t])}catch(e){}"object"==valType(e[t])&&(e[t]=decodeURIString(e[t]))}return e}function getApp(){if(navigator.userAgent.toLowerCase().indexOf("iphone")>-1)return"iphone"}function cookie(e,t,a,n){isUndefined(a)&&(a=""),isUndefined(n)&&(n="/");var r=";domain="+a+";path="+n;"https"==location.protocol&&(r+=";SameSite=None;Secure=true");var i=function(e){var t,a=new RegExp("(^| )"+e+"=([^;]*)(;|$)");return(t=document.cookie.match(a))?unescape(t[2]):null};return isUndefined(e)||isUndefined(t)?!isUndefined(e)&&isUndefined(t)?i(e):void isUndefined(e):"delete"==t?(function(e){var t=new Date;t.setTime(t.getTime()-1);var a=i(e);null!=a&&(document.cookie=e+"="+a+";expires="+t.toGMTString()+r)}(e),null):(function(e,t){var a=new Date;a.setTime(a.getTime()+31104e6);try{document.cookie=e+"="+escape(t)+";expires="+a.toGMTString()+r}catch(e){console.error(e)}}(e,t),i(e))}function arrayToString(e){var t="";if(!isUndefined(e))for(var a=0;a0&&(t+=",");for(var r=0;r0&&(t+=";"),"number"==valType(n[r])?t+=parseInt(100*n[r]):t+=n[r]}return t}function stringToArray(e){var t=[];if(!isUndefined(e))for(var a=e.split(","),n=0;nt&&(t=parseInt(n))}return t}function getWindowSize(){return{width:window.innerWidth,height:window.innerHeight}}function prev(e){var t=e.previousSibling;if(null==t)return null;if(3!=t.nodeType)return 1==t.nodeType&&t;var a=prev(t);return a&&1==a.nodeType?a:void 0}function next(e){var t=e.nextSibling;if(null==t)return null;if(3!=t.nodeType)return 1==t.nodeType&&t;var a=next(t);return a&&1==a.nodeType?a:void 0}function addListener(e,t,a,n){if(isUndefined(n)&&(n=!1),e.addEventListener)try{e.addEventListener(t,a,n)}catch(e){}else if(e.attachEvent)try{e.attachEvent("on"+t,a)}catch(e){}else e["on"+t]=a;return isUndefined(e.listenerList)&&(e.listenerList=[]),e.listenerList.push([t,a]),e}function removeListener(e,t,a,n){if(isUndefined(n)&&(n=!1),e.removeEventListener)try{e.removeEventListener(t,a,n)}catch(t){}else if(e.detachEvent)try{e.detachEvent("on"+t,a)}catch(t){}else e["on"+t]=null;if(!isUndefined(e.listenerList)){for(var r=[],i=0;i-1)return"iphone"}function formatSeconds(e){isUndefined(e)&&(e=0);var t=parseInt(e);isUndefined(t)&&(t=0),t<0&&(t=0);var a=Math.floor(t/3600)<10?"0"+Math.floor(t/3600):Math.floor(t/3600),n="";return"00"!==a&&(n+=a+":"),n+=(Math.floor(t/60%60)<10?"0"+Math.floor(t/60%60):Math.floor(t/60%60))+":"+(Math.floor(t%60)<10?"0"+Math.floor(t%60):Math.floor(t%60))}function date(e,t){isUndefined(t)&&(t=new Date),t.toString().length<13&&(t*=1e3);var a=t?new Date(t):new Date,n=function(e,t){return(e+="").length=4&&t>=6-r?(e=new Date(a.getFullYear()-1+"/12/31"),date("W",Math.round(e.getTime()/1e3))):1+(r<=3?(t+r)/7:(t-(7-r))/7)|0},F:function(){return o[s.n()]},m:function(){return n(s.n(),2)},M:function(){return s.F().substr(0,3)},n:function(){return a.getMonth()+1},t:function(){var e;return 2==(e=a.getMonth()+1)?28+s.L():1&e&&e<8||!(1&e)&&e>7?31:30},L:function(){var e=s.Y();return 3&e||!(e%100)&&e%400?0:1},Y:function(){return a.getFullYear()},y:function(){return(a.getFullYear()+"").slice(2)},a:function(){return a.getHours()>11?"pm":"am"},A:function(){return s.a().toUpperCase()},B:function(){var e=60*(a.getTimezoneOffset()+60),t=3600*a.getHours()+60*a.getMinutes()+a.getSeconds()+e,n=Math.floor(t/86.4);return n>1e3&&(n-=1e3),n<0&&(n+=1e3),1==String(n).length&&(n="00"+n),2==String(n).length&&(n="0"+n),n},g:function(){return a.getHours()%12||12},G:function(){return a.getHours()},h:function(){return n(s.g(),2)},H:function(){return n(a.getHours(),2)},i:function(){return n(a.getMinutes(),2)},s:function(){return n(a.getSeconds(),2)},O:function(){var e=n(Math.abs(a.getTimezoneOffset()/60*100),4);return e=a.getTimezoneOffset()>0?"-"+e:"+"+e},P:function(){var e=s.O();return e.substr(0,3)+":"+e.substr(3,2)},c:function(){return s.Y()+"-"+s.m()+"-"+s.d()+"T"+s.h()+":"+s.i()+":"+s.s()+s.P()},U:function(){return Math.round(a.getTime()/1e3)}};return e.replace(/([a-zA-Z])/g,function(e,t){return e!=t?t:s[t]?s[t]():t})}function arrayToString(e){var t="";if(!isUndefined(e))for(var a=0;a0&&(t+=",");for(var r=0;r0&&(t+=";"),"number"==valType(n[r])?t+=parseInt(100*n[r]):t+=n[r]}return t}function stringToArray(e){var t=[];if(!isUndefined(e))for(var a=e.split(","),n=0;n0),isUndefined(CT)||null==CT)return null;"htmlarray"==valType(CT)&&(CT=CT.eq(0)),calculationFps(),existenceObj="string"==valType(vars.video)&&("."==vars.video.substr(0,1)&&-1==vars.video.indexOf("/")||"#"==vars.video.substr(0,1)),existenceObj&&(CK=CT.find(".moeplayer")?CT.find(".moeplayer").eq(0):null,CK&&(CM=CK.find(".ck-main")?CK.find(".ck-main").eq(0):null),CM&&(CV=CM.find(".ck-video")?CM.find(".ck-video").eq(0):null)),CK&&CM&&CV||(CT.htm(""),CK=createlDiv("moeplayer"),CT.append(CK),CM=createlDiv("ck-main"),CK.append(CM),CV=createlDiv("ck-video"),CM.append(CV)),video&&(video.remove(),video=null),existenceObj&&(video=$(vars.video)?$(vars.video).eq(0):null),video||(video=createlVideo(),video.attr("width","100%").attr("height","100%"),CV.append(video)),video.volume=vars.volume,vars.autoplay?(player.volume(0),player.muted(),recoveryVolume=!0,video.attr("autoplay","autoplay"),paused=!1):video.attr("preload","metadata"),CT.loop=vars.loop,CT.loop&&video.attr("loop","loop"),vars.controls?video.controls=!0:video.controls=!1;try{existenceObj||(video.attr("controlslist","nodownload"),video.attr("x-webkit-airplay","true"),video.attr("x5-video-orientation","portraint"),video.attr("playsinline","true"),video.attr("webkit-playsinline","true"),video.attr("x5-playsinline","true")),vars.crossOrigin&&(video.useCORS=!0,video.crossOrigin=vars.crossOrigin)}catch(e){}if(CT.smallWindows=!0,CT.webFull=!1,CT.theatre=!1,loadFace(),vars.rotate>0&&player.rotate(vars.rotate),vars.zoom>0&&player.zoom(vars.zoom),isUndefined(video.canPlayType))return CT.error={code:5,message:language.error.supportVideoError},eventTarget("error",CT.error),showError(),player;if(addAllListener(),!isUndefined(vars.loaded))if("function"==valType(vars.loaded))try{vars.loaded(player)}catch(e){}else if("string"==valType(vars.loaded))try{eval(vars.loaded+"(player)")}catch(e){}return changeVideo(existenceObj?video.attr("src"):vars.video),player},changeVideo=function(e){var t=0;if((video.attr("src")||video.htm())&&player.pause(),video.attr("src")&&!existenceObj&&(video.attr("src",""),video.removeAttr("src")),!isUndefined(video.textTracks)&&video.textTracks.length>0)for(t=video.find("track").length-1;t>-1;t--)video.find("track").eq(t).remove();existenceObj||video.htm(""),isUndefined(vars.ad)||(ad=vars.ad);var a="";if("string"==valType(e)){if("website:"==e.substr(0,8)||"url:"==e.substr(0,4)){var n="";return"website:"==e.substr(0,8)&&(n=e.substring(8)),"url:"==e.substr(0,4)&&(n=e.substring(4)),void ajax({url:n,success:function(e){null!=e?(vars=standardization(varsTemp,e),changeVideo(vars.video)):(CT.error={code:8,message:language.error.ajax},eventTarget("error",CT.error),showError())}})}vars.plug&&!canPlay(e)?plugPlayer(e):existenceObj||video.attr("src",e),loadTrack()}else if("array"==valType(e)){for(t=0;t1&&(a+='")}a&&video.htm(a),loadTrack()}else"object"==valType(e)&&(vars.plug?plugPlayer(e):(CT.error={code:10,message:language.error.emptied},eventTarget("error",CT.error),showError()),loadTrack());if(!isUndefined(video.find("source"))&&video.find("source").length>0&&video.find("source").eq(video.find("source").length-1).addListener("error",videoHandler.error),checkBar(),loadLogo(),isChangeDef&&checkDefinition(),vars.cookie&&("array"==valType(vars.cookie)&&vars.cookie.length>=2&&(vars.cookie[0]&&"string"==valType(vars.cookie[0])&&(cookieName=vars.cookie[0]),vars.cookie[1]&&"number"==valType(vars.cookie[1])&&(cookieTime=vars.cookie[1])),"object"!=valType(vars.cookie)||isUndefined(vars.cookie.name)||(cookieName=vars.cookie.name,isUndefined(vars.cookie.hour)||"number"!=valType(vars.cookie.hour)||(cookieTime=vars.cookie.hour)),"string"==valType(vars.cookie)&&(cookieName=vars.cookie),cookieName&&(cookieName=cookieName.replace(/[ ]*,[ ]*|[ ]+/g,"").replace(/[ ]*;[ ]*|[ ]+/g,""))),!isUndefined(vars.seek)&&!seekTime&&("number"==valType(vars.seek)&&vars.seek>0&&(seekTime=vars.seek),"string"==valType(vars.seek)&&"cookie"==vars.seek&&cookieName)){var i=player.cookie(cookieName);i&&(seekTime=i.time)}},plugPlayer=function(e){switch(vars.plug){case"hls.js":hlsPlayer(e);break;case"flv.js":flvPlayer(e);break;case"mpegts.js":mpegtsPlayer(e);break;case"dash.js":dashPlayer(e);break;default:"function"==valType(vars.plug)?vars.plug(video,e):(CT.error={code:10,message:language.error.emptied},eventTarget("error",CT.error),showError())}},hlsPlayer=function(e){var t=getPath("hls.js")+"hls.min.js";loadJs(t,function(){!isUndefined(Hls)&&Hls.isSupported()?((hls=new Hls).loadSource(e),hls.attachMedia(video),hls.on(Hls.Events.ERROR,function(e,t){var a=9,n=language.error.loadingFailed,r=t.fatal;isUndefined(t.response)||(isUndefined(t.response.code)||(a=t.response.code),!isUndefined(t.response.text)&&t.response.text?n=t.response.text:isUndefined(e)||(n=e)),CT.error={code:a,message:n},eventTarget("error",CT.error),r&&showError()})):canPlay(e)&&video.attr("src",e)})},flvPlayer=function(e){var t=getPath("flv.js")+"flv.min.js";loadJs(t,function(){if("undefined"!=typeof flvjs&&!isUndefined(flvjs)&&flvjs.isSupported()){var t={type:"flv",url:e};"object"==valType(e)&&(t=e),vars.live&&(t.isLive=!0),pugPlayer&&(pugPlayer.pause(),pugPlayer.unload(),pugPlayer.detachMediaElement(),pugPlayer.destroy(),pugPlayer=null),(pugPlayer=flvjs.createPlayer(t)).attachMediaElement(video),pugPlayer.load(),pugPlayer.on(flvjs.Events.METADATA_ARRIVED,function(e){videoHandler.loadedMetaData()}),pugPlayer.on(flvjs.Events.ERROR,function(e,t,a){CT.error={code:a.code,message:a.msg},eventTarget("error",CT.error),showError()})}})},mpegtsPlayer=function(e){var t=getPath("mpegts.js")+"mpegts.js";loadJs(t,function(){if("undefined"!=typeof mpegts&&!isUndefined(mpegts)&&mpegts.getFeatureList().mseLivePlayback){var t={type:"mse",url:e};"object"==valType(e)&&(t=e),vars.live&&(t.isLive=!0),pugPlayer&&(pugPlayer.pause(),pugPlayer.unload(),pugPlayer.detachMediaElement(),pugPlayer.destroy(),pugPlayer=null),(pugPlayer=mpegts.createPlayer(t)).attachMediaElement(video),pugPlayer.load(),pugPlayer.on(mpegts.Events.METADATA_ARRIVED,function(e){videoHandler.loadedMetaData()}),pugPlayer.on(mpegts.Events.ERROR,function(e,t,a){CT.error={code:a.code,message:a.msg},eventTarget("error",CT.error),showError()})}})},canPlay=function(e,t){var a=[{vidType:"video/ogg",codType:"theora, vorbis"},{vidType:"video/mp4",codType:"avc1.4D401E, mp4a.40.2"},{vidType:"video/mp4",codType:"avc1"},{vidType:"video/mp4",codType:"hevc"},{vidType:"video/webm",codType:"vp8.0, vorbis"},{vidType:"video/webm",codType:"vp9"},{vidType:"",codType:"application/x-mpegURL"},{vidType:"",codType:"application/vnd.apple.mpegurl"}],n={ogg:a[0],mp4:[a[1],a[2],a[3]],webm:[a[4],a[5]],m3u8:[a[6],a[7]]},r=[],i="",o=function(e){var t=e.vidType,a="";a=t?t+'; codecs="'+e.codType+'"':e.codType;var n=video.canPlayType(a);return""==n&&(n="no"),n},s=function(e){return e.replace(/.+\./,"")};if(isUndefined(t)){if("string"==valType(e))if(vars.type)for(i in a)a[i].vidType==vars.type&&r.push(a[i]);else if(s(e)&&s(e)in n){var l=n[s(e)];if("array"==valType(l))for(var d=0;d0)for(d=0;di&&t[n][0]!=cookieName&&r<19&&(o.push(t[n]),r++);t=o}else t.push([cookieName,e,i+3600*cookieTime]);t.length>0&&(cookie(moeplayerCookie,"delete",vars.domain,vars.cookiePath),cookie(moeplayerCookie,arrayToString(t),vars.domain,vars.cookiePath)),cookieArray=t},loadTrack=function(){if(!isUndefined(video.textTracks)){var e=0;if(!isUndefined(vars.track)&&"array"==valType(vars.track)&&!video.find("track")){var t="",a=vars.track;for(C.bar.track.show(),e=0;e"}if(video){var r=video.htm()+t;video.htm(r)}video.find("track")&&!loadedTrack&&(loadedTrack=!0,checkTrack())}}},loadedMetaData=function(){eventTarget("loadedMetaData",{width:CK.getWidth(),height:CK.getHeight(),videoWidth:CT.videoWidth,videoHeight:CT.videoHeight,duration:duration,volume:CT.volume}),eventTarget("duration",duration),"error"in C&&C.error.hide(),replaceInformation("videoWidth",CT.videoWidth),replaceInformation("videoHeight",CT.videoHeight),replaceInformation("volume",parseInt(100*CT.volume)),replaceInformation("duration",parseInt(duration)),documentHidden(function(e){vars.documentFocusPause&&("show"==e?!focusPause&&paused&&player.play():(focusPause=paused,player.pause()))})},videoHandler={loadStart:function(){vars.controls||"iphone"==app||C.loading.show(),C.centerPlay.hide(),eventTarget("loadstart")},canPlay:function(){C.loading.hide(),eventTarget("canplay")},loadedData:function(){eventTarget("loadeddata")},loadedMetaData:function(){duration=this.duration,!isUndefined(this.duration)&&vars.duration&&(duration=vars.duration),vars.live||(C.time.htm(formatSeconds(this.currentTime)+"/"+formatSeconds(duration)),C.tempTime.htm(formatSeconds(this.currentTime)+"/"+formatSeconds(duration))),C.loading.hide(),vars.poster&&video.attr("poster",vars.poster),vars.autoplay||vars.controls||(C.centerPlay.show(),C.buffer.hide()),CT.duration=duration,CT.videoWidth=this.videoWidth,CT.videoHeight=this.videoHeight,CT.volume=this.volume,(CT.videoWidth||CT.videoHeight||duration)&&loadedMetaData();var e=0;isUndefined(this.buffered)||(e=this.buffered.length),e>0&&changeLoad(),vars.live?changePreview():changePreview(vars.preview),isUndefined(vars.prompt)||"array"!=valType(vars.prompt)||vars.live?deletePrompt():changePrompt(),isChangeDef&&(checkDefinition(),isChangeDef=!1),pSliderMouseDown=!1,loadedmetadataNum++,!isUndefined(ad)&&!isUndefined(ad.frontPlay)&&ad.frontPlay&&loadedmetadataNum>1&&(player.play(),calculationAdFrontTime(duration)),isUndefined(ad)||isUndefined(ad.frontPlay)||ad.frontPlay||(player.volume(vars.volume),player.play()),!vars.autoplay&&loadMeta&&(loadMeta=!1,player.pause(),setTimeout(player.pause,300))},timeUpDate:function(){waited||(waited=!0,C.buffer.hide(),eventTarget("buffer","end")),this.buffered.length>0&&changeLoad(),!duration&&this.duration&&(duration=this.duration,CT.duration=duration,CT.videoWidth=this.videoWidth,CT.videoHeight=this.videoHeight,(CT.videoWidth||CT.videoHeight||duration)&&loadedMetaData()),oldTime=playTime,playTime=this.currentTime,maxSeeTime1&&calculationAdFrontTime(duration-playTime),isUndefined(C.error)||"block"!=C.error.css("display")||C.error.hide(),cookieName&&changeCookie(playTime),replaceInformation("audioDecodedByteCount",this.webkitAudioDecodedByteCount||this.audioDecodedByteCount||0),replaceInformation("videoDecodedByteCount",this.webkitVideoDecodedByteCount||this.videoDecodedByteCount||0)},ended:function(){isUndefined(ad)||isUndefined(ad.frontPlay)||!ad.frontPlay?(C.bar.playAndPause.pause.hide(),C.bar.playAndPause.play.hide(),C.bar.playAndPause.refresh.show(),eventTarget("ended"),showEnded(),message()):adFrontEnded()},error:function(e){if(!isUndefined(e.type)){var t=this.error,a=function(){var a=12,n=language.error.loadingFailed;isUndefined(t)?(CT.error={code:a,message:n},e.target.attr("src")&&showError()):(isUndefined(t.code)||(a=t.code),isUndefined(t.message)||(n=t.message),CT.error={code:a,message:n},showError()),eventTarget("error",CT.error)};if("error"==e.type)try{video.currentSrc?ajax({url:video.currentSrc,error:function(e){e&&"object"==valType(e)&&"code"in e&&e.code?(CT.error=e,eventTarget("error",CT.error),showError()):a()},success:function(e){e||a()}}):a()}catch(e){a()}}},stalled:function(){eventTarget("stalled"),CT.error={code:13,message:"load:stalled"},eventTarget("error",CT.error)},suspend:function(){eventTarget("suspend")},emptied:function(){eventTarget("emptied"),CT.error={code:7,message:language.error.emptied},eventTarget("error",CT.error)},seeked:function(){paused&&player.play(),pSliderMouseDown=!1,eventTarget("seek",{time:this.currentTime,state:"seeked"}),eventTarget("seeked")},seeking:function(){paused&&player.play();var e=this.currentTime;switch(-1==firstSeekTime&&(firstSeekTime=e),vars.timeScheduleAdjust){case 0:if(oldTime!=e)return waitingMessage=!1,player.seek(oldTime),void message(language.timeScheduleAdjust.prohibit);break;case 2:if(eoldTime)return waitingMessage=!1,player.seek(oldTime),void message(language.timeScheduleAdjust.prohibitForward);break;case 4:if(emaxSeeTime)return waitingMessage=!1,player.seek(maxSeeTime),void message(language.timeScheduleAdjust.prohibitForwardNotViewed)}eventTarget("seek",{time:e,state:"seeking"}),eventTarget("seeking"),vars.live||(C.time.htm(formatSeconds(e)+"/"+formatSeconds(duration)),C.tempTime.htm(formatSeconds(e)+"/"+formatSeconds(duration)))},waiting:function(){waited=!1,eventTarget("buffer","start"),C.centerPlay.hide(),vars.controls||C.buffer.show(),waitingMessage?message(language.waiting):waitingMessage=!0},play:function(){if(paused=!1,C.bar.playAndPause.play.hide(),C.bar.playAndPause.pause.show(),C.bar.playAndPause.refresh.hide(),C.centerPlay.hide(),"button"==playType?C.bar.pbox.removeClass("ck-bar-progress-out"):C.bar.pbox.addClass("ck-bar-progress-out"),recoveryVolume&&(recoveryVolume=!1,player.exitMuted()),hideBar(),closePauseAd(),playType="",isUndefined(C.ended)||player.closeLayer(C.ended),"error"in C&&C.error.hide(),eventTarget("play"),!isUndefined(ad)&&!isUndefined(ad.front)&&isUndefined(ad.frontPlay))return ad.frontPlayI=0,ad.frontPlay=!0,player.pause(),void adFrontPlay();seekTime&&(isUndefined(vars.live)||!isUndefined(vars.live)&&"boolean"==valType(vars.live)&&!vars.live)&&seekTime<.01*parseInt(100*duration)&&(player.seek(seekTime),seekTime=0)},pause:function(){paused=!0,isUndefined(ad)||isUndefined(ad.frontPlay)||!isUndefined(ad.frontPlay)&&!ad.frontPlay?isUndefined(ad)||isUndefined(ad.pause)?vars.controls||(C.centerPlay.show(),C.buffer.hide()):(isUndefined(ad.pausePlayI)&&(ad.pausePlayI=0),adPausePlay()):vars.controls||(C.centerPlay.show(),C.buffer.hide()),C.bar.playAndPause.pause.hide(),C.bar.playAndPause.play.show(),C.bar.playAndPause.refresh.hide(),C.bar.pbox.removeClass("ck-bar-progress-out"),checkProgressSlider(),eventTarget("pause"),C.bar.removeClass("ck-bar-out"),CM.removeClass("ck-nocursor")},volumeChange:function(){if(0!=this.volume||mutedState||(this.muted=!0),this.volume>0&&mutedState&&(this.muted=!1),mutedState!=this.muted&&(mutedState=this.muted,changeMuted(this.muted),CT.muted=this.muted,eventTarget("muted",CT.muted)),CT.volume=this.volume,eventTarget("volume",this.volume),!isUndefined(C.bar.vbox)){var e=parseInt(100*this.volume);C.bar.vbox.volume.txt.htm(e),C.bar.vbox.mouseDown||changeVolumeSlider(this.muted?0:this.volume),this.muted||message(language.volume+e+"%")}replaceInformation("volume",parseInt(100*this.volume))},resize:function(){var e=document.fullScreen||document.mozFullScreen||document.webkitIsFullScreen||document.msFullscreenElement;e?(C.bar.fullAndExit.exitFull.show(),C.bar.fullAndExit.full.hide(),C.ad.bottom.fullAndExit.exitFull.show(),C.ad.bottom.fullAndExit.full.hide(),CM.hasClass("ck-main-full")||CM.addClass("ck-main-full"),message(language.full),C.bar.webFullAndExit.hide(),C.bar.theatreAndExit.hide(),isUndefined(C.menu)||CM.append(C.menu)):(e=!1,C.bar.fullAndExit.full.show(),C.bar.fullAndExit.exitFull.hide(),C.ad.bottom.fullAndExit.full.show(),C.ad.bottom.fullAndExit.exitFull.hide(),CM.hasClass("ck-main-full")&&CM.removeClass("ck-main-full"),!isUndefined(vars.webFull)&&vars.webFull&&C.bar.webFullAndExit.show(),isUndefined(vars.theatre)||CT.webFull||C.bar.theatreAndExit.show(),isUndefined(C.menu)||$("body").append(C.menu),CV.css("width")!=CM.css("width")&&player.zoom(100)),CT.full!=e&&(CT.full=e,eventTarget("full",e)),checkVideoRotate(),changeProgress(player.time())},keydown:function(e){var t=(e=window.event||e).keyCode||e.which,a=player.volume(),n=function(){e.preventDefault?e.preventDefault():e.returnValue=!1};switch(t){case 32:n(),player.playOrPause();break;case 37:player.fastBack();break;case 39:player.fastNext();break;case 38:"number"==valType(vars.keyVolume)&&(1==vars.keyVolume||2==vars.keyVolume&&CT.full)&&(n(),player.volume(a+.1<1?a+=.1:1));break;case 40:"number"==valType(vars.keyVolume)&&(1==vars.keyVolume||2==vars.keyVolume&&CT.full)&&(n(),player.volume(a-.1>0?a-=.1:0))}},mouseWheel:function(e){if("number"==valType(vars.mouseWheelVolume)&&(1==vars.mouseWheelVolume||2==vars.mouseWheelVolume&&CT.full)){e=window.event||e;var t=player.volume();e.preventDefault?e.preventDefault():e.returnValue=!1,e.wheelDelta?(e.wheelDelta>0&&player.volume(t+.1<1?t+=.1:1),e.wheelDelta<0&&player.volume(t-.1>0?t-=.1:0)):e.detail&&(e.detail>0&&player.volume(t-.1>0?t-=.1:0),e.detail<0&&player.volume(t+.1<1?t+=.1:1))}}},adFrontPlay=function(){if(0==ad.frontPlayI&&(allBarHide(!1),C.ad.show(),ad.front.video=!1,isUndefined(ad.front.closeTime)||(ad.front.closeTime>0?(C.ad.top.closeTime.show(),adFrontCloseTime()):C.ad.top.closeAd.show())),isUndefined(ad.front.node)||null==ad.front.node||(CM.append(ad.front.node),player.closeLayer(ad.front.node),ad.front.node=null),C.ad.picture.htm(""),C.ad.picture.hide(),C.ad.link.hide(),!isUndefined(ad.front.list[ad.frontPlayI])){var e=ad.front.list[ad.frontPlayI];frontAdPlay=!0,eventTarget("frontAd",e),"picture"==e.type?adPicturePlay(e):"node"==e.type?adNode(e):(C.ad.link.attr("data-link",e.link),adVideoPlay(e.file)),isUndefined(e.link)?C.ad.bottom.details.hide():(C.ad.bottom.details.show(),C.ad.bottom.details.htm(''+language.details+""))}},adFrontCloseTime=function(){isUndefined(ad.front.closeSetTime)||(clearTimeout(ad.front.closeSetTime),ad.front.closeSetTime=null),C.ad.top.closeTime.htmReplace("{seconds}",ad.front.closeTime,language.closeTime),ad.front.closeTime--,ad.front.closeTime>0?ad.front.closeSetTime=setTimeout(adFrontCloseTime,1e3):(C.ad.top.closeAd.show(),C.ad.top.closeTime.hide())},calculationAdFrontTime=function(e){isUndefined(e)||(ad.front.list[ad.frontPlayI].time=e),ad.front.countDown=0;for(var t=ad.frontPlayI;t0?(e.time--,ad.front.countDown--,C.ad.top.countDown.htm(ad.front.countDown+language.second),adFrontSetTime=setTimeout(adFrontCountDown,1e3)):adFrontEnded()},adFrontEnded=function(){ad.frontPlayI0||i>0){if(e.link){var o=createlA("",e.link);o.append(this),C.ad.picture.append(o)}else C.ad.picture.append(this);t.unbind(),t.click(function(){eventTarget("frontAdClick",e)})}else a<10&&(a++,n())})};n(),calculationAdFrontTime(),adFrontCountDown(),C.ad.bottom.mutedAndExit.hide()}},adNode=function(e){isUndefined(e.content)||(ad.front.node=player.layer(e),ad.front.node.css({"z-index":1}),C.ad.append(ad.front.node),ad.front.node.unbind(),ad.front.node.click(function(){eventTarget("frontAdClick",e)}),calculationAdFrontTime(),adFrontCountDown(),C.ad.bottom.mutedAndExit.hide())},frontVideoClickHandler=function(){var e=C.ad.link.attr("data-link");window.open(e,"_blank")},closeFrontAd=function(){if(isUndefined(ad)||isUndefined(ad.front)||isUndefined(ad.front.closeButtonClick))player.closeFrontAd();else if("function"==valType(ad.front.closeButtonClick))try{ad.front.closeButtonClick()}catch(e){console.error(e)}else if("string"==valType(ad.front.closeButtonClick))try{eval(ad.front.closeButtonClick+"()")}catch(e){console.error(e)}},adPausePlay=function(){if(closePauseAd(),!isUndefined(ad)&&!isUndefined(ad.pause)&&!isUndefined(ad.pause.list)&&ad.pause.list.length-1>=ad.pausePlayI){var e=ad.pause.list[ad.pausePlayI];if(!isUndefined(ad.pause.close)&&ad.pause.close&&(ad.pauseClose=createlButton("ck-pause-close"),ad.pauseClose.click(function(){C.centerPlay.show(),C.buffer.hide(),closePauseAd()})),isUndefined(e.file))isUndefined(e.content)||(ad.pause.node=player.layer(e),ad.pauseClose&&ad.pause.node.append(ad.pauseClose),ad.pause.node.click(function(){eventTarget("pauseAdClick",e)}));else{var t=null,a=0,n=function(){t=createlImg(e.file),C.adPause.show(),C.adPause.htm(""),C.adPause.append(t),t.addListener("load",function(){var r=this.getWidth(),i=this.getHeight();if(r>0||i>0){if(C.adPause.htm(""),e.link){var o=createlA("",e.link);o.append(this),C.adPause.append(o)}else C.adPause.append(this);C.adPause.css({width:r+"px",height:i+"px"}),ad.pauseClose&&C.adPause.append(ad.pauseClose),t.click(function(){eventTarget("pauseAdClick",e)})}else a<10&&(a++,n())})};n()}eventTarget("pauseAd",e),!isUndefined(e.time)&&e.time>0&&(adPauseSetTime=setTimeout(function(){ad.pausePlayI++,ad.pausePlayI>ad.pause.list.length-1&&(ad.pausePlayI=0),adPausePlay()},1e3*e.time))}},closePauseAd=function(){adPauseSetTime&&(clearTimeout(adPauseSetTime),adPauseSetTime=null),C.adPause.hide(),isUndefined(ad)||isUndefined(ad.pauseClose)||null==ad.pauseClose||(ad.pauseClose.remove(),ad.pauseClose=null),isUndefined(ad)||isUndefined(ad.pause)||isUndefined(ad.pause.node)||!ad.pause.node||(ad.pause.node.unbind(),player.closeLayer(ad.pause.node),eventTarget("pauseAdClose"))},player={width:function(e){return isUndefined(e)||("number"==valType(e)&&(e+="px"),CT.css({width:e}),checkVideoRotate()),CK.getWidth()},height:function(e){return isUndefined(e)||("number"==valType(e)&&(e+="px"),CT.css({height:e}),checkVideoRotate()),CK.getHeight()},videoWidth:function(){return video?video.videoWidth:null},videoHeight:function(){return video?video.videoHeight:null},zoom:function(e){if(!isUndefined(e)&&("function"==valType(e)&&newEvent.addEventListener("zoom",e),"number"==valType(e))){for(var t=[C.topBar.zoomEle.zoom50,C.topBar.zoomEle.zoom75,C.topBar.zoomEle.zoom100],a=0;ae&&e>0?a=t[e]:t.indexOf(e)>-1&&(a=e),a!=nowRotate&&(eventTarget("rotate",a),nowRotate=a,checkVideoRotate())}},vars:function(e,t){if(!isUndefined(e)){if("string"==valType(e)&&!isUndefined(t)){var a={};a[e]=t,e=a}var n=!1;for(var r in e)if(r in vars&&e[r]!=vars[r]){n=!0;break}n&&(vars=standardization(vars,e)),isUndefined(e.video)||(isChangeDef=!0,changeVideo(vars.video)),isUndefined(e.title)||C.topBar.titleEle.htm(e.title)}},loadstart:function(e){isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("loadstart",e)},loadeddata:function(e){isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("loadeddata",e)},loadedMetaData:function(e){isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("loadedMetaData",e)},canplay:function(e){isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("canplay",e)},play:function(e){if("object"==valType(e)&&(e.target!=C.bar.playAndPause.play&&e.target!=C.bar.playAndPause.refresh||(playType="button")),isUndefined(e)||"function"!=valType(e)){if(loadedmetadataNum>0&&video)try{video.play()}catch(e){console.error(e)}}else newEvent.addEventListener("play",e);return player},pause:function(e){if(isUndefined(e)||"function"!=valType(e)){if(loadedmetadataNum>0&&video)try{video.pause()}catch(e){console.error(e)}}else newEvent.addEventListener("pause",e);return player},playOrPause:function(){return paused?player.play():player.pause(),player},volume:function(e){if(isUndefined(e)){if(video)return video.volume}else"function"==valType(e)?newEvent.addEventListener("volume",e):"number"==valType(e)&&video&&(e<0&&(e=0),e>1&&(e=1),video.muted&&(video.volume=.5*e),video.volume=e);return player},muted:function(e){return isUndefined(e)||"function"!=valType(e)?video&&(video.muted=!0):newEvent.addEventListener("muted",e),player},exitMuted:function(){return video&&(video.muted=!1,0==video.volume&&player.volume(vars.volume>0?vars.volume:.8)),player},time:function(e){if(isUndefined(e)||"function"!=valType(e)){if(video)return video.currentTime||0}else newEvent.addEventListener("time",e)},seek:function(e){if(!isUndefined(e)&&("function"==valType(e)&&newEvent.addEventListener("seek",e),"number"==valType(e)&&video)){switch(vars.timeScheduleAdjust){case 0:return void message(language.timeScheduleAdjust.prohibit);case 1:break;case 2:if(eoldTime)return void message(language.timeScheduleAdjust.prohibitForward);break;case 4:if(emaxSeeTime)return waitingMessage=!1,video.currentTime=maxSeeTime,void message(language.timeScheduleAdjust.prohibitForwardNotViewed)}pSliderMouseDown=!1,video.currentTime=e}return player},buffer:function(e){return isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("buffer",e),player},ended:function(e){return isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("ended",e),player},next:function(e){return isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("next",e),player},error:function(e){return isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("error",e),player},emptied:function(e){return isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("emptied",e),player},duration:function(e){if(isUndefined(e)||"function"!=valType(e))return duration||0;newEvent.addEventListener("duration",e)},playbackRate:function(e){if(isUndefined(e))return video.playbackRate;"function"==valType(e)?newEvent.addEventListener("playbackRate",e):"number"==valType(e)&&video&&(video.playbackRate=e,CT.playbackRate=e,eventTarget("playbackRate",e),changePlaybackrateVal(e))},track:function(e){if(isUndefined(e))return CT.track;if("function"==valType(e))newEvent.addEventListener("track",e);else if("number"==valType(e)&&video){var t=null;if(isUndefined(video.textTracks)||(t=video.textTracks),t&&"texttracklist"==valType(t)){for(var a=vars.track,n=t.length-1;n>-1;n--)video.find("track").eq(n).remove();for(n=0;n"}if(video){var i=video.htm()+t;video.htm(i)}changeTrackVal(e)}}},fastBack:function(e){if(0!=duration){(isUndefined(e)||"number"!=valType(e))&&(e=20);var t=player.time();return t-e>0?t-=e:t=0,player.seek(t),player}},fastNext:function(e){if(0!=duration){(isUndefined(e)||"number"!=valType(e))&&(e=20);var t=player.time();return t+e200&&(r=200),isUndefined(n.cssDisplay)&&(n.cssPosition=n.css("position"),n.cssDisplay=n.css("display")),n.css({position:"absolute","z-index":r}),a?C.bar.append(n):CM.append(n),n.CK=CK,n.show()}return n},closeLayer:function(e){if("string"==valType(e)){var t=$(e);isUndefined(t)||t.length>0&&(e=t.eq(0))}if(!isUndefined(e)&&"htmlobject"==valType(e)){if(isUndefined(e.captureParentNode))e.remove();else{var a=e.captureParentNode;if(e.nextElement)try{a.insertBefore(e,e.nextElement)}catch(t){a.append(e)}else if(e.prevElement)try{a.insertAfter(e,e.prevElement)}catch(t){a.append(e)}else a.append(e);e.css({display:e.cssDisplay})}isUndefined(e.cssDisplay)||e.css({display:e.cssDisplay,position:e.cssPosition})}return player},message:function(e){return message(e),player},closeFrontAd:function(){return!frontAdPlay||isUndefined(ad)||isUndefined(ad.front)||isUndefined(ad.front.list)||(ad.frontPlayI=ad.front.list.length-1,adFrontEnded(),clearAdFrontSetTime()),player},addListener:function(e,t){newEvent.addEventListener(e,t)},removeListener:function(e,t){newEvent.removeEventListener(e,t)},bar:function(e){barShow=e,e?C.bar.show():C.bar.hide()},rightBar:function(e){rightBarShow=e,e?C.rightBar.show():C.rightBar.hide()},mouseActive:function(e){return isUndefined(e)||"function"!=valType(e)||newEvent.addEventListener("mouseActive",e),this},cookie:function(e){if("delete"==e)return cookie(moeplayerCookie,"delete",vars.domain),null;!isUndefined(e)&&e&&(e=e.replace(/[ ]*,[ ]*|[ ]+/g,"").replace(/[ ]*;[ ]*|[ ]+/g,""));var t=cookie(moeplayerCookie);if(t){var a=stringToArray(t),n=[],r=parseInt(.001*Date.now());for(i=0;ir&&n.push(a[i]);if((a=n).length>0){cookie(moeplayerCookie,"delete",vars.domain,vars.cookiePath),cookie(moeplayerCookie,arrayToString(a),vars.domain,vars.cookiePath);for(var i=0;i-1;a--){var n=createlButton("ck-list-p",e[a]+language.playbackrateSuffix);n.attr("data-i",a).attr("data-val",e[a]),C.bar.playbackrate.bg.p.push(n),C.bar.playbackrate.bg.append(n),n.click(playbackrateClick)}if(C.bar.playbackrate.hide(),!isUndefined(vars.playbackrateOpen)&&vars.playbackrateOpen){C.bar.playbackrate.show(),C.bar.playbackrate.bgbox.show();var r=C.bar.playbackrate.bg.getWidth(),i=C.bar.playbackrate.bg.getHeight(),o=C.bar.playbackrate.button.getWidth();C.bar.playbackrate.bg.css({width:r+10+"px"}),r=C.bar.playbackrate.bg.getWidth(),getBarHeight()>C.bar.getHeight()&&(i+=getBarHeight()-C.bar.getHeight()),C.bar.playbackrate.bgbox.attr("style",""),C.bar.playbackrate.bgbox.css({width:r+"px",height:i+2+"px",left:.5*-(r-o)+"px"}),C.bar.playbackrate.button.mouseover(function(){r=C.bar.playbackrate.bg.getWidth(),o=C.bar.playbackrate.button.getWidth(),C.bar.playbackrate.bgbox.css({left:.5*-(r-o)+"px"})}),changePlaybackrateVal(t)}},playbackrateClick=function(e){C.bar.playbackrate.bgbox.hide(),setTimeout(function(){C.bar.playbackrate.bgbox.removeCss("display")},300),message(language.switchTo+$(this).htm()),player.playbackRate(parseFloat($(this).attr("data-val")))},changePlaybackrateVal=function(e){C.bar.playbackrate.bg.find("button").each(function(t,a){var n=parseFloat(a.attr("data-val"));a.removeClass("ck-list-p-focus"),e==n?(a.addClass("ck-list-p-focus"),1!=e?C.bar.playbackrate.button.htm(a.htm()):C.bar.playbackrate.button.htm(language.playbackrate)):a.removeClass("ck-list-p-focus")})},checkTrack=function(){var e=vars.track,t=-1;C.bar.track.bgbox.htm(""),C.bar.track.bg=createlDiv("ck-list-bg"),C.bar.track.bgbox.append(C.bar.track.bg),C.bar.track.bg.p=[];for(var a=null,n=e.length-1;n>-1;n--)(a=createlButton("ck-list-p",e[n].label)).attr("data-i",n).attr("data-title",e[n].label),C.bar.track.bg.p.push(a),C.bar.track.bg.append(a),!isUndefined(e[n].default)&&e[n].default&&(t=n),a.click(trackClick);(a=createlButton("ck-list-p",language.noTrack)).attr("data-i",-1).attr("data-title",language.noTrack),C.bar.track.bg.p.push(a),C.bar.track.bg.append(a),a.click(trackClick),C.bar.track.hide(),C.bar.track.show(),C.bar.track.bgbox.show();var r=C.bar.track.bg.getWidth(),i=C.bar.track.bg.getHeight(),o=C.bar.track.button.getWidth();C.bar.track.bg.css({width:r+10+"px"}),r=C.bar.track.bg.getWidth(),getBarHeight()>C.bar.getHeight()&&(i+=getBarHeight()-C.bar.getHeight()),C.bar.track.bgbox.attr("style",""),C.bar.track.bgbox.css({width:r+"px",height:i+2+"px",left:.5*-(r-o)+"px"}),C.bar.track.button.mouseover(function(){r=C.bar.track.bg.getWidth(),o=C.bar.track.button.getWidth(),C.bar.track.bgbox.css({left:.5*-(r-o)+"px"})}),changeTrackVal(t)},trackClick=function(e){C.bar.track.bgbox.hide(),setTimeout(function(){C.bar.track.bgbox.removeCss("display")},300),message(language.switchTo+$(this).attr("data-title")),player.track(parseFloat($(this).attr("data-i")))},changeTrackVal=function(e){C.bar.track.bg.find("button").each(function(t,a){var n=parseInt(a.attr("data-i"));e==n?(C.bar.track.button.htm(a.attr("data-title")),n>-1?(CT.track=vars.track[n],eventTarget("track",vars.track[n])):(CT.track=null,eventTarget("track",null)),a.addClass("ck-list-p-focus")):a.removeClass("ck-list-p-focus")})},checkDefinition=function(){var e=-1,t=video.currentSrc;if(isUndefined(C.bar.definition.bg)||(C.bar.definition.bgbox.htm(""),C.bar.definition.bgbox.attr("style",""),C.bar.definition.button.htm(language.definition)),"array"==valType(vars.video)){var a=vars.video;C.bar.definition.bg=createlDiv("ck-list-bg"),C.bar.definition.bgbox.append(C.bar.definition.bg),C.bar.definition.bg.p=[];for(var n=a.length-1;n>-1;n--){var r=createlButton("ck-list-p",a[n][2]);r.attr("data-i",n).attr("data-video",a[n][0]).attr("data-type",a[n][1]).attr("data-title",a[n][2]),C.bar.definition.bg.p.push(r),C.bar.definition.bg.append(r),t&&t.indexOf(a[n][0])>-1&&(e=n),r.click(definitionClick)}C.bar.definition.show(),C.bar.definition.bgbox.show();var i=C.bar.definition.bg.getWidth(),o=C.bar.definition.bg.getHeight(),s=C.bar.definition.button.getWidth();C.bar.definition.bg.css({width:i+10+"px"}),i=C.bar.definition.bg.getWidth(),getBarHeight()>C.bar.getHeight()&&(o+=getBarHeight()-C.bar.getHeight()),C.bar.definition.bgbox.attr("style",""),C.bar.definition.bgbox.css({width:i+"px",height:o+2+"px",left:.5*-(i-s)+"px"}),C.bar.definition.button.mouseover(function(){i=C.bar.definition.bg.getWidth(),s=C.bar.definition.button.getWidth(),C.bar.definition.bgbox.css({left:.5*-(i-s)+"px"})})}e>-1&&C.bar.definition.bg.find("button").each(function(t,a){var n=parseInt(a.attr("data-i"));e==n?a.addClass("ck-list-p-focus"):a.removeClass("ck-list-p-focus")})},definitionClick=function(e){C.bar.definition.bgbox.hide(),setTimeout(function(){C.bar.definition.bgbox.removeCss("display")},300),changeDefinition(parseInt($(this).attr("data-i")))},changeDefinition=function(e){C.bar.definition.bg.find("button").each(function(t,a){var n=parseInt(a.attr("data-i"));if(e==n){if(!isUndefined(video.textTracks)&&video.textTracks.length>0)for(var r=video.find("track").length-1;r>-1;r--)video.find("track").eq(r).remove();seekTime=player.time(),video.attr("autoplay","autoplay"),changeVideo(a.attr("data-video")),message(language.switchTo+a.htm()),C.bar.definition.button.htm(a.htm()),a.addClass("ck-list-p-focus"),eventTarget("definition",{id:n,video:a.attr("data-video"),title:a.attr("data-title")})}else a.removeClass("ck-list-p-focus")})},deletePrompt=function(){var e=0;if(!isUndefined(C.prompt)&&"array"==valType(C.prompt)){for(e=C.prompt.length;e>-1;e--)isUndefined(C.prompt[e])||C.prompt[e].remove();C.prompt=null}C.prompt=[]},changePrompt=function(){deletePrompt();for(var e=0;e100&&(r=100),a.css({left:r+"%"}),a.mouseover(function(){this.attr("data-words")&&showPromptWords(this)}),a.mouseout(function(){this.attr("data-words")&&showPromptWords()}),C.prompt.push(a)}}},showPromptWords=function(e){if(isUndefined(C.promptWords)&&(C.promptWords=createlDiv("ck-prompt-words"),CM.append(C.promptWords),C.promptWords.content=createlDiv("ck-prompt-content"),C.promptWords.append(C.promptWords.content)),isUndefined(e))return C.promptWords.content.htm(""),void C.promptWords.hide();C.promptWords.content.htm(e.attr("data-words")),C.promptWords.show();var t=C.promptWords.getWidth(),a=C.promptWords.getHeight(),n=(C.bar.pbox.bg,parseFloat(e.attr("data-time")),CK.getHeight()-getBarHeight()),r=e.offset().left-CK.offset().left+.5*e.getWidth()-.5*t;isUndefined(C.preview)?(n=CK.getHeight()-parseFloat(getBarHeight()+C.tip.minHeight+parseInt(C.tip.css("margin-bottom"))),n-=getBarHeight()-C.bar.getHeight()):n=CK.getHeight()-parseFloat(getBarHeight()+C.preview.smallHight+parseInt(C.preview.css("margin-bottom"))),n-=parseFloat(C.promptWords.css("margin-bottom")),n-=a,(r-=parseFloat(C.promptWords.css("margin-right")))<0&&(r=0),r>CK.getWidth()-t&&(r=CK.getWidth()-t),C.promptWords.css({top:n+"px",left:r+"px"})},changePreview=function(e){if(isUndefined(C.preview)||(C.preview.remove(),C.preview=null),!isUndefined(e)){C.preview=createlDiv("ck-preview"),CM.append(C.preview),isUndefined(vars.preview.type)&&(vars.preview.type=0),1==vars.preview.type&&(C.preview.bg=createlDiv("ck-preview-bg"),C.preview.append(C.preview.bg));var t=[];if("object"==valType(vars.preview))if("array"==valType(vars.preview.file)){t=vars.preview.file;var a=[10,10];if("array"==valType(vars.preview.thumbnail)&&vars.preview.thumbnail.length>1&&("number"==valType(vars.preview.thumbnail[0])&&(a[0]=vars.preview.thumbnail[0]),"number"==valType(vars.preview.thumbnail[1])&&(a[1]=vars.preview.thumbnail[1]),vars.preview.thumbnail=a),t[0]){var n=createlImg(t[0],"ck-preview-load-img").addListener("load",function(){!function(e,a,n,r){if(1==vars.preview.type){C.preview.bg.img=[];for(var i=0;i0){isUndefined(vars.preview.type)&&(vars.preview.type=0);var t=2,a=vars.preview.thumbnail;isUndefined(vars.preview.scale)||(t=vars.preview.scale);var n=0,r=0,i=0,o=0,s=0,l=C.preview.smallWidth,d=C.preview.smallHight,u=e*C.bar.pbox.bg.getWidth()/duration+(C.bar.pbox.bg.offset().left-CK.offset().left);if("none"==C.preview.css("display")&&C.preview.show(),C.preview.css({height:d+"px"}),1==vars.preview.type){n=parseInt(e/(t*a[0])),r=parseInt(e/t);var c=n-5,p=n+5;c<0&&(c=0),p>C.preview.bg.img.length-1&&(p=C.preview.bg.img.length-1);for(var v=c;vC.preview.getWidth()-C.preview.frame.getWidth()){var m=o-(C.preview.getWidth()-C.preview.frame.getWidth());o=C.preview.getWidth()-C.preview.frame.getWidth(),i-=m}C.preview.bg.css({left:i+"px"}),C.preview.frame.css({left:o+"px"})}else{var h=e/t/(a[0]*a[1]);r=parseInt(h);var b=parseInt(100*(h-r)),g=parseInt(b/a[0]),y=b%a[0],k=vars.preview.file;(i=u-.5*l)<0&&(i=0),i>CK.getWidth()-l&&(i=CK.getWidth()-l),C.preview.css({width:C.preview.smallWidth+"px",background:"url("+k[r]+") no-repeat","background-position":"-"+y*l+"px -"+g*d+"px",left:i+"px"})}}},showError=function(){if(C.loading.hide(),!vars.controls&&vars.errorShow){isUndefined(C.error)&&(C.error=createlDiv("ck-error"),CM.append(C.error));var e=CT.error.message;e||(e=language.error.noMessage);var t=e+"(code:"+CT.error.code+")";C.error.htm(t),C.error.show()}},showWindowsError=function(e){var t=createlDiv("moeplayer-error",e);$("body").append(t)},showNextEpisode=function(){if(!isUndefined(vars.next)){if("object"==valType(vars.next)){if("content"in vars.next)return void(C.next=player.layer(vars.next));if("title"in vars.next)return void tip(C.bar.nextEpisode,vars.next.title)}tip(C.bar.nextEpisode,language.next)}},nextClick=function(){"object"==valType(vars.next)&&("click"in vars.next&&("function"==valType(vars.next.click)?vars.next.click():"string"==valType(vars.next.click)&&eval(vars.next.click+"()")),"link"in vars.next&&(window.location.href=vars.next.link),eventTarget("next"))},showEnded=function(){if(!CT.loop&&!isUndefined(vars.ended))return closePauseAd(),C.ended=player.layer(vars.ended),void(C.ended&&C.centerPlay.hide())},windowScroll=function(){CT.smallWindows&&(CT.webFull||CT.theatre||CT.full?exitSmallWindows():(document.documentElement.scrollTop||document.body.scrollTop)>CT.offset().top+CT.getHeight()?CK.hasClass("moeplayer-smallwindow")||(CK.addClass("moeplayer-smallwindow"),eventTarget("smallWindows",!0),smallWindowsState=!0,vars.smallWindowsDrag&&drag(!0),allBarHide(),checkVideoRotate()):exitSmallWindows())},exitSmallWindows=function(){CK.hasClass("moeplayer-smallwindow")&&(CK.removeClass("moeplayer-smallwindow"),vars.smallWindowsDrag&&drag(),eventTarget("smallWindows",!1),smallWindowsState=!1,allBarShow(),checkVideoRotate())},drag=function(e){var t=$(document),a=0,n=0,r=0,i=0,o=!1;isUndefined(e)||(o=e);var s=function(e){e=e||window.event;var t=getClient(e),o=CK.offset();n=t.y-i,a=t.x-r,r=t.x,i=t.y;var s=o.left+a,l=o.top+n;CK.css({left:s+"px",top:l+"px"}),"fixed"!=CK.css("position")&&CK.css({position:"fixed"}),isDrag=!0},l=function(){t.removeListener("mousemove",s),t.removeListener("mouseup",l),CK.css({cursor:"default"})};o?CK.mousedown(function(e){e.preventDefault&&e.preventDefault(),e=e||window.event;var a=getClient(e);r=a.x,i=a.y,t.mousemove(s),t.mouseup(l),CK.css({cursor:"move"})}):CK.unbind("mousedown")},checkVideoRotate=function(){var e=CK.getWidth()*nowZoom*.01,t=CK.getHeight()*nowZoom*.01,a=CV.getWidth(),n=CV.getHeight();if(CV.css({transform:"rotate("+nowRotate+"deg)","-ms-transform":"rotate("+nowRotate+"deg)","-moz-transform":"rotate("+nowRotate+"deg)","-webkit-transform":"rotate("+nowRotate+"deg)","-o-transform":"rotate("+nowRotate+"deg)",width:nowZoom+"%",height:nowZoom+"%"}),0!=nowRotate&&180!=nowRotate){if(n>e&&a>t)return void(n/e>a/t?CV.css({height:nowZoom+"%",width:t+"px"}):CV.css({width:nowZoom+"%",height:e+"px"}));if(nt?CV.css({height:nowZoom+"%",width:t+"px"}):n/a>=e/t?CV.css({width:nowZoom+"%",height:e+"px"}):CV.css({height:nowZoom+"%",width:t+"px"}));if(n>=e&&a<=t)return void CV.css({width:nowZoom+"%",height:e+"px"});a>=t&&nC.bar.getHeight()&&(d-=getBarHeight()-C.bar.getHeight()),l=i>s?n.left-r.left-.5*(i-s):n.left-r.left+.5*(s-i),"left"==a&&(l=n.left-r.left-i,d=n.top-r.top),isUndefined(t)||(l=t.x-r.left-.5*i),l<0&&(l=0),d<0&&(d=0),l>CM.getWidth()-i&&(l=CM.getWidth()-i),d>CM.getHeight()-o&&(d=CM.getHeight()-o),C.tip.css({left:l+"px",top:d-parseInt(C.tip.css("margin-bottom"))+"px"})},progressDragX=function(){var e=C.bar.pbox.bg,t=C.bar.pbox.play,a=C.bar.pbox.slider,n=C.bar.pbox.mouseLine;a.unbind(),e.unbind();var r=0,i=0,o=$(document),s=0,l=function(t){if(t.preventDefault&&t.preventDefault(),vars.timeScheduleAdjust){t=t||window.event;var n=a.offset(),r=e.offset(),c=getClient(t);pSliderMouseDown=!0,i=c.x;var p=n.left-r.left;s=p*duration/(e.getWidth()-a.getWidth()),a.removeListener("mousedown",l),a.removeListener("touchstart",l),o.mousemove(d),o.mouseup(u),a.touchmove(d),a.touchend(u),noScrolling(!0)}},d=function(n){n=n||window.event;var o=a.offset(),l=e.offset(),d=getClient(n);pSliderMouseDown=!0,r=i-d.x,i=d.x;var u=o.left-r-l.left;u<0&&(u=0),u>e.getWidth()-a.getWidth()&&(u=e.getWidth()-a.getWidth()),C.bar.pbox.addClass("ck-bar-progress-slider-move");var c="";if(vars.live)c=formatLiveTime(u*getLiveTime()/(e.getWidth()-a.getWidth()));else{switch(c=u*duration/(e.getWidth()-a.getWidth()),vars.timeScheduleAdjust){case 2:cs)return u=-1e3,void message(language.timeScheduleAdjust.prohibitForward);break;case 4:if(cmaxSeeTime)return u=-1e3,player.seek(maxSeeTime),void message(language.timeScheduleAdjust.prohibitForwardNotViewed)}c=formatSeconds(c)}tip(a,c),u>=0?(a.css({left:u+"px"}),t.css({width:u+.5*a.getWidth()+"px"})):pSliderMouseDown=!1},u=function(){if(noScrolling(),o.removeListener("mousemove",d),o.removeListener("mouseup",u),a.removeListener("touchmove",d),a.removeListener("touchend",u),a.mousedown(l),a.touchstart(l),vars.live){var n=parseInt(vars.live+t.getWidth()*getLiveTime()/(e.getWidth()-.5*a.getWidth()));eventTarget("playback",{time:n,date:date("Y-m-d H:i:s",n)}),eventTarget("seek",{time:n,state:"seeking",date:date("Y-m-d H:i:s",n)})}else{var r=t.getWidth()*duration/(e.getWidth()-.5*a.getWidth());r>duration&&(r=duration),seekTime=0,player.seek(r)}C.bar.pbox.removeClass("ck-bar-progress-slider-move"),c&&tip()},c=!0;a.mousedown(l),a.mouseover(function(){var t="";t=vars.live?language.live:formatSeconds(parseInt(a.css("left"))*duration/(e.getWidth()-a.getWidth())),c=!1,tip(a,t)}),a.mouseleave(function(){c=!0}),a.touchstart(l);var p=null,v=(p=null,function(){p&&(clearTimeout(p),p=null),closeTipFun()});e.mousedown(function(n){n=n||window.event;var r=getClient(n),i=e.offset(),o=r.x-i.left;if(CT.full&&(o+=CK.offset().left),vars.live){var s=parseInt(vars.live+getLiveTime()*o/e.getWidth());eventTarget("playback",{time:s,date:date("Y-m-d H:i:s",s)}),eventTarget("seek",{time:s,state:"seeking",date:date("Y-m-d H:i:s",s)})}else{var l=duration*o/e.getWidth();switch(vars.timeScheduleAdjust){case 0:return void message(language.timeScheduleAdjust.prohibit);case 2:if(loldTime)return void message(language.timeScheduleAdjust.prohibitForward);break;case 4:if(lmaxSeeTime)return void message(language.timeScheduleAdjust.prohibitForwardNotViewed)}seekTime=0,player.seek(l)}o>e.getWidth()-.5*a.getWidth()&&(o=e.getWidth()-.5*a.getWidth()),o<.5*a.getWidth()&&(o=.5*a.getWidth()),pSliderMouseDown=!0,t.css({width:o+"px"}),a.css({left:o-.5*a.getWidth()+"px"})}),e.mousemove(function(t){t=t||window.event;var a=getClient(t),r=e.offset(),i=a.x-r.left;v(),CT.full&&(i+=CK.offset().left);var o=0;vars.live?o=formatLiveTime(getLiveTime()*i/e.getWidth()):(o=duration*i/e.getWidth(),showPreview(o),o=formatSeconds(o)),tip(e,o,a),n.css({left:i-.5*C.bar.pbox.mouseLine.getWidth()+"px"})}),e.mouseout(function(e){v(),p=setTimeout(function(){showPreview(-1)},30)}),n.mouseover(v)},volumeDragY=function(){var e=C.bar.vbox.volume.box,t=C.bar.vbox.volume.bg,a=C.bar.vbox.volume.pp,n=C.bar.vbox.volume.slider,r=$(document),i=0,o=0,s=function(e){e.preventDefault&&e.preventDefault(),noScrolling(!0),e=e||window.event;var t=getClient(e);o=t.y,n.removeListener("mousedown",s),n.removeListener("touchstart",s),C.bar.vbox.mouseDown=!0,r.mousemove(l),r.mouseup(d),n.touchmove(l),n.touchend(d)},l=function(r){r=r||window.event;var s=getClient(r),l=n.offset(),d=e.offset(),u=t.offset();i=s.y-o,o=s.y;var c=l.top-d.top+i,p=u.top-d.top,v=u.top+t.getHeight()-d.top-n.getHeight();cv&&(c=v),n.css({top:c+"px"});var f=c-p+.5*n.getHeight();a.css({"margin-top":f+"px"});var m=(t.getHeight()-f-.5*n.getHeight())/(t.getHeight()-n.getHeight());player.volume(m)},d=function(){noScrolling(),r.removeListener("mousemove",l),r.removeListener("mouseup",d),n.removeListener("touchmove",l),n.removeListener("touchend",d),n.mousedown(s),n.touchstart(s),C.bar.vbox.mouseDown=!1};n.mousedown(s),n.touchstart(s);t.mousedown(function(e){e=e||window.event;var a=getClient(e),n=t.offset(),r=1-(a.y-n.top)/t.getHeight();player.volume(r)})},changeProgress=function(e){if(!("boolean"==valType(vars.live)&&vars.live||pSliderMouseDown)){var t=C.bar.pbox.bg,a=C.bar.pbox.slider,n=e/duration*100;"number"==valType(vars.live)&&(n="100"),C.bar.pbox.play.css({width:n+"%"});var r=a.getWidth()/t.getWidth()*100,i=n-.5*r;i<0&&(i=0),i>100-r&&(i=100-r),C.bar.pbox.slider.css({left:i+"%"}),checkProgressSlider()}},checkProgressSlider=function(){var e=C.bar.pbox.bg,t=C.bar.pbox.slider,a=0;C.bar.pbox.css("transition-duration")&&(a=1e3*parseFloat(C.bar.pbox.css("transition-duration"))+20);setTimeout(function(){var a=parseInt(C.bar.pbox.slider.css("left"));a<0&&(a=0,C.bar.pbox.slider.css({left:a+"px"})),a>e.getWidth()-t.getWidth()&&(a=e.getWidth()-t.getWidth(),C.bar.pbox.slider.css({left:a+"px"}))},a)},changeTopTime=function(){C.topBar.timeEle.htm(date("H:i:s")),setTimeout(changeTopTime,1e3)},changeVolumeSlider=function(e){if(!isUndefined(C.bar.vbox)){var t=C.bar.vbox.volume.box,a=C.bar.vbox.volume.bg,n=C.bar.vbox.volume.pp,r=C.bar.vbox.volume.slider;C.bar.vbox.volume.txt.htm(parseInt(100*e));var i=a.getHeight();if(i){var o=i-e*i;n.css({"margin-top":o+"px"});var s=a.offset().top-t.offset().top+o-.5*r.getHeight();r.css({top:s+"px"})}}},changeLoad=function(){if(video){var e=video.buffered.length;if(e>0){var t=video.buffered.end(e-1);loadTime=1e3&&(t+=a,i(e),e=0),n(r)},i=function(e){e!=CT.fps&&(CT.fps=e,replaceInformation("fps",e),eventTarget("fps",e))};isUndefined(CT.fps)&&(CT.fps=0),r()},getElement=function(e){var t=$(e);if(!isUndefined(t))return"htmlarray"==valType(t)&&(t=t[0]),isUndefined(t.captureParentNode)&&(t.captureParentNode=t.parentNode,t.prevElement=t.prev(),t.nextElement=t.next()),t},$=function(e,t){var a=null;document&&(a=document),isUndefined(t)||(a=t);var n=[];if(e)if("htmlobject"==valType(e)||"object"==valType(e)){if(!isUndefined((n=e).moeplayer))return n}else if("string"==valType(e)&&""!=e)switch(e.substr(0,1)){case".":if(e=e.substr(1,e.length),a.getElementsByClassName){if(!(n=a.getElementsByClassName(e)).length)return null}else if(!a&&document.getElementsByClassName){if(!(n=document.getElementsByClassName(e)).length)return null}else{var r=new RegExp(" "+e+" ","i"),i=null;i=a.getElementsByTagName?a.getElementsByTagName("*"):document.getElementsByTagName("*");for(var o=0;o1&&(n=t[1].substr(0,1).toLocaleUpperCase()+t[1].substr(1,t[1].length-1)),t.length>2&&(n=t[2].substr(0,1).toLocaleUpperCase()+t[2].substr(1,t[2].length-1)),a+n+""}return e};if(isUndefined(t)){if(!isUndefined(e)&&"string"==valType(e))return this.currentStyle?this.currentStyle[e]:document.defaultView.getComputedStyle(this,null)[e];if(isUndefined(e))return this.currentStyle?this.currentStyle:document.defaultView.getComputedStyle(this,null)}if("object"!=valType(e)){var n=a(e);if(this.length>1)for(var r=0;r=e+1?this[e]:null};for(o=0;o=20.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, "node_modules/acorn": { "version": "8.17.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", @@ -110,6 +530,21 @@ "webworkify-webpack": "^2.1.5" } }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/hls.js": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.16.tgz", @@ -126,6 +561,71 @@ "webworkify-webpack": "github:xqq/webworkify-webpack" } }, + "node_modules/rollup": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/serialize-javascript": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.7.tgz", + "integrity": "sha512-YAy8Od6KV+uuwUuU50np8fGB/Aues6Y0nAhA9y/hId74PlKUcme4pXcBD46NWKr1Q4osN/iseZ17YqO1XfmI8g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/smob": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.6.2.tgz", + "integrity": "sha512-RQsvleCbF8cVHEv+xuDGaA4pOizFqJ0GgjtMSRo6oP8pnN7WsigHgVGey6aILRBKv4W2YOMHLqbKdnB6hpB9fw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", diff --git a/package.json b/package.json index 87f355c..9be1380 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "一款中文友好的网页视频播放器(fork 自 ckplayer X3),支持 mp4/flv/m3u8/ts,可搭配 Moodle media 插件使用", "license": "MIT", "scripts": { - "build": "node scripts/build.js" + "build": "rollup -c && node scripts/copy-libs.js" }, "dependencies": { "flv.js": "^1.6.2", @@ -12,6 +12,7 @@ "mpegts.js": "^1.8.0" }, "devDependencies": { - "terser": "^5.0.0" + "@rollup/plugin-terser": "^1.0.0", + "rollup": "^4.62.2" } } diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..6d0b376 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,49 @@ +/* + * rollup 构建配置 + * 功能:把 src/ 下的 ES Module 打包成与旧版等价的 UMD 产物 + * 1. moeplayer/js/moeplayer.js —— 未压缩版 + * 2. moeplayer/js/moeplayer.min.js —— terser 压缩版(保留版权注释) + * 运行时依赖(hls.js/flv.js/mpegts.js)的拷贝由 scripts/copy-libs.js 完成 + * 用法:npm run build + */ +import terser from '@rollup/plugin-terser'; + +// 产物头部版权注释(与 src/index.js 顶部一致) +const banner = `/* + * 软件名称:MoePlayer + * 版本:X3 + * 版权:MoePlayer 项目(fork 自 ckplayer, www.ckplayer.com) + * 开源协议:MIT + */`; + +const outputBase = { + format: 'umd', + name: 'MoePlayer', + // 仅导出 moeplayerEmbed 函数本身,与旧 UMD 的 module.exports = factory() 行为一致 + exports: 'default', + banner +}; + +export default { + input: 'src/index.js', + // 关闭 tree-shaking:完整保留所有工具函数(含暂未被引用的),与旧单文件内容一致 + treeshake: false, + output: [ + { + ...outputBase, + file: 'moeplayer/js/moeplayer.js' + }, + { + ...outputBase, + file: 'moeplayer/js/moeplayer.min.js', + plugins: [ + terser({ + format: { + // 保留文件头部的版权注释 + comments: /^!|软件名称|版权/ + } + }) + ] + } + ] +}; diff --git a/scripts/build.js b/scripts/copy-libs.js similarity index 59% rename from scripts/build.js rename to scripts/copy-libs.js index 35850c1..283afee 100644 --- a/scripts/build.js +++ b/scripts/copy-libs.js @@ -1,14 +1,12 @@ /* - * 构建脚本 - * 功能: - * 1. 使用 terser 将 moeplayer/js/moeplayer.js 压缩为 moeplayer.min.js - * 2. 从 node_modules 拷贝运行时依赖(hls.js/flv.js/mpegts.js)到 moeplayer/ 对应目录 + * 构建脚本(第二步) + * 功能:从 node_modules 拷贝运行时依赖(hls.js/flv.js/mpegts.js)到 moeplayer/ 对应目录 * 播放器运行时会按需动态加载这些文件,目录结构需与 getPath() 的约定保持一致 - * 用法:npm run build + * 第一步(rollup 打包压缩)见 rollup.config.js + * 用法:npm run build(即 rollup -c && node scripts/copy-libs.js) */ const fs = require('fs'); const path = require('path'); -const terser = require('terser'); const root = path.resolve(__dirname, '..'); @@ -19,23 +17,6 @@ const libs = [ ['mpegts.js', 'mpegts.js', ['mpegts.js', 'mpegts.js.map', 'LICENSE']] ]; -async function minifyCore() { - const src = path.join(root, 'moeplayer/js/moeplayer.js'); - const dist = path.join(root, 'moeplayer/js/moeplayer.min.js'); - const code = fs.readFileSync(src, 'utf8'); - const result = await terser.minify(code, { - output: { - // 保留文件头部的版权注释 - comments: /^!|软件名称|版权/ - } - }); - if (result.error) { - throw result.error; - } - fs.writeFileSync(dist, result.code, 'utf8'); - console.log('压缩完成: moeplayer/js/moeplayer.min.js (' + result.code.length + ' bytes)'); -} - function copyLibs() { for (const [pkg, dir, files] of libs) { const pkgRoot = path.dirname(require.resolve(pkg + '/package.json')); @@ -55,11 +36,10 @@ function copyLibs() { } } -(async () => { - await minifyCore(); +try { copyLibs(); - console.log('构建完成'); -})().catch(err => { - console.error('构建失败:', err); + console.log('依赖拷贝完成'); +} catch (err) { + console.error('拷贝失败:', err); process.exit(1); -}); +} diff --git a/src/core/moeplayerEmbed.js b/src/core/moeplayerEmbed.js new file mode 100644 index 0000000..41cf00a --- /dev/null +++ b/src/core/moeplayerEmbed.js @@ -0,0 +1,6484 @@ +import { language as languageDefault } from '../language.js'; +import { videoObjectDefault } from '../defaults.js'; +import { ajax, dataURLtoBlob, getApp } from '../utils/net.js'; +import { documentReady, checkJs, getMaxZIndex, getWindowSize, prev, next, addListener, removeListener, documentHidden } from '../utils/dom.js'; +import { formatSeconds, date, arrayToString, stringToArray } from '../utils/format.js'; +import { standardization, mergeObj, valType, isUndefined, decodeURIString } from '../utils/type.js'; +import { cookie } from '../utils/cookie.js'; +import { getPath } from '../utils/path.js'; + +var language = languageDefault; + + function moeplayerEmbed(videoObj){ + /* + * rightMenu + * 功能:全局变量,右键内容 + * 初始化设置menu可替换该变量内容 + */ + var rightMenu=[ + { + title:'MoePlayer' + }, + { + title:'version:X3', + underline:true + }, + { + title:'about', + click:'aboutShow' + } + ]; + var vars={},varsTemp={};//保存传递过来的videoObject + var video=null;//视频播放器对象 + var duration=0;//总时间 + var mutedState='';//默认静音状态 + var recoveryVolume=false;//是否需要在播放时恢复音量 + var waited=true;//是否缓冲结束 + var paused=true;//默认暂停状态 + var loadTime=0;//已加载部分 + var seekTime=0;//需要跳转的时间,初次播放以及切换清晰度后会用该变量记录需要seek的时间 + var oldTime=0,playTime=0,firstSeekTime=-1,maxSeeTime=0;//oldTime=记录上次播放时间,playTime=当前播放时间,firstSeekTime=记录第一次拖动的时间,maxSeeTime=看过的最大时间 + var isChangeDef=true;//是否需要重置清晰度 + var playType='';//播放类别,默认='',是通过api接口播放,='button'则判定是通过点击按钮播放 + var msgSetTime=null,tipSetTime=null,mouseSetTime=null;//用于显示提示后自动隐藏的计时器 + var adFrontSetTime=null,adPauseSetTime=null;//贴片广告和暂停广告的计时器 + var closeTipFun=null;//关闭提示的函数 + var closeTipMouseOut=null;//鼠标离开节点时执行的函数 + var waitingMessage=true;//显示缓冲提示 + var hidePreviewSetTime=null;//隐藏预览图的计时器 + var pSliderMouseDown=false;//判断是否在进度条上的滑块上按下 + var playbackTime=0;//记录回放时间 + var loadedmetadataNum=0;//记录元数据加载成功次数,记录视频播放数量 + var screenshotImg=null;//记录最新一张截图 + var ad=null;//广告对象 + var frontAdPlay=false,pauseAdPlay=false;//贴片广告是否播放,暂停广告是否播放 + var barShow=true,rightBarShow=true; + var EventTarget=null,newEvent=null,eventTargetList=null;//注册监听 + var loadedTrack=false;//默认未加载字幕 + var C={};//保存播放器界面上的所有节点 + var CT=null,CK=null,CM=null,CV=null;//CT=播放器容器,页面中已存的,CT>CK>CM>CV>video + var pugPlayer=null;//插件播放器 + var hls=null;//播放hls + var loadMeta=true;//第一次加载到元数据 + var app='';//平台类型 + var nowRotate=0;//当前视频旋转角度 + var nowZoom=100;//当前缩放比例 + var smallWindowsState=false;//当前是否处理小窗口状态 + var isDrag=false;//是否在播放器上按下并且拖动 + var moeplayerCookie='moeplayer-player-cookie'; + var cookieName='';//cookie名称 + var cookieTime=0;//cookie保存时间,单位:秒 + var cookieArray=[];//保存当前所有记录 + var focusPause=true;//失去焦点前是否是暂停状态 + var existenceObj=false;//是否使用源码里已有的dom + /* + * into + * 功能:初始化,调用播放器则首先调用该函数 + * @obj=初始化时的配置对象:videoObject + */ + var into=function(obj){ + /* + * 如果未传递初始化配置对象,则为player变量增加一个add函数,功能相当于into + */ + if(isUndefined(obj)){ + player.add=player.into=into; + return player; + } + /* + * 转码默认语言包 + */ + language=decodeURIString(language); + /* + * 检查是否在顶部引入了外部语言包文件,如果引入了,则使用外部语言包替换进language变量 + */ + if(!isUndefined(window.moeplayerLanguage)){ + language=mergeObj(language,window.moeplayerLanguage); + } + /* + * 初始化注册事件函数,该函数的作用是将所有相关的事件都注册进一个变量newEvent + * newEvent是提供给播放器外部监听函数使用的,如监听时间player.time(function(t){console.log('已播放:'+t);}); + */ + eventTarget(); + /* + * 监听页面标签状态(判断是否失去焦点) + */ + documentHidden(function(state){ + eventTarget('visibilityState',state); + }); + /* + * 判断平台类型,主要是判断是否是iphone类型的平台 + */ + app=getApp(); + /* + * 简单复制一下初始化时的默认配置 + */ + varsTemp={}; + for(var key in videoObjectDefault){ + varsTemp[key]=videoObjectDefault[key]; + } + /* + * 如果初始化配置是字符串并且是以website:开头或url:开头的,则认为需要请求一个json文件来获取配置 + */ + if(valType(obj)=='string' && (obj.substr(0,8)=='website:' || obj.substr(0,4)=='url:')){ + var ajaxUrl=''; + if(obj.substr(0,8)=='website:'){ + ajaxUrl=obj.substring(8); + } + if(obj.substr(0,4)=='url:'){ + ajaxUrl=obj.substring(4); + } + ajax({url:ajaxUrl,success:function(data){ + if(data){ + return into(data); + } + else{ + showWindowsError(language['error']['ajax']+',url:'+ajaxUrl); + return null; + } + }}); + } + /* + * 如果初始化配置是一个object,则进行下面的操作 + */ + else if(valType(obj)=='object'){ + varsTemp = standardization(varsTemp, obj);//将obj合并到varsTemp对象里 + if(!isUndefined(obj['container']) && obj['container']){ + CT=$(obj['container']); + if(CT){//如果播放容器存在,则调用语言判断函数 + return loadLanguage(obj); + } + else{//如果播放容器不存在,则则等页面加载完成后运行 + return bodyReady(obj); + } + } + else{//不存在播放容器配置则等页面加载完成后运行 + return bodyReady(obj); + } + } + else{ + showWindowsError(language['error']['noVideoContainer']); + return null; + } + }, + /* + * bodyReady + * 功能:页面加载完成后构建播放器 + * @obj=初始化时的配置对象 + */ + bodyReady=function (obj){ + documentReady(function(){ + if(!isUndefined(obj['container'])){ + CT=$(obj['container']); + if(CT){//如果播放容器存在,则调用语言判断函数 + return loadLanguage(obj); + } + else{ + showWindowsError(language['error']['noVideoContainer']); + return null; + } + } + else{//不存在播放容器则重新判断 + return ajaxWebsite(obj); + } + }); + return null; + }, + /* + * ajaxWebsite + * 功能:页面加载完成后重新初始化 + * @obj=初始化时的配置对象 + */ + ajaxWebsite=function (obj){ + if(valType(obj['video'])=='string' && (obj['video'].substr(0,8)=='website:' || obj['video'].substr(0,4)=='url:')){ + varsTemp = standardization(varsTemp, obj); + var ajaxUrl=''; + if(obj['video'].substr(0,8)=='website:'){ + ajaxUrl=obj['video'].substring(8); + } + if(obj['video'].substr(0,4)=='url:'){ + ajaxUrl=obj['video'].substring(4); + } + ajax({url:ajaxUrl,success:function(data){ + if(data){ + return into(data); + } + else{ + showWindowsError(language['error']['ajax']+',url:'+ajaxUrl); + return null; + } + }}); + } + else{ + showWindowsError(language['error']['noVideoContainer']); + return null; + } + }, + /* + * loadLanguage + * 功能:加载Language + * @obj=初始化时的配置对象 + */ + loadLanguage=function (obj){ + vars = standardization(varsTemp, obj); + if(vars['language']){ + var path=getPath('language')+vars['language']+'.js'; + loadJs(path,function(){ + if(!isUndefined(window['moeplayerLanguage'])){ + language=mergeObj(language,window['moeplayerLanguage']); + } + return embed(obj); + }); + } + else{ + return embed(obj); + } + }, + /* + * embed + * 功能:构建播放器 + * @obj=初始化时的配置对象 + */ + embed=function (obj){ + /* + * 判断静音状态 + */ + mutedState=vars['volume']>0?false:true; + if(!isUndefined(CT) && CT!=null){ + if(valType(CT)=='htmlarray'){ + CT=CT.eq(0); + } + } + else{ + return null; + } + /* + * 注册获取fps的函数 + */ + calculationFps(); + /* + * 如果video指向一个已存在的video标签对象 + */ + existenceObj=valType(vars['video'])=='string' && ((vars['video'].substr(0,1)=='.' && vars['video'].indexOf('/')==-1) || vars['video'].substr(0,1)=='#'); + /* + * 清空容器 + */ + if(existenceObj){ + CK=CT.find('.moeplayer')?CT.find('.moeplayer').eq(0):null; + if(CK){ + CM=CK.find('.ck-main')?CK.find('.ck-main').eq(0):null; + } + if(CM){ + CV=CM.find('.ck-video')?CM.find('.ck-video').eq(0):null; + } + } + if(!CK || !CM || !CV){ + CT.htm(''); + /* + * 在播放容器里新建一个总的容器 + */ + CK=createlDiv('moeplayer'); + CT.append(CK); + /* + * 在总容器里再新建一个容器 + */ + CM=createlDiv('ck-main'); + CK.append(CM); + /* + * 新建一个放置video标签的容器 + */ + CV=createlDiv('ck-video'); + CM.append(CV); + } + /* + * 如果已存在video.则先设置成空 + */ + if(video){ + video.remove(); + video=null; + } + /* + * 如果video指向一个已存在的video标签对象,则直接调用该对象 + */ + if(existenceObj){ + video=$(vars['video'])?$(vars['video']).eq(0):null; + } + /* + * 新建一个video标签 + */ + if(!video){ + video = createlVideo(); + video.attr('width','100%').attr('height','100%'); + CV.append(video); + } + video.volume=vars['volume']; + if(vars['autoplay']){ + player.volume(0); + player.muted(); + recoveryVolume=true; + video.attr('autoplay','autoplay'); + paused=false; + } + else{ + video.attr('preload','metadata'); + } + CT.loop=vars['loop']; + if(CT.loop){ + video.attr('loop','loop'); + } + if(vars['controls']){ + video.controls=true; + } + else{ + video.controls=false; + } + try{ + if(!existenceObj){ + video.attr('controlslist','nodownload'); + video.attr('x-webkit-airplay','true'); + video.attr('x5-video-orientation','portraint'); + video.attr('playsinline','true'); + video.attr('webkit-playsinline','true'); + video.attr('x5-playsinline','true'); + } + if(vars['crossOrigin']){ + video.useCORS=true;//解决跨域 + video.crossOrigin=vars['crossOrigin'];//解决跨域 + } + } + catch(event){} + /* + * 默认设置支持小窗口模式 + */ + CT.smallWindows=true; + /* + * 默认设置不显示页面全屏按钮 + */ + CT.webFull=false; + /* + * 默认设置不显示剧场模式按钮 + */ + CT.theatre=false; + /* + * 加载播放器界面 + */ + loadFace(); + /* + * 判断是否需要默认旋转视频 + */ + if(vars['rotate']>0){ + player.rotate(vars['rotate']); + } + /* + * 判断是否需要默认缩放视频 + */ + if(vars['zoom']>0){ + player.zoom(vars['zoom']); + } + /* + * 判断是否支持video标签 + */ + if(isUndefined(video.canPlayType)){ + CT.error={code:5,message:language['error']['supportVideoError']}; + eventTarget('error',CT.error);//注册监听error + showError(); + return player; + } + /* + * 注册视频播放器内部监听,监听到事件后注册给CT使用 + */ + addAllListener(); + /* + * 如果需要在视频播放器加载成功后调用相关函数,此时则开始调用 + */ + if(!isUndefined(vars['loaded'])){ + if(valType(vars['loaded'])=='function'){ + try{ + vars['loaded'](player); + } + catch(event){} + } + else if(valType(vars['loaded'])=='string'){ + try{ + eval(vars['loaded']+ '(player)'); + } + catch(event){} + } + } + /* + * 播放视频 + */ + if(!existenceObj){ + changeVideo(vars['video']); + } + else{ + changeVideo(video.attr('src')); + } + /* + * 返回 播放器 + */ + return player; + }, + /* + * changeVideo + * 功能:初始化视频地址或修改视频地址 + */ + changeVideo=function (vstr){ + var i=0; + if(video.attr('src') || video.htm()){ + player.pause(); + } + if(video.attr('src') && !existenceObj){ + video.attr('src',''); + video.removeAttr('src'); + } + if(!isUndefined(video.textTracks) && video.textTracks.length>0){ + for(i=video.find('track').length-1;i>-1;i--){ + video.find('track').eq(i).remove(); + } + } + if(!existenceObj){ + video.htm(''); + } + if(!isUndefined(vars['ad'])){ + ad=vars['ad']; + } + var source=''; + if(valType(vstr)=='string'){ + if(vstr.substr(0,8)=='website:' || vstr.substr(0,4)=='url:'){ + var ajaxUrl=''; + if(vstr.substr(0,8)=='website:'){ + ajaxUrl=vstr.substring(8); + } + if(vstr.substr(0,4)=='url:'){ + ajaxUrl=vstr.substring(4); + } + ajax({url:ajaxUrl,success:function(data){ + if(data!=null){ + vars = standardization(varsTemp, data); + changeVideo(vars['video']); + } + else{ + CT.error={code:8,message:language['error']['ajax']}; + eventTarget('error',CT.error);//注册监听error + showError(); + } + }}); + return; + } + else{ + if(vars['plug'] && !canPlay(vstr)){ + plugPlayer(vstr); + } + else{ + if(!existenceObj){ + video.attr('src',vstr); + } + } + loadTrack(); + } + } + else if(valType(vstr)=='array'){ + for(i=0;i1){ + source += ''; + } + } + } + } + if(source){ + video.htm(source); + } + loadTrack(); + } + else if(valType(vstr)=='object'){ + if(vars['plug']){ + plugPlayer(vstr); + } + else{ + CT.error={code:10,message:language['error']['emptied']}; + eventTarget('error',CT.error);//注册监听error + showError(); + } + loadTrack(); + } + if(!isUndefined(video.find('source')) && video.find('source').length>0){ + video.find('source').eq(video.find('source').length-1).addListener('error',videoHandler.error); + } + checkBar(); + loadLogo(); + if(isChangeDef){ + checkDefinition(); + } + /* + * 对cookie进行相关分析 + */ + if(vars['cookie']){ + if(valType(vars['cookie'])=='array' && vars['cookie'].length>=2){ + if(vars['cookie'][0] && valType(vars['cookie'][0])=='string'){ + cookieName=vars['cookie'][0]; + } + if(vars['cookie'][1] && valType(vars['cookie'][1])=='number'){ + cookieTime=vars['cookie'][1]; + } + } + if(valType(vars['cookie'])=='object' && !isUndefined(vars['cookie']['name'])){ + cookieName=vars['cookie']['name']; + if(!isUndefined(vars['cookie']['hour']) && valType(vars['cookie']['hour'])=='number'){ + cookieTime=vars['cookie']['hour']; + } + } + if(valType(vars['cookie'])=='string'){ + cookieName=vars['cookie']; + } + if(cookieName){ + cookieName=cookieName.replace(/[ ]*,[ ]*|[ ]+/g, '').replace(/[ ]*;[ ]*|[ ]+/g, ''); + } + } + if(!isUndefined(vars['seek']) && !seekTime){ + if(valType(vars['seek'])=='number' && vars['seek']>0){ + seekTime=vars['seek']; + } + if(valType(vars['seek'])=='string' && vars['seek']=='cookie' && cookieName){ + var cke=player.cookie(cookieName); + if(cke){ + seekTime=cke['time']; + } + + } + } + }, + /* + * plugPlayer + * 功能:使用插件进行播放 + */ + plugPlayer=function (url){ + switch(vars['plug']){ + case 'hls.js': + hlsPlayer(url); + break; + case 'flv.js': + flvPlayer(url); + break; + case 'mpegts.js': + mpegtsPlayer(url); + break; + case 'dash.js': + dashPlayer(url); + break; + default: + if(valType(vars['plug'])=='function'){ + vars['plug'](video,url); + } + else{ + CT.error={code:10,message:language['error']['emptied']}; + eventTarget('error',CT.error);//注册监听error + showError(); + } + + break; + } + }, + /* + * hlsPlayer + * 功能:使用hls.js插件进行播放 + */ + hlsPlayer=function (url){ + var path=getPath('hls.js')+'hls.min.js'; + loadJs(path,function(){ + if (!isUndefined(Hls) && Hls.isSupported()) { + hls = new Hls(); + hls.loadSource(url); + hls.attachMedia(video); + hls.on(Hls.Events.ERROR, function(event, data){ + var code=9; + var message=language['error']['loadingFailed']; + var fatal=data.fatal; + if(!isUndefined(data.response)){ + if(!isUndefined(data.response.code)){ + code=data.response.code; + } + if(!isUndefined(data.response.text) && data.response.text){ + message=data.response.text; + } + else{ + if(!isUndefined(event)){ + message=event; + } + } + } + CT.error={code:code,message:message}; + eventTarget('error',CT.error);//注册监听error + if(fatal){ + showError(); + } + }); + } + else if(canPlay(url)){ + video.attr('src',url); + } + }); + }, + /* + * flvPlayer + * 功能:使用flv.js插件进行播放 + */ + flvPlayer=function (url){ + var path=getPath('flv.js')+'flv.min.js'; + loadJs(path,function(){ + if (typeof(flvjs)!='undefined' && !isUndefined(flvjs) && flvjs.isSupported()) { + var config={ + type: 'flv', + url: url + }; + if(valType(url)=='object'){ + config=url; + } + if(vars['live']){ + config['isLive']=true; + } + if(pugPlayer){ + pugPlayer.pause(); + pugPlayer.unload(); + pugPlayer.detachMediaElement(); + pugPlayer.destroy(); + pugPlayer=null; + } + pugPlayer = flvjs.createPlayer(config); + pugPlayer.attachMediaElement(video); + pugPlayer.load(); + pugPlayer.on(flvjs.Events.METADATA_ARRIVED, function(res){ + videoHandler.loadedMetaData(); + }); + pugPlayer.on(flvjs.Events.ERROR, function(errorType, errorDetail, errorInfo){ + CT.error={code:errorInfo['code'],message:errorInfo['msg']}; + eventTarget('error',CT.error);//注册监听error + showError(); + }); + } + }); + }, + /* + * mpegtsPlayer + * 功能:使用mpegts.js插件进行播放 + */ + mpegtsPlayer=function (url){ + var path=getPath('mpegts.js')+'mpegts.js'; + loadJs(path,function(){ + if (typeof(mpegts)!='undefined' && !isUndefined(mpegts) && mpegts.getFeatureList().mseLivePlayback) { + var config={ + type: 'mse', + url: url + }; + if(valType(url)=='object'){ + config=url; + } + if(vars['live']){ + config['isLive']=true; + } + if(pugPlayer){ + pugPlayer.pause(); + pugPlayer.unload(); + pugPlayer.detachMediaElement(); + pugPlayer.destroy(); + pugPlayer=null; + } + pugPlayer = mpegts.createPlayer(config); + pugPlayer.attachMediaElement(video); + pugPlayer.load(); + + pugPlayer.on(mpegts.Events.METADATA_ARRIVED, function(res){ + videoHandler.loadedMetaData(); + }); + pugPlayer.on(mpegts.Events.ERROR, function(errorType, errorDetail, errorInfo){ + CT.error={code:errorInfo['code'],message:errorInfo['msg']}; + eventTarget('error',CT.error);//注册监听error + showError(); + }); + } + }); + }, + /* + * canPlay + * 功能:判断是否能支持相关视频格式 + */ + canPlay=function(vStr,num){ + var vTypeArr=[ + {vidType:'video/ogg',codType:'theora, vorbis'}, + {vidType:'video/mp4',codType:'avc1.4D401E, mp4a.40.2'}, + {vidType:'video/mp4',codType:'avc1'}, + {vidType:'video/mp4',codType:'hevc'}, + {vidType:'video/webm',codType:'vp8.0, vorbis'}, + {vidType:'video/webm',codType:'vp9'}, + {vidType:'',codType:'application/x-mpegURL'}, + {vidType:'',codType:'application/vnd.apple.mpegurl'} + ]; + var vType={ + ogg:vTypeArr[0], + mp4:[vTypeArr[1],vTypeArr[2],vTypeArr[3]], + webm:[vTypeArr[4],vTypeArr[5]], + m3u8:[vTypeArr[6],vTypeArr[7]] + }; + var arr=[]; + var k=''; + var supportType=function(obj){ + var vType=obj['vidType']; + var str=''; + if(vType){ + str=vType+'; '+ 'codecs="' + obj['codType'] + '"'; + } + else{ + str=obj['codType']; + } + var sup = video.canPlayType(str); + if(sup == '') { + sup = 'no'; + } + return sup; + }; + var getExtension=function(filepath) { + return filepath.replace(/.+\./, ''); + }; + if(isUndefined(num)){ + if(valType(vStr)=='string'){ + if(vars['type']){ + for(k in vTypeArr){ + if(vTypeArr[k]['vidType']==vars['type']){ + arr.push(vTypeArr[k]); + } + } + } + else{ + if(getExtension(vStr) && getExtension(vStr) in vType){ + var temp=vType[getExtension(vStr)]; + if(valType(temp)=='array'){ + for(var i=0;i0){ + for(var i=0;icTime && arr[i][0]!=cookieName && y<19){ + tempArr.push(arr[i]); + y++; + } + } + arr=tempArr; + } + if(arr.length>0){ + cookie(moeplayerCookie,'delete',vars['domain'],vars['cookiePath']); + cookie(moeplayerCookie,arrayToString(arr),vars['domain'],vars['cookiePath']); + } + cookieArray=arr; + }, + /* + * loadTrack + * 功能:加载track + */ + loadTrack=function(){ + if(isUndefined(video.textTracks)){ + return; + } + var i=0; + if(!isUndefined(vars['track']) && valType(vars['track'])=='array' && !video.find('track')){ + var track=''; + var arr=vars['track']; + C['bar']['track'].show(); + for(i=0;i'; + } + if(video){ + var html=video.htm()+track; + video.htm(html); + } + if(video.find('track') && !loadedTrack){ + loadedTrack=true; + checkTrack(); + } + } + }, + /* + * loadedMetaData + * 功能:获取元数据后执行的函数 + */ + loadedMetaData=function(){ + eventTarget('loadedMetaData',{ + width:CK.getWidth(), + height:CK.getHeight(), + videoWidth:CT.videoWidth, + videoHeight:CT.videoHeight, + duration:duration, + volume:CT.volume + }); + eventTarget('duration',duration); + if('error' in C){ + C['error'].hide(); + } + replaceInformation('videoWidth',CT.videoWidth); + replaceInformation('videoHeight',CT.videoHeight); + replaceInformation('volume',parseInt(CT.volume*100)); + replaceInformation('duration',parseInt(duration)); + documentHidden(function(state){ + if(vars['documentFocusPause']){ + if(state=='show'){ + if(!focusPause && paused){ + player.play(); + } + } + else{ + focusPause=paused; + player.pause(); + } + } + }); + }; + /* + * videoHandler + * 功能:视频播放对象video注册内部监听调用函数 + */ + var videoHandler={ + loadStart:function(){ + if(!vars['controls'] && app!='iphone'){ + C['loading'].show(); + } + C['centerPlay'].hide(); + eventTarget('loadstart'); + + }, + canPlay:function(){ + C['loading'].hide(); + eventTarget('canplay'); + }, + loadedData:function(){ + eventTarget('loadeddata'); + }, + loadedMetaData:function(){ + duration=this.duration; + if(!isUndefined(this.duration) && vars['duration']){ + duration=vars['duration']; + } + if(!vars['live']){ + C['time'].htm(formatSeconds(this.currentTime)+'/'+formatSeconds(duration)); + C['tempTime'].htm(formatSeconds(this.currentTime)+'/'+formatSeconds(duration)); + } + C['loading'].hide(); + if(vars['poster']){ + video.attr('poster',vars['poster']); + } + if(!vars['autoplay'] && !vars['controls']){ + C['centerPlay'].show(); + C['buffer'].hide(); + } + + CT.duration=duration; + CT.videoWidth=this.videoWidth; + CT.videoHeight=this.videoHeight; + CT.volume=this.volume; + if(CT.videoWidth || CT.videoHeight || duration){ + loadedMetaData(); + } + var len = 0; + if(!isUndefined(this.buffered)){ + len=this.buffered.length; + } + if(len>0){ + changeLoad(); + } + if(!vars['live']){ + changePreview(vars['preview']);//修改预览图片 + } + else{ + changePreview();//修改预览图片 + } + if(!isUndefined(vars['prompt']) && valType(vars['prompt'])=='array' && !vars['live']){ + changePrompt(); + } + else{ + deletePrompt(); + } + if(isChangeDef){ + checkDefinition(); + isChangeDef=false; + } + pSliderMouseDown=false; + loadedmetadataNum++; + if(!isUndefined(ad) && !isUndefined(ad['frontPlay']) && ad['frontPlay'] && loadedmetadataNum>1){//如果是贴片广告播放中,则进行播放和计算 + player.play(); + calculationAdFrontTime(duration);//计算贴片广告的时间 + } + if(!isUndefined(ad) && !isUndefined(ad['frontPlay']) && !ad['frontPlay']){//如果广告播放结束则播放正片 + player.volume(vars['volume']); + player.play(); + } + if(!vars['autoplay'] && loadMeta){ + loadMeta=false; + player.pause(); + setTimeout(player.pause,300); + } + }, + timeUpDate:function(){//监听播放时间 + if(!waited){ + waited=true; + C['buffer'].hide(); + eventTarget('buffer','end'); + } + var len = this.buffered.length; + if(len>0){ + changeLoad(); + } + if(!duration && this.duration){ + duration=this.duration; + CT.duration=duration; + CT.videoWidth=this.videoWidth; + CT.videoHeight=this.videoHeight; + if(CT.videoWidth || CT.videoHeight || duration){ + loadedMetaData(); + } + } + oldTime=playTime; + playTime=this.currentTime; + if(maxSeeTime1){//如果是贴片广告播放中,则进行播放 + calculationAdFrontTime(duration-playTime);//计算贴片广告的时间 + } + if(!isUndefined(C['error']) && C['error'].css('display')=='block'){ + C['error'].hide(); + } + if(cookieName){ + changeCookie(playTime); + } + replaceInformation('audioDecodedByteCount',this.webkitAudioDecodedByteCount || this.audioDecodedByteCount || 0); + replaceInformation('videoDecodedByteCount',this.webkitVideoDecodedByteCount || this.videoDecodedByteCount || 0); + }, + ended:function(){//监听播放结束 + if(!isUndefined(ad) && !isUndefined(ad['frontPlay']) && ad['frontPlay']){//如果是贴片广告播放中,则用广告结束函数对此进行判断 + adFrontEnded(); + } + else{ + C['bar']['playAndPause']['pause'].hide(); + C['bar']['playAndPause']['play'].hide(); + C['bar']['playAndPause']['refresh'].show(); + eventTarget('ended'); + showEnded(); + message(); + } + }, + error:function(event){ + if(!isUndefined(event.type)){ + var errorInfo=this.error; + var errorBak=function(){ + var code=12; + var msg=language['error']['loadingFailed']; + if(!isUndefined(errorInfo)){ + if(!isUndefined(errorInfo.code)){ + code=errorInfo.code; + } + if(!isUndefined(errorInfo.message)){ + msg=errorInfo.message; + } + CT.error={code:code,message:msg}; + showError(); + } + else{ + CT.error={code:code,message:msg}; + if(event.target.attr('src')){ + showError(); + } + } + eventTarget('error',CT.error);//注册监听error + }; + if(event.type=='error'){ + try{ + if(video.currentSrc){ + ajax({url:video.currentSrc,error:function(info){ + if(info && valType(info)=='object' && 'code' in info && info['code']){ + CT.error=info; + eventTarget('error',CT.error);//注册监听error + showError(); + } + else{ + errorBak(); + } + },success:function(data){ + if(!data){ + errorBak(); + } + }}); + } + else{ + errorBak(); + } + } + catch(event){ + errorBak(); + } + } + } + }, + stalled:function(){ + eventTarget('stalled');//注册监听error + CT.error={code:13,message:'load:stalled'}; + eventTarget('error',CT.error);//注册监听error + }, + suspend:function(){ + eventTarget('suspend');//注册监听error + }, + emptied:function(){ + eventTarget('emptied');//注册监听error + CT.error={code:7,message:language['error']['emptied']}; + eventTarget('error',CT.error);//注册监听error + }, + seeked:function(){ + if(paused){ + player.play(); + } + pSliderMouseDown=false; + eventTarget('seek',{time:this.currentTime,state:'seeked'}); + eventTarget('seeked'); + }, + seeking:function(){ + if(paused){ + player.play(); + } + var seekingTime=this.currentTime; + if(firstSeekTime==-1){ + firstSeekTime=seekingTime;//记录第一次拖动的时间 + } + switch(vars['timeScheduleAdjust']){ + case 0://禁止拖动 + if(oldTime!=seekingTime){ + waitingMessage=false; + player.seek(oldTime); + message(language['timeScheduleAdjust']['prohibit']); + return; + } + break; + case 2://只能前进(向右拖动 + if(seekingTimeoldTime){ + waitingMessage=false; + player.seek(oldTime); + message(language['timeScheduleAdjust']['prohibitForward']); + return; + } + break; + case 4://只能前进但能回到第一次拖动时的位置 + if(seekingTimemaxSeeTime){ + waitingMessage=false; + player.seek(maxSeeTime); + message(language['timeScheduleAdjust']['prohibitForwardNotViewed']); + return; + } + break; + } + eventTarget('seek',{time:seekingTime,state:'seeking'}); + eventTarget('seeking'); + if(!vars['live']){ + C['time'].htm(formatSeconds(seekingTime)+'/'+formatSeconds(duration)); + C['tempTime'].htm(formatSeconds(seekingTime)+'/'+formatSeconds(duration)); + } + + }, + waiting:function(){ + waited=false; + eventTarget('buffer','start');//注册监听视频缓冲 + C['centerPlay'].hide(); + if(!vars['controls']){ + C['buffer'].show(); + } + if(!waitingMessage){ + waitingMessage=true; + } + else{ + message(language['waiting']); + } + + }, + play:function(){ + paused=false; + C['bar']['playAndPause']['play'].hide(); + C['bar']['playAndPause']['pause'].show(); + C['bar']['playAndPause']['refresh'].hide(); + C['centerPlay'].hide(); + if(playType=='button'){ + C['bar']['pbox'].removeClass('ck-bar-progress-out'); + } + else{ + C['bar']['pbox'].addClass('ck-bar-progress-out'); + } + if(recoveryVolume){ + recoveryVolume=false; + player.exitMuted(); + } + hideBar(); + closePauseAd();//关闭暂停广告 + playType=''; + if(!isUndefined(C['ended'])){ + player.closeLayer(C['ended']); + } + if('error' in C){ + C['error'].hide(); + } + eventTarget('play'); + if(!isUndefined(ad)){//如果存在广告 + if(!isUndefined(ad['front'])){//如果存在贴片广告 + if(isUndefined(ad['frontPlay'])){//如果贴片广告还未播放 + ad['frontPlayI']=0; + ad['frontPlay']=true;//开始播放贴片广告 + player.pause();//暂停视频 + adFrontPlay(); + return; + } + } + } + if(seekTime && (isUndefined(vars['live']) || (!isUndefined(vars['live']) && valType(vars['live'])=='boolean' && !vars['live'])) && seekTime0 && mutedState){ + this.muted=false; + } + if(mutedState!=this.muted){ + mutedState=this.muted; + changeMuted(this.muted); + CT.muted=this.muted; + eventTarget('muted',CT.muted);//注册静音事件 + } + CT.volume=this.volume; + eventTarget('volume',this.volume);//注册音量事件 + if(!isUndefined(C['bar']['vbox'])){ + var vol=parseInt(this.volume*100); + C['bar']['vbox']['volume']['txt'].htm(vol); + if(!C['bar']['vbox']['mouseDown']){ + changeVolumeSlider(this.muted?0:this.volume); + } + if(!this.muted){//如果非静音状态 + message(language['volume']+vol+'%'); + } + } + replaceInformation('volume',parseInt(this.volume*100)); + }, + resize:function(){ + var fullState = document.fullScreen || document.mozFullScreen || document.webkitIsFullScreen || document.msFullscreenElement; + if(fullState) { + C['bar']['fullAndExit']['exitFull'].show(); + C['bar']['fullAndExit']['full'].hide(); + C['ad']['bottom']['fullAndExit']['exitFull'].show(); + C['ad']['bottom']['fullAndExit']['full'].hide(); + if(!CM.hasClass('ck-main-full')){ + CM.addClass('ck-main-full'); + } + message(language['full']); + C['bar']['webFullAndExit'].hide(); + C['bar']['theatreAndExit'].hide(); + if(!isUndefined(C['menu'])){ + CM.append(C['menu']); + } + } + else { + fullState=false; + C['bar']['fullAndExit']['full'].show(); + C['bar']['fullAndExit']['exitFull'].hide(); + C['ad']['bottom']['fullAndExit']['full'].show(); + C['ad']['bottom']['fullAndExit']['exitFull'].hide(); + if(CM.hasClass('ck-main-full')){ + CM.removeClass('ck-main-full'); + } + if(!isUndefined(vars['webFull']) && vars['webFull']){ + C['bar']['webFullAndExit'].show(); + } + if(!isUndefined(vars['theatre']) && !CT.webFull){ + C['bar']['theatreAndExit'].show(); + } + if(!isUndefined(C['menu'])){ + $('body').append(C['menu']); + } + if(CV.css('width')!=CM.css('width')){ + player.zoom(100); + } + } + if(CT.full!=fullState){ + CT.full=fullState; + eventTarget('full',fullState);//注册播放事件 + } + checkVideoRotate(); + changeProgress(player.time()); + }, + keydown:function(event){ + event=window.event || event; + var keycode = event.keyCode || event.which; + var v=player.volume(); + var pre=function(){ + if(event.preventDefault){ + event.preventDefault(); + } + else{ + event.returnValue = false; + } + }; + switch(keycode) { + case 32: + pre(); + player.playOrPause(); + break; + case 37: + player.fastBack(); + break; + case 39: + player.fastNext(); + break; + case 38: + if(valType(vars['keyVolume'])=='number' && (vars['keyVolume']==1 || (vars['keyVolume']==2 && CT.full))){ + pre(); + player.volume(v+.1<1?v+=.1:1); + } + break; + case 40: + if(valType(vars['keyVolume'])=='number' && (vars['keyVolume']==1 || (vars['keyVolume']==2 && CT.full))){ + pre(); + player.volume(v-.1>0?v-=.1:0); + } + break; + default: + break; + } + }, + mouseWheel:function(event){ + if(valType(vars['mouseWheelVolume'])=='number' && (vars['mouseWheelVolume']==1 || (vars['mouseWheelVolume']==2 && CT.full))){ + event=window.event || event; + var v=player.volume(); + if(event.preventDefault){ + event.preventDefault(); + } + else{ + event.returnValue = false; + } + if(event.wheelDelta) { + if(event.wheelDelta > 0) { + player.volume(v+.1<1?v+=.1:1); + } + if(event.wheelDelta < 0) { + player.volume(v-.1>0?v-=.1:0); + } + } else if(event.detail) { + if(event.detail > 0) { + player.volume(v-.1>0?v-=.1:0); + } + if(event.detail < 0) { + player.volume(v+.1<1?v+=.1:1); + } + } + } + + } + }; + /* + * adFrontPlay + * 功能:播放贴片广告 + */ + var adFrontPlay=function(){ + if(ad['frontPlayI']==0){//如果是播放第一个广告,则显示相关组件 + allBarHide(false); + C['ad'].show(); + ad['front']['video']=false;//初始化,不包含视频广告 + //判断是否需要启用固定时间后关闭广告按钮 + if(!isUndefined(ad['front']['closeTime'])){ + if(ad['front']['closeTime']>0){ + C['ad']['top']['closeTime'].show(); + adFrontCloseTime(); + } + else{ + C['ad']['top']['closeAd'].show(); + } + } + } + if(!isUndefined(ad['front']['node']) && ad['front']['node']!=null){ + CM.append(ad['front']['node']); + player.closeLayer(ad['front']['node']); + ad['front']['node']=null; + } + C['ad']['picture'].htm(''); + C['ad']['picture'].hide(); + C['ad']['link'].hide(); + if(!isUndefined(ad['front']['list'][ad['frontPlayI']])){ + var adv=ad['front']['list'][ad['frontPlayI']]; + frontAdPlay=true;//贴片广告播放状态 + eventTarget('frontAd',adv); + if(adv['type']=='picture'){ + adPicturePlay(adv); + } + else if(adv['type']=='node'){ + adNode(adv); + } + else{ + C['ad']['link'].attr('data-link',adv['link']); + adVideoPlay(adv['file']); + } + if(!isUndefined(adv['link'])){ + C['ad']['bottom']['details'].show(); + C['ad']['bottom']['details'].htm(''+language['details']+''); + } + else{ + C['ad']['bottom']['details'].hide(); + } + } + }, + /* + * adFrontCloseTime + * 功能:播放贴片广告时按指定时间后显示关闭广告按钮 + */ + adFrontCloseTime=function(){ + if(!isUndefined(ad['front']['closeSetTime'])){ + clearTimeout(ad['front']['closeSetTime']); + ad['front']['closeSetTime']=null; + } + C['ad']['top']['closeTime'].htmReplace('{seconds}',ad['front']['closeTime'],language['closeTime']); + ad['front']['closeTime']--; + if(ad['front']['closeTime']>0){ + ad['front']['closeSetTime']=setTimeout(adFrontCloseTime,1000); + } + else{ + C['ad']['top']['closeAd'].show(); + C['ad']['top']['closeTime'].hide(); + } + }, + /* + * calculationAdFrontTime + * 功能:计算贴片广告倒计时时间以及广告是视频时用于倒计时 + */ + calculationAdFrontTime=function(t){ + if(!isUndefined(t)){ + ad['front']['list'][ad['frontPlayI']]['time']=t; + } + ad['front']['countDown']=0; + for(var i=ad['frontPlayI'];i0){ + adv['time']--; + ad['front']['countDown']--; + C['ad']['top']['countDown'].htm(ad['front']['countDown']+language['second']); + adFrontSetTime=setTimeout(adFrontCountDown,1000); + } + else{ + adFrontEnded(); + } + }, + /* + * adFrontEnded + * 功能:贴片广告单个播放完成后进行判断是否需要播放下一个广告还是播放正片 + */ + adFrontEnded=function(){ + if(ad['frontPlayI']0 || h>0){ + if(adv['link']){ + var a=createlA('',adv['link']); + a.append(this); + C['ad']['picture'].append(a); + } + else{ + C['ad']['picture'].append(this) + } + img.unbind(); + img.click(function(){ + eventTarget('frontAdClick',adv); + }); + } + else{ + if(imgloadNum<10){ + imgloadNum++; + imgLoadHandler(); + } + } + }); + }; + imgLoadHandler(); + calculationAdFrontTime();//计算时间 + adFrontCountDown();//开启倒计时 + C['ad']['bottom']['mutedAndExit'].hide(); + }, + /* + * adNode + * 功能:贴片广告播放外部节点 + */ + adNode=function(adv){ + if(isUndefined(adv['content'])) return; + ad['front']['node']=player.layer(adv); + ad['front']['node'].css({'z-index':1}); + C['ad'].append(ad['front']['node']); + ad['front']['node'].unbind(); + ad['front']['node'].click(function(){ + eventTarget('frontAdClick',adv); + }); + calculationAdFrontTime();//计算时间 + adFrontCountDown();//开启倒计时 + C['ad']['bottom']['mutedAndExit'].hide(); + }, + /* + * frontVideoClickHandler + * 功能:视频广告上方层单击事件 + */ + frontVideoClickHandler=function(){ + var url=C['ad']['link'].attr('data-link'); + window.open(url,'_blank'); + }, + /* + * closeFrontAd + * 功能:关闭贴片广告 + */ + closeFrontAd=function(){ + if(!isUndefined(ad) && !isUndefined(ad['front']) && !isUndefined(ad['front']['closeButtonClick'])){ + if(valType(ad['front']['closeButtonClick'])=='function'){ + try{ + ad['front']['closeButtonClick'](); + } + catch(event){console.error(event);} + } + else if(valType(ad['front']['closeButtonClick'])=='string'){ + try{ + eval(ad['front']['closeButtonClick']+ '()'); + } + catch(event){console.error(event);} + } + } + else{ + player.closeFrontAd(); + } + }, + /* + * adPausePlay + * 功能:播放暂停广告 + */ + adPausePlay=function(){ + closePauseAd(); + if(!isUndefined(ad) && !isUndefined(ad['pause']) && !isUndefined(ad['pause']['list']) && ad['pause']['list'].length-1>=ad['pausePlayI']){ + var adv=ad['pause']['list'][ad['pausePlayI']]; + if(!isUndefined(ad['pause']['close']) && ad['pause']['close']){ + ad['pauseClose']=createlButton('ck-pause-close'); + ad['pauseClose'].click(function(){ + C['centerPlay'].show(); + C['buffer'].hide(); + closePauseAd(); + }); + } + if(!isUndefined(adv['file'])){//图片 + var img = null; + var imgloadNum=0; + var imgLoadHandler=function(){ + img = createlImg(adv['file']); + C['adPause'].show(); + C['adPause'].htm(''); + C['adPause'].append(img); + img.addListener('load',function(){ + var w=this.getWidth(),h=this.getHeight(); + if(w>0 || h>0){ + C['adPause'].htm(''); + if(adv['link']){ + var a=createlA('',adv['link']); + a.append(this); + C['adPause'].append(a); + } + else{ + C['adPause'].append(this) + } + + C['adPause'].css({ + 'width':w+'px', + 'height':h+'px' + }); + if(ad['pauseClose']){ + C['adPause'].append(ad['pauseClose']); + } + img.click(function(){ + eventTarget('pauseAdClick',adv); + }); + } + else{ + if(imgloadNum<10){ + imgloadNum++; + imgLoadHandler(); + } + } + }); + }; + imgLoadHandler(); + } + else if(!isUndefined(adv['content'])){ + ad['pause']['node']=player.layer(adv); + if(ad['pauseClose']){ + ad['pause']['node'].append(ad['pauseClose']); + } + ad['pause']['node'].click(function(){ + eventTarget('pauseAdClick',adv); + }); + } + eventTarget('pauseAd',adv); + if(!isUndefined(adv['time']) && adv['time']>0){ + adPauseSetTime=setTimeout(function(){ + ad['pausePlayI']++; + if(ad['pausePlayI']>ad['pause']['list'].length-1){ + ad['pausePlayI']=0; + } + adPausePlay(); + },adv['time']*1000) + } + } + }, + /* + * closePauseAd + * 功能:关闭暂停广告 + */ + closePauseAd=function(){ + if(adPauseSetTime){ + clearTimeout(adPauseSetTime); + adPauseSetTime=null; + } + C['adPause'].hide(); + if(!isUndefined(ad) && !isUndefined(ad['pauseClose']) && ad['pauseClose']!=null){ + ad['pauseClose'].remove(); + ad['pauseClose']=null; + } + if(!isUndefined(ad) && !isUndefined(ad['pause']) && !isUndefined(ad['pause']['node']) && ad['pause']['node']){ + ad['pause']['node'].unbind(); + player.closeLayer(ad['pause']['node']); + eventTarget('pauseAdClose'); + } + }; + /* + * player + * 功能:开放接口,向外部提供播放器的交互功能列表,包含获取,执行,监听这三种功能 + */ + var player={ + /* + * width + * 功能:获取或设置播放器宽度 + * 这是一个动态的值,会随着全屏切换或播放器本身尺寸变化而变化 + * @value,支持数字,字符,当存在@value时则设置播放器宽度,@value为空时则获取播放器宽度 + */ + width:function(value){ + if(!isUndefined(value)){ + if(valType(value)=='number'){ + value+='px'; + } + CT.css({'width':value}); + checkVideoRotate(); + } + return CK.getWidth(); + }, + /* + * height + * 功能:获取或设置播放器显示高度 + * 这是一个动态的值,会随着全屏切换或播放器本身尺寸变化而变化 + * @value,支持数字,字符,当存在@value时则设置播放器高度,@value为空时则获取播放器高度 + */ + height:function(value){ + if(!isUndefined(value)){ + if(valType(value)=='number'){ + value+='px'; + } + CT.css({'height':value}); + checkVideoRotate(); + } + return CK.getHeight(); + }, + /* + * videoWidth + * 功能:获取视频本身的宽度,这是一个固定值 + */ + videoWidth:function(){ + if(video){ + return video.videoWidth; + } + return null; + }, + /* + * videoHeight + * 功能:获取视频本身的高度,这是一个固定值 + */ + videoHeight:function(){ + if(video){ + return video.videoHeight; + } + return null; + }, + /* + * height + * 功能:获取或设置播放器显示高度 + * 这是一个动态的值,会随着全屏切换或播放器本身尺寸变化而变化 + * @value,支持数字,字符,当存在@value时则设置播放器高度,@value为空时则获取播放器高度 + */ + zoom:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('zoom',fn); + } + if(valType(fn)=='number'){ + var arr=[C['topBar']['zoomEle']['zoom50'],C['topBar']['zoomEle']['zoom75'],C['topBar']['zoomEle']['zoom100']]; + for(var i=0;ifn && fn>0){ + rot=arr[fn]; + } + else{ + if(arr.indexOf(fn)>-1){ + rot=fn; + } + } + if(rot!=nowRotate){ + eventTarget('rotate',rot); + nowRotate=rot; + checkVideoRotate();//调整视频尺寸 + } + } + } + }, + /* + * vars + * 提供给播放器外部使用 + * 修改vars,动态切换视频地址 + * @obj为新的播放配置对象 + */ + vars:function(obj,val){ + if(isUndefined(obj)){ + return; + } + if(valType(obj)=='string' && !isUndefined(val)){ + var temp={}; + temp[obj]=val; + obj=temp; + } + var isChange=false; + for(var k in obj){ + if(k in vars && obj[k]!=vars[k]){ + isChange=true; + break; + } + } + if(isChange){ + vars = standardization(vars, obj); + } + if(!isUndefined(obj['video'])){ + isChangeDef=true; + changeVideo(vars['video']); + } + if(!isUndefined(obj['title'])){ + C['topBar']['titleEle'].htm(obj['title']); + } + }, + /* + * 提供给播放器外部使用 + * 功能:监听视频准备加载 + */ + loadstart:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('loadstart',fn); + } + }, + /* + * 提供给播放器外部使用 + * 功能:监听视频加载 + */ + loadeddata:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('loadeddata',fn); + } + }, + /* + * 提供给播放器外部使用 + * 功能:监听视频元数据加载成功 + */ + loadedMetaData:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('loadedMetaData',fn); + } + }, + /* + * 提供给播放器外部使用 + * 功能:监听视频可以播放 + */ + canplay:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('canplay',fn); + } + }, + /* + * 提供给播放器外部使用 + * 功能:执行播放操作/监听播放 + * @fn为函数时则监听视频播放,@fn为空时,则控制视频播放 + */ + play:function(fn){ + if(valType(fn)=='object'){ + if(fn['target']==C['bar']['playAndPause']['play'] || fn['target']==C['bar']['playAndPause']['refresh']){ + playType='button'; + } + } + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('play',fn); + } + else{ + if(loadedmetadataNum>0 && video){ + try{video.play();}catch(event){console.error(event)} + } + } + return player; + }, + /* + * puase + * 功能:执行暂停操作/监听暂停 + * @fn为函数时则监听视频暂停,@fn为空时,则控制视频暂停 + */ + pause:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('pause',fn); + } + else{ + if(loadedmetadataNum>0 && video){ + try{video.pause();}catch(event){console.error(event)} + } + } + return player; + }, + /* + * playOrPause + * 功能:在播放和暂停动作之间进行切换 + */ + playOrPause:function(){ + if(paused){ + player.play(); + } + else{ + player.pause(); + } + return player; + }, + /* + * volume + * 功能:调节和监听以及获取音量 + * @fn为函数时,则进行音量变化的监听,@fn为数字时,则进行音量调节,@fn为空时,则获取当前音量 + */ + volume:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('volume', fn); + } + else if(valType(fn)=='number' && video){ + if(fn<0)fn=0; + if(fn>1)fn=1; + if(video.muted){ + video.volume=fn*.5; + } + video.volume=fn; + } + } + else if(video){ + return video.volume; + } + return player; + }, + /* + * muted + * 功能:执行静音操作/监听静音 + * @fn为函数时则监听视频静音,@fn为空时,则控制视频静音 + */ + muted:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('muted', fn); + } + else if(video){ + video.muted=true; + } + return player; + }, + /* + * exitMuted + * 功能:执行取消静音操作 + */ + exitMuted:function(){ + if(video){ + video.muted=false; + if(video.volume==0){ + player.volume(vars['volume']>0?vars['volume']:.8); + } + } + return player; + }, + /* + * time + * 功能:获取当前播放时间/监听播放时间 + * @fn为函数时监听当前播放时间,为空时获取当前播放时间 + */ + time:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('time',fn); + } + else if(video){ + return video.currentTime || 0; + } + }, + /* + * seek + * 功能:监听跳转/执行跳转操作 + * @fn为函数时则监听视频跳转动作,@fn为数字时执行跳转操作 + */ + seek:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('seek',fn); + } + if(valType(fn)=='number' && video){ + switch(vars['timeScheduleAdjust']){ + case 0://禁止拖动 + message(language['timeScheduleAdjust']['prohibit']); + return; + break; + case 1://可以拖动 + break; + case 2://只能前进(向右拖动 + if(fnoldTime){ + message(language['timeScheduleAdjust']['prohibitForward']); + return; + } + break; + case 4://只能前进但能回到第一次拖动时的位置 + if(fnmaxSeeTime){ + waitingMessage=false; + video.currentTime=maxSeeTime; + message(language['timeScheduleAdjust']['prohibitForwardNotViewed']); + return; + } + break; + } + pSliderMouseDown=false; + video.currentTime=fn; + } + } + return player; + }, + /* + * buffer + * 功能:监听视频缓冲 + * @fn为监听执行的函数 + */ + buffer:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('buffer',fn); + } + return player; + }, + /* + * ended + * 功能:监听视频播放结束 + * @fn为监听执行的函数 + */ + ended:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('ended',fn); + } + return player; + }, + /* + * 提供给播放器外部使用 + * 功能:监听点击下一集按钮的动作 + */ + next:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('next',fn); + } + return player; + }, + /* + * error + * 功能,监听播放器在加载视频过程和播放视频过程中出现的错误 + * @fn为监听执行的函数 + */ + error:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('error',fn); + } + return player; + }, + /* + * emptied + * 功能,监听播放器播放的视频文件发生故障并且文件突然不可用时 + * @fn为监听执行的函数 + */ + emptied:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('emptied',fn); + } + return player; + }, + /* + * duration + * 功能:获取视频总时间/监听视频总时间 + * @fn为函数时执行监听视频总时间,为空时获取视频总时间 + */ + duration:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('duration',fn); + } + else{ + return duration || 0; + } + }, + /* + * playbackRate + * 功能:监听或返回视频播放速度 + * @fn为函数时执行监听视频播放速度,为数字时切换播放速度,为空时获取视频播放速度 + */ + playbackRate:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('playbackRate',fn); + } + else if(valType(fn)=='number' && video){ + video.playbackRate=fn; + CT.playbackRate=fn; + eventTarget('playbackRate',fn); + changePlaybackrateVal(fn); + } + + } + else{ + return video.playbackRate; + } + }, + /* + * track + * 功能:监听或返回视频的字幕 + * @fn为函数时执行监听视频字幕,为数字时切换字幕,为空时获取字幕 + */ + track:function(fn){ + if(!isUndefined(fn)){ + if(valType(fn)=='function'){ + newEvent.addEventListener('track',fn); + } + else if(valType(fn)=='number' && video){ + var track=null; + if(!isUndefined(video.textTracks)){ + track=video.textTracks; + } + if(track && valType(track)=='texttracklist'){ + var arr=vars['track']; + for(var i=track.length-1;i>-1;i--){ + video.find('track').eq(i).remove(); + } + for(var i=0;i'; + } + if(video){ + var html=video.htm()+track; + video.htm(html); + } + changeTrackVal(fn); + } + } + + } + else{ + return CT.track; + } + }, + /* + * fastBack + * 功能:快退 + * @num为数字时快退指定秒数,为空时快退20秒 + */ + fastBack:function(num){ + if(duration==0) return; + if(isUndefined(num) || valType(num)!='number'){ + num=20; + } + var time=player.time(); + if(time-num>0){ + time-=num; + } + else{ + time=0; + } + player.seek(time); + return player; + }, + /* + * fastNext + * 功能:快进 + * @num为数字时快进指定秒数,为空时快进20秒 + */ + fastNext:function(num){ + if(duration==0) return; + if(isUndefined(num) || valType(num)!='number'){ + num=20; + } + var time=player.time(); + if(time+num200) zIndex=200; + if(isUndefined(ele.cssDisplay)){ + ele.cssPosition=ele.css('position'); + ele.cssDisplay=ele.css('display'); + } + ele.css({ + 'position': 'absolute', + 'z-index':zIndex + }); + if(!cBar){ + CM.append(ele); + } + else{ + C['bar'].append(ele); + } + ele.CK=CK; + ele.show(); + } + return ele; + }, + /* + * closeLayer + * 功能:关闭一个层 + */ + closeLayer:function(ele){ + if(valType(ele)=='string'){ + var temp=$(ele); + if(!isUndefined(temp)){ + if(temp.length>0){ + ele=temp.eq(0); + } + } + } + if(!isUndefined(ele) && valType(ele)=='htmlobject'){ + if(!isUndefined(ele.captureParentNode)){ + var eleP=ele.captureParentNode; + if (ele.nextElement) { + try { + eleP.insertBefore(ele, ele.nextElement); + } + catch (event) { + eleP.append(ele); + } + } + else if (ele.prevElement) { + try { + eleP.insertAfter(ele, ele.prevElement); + } + catch (event) { + eleP.append(ele); + } + } + else { + eleP.append(ele); + } + ele.css({'display':ele.cssDisplay}); + } + else{ + ele.remove(); + } + if(!isUndefined(ele.cssDisplay)){ + ele.css({ + 'display':ele.cssDisplay, + 'position':ele.cssPosition + }); + } + } + return player; + }, + /* + * message + * 在播放器内部显示一条提示信息 + */ + message:function(str){ + message(str); + return player; + }, + /* + * closeFrontAd + * 功能:关闭贴片广告 + */ + closeFrontAd:function(){ + if(frontAdPlay && !isUndefined(ad) && !isUndefined(ad['front']) && !isUndefined(ad['front']['list'])){ + ad['frontPlayI']=ad['front']['list'].length-1; + adFrontEnded(); + clearAdFrontSetTime(); + } + return player; + }, + /* + * addListener + * 功能:监听功能 + */ + addListener:function(name,fn){ + newEvent.addEventListener(name,fn); + }, + /* + * removeListener + * 功能:监听功能 + */ + removeListener:function(name,fn){ + newEvent.removeEventListener(name,fn); + }, + /* + * bar + * 功能:显示/关闭底部控制栏 + */ + bar:function(bool){ + barShow=bool; + if(bool){ + C['bar'].show(); + } + else{ + C['bar'].hide(); + } + }, + /* + * rightBar + * 功能:显示/关闭右边控制栏 + */ + rightBar:function(bool){ + rightBarShow=bool; + if(bool){ + C['rightBar'].show(); + } + else{ + C['rightBar'].hide(); + } + }, + /* + * mouseActive + * 功能,监听鼠标是否经过播放器 + */ + mouseActive:function(fn){ + if(!isUndefined(fn) && valType(fn)=='function'){ + newEvent.addEventListener('mouseActive',fn); + } + return this; + }, + /* + * cookie + * 功能,读取cookie + */ + cookie:function(name){ + if(name=='delete'){ + cookie(moeplayerCookie,'delete',vars['domain']); + return null; + } + if(!isUndefined(name) && name){ + name=name.replace(/[ ]*,[ ]*|[ ]+/g, '').replace(/[ ]*;[ ]*|[ ]+/g, ''); + } + var cStr=cookie(moeplayerCookie); + if(cStr){ + var arr=stringToArray(cStr); + var tempArr=[]; + var cTime=parseInt(Date.now()*0.001); + for(i=0;icTime){ + tempArr.push(arr[i]); + } + } + arr=tempArr; + if(arr.length>0){ + cookie(moeplayerCookie,'delete',vars['domain'],vars['cookiePath']); + cookie(moeplayerCookie,arrayToString(arr),vars['domain'],vars['cookiePath']); + for(var i=0;i-1;i--){ + var pTemp=createlButton('ck-list-p',playbackrate[i]+language['playbackrateSuffix']); + pTemp.attr('data-i',i).attr('data-val',playbackrate[i]); + C['bar']['playbackrate']['bg']['p'].push(pTemp); + C['bar']['playbackrate']['bg'].append(pTemp); + pTemp.click(playbackrateClick); + } + C['bar']['playbackrate'].hide(); + if(!isUndefined(vars['playbackrateOpen']) && vars['playbackrateOpen']){ + C['bar']['playbackrate'].show(); + C['bar']['playbackrate']['bgbox'].show(); + var w=C['bar']['playbackrate']['bg'].getWidth(),h=C['bar']['playbackrate']['bg'].getHeight(); + var bw=C['bar']['playbackrate']['button'].getWidth(); + C['bar']['playbackrate']['bg'].css({'width':w+10+'px'}); + w=C['bar']['playbackrate']['bg'].getWidth(); + if(getBarHeight()>C['bar'].getHeight()){ + h+=(getBarHeight()-C['bar'].getHeight()); + } + C['bar']['playbackrate']['bgbox'].attr('style',''); + C['bar']['playbackrate']['bgbox'].css({ + 'width':w+'px', + 'height':(h+2)+'px', + 'left':-(w-bw)*0.5+'px' + }); + C['bar']['playbackrate']['button'].mouseover(function(){ + w=C['bar']['playbackrate']['bg'].getWidth(); + bw=C['bar']['playbackrate']['button'].getWidth(); + C['bar']['playbackrate']['bgbox'].css({ + 'left':-(w-bw)*0.5+'px' + }); + }); + changePlaybackrateVal(pbr); + } + }, + /* + * playbackrateClick + * 功能:选择播速 + */ + playbackrateClick=function(e){ + C['bar']['playbackrate']['bgbox'].hide(); + setTimeout(function(){C['bar']['playbackrate']['bgbox'].removeCss('display');},300); + message(language['switchTo']+$(this).htm()); + player.playbackRate(parseFloat($(this).attr('data-val'))); + }, + /* + * changePlaybackrateVal + * 功能:根据速度检查播速 + */ + changePlaybackrateVal=function(num){ + C['bar']['playbackrate']['bg'].find('button').each(function(index,ele){ + var val=parseFloat(ele.attr('data-val')); + ele.removeClass('ck-list-p-focus'); + if(num==val){ + ele.addClass('ck-list-p-focus'); + if(num!=1){ + C['bar']['playbackrate']['button'].htm(ele.htm()); + } + else{ + C['bar']['playbackrate']['button'].htm(language['playbackrate']); + } + } + else{ + ele.removeClass('ck-list-p-focus'); + } + }); + }, + /* + * checkTrack + * 功能:初始化或重置字幕组件内容 + */ + checkTrack=function(){ + var track=vars['track']; + var pbr=-1; + C['bar']['track']['bgbox'].htm(''); + C['bar']['track']['bg']=createlDiv('ck-list-bg'); + C['bar']['track']['bgbox'].append(C['bar']['track']['bg']); + C['bar']['track']['bg']['p']=[]; + var pTemp=null; + for(var i=track.length-1;i>-1;i--){ + pTemp=createlButton('ck-list-p',track[i]['label']); + pTemp.attr('data-i',i).attr('data-title',track[i]['label']); + C['bar']['track']['bg']['p'].push(pTemp); + C['bar']['track']['bg'].append(pTemp); + if(!isUndefined(track[i]['default']) && track[i]['default']){ + pbr=i; + } + pTemp.click(trackClick); + } + // + pTemp=createlButton('ck-list-p',language['noTrack']); + pTemp.attr('data-i',-1).attr('data-title',language['noTrack']); + C['bar']['track']['bg']['p'].push(pTemp); + C['bar']['track']['bg'].append(pTemp); + pTemp.click(trackClick); + // + C['bar']['track'].hide(); + C['bar']['track'].show(); + C['bar']['track']['bgbox'].show(); + var w=C['bar']['track']['bg'].getWidth(),h=C['bar']['track']['bg'].getHeight(); + var bw=C['bar']['track']['button'].getWidth(); + C['bar']['track']['bg'].css({'width':w+10+'px'}); + w=C['bar']['track']['bg'].getWidth(); + if(getBarHeight()>C['bar'].getHeight()){ + h+=(getBarHeight()-C['bar'].getHeight()); + } + C['bar']['track']['bgbox'].attr('style',''); + C['bar']['track']['bgbox'].css({ + 'width':w+'px', + 'height':(h+2)+'px', + 'left':-(w-bw)*0.5+'px' + }); + C['bar']['track']['button'].mouseover(function(){ + w=C['bar']['track']['bg'].getWidth(); + bw=C['bar']['track']['button'].getWidth(); + C['bar']['track']['bgbox'].css({ + 'left':-(w-bw)*0.5+'px' + }); + }); + changeTrackVal(pbr); + }, + /* + * trackClick + * 功能:选择字幕 + */ + trackClick=function(e){ + C['bar']['track']['bgbox'].hide(); + setTimeout(function(){C['bar']['track']['bgbox'].removeCss('display');},300); + message(language['switchTo']+$(this).attr('data-title')); + player.track(parseFloat($(this).attr('data-i'))); + }, + /* + * changeTrackVal + * 功能:根据字幕检查 + */ + changeTrackVal=function(num){ + C['bar']['track']['bg'].find('button').each(function(index,ele){ + var i=parseInt(ele.attr('data-i')); + if(num==i){ + C['bar']['track']['button'].htm(ele.attr('data-title')); + if(i>-1){ + CT.track=vars['track'][i]; + eventTarget('track',vars['track'][i]); + } + else{ + CT.track=null; + eventTarget('track',null); + } + ele.addClass('ck-list-p-focus'); + } + else{ + ele.removeClass('ck-list-p-focus'); + } + }); + }, + /* + * checkDefinition + * 功能:初始化或重置清晰度组件内容 + */ + checkDefinition=function(){ + var pi=-1; + var videoUrl=video['currentSrc']; + if(!isUndefined(C['bar']['definition']['bg'])){ + C['bar']['definition']['bgbox'].htm(''); + C['bar']['definition']['bgbox'].attr('style',''); + C['bar']['definition']['button'].htm(language['definition']); + } + if(valType(vars['video'])=='array'){ + var arr=vars['video']; + C['bar']['definition']['bg']=createlDiv('ck-list-bg'); + C['bar']['definition']['bgbox'].append(C['bar']['definition']['bg']); + C['bar']['definition']['bg']['p']=[]; + for(var i=arr.length-1;i>-1;i--){ + var pTemp=createlButton('ck-list-p',arr[i][2]); + pTemp.attr('data-i',i).attr('data-video',arr[i][0]).attr('data-type',arr[i][1]).attr('data-title',arr[i][2]); + C['bar']['definition']['bg']['p'].push(pTemp); + C['bar']['definition']['bg'].append(pTemp); + if(videoUrl && videoUrl.indexOf(arr[i][0])>-1){ + pi=i; + } + pTemp.click(definitionClick); + } + C['bar']['definition'].show(); + C['bar']['definition']['bgbox'].show(); + var w=C['bar']['definition']['bg'].getWidth(),h=C['bar']['definition']['bg'].getHeight(); + var bw=C['bar']['definition']['button'].getWidth(); + C['bar']['definition']['bg'].css({'width':w+10+'px'}); + w=C['bar']['definition']['bg'].getWidth(); + if(getBarHeight()>C['bar'].getHeight()){ + h+=(getBarHeight()-C['bar'].getHeight()); + } + C['bar']['definition']['bgbox'].attr('style',''); + C['bar']['definition']['bgbox'].css({ + 'width':w+'px', + 'height':(h+2)+'px', + 'left':-(w-bw)*0.5+'px' + }); + C['bar']['definition']['button'].mouseover(function(){ + w=C['bar']['definition']['bg'].getWidth(); + bw=C['bar']['definition']['button'].getWidth(); + C['bar']['definition']['bgbox'].css({ + 'left':-(w-bw)*0.5+'px' + }); + }); + } + if(pi>-1){ + C['bar']['definition']['bg'].find('button').each(function(index,ele){ + var i=parseInt(ele.attr('data-i')); + if(pi==i){ + ele.addClass('ck-list-p-focus'); + } + else{ + ele.removeClass('ck-list-p-focus'); + } + }); + } + }, + /* + * definitionClick + * 功能:选择清晰度 + */ + definitionClick=function(e){ + C['bar']['definition']['bgbox'].hide(); + setTimeout(function(){ + C['bar']['definition']['bgbox'].removeCss('display'); + },300); + changeDefinition(parseInt($(this).attr('data-i'))); + }, + /* + * changeDefinition + * 功能:检查清晰度 + */ + changeDefinition=function(num){ + C['bar']['definition']['bg'].find('button').each(function(index,ele){ + var i=parseInt(ele.attr('data-i')); + if(num==i){ + if(!isUndefined(video.textTracks) && video.textTracks.length>0){ + for(var y=video.find('track').length-1;y>-1;y--){ + video.find('track').eq(y).remove(); + } + } + seekTime=player.time(); + video.attr('autoplay','autoplay'); + changeVideo(ele.attr('data-video')); + message(language['switchTo']+ele.htm()); + C['bar']['definition']['button'].htm(ele.htm()); + ele.addClass('ck-list-p-focus'); + eventTarget('definition',{id:i,video:ele.attr('data-video'),title:ele.attr('data-title')}); + } + else{ + ele.removeClass('ck-list-p-focus'); + } + }); + }, + /* + * deletePrompt + * 功能:删除关键点 + */ + deletePrompt=function(){ + var i=0; + if(!isUndefined(C['prompt']) && valType(C['prompt'])=='array'){ + for(i=C['prompt'].length;i>-1;i--){ + if(!isUndefined(C['prompt'][i])){ + C['prompt'][i].remove(); + } + } + C['prompt']=null; + } + C['prompt']=[]; + }, + /* + * changePrompt + * 功能:构建关键点 + */ + changePrompt=function(){ + deletePrompt(); + for(var i=0;i100) left=100; + ele.css({'left':left+'%'}); + ele.mouseover(function(){ + if(this.attr('data-words')){ + showPromptWords(this); + } + }); + ele.mouseout(function(){ + if(this.attr('data-words')){ + showPromptWords(); + } + }); + C['prompt'].push(ele); + } + } + }, + /* + * showPromptWords + * 功能:显示关键点提示 + */ + showPromptWords=function(ele){ + if(isUndefined(C['promptWords'])){ + C['promptWords']=createlDiv('ck-prompt-words'); + CM.append(C['promptWords']); + C['promptWords']['content']=createlDiv('ck-prompt-content'); + C['promptWords'].append(C['promptWords']['content']); + } + if(isUndefined(ele)){ + C['promptWords']['content'].htm(''); + C['promptWords'].hide(); + return; + } + C['promptWords']['content'].htm(ele.attr('data-words')); + C['promptWords'].show(); + var pW=C['promptWords'].getWidth(),pH=C['promptWords'].getHeight(); + var bg=C['bar']['pbox']['bg']; + var time=parseFloat(ele.attr('data-time')); + var top=CK.getHeight()-getBarHeight(); + var left=ele.offset()['left']-CK.offset()['left']+ele.getWidth()*.5-pW*.5; + if(!isUndefined(C['preview'])){ + top=CK.getHeight()-parseFloat((getBarHeight()+C['preview']['smallHight']+parseInt(C['preview'].css('margin-bottom')))); + } + else{ + top=CK.getHeight()-parseFloat((getBarHeight()+C['tip']['minHeight']+parseInt(C['tip'].css('margin-bottom')))); + top-=(getBarHeight()-C['bar'].getHeight()); + } + top-=parseFloat(C['promptWords'].css('margin-bottom')); + top-=pH; + left-=parseFloat(C['promptWords'].css('margin-right')); + if(left<0)left=0; + if(left>CK.getWidth()-pW)left=CK.getWidth()-pW; + C['promptWords'].css({ + 'top':top+'px', + 'left':left+'px' + }); + }, + /* + * changePreview + * 功能:加载或重置预览图片 + */ + changePreview=function(preview){ + if(!isUndefined(C['preview'])){ + C['preview'].remove(); + C['preview']=null; + } + if(!isUndefined(preview)){ + C['preview']=createlDiv('ck-preview'); + CM.append(C['preview']); + if(isUndefined(vars['preview']['type'])){ + vars['preview']['type']=0; + } + if(vars['preview']['type']==1){ + C['preview']['bg']=createlDiv('ck-preview-bg'); + C['preview'].append(C['preview']['bg']); + } + var files=[]; + var loadImg=function(bigW,bigH,smallW,smallH){ + if(vars['preview']['type']==1){ + C['preview']['bg']['img']=[]; + for(var i=0;i1){ + if(valType(vars['preview']['thumbnail'][0])=='number'){ + thumbnail[0]=vars['preview']['thumbnail'][0]; + } + if(valType(vars['preview']['thumbnail'][1])=='number'){ + thumbnail[1]=vars['preview']['thumbnail'][1]; + } + vars['preview']['thumbnail']=thumbnail; + } + if(files[0]){ + var img = createlImg(files[0],'ck-preview-load-img').addListener('load',function(){ + loadImg(this.getWidth(),this.getHeight(),this.getWidth()/thumbnail[0],this.getHeight()/thumbnail[1]); + this.remove(); + }); + CM.append(img); + } + } + else{ + C['preview'].removeChild(); + C['preview']=null; + } + } + else{ + C['preview'].removeChild(); + C['preview']=null; + } + } + }, + /* + * showPreview + * 功能:显示预览图 + */ + showPreview=function(time){ + if(hidePreviewSetTime){ + clearTimeout(hidePreviewSetTime); + hidePreviewSetTime=null; + } + if(time<0){ + if(!isUndefined(C['preview'])){ + hidePreviewSetTime=setTimeout(function(){ + C['preview'].hide(); + hidePreviewSetTime=null; + },200); + return; + } + } + if(!isUndefined(C['preview']) && !isUndefined(vars['preview']['thumbnail']) && duration>0){ + if(isUndefined(vars['preview']['type'])){ + vars['preview']['type']=0; + } + var scale=2,thumbnail=vars['preview']['thumbnail']; + if(!isUndefined(vars['preview']['scale'])){ + scale=vars['preview']['scale']; + } + var divI=0,imgI=0; + var left=0,frameLeft=0; + var pW=0; + var smallW=C['preview']['smallWidth'],smallH=C['preview']['smallHight']; + var bgXw=time*C['bar']['pbox']['bg'].getWidth()/duration+(C['bar']['pbox']['bg'].offset()['left']-CK.offset()['left']); + if(C['preview'].css('display')=='none'){ + C['preview'].show(); + } + C['preview'].css({ + 'height':smallH+'px', + }); + if(vars['preview']['type']==1){ + divI=parseInt(time/(scale*thumbnail[0])); + imgI=parseInt(time/scale); + var minI=divI-5,maxI=divI+5; + if(minI<0) minI=0; + if(maxI>C['preview']['bg']['img'].length-1){ + maxI=C['preview']['bg']['img'].length-1; + } + for(var i=minI;iC['preview'].getWidth()-C['preview']['frame'].getWidth()){ + var xz=frameLeft-(C['preview'].getWidth()-C['preview']['frame'].getWidth()); + frameLeft=C['preview'].getWidth()-C['preview']['frame'].getWidth(); + left-=xz; + } + C['preview']['bg'].css({'left':left+'px'}); + C['preview']['frame'].css({'left':frameLeft+'px'}); + } + else{ + var temp=(time/scale)/(thumbnail[0]*thumbnail[1]); + imgI=parseInt(temp);//计算显示的图片编号 + var smallI=parseInt((temp-imgI)*100); + var rows=parseInt(smallI/thumbnail[0]); + var column=smallI%thumbnail[0]; + var files=vars['preview']['file']; + left=bgXw-smallW*.5; + if(left<0){ + left=0; + } + if(left>CK.getWidth()-smallW){ + left=CK.getWidth()-smallW; + } + C['preview'].css({ + 'width':C['preview']['smallWidth']+'px', + 'background':'url('+files[imgI]+') no-repeat', + 'background-position':'-'+column*smallW+'px -'+rows*smallH+'px', + 'left':left+'px' + }); + } + } + }, + /* + * showError + * 功能:显示错误信息 + */ + showError=function(){ + C['loading'].hide(); + if(vars['controls'] || !vars['errorShow']){ + return; + } + if(isUndefined(C['error'])){ + C['error']=createlDiv('ck-error'); + CM.append(C['error']); + } + var msg=CT.error['message']; + if(!msg) msg=language['error']['noMessage']; + var html=msg+'(code:'+CT.error['code']+')'; + C['error'].htm(html); + C['error'].show(); + }, + /* + * showWindowsError + * 功能:显示错误信息 + */ + showWindowsError=function(error){ + var ele=createlDiv('moeplayer-error',error); + $('body').append(ele); + }, + /* + * showNextEpisode + * 功能:鼠标经过下一集按钮的动作 + */ + showNextEpisode=function(){ + if(isUndefined(vars['next'])) return; + if(valType(vars['next'])=='object'){ + if('content' in vars['next']){ + C['next']=player.layer(vars['next']); + return; + } + if('title' in vars['next']){ + tip(C['bar']['nextEpisode'],vars['next']['title']); + return; + } + } + tip(C['bar']['nextEpisode'],language['next']); + }, + /* + * nextClick + * 功能:点击下一集按钮的动作 + */ + nextClick=function(){ + if(valType(vars['next'])=='object'){ + if('click' in vars['next']){ + if(valType(vars['next']['click'])=='function'){ + vars['next']['click'](); + } + else if(valType(vars['next']['click'])=='string'){ + eval(vars['next']['click']+'()'); + } + } + if('link' in vars['next']){ + window.location.href=vars['next']['link']; + } + eventTarget('next'); + } + }, + /* + * showEnded + * 功能:播放结束后的显示内容 + */ + showEnded=function() { + if(!CT.loop && !isUndefined(vars['ended'])){ + closePauseAd(); + C['ended']=player.layer(vars['ended']); + if(C['ended']){ + C['centerPlay'].hide(); + } + return; + } + }, + /* + * windowScroll + * 功能:监听页面滚动 + */ + windowScroll=function() { + if(!CT.smallWindows) return; + if(CT.webFull || CT.theatre || CT.full){ + exitSmallWindows(); + return; + } + var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; + if(scrollTop>CT.offset()['top']+CT.getHeight()){ + if(!CK.hasClass('moeplayer-smallwindow')){ + CK.addClass('moeplayer-smallwindow'); + eventTarget('smallWindows',true); + smallWindowsState=true; + if(vars['smallWindowsDrag']){ + drag(true); + } + allBarHide(); + checkVideoRotate(); + } + } + else{ + exitSmallWindows(); + } + }, + /* + * exitSmallWindows + * 退出小窗口模式 + */ + exitSmallWindows=function(){ + if(CK.hasClass('moeplayer-smallwindow')){ + CK.removeClass('moeplayer-smallwindow'); + if(vars['smallWindowsDrag']){ + drag(); + } + eventTarget('smallWindows',false); + smallWindowsState=false; + allBarShow(); + checkVideoRotate(); + } + }, + /* + * drag + * 功能,使节点可拖动 + * state:是否开启可拖动,默认=false,关闭状态 + */ + drag=function(state) { + var doc=$(document); + var posX = 0,posY = 0, + posXRecord = 0,posYRecord = 0; + var open=false; + if(!isUndefined(state)){ + open=state; + } + var mouseDown = function(e) { + e.preventDefault && e.preventDefault(); + e = e || window.event; + var client = getClient(e); + posXRecord = client['x']; + posYRecord = client['y']; + doc.mousemove(docMouseMove); + doc.mouseup(docMouseUp); + CK.css({ + 'cursor':'move' + }); + }; + var docMouseMove = function(e) { + e = e || window.event; + var client = getClient(e); + var eleOffset = CK.offset(); + posY = client['y']-posYRecord; + posX = client['x']-posXRecord; + posXRecord = client['x']; + posYRecord = client['y']; + var left=eleOffset['left']+posX; + var top=eleOffset['top']+posY; + CK.css({ + 'left':left+'px', + 'top':top+'px' + }); + if(CK.css('position')!='fixed'){ + CK.css({ + 'position':'fixed' + }); + } + isDrag=true; + }; + var docMouseUp = function() { + doc.removeListener('mousemove', docMouseMove); + doc.removeListener('mouseup', docMouseUp); + CK.css({ + 'cursor':'default' + }); + }; + if(open){ + CK.mousedown(mouseDown); + } + else{ + CK.unbind('mousedown'); + } + }, + /* + * checkVideoRotate + * 检查播放器尺寸 + */ + checkVideoRotate=function(){ + var ckW=CK.getWidth()*nowZoom*0.01,ckH=CK.getHeight()*nowZoom*0.01; + var vW=CV.getWidth(),vH=CV.getHeight(); + CV.css({ + 'transform':'rotate('+nowRotate+'deg)', + '-ms-transform':'rotate('+nowRotate+'deg)', + '-moz-transform':'rotate('+nowRotate+'deg)', + '-webkit-transform':'rotate('+nowRotate+'deg)', + '-o-transform':'rotate('+nowRotate+'deg)', + 'width':nowZoom+'%', + 'height':nowZoom+'%' + }); + if(nowRotate!=0 && nowRotate!=180){ + if(vH>ckW && vW>ckH){ + if(vH / ckW > vW / ckH) { + CV.css({ + 'height':nowZoom+'%', + 'width':ckH+'px' + }); + } + else { + CV.css({ + 'width':nowZoom+'%', + 'height':ckW+'px' + }); + } + return; + } + if(vHckH){ + CV.css({ + 'height':nowZoom+'%', + 'width':ckH+'px' + }); + } + else{ + if(vH / vW >= ckW / ckH) { + CV.css({ + 'width':nowZoom+'%', + 'height':ckW+'px' + }); + } + else { + CV.css({ + 'height':nowZoom+'%', + 'width':ckH+'px' + }); + } + } + return; + } + if(vH>=ckW && vW<=ckH){ + CV.css({ + 'width':nowZoom+'%', + 'height':ckW+'px' + }); + return; + } + if(vW>=ckH && vHC['bar'].getHeight()){ + top-=(getBarHeight()-C['bar'].getHeight()); + } + if(w>ew){ + left=offset['left']-ckOffset['left']-(w-ew)*.5; + } + else{ + left=offset['left']-ckOffset['left']+(ew-w)*.5; + } + if(align=='left'){ + left=offset['left']-ckOffset['left']-w; + top=offset['top']-ckOffset['top']; + } + if(!isUndefined(cl)){ + left=cl['x']-ckOffset['left']-w*.5; + } + if(left<0){ + left=0; + } + if(top<0){ + top=0; + } + if(left>CM.getWidth()-w){ + left=CM.getWidth()-w; + } + if(top>CM.getHeight()-h){ + top=CM.getHeight()-h; + } + C['tip'].css({ + 'left':left+'px', + 'top':top-parseInt(C['tip'].css('margin-bottom'))+'px' + }); + }, + /* + * progressDragX + * 功能:制作进度调节框事件 + */ + progressDragX=function(){ + var bg=C['bar']['pbox']['bg'], + play=C['bar']['pbox']['play'], + slider=C['bar']['pbox']['slider'], + mouseLine=C['bar']['pbox']['mouseLine']; + slider.unbind(); + bg.unbind(); + var pos = 0, + posRecord = 0; + var doc=$(document); + var sliderDownTime=0; + var sliderMouseDown = function(e) { + e.preventDefault && e.preventDefault(); + if(!vars['timeScheduleAdjust']){//禁止拖动 + return; + } + e = e || window.event; + var eleOffset = slider.offset(),bgOffset=bg.offset(),client = getClient(e); + pSliderMouseDown=true; + posRecord = client['x']; + //供比较 + var left = eleOffset['left']-bgOffset['left']; + sliderDownTime=left*duration/(bg.getWidth()-slider.getWidth()); + slider.removeListener('mousedown', sliderMouseDown); + slider.removeListener('touchstart', sliderMouseDown); + doc.mousemove(docMouseMove); + doc.mouseup(docMouseUp); + slider.touchmove(docMouseMove); + slider.touchend(docMouseUp); + noScrolling(true); + }; + var docMouseMove = function(e) { + e = e || window.event; + var eleOffset = slider.offset(),bgOffset=bg.offset(),client = getClient(e); + pSliderMouseDown=true; + pos = posRecord - client['x']; + posRecord = client['x']; + var left = eleOffset['left'] - pos-bgOffset['left']; + if(left<0){ + left=0; + } + if(left>bg.getWidth()-slider.getWidth()){ + left=bg.getWidth()-slider.getWidth(); + } + C['bar']['pbox'].addClass('ck-bar-progress-slider-move'); + //预览时间 + var time=''; + if(!vars['live']){ + time=left*duration/(bg.getWidth()-slider.getWidth()); + switch(vars['timeScheduleAdjust']){ + case 2://只能前进(向右拖动 + if(timesliderDownTime){ + left=-1000; + message(language['timeScheduleAdjust']['prohibitForward']); + return; + } + break; + case 4://只能前进但能回到第一次拖动时的位置 + if(timemaxSeeTime){ + left=-1000; + player.seek(maxSeeTime); + message(language['timeScheduleAdjust']['prohibitForwardNotViewed']); + return; + } + break; + } + time=formatSeconds(time); + } + else{ + time=formatLiveTime(left*getLiveTime()/(bg.getWidth()-slider.getWidth())); + } + tip(slider,time); + if(left>=0){ + slider.css({ + 'left': left + 'px' + }); + play.css({ + 'width': left+ slider.getWidth()*.5+ 'px' + }); + } + else{ + pSliderMouseDown=false; + } + + }; + var docMouseUp = function() { + noScrolling(); + doc.removeListener('mousemove', docMouseMove); + doc.removeListener('mouseup', docMouseUp); + slider.removeListener('touchmove', docMouseMove); + slider.removeListener('touchend', docMouseUp); + slider.mousedown(sliderMouseDown); + slider.touchstart(sliderMouseDown); + if(!vars['live']){ + var time=play.getWidth()*duration/(bg.getWidth()-slider.getWidth()*.5); + if(time>duration){ + time=duration; + } + seekTime=0; + player.seek(time); + } + else{ + var playbackTime=parseInt(vars['live']+play.getWidth()*getLiveTime()/(bg.getWidth()-slider.getWidth()*.5)); + eventTarget('playback',{time:playbackTime,date:date('Y-m-d H:i:s',playbackTime)}); + eventTarget('seek',{time:playbackTime,state:'seeking',date:date('Y-m-d H:i:s',playbackTime)}); + } + C['bar']['pbox'].removeClass('ck-bar-progress-slider-move'); + if(isMouseLeave){ + tip(); + } + }; + var isMouseLeave=true;//默认鼠标离开了进度按钮上 + var sliderMouseOver=function(){ + var time=''; + if(!vars['live']){ + time=formatSeconds(parseInt(slider.css('left'))*duration/(bg.getWidth()-slider.getWidth())); + } + else{ + time=language['live']; + } + isMouseLeave=false; + tip(slider,time); + }; + + var sliderMouseLeave=function(){ + isMouseLeave=true; + }; + slider.mousedown(sliderMouseDown); + slider.mouseover(sliderMouseOver); + slider.mouseleave(sliderMouseLeave); + slider.touchstart(sliderMouseDown); + var bgMouseDown=function(e){ + e = e || window.event; + var client = getClient(e); + var bgOffset=bg.offset(); + var w=client['x']-bgOffset['left']; + if(CT.full){ + w+=CK.offset()['left']; + } + if(!vars['live']){ + var time=duration*w/bg.getWidth(); + switch(vars['timeScheduleAdjust']){ + case 0://禁止拖动 + message(language['timeScheduleAdjust']['prohibit']); + return; + break; + case 2://只能前进(向右拖动 + if(timeoldTime){ + message(language['timeScheduleAdjust']['prohibitForward']); + return; + } + break; + case 4://只能前进但能回到第一次拖动时的位置 + if(timemaxSeeTime){ + message(language['timeScheduleAdjust']['prohibitForwardNotViewed']); + return; + } + break; + } + seekTime=0; + player.seek(time); + } + else{ + var playbackTime=parseInt(vars['live']+getLiveTime()*w/bg.getWidth()); + eventTarget('playback',{time:playbackTime,date:date('Y-m-d H:i:s',playbackTime)}); + eventTarget('seek',{time:playbackTime,state:'seeking',date:date('Y-m-d H:i:s',playbackTime)}); + } + if(w>bg.getWidth()-slider.getWidth()*.5){ + w=bg.getWidth()-slider.getWidth()*.5 + } + if(wmaxTop){ + sliderTop=maxTop; + } + slider.css({ + 'top':sliderTop+'px' + }); + var ppMarginTop=sliderTop-minTop+slider.getHeight()*0.5; + pp.css({ + 'margin-top':ppMarginTop+'px' + }); + var vol=(bg.getHeight()-ppMarginTop-slider.getHeight()*0.5)/(bg.getHeight()-slider.getHeight()); + player.volume(vol); + }; + var docMouseUp = function() { + noScrolling(); + doc.removeListener('mousemove', docMouseMove); + doc.removeListener('mouseup', docMouseUp); + slider.removeListener('touchmove', docMouseMove); + slider.removeListener('touchend', docMouseUp); + slider.mousedown(sliderMouseDown); + slider.touchstart(sliderMouseDown); + C['bar']['vbox']['mouseDown']=false; + }; + slider.mousedown(sliderMouseDown); + slider.touchstart(sliderMouseDown); + var bgMouseDown=function(e){ + e = e || window.event; + var client = getClient(e); + var bgOffset=bg.offset(); + var h=client['y']-bgOffset['top']; + var max=bg.getHeight(); + var vol=1-h/max; + player.volume(vol); + }; + bg.mousedown(bgMouseDown); + }, + /* + * changeProgress + * 功能:根据时间调节播放进度 + */ + changeProgress=function(time){ + if((valType(vars['live'])=='boolean' && vars['live'])){ + return; + } + if(!pSliderMouseDown){ + var bg=C['bar']['pbox']['bg'],slider=C['bar']['pbox']['slider']; + var playW=(time/duration)*100; + + if(valType(vars['live'])=='number'){ + playW='100'; + } + C['bar']['pbox']['play'].css({'width':playW+'%'}); + var sliderW=(slider.getWidth()/bg.getWidth())*100; + var sliderLeft=playW-sliderW*.5; + if(sliderLeft<0){ + sliderLeft=0; + } + if(sliderLeft>100-sliderW){ + sliderLeft=100-sliderW; + } + C['bar']['pbox']['slider'].css({'left':sliderLeft+'%'}); + checkProgressSlider(); + } + }, + /* + * checkProgressSlider + * 功能:检查设置播放进度条位置 + */ + checkProgressSlider=function(){ + var bg=C['bar']['pbox']['bg'],slider=C['bar']['pbox']['slider']; + var st=0; + if(C['bar']['pbox'].css('transition-duration')){ + st=parseFloat(C['bar']['pbox'].css('transition-duration'))*1000+20; + } + var checkThis=function(){ + var sliderLeft=parseInt(C['bar']['pbox']['slider'].css('left')); + if(sliderLeft<0){ + sliderLeft=0; + C['bar']['pbox']['slider'].css({'left':sliderLeft+'px'}); + } + if(sliderLeft>bg.getWidth()-slider.getWidth()){ + sliderLeft=bg.getWidth()-slider.getWidth(); + C['bar']['pbox']['slider'].css({'left':sliderLeft+'px'}); + } + }; + setTimeout(checkThis,st); + }, + /* + * changeTopTime + * 功能:修改顶部右侧时间 + */ + changeTopTime=function(){ + C['topBar']['timeEle'].htm(date('H:i:s')); + setTimeout(changeTopTime,1000); + }, + /* + * changeVolumeSlider + * 功能:根据音量改变滑块位置 + */ + changeVolumeSlider=function(vol){ + if(!isUndefined(C['bar']['vbox'])){ + var box=C['bar']['vbox']['volume']['box'], + bg=C['bar']['vbox']['volume']['bg'], + pp=C['bar']['vbox']['volume']['pp'], + slider=C['bar']['vbox']['volume']['slider']; + C['bar']['vbox']['volume']['txt'].htm(parseInt(vol*100)); + var bgH=bg.getHeight(); + if(bgH){ + var ppMarginTop=bgH-vol*bgH; + pp.css({ + 'margin-top':ppMarginTop+'px' + }); + var sliderTop=bg.offset()['top']-box.offset()['top']+ppMarginTop-slider.getHeight()*0.5; + slider.css({ + 'top':sliderTop+'px' + }); + } + } + }, + /* + * changeLoad + * 功能:获取视频已加载部分并修改加载进度栏 + */ + changeLoad=function(){ + if(video){ + var len = video.buffered.length; + if(len>0){ + var bufferEnd = video.buffered.end(len-1); + if(loadTime= 1000) { + last += offset; + appendFps(fps); + fps = 0; + } + requestAnimationFrame(step); + }; + var appendFps = function(fps) { + if(fps!=CT.fps){ + CT.fps=fps; + replaceInformation('fps',fps); + eventTarget('fps',fps); + } + + }; + if(isUndefined(CT.fps)){ + CT.fps=0; + } + step(); + }, + /* + * getElement + * 功能:获取一个外部节点 + */ + getElement=function(content){ + var ele=$(content); + if(isUndefined(ele)) return; + if(valType(ele)=='htmlarray'){ + ele=ele[0]; + } + if(isUndefined(ele.captureParentNode)){ + ele.captureParentNode = ele.parentNode; + ele.prevElement=ele.prev(); + ele.nextElement=ele.next(); + } + return ele; + }, + /* + * $ + * 功能:根据ID或className或节点节点名称获取对象 + */ + $=function(obj, eL) { + var parent = null; + if (document) { + parent = document; + } + if (!isUndefined(eL)) { + parent = eL; + } + var res = []; + if (obj) { + if (valType(obj) == 'htmlobject' || valType(obj)=='object') { + res = obj; + if (!isUndefined(res.moeplayer)) { + return res; + } + } + else if (valType(obj) == 'string' && obj!='') { + switch (obj.substr(0, 1)) { + case '.': + obj = obj.substr(1, obj.length); + if (parent.getElementsByClassName) { + res = parent.getElementsByClassName(obj); + if (!res.length) { + return null; + } + } + else if (!parent && document.getElementsByClassName) { + res = document.getElementsByClassName(obj); + if (!res.length) { + return null; + } + } + else { + var reg = new RegExp(' ' + obj + ' ', 'i'); + var ele = null; + if (parent.getElementsByTagName) { + ele = parent.getElementsByTagName('*'); + } else { + ele = document.getElementsByTagName('*'); + } + for (var i = 0; i < ele.length; i++) { + if (reg.test(' ' + ele[i].className + ' ')) { + res.push(ele[i]); + } + } + } + if (res) { + if (res.length === 0) { + res = null; + } + } + break; + case '#': + obj = obj.substr(1, obj.length); + if (parent.getElementById) { + res = parent.getElementById(obj); + } else { + res=document.getElementById(obj); + } + break; + default: + var reg = new RegExp(' ' + obj + ' ', 'i'); + if (parent.getElementsByTagName) { + res = parent.getElementsByTagName(obj); + } else { + res = document.getElementsByTagName(obj); + } + if (res) { + if (obj == 'body' || obj == 'document' || obj == 'html') { + res = res[0]; + } else if (res.length === 0) { + res = null; + } + } else { + res = null; + } + break; + } + } + else { + res = obj; + } + } + else { + res = document; + } + + if (res) { + if (valType(res) == 'htmlobject' || valType(res) == 'object' || valType(res) == 'document') { + res.moeplayer = 'Thanks for using'; + /* + * find + * 功能:在当前节点中查找指定节点 + */ + res.find = function(obj) { + return $(obj, this); + }; + /* + * attr + * 功能:修改或获取节点的属性值 + * @key不能为空,指属性名称,$value不为空则设置属性值,为空则获取属性值 + */ + res.attr = function(key, value) { + if (isUndefined(value)) { + return this.getAttribute(key); + } + else { + this.setAttribute(key, value); + return this; + } + }; + /* + * removeAtt + * 功能:删除节点的属性值 + * @key不能为空,指属性名称 + */ + res.removeAttr = function(key) { + this.removeAttribute(key); + return this; + }; + /* + * css + * 功能:修改或获取节点的样式样式 + * @key不能为空,指属性名称,$value不为空则设置属性值,为空则获取属性值 + */ + res.css = function(key, value) { + // 拆解字符串并将第二单词首字母大写 + var keyNew = function(str) { + // 当属性名有横杠时 + if (str.indexOf('-') != -1) { + var arr = str.split('-'); + var a = arr[0]; + var b = '', + c = ''; + if (arr.length > 1) { + b = arr[1].substr(0, 1).toLocaleUpperCase() + arr[1].substr(1, arr[1].length - 1); + } + if (arr.length > 2) { + b = arr[2].substr(0, 1).toLocaleUpperCase() + arr[2].substr(1, arr[2].length - 1); + } + return a + b + c; + } + // 没有横杠就不进行字符串拆解 + return str; + }; + if (isUndefined(value)){ + if (!isUndefined(key) && valType(key) == 'string') { + if (this.currentStyle) { + return this.currentStyle[key]; + } else { + return document.defaultView.getComputedStyle(this, null)[key]; + } + } + if (isUndefined(key)) { + if (this.currentStyle) { + return this.currentStyle; + } else { + return document.defaultView.getComputedStyle(this, null); + } + } + } + // 当传进来的参数key不是一个对象,给节点添加css样式 + if (valType(key) != 'object') { + var newKey = keyNew(key); + if (this.length > 1) { + // 如果this有多个值,那给每个节点都添加样式 + for (var i = 0; i < this.length; i++) { + this[i].style[newKey] = value; + } + } else { + this.style[newKey] = value; + } + } else { + //如果第一个值是一个对象,遍历这个对象,并将属性名传进函数进行拆解 + for (var item in key) { + var objKey = keyNew(item); + if (valType(this) == 'htmlarray') { + for (var i = 0; i < this.length; i++) { + this[i].style[objKey] = key[item]; + } + } else { + this.style[objKey] = key[item]; + } + } + } + return this; + }; + res.hasClass = function(cName) { + if (isUndefined(cName)) return false; + var reg = new RegExp('(\\s|^)' + cName + '(\\s|$)'); + if (this.className && this.className.match(reg)) { + return true; + } + return false; + }; + res.addClass = function(cName) { + if (!this.hasClass(cName)) { + if (this.className && this.className.substr(this.className.length - 1, 1) != ' ') { + this.className += ' '; + } + this.className += cName; + }; + return this; + }; + res.removeClass = function(cName) { + if (this.hasClass(cName)) { + this.className = this.className.replace(new RegExp('(\\s|^)' + cName + '(\\s|$)'), ' '); + if (this.className.substr(this.className.length - 1, 1) == ' ') { + this.className = this.className.substr(0, this.className.length - 1); + } + if (!this.className) { + this.removeAttribute('class'); + } + }; + return this; + }; + res.searchClass = function(cName) { + var arr = this.className.split(' '); + for (var i = 0; i < arr.length; i++) { + if (arr[i].substr(0, cName.length) == cName) { + return arr[i]; + } + } + return this; + }; + res.removeCss=function(cName){ + var cs=this.attr('style'); + if(cs){ + var arr=cs.split(';'); + var obj={}; + for(var i=0;i= m + 1) { + return this[m]; + } + return null; + } + return null; + }; + for (var i = 0; i < res.length; i++) { + if ($) { + try { + res[i] = $(res[i]); + } catch (event) {} + } + } + } + + } + return res; + }, + /* + * createlDiv + * 功能:新建一个DIV节点 + */ + createlDiv=function(className,html) { + var ele = document.createElement('div'); + var eleObject = $(ele); + if (className) { + eleObject.addClass(className); + } + if(html){ + eleObject.htm(html); + } + return eleObject; + }, + /* + * createlVideo + * 功能:新建一个video节点 + */ + createlVideo=function() { + var ele = document.createElement('video'); + var eleObject = $(ele); + return eleObject; + }, + /* + * createlButton + * 功能新建一个button节点 + */ + createlButton=function(className,html) { + var ele = document.createElement('button'); + var eleObject = $(ele); + eleObject.attr('type','button'); + if (className) { + eleObject.addClass(className); + } + if(html){ + eleObject.htm(html); + } + return eleObject; + }, + /* + * createlA + * 功能新建一个a节点 + */ + createlA=function(html,href,className) { + var ele = document.createElement('a'); + var eleObject = $(ele); + if(html){ + eleObject.htm(html); + } + if(!isUndefined(href) && href){ + eleObject.attr('href',href); + eleObject.attr('target','_blank'); + } + if (className) { + eleObject.addClass(className); + } + return eleObject; + }, + /* + * createlJsLink + * 功能新建一个a节点 + */ + createlJsLink=function(html,js) { + var ele = document.createElement('a'); + var eleObject = $(ele); + if(html){ + eleObject.htm(html); + } + if(!isUndefined(js) && js){ + eleObject.attr('href','javascript:'+js+'()'); + } + else{ + eleObject.attr('href','javascript:;'); + } + return eleObject; + }, + /* + * createlImg + * 功能新建一个img节点 + */ + createlImg=function(file,className) { + var ele = document.createElement('img'); + var eleObject = $(ele); + if (className) { + ele.className = className; + } + if(file){ + ele.src=file; + } + return eleObject; + }, + /* + * getClient + * 功能:获取clientX和clientY + */ + getClient=function(event) { + var eve = event || window.event; + if (isUndefined(eve)) { + eve = { + clientX: 0, + clientY: 0 + }; + } + var x=eve.clientX + (document.documentElement.scrollLeft || $('body').scrollLeft), + y=eve.clientY + (document.documentElement.scrollTop || $('body').scrollTop); + if(isUndefined(x.toString()) || x.toString()=='NaN'){ + x=eve.touches[0].clientX + } + if(isUndefined(y.toString()) || y.toString()=='NaN'){ + y=eve.touches[0].clientY + } + if(x.toString()=='NaN'){ + x=0; + } + if(y.toString()=='NaN'){ + y=0; + } + return { + x: x, + y: y + } + }, + /* + * getLiveTime + * 功能:获取直播回放时间 + */ + getLiveTime=function(){ + var notTime=Date.now(); + var varsTime=vars['live']; + if(varsTime.toString().length<13){ + varsTime=varsTime*1000; + } + return notTime-varsTime; + }, + /* + * formatLiveTime + * 功能:将直播的时间戳格式化成标准时间 + */ + formatLiveTime=function(time){ + var varsTime=vars['live']; + if(varsTime.toString().length<13){ + varsTime=varsTime*1000; + } + varsTime+=time; + return language['lookBack']+date('H:i:s',varsTime); + }, + /* + * loadJs + * 功能:加载js文件并在加载完成后执行callback函数 + * @file:js文件地址 + * @callback:加载完成后执行的函数 + */ + loadJs=function(file, callback) { + var fn =function() {}; + if(!isUndefined(callback)){ + fn=callback; + } + if(checkJs(file)){ + fn(); + return; + } + var script = document.createElement('script'); + script.type = 'text/javascript'; + var isReady = false; + var timer = null; + var doReady = function() { + if(timer){ + clearInterval(timer); + } + if(isReady) return; + isReady = true; + if(valType(fn) == 'function') { + fn(); + } + }; + var bodyLoad = function() { + timer = setInterval(function() { + try { + if(!isUndefined(script.readyState) && script.readyState == 'complete') { + doReady(); + } + } catch(event) {}; + }, 10); + }; + var w3c = function() { + if(valType(fn) == 'function') { + fn(); + } + removeListener(script, 'load', w3c); + removeListener(script, 'error', w3cError); + }; + var w3cError = function() { + if(valType(fn) == 'function') { + fn(); + } + removeListener(script, 'load', w3c); + removeListener(script, 'error', w3cError); + }; + try { + addListener(script, 'load', w3c); + addListener(script, 'error', w3cError); + } catch(event) { + bodyLoad(); + } + script.src = file; + $('head').eq(0).append(script); + }, + + /* + * doubleClickEvent + * 功能:注册对象双击功能 + * @ele:注册对象,可以是页面中的任意节点,不支持数组形式 + */ + doubleClickEvent=function(ele){ + var setTime=null;//注册延时函数 + var clickTime=0;//记录点击时间 + ele=$(ele); + ele.click(function(){ + if(!setTime){ + setTime=setTimeout(function(){ + try{ + ele.dispatchEvent(new Event('sigClick'));//注册单击,针对视频播放器使用 + } + catch(event){ + var e = document.createEvent('HTMLEvents'); + e.initEvent('sigClick', false, true); + ele.dispatchEvent(e); + } + clickTime=0; + setTime=null; + },260); + } + if(!clickTime){ + clickTime=new Date().getTime(); + } + else{ + if(new Date().getTime()-clickTime<230){//认为是双击 + try{ + ele.dispatchEvent(new Event('dobClick'));//注册双击 + } + catch(event){ + var e = document.createEvent('HTMLEvents'); + e.initEvent('dobClick', false, true); + ele.dispatchEvent(e); + } + clearTimeout(setTime); + clickTime=0; + setTime=null; + } + } + }); + }, + /* + * noScrolling + * 功能,禁止页面滚动操作 + */ + noScrolling=function(b){ + if(isUndefined(b)) b=false; + var bodyScroll=function (event){ + event.preventDefault(); + }; + if(b){ //禁止滚动 + $('body').addListener('touchmove', bodyScroll, {passive: false }); + } + else{ //开启滚动 + $('body').removeListener('touchmove',bodyScroll, {passive: false}); + } + }; + return into(videoObj); + } + +export default moeplayerEmbed; diff --git a/src/defaults.js b/src/defaults.js new file mode 100644 index 0000000..d0b9abc --- /dev/null +++ b/src/defaults.js @@ -0,0 +1,62 @@ + /* + * videoObjectDefault + * 功能:静态变量,默认播放配置,当外部传递过来的配置有未包含在varsDefault里的,则使用varsDefault里的配置 + */ + var videoObjectDefault= { + container: '',//视频容器的ID + volume: 0.8,//默认音量,范围0-1 + poster: '',//封面图片地址 + autoplay: false,//是否自动播放 + loop: false,//是否需要循环播放 + live: false,//是否是直播 + rotate:0,//视频旋转角度 + zoom:0,//默认缩放比例 + ad:null,//广告 + backLive:false,//显示返回直播按钮 + seek: 0,//默认需要跳转的秒数 + next: null,//下一集按钮动作 + loaded: '',//加载播放器后调用的函数 + plug: '',//使用插件 + duration:0,//视频总时间 + preview: null,//预览图片对象 + prompt: null,//提示点功能 + crossOrigin:'',//跨域请求字符 + video: null,//视频地址 + type:'',//视频类型 + playbackrate: 1,//默认倍速 + ended:null,//结束显示的内容 + webFull:false,//页面全屏按钮事件 + theatre:null,//剧场模式 + controls:false,//是否显示自带控制栏 + rightBar:null,//是否开启右边控制栏 + smallWindows:null,//是否启用小窗口模式 + smallWindowsDrag:true,//当处于小窗口模式时是否可拖动播放器 + screenshot:false,//截图功能是否开启 + timeScheduleAdjust:1,//是否可调节播放进度,0不启用,1是启用,2是只能前进(向右拖动),3是只能后退,4是只能前进但能回到第一次拖动时的位置,5是看过的地方可以随意拖动 + logo:'',//logo + menu:null,//右键菜单 + information:{//关于 + 'Load:':'{loadTime} second', + 'Duration:':'{duration} second', + 'Size:':'{videoWidth}x{videoHeight}', + 'Volume:':'{volume}%', + 'Fps:':'{fps}fps', + 'Sudio decoded:':'{audioDecodedByteCount} Byte', + 'Video decoded:':'{videoDecodedByteCount} Byte' + }, + track:null,//字幕 + title:'',//视频标题 + language:'',//语言包文件 + barHideTime:1500,//控制栏隐藏时间 + playbackrateOpen:true,//是否开启控制栏倍速选项 + playbackrateList:[0.75,1,1.25,1.5,2,4],//倍速配置值 + cookie:null,//开启cookie功能 + domain:null,//指定cookie保存的域 + cookiePath:'/',//指定cookie保存路径 + documentFocusPause:false,//窗口失去焦点后暂停播放 + mouseWheelVolume:2,//是否启用鼠标滚轮调节音量功能,0=不启用,1=启用,2=全屏时才启用 + keyVolume:2,//是否启用键盘控制音量调节,0=不启用,1=启用,2=全屏时才启用 + errorShow:true//是否显示错误信息 + }; + +export { videoObjectDefault }; diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..922a355 --- /dev/null +++ b/src/index.js @@ -0,0 +1,9 @@ +/* + * 软件名称:MoePlayer + * 版本:X3 + * 版权:MoePlayer 项目(fork 自 ckplayer, www.ckplayer.com) + * 开源协议:MIT + */ +import moeplayerEmbed from './core/moeplayerEmbed.js'; + +export default moeplayerEmbed; diff --git a/src/language.js b/src/language.js new file mode 100644 index 0000000..81b868c --- /dev/null +++ b/src/language.js @@ -0,0 +1,69 @@ + /* + * language + * 功能:静态变量,包含播放器用到的默认语言包 + * 引入其它语言js后该变量将被替换成新引入的语言包 + */ + var language={ + play:'%E6%92%AD%E6%94%BE', + pause:'%E6%9A%82%E5%81%9C', + refresh:'%E9%87%8D%E6%92%AD', + full:'%E5%85%A8%E5%B1%8F', + exitFull:'%E9%80%80%E5%87%BA%E5%85%A8%E5%B1%8F', + webFull:'%E9%A1%B5%E9%9D%A2%E5%85%A8%E5%B1%8F', + exitWebFull:'%E9%80%80%E5%87%BA%E9%A1%B5%E9%9D%A2%E5%85%A8%E5%B1%8F', + theatre:'%E5%89%A7%E5%9C%BA%E6%A8%A1%E5%BC%8F', + exitTheatre:'%E9%80%80%E5%87%BA%E5%89%A7%E5%9C%BA%E6%A8%A1%E5%BC%8F', + volume:'%E9%9F%B3%E9%87%8F%EF%BC%9A', + muted:'%E9%9D%99%E9%9F%B3', + exitmuted:'%E6%81%A2%E5%A4%8D%E9%9F%B3%E9%87%8F', + seek:'seek%EF%BC%9A', + waiting:'%E7%BC%93%E5%86%B2', + live:'%E7%9B%B4%E6%92%AD%E4%B8%AD', + backLive:'%E8%BF%94%E5%9B%9E%E7%9B%B4%E6%92%AD', + lookBack:'%E5%9B%9E%E7%9C%8B%EF%BC%9A', + next:'%E4%B8%8B%E4%B8%80%E9%9B%86', + screenshot:'%E8%A7%86%E9%A2%91%E6%88%AA%E5%9B%BE', + smallwindows:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E6%92%AD%E6%94%BE%E5%8A%9F%E8%83%BD', + playbackrate:'%E5%80%8D%E9%80%9F', + playbackrateSuffix:'%E5%80%8D', + track:'%E5%AD%97%E5%B9%95', + noTrack:'%E6%97%A0%E5%AD%97%E5%B9%95', + definition:'%E6%B8%85%E6%99%B0%E5%BA%A6', + switchTo:'%E5%88%87%E6%8D%A2%E6%88%90%EF%BC%9A', + closeTime:'%7Bseconds%7D%E7%A7%92%E5%90%8E%E5%8F%AF%E5%85%B3%E9%97%AD%E5%B9%BF%E5%91%8A', + closeAd:'%E5%85%B3%E9%97%AD%E5%B9%BF%E5%91%8A', + second:'%E7%A7%92', + details:'%E6%9F%A5%E7%9C%8B%E8%AF%A6%E6%83%85', + copy:'%E5%A4%8D%E5%88%B6', + copySucceeded:'%E5%A4%8D%E5%88%B6%E6%88%90%E5%8A%9F%EF%BC%8C%E5%8F%AF%E8%B4%B4%E7%B2%98%EF%BC%81', + smallwindowsOpen:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%BC%80%E5%90%AF', + smallwindowsClose:'%E5%B0%8F%E7%AA%97%E5%8F%A3%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%85%B3%E9%97%AD', + screenshotStart:'%E6%88%AA%E5%9B%BE%E4%B8%AD%EF%BC%8C%E8%AF%B7%E7%A8%8D%E5%80%99...', + screenshotClose:'%E6%88%AA%E5%9B%BE%E5%8A%9F%E8%83%BD%E5%B7%B2%E5%85%B3%E9%97%AD', + loopOpen:'%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE', + loopClose:'%E5%B7%B2%E5%85%B3%E9%97%AD%E5%BE%AA%E7%8E%AF%E6%92%AD%E6%94%BE', + close:'%E5%85%B3%E9%97%AD', + down:'%E4%B8%8B%E8%BD%BD', + p50:'50%25', + p75:'75%25', + p100:'100%25', + timeScheduleAdjust:{ + prohibit:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%8B%96%E5%8A%A8', + prohibitBackOff:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E9%87%8D%E5%A4%8D%E8%A7%82%E7%9C%8B', + prohibitForward:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E5%BF%AB%E8%BF%9B', + prohibitLookBack:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%92%AD%E6%94%BE%E9%83%A8%E5%88%86%E5%86%85%E5%AE%B9', + prohibitForwardNotViewed:'%E8%A7%86%E9%A2%91%E7%A6%81%E6%AD%A2%E6%92%AD%E6%94%BE%E6%9C%AA%E8%A7%82%E7%9C%8B%E7%9A%84%E9%83%A8%E5%88%86' + }, + error:{ + noMessage:'%E6%9C%AA%E7%9F%A5%E9%94%99%E8%AF%AF', + supportVideoError:'%E8%AF%A5%E6%B5%8F%E8%A7%88%E5%99%A8%E7%89%88%E6%9C%AC%E5%A4%AA%E4%BD%8E%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%9B%B4%E6%8D%A2%E6%88%90%E5%85%B6%E5%AE%83%E6%B5%8F%E8%A7%88%E5%99%A8', + videoTypeError:'%E8%AF%A5%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%8D%E6%94%AF%E6%8C%81%E6%92%AD%E6%94%BE%E8%AF%A5%E8%A7%86%E9%A2%91%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%9B%B4%E6%8D%A2%E6%88%90%E5%85%B6%E5%AE%83%E6%B5%8F%E8%A7%88%E5%99%A8', + loadingFailed:'%E5%8A%A0%E8%BD%BD%E5%A4%B1%E8%B4%A5', + emptied:'%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B%E4%B8%AD%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF', + screenshot:'%E8%A7%86%E9%A2%91%E6%88%AA%E5%9B%BE%E5%A4%B1%E8%B4%A5', + ajax:'Ajax%E6%95%B0%E6%8D%AE%E8%AF%B7%E6%B1%82%E9%94%99%E8%AF%AF', + noVideoContainer:'%E6%9C%AA%E6%89%BE%E5%88%B0%E6%94%BE%E7%BD%AE%E8%A7%86%E9%A2%91%E7%9A%84%E5%AE%B9%E5%99%A8' + } + }; + +export { language }; diff --git a/src/utils/cookie.js b/src/utils/cookie.js new file mode 100644 index 0000000..8dea399 --- /dev/null +++ b/src/utils/cookie.js @@ -0,0 +1,64 @@ +import { isUndefined } from './type.js'; + + /* + * cookie + * 功能,操作cookie + */ + function cookie(name,value,domain,path){ + if(isUndefined(domain)){ + domain=''; + } + if(isUndefined(path)){ + path='/'; + } + var ckStr=';domain='+domain+';path='+path; + if(location.protocol=='https'){ + ckStr+=';SameSite=None;Secure=true'; + } + var set=function(name,value){ + var time = 360*24*60*60*1000; + var exp = new Date(); + exp.setTime(exp.getTime() + time); + try{ + document.cookie = name + '='+ escape (value) + ';expires=' + exp.toGMTString()+ckStr; + } + catch(event){console.error(event)} + }, + get=function(name){ + var arr,reg=new RegExp('(^| )'+name+'=([^;]*)(;|$)'); + if(arr=document.cookie.match(reg)){ + return unescape(arr[2]); + } + else{ + return null; + } + }, + del=function(name){ + var exp = new Date(); + exp.setTime(exp.getTime() - 1); + var cval=get(name); + if(cval!=null){ + document.cookie= name + '='+cval+';expires='+exp.toGMTString()+ckStr; + } + }; + if(!isUndefined(name) && !isUndefined(value)){ + if(value=='delete'){ + del(name); + return null; + } + else{ + set(name,value); + return get(name); + } + + } + else if(!isUndefined(name) && isUndefined(value)){ + return get(name); + } + else if(!isUndefined(name)){ + + } + } + + +export { cookie }; diff --git a/src/utils/dom.js b/src/utils/dom.js new file mode 100644 index 0000000..14d794e --- /dev/null +++ b/src/utils/dom.js @@ -0,0 +1,220 @@ +import { valType, isUndefined } from './type.js'; + + /* + * documentReady + * 功能:判断页面加载完成 + * @fn:页面加载完成后执行的函数 + */ + function documentReady(fn) { + var isReady = false; + var timer = null; + var doReady = function() { + if(timer) clearInterval(timer); + if(isReady) return; + isReady = true; + if(valType(fn) == 'function') { + fn(); + } + }; + var bodyLoad = function() { + timer = setInterval(function() { + try { + if(!isUndefined(document.readyState) && document.readyState == 'complete') { + doReady(); + } + } catch(event) {}; + }, 10); + }; + var w3c = function() { + + if(valType(fn) == 'function') { + fn(); + } + removeListener(window, 'load', w3c); + }; + if(!isUndefined(document.body)){ + if(valType(fn) == 'function') { + fn(); + } + } + else{ + try { + addListener(window, 'load', w3c); + } catch(event) { + bodyLoad(); + } + } + + } + + /* + * checkJs + * 功能:判断js是否已加载 + * @file:js文件路径 + */ + function checkJs(file) { + var scriptList = document.scripts; + for (var i = 0; i < scriptList.length; i++) { + if(scriptList[i].src==file){ + return scriptList[i]; + } + } + return false; + } + + /* + * getMaxZIndex + * 功能:获取当前页面最大深度 + */ + function getMaxZIndex() { + var arr = document.all || document.querySelectorAll('*'); + var maxZ = -1; + for (var i = 0; i < arr.length; i++) { + var temp = null; + try { + temp = window.getComputedStyle(arr[i], null).zIndex; + } catch (event) { + if (arr[i].style) { + temp = arr[i].style.zIndex; + } + } + if (temp != 'auto' && parseInt(temp) > maxZ) { + maxZ = parseInt(temp); + } + } + return maxZ; + } + + /* + * getWindowSize + * 功能:获取window的宽和高 + */ + function getWindowSize() { + return { + width: window.innerWidth, + height: window.innerHeight + }; + } + + /* + * prev + * 功能:获取指定节点前一个同胞节点 + * @ele:要获取的节点 + */ + function prev(ele) { + var e = ele.previousSibling; + if (e == null) { //测试同胞节点是否存在,否则返回空 + return null; + } + if (e.nodeType == 3) { //如果同胞节点为文本节点 + var t = prev(e); + if (t && t.nodeType == 1) { + return t; + } + } else { + if (e.nodeType == 1) { //确认节点为节点节点才返回 + return e; + } else { + return false; + } + } + } + + /* + * next + * 功能:获取指定节点下一个同胞节点 + * @ele:要获取的节点 + */ + function next(ele) { + var e = ele.nextSibling; + if (e == null) { //测试同胞节点是否存在,否则返回空 + return null; + } + if (e.nodeType == 3) { //如果同胞节点为文本节点 + var t = next(e); + if (t && t.nodeType == 1) { + return t; + } + } else { + if (e.nodeType == 1) { //确认节点为节点才返回 + return e; + } else { + return false; + } + } + } + + /* + * addListener + * 功能:事件监听 + * @ele:监听对象,@e:事件名称,@f:返回事件函数 + */ + function addListener(ele, e, f, t) { + if (isUndefined(t)) { + t = false; + } + if (ele.addEventListener) { + try { + ele.addEventListener(e, f, t); + } catch (event) {} + } else if (ele.attachEvent) { + try { + ele.attachEvent('on' + e, f); + } catch (event) {} + } else { + ele['on' + e] = f; + } + if(isUndefined(ele.listenerList)){ + ele.listenerList=[]; + } + ele.listenerList.push([e,f]); + return ele; + }; + + /* + * removeListener + * 功能:删除事件监听 + * @ele:监听对象,@e:事件名称,@f:返回事件函数 + */ + function removeListener(ele, e, f, t) { + if (isUndefined(t)) { + t = false; + } + if (ele.removeEventListener) { + try { + ele.removeEventListener(e, f, t); + } catch (e) {} + } else if (ele.detachEvent) { + try { + ele.detachEvent('on' + e, f); + } catch (e) {} + } else { + ele['on' + e] = null; + } + if(!isUndefined(ele.listenerList)){ + var temp=[]; + for(var i=0;i> 0 + }, + + // Week + W: function() { + var a = f.z(), + b = 364 + f.L() - a; + var nd2, nd = (new Date(jsdate.getFullYear() + '/1/1').getDay() || 7) - 1; + if(b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b) { + return 1; + } else { + if(a <= 2 && nd >= 4 && a >= (6 - nd)) { + nd2 = new Date(jsdate.getFullYear() - 1 + '/12/31'); + return date('W', Math.round(nd2.getTime() / 1000)); + } else { + return(1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0); + } + } + }, + + // Month + F: function() { + return txt_months[f.n()] + }, + m: function() { + return pad(f.n(), 2) + }, + M: function() { + return f.F().substr(0, 3) + }, + n: function() { + return jsdate.getMonth() + 1 + }, + t: function() { + var n; + if((n = jsdate.getMonth() + 1) == 2) { + return 28 + f.L(); + } else { + if(n & 1 && n < 8 || !(n & 1) && n > 7) { + return 31; + } else { + return 30; + } + } + }, + + // Year + L: function() { + var y = f.Y(); + return(!(y & 3) && (y % 1e2 || !(y % 4e2))) ? 1 : 0 + }, + //o not supported yet + Y: function() { + return jsdate.getFullYear() + }, + y: function() { + return(jsdate.getFullYear() + '').slice(2) + }, + + // Time + a: function() { + return jsdate.getHours() > 11 ? 'pm' : 'am' + }, + A: function() { + return f.a().toUpperCase() + }, + B: function() { + // peter paul koch: + var off = (jsdate.getTimezoneOffset() + 60) * 60; + var theSeconds = (jsdate.getHours() * 3600) + (jsdate.getMinutes() * 60) + jsdate.getSeconds() + off; + var beat = Math.floor(theSeconds / 86.4); + if(beat > 1000) beat -= 1000; + if(beat < 0) beat += 1000; + if((String(beat)).length == 1) beat = '00' + beat; + if((String(beat)).length == 2) beat = '0' + beat; + return beat; + }, + g: function() { + return jsdate.getHours() % 12 || 12 + }, + G: function() { + return jsdate.getHours() + }, + h: function() { + return pad(f.g(), 2) + }, + H: function() { + return pad(jsdate.getHours(), 2) + }, + i: function() { + return pad(jsdate.getMinutes(), 2) + }, + s: function() { + return pad(jsdate.getSeconds(), 2) + }, + //u not supported yet + + // Timezone + //e not supported yet + //I not supported yet + O: function() { + var t = pad(Math.abs(jsdate.getTimezoneOffset() / 60 * 100), 4); + if(jsdate.getTimezoneOffset() > 0) t = '-' + t; + else t = '+' + t; + return t; + }, + P: function() { + var O = f.O(); + return(O.substr(0, 3) + ':' + O.substr(3, 2)) + }, + //T not supported yet + //Z not supported yet + + // Full Date/Time + c: function() { + return f.Y() + '-' + f.m() + '-' + f.d() + 'T' + f.h() + ':' + f.i() + ':' + f.s() + f.P() + }, + //r not supported yet + U: function() { + return Math.round(jsdate.getTime() / 1000) + } + }; + + return format.replace(/([a-zA-Z])/g,function(t, s) { + var ret=''; + if(t != s) { + // escaped + ret = s; + } else if(f[s]) { + // a date function exists + ret = f[s](); + } else { + // nothing special + ret = s; + } + return ret; + }); + } + + /* + * arrayToString + * 功能,二维数组传化成字符串 + */ + function arrayToString(arr) { + var str=''; + if(!isUndefined(arr)){ + for(var i=0;i0){ + str+=','; + } + for(var y=0;y0){ + str+=';'; + } + if(valType(temp[y])=='number'){ + str+=parseInt(temp[y]*100); + } + else{ + str+=temp[y]; + } + + } + } + } + return str; + } + + /* + * stringToArray + * 功能,字符串转化成二维数组 + */ + function stringToArray(str) { + var newArr=[]; + if(!isUndefined(str)){ + var arr=str.split(','); + for(var i=0;i-1){ + return 'iphone'; + } + } + + +export { ajax, dataURLtoBlob, getApp }; diff --git a/src/utils/path.js b/src/utils/path.js new file mode 100644 index 0000000..8a31002 --- /dev/null +++ b/src/utils/path.js @@ -0,0 +1,26 @@ +import { isUndefined } from './type.js'; + + /* + * getPath + * 功能:获取该js文件所在路径 + */ + function getPath(siz) { + 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'); + var src = scriptList[i].src.slice(scriptList[i].src.lastIndexOf('/') + 1, scriptList[i].src.lastIndexOf('.')); + if ((scriptName && (scriptName == 'moeplayer' || scriptName == 'moeplayer.min')) || (scriptList[i].src && (src == 'moeplayer' || src == 'moeplayer.min'))) { + thisPath = scriptList[i].src; + break; + } + } + var path=thisPath.substring(0, thisPath.lastIndexOf('/js/') + 1); + if(!isUndefined(siz)){ + path+=siz+'/'; + } + return path; + } + + +export { getPath }; diff --git a/src/utils/type.js b/src/utils/type.js new file mode 100644 index 0000000..2931dad --- /dev/null +++ b/src/utils/type.js @@ -0,0 +1,99 @@ + /* + * standardization + * 功能:将对象Object标准化,将n对象替换进o对象 + * @o:标准化对象,@n:外部传递对象 + */ + function standardization(o, n) { //n替换进o + var h = {}; + var k; + for (k in o) { + h[k] = o[k]; + } + for (k in n) { + if(k in h){ + h[k] = n[k]; + } + } + return h; + } + + /* + * mergeObj + * 功能:将新对象合并到原对象中,需要确保原对像里有对应的值并且类型一样 + * @o:原对象,@n:新对象 + */ + function mergeObj(o,n){ + var h = {}; + var k; + for (k in o) { + h[k] = o[k]; + } + for (k in n) { + if(k in h){ + switch(valType(h[k])){ + case 'object': + if(valType(n[k])=='object'){ + h[k] = mergeObj(h[k],n[k]); + } + break; + default: + if(valType(h[k])==valType(n[k])){ + h[k] = n[k]; + } + break; + } + } + } + return h; + } + + /* + * valType + * 功能:判断变量类型 + */ + function valType(val) { + if(typeof val==='undefined') return 'undefined'; + var str=Object.prototype.toString.call(val).split(' ')[1].replace(']','').toLowerCase(); + if(str.substr(0,4)=='html' && (str.substr(-7)=='element' || str.substr(-8)=='document' || str=='window')){ + str='htmlobject'; + } + if(str=='htmlcollection' || str=='nodelist'){ + str='htmlarray'; + } + return str; + } + + /* + * isUndefined + * 功能:判断变量是否存在或值是否为undefined + */ + function isUndefined(val) { + try { + return valType(val)==='undefined' || val === undefined || val === null || (valType(val)==='number' && isNaN(val)); + } catch (event) { + return true; + } + return false; + } + + /* + * decodeURIString + * 功能,解码中文 + */ + function decodeURIString(obj){ + for(var k in obj){ + if(valType(obj[k])=='string' && obj[k]){ + try{ + obj[k]=decodeURI(obj[k]); + } + catch(event){} + } + if(valType(obj[k])=='object'){ + obj[k]=decodeURIString(obj[k]); + } + } + return obj; + } + + +export { standardization, mergeObj, valType, isUndefined, decodeURIString };