chenguoliang 5 years ago
parent
commit
84c0a8fc1a

+ 90 - 0
h5v2/css2/base_common_hd.css

@@ -0,0 +1,90 @@
+/**
+ * 公用css
+ * @time 20190731
+ * @name test
+ */
+
+body {
+	margin: 0;
+	padding: 0;
+	background: transparent no-repeat;
+	width: 1280px;
+	height: 720px;
+	color: #000000;
+	overflow: hidden;
+	font-family: SimHei;
+}
+
+img {
+	border:0;
+}
+
+#myDefaultLink {
+	display: inline-block;
+	width: 1px;
+	height: 1px;
+	overflow: hidden;
+}
+
+.btn_focus_yellow {
+	border: solid 4px yellow !important;
+	outline: 0;
+	border-radius: 5px;
+	z-index: 200;
+	-webkit-box-shadow: 0 0 10px yellow;
+	box-shadow: 0 0 10px yellow;
+}
+
+div#default_tip_css {
+	position: absolute;
+	left: 340px;
+	top: 325px;
+	width: 600px;
+	height: 70px;
+	line-height: 70px;
+	/*background: rgba(0, 0, 0, 0.71);*/
+	/*background-color: #000000;
+	opacity: 0.2;*/
+	background-color: #6b6262;
+	border-radius: 10px;
+	text-align: center;
+	font-size: 36px;
+	color: yellow;
+	border: solid 2px yellow;
+	margin: auto;
+	z-index: 333;
+	visibility: hidden;
+}
+
+div#default_ykq_tip_css {
+	position: absolute;
+	left: 90px;
+	top: 460px;
+	width: 400px;
+	height: 140px;
+	line-height: 140px;
+	background: rgba(0, 0, 0, 0.71);
+	border-radius: 10px;
+	text-align: center;
+	font-size: 80px;
+	color: yellow;
+	border: solid 2px yellow;
+	margin: auto;
+	z-index: 333;
+	visibility: hidden;
+}
+
+#wrapper {
+	position: absolute;
+	left: 0;
+	top: 0;
+	width: 1280px;
+	height: 720px;
+	overflow-x: hidden;
+	overflow-y: hidden;
+}
+
+#wrapper .last_element {
+	padding-bottom: 40px;
+	box-sizing: content-box;
+}

+ 7 - 0
h5v2/htm2/foot.htm

@@ -0,0 +1,7 @@
+<script type="text/javascript" src="/h5v2/jsv2/md5.js?v=101"></script>
+<script type="text/javascript" src="/h5v2/jsv2/webview.js?v=101"></script>
+<script type="text/javascript" src="/h5v2/jsv2/common.js?v=101"></script>
+<script type="text/javascript" src="/h5v2/jsv2/mypromise.js?v=101"></script>
+<script type="text/javascript" src="/h5v2/jsv2/config.js?v=101"></script>
+<script type="text/javascript" src="/h5v2/jsv2/base.common_v1.0.0.js?v=101"></script>
+<script type="text/javascript" src="/h5v2/jsv2/base.supply_v1.0.0.js?v=101"></script>

+ 4 - 0
h5v2/htm2/head.htm

@@ -0,0 +1,4 @@
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta charset="utf-8">
+<meta name="page-view-size" content="1280*720" />
+<link href="/h5v2/css2/base_common_hd.css?v=101" rel="stylesheet" type="text/css">

BIN
h5v2/images/com/spacer.gif


+ 673 - 0
h5v2/jsv2/base.common_v1.0.0.js

@@ -0,0 +1,673 @@
+/**
+ * 公用JS库
+ * @time 20190731
+ * @name test
+ */
+
+if (typeof debug_mode === 'undefined') window.debug_mode = false; // 默认关闭调试模式
+if (typeof enable_animate === 'undefined') window.enable_animate = false; // 默认关闭动画
+if (typeof is_ott === 'undefined') window.is_ott = true; // 默认apk项目
+
+/** 
+ * 一些常用键值
+*/
+var KEY_BACK = 0x0008; // 返回/删除
+var KEY_EXIT = 27;  // 退出
+var KEY_ENTER = 0x000D; // 确定
+var KEY_PAGE_UP = 0x0021; // 上页
+var KEY_PAGE_DOWN = 0x0022; // 下页
+var KEY_LEFT = 0x0025; // 左
+var KEY_UP = 0x0026; // 上
+var KEY_RIGHT = 0x0027; // 右
+var KEY_DOWN = 0x0028; // 下
+var KEY_0 = 0x0030; // 0
+var KEY_1 = 0x0031; // 1
+var KEY_2 = 0x0032; // 2
+var KEY_3 = 0x0033; // 3
+var KEY_4 = 0x0034; // 4
+var KEY_5 = 0x0035; // 5
+var KEY_6 = 0x0036; // 6 
+var KEY_7 = 0x0037; // 7
+var KEY_8 = 0x0038; // 8
+var KEY_9 = 0x0039; // 9
+var KEY_VOL_UP = 0x0103; // 音量加
+var KEY_VOL_DOWN = 0x0104; // 音量减
+var KEY_MUTE = 0x0105; // 静音
+var KEY_TRACK = 0x0106; // 切换音轨
+var KEY_PLAY_PAUSE = 0x0107; // 播放/暂停
+var KEY_FAST_FORWARD = 0x0108; // 快进
+var KEY_FAST_REWIND = 0x0109; // 快退
+var KEY_IPTV_EVENT = 0x0300; // 虚拟事件按键
+var KEY_RED = 0x0113; // 红色键
+var KEY_GREEN = 0x0114; // 绿色键
+var KEY_YELLOW = 0x0115; // 黄色键
+var KEY_BLUE = 0x0116; // 蓝色键
+var KEY_DELETE = 0x0118; // 删除键
+var EVENT_MEDIA_END = 'EVENT_MEDIA_END'; //视频播放结束
+var EVENT_MEDIA_ERROR = 'EVENT_MEDIA_ERROR'; //视频播放错误
+
+/*湖南特殊键值*/
+var KEY_HN_BACK = 'BACK';
+var KEY_HN_LEFT = 'LEFT';
+var KEY_HN_UP = 'UP';
+var KEY_HN_RIGHT = 'RIGHT';
+var KEY_HN_DOWN = 'DOWN';
+var KEY_HN_ENTER = 'ENTER';
+var KEY_HN_0 = '0'; // 0
+var KEY_HN_1 = '1'; // 1
+var KEY_HN_2 = '2'; // 2
+var KEY_HN_3 = '3'; // 3
+var KEY_HN_4 = '4'; // 4
+var KEY_HN_5 = '5'; // 5
+var KEY_HN_6 = '6'; // 6 
+var KEY_HN_7 = '7'; // 7
+var KEY_HN_8 = '8'; // 8
+var KEY_HN_9 = '9'; // 9
+
+function Animator(duration, progress) {
+	this.duration = duration;
+	this.progress = progress;
+	this.next = true;
+}
+
+Animator.prototype = {
+	constructor: Animator,
+	start: function(finished) {
+		var startTime = new Date().getTime();
+        var duration = this.duration, self = this, timeOut = 0;            
+        var vendors = ["webkit", "moz"];
+        for(var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i){
+        	window.requestAnimationFrame = window[vendors[i] + "RequestAnimationFrame"];
+        }
+        if (!window.requestAnimationFrame) {
+           window.requestAnimationFrame = function (callback, element) {
+				var start = 0, finish = 0;
+				window.setTimeout(function () {
+					start = +new Date();
+					callback(start);
+					finish = +new Date();
+					timeOut = 1000 / 300 - (finish - start);
+				}, timeOut);
+           };
+        }
+      	window.requestAnimationFrame(function step(){
+	        var p = (new Date().getTime() - startTime) / duration;
+	        self.progress(p, p);
+	        if(p >= 1.0){
+	        	self.progress(1.0, 1.0);
+	          	self.next = false;
+	          	finished();
+	        }	        
+	        if(self.next) window.requestAnimationFrame(step);
+    	});
+	},
+	stop: function() {
+		this.next = false;
+	}
+}
+
+/**
+ * 公司自己的返回监听,一定要
+ */
+window.onBackEvent=function(){
+	back();
+}
+
+/**
+ * 根据ID获取某个元素
+ */
+function G(id) {
+    return document.getElementById(id);
+}
+
+/**
+ * 显示一个元素
+ */
+function S(id) {
+    var temp = G(id);
+    if (temp) temp.style.visibility = 'visible';
+}
+
+/**
+ * 隐藏一个元素
+ */
+function H(id) {
+    var temp = G(id);
+    if (temp) temp.style.visibility = 'hidden';
+}
+
+/**
+ * 返回IPTV门户或者apk来源地址
+ */
+function goIptvPortal() {
+    window.location.href = Authentication.CTCGetConfig('EPGDomain');
+}
+
+/**
+ * 定义一个命名空间
+ */
+var PageH5 = {
+    /** 回调函数 */
+    call: function(fn, args) {
+        if (typeof fn === 'string' && fn) return eval('(' + fn + ')');
+        else if (typeof fn === 'function') {
+            if (! (args instanceof Array)) {
+                var temp = [];
+                for (var i = 1; i < arguments.length; i++) temp.push(arguments[i]);
+                args = temp;
+            }
+            return fn.apply(window, args);
+        }
+    },
+    /** 得到上下文路径 */
+    getContextPath: function() {
+        return '/' + location.href.split('/')[3] + '/';
+    },
+    /** 得到当前窗口的父窗口 */
+    getParent: function() {
+        return window == window.parent ? window.top: window.parent;
+    },
+    /** 异步调用方法 */
+    myAjax: function(config) {
+        var url = config.url;
+        var data = config.data;
+        var type = (config.type || 'GET').toUpperCase();
+        var contentType = config.contentType || 'application/x-www-form-urlencoded';
+        var dataType = config.dataType;
+        var headers = config.headers || [];
+        var fnSuccess = config.success;
+        var fnError = config.error;
+        var xmlhttp;
+        if (window.XMLHttpRequest) xmlhttp = new XMLHttpRequest();
+        else xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
+
+        xmlhttp.onreadystatechange = function() {
+            if (xmlhttp.readyState == 4) {
+                var rsp = xmlhttp.responseText || xmlhttp.responseXML;
+                if (dataType == 'json') rsp = eval("(" + rsp + ")");
+                if ((xmlhttp.status >= 200 && xmlhttp.status < 300) || xmlhttp.status == 304) PageH5.call(fnSuccess, [xmlhttp, rsp]);
+                else PageH5.call(fnError, [xmlhttp, rsp]);
+            }
+        };
+
+        xmlhttp.open(type, url, true);
+        for (var i = 0; i < headers.length; ++i) {
+            xmlhttp.setRequestHeader(headers[i].name, headers[i].value);
+        }
+        xmlhttp.setRequestHeader('Content-Type', contentType);
+
+        if (typeof data == 'object' && contentType == 'application/x-www-form-urlencoded') {
+            var s = '';
+            for (attr in data) {
+                s += attr + '=' + data[attr] + '&';
+            }
+            if (s) {
+                s = s.substring(0, s.length - 1);
+            }
+            xmlhttp.send(s);
+        } else xmlhttp.send(data);
+    }
+};
+
+/** 按钮对象 */
+PageH5.Button = PageH5.btn = {
+    _buttonStore: {},
+    config: {
+        defaultButtonId: '',
+        buttons: [],
+        imagePath: '',
+        initKeys: true,
+        eager: false
+    },
+
+    /** 初始化 */
+    init: function(defaultButtonId, buttons, imagePath, initKeys, eager) {
+        var config = defaultButtonId;
+        if (arguments.length >= 2) {
+            config = {
+                defaultButtonId: defaultButtonId,
+                buttons: buttons,
+                imagePath: imagePath,
+                initKeys: initKeys,
+                eager: eager
+            };
+        }
+        for (var i in config) this.config[i] = config[i];
+        config = this.config;
+
+        if (config.initKeys) {
+            PageH5.key.init();
+            PageH5.key.set({
+                KEY_ENTER: 'PageH5.Button.click()',
+                KEY_LEFT: 'PageH5.Button.move("left")',
+                KEY_RIGHT: 'PageH5.Button.move("right")',
+                KEY_UP: 'PageH5.Button.move("up")',
+                KEY_DOWN: 'PageH5.Button.move("down")',
+                KEY_BACK: 'back()',
+                KEY_EXIT: 'back()'
+            });
+        }
+        this.previous = null,
+        this._buttonStore = {};
+        for (var i = 0; i < config.buttons.length; i++) {
+            var button = config.buttons[i];
+            var _button = G(button.id);
+            if (!button) continue;
+            button.focusClass = (button.focusClass && !/^btn_focus_.*$/g.test(button.focusClass) ? 'btn_focus_': '') + button.focusClass;
+            if (!button.linkImage && _button) button.linkImage = _button.src;
+            if (config.imagePath && button.focusImage && button.autoPrefix !== false && button.focusImage.indexOf('http') < 0) button.focusImage = config.imagePath + button.focusImage;
+            if (config.imagePath && button.linkImage && button.autoPrefix !== false && button.linkImage.indexOf('http') < 0) button.linkImage = config.imagePath + button.linkImage;
+            if (config.animate === false) button.animate = false;
+            this._buttonStore[button.id] = button;
+            if ((button.eager || config.eager) && button.focusImage) new Image().src = button.focusImage;
+        }
+
+        if (typeof config.defaultButtonId === 'string') this.current = this.get(config.defaultButtonId);
+        else if (config.defaultButtonId instanceof Array) {
+            for (var i = 0,
+            max = config.defaultButtonId.length; i < max; i++) {
+                var button = this.get(config.defaultButtonId[i]);
+                if (button) {
+                    this.current = button;
+                    break;
+                }
+            }
+        }
+        this.update();
+    },
+
+    get: function(id) {
+        if (id === undefined) id = this.current.id;
+        if (G(id)) {
+            var btn = this._buttonStore[id];
+            if (btn && btn.disable !== true) return this._buttonStore[id];
+        }
+    },
+
+    move: function(dir) {
+        this._dir = dir;
+        if (this.current.beforeMove && PageH5.call(this.current.beforeMove, [dir, this.current]) === false) return;
+        var button;
+        var nextButtonId = this.current[dir];
+        if (typeof nextButtonId == "string") nextButtonId = [nextButtonId];
+        if (nextButtonId instanceof Array) {
+            for (var i = 0; i < nextButtonId.length; i++) {
+                button = this.get(nextButtonId[i]);
+                if (button) break;
+            }
+            this.previous = this.current;
+            if (button) {
+                this.current = button;
+                if (button.scrollDir === "x") {
+                    PageH5.scroll.repair();
+                    this.update();
+                    PageH5.scroll.check(button, dir);
+                } else {
+                    PageH5.scrollScreen.repair();
+                    this.update();
+                    PageH5.scrollScreen.check(button, dir);
+                }
+            }
+        }
+        PageH5.call(this.current.moveHandler, [this.previous, this.current, dir]);
+    },
+
+    set: function(buttonId) {
+        var btn = this.get(buttonId);
+        if (!btn) return;
+        this.previous = this.current;
+        this.current = btn;
+        this.update();
+    },
+
+    click: function(interceptor, btnId) {
+        if (btnId && btnId !== this.current.id) this.set(btnId);
+        PageH5.call(interceptor, [this.current]);
+        PageH5.call(this.current.action, [this.current]);
+    },
+
+    update: function() {
+        var prev = this.previous;
+        var current = this.current;
+        if (prev && G(prev.id)) {
+            var _prev = G(prev.id);
+            if (prev.focusClass) PageH5.removeClass(_prev, prev.focusClass);
+            if (prev.linkImage) _prev.src = prev.linkImage;
+            if (prev.twinkle) PageH5.twinkle.stop();
+            if (enable_animate && prev.zoom) {
+                var parent = _prev.parentNode;
+                var defaultScale = prev.defaultScale || 1;
+                parent.style.webkitTransition = '';
+                parent.style.transition = '';
+                parent.style.webkitTransform = 'scale(' + defaultScale + ')';
+                parent.style.transform = 'scale(' + defaultScale + ')';
+                parent.style.zIndex = '';
+            }
+            PageH5.call(prev.blurHandler, [prev]);
+        }
+        if (current) {
+            var _current = G(current.id);
+            if (current.focusClass) PageH5.addClass(_current, current.focusClass);
+            if (current.focusImage) _current.src = current.focusImage;
+
+            if (prev && enable_animate !== false && prev.animate && current.animate && prev.animateGroup === current.animateGroup) {
+                var pImg = G(prev.id);
+                var cImg = G(current.id);
+                var p = pImg.parentNode;
+                var c = cImg.parentNode;
+                PageH5.Button._zIndex = c.style.zIndex;
+                c.style.zIndex = 200;
+                if (this.config.animateType === 'js') {
+                    PageH5.animate(c, {
+                        left: [PageH5.css(p, 'left'), PageH5.css(c, 'left')],
+                        top: [PageH5.css(p, 'top'), PageH5.css(c, 'top')]
+                    },
+                    'fast',
+                    function() {
+                        c.style.zIndex = PageH5.Button._zIndex;
+                        PageH5.Button._zIndex = undefined;
+                        if (PageH5.btn.current.twinkle) PageH5.twinkle.start(PageH5.btn.current.id, PageH5.btn.current.twinkle);
+                    });
+                    PageH5.animate(cImg, {
+                        width: [PageH5.css(pImg, 'width'), PageH5.css(cImg, 'width')],
+                        height: [PageH5.css(pImg, 'height'), PageH5.css(cImg, 'height')]
+                    },
+                    'fast',
+                    function() {},
+                    'default2');
+                } else if (this.config.animateType === 'css3') {
+                    var _left = PageH5.css(c, 'left'),
+                    _top = PageH5.css(c, 'top'),
+                    _width = PageH5.css(cImg, 'width'),
+                    _height = PageH5.css(cImg, 'height');
+                    PageH5.css(c, 'webkitTransition', '');
+                    PageH5.css(c, 'transition', '');
+                    PageH5.css(c, 'left', PageH5.css(p, 'left'));
+                    PageH5.css(c, 'top', PageH5.css(p, 'top'));
+                    PageH5.css(cImg, 'width', PageH5.css(pImg, 'width'));
+                    PageH5.css(cImg, 'height', PageH5.css(pImg, 'height'));
+                    setTimeout(function() {
+                        PageH5.css(c, 'webkitTransition', 'all 0.2s');
+                        PageH5.css(c, 'transition', 'all 0.2s');
+                        PageH5.css(c, 'left', _left);
+                        PageH5.css(c, 'top', _top);
+                        PageH5.css(c, 'width', _width);
+                        PageH5.css(c, 'height', _height);
+                    },
+                    20);
+                    PageH5.one(c, 'webkitTransitionEnd mozTransitionEnd MSTransitionEnd otransitionend transitionend',
+                    function() {
+                        c.style.zIndex = PageH5.Button._zIndex;
+                        PageH5.Button._zIndex = undefined;
+                        if (PageH5.btn.current.twinkle) PageH5.twinkle.start(PageH5.btn.current.id, PageH5.btn.current.twinkle);
+                    });
+                }
+            } else {
+                if (current.twinkle) PageH5.twinkle.start(current.id, current.twinkle);
+                if (enable_animate && current.zoom) {
+                    var parent = G(current.id).parentNode;
+                    var zoomScale = current.zoomScale || 1.2;
+                    parent.style.zIndex = '200';
+                    parent.style.webkitTransition = 'all 0.5s';
+                    parent.style.transition = 'all 0.5s';
+                    parent.style.webkitTransform = 'scale(' + zoomScale + ')';
+                    parent.style.transform = 'scale(' + zoomScale + ')';
+                }
+            }
+            PageH5.call(current.focusHandler, [current]);
+        }
+    }
+};
+
+/** apk 可 注入一个叫mp的对象 */
+var mp;
+/** 播放器 */
+PageH5.Mp = PageH5.mp = {
+    speed: 1,
+    state: 'play',
+    muteFlag: 0,
+    defaultTip: false,
+    init: function(defaultTip) {
+        try {
+            this.defaultTip = defaultTip;
+            if (!is_ott) {
+                mp = new MediaPlayer();
+                var instanceId = mp.getNativePlayerInstanceID();
+                var playListFlag = 0;
+                var videoDisplayMode = 1;
+                var height = 100;
+                var width = 100;
+                var left = 50;
+                var top = 50;
+                var muteFlag = 0;
+                var useNativeUIFlag = 1;
+                var subtitleFlag = 0;
+                var videoAlpha = 0;
+                var cycleFlag = 1;
+                var randomFlag = 0;
+                var autoDelFlag = 0;
+                mp.initMediaPlayer(instanceId, playListFlag, videoDisplayMode, height, width, left, top, muteFlag, useNativeUIFlag, subtitleFlag, videoAlpha, cycleFlag, randomFlag, autoDelFlag);
+                mp.setAllowTrickmodeFlag(0);
+            }
+            mp.setProgressBarUIFlag(0);
+            mp.setAudioVolumeUIFlag(1);
+        } catch(e) {}
+    },
+
+    pause: function(callback) {
+        this.speed = 1;
+        this.state = 'pause';
+        try {
+            mp.pause();
+        } catch(e) {}
+        PageH5.call(callback, [this]);
+    },
+
+    resume: function(callback) {
+        this.speed = 1;
+        this.state = 'play';
+        try {
+            mp.resume();
+        } catch(e) {}
+        PageH5.call(callback, [this]);
+    },
+
+    playOrPause: function(callback) {
+        if (this.state == 'play') this.pause();
+        else this.resume();
+        PageH5.call(callback, [this.state, this]);
+    },
+
+    fastForward: function(callback) {
+        if (this.speed >= 32 || this.state == 'fastRewind') this.resume();
+        else {
+            this.speed = this.speed * 2;
+            this.state = 'fastForward';
+            mp.fastForward(this.speed);
+        }
+        PageH5.call(callback, [this.state, this.speed, this]);
+    },
+
+    fastRewind: function(callback) {
+        if (this.speed >= 32 || this.state == 'fastForward') {
+            this.resume();
+        } else {
+            this.speed = this.speed * 2;
+            this.state = 'fastRewind';
+            mp.fastRewind( - this.speed);
+        }
+        PageH5.call(callback, [this.state, this.speed, this]);
+    },
+
+    volUp: function(callback) {
+        var volume = ( + mp.getVolume());
+        if (is_ott) {
+            var temp = 5 - (volume % 5);
+            volume = volume + temp;
+        } else {
+            volume += 5;
+            volume = volume > 100 ? 100 : volume;
+        }
+        mp.setVolume(volume);
+        PageH5.call(callback, [volume, this]);
+    },
+
+    volDown: function(callback) {
+        var volume = ( + mp.getVolume());
+        if (is_ott) {
+            var temp = volume % 5;
+            temp = temp === 0 ? 5 : temp;
+            volume = volume - temp;
+        } else {
+            volume -= 5;
+            volume = volume < 5 ? 0 : volume;
+        }
+        mp.setVolume(volume);
+        PageH5.call(callback, [volume, this]);
+    },
+
+    switchAudioChannel: function(callback) {
+        mp.switchAudioChannel();
+        PageH5.call(callback, [this.getCurrentAudioChannel(), this]);
+    },
+
+    getCurrentAudioChannel: function() {
+        if (!mp) return 'Stereo';
+        return mp.getCurrentAudioChannel() || 'Stereo';
+    },
+
+    toggleMuteFlag: function(callback) {++this.muteFlag;
+        mp.setMuteFlag(this.muteFlag % 2);
+        PageH5.call(callback, [this.muteFlag % 2, this]);
+    },
+
+    getMediaStr: function(url) {
+        var json = '';
+        json += '[{mediaUrl:"' + url + '",';
+        json += 'mediaCode: "jsoncode1",';
+        json += 'mediaType:2,';
+        json += 'audioType:1,';
+        json += 'videoType:1,';
+        json += 'streamType:1,';
+        json += 'drmType:1,';
+        json += 'fingerPrint:0,';
+        json += 'copyProtection:1,';
+        json += 'allowTrickmode:1,';
+        json += 'startTime:0,';
+        json += 'endTime:20000.3,';
+        json += 'entryID:"jsonentry1"}]';
+        return json;
+    },
+
+    fullscreenPlay: function(url) {
+        try {
+            if (is_ott) {
+                var type = (url && /\.mp3$/g.test(url)) ? 0 : 1;
+                mp.initMediaPlayer(url, type);
+            } else {
+                mp.setSingleMedia(this.getMediaStr(url));
+                mp.setVideoDisplayMode(1);
+                mp.refreshVideoDisplay();
+            }
+            mp.playFromStart();
+        } catch(e) {}
+    },
+
+    smallvodPlay: function(url, left, top, width, height) {
+        try {
+            if (is_ott) {
+                if (url && /\.mp3$/g.test(url)) mp.initMediaPlayer(url, 0);
+                else mp.initMediaPlayer(url, left, top, width, height);
+            } else {
+                mp.setSingleMedia(this.getMediaStr(url));
+                mp.setVideoDisplayMode(0);
+                mp.setVideoDisplayArea(left, top, width, height);
+                mp.refreshVideoDisplay();
+            }
+            mp.playFromStart();
+        } catch(e) {}
+    },
+
+    playByTime: function(second) {
+        mp.playByTime(1, second);
+    },
+
+    getCurrentPlayTime: function() {
+        if (mp) return (mp.getCurrentPlayTime() || 0);
+        else return 0;
+    },
+
+    getMediaDuration: function() {
+        if (mp) return (mp.getMediaDuration() || 0);
+        else return 0;
+    },
+
+    parseTimeInfo: function(second) {
+        var m = Math.floor(second / 60);
+        m = m < 10 ? ('0' + m) : m;
+        var s = second % 60;
+        s = s < 10 ? ('0' + s) : s;
+        return m + ':' + s;
+    },
+
+    getPlayTimeInfo: function() {
+        return this.parseTimeInfo(this.getCurrentPlayTime()) + '/' + this.parseTimeInfo(this.getMediaDuration());
+    },
+
+    getRate: function() {
+        var duration = this.getMediaDuration();
+        if (duration === 0) return 0;
+        return this.getCurrentPlayTime() / duration;
+    },
+
+    destroy: function() {
+        if (mp) mp.stop();
+    },
+
+    isEndOrError: function(keyCode) {
+        return keyCode === 'EVENT_MEDIA_END' || keyCode === 'EVENT_MEDIA_ERROR';
+    }
+};
+
+(function(document) {
+    var event_handler = function(e) {
+        e = e || window.event;
+        var keyCode = e.which || e.keyCode;
+        if (keyCode === KEY_IPTV_EVENT) {
+            eval('oEvent = ' + Utility.getEvent());
+            PageH5.eventHandler(oEvent.type, true);
+        } else {
+            if (keyCode === KEY_BACK) e.preventDefault();
+            PageH5.eventHandler(keyCode);
+        }
+    };
+
+    /*if (is_ott || (debug_mode && /webkit/g.test(navigator.userAgent.toLowerCase()))) document.onkeydown = event_handler;
+    else document.onkeypress = event_handler;*/
+
+    try{
+        Webview.requestFocus();
+        Webview.setKeyEventHandler(function (action, keyCode, keyName, metaState){
+            KEY_BACK = KEY_HN_BACK;
+            KEY_ENTER = KEY_HN_ENTER;
+            KEY_LEFT = KEY_HN_LEFT;
+            KEY_UP = KEY_HN_UP;
+            KEY_RIGHT = KEY_HN_RIGHT;
+            KEY_DOWN = KEY_HN_DOWN;
+            KEY_0 = KEY_HN_0;
+            KEY_1 = KEY_HN_1;
+            KEY_2 = KEY_HN_2;
+            KEY_3 = KEY_HN_3;
+            KEY_4 = KEY_HN_4;
+            KEY_5 = KEY_HN_5;
+            KEY_6 = KEY_HN_6;
+            KEY_7 = KEY_HN_7;
+            KEY_8 = KEY_HN_8;
+            KEY_9 = KEY_HN_9;
+            PageH5.eventHandler(keyName);
+        });
+    }catch(e){
+        document.onkeydown = event_handler;
+    }
+})(document);
+

+ 704 - 0
h5v2/jsv2/base.supply_v1.0.0.js

@@ -0,0 +1,704 @@
+/**
+ * 对公用JS库的补充
+ * @time 20190731
+ * @name test
+ */
+ 
+(function(PageH5) {
+
+    function tip(info, second, id, timerName) {
+        if (info === undefined || info === '') return;
+        second = second || 3;
+        id = id || id;
+        if (!G(id)) {
+            var dom = document.createElement('div');
+            dom.id = id;
+            document.body.appendChild(dom);
+        }
+        G(id).innerHTML = info;
+        S(id);
+        if (second > 0) {
+            if (PageH5[timerName]) clearTimeout(PageH5[timerName]);
+            PageH5[timerName] = setTimeout('H("' + id + '")', second * 1000);
+        }
+    }
+
+    PageH5.extend = function(params) {
+        for (var i in params) this[i] = params[i];
+    };
+
+    PageH5.extend({
+        tip: function(info, second) {
+            tip(info, second, 'default_tip_css', '_tip_timer');
+        },
+        ykqTip: function(info, second) {
+            tip(info, second, 'default_ykq_tip_css', '_ykq_tip_timer');
+        },
+        getBasePath: function() {
+            var contextPath = '/' + location.href.split('/')[3];
+            return contextPath;
+        },
+        isArray: function(obj) {
+            return Object.prototype.toString.call(obj) === '[object Array]' || (obj instanceof Array);
+        },
+        jump: function(href, f) {
+            if (f === undefined) f = PageH5.btn.current.id;
+            window.location.href = href + '&f=' + f;
+        },
+        trim: function(str) {
+            if (str) return str.replace(/^\s*(.*?)\s*$/g, '$1');
+        },
+        toHump: function(str, flag) {
+            return str.replace(new RegExp(flag + '(\\w)', 'g'),
+            function(m, $1, idx, str) {
+                return $1.toUpperCase();
+            });
+        },
+        hasClass: function(obj, cls) {
+            if (!obj) return;
+            return obj.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
+        },
+        addClass: function(obj, cls) {
+            if (!obj) return;
+            var className = obj.className;
+            if (!this.hasClass(obj, cls)) obj.className += (className ? ' ': '') + cls;
+        },
+        removeClass: function(obj, cls) {
+            if (obj && this.hasClass(obj, cls)) {
+                obj.className = obj.className.replace(new RegExp('(\\s|^)' + cls + '(\\s|$)'),
+                function(m, $1, $2) {
+                    return ($1 && $2) ? ' ': '';
+                });
+            }
+        },
+        on: function(obj, event, fn) {
+            var events = event.split(' ');
+            for (var i in events) obj.addEventListener(events[i], fn, false);
+        },
+        off: function(obj, event, fn) {
+            var events = event.split(' ');
+            for (var i in events) obj.removeEventListener(events[i], fn);
+        },
+        one: function(obj, event, fn) {
+            var tempFn = function() {
+                fn();
+                PageH5.off(obj, event, tempFn);
+            };
+            PageH5.on(obj, event, tempFn);
+        },
+        twinkle: {
+            start: function(id, time) {
+                this.stop();
+                id = id || PageH5.btn.current.id;
+                time = (typeof time === 'number') ? time: 200;
+                this._id = id;
+                this._is_hide = false;
+                this._timer = setInterval(function() {
+                    if (PageH5.twinkle._is_hide) S(PageH5.twinkle._id);
+                    else H(PageH5.twinkle._id);
+                    PageH5.twinkle._is_hide = !PageH5.twinkle._is_hide;
+                },
+                time);
+            },
+            stop: function() {
+                if (this._timer) {
+                    clearInterval(this._timer);
+                    this._timer = undefined;
+                    S(PageH5.twinkle._id);
+                }
+            }
+        }
+    });
+
+    var curCSS;
+    if (window.getComputedStyle) {
+        curCSS = function(elem, name) {
+            name = PageH5.toHump(name, '-');
+            var ret, computed = window.getComputedStyle(elem, null),
+            style = elem.style;
+            if (computed) ret = computed[name];
+            if (!ret) ret = style[name];
+            return ret;
+        };
+    } else if (document.documentElement.currentStyle) {
+        curCSS = function(elem, name) {
+            name = PageH5.toHump(name, '-');
+            var ret = elem.currentStyle && elem.currentStyle[name],
+            style = elem.style;
+            if (!ret && style && style[name]) {
+                ret = style[name];
+            }
+            return ret === '' ? 'auto': ret;
+        };
+    } else {
+        curCSS = function(elem, name) {
+            name = PageH5.toHump(name, '-');
+            var style = elem.style;
+            return style[name];
+        };
+    }
+
+    PageH5.css = function(obj, name, value) {
+        if (value === undefined) {
+            var temp = curCSS(obj, name);
+            if (temp === '' || temp === 'auto') temp = 0;
+            return temp;
+        } else {
+            var pxs = ['left', 'top', 'right', 'bottom', 'width', 'height', 'line-height', 'font-size'];
+            var isPx = pxs.indexOf(name) >= 0;
+            if (isPx && !/.*px$/g.test(value + '') && value !== 'auto') value += 'px';
+            obj.style[PageH5.toHump(name)] = value;
+        }
+    };
+
+    PageH5.key = {
+        keys: {},
+        ids: {},
+        set: function(code, action) {
+            if (typeof code === 'string' && action !== undefined) {
+                var _code = code;
+                code = {};
+                code[_code] = action;
+            }
+            if (typeof code === 'object') {
+                var obj = code;
+                for (var i in obj) {
+                    if (i.indexOf('KEY_') === 0 || i.indexOf('EVENT_') === 0) this.keys[i] = obj[i];
+                    else this.ids[i] = obj[i];
+                }
+            } else if (typeof code === 'number') {}
+            return this;
+        },
+        add: function(code, action) {
+            return this.set(code, action);
+        },
+        del: function(code) {
+            if (! (code instanceof Array)) code = [code];
+            for (var i = 0; i < code.length; i++) {
+                if (this.ids[code[i]]) this.ids[code[i]] = 'PageH5.key.emptyFn()';
+                if (this.keys[code[i]]) this.keys[code[i]] = 'PageH5.key.emptyFn()';
+            }
+            return this;
+        },
+        emptyFn: function() {},
+        init: function() {
+            if (!PageH5.eventHandler) {
+                PageH5.eventHandler = function(code) {
+                    for (var i in PageH5.key.ids) if (PageH5.Button.current.id === i) PageH5.call(PageH5.key.ids[i], code);
+                    for (var i in PageH5.key.keys) if (code === window[i]) PageH5.call(PageH5.key.keys[i], code);
+                };
+            }
+        }
+    };
+
+    PageH5.cookie = {
+        get: function(cookieName, defaultValue, parseNumber, isUnescape) {
+            var temp = new RegExp('(^|;| )' + cookieName + '=([^;]*)(;|$)', 'g').exec(document.cookie);
+            if (temp != null) {
+                var value = temp[2];
+                if (value === '""') return defaultValue;
+                if (parseNumber == true) return parseFloat(value);
+                if (isUnescape) return unescape(value);
+                return value;
+            }
+            return defaultValue;
+        },
+        set: function(name, value, day, path) {
+            day = day == undefined ? 30 : day;
+            path = path == undefined ? PageH5.getBasePath() : path;
+            var str = name + '=' + value + '; ';
+            if (day) {
+                var date = new Date();
+                date.setTime(date.getTime() + day * 24 * 3600 * 1000);
+                str += 'expires=' + date.toGMTString() + '; ';
+            }
+            if (path) str += 'path=' + path;
+            document.cookie = str;
+        },
+        del: function(name, path) {
+            this.set(name, null, -1, path);
+        }
+    };
+
+    PageH5.marquee = {
+        start: function(maxLength, id, amount, delay, dir, behavior) {
+            maxLength = maxLength || 7;
+            id = id || PageH5.Button.current.id + '_txt';
+            amount = amount || 40;
+            delay = delay || 10;
+            dir = dir || 'left';
+            behavior = behavior || 'alternate';
+            if (!this.rollId) {
+                var marqueeParent = G(id);
+                var html = PageH5.trim(marqueeParent.innerHTML);
+                if (maxLength !== undefined && html.length > maxLength) {
+                    this.rollId = id;
+                    this.innerHTML = html;
+                    marqueeParent.innerHTML = '<div id="' + id + '_marquee" class="common_marquee">' + html + '</div>';
+                    var marqueeChild = G(id + '_marquee');
+                    var width1 = parseInt(PageH5.css(marqueeParent, 'width'));
+                    var width2 = parseInt(PageH5.css(marqueeChild, 'width'));
+                    var maxLeft = width2 - width1;
+                    if (maxLeft <= 0) return;
+                    var marquee_idx = Math.ceil(maxLeft / 50) * 50;
+                    marquee_idx = marquee_idx > 400 ? 400 : marquee_idx;
+                    var time = (maxLeft / amount).toFixed(2);
+                    if (maxLeft < 30) {
+                        time = 0.7;
+                    }
+                    var animation = 'common_marquee_' + marquee_idx + ' ' + time + 's linear 50ms infinite alternate';
+                    marqueeChild.style.webkitAnimation = animation;
+                    marqueeChild.style.animation = animation;
+                }
+            }
+        },
+        stop: function() {
+            if (this.rollId) {
+                G(this.rollId).innerHTML = this.innerHTML;
+                this.rollId = undefined;
+            }
+        }
+    };
+
+    PageH5.fx = {
+        interval: 13,
+        tagIdx: 0,
+        animates: {},
+        start: function(obj, params, speed, easing, callback, tag) {
+            var speeds = {
+                fast: 200,
+                normal: 400,
+                slow: 600
+            };
+            speed = (typeof speed === 'string' ? speeds[speed] : speed) || speeds.normal;
+            if (typeof easing === 'function') {
+                tag = callback;
+                callback = easing;
+                easing = '';
+            }
+            easing = easing || 'swing';
+            tag = tag || 'default';
+            for (var i in this.animates) {
+                if (i.indexOf(tag) >= 0) this.stop(i);
+            }
+
+            var oldParams = params;
+            params = {};
+            var canContinue = false;
+            for (var i in oldParams) {
+                var p = oldParams[i];
+                if (!PageH5.isArray(p)) p = [PageH5.css(obj, i), p];
+                else PageH5.css(obj, i, p[0]);
+                params[i] = {
+                    start: parseFloat(p[0]),
+                    end: parseFloat(p[1])
+                };
+                if (params[i].start !== params[i].end) canContinue = true;
+            }
+            if (!canContinue) return;
+            tag += '_' + (++this.tagIdx);
+            this.animates[tag] = {
+                obj: obj,
+                params: params,
+                speed: speed,
+                easing: easing,
+                callback: callback,
+                startTime: Date.now(),
+                idx: 0,
+                timer: undefined
+            };
+            this.animates[tag].timer = setInterval(function() {
+                var animate = PageH5.fx.animates[tag];
+                animate.idx++;
+                var n = Date.now() - animate.startTime;
+                if (n > animate.speed) {
+                    PageH5.fx.stop(tag);
+                    return;
+                }
+                var percent = n / animate.speed;
+                var pos = PageH5.fx.easing[animate.easing](percent, n, 0, 1, animate.speed);
+                for (var i in animate.params) {
+                    var p = animate.params[i];
+                    PageH5.css(animate.obj, i, p.start + (p.end - p.start) * pos);
+                }
+            },
+            this.interval);
+        },
+        stop: function(tag) {
+            var animate = PageH5.fx.animates[tag];
+            if (!animate) return false;
+            clearInterval(animate.timer);
+            var ps = animate.params;
+            for (var i in ps) PageH5.css(animate.obj, i, ps[i].end);
+            PageH5.call(animate.callback);
+            delete PageH5.fx.animates[tag];
+            return true;
+        },
+        easing: {
+            linear: function(p, n, firstNum, diff) {
+                return firstNum + diff * p;
+            },
+            swing: function(p, n, firstNum, diff) {
+                return 0.5 - Math.cos(p * Math.PI) / 2;
+            }
+        }
+    };
+    PageH5.animate = function(obj, params, speed, easing, callback, tag) {
+        PageH5.fx.start(obj, params, speed, easing, callback, tag);
+    };
+
+})(PageH5);
+
+(function(PageH5) {
+    var positions = {};
+    function getBtn(cid, dir) {
+        var current = positions[cid];
+        var store = [];
+        var leftOrRight = (dir === 'left' || dir === 'right');
+        var hasFindDegIsZero = false;
+        for (var i in positions) {
+            if (i === cid) continue;
+            var next = positions[i];
+            if ((dir === 'left' && next.left >= current.left) || (dir === 'right' && next.right <= current.right) || (dir === 'up' && next.top >= current.top) || (dir === 'down' && next.bottom <= current.bottom)) continue;
+
+            if (leftOrRight && ((next.centerY >= current.top && next.centerY <= current.bottom) || (next.top <= current.centerY && next.bottom >= current.bottom) || (next.top <= current.top && next.bottom >= current.centerY))) {
+                store.push({
+                    id: i,
+                    distance: next.left,
+                    deg: 0
+                });
+                hasFindDegIsZero = true;
+            } else if (!leftOrRight && ((next.centerX >= current.left && next.centerX <= current.right) || (next.left <= current.centerX && next.right >= current.right) || (next.left <= current.left && next.right >= current.centerX))) {
+                store.push({
+                    id: i,
+                    distance: next.top,
+                    deg: 0
+                });
+                hasFindDegIsZero = true;
+            } else if (!hasFindDegIsZero) {
+                var key1 = leftOrRight ? dir: 'centerX';
+                var key2 = !leftOrRight ? (dir == 'up' ? 'top': 'bottom') : 'centerY';
+                var tan = (next[key1] - current[key1]) / (next[key2] - current[key2]);
+                var cdeg = Math.abs(Math.atan(leftOrRight ? (1 / tan) : tan) * 360 / 2 / Math.PI);
+                store.push({
+                    id: i,
+                    distance: next[leftOrRight ? 'left': 'top'],
+                    deg: cdeg
+                });
+            }
+        }
+        var tidu = [0, 30, 45, 60, 85];
+        var _store = [];
+        for (var i = 0; i < tidu.length; i++) {
+            _store = [];
+            for (var j = 0; j < store.length; j++) if (store[j].deg <= tidu[i]) _store.push(store[j]);
+            if (_store.length > 0) break;
+        }
+        store = _store.length ? _store: [];
+        store.sort(function(a, b) {
+            var desc = (dir === 'left' || dir === 'up') ? -1 : 1;
+            return (a.distance < b.distance ? -1 : (a.distance > b.distance ? 1 : 0)) * desc;
+        });
+        var nearest;
+        var result = '';
+        var key = leftOrRight ? 'top': 'left';
+        for (var i = 0; i < store.length; i++) {
+            if (i > 0 && store[i].distance != store[0].distance) break;
+            var distance = Math.abs(positions[store[i].id][key] - current[key]);
+            if (nearest === undefined || distance < nearest) {
+                nearest = distance;
+                result = store[i].id;
+            }
+        }
+        return result;
+    };
+
+    PageH5.getAbsolutePosition = function(elem) {
+        if (elem == null) return {
+            left: 0,
+            top: 0,
+            width: 0,
+            height: 0,
+            right: 0,
+            bottom: 0
+        };
+        var left = elem.offsetLeft,
+        top = elem.offsetTop,
+        width = elem.offsetWidth,
+        height = elem.offsetHeight;
+        while (elem = elem.offsetParent) {
+            left += elem.offsetLeft;
+            top += elem.offsetTop;
+        }
+        return {
+            left: left,
+            top: top,
+            width: width,
+            height: height,
+            right: left + width,
+            bottom: top + height
+        };
+    };
+
+    PageH5.createButtonDir = function(allButtons) {
+        var start = new Date().getTime();
+        var btnGroups = {};
+        for (var i = 0; i < allButtons.length; i++) {
+            if (allButtons[i].autoDirGroup === false) continue;
+            var gname = 'group_' + (allButtons[i].autoDirGroup === undefined ? 'default': allButtons[i].autoDirGroup);
+            btnGroups[gname] = btnGroups[gname] || [];
+            btnGroups[gname].push(allButtons[i]);
+        }
+        for (var gname in btnGroups) {
+            positions = {};
+            var btns = btnGroups[gname];
+            for (var i = 0; i < btns.length; i++) {
+                if (btns[i].autoDir === false) continue;
+                var id = btns[i].id;
+                var obj = document.getElementById(id);
+                var position = PageH5.getAbsolutePosition(obj);
+                position.obj = obj;
+                position.centerX = position.left + position.width / 2;
+                position.centerY = position.top + position.height / 2;
+                positions[id] = position;
+            }
+            var dirs = ['left', 'right', 'up', 'down'];
+            for (var i = 0; i < btns.length; i++) {
+                for (var j = 0; j < dirs.length; j++) {
+                    btns[i][dirs[j]] = btns[i][dirs[j]] || getBtn(btns[i].id, dirs[j]);
+                }
+            }
+        }
+        var end = new Date().getTime();
+    };
+})(PageH5);
+
+(function() {
+    PageH5.scrollScreen = {
+        init: function(option) {
+            this.config.enable = true;
+            for (var i in option) {
+                if (option[i] !== undefined && option[i] !== "") {
+                    this.config[i] = option[i];
+                }
+            }
+            this.scroll(PageH5.getParamInt('scrollTop', 0));
+        },
+        check: function(button, dir) {
+            if (!this.config.enable) return;
+            if (button.restoreScroll) {
+                this.scroll( - this.config.scrollTop);
+                return;
+            }
+            if (!this.config.enableToAllBtn && !button.scrollScreen) return;
+            var id = button.id;
+            var position = document.getElementById(id).getBoundingClientRect();
+            var target = document.getElementById(this.config.wrapperId);
+            var safePx = this.config.safePx;
+            var wrapperPosition = document.getElementById(this.config.wrapperId).getBoundingClientRect();
+            if (position.bottom >= (wrapperPosition.bottom - safePx)) {
+                this.scroll((position.bottom + safePx - wrapperPosition.bottom));
+            } else if (position.top - wrapperPosition.top < safePx) {
+                this.scroll((wrapperPosition.top - position.top + safePx) * -1);
+            }
+        },
+        repair: function() {
+            if (!this.config.enable) return;
+            var target = document.getElementById(this.config.wrapperId);
+            if (PageH5.scrollScreen.config.scrollTop !== target.scrollTop) {
+                target.scrollTop = PageH5.scrollScreen.config.scrollTop;
+            }
+        },
+        scroll: function(addScrollTop) {
+            var target = document.getElementById(this.config.wrapperId);
+            var from = this.config.scrollTop;
+            this.config.scrollTop += addScrollTop;
+            if (enable_animate === false || !this.config.animate || addScrollTop === 0) {
+                target.scrollTop = this.config.scrollTop;
+                return;
+            }
+            var rate = 13,
+            speed = 600,
+            start = Date.now(),
+            easing = 'swing';
+            if (this.config._interval) {
+                clearInterval(this.config._interval);
+                this.config._interval = undefined;
+            }
+            this.config._interval = setInterval(function() {
+                var n = Date.now() - start;
+                if (n > speed) {
+                    clearInterval(PageH5.scrollScreen.config._interval);
+                    PageH5.scrollScreen.config._interval = undefined;
+                    n = speed;
+                }
+                var pos = PageH5.fx.easing[easing](n / speed, n, 0, 1);
+                target.scrollTop = from + pos * addScrollTop;
+            },
+            rate);
+        },
+        config: {
+            animate: true,
+            enable: false,
+            enableToAllBtn: false,
+            wrapperId: 'wrapper',
+            scrollTop: 0,
+            safePx: 40,
+            topSafePx: 40
+        }
+    };
+})();
+
+(function() {
+    PageH5.scroll = {
+        init: function(option) {
+            this.config.enable = true;
+            for (var i in option) {
+                if (option[i] !== undefined && option[i] !== '') {
+                    this.config[i] = option[i];
+                }
+            }
+            this.scr(PageH5.getParamInt('scrollLeft', 0));
+        },
+        check: function(button, dir) {
+            if (!this.config.enable) return;
+            if (button.restoreScroll) {
+                this.scr( - this.config.scrollLeft);
+                return;
+            }
+            if (!this.config.enableToAllBtn && !button.scrollScreen) return;
+            var id = button.id;
+            var position = document.getElementById(id).getBoundingClientRect();
+            var wrapperPosition = document.getElementById(this.config.wrapperId).getBoundingClientRect();
+            var safePx = this.config.safePx;
+            if (position.right >= (wrapperPosition.right - safePx)) {
+                this.scr((position.right + safePx - wrapperPosition.right));
+            } else if (position.left - wrapperPosition.left < safePx) {
+                this.scr((wrapperPosition.left - position.left + safePx) * -1);
+            }
+        },
+        repair: function() {
+            if (!this.config.enable) return;
+            var target = document.getElementById(this.config.wrapperId);
+            if (PageH5.scroll.config.scrollLeft !== target.scrollLeft) {
+                target.scrollLeft = PageH5.scroll.config.scrollLeft;
+            }
+        },
+        scr: function(addScrollLeft) {
+            var target = document.getElementById(this.config.wrapperId);
+            var form = this.config.scrollLeft;
+            this.config.scrollLeft += addScrollLeft;
+            if (enable_animate === false || !this.config.animate || addScrollLeft === 0) {
+                target.scrollLeft = this.config.scrollLeft;
+                return;
+            }
+            var rate = 13,
+            speed = 600,
+            start = Date.now(),
+            easing = 'swing';
+            if (this.config._interval) {
+                clearInterval(this.config._interval);
+                this.config._interval = undefined;
+            }
+            this.config._interval = setInterval(function() {
+                var n = Date.now() - start;
+                if (n > speed) {
+                    clearInterval(PageH5.scroll.config._interval);
+                    PageH5.scroll.config._interval = undefined;
+                    n = speed;
+                }
+                var pos = PageH5.fx.easing[easing](n / speed, n, 0, 1);
+                target.scrollLeft = form + pos * addScrollLeft;
+            },
+            rate);
+        },
+        config: {
+            animate: true,
+            enable: false,
+            enableToAllBtn: false,
+            wrapperId: 'wrapper',
+            scrollLeft: 0,
+            safePx: 40
+        }
+    };
+})();
+
+(function() {
+
+    PageH5.getCurrentURI = function() {
+        var currentURI = CONFIG.CURRENT_URI || (location.pathname + location.search);
+        if (!/^\//g.test(currentURI)) currentURI = CONFIG.CONTEXT_PATH + currentURI;
+        return currentURI + (currentURI.indexOf('?') > 0 ? '': '?1=1');
+    };
+
+    PageH5.go = function(url) {
+        var backURI = PageH5.getCurrentURI() + '&f=' + PageH5.btn.current.id;
+        if (PageH5.scrollScreen && PageH5.scrollScreen.config.enable) backURI += ('&scrollTop=' + PageH5.scrollScreen.config.scrollTop);
+        if (PageH5.scroll && PageH5.scroll.config.enable) backURI += ('&scrollLeft=' + PageH5.scroll.config.scrollLeft);
+        var backUriList = eval("(" + unescape(PageH5.cookie.get('back_page_list', '[]')) + ")");
+        backUriList.push(backURI);
+        var jStr = "";
+        for (var i = 0,
+        length = backUriList.length; i < length; i++) {
+            jStr += '"' + backUriList[i] + '",';
+        }
+        jStr = "[" + jStr.slice(0, -1) + "]";
+        PageH5.cookie.set('back_page_list', escape(jStr));
+        location.href = CONFIG.CONTEXT_PATH + url;
+    };
+
+    PageH5.getBackURI = function() {
+        var backUriList = eval("(" + unescape(PageH5.cookie.get('back_page_list', '[]')) + ")");
+        var backURI = backUriList.pop() || (CONFIG.CONTEXT_PATH + 'index.html');
+        var jStr = "";
+        for (var i = 0,
+        length = backUriList.length; i < length; i++) {
+            jStr += '"' + backUriList[i] + '",';
+        }
+        jStr = "[" + jStr.slice(0, -1) + "]";
+        PageH5.cookie.set('back_page_list', escape(jStr));
+        return backURI;
+    };
+
+    PageH5.goPlayVideo = function(url) {
+        var playEndURI = PageH5.getCurrentURI() + '&f=' + PageH5.btn.current.id;
+        if (PageH5.scrollScreen && PageH5.scrollScreen.config.enable) playEndURI += ('&scrollTop=' + PageH5.scrollScreen.config.scrollTop);
+        PageH5.cookie.set('play_end_page', escape(playEndURI));
+        location.href = CONFIG.CONTEXT_PATH + url;
+    };
+
+    PageH5.getPlayEndURI = function() {
+        var playEndURI = unescape(PageH5.cookie.get('play_end_page', CONFIG.CONTEXT_PATH + 'index.html'));
+        return playEndURI;
+    };
+})();
+
+PageH5.getParam = function(name, defaultValue) {
+    defaultValue = defaultValue === undefined ? '': defaultValue;
+    var result = new RegExp('(\\?|&)' + name + '=(.*?)(&|$)', 'g').exec(location.search);
+    return result ? result[2] : defaultValue;
+};
+
+PageH5.getParamInt = function(name, defaultValue) {
+    defaultValue = defaultValue === undefined ? 0 : defaultValue;
+    return parseInt(PageH5.getParam(name, defaultValue));
+};
+
+PageH5.focusHandler = function() {
+    PageH5.marquee.start();
+};
+PageH5.blurHandler = function() {
+    PageH5.marquee.stop();
+};
+
+(function() {
+    var aimg = document.createElement('img');
+    aimg.setAttribute('src', CONFIG.SPACER);
+    var atag = document.createElement('a');
+    atag.id = 'myDefaultLink';
+    atag.setAttribute('href', '#');
+    atag.appendChild(aimg);
+    document.body.appendChild(atag);
+    document.getElementById('myDefaultLink').focus();
+})();
+

+ 252 - 0
h5v2/jsv2/common.js

@@ -0,0 +1,252 @@
+/* 
+* @Author: Len
+* @Date:   2018-09-05 09:58:27
+* @Last Modified by:   Marte
+* @Last Modified time: 2019-07-23 18:10:14
+*/
+
+
+
+//ajax对象构造函数
+/**
+ * [Ajax description]
+ * @param {[type]} options [请求方式(字符串)]
+ * @param {[dataType]} options [返回数据的格式(字符串)]
+ * @param {[data]} options [参数(对象)]
+ * @param {[url]} options [请求地址(字符串)]
+ * @param {[success]} options [成功回调(函数)]
+ * @param {[error]} options [错误回调(函数)]
+ * @param {[async]} options [是否同步(布尔)]
+ 
+ * 例子:
+ * ajax({
+        url:
+        data:
+        type:
+        dataType:
+        success:
+        error:
+        async:
+    });
+ */
+function ajax(options){
+    var _this = this;
+    //异步请求对象的完成状态
+    this.done = 0;
+    this.format = function(){
+        var now = new String(new Date().getTime());
+        return now.substr(0,now.length-5);
+    }
+    //格式化参数
+    this.formatParams = function(data) {
+        //获取地址参数
+        var arr = [];
+        for (var name in data) {
+            arr.push(encodeURIComponent(name) + "=" + encodeURIComponent(data[name]));
+        }
+        
+        arr.push("t="+_this.format());//按分钟刷一次
+        return arr.join("&");
+    }
+    
+    //传入设置
+    options = options || {};
+    //请求方式
+    options.type = (options.type || "GET").toUpperCase();
+    options.dataType = options.dataType || "json";
+    options.async = options.async || true;
+    var params = _this.formatParams(options.data);
+    //创建异步请求对象 - 第一步
+    var xhr;
+    //w3c标准
+    if (window.XMLHttpRequest) {
+        xhr = new XMLHttpRequest();
+    } 
+    //兼容IE6及以下
+    else if (window.ActiveXObject) { 
+        xhr = new ActiveXObject('Microsoft.XMLHTTP');
+    }
+    
+    //连接 和 发送 - 第二步
+    //判断是那种类型的请求
+    //若是get请求
+    if (options.type == "GET") {
+        //参数拼接
+        if(options.url.indexOf("?")==-1) sp="?" ; else sp="&";
+    
+        //发送请求
+        xhr.open("GET", options.url + sp + params,options.async);
+        xhr.send(null);
+        
+    } 
+    //若是post请求
+    else if (options.type == "POST") {
+        //发送请求
+        xhr.open("POST", options.url,options.async);
+        //设置表单提交时的内容类型
+        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+        //参数配置
+        xhr.send(params);
+    }
+
+    //接收 - 第三步
+    xhr.onreadystatechange = function() {
+        if (xhr.readyState == 4) {
+            //状态码
+            var status = xhr.status;
+            //状态码表示成功时,执行成功回调函数
+            if (status >= 200 && status < 300 || status == 304) {
+                            
+                //返回数据的格式
+                //json字符串
+                if (options.dataType == "json") {
+
+                    try{
+                        options.success && options.success(eval("("+xhr.responseText+")"));
+                    }
+                    catch(err){
+                        options.success && options.success(JSON.parse(xhr.responseText), xhr.responseXML);
+                    }
+                    
+                
+                } 
+                //普通字符串
+                else {
+                    options.success && options.success(xhr.responseText, xhr.responseXML);
+                }
+                // 改变状态为完成
+                _this.done = 1;
+            } 
+            //如果状态码表示失败时调用错误处理回调函数
+            else {
+                options.error && options.error(status);
+                // 改变状态为完成
+                _this.done = 1;
+            }
+        }
+    }
+}
+
+
+
+function setCookie(name,value,t){   
+  //document.cookie.setPath("/");  
+  var hour = t?t:8; 
+  var exp = new Date();   
+  exp.setTime(exp.getTime() + hour*60*60*1000);   
+  document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString()+";path=/";   
+} 
+
+function getCookie(name){   
+  //document.cookie.setPath("/");  
+  var arr, reg = new RegExp("(^| )"+name+"=([^;]*)(;|$)");  
+  if(arr=document.cookie.match(reg)){  
+      return unescape(arr[2]);   
+  }  
+  else{  
+      return null;   
+  }
+}
+
+/**
+  * 获取url字段参数化
+  * @param name 字段名
+*/
+function getQueryString(name){
+  var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
+  var r = window.location.search.substr(1).match(reg);
+  if (r != null) return unescape(r[2]); return null; 
+}
+
+//类名增加兼容
+function addClass(obj, cls){
+    if (!hasClass(obj, cls)) obj.className += " " + cls
+}
+
+// 去除类名
+function removeClass(obj, cls){
+    if (hasClass(obj, cls)) {
+        var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
+        obj.className = obj.className.replace(reg, ' ')
+    }
+}
+
+// 查看类名
+function hasClass(obj, cls){
+    // console.log(obj,cls)
+    return obj.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
+}
+
+function tips(text, time) {//提示工具
+    time = time ? time : 1500;
+    var para = document.createElement("p");
+    para.innerHTML = text;
+    para.setAttribute("class", "w_tips");
+    para.setAttribute("style", "display: block;border-radius: 9px;background-color: #287AFF;text-align: center;color: #FFF;padding: 7px 27px;font-size: 16px; position: fixed;left: 45%;top: 42%;z-index: 9999;");
+    document.body.appendChild(para);
+    para.style.marginLeft = -para.offsetWidth / 2+"px";
+    setTimeout(function() {
+        document.body.removeChild(para);
+    }, time);
+};
+
+// 缓冲运动
+function animate(ele,opt,callback){
+    //设置一个变量用于判断动画数量
+    var timerLen = 0;
+    for(var attr in opt){
+        creatTimer(attr);
+        //每加一个定时器,动画数加一
+        timerLen++;
+    }
+    function creatTimer(attr){
+        var timerName = attr + 'timer';console.log(timerName)
+        var target = opt[attr];
+        clearInterval(ele[timerName]);
+        ele[timerName] = setInterval(function(){
+            // 先获取当前值
+            var current = getComputedStyle(ele)[attr];
+
+            // 提取数值:单位
+            // 根据当前值提取单位(单位在current最后面)
+            var unit = current.match(/[a-z]+$/);
+            if(unit){
+                current = current.substring(0,unit.index)*1;
+                unit = unit[0]
+            }else{
+                unit = '';
+                current *= 1;
+            }
+
+            // 计算速度
+            var speed = (target - current)/10;
+
+            // 处理speed值,防止speed为小数而造成定时器无法完成的情况
+            // 0.3=>1,-0.3=>-1
+            speed = speed>0 ? Math.ceil(speed) : Math.floor(speed);
+
+            //对于没有单位的属性单独处理
+            if(attr == 'opacity'){
+                speed = speed>0?0.05:-0.05;
+            }
+            
+
+            if(current === target){console.log("清除定时器")
+                clearInterval(ele[timerName]);
+                current = target - speed;
+                //每完成一个动画,timerLen减一
+                timerLen--
+                //最后若timerLen数量为零,则所有动画已经执行完再执行回调函数
+                if(typeof callback ==='function'&&timerLen==0){
+                    callback();
+                }
+                
+            }
+            ele.style[attr] = current + speed + unit;
+        },30)
+    };
+
+    
+}
+
+

+ 6 - 0
h5v2/jsv2/config.js

@@ -0,0 +1,6 @@
+var CONFIG = 
+{
+	CONTEXT_PATH: '/h5v2/' //项目名称
+}
+CONFIG.SPACER = CONFIG.CONTEXT_PATH + 'images/com/spacer.gif'; //通用未聚焦透明图片
+

+ 363 - 0
h5v2/jsv2/md5.js

@@ -0,0 +1,363 @@
+/*
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
+ * Digest Algorithm, as defined in RFC 1321.
+ * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for more info.
+ */
+
+/*
+ * Configurable variables. You may need to tweak these to be compatible with
+ * the server-side, but the defaults work in most cases.
+ */
+var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
+var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
+var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */
+
+/*
+ * These are the functions you'll usually want to call
+ * They take string arguments and return either hex or base-64 encoded strings
+ */
+function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
+function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
+function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
+function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
+function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
+function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }
+
+/*
+ * Perform a simple self-test to see if the VM is working
+ */
+function md5_vm_test()
+{
+  return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
+}
+
+/*
+ * Calculate the MD5 of an array of little-endian words, and a bit length
+ */
+function core_md5(x, len)
+{
+  /* append padding */
+  x[len >> 5] |= 0x80 << ((len) % 32);
+  x[(((len + 64) >>> 9) << 4) + 14] = len;
+
+  var a =  1732584193;
+  var b = -271733879;
+  var c = -1732584194;
+  var d =  271733878;
+
+  for(var i = 0; i < x.length; i += 16)
+  {
+    var olda = a;
+    var oldb = b;
+    var oldc = c;
+    var oldd = d;
+
+    a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
+    d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
+    c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
+    b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
+    a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
+    d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
+    c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
+    b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
+    a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
+    d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
+    c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
+    b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
+    a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
+    d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
+    c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
+    b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);
+
+    a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
+    d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
+    c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
+    b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
+    a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
+    d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
+    c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
+    b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
+    a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
+    d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
+    c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
+    b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
+    a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
+    d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
+    c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
+    b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
+
+    a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
+    d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
+    c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
+    b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
+    a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
+    d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
+    c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
+    b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
+    a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
+    d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
+    c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
+    b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
+    a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
+    d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
+    c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
+    b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
+
+    a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
+    d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
+    c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
+    b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
+    a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
+    d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
+    c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
+    b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
+    a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
+    d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
+    c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
+    b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
+    a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
+    d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
+    c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
+    b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
+
+    a = safe_add(a, olda);
+    b = safe_add(b, oldb);
+    c = safe_add(c, oldc);
+    d = safe_add(d, oldd);
+  }
+  return Array(a, b, c, d);
+
+}
+
+/*
+ * These functions implement the four basic operations the algorithm uses.
+ */
+function md5_cmn(q, a, b, x, s, t)
+{
+  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
+}
+function md5_ff(a, b, c, d, x, s, t)
+{
+  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
+}
+function md5_gg(a, b, c, d, x, s, t)
+{
+  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
+}
+function md5_hh(a, b, c, d, x, s, t)
+{
+  return md5_cmn(b ^ c ^ d, a, b, x, s, t);
+}
+function md5_ii(a, b, c, d, x, s, t)
+{
+  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
+}
+
+/*
+ * Calculate the HMAC-MD5, of a key and some data
+ */
+function core_hmac_md5(key, data)
+{
+  var bkey = str2binl(key);
+  if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
+
+  var ipad = Array(16), opad = Array(16);
+  for(var i = 0; i < 16; i++)
+  {
+    ipad[i] = bkey[i] ^ 0x36363636;
+    opad[i] = bkey[i] ^ 0x5C5C5C5C;
+  }
+
+  var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
+  return core_md5(opad.concat(hash), 512 + 128);
+}
+
+/*
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+ * to work around bugs in some JS interpreters.
+ */
+function safe_add(x, y)
+{
+  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
+  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+  return (msw << 16) | (lsw & 0xFFFF);
+}
+
+/*
+ * Bitwise rotate a 32-bit number to the left.
+ */
+function bit_rol(num, cnt)
+{
+  return (num << cnt) | (num >>> (32 - cnt));
+}
+
+/*
+ * Convert a string to an array of little-endian words
+ * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
+ */
+function str2binl(str)
+{
+  var bin = Array();
+  var mask = (1 << chrsz) - 1;
+  for(var i = 0; i < str.length * chrsz; i += chrsz)
+    bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
+  return bin;
+}
+
+/*
+ * Convert an array of little-endian words to a string
+ */
+function binl2str(bin)
+{
+  var str = "";
+  var mask = (1 << chrsz) - 1;
+  for(var i = 0; i < bin.length * 32; i += chrsz)
+    str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
+  return str;
+}
+
+/*
+ * Convert an array of little-endian words to a hex string.
+ */
+function binl2hex(binarray)
+{
+  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
+  var str = "";
+  for(var i = 0; i < binarray.length * 4; i++)
+  {
+    str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
+           hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
+  }
+  return str;
+}
+
+/*
+ * Convert an array of little-endian words to a base-64 string
+ */
+function binl2b64(binarray)
+{
+  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+  var str = "";
+  for(var i = 0; i < binarray.length * 4; i += 3)
+  {
+    var triplet = (((binarray[i   >> 2] >> 8 * ( i   %4)) & 0xFF) << 16)
+                | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
+                |  ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
+    for(var j = 0; j < 4; j++)
+    {
+      if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
+      else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
+    }
+  }
+  return str;
+}
+
+
+/**
+ * base 64加密
+ */
+function Base64 () {
+    // private property  
+    _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+
+    // public method for encoding  
+    this.encode = function (input) {
+        var output = "";
+        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
+        var i = 0;
+        input = _utf8_encode(input);
+        while (i < input.length) {
+            chr1 = input.charCodeAt(i++);
+            chr2 = input.charCodeAt(i++);
+            chr3 = input.charCodeAt(i++);
+            enc1 = chr1 >> 2;
+            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
+            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
+            enc4 = chr3 & 63;
+            if (isNaN(chr2)) {
+                enc3 = enc4 = 64;
+            } else if (isNaN(chr3)) {
+                enc4 = 64;
+            }
+            output = output +
+                _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
+                _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
+        }
+        return output;
+    }
+
+    // public method for decoding  
+    this.decode = function (input) {
+        var output = "";
+        var chr1, chr2, chr3;
+        var enc1, enc2, enc3, enc4;
+        var i = 0;
+        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
+        while (i < input.length) {
+            enc1 = _keyStr.indexOf(input.charAt(i++));
+            enc2 = _keyStr.indexOf(input.charAt(i++));
+            enc3 = _keyStr.indexOf(input.charAt(i++));
+            enc4 = _keyStr.indexOf(input.charAt(i++));
+            chr1 = (enc1 << 2) | (enc2 >> 4);
+            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
+            chr3 = ((enc3 & 3) << 6) | enc4;
+            output = output + String.fromCharCode(chr1);
+            if (enc3 != 64) {
+                output = output + String.fromCharCode(chr2);
+            }
+            if (enc4 != 64) {
+                output = output + String.fromCharCode(chr3);
+            }
+        }
+        output = _utf8_decode(output);
+        return output;
+    }
+
+    // private method for UTF-8 encoding  
+    _utf8_encode = function (string) {
+        string = string.replace(/\r\n/g, "\n");
+        var utftext = "";
+        for (var n = 0; n < string.length; n++) {
+            var c = string.charCodeAt(n);
+            if (c < 128) {
+                utftext += String.fromCharCode(c);
+            } else if ((c > 127) && (c < 2048)) {
+                utftext += String.fromCharCode((c >> 6) | 192);
+                utftext += String.fromCharCode((c & 63) | 128);
+            } else {
+                utftext += String.fromCharCode((c >> 12) | 224);
+                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
+                utftext += String.fromCharCode((c & 63) | 128);
+            }
+
+        }
+        return utftext;
+    }
+
+    // private method for UTF-8 decoding  
+    _utf8_decode = function (utftext) {
+        var string = "";
+        var i = 0;
+        var c = c1 = c2 = 0;
+        while (i < utftext.length) {
+            c = utftext.charCodeAt(i);
+            if (c < 128) {
+                string += String.fromCharCode(c);
+                i++;
+            } else if ((c > 191) && (c < 224)) {
+                c2 = utftext.charCodeAt(i + 1);
+                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
+                i += 2;
+            } else {
+                c2 = utftext.charCodeAt(i + 1);
+                c3 = utftext.charCodeAt(i + 2);
+                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
+                i += 3;
+            }
+        }
+        return string;
+    }
+}

File diff suppressed because it is too large
+ 283 - 0
h5v2/jsv2/mypromise.js


+ 247 - 0
h5v2/jsv2/webview.js

@@ -0,0 +1,247 @@
+/**
+ * webview接口
+ */
+/*global Common: true, $: false,jQuery:false,template:false,console:false , starcorExt:false,starcor:false*/
+
+(function(){
+
+var oldStarcorExt = starcorExt;
+starcorExt = {
+	_setCallbackResult: function(idx,ret) {
+		oldStarcorExt._setCallbackResult(idx,ret);
+	},
+	_execAndroidFunc: function(func,args) {
+	return	oldStarcorExt._execAndroidFunc(func,args);
+	}
+};
+//
+starcorExt._invokeCallback = function(name, args, returnIdx) {
+    var func = this._callbacks[name];
+	console.log("starcorExt._invokeCallback func:"+func+"args:"+args);
+	if(args!=null){
+		 var item0 = args[0];
+		 console.log("item0.type:"+typeof(item0.type));
+		 if(typeof(item0.type)=="undefined"){
+			 args=JSON.parse(args);
+			 console.log("args:"+args);
+		 }
+	}
+    var ret = null;
+    try {
+        var invokeArgs = [];
+        for( var idx in args ) {
+            var item = args[idx];
+			console.log("item:"+item+"idx:"+idx);
+			console.log("item.type:"+item.type+",item.value:"+item.value);
+            switch(item.type) {
+                case "number":
+                    invokeArgs.push(Number(item.value));
+                    break;
+                case "string":
+                    invokeArgs.push(String(item.value));
+                    break;
+                case "boolean":
+                    invokeArgs.push("true".toLowerCase() == item.value);
+                    break;
+            }
+        }
+        ret = func.apply(this, invokeArgs);
+    } catch (e) {}
+    starcorExt._setCallbackResult(returnIdx, ret);
+};
+starcorExt._addCallback = function(callback) {
+    var callbackIdx = String(starcorExt._callback_counter++);
+    this._callbacks[callbackIdx] = callback;
+    return callbackIdx;
+};
+starcorExt._callback_counter = 0;
+starcorExt._callbacks = {};
+
+// 调用浏览器功能,参数依cmd类型而定
+starcorExt.exec = function() {
+    var args = [];
+    for(var idx=0;idx<arguments.length;++idx) {
+        var val = arguments[idx];
+        switch (typeof val) {
+            case "number":
+                args.push({"type":"number", "value":val});
+                break;
+            case "string":
+                args.push({"type":"string", "value":val});
+                break;
+            case "bool":
+                args.push({"type":"boolean", "value":val});
+                break;
+            case "object":
+                args.push({"type":"object", "value":val});
+                break;
+            case "function":
+                args.push({"type": "callback", "value": this._addCallback(val)});
+                break;
+        }
+    }
+    var cmd = args.shift();
+    if(typeof this._execAndroidFunc === "undefined"){
+        return null;
+    }
+    return this._execAndroidFunc(cmd.value, JSON.stringify(args));
+};
+// 返回版本信息
+starcorExt.getVersion = function() {
+    return this.exec("getVersion");
+};
+// 关闭浏览器或浏览器所在的页面
+starcorExt.closeBrwoser = function(reason) {
+    if (reason)
+        return this.exec("closeBrowser",reason);
+};
+// 输出日志信息, info可为一个或多个, 多个输入参数以空格分隔
+starcorExt.log = function(tag, info) {
+    var logMsg = [];
+    for(var idx=1;idx<arguments.length;++idx) {
+        var item = arguments[idx];
+        if (item instanceof Array || typeof(item) == "object") {
+            logMsg.push(JSON.stringfy(item));
+        } else {
+            logMsg.push(item);
+        }
+    }
+    this.exec("log", tag, logMsg.join(" "));
+};
+// 调整浏览器尺寸,调整后,浏览器保持在屏幕上居中位置
+starcorExt.resizeBrowser = function(width, height) {
+    return this.exec("resizeBrowser", width, height);
+};
+starcorExt.moveBrowser = function(x, y) {
+    return this.exec("moveBrowser", x, y);
+};
+starcorExt.moveBrowserEx = function(x, y, width, height) {
+    return this.exec("moveBrowserEx", x, y, width, height);
+};
+starcorExt.getBrowserPosition = function() {
+    var posInfo = this.exec("getBrowserPosition");
+    posInfo = posInfo.split(",");
+    return {
+        x:posInfo[0],
+        y:posInfo[1],
+        width:posInfo[2],
+        height:posInfo[3]
+    };
+};
+starcorExt.getScreenSize = function() {
+    var posInfo = this.exec("getScreenSize");
+    posInfo = posInfo.split(",");
+    return {
+        width:posInfo[0],
+        height:posInfo[1]
+    };
+};
+// 设置事件回调
+// handlerType 回调类型, KeyEvent, Message
+// handler 回调函数, 其形式由handlerType决定
+//-----------------------------------------------------------------------------
+// handler为空表示取消对事件的监听
+// handler如果处理了事件, 返回true, 否则事件交由浏览器处理
+starcorExt.setHandler = function(handlerType, handler) {
+    return this.exec("setHandler", handlerType, handler);
+};
+// 获取焦点
+// webview获取焦点后,所有按键事件都将转发给页面处理
+starcorExt.requestFocus = function() {
+    return this.exec("requestFocus");
+};
+// 释放焦点
+// direction: 将焦点释放给当前webview在某个方向上的相邻元素,如无相邻元素,则焦点不变化
+starcorExt.releaseFocus = function(direction) {
+    return this.exec("releaseFocus", direction);
+};
+// 是否有焦点
+starcorExt.hasFocus = function() {
+    return this.exec("hasFocus");
+};
+// 读取系统属性
+// propName:
+//		user.name			读取用户名,未登录时值为空
+//		user.token			读取用户token,未登录时值为空
+//		user.id				读取用户id,未登录时值为空
+//		app.name			读取应用名
+//		app.version			读取应用版本
+//		stbid               stb_id机顶盒编码,即机顶盒串号(联通)
+starcorExt.readSystemProp = function(propName) {
+    return String(this.exec("readSystemProp", propName));
+};
+// 设置按键事件回调, handler形如function(action, keyCode, keyName, metaState)
+// action可以为keyUp, keyDown
+// keyName为按键名称, 如: up, down, left, right, a, b, c, d, 1, 2, 3, 4, enter, return, UNKNOWN
+// keyCode为按键对应的键值
+// metaState为控制建对应状态,ctrl, alt, shift等
+starcorExt.setKeyEventHandler = function(handler) {
+    return this.setHandler("KeyEvent", handler);
+};
+// 设置消息回调,handler形如function(msg, extInfo)
+// msg:
+//		onFocusChanged,	true/false	-	webview焦点变化,true表示获取焦点,false表示失去焦点
+starcorExt.setMessageHandler = function(handler) {
+    return this.setHandler("Message", handler);
+};
+// 发送消息给应用
+// msg:
+//      onLogin,     extInfo: {name:"user name", id:"user id", token:"login token"}
+//      onPurchases, extInfo: {id:"item id", result:"success"/"failed", msg:"err message"}
+starcorExt.sendMessage = function(msg, extInfo) {
+    return this.exec("sendMessage", msg, extInfo);
+};
+// 发送Android Intent
+// mode:
+//      sendBroadcast   发送广播
+//      startActivity   打开应用
+//      startService    启动服务
+starcorExt.sendIntent = function(mode, intent) {
+    return this.exec("sendIntent", mode,intent);
+};
+// 打开子浏览器(弹出方式)
+// 同时只能打开一个子浏览器
+starcorExt.openBrowser = function(url) {
+    return this.exec("openBrowser", url);
+};
+
+
+
+/*设置小视频窗口位置
+x:起始x坐标
+y:起始y坐标
+width:宽度
+height:高度
+*/
+starcorExt.setVideoWindowPosition = function(x,y,width,height) {
+    return this.exec("setVideoWindowPosition", x,y,width,height);
+};
+/*播放视频,其中playParams为json数据,示例如下:
+var playParams = {
+            video_type:"0",
+            video_id:"b836aef6c9b851958199d3b5a1a77050",
+            video_name:"青云志",
+            media_asset_id:"TVseries",
+            category_id:"1000015",
+            ui_style:"0",
+            video_index:"26",
+            quality:"hd",
+            video_all_index:"27",
+            video_new_index:"26",
+        };
+*/
+starcorExt.playVideo = function(playParams) {
+    return this.exec("playVideo", playParams);
+};
+//停止播放视频
+starcorExt.stopVideo = function() {
+    return this.exec("stopVideo");
+};
+//web页面是否有输入框,有输入框则设置为“true”,没有则设置成“false”
+//调用示例:Webview.setInputTypeTextFlag("false");
+starcorExt.setInputTypeTextFlag = function(flag) {
+    return this.exec("setInputTypeTextFlag",flag);
+};
+ window.Webview = starcorExt;
+
+})();