PopupFlash

鼠标悬停在 flash 视频上会出现一个按钮,点击后可放大浮动在页面上。

  1. // ==UserScript==
  2. // @author yansyrs
  3. // @name PopupFlash
  4. // @namespace http://opera.im/archives/pop-up-flash/
  5. // @description 鼠标悬停在 flash 视频上会出现一个按钮,点击后可放大浮动在页面上。
  6. // @version v1.1.6
  7. // @date 2013-10-18
  8. // @include *
  9. // ==/UserScript==
  10.  
  11. (function(storage){
  12. /* -------------------------------------------- 设置开始 ------------------------------------------*/
  13. // 悬停在视频上的按钮尺寸,单位为像素
  14. var POPUP_ICON_SIZE = 26;
  15. // 无保存值时,浮动的 FLASH 的默认尺寸,默认长和宽为浏览器页面大小的 70%
  16. var POPUP_FLASH_SIZE = 70;
  17. // 浮动 FLASH 的最小宽度,单位为像素
  18. var POPUP_FLASH_MIN_WIDTH = 640;
  19. // 浮动 FLASH 的最小高度,单位为像素
  20. var POPUP_FLASH_MIN_HEIGHT = 480;
  21. // 出现在菜单上的尺寸列表,name 是列表项文字,width 是宽度,height 是高度。单位是像素。
  22. // 注:width 与 height 任意一值超过可视页面的宽/高时,则该菜单不显示
  23. var POPUP_FLASH_SIZE_LIST =
  24. [
  25. {name: '初始默认值', width: 0, height: 0}, // 此项为第一位且不删除
  26. {name: '800 x 600', width: 800, height: 600},
  27. {name: '854 x 480 [宽]', width: 854, height: 480},
  28. {name: '1024 x 768', width: 1024, height: 768},
  29. {name: '1280 x 720 [宽]', width: 1280, height: 720},
  30. ];
  31. // 黑色背景的不透明度,0 为全透,1 为不透
  32. var BACKGROUND_OPACITY = 0.8;
  33. // 拖拽边缘调整尺寸时,在何处显示尺寸大小
  34. // 可选值:title、statusbar、both、disable(分别代表“标题栏”、“状态栏”、“标题栏和状态栏”以及“不显示”)
  35. // 注:Opera 的 JavaScript 选项中必须勾选“允许更改状态域”才能使状态栏的修改生效。
  36. var SHOW_RESIZE_INFO = 'both';
  37. // 点击背景关闭浮动的 FLASH,可选值:"NONE_CLICK"、"CLICK"、"DOUBLE_CLICK"
  38. var CLICK_BLANK_TO_CLOSE = 'CLICK';
  39. // 白名单列表,判断时优先级最高,只要出现该关键字就认为是视频
  40. // 可设置多个,用逗号分隔,使用小写
  41. // 规则:如果 flash 代码的 id、class、name、src、data、flashvars 任一属性中出现下列关键词,则认为是视频
  42. var WHITE_LIST_KEYWORD_IMPORTANT = ['ytimg'];
  43. // 白名单列表,优先级最低,如果在黑名单中已经排除,那么即使在白名单内也有相关关键字,也不会认为是视频
  44. var WHITE_LIST_KEYWORD = ['player', 'video', 'tudou.com', 'viddler', 'youtube'];
  45. // 黑名单列表,可设置多个,用逗号分割,使用小写
  46. // 如果 flash 代码的 id、class、name、src、data、flashvars 任一属性中出现下列关键词,则认为不是视频
  47. // 注:可将没有通用关键词的网站域名列入关键词内,如 xiami.com。同一个关键词在黑白名单都出现时,优先黑名单。
  48. var BLACK_LIST_KEYWORD = ['mp3', 'music', 'xiami.com', 'adplayer'];
  49. // 尺寸过滤,如果宽与高都小于下面的值,则认为不是视频。单位为像素。
  50. var FLASH_SIZE_FILTER = {width: 320, height: 240};
  51. // 拖动窗口时,该值越大,占用 CPU 越小,但同时也越不平滑。
  52. var PLAYER_MOUSE_MOVE_FILTER = 2;
  53. /* -------------------------------------------- 设置结束 ------------------------------------------*/
  54. var picData = {
  55. popup_icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAIAAAAmKNuZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ4Nzc3NkEyMDIyMTExRTE5RTVDRDgxNTI5RTA2M0M0IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjQ4Nzc3NkEzMDIyMTExRTE5RTVDRDgxNTI5RTA2M0M0Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDg3Nzc2QTAwMjIxMTFFMTlFNUNEODE1MjlFMDYzQzQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDg3Nzc2QTEwMjIxMTFFMTlFNUNEODE1MjlFMDYzQzQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6ATvzGAAABF0lEQVR42tSUTQqDMBCFTS3ewAN4S0EQBEEQBEEICILXcOOV3Loq7cOBNExMNWkL7awm8zJfJpOfIPhpi+P4K6h5nu9ehkQFEcqD4F2XEIKHaClzap7nJMExVVvWvqBYNqIDjrF2iSzrYmtHGIZJkphxBCEdt1Nfp6qquq6RNo6jXhqGCELChLObLYqCfEYkVtd1NMS0YxzrlyISq+97XVULW3GmNU0DUBRFbOO6Kcj1sKcA3TZb19XhZrP6yaSUkORm5OhqmqYORzEMA4Zt2zK0Yp29xiCiU3DQOL0cHCsRieX2KnC5zK6jWJ9XQQ/DDC7L4nAULFiWpV5almVv/Sg6UfXrRdaHv89n76Zp8mN5J/67PQQYAAbsFlu8mAWNAAAAAElFTkSuQmCC',
  56. popup_icon_reload: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAIAAAAmKNuZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjE1OUY3MzNGMEI4QTExRTFCODQ1RkUzRjgzRjJCNzRGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjE1OUY3MzQwMEI4QTExRTFCODQ1RkUzRjgzRjJCNzRGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTU5RjczM0QwQjhBMTFFMUI4NDVGRTNGODNGMkI3NEYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MTU5RjczM0UwQjhBMTFFMUI4NDVGRTNGODNGMkI3NEYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4Gn/ifAAABOklEQVR42tSUQYqEMBBF49i47ZUH8BZ9G68hCIIgCIIgCIIg2Mdw45Wkd66GzG+LCTWJth3tzRSiSZX1rPxKFOLjdhPiLsRjud9OsnzfB0X+XvdzqOfjwXDyepWWNo7jHyqvToahtLcV7Z51haGpXZIklIOBucAV3IuAYm0RLXAaa5WoZX1ttcl13SAITD+cCO23mX8nz/OiKJDW9z0vDVM4EcIL7y42TVMaa0Ri1XVNU7y2j9P0UkRitW3Lo+rDmzjTyrIEyPM8beGr++6yqylA34vN82xx4rT6yZqmQahZjAY8GkWRRSu6rsO0qioNrVjvbmMQoRQGEI6Xg7YSkVh2pwKby1QdxR45FXQwTOc0TRat0JxZlvHS4jg+9UfhRKXXiyyHBw7/1h3H0bUbhuEY63Dif7cfAQYAG/lNJ9LDJZEAAAAASUVORK5CYII=',
  57. option: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjg5MDQxMERFRkZEOTExRTA5NkI2RkJBQ0I1NkMwOEY1IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjg5MDQxMERGRkZEOTExRTA5NkI2RkJBQ0I1NkMwOEY1Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6ODkwNDEwRENGRkQ5MTFFMDk2QjZGQkFDQjU2QzA4RjUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6ODkwNDEwRERGRkQ5MTFFMDk2QjZGQkFDQjU2QzA4RjUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6oax7AAAAGW0lEQVR42qxXeWwUVRj/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',
  58. close: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkFCNTczMEM3RkQ0QjExRTA4M0U3QUNBRTYwODI2Q0Y0IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkFCNTczMEM4RkQ0QjExRTA4M0U3QUNBRTYwODI2Q0Y0Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QUI1NzMwQzVGRDRCMTFFMDgzRTdBQ0FFNjA4MjZDRjQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QUI1NzMwQzZGRDRCMTFFMDgzRTdBQ0FFNjA4MjZDRjQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz47qcxnAAAFR0lEQVR42sRXfUxWVRh/7ouD+EoC3mwIyodGFCHYCwSSYpKgsuV/NVY5qenIBAbCgtnaKiSm/sP6p3KLNYmcLP4SDdJCbbWYtPiULzHicway+LBW7z39nnvfF++9vFdepa2z/e6555zn43ee55xzz5WEECRJErlT9mRlWSEbK1kscaht6AoFrI7hQWAE9n4SstyLuv3chQsLy9mU3CGwOzPzIcgcgONs1PHoCgQsJuL/AOOw+yOINMh2+5nzzc3igQhkZWR4WSyWl+H4bTSjVTGdrFFRaF9hmtstsmw/cb6pufG+CGTu2OED50WSRSpGc7XDl3u50hFSOI3LslwuZHH664sX7csSeGH7dquHh8fnzEMz6/t1riOBxzxcHReyvaLp0rd2UwIZ6dt8EPJ3LZJUskLHLlIjQEIUIho133zXopBY5SIrhUjeYRnE3N4eyxfJsSh8UVfA8jTqhiUReP65tDDMvg3dQY55qyEw4cG6Oi/LyykrE4W3avqlK1f/XNxK6VtSvSBYioEgIWRCLQHkhJenJ+3cmUlFxUcoLi5O6VOWuWPc+c5jLMOyrKO1odhU5ZJQH9ClAB3RvASEIfT8yspZu3bTvtxc8vf3p03x8XS0vIxuDg3pZhkREUHFJaUUsnYtpW3dSt4+3vRV/VklkJooOBvZ21JT6iwaA7vgKFpoZuVESEgIHcrPV5xzYQcfHKskW2Liogy/v48+HuPCsocO55M1OHiJPYePzagTFAJpSYkc7nQZoccKlQDSYnZ2lmZmZnR5ZUeFRcUUHh6ugN+dzp2FdWZn58hoz4FAToWSky2JNkRamkK0AzjoSxeWoJgnY6mkrIw2bNxocHJbqQMCHtH1D/T30/EPK6mnq9OYAu3WbLKo4ZdDwWa1K6Z2u12puzs7qOpYBd2entZZYcdG5yxTVVmh6GhtuECUSkAW/mr4heRaUJAddVdHO5UWFVJ/X5/phucxlulqb4djVdfE+V0CjtybgmfgnEVXZyed/bLOlACPsYxRzwyOCMh2RGHpatXAuc9tScn02v5cUwI8ZktMXnJOmOAPNQKyPOJgJFyx5AUEjhQeEUmlZeUUGhZmSoDHSsvLFVnWUXVNIzDiXAML8DxgPnM7Jaek0snq6iXOfxseVmAkwbKsw7r3iETr4rcg/olo/vy+Yrxo8Jifnx/V1tdT2Lr1OkfTU1NUnP+W8n6y+iMKDArSjQ8O9NP+nByam5szbkNno0BzEsoNwLzyHTDAz9+Pgq2P6oz3Xu+hgjcP0s/XrikoyDuo9BkPKx9fH3JlE+gDLt8lIMttyEkX582IibExqjn1Cd25s7A48/feOUodv7QvhrMD2477eIwLy9ac+pTGR0eN9oRay61Ar+5zHBsVsQ9UPtOmQfkYIWC4IVH23r2U8IyNztSexgnXpUhI2pji8fSmOHop51X6/uplampsVLah7qqoNuag+Wzn4FC3jsBTkeE+aDdDJsUVCdOLjukdVT3YdfcBtffj7qFf81xeyWLC1yUgN1/wLdjU6oquZXROkix5PTeHR1wTWB/mgb49QB02j/d/REKoRqRJ+Mq8PjzSvuy1/PHQkBcRiSp+XQEJocnFFRA40jcy1qoVWHUPXf6RuIVDqhr1ZqFfBZK7juH0bzyaoFDYNzo+eN+/ZhtC1jwMmdexd95AMwrwdO/PiOaBNlxyT8B+08DY5F8P/G/IJfIxayyCkAJ5Pi0TAF8DCadzvjC0wGYtDP9wY+LWxIp/TnVE1lglpMMLZGLQ5A+Dl2bGg7DVd2Pyd+H2D4MQgv7P8q8AAwDJYk66CQZGEAAAAABJRU5ErkJggg==',
  59. pin: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAADdcAAA3XAHLx6S5AAADUElEQVQ4y22TX2xTZRjGn+87f9q1XQst7RgMS103kAkZATfAZMkg884LLryTC0NITEgMAyPekJgYbzYlhpsZs8wLY+KdWZiJIkIE/+AESdlxdIubs+tgrj1rt3Ztzznf971eaGRGn5s3T/L83rwX78Pwf9rxKsBNoLwBuC5v6j8UlzrKnDHHETonMPVXkMA2c74DryCUPoz2rkOwiyvcMHRVLq+/UypVLziuM8cY3mv645sxN3GMCaONgsbqvxfsfysLXdexs5lgMldri3A5OTX/MfeHX/7+3m8eRNkA50MgeRFgDNdeI4bjlwEiNHEgkdyD33+dQSwR4fb0DRVPdSWV2/i6f+CF9kLdFLcnM1DC1TXDPAbgB1KKa0gOANUyxEYFFa6zdM9x+JJHaOszJ5qjWyJXw7HE/txiXgnhcu4PkyRwkvI6Y8zimsY1tB0FpA2EO0HrRVTsxW3Fm18E9vZ2j7a37x4IxXeLuuDs0ew9vraUvaWCrWflhn1NKfIIjHQjnoaSSUZEhGDLec3nezt98og43BEPSWaozHxBq1VKjJRwdLd8XuVu3jf9zRxchxPZA90bn8Ab42NULFfw2edfvdRzoDPw9FM75Y5YALenC7z4OCdLOUurlZZHGDfvI5oyqoh6jGpgUoAdvfglAPBa3VXrtfqFF/u63w0Gg+KXZU+fX1pVxbmf+VreetSwc91ULRV4pAXKcxCK70L1uyvQ53KPsVIoKVwfBLD9/buJT57fm06dNBi8+rrNKnaeq6aEMvpOCdIDwOosuHDg5W4AANhPdzPI2zXU63VNeQ0Zjza//umkPWxVtnmO0o3i6pqqVsq8ulbqJdCkpmkcYEpcPQMA0FsSUaRSu3gsulVKhZ47394afhZTVz66s308FPNdImgHPbdhKbcxDSJI06cY155834MHFogIufxyYDabffjByIgFwA8AvckOhoNvRvDcJRMnPgTa+v9TG7a4sKD5/H5ZWClczs5kB8cnJrolUSbW18d/PH1aVTLAkgW4jSeQIsA583cLiAjDQ0PhsdHRhcFz584SEVpbWyMAggALwAgFoPn8AEwABgANAP/nAgBa1759nZzzjinLmjEMY4vneQKABCAAeADcTdPd5MWfasiPakYf8C4AAAAielRYdFNvZnR3YXJlAAB42isvL9fLzMsuTk4sSNXLL0oHADbYBlgQU8pcAAAAAElFTkSuQmCC',
  60. save: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFSSURBVHjapFPNaoNAEJ7UaIqlIgEveYkGvPSod5/Bq9DnKUWPfYGevBvwUtCD5wY8ek2kVuL6V2fDCmtKsGRgdoeZb76Z2Z9F3/dwiyxxcRwnEATBeHbe4EECeBwU9/vlGXRqAH4IwDc575/eC7Rtu/M8z6SQrusMXdfBfppX9bTdQhRFxthB0zTICFU7jwCxmDMSMEdJ5hGwgiNBXddUy3oeAcOj3DFGdOz3X3SMa4oYxHIjoIMQAh/vr1BV1dXqq9UKNE0bO+BGUFX13yNwHaBYlgWbzebPxCzLwPf9kYS7RnqIZUm7sG2bBl3X5Qgwluc5yLJ8eQaoh8MBjscjKIpCg2hPBTGiKPIdsHeACVhhvV7TINpTQQzGuXcwJJtxHAeSJNExWAdoT6UoisuXOPyF3bCZgwZhGFICnDNNUwrCq0UyRpgkCcuBxa3f+VeAAQBc2vzIX8mG5AAAAABJRU5ErkJggg==',
  61. player_bg: 'data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAyAAD/4QMpaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjAtYzA2MCA2MS4xMzQ3NzcsIDIwMTAvMDIvMTItMTc6MzI6MDAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2luZG93cyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGMkMzNDg5NUZGMjMxMUUwQTYzMkMwNTUwQzA1ODBBMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGMkMzNDg5NkZGMjMxMUUwQTYzMkMwNTUwQzA1ODBBMCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkYyQzM0ODkzRkYyMzExRTBBNjMyQzA1NTBDMDU4MEEwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkYyQzM0ODk0RkYyMzExRTBBNjMyQzA1NTBDMDU4MEEwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQACAYGBgYGCAYGCAwIBwgMDgoICAoO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',
  62. loading: 'data:image/gif;base64,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',
  63. };
  64. var styleText = '\
  65. .fv_PopupFlash_body_firefox object, \
  66. .fv_PopupFlash_body_firefox embed{ \
  67. display: none !important; \
  68. } \
  69. #fv_popup_player, \
  70. #fv_popup_player object, \
  71. #fv_popup_player embed, \
  72. object[fv_is_parent_object], \
  73. object[fv_is_parent_object] object, \
  74. object[fv_is_parent_object] embed{ \
  75. display: block !important; \
  76. } \
  77. #fv_popup_icon{ \
  78. width: ' + POPUP_ICON_SIZE + 'px; height: ' + POPUP_ICON_SIZE + 'px; \
  79. position: absolute; \
  80. background-image: url("' + picData.popup_icon + '"); \
  81. background-color: black; \
  82. background-size: 100% 100%; \
  83. z-index: 999999; \
  84. cursor: pointer; \
  85. } \
  86. #fv_popup_icon.reload{ \
  87. background-image: url("' + picData.popup_icon_reload + '"); \
  88. } \
  89. #fv_PopupFlash{ \
  90. background-color: rgba(0, 0, 0, ' + BACKGROUND_OPACITY + '); \
  91. position: fixed; \
  92. left: 0px; top: 0px; \
  93. width: 100%; \
  94. height: 100%; \
  95. z-index: 999998; \
  96. text-align: center; \
  97. } \
  98. #fv_PopupFlash.move{ \
  99. text-align: left; \
  100. } \
  101. #fv_popup_container{ \
  102. position: relative; \
  103. float: none; \
  104. z-index: 999999; \
  105. box-sizing: content-box; \
  106. -moz-box-sizing: content-box; \
  107. padding: 11px; \
  108. display: inline-block; \
  109. border-radius: 5px; \
  110. box-shadow: 0px 0px 30px black; \
  111. background-color: white; \
  112. background-image: url("' + picData.player_bg +'"); \
  113. background-repeat: no-repeat; \
  114. background-position:center; \
  115. line-height: 0px; \
  116. } \
  117. #fv_popup_player.noReload, \
  118. #fv_popup_player.noReload > embed{ \
  119. padding: 0px !important; \
  120. margin: 0px !important; \
  121. border: 0px !important; \
  122. z-index: 1000000 !important; \
  123. position: fixed !important; \
  124. display: block !important; \
  125. } \
  126. #fv_popup_player_parent.noReload{ \
  127. z-index: auto !important; \
  128. position: absolute !important; \
  129. overflow: visible !important; \
  130. opacity: 1 !important; \
  131. } \
  132. .fv_popup_player_forefather.noReload{ \
  133. z-index: auto !important; \
  134. opacity: 1 !important; \
  135. } \
  136. #fv_popup_option{ \
  137. width: 32px; \
  138. height: 32px; \
  139. background-image: url("' + picData.option + '"); \
  140. cursor: pointer; \
  141. position: absolute; \
  142. top: -16px; \
  143. left: -16px; \
  144. z-index: 1; \
  145. }\
  146. #fv_popup_option:hover{ \
  147. border-radius: 16px; \
  148. background-image: url("' + picData.close + '"); \
  149. } \
  150. #fv_popup_menu{ \
  151. width: auto; \
  152. height: auto; \
  153. display: none; \
  154. opacity: 0; \
  155. background-color: white; \
  156. position: absolute; \
  157. top: 3px; \
  158. left: 3px; \
  159. border: 2px dashed rgb(150, 150, 150); \
  160. box-shadow: inset 0px 0px 10px rgb(150, 150, 150); \
  161. text-align: left; \
  162. line-height: 18px; \
  163. font-size: 12px; \
  164. color: black; \
  165. padding: 5px 10px 5px 25px; \
  166. transition: opacity 0.7s ease; \
  167. -o-transition: opacity 0.7s ease; \
  168. } \
  169. #fv_popup_option:hover + #fv_popup_menu{ \
  170. display: inline; \
  171. opacity: 1; \
  172. } \
  173. #fv_popup_menu:hover{ \
  174. display: inline; \
  175. opacity: 1; \
  176. } \
  177. #fv_popup_menu .fv_menu_item_hide{ \
  178. display: none; \
  179. } \
  180. #fv_popup_menu ul{ \
  181. padding: 0px; \
  182. margin: 0px; \
  183. } \
  184. #fv_popup_menu li{ \
  185. list-style: disc outside; \
  186. } \
  187. #fv_popup_menu li:hover{ \
  188. background-color: rgb(234, 234, 234); \
  189. cursor: pointer; \
  190. } \
  191. #fv_popup_menu .fv_popup_pin{ \
  192. float: right; \
  193. width: 14px; \
  194. height: 14px; \
  195. margin-left: 5px; \
  196. margin-top: 1px; \
  197. background-image: url("' + picData.pin + '"); \
  198. background-color: transparent; \
  199. background-size: 100% 100%; \
  200. visibility: hidden; \
  201. } \
  202. #fv_popup_menu #fv_pin_press.fv_popup_pin{ \
  203. background-color: rgb(220, 220, 220); \
  204. visibility: visible; \
  205. } \
  206. #fv_popup_menu .fv_popup_save{ \
  207. float: right; \
  208. width: 14px; \
  209. height: 14px; \
  210. margin-left: 5px; \
  211. margin-top: 1px; \
  212. background-image: url("' + picData.save + '"); \
  213. background-size: 100% 100%; \
  214. visibility: hidden; \
  215. } \
  216. #fv_popup_menu .fv_menu_item_normal > span{ \
  217. color: #1F1F1F; \
  218. font-weight: normal; \
  219. } \
  220. #fv_popup_menu .fv_menu_item_selected > span{ \
  221. color: black; \
  222. font-weight: bold; \
  223. } \
  224. #fv_popup_menu li:hover > .fv_popup_pin{ \
  225. visibility: visible; \
  226. } \
  227. #fv_popup_menu li:hover > .fv_popup_save{ \
  228. visibility: visible; \
  229. } \
  230. #fv_popup_option.noReload{ \
  231. position: fixed; \
  232. z-index: 1000002; \
  233. } \
  234. #fv_popup_menu.noReload{ \
  235. position: fixed; \
  236. z-index: 1000001; \
  237. } \
  238. ';
  239. var resizeMouseDwn = {x: 0, y: 0};
  240. var resizeFlag = false;
  241. var resizeBegin = false;
  242. var resizeEdge = 'EDGE_NONE';
  243. var edgeLeft = 'EDGE_NONE';
  244. var edgeTop = 'EDGE_NONE';
  245. var flashPreSize = null;
  246. var flashFinalSize = {w: 0, h: 0};
  247. var mouseMoveCount = 0;
  248. var adjustPreX = 0;
  249. var adjustPreY = 0;
  250. var adjustX = 0;
  251. var adjustY = 0;
  252. var titleSaved = '';
  253. //for move
  254. var closeLock = false;
  255. var playerMoved = false;
  256. var playerMoving = false;
  257. //for iframe
  258. var loadingTimer = 0;
  259. var randomName = 'none';
  260. var randomName2 = 'none';
  261. var savedIframeName = null;
  262. var topSavedIframeName = null;
  263. var topSavedObj = null;
  264. var parentWndWidth = 0;
  265. var parentWndHeight = 0;
  266. //for no reload
  267. var orgStyle = new Object();
  268. var orgForefather = [];
  269. //for alt, ctrl & shift key
  270. var funcKeyPress = false;
  271. function _addStyle(str){
  272. var styleObj = _createElement('style');
  273. styleObj.textContent = str;
  274. $('head').appendChild(styleObj);
  275. }
  276. function _getObjTag(obj){
  277. return obj ? obj.nodeName.toLowerCase() : '';
  278. }
  279. function $(str){
  280. return document.querySelector(str);
  281. }
  282. function $$(str){
  283. return document.querySelectorAll(str);
  284. }
  285. function sendToAllFrames(data){
  286. var f = window.frames;
  287. for(var i = 0; i < f.length; i++){
  288. f[i].postMessage(data, '*');
  289. }
  290. }
  291. function _createNodeByString(str){
  292. var tempDiv = document.createElement('div');
  293. tempDiv.innerHTML = str;
  294. var node = tempDiv.firstChild.cloneNode(true);
  295. delete(tempDiv);
  296. return node;
  297. }
  298. function _getStorageItem(name){
  299. if(window.opera){
  300. if(typeof storage != 'undefined'){
  301. var data = storage.getItem(name);
  302. if(data != null){
  303. return JSON.parse(data);
  304. }
  305. }
  306. }
  307. else if(typeof GM_getValue != 'undefined'){
  308. var data = GM_getValue(name);
  309. if(data != null){
  310. return JSON.parse(data);
  311. }
  312. }
  313. return null;
  314. }
  315. function _setStorageItem(name, data){
  316. if(window.opera){
  317. if( (typeof storage) != 'undefined' ){
  318. storage.setItem(name, JSON.stringify(data));
  319. return true;
  320. }
  321. else{
  322. alert('请先给 opera:config#PersistentStorage|UserJSStorageQuota 设置一个值 (单位为 kB),然后再刷新试试。');
  323. return false;
  324. }
  325. }
  326. else if(typeof GM_setValue != 'undefined'){
  327. GM_setValue(name, JSON.stringify(data));
  328. return true;
  329. }
  330. else{
  331. alert('存储本地数据失败');
  332. return false;
  333. }
  334. }
  335. function _createElement(tag, id, classId){
  336. var obj = document.createElement(tag);
  337. id && (obj.id = id);
  338. classId && (obj.className = classId);
  339. return obj;
  340. }
  341.  
  342. function _getElementXY(ele){
  343. if(ele.getBoundingClientRect){
  344. return {
  345. x : ele.getBoundingClientRect().left + Math.max(document.documentElement.scrollLeft, document.body.scrollLeft),
  346. y : ele.getBoundingClientRect().top + Math.max(document.documentElement.scrollTop, document.body.scrollTop)
  347. }
  348. }
  349. else{
  350. var i = ele.offsetLeft, j = ele.offsetTop;
  351. var temp_node = ele;
  352. while(temp_node.offsetParent){
  353. temp_node = temp_node.offsetParent;
  354. i += temp_node.offsetLeft;
  355. j += temp_node.offsetTop;
  356. }
  357. temp_node = ele;
  358. while(temp_node.parentNode && temp_node.parentNode.tagName != 'BODY'){
  359. temp_node = temp_node.parentNode;
  360. i -= temp_node.scrollLeft;
  361. j -= temp_node.scrollTop;
  362. }
  363. return {
  364. x : i,
  365. y : j
  366. }
  367. }
  368. }
  369. function _getStyleSize(obj){
  370. var width = obj.style.width || window.getComputedStyle(obj, null).width;
  371. var height = obj.style.height || window.getComputedStyle(obj, null).height;
  372. return { w: parseInt(width), h: parseInt(height) };
  373. }
  374. function _getStyleXY(obj){
  375. var left = obj.style.left || window.getComputedStyle(obj, null).left;
  376. var top = obj.style.top || window.getComputedStyle(obj, null).top;
  377. return { x: parseInt(left), y: parseInt(top) };
  378. }
  379. function _saveAndSetObjAttri(obj, attr, newValue){
  380. if(obj.getAttribute(attr)){
  381. obj.setAttribute('_' + attr, obj.getAttribute(attr));
  382. }
  383. obj.setAttribute(attr, newValue);
  384. }
  385. function _restoreObjAttr(obj, attr){
  386. obj.removeAttribute(attr);
  387. if(obj.getAttribute('_' + attr)){
  388. obj.setAttribute(attr, obj.getAttribute('_' + attr));
  389. obj.removeAttribute('_' + attr);
  390. }
  391. }
  392. function _saveAndSetObjPositionSize(obj){
  393. var pos = _getElementXY(obj);
  394. var style_str = obj.getAttribute('style') || '';
  395. style_str.replace(/([^-]|^)(left|top|right|bottom|width|height)[^-:]*:[^;]+(;|$)/ig, '$1').replace(/( ){2,}/g, ' ');
  396. if(style_str != ''){
  397. style_str += ' ';
  398. }
  399. style_str += 'left: ' + pos.x + 'px !important; top: ' + pos.y + 'px !important; width: ' + obj.offsetWidth + 'px !important; height: ' + obj.offsetHeight + 'px !important;';
  400. _saveAndSetObjAttri(obj, 'style', style_str);
  401. }
  402. function _restoreObjPositionSize(obj){
  403. _restoreObjAttr(obj, 'style');
  404. }
  405. function _setTransition(obj, type){
  406. if(type == 'none'){
  407. obj.style.setProperty('transition-property', 'none', null);
  408. obj.style.setProperty('-o-transition-property', 'none', null);
  409. obj.style.setProperty('-moz-transition-property', 'none', null);
  410. }
  411. else{
  412. obj.style.setProperty('transition', type, null);
  413. obj.style.setProperty('-o-transition', type, null);
  414. obj.style.setProperty('-moz-transition', type, null);
  415. }
  416. }
  417. function _getDefaultWidth(){
  418. return Math.max(window.innerWidth * POPUP_FLASH_SIZE / 100, POPUP_FLASH_MIN_WIDTH);
  419. }
  420. function _getDefaultHeight(){
  421. return Math.max(window.innerHeight * POPUP_FLASH_SIZE / 100, POPUP_FLASH_MIN_HEIGHT);
  422. }
  423. function _getMaxWidth(){
  424. return window.innerWidth - 50;
  425. }
  426. function _getMaxHeight(){
  427. return window.innerHeight - 30;
  428. }
  429. function _saveTitle(){
  430. titleSaved = document.title;
  431. }
  432. function _restoreTitle(){
  433. document.title = titleSaved;
  434. }
  435. function _setTitle(str){
  436. document.title = str;
  437. }
  438. function check_bound(x, y, ox, oy, ow, oh){
  439. return (x >= ox) && (x <= (ox + ow)) && (y >= oy) && (y <= (oy + oh));
  440. }
  441. function check_obj_edge(obj, x, y){
  442. var objPos = _getElementXY(obj);
  443. var objSize = {w: obj.offsetWidth, h: obj.offsetHeight};
  444. if(check_bound(x, y, objPos.x, objPos.y, objSize.w, objSize.h) == false /* div 外侧 */
  445. || check_bound(x, y, objPos.x + 8, objPos.y + 8, objSize.w - 16, objSize.h - 16) == true /* flash 内 */){
  446. return 'EDGE_NONE';
  447. }
  448. if( (Math.abs(x - objPos.x) <= 8 || Math.abs(objPos.x + objSize.w - x) <= 8)
  449. && (Math.abs(y - objPos.y) >= 25 && Math.abs(objPos.y + objSize.h - y) >= 25) ){
  450. return 'EDGE_LEFT_RIGHT';
  451. }
  452. else if( (Math.abs(y - objPos.y) <= 8 || Math.abs(objPos.y + objSize.h - y) <= 8)
  453. && (Math.abs(x - objPos.x) >= 25 && Math.abs(objPos.x + objSize.w - x) >= 25) ){
  454. return 'EDGE_TOP_BOTTOM';
  455. }
  456. else{
  457. return 'EDGE_CORNER';
  458. }
  459. }
  460. function set_parent_no_reload(obj){
  461. var temp = obj;
  462. var parentFind = false;
  463. while((temp = temp.parentNode) && _getObjTag(temp) != 'body'){
  464. var zIndex = temp.style.zIndex || window.getComputedStyle(temp, null).zIndex;
  465. if(_getObjTag(temp) == 'object'){
  466. _saveAndSetObjAttri(temp, 'fv_is_parent_object', 'true');
  467. }
  468. if(zIndex != 'auto' && parentFind == false){
  469. //放在设置 id 与 class 前
  470. _saveAndSetObjPositionSize(temp);
  471. _saveAndSetObjAttri(temp, 'id', 'fv_popup_player_parent');
  472. _saveAndSetObjAttri(temp, 'class', 'noReload');
  473. parentFind = true;
  474. }
  475. else if(zIndex != 'auto'){
  476. orgForefather.push(temp);
  477. _saveAndSetObjAttri(temp, 'class', 'fv_popup_player_forefather noReload');
  478. }
  479. }
  480. }
  481. function recover_parent_no_reload(){
  482. var po = $$('[fv_is_parent_object]');
  483. for(var i = 0; i < po.length; i ++){
  484. _restoreObjAttr(po[i], 'fv_is_parent_object');
  485. }
  486. var orgTargetObj = document.getElementById('fv_popup_player_parent');
  487. if(orgTargetObj != null){
  488. _restoreObjAttr(orgTargetObj, 'id');
  489. _restoreObjAttr(orgTargetObj, 'class');
  490. _restoreObjPositionSize(orgTargetObj);
  491. orgTargetObj = null;
  492. }
  493. while(orgForefather.length != 0){
  494. var obj = orgForefather.pop();
  495. _restoreObjAttr(obj, 'class');
  496. }
  497. }
  498. function create_black_background(obj){
  499. if(!$('#fv_PopupFlash')){
  500. if(!window.opera){
  501. document.body.className += ' fv_PopupFlash_body_firefox';
  502. }
  503. if(obj){
  504. var embed = obj.getElementsByTagName('embed');
  505. obj.style.visibility = 'hidden';
  506. if(embed[0]){
  507. embed[0].style.visibility = 'hidden';
  508. }
  509. save_and_hide_original_player_no_reload(obj);
  510. set_parent_no_reload(obj);
  511. }
  512. var div = _createElement('div', 'fv_PopupFlash');
  513. div.innerHTML = '.';
  514. document.body.appendChild(div);
  515. if(CLICK_BLANK_TO_CLOSE == 'CLICK' || CLICK_BLANK_TO_CLOSE == 'DOUBLE_CLICK'){
  516. var evtType = (CLICK_BLANK_TO_CLOSE == 'CLICK') ? 'click' : 'dblclick';
  517. div.addEventListener(evtType, function(e){
  518. if(e.target == this){
  519. var close = $('#fv_popup_option');
  520. closeLock = false;
  521. if(close) close.click();
  522. }
  523. }, false);
  524. }
  525. }
  526. }
  527. function del_black_background(obj){
  528. clearInterval(loadingTimer);
  529. if(!window.opera){
  530. document.body.className = document.body.className.replace(' fv_PopupFlash_body_firefox', '');
  531. }
  532. var bk = $('#fv_PopupFlash');
  533. if(bk){
  534. document.body.removeChild(bk);
  535. }
  536. recover_parent_no_reload();
  537. if(obj){
  538. recover_original_player_no_reload(obj);
  539. }
  540. }
  541. function _setObjSize(obj, w, h){
  542. var container = document.getElementById('fv_popup_container');
  543. if(w){
  544. if(!resizeFlag){
  545. obj.setAttribute('width', w);
  546. obj.style.setProperty('width', w + 'px', 'important');
  547. }
  548. if(container){//if(container && container.className == 'noReload'){
  549. container.style.width = w + 'px';
  550. }
  551. }
  552. if(h){
  553. if(!resizeFlag){
  554. obj.setAttribute('height', h);
  555. obj.style.setProperty('height', h + 'px', 'important');
  556. }
  557. if(container){//if(container && container.className == 'noReload'){
  558. container.style.height = h + 'px';
  559. }
  560. }
  561. }
  562. function resize_popup_flash(obj, w, h){
  563. var embed = obj.getElementsByTagName('embed');
  564. var div = document.getElementById('fv_popup_container');
  565.  
  566. if(w){
  567. w = (w >= _getMaxWidth()) ? _getMaxWidth() : w;
  568. w = (w < POPUP_FLASH_MIN_WIDTH) ? POPUP_FLASH_MIN_WIDTH : w;
  569. _setObjSize(obj, Math.round(w), 0);
  570. if(embed[0]){
  571. _setObjSize(embed[0], Math.round(w), 0);
  572. }
  573. }
  574. if(h){
  575. h = (h >= _getMaxHeight()) ? _getMaxHeight() : h;
  576. h = (h < POPUP_FLASH_MIN_HEIGHT) ? POPUP_FLASH_MIN_HEIGHT : h;
  577. _setObjSize(obj, 0, Math.round(h));
  578. if(embed[0]){
  579. _setObjSize(embed[0], 0, Math.round(h));
  580. }
  581. if(div && playerMoved == false){
  582. var height = (div.className == 'noReload') ? div.offsetHeight : _getStyleSize(div).h;
  583. div.style.top = (window.innerHeight - height) / 2 + 'px';
  584. }
  585. }
  586. }
  587. function resize_popup_flash_by_drag(obj, w, h, edgeLeft, edgeTop){
  588. var div = document.getElementById('fv_popup_container');
  589. var divSize = _getStyleSize(div), divPos = _getStyleXY(div);
  590. var divSizeAfter = null;
  591. resize_popup_flash(obj, w, h);
  592. flashFinalSize.w = w;
  593. flashFinalSize.h = h;
  594. divSizeAfter = _getStyleSize(div);
  595. if(SHOW_RESIZE_INFO == 'title' || SHOW_RESIZE_INFO == 'both'){
  596. _setTitle('[ ' + divSizeAfter.w + ' x ' + divSizeAfter.h + ' ]');
  597. }
  598. if(SHOW_RESIZE_INFO == 'statusbar' || SHOW_RESIZE_INFO == 'both'){
  599. window.status = '[ ' + divSizeAfter.w + ' x ' + divSizeAfter.h + ' ]';
  600. }
  601. if(!playerMoved){
  602. return;
  603. }
  604. if(edgeLeft == 'EDGE_LEFT'){
  605. div.style.left = divPos.x - (divSizeAfter.w - divSize.w) + 'px';
  606. }
  607. if(edgeTop == 'EDGE_TOP'){
  608. div.style.top = divPos.y - (divSizeAfter.h - divSize.h) + 'px';
  609. }
  610. }
  611. function fill_popup_option_menu(){
  612. var i = 0;
  613. var htmlText = '<ul>';
  614. var customSize = null;
  615. var selected = _getStorageItem('fv_saved_idx') ? _getStorageItem('fv_saved_idx') : 0;
  616. for(i = 0; i < POPUP_FLASH_SIZE_LIST.length; i++){
  617. htmlText += '<li class="fv_menu_item_normal';
  618. if(POPUP_FLASH_SIZE_LIST[i].width >= _getMaxWidth()
  619. || POPUP_FLASH_SIZE_LIST[i].height >= _getMaxHeight()){
  620. htmlText += ' fv_menu_item_hide';
  621. }
  622. htmlText += '"><span id="fv_pin_normal" class="fv_popup_pin"></span><span>' + POPUP_FLASH_SIZE_LIST[i].name + '</span></li>';
  623. }
  624. htmlText += '<li id="fv_menu_item_custom" class="fv_menu_item_normal">';
  625. if(customSize = _getStorageItem('fv_custom_size')){
  626. htmlText += '<span id="fv_pin_press" class="fv_popup_pin"></span><span class="fv_popup_save"></span><span class="fv_popup_custom_text">[' + customSize.width + ' x ' + customSize.height + ']</span></li>';
  627. }
  628. else{
  629. htmlText += '<span id="fv_pin_press" class="fv_popup_pin"></span><span class="fv_popup_save"></span><span class="fv_popup_custom_text">自定义 N/A</span></li>';
  630. }
  631. htmlText += '<li class="fv_menu_item_normal">居中显示</li>';
  632. htmlText += '</ul>';
  633. $('#fv_popup_menu').innerHTML = htmlText;
  634. if(selected == 255){
  635. $('#fv_menu_item_custom').className = 'fv_menu_item_selected';
  636. }
  637. else{
  638. if(selected == 0 || POPUP_FLASH_SIZE_LIST[selected].width > _getMaxWidth() || POPUP_FLASH_SIZE_LIST[selected].height > _getMaxHeight()){
  639. $('#fv_popup_menu li:nth-child(1)').className = 'fv_menu_item_selected';
  640. }
  641. else{
  642. $('#fv_popup_menu li:nth-child(' + (selected + 1) + ')').className = 'fv_menu_item_selected';
  643. }
  644. }
  645. }
  646. function set_default_popup_option_menu_item(){
  647. var savedIndex = _getStorageItem('fv_saved_idx');
  648. do{
  649. $('#fv_pin_press').id = 'fv_pin_normal';
  650. if(savedIndex){
  651. switch(savedIndex)
  652. {
  653. case 255: /* custom */
  654. $('#fv_menu_item_custom .fv_popup_pin').id = 'fv_pin_press';
  655. return;
  656. default:
  657. if(POPUP_FLASH_SIZE_LIST[savedIndex].width > _getMaxWidth()
  658. || POPUP_FLASH_SIZE_LIST[savedIndex].height > _getMaxHeight()){
  659. break;
  660. }
  661. $('#fv_popup_menu li:nth-child(' + (savedIndex + 1) + ') .fv_popup_pin').id = 'fv_pin_press';
  662. return;
  663. }
  664. }
  665. }while(0);
  666. $('#fv_popup_menu li:nth-child(1) .fv_popup_pin').id = 'fv_pin_press';
  667. }
  668. function find_item_index(item){
  669. var temp = item.parentNode.firstChild;
  670. var i = 0;
  671. while( temp != item && (temp = temp.nextSibling) ){
  672. i++;
  673. }
  674. return i;
  675. }
  676. //fix for firefox redraw error while the embed object resized under the hidden status
  677. var fix_firefox_redraw_timer = null;
  678. function fix_firefox_redraw_error(obj){
  679. if(!window.opera && fix_firefox_redraw_timer == null){
  680. var ow = obj.width, oh = obj.height;
  681. resize_popup_flash(obj, ow - 1, oh - 1);
  682. fix_firefox_redraw_timer = setTimeout(function(){
  683. resize_popup_flash(obj, ow, oh);
  684. fix_firefox_redraw_timer = null;
  685. }, 10);
  686. }
  687. }
  688. function popup_option_click_hdlr(e){
  689. var item = e.target.parentNode;
  690. var i = find_item_index(item);
  691. var width = 0; height = 0;
  692. var flash = $('#fv_popup_player');
  693. var option = $('#fv_popup_option');
  694. var menu = $('#fv_popup_menu');
  695. var container = $('#fv_popup_container');
  696. if(flash.getElementsByTagName('embed').length != 0){
  697. flash = flash.getElementsByTagName('embed')[0];
  698. }
  699. if( i < (POPUP_FLASH_SIZE_LIST.length) ){ /* 预设值 */
  700. if( (width = POPUP_FLASH_SIZE_LIST[i].width) == 0 ){
  701. width = _getDefaultWidth();
  702. }
  703. if( (height = POPUP_FLASH_SIZE_LIST[i].height) == 0 ){
  704. height = _getDefaultHeight();
  705. }
  706. }
  707. else{ /* 自定义值 */
  708. var data = _getStorageItem('fv_custom_size');
  709. if(data){
  710. width = data.width;
  711. height = data.height;
  712. }
  713. }
  714. $('.fv_menu_item_selected').className = 'fv_menu_item_normal';
  715. $('#fv_popup_menu li:nth-child(' + (i+1) + ')').className = 'fv_menu_item_selected';
  716. _setTransition(container, 'width 0.5s ease');
  717. flash.style.visibility = 'hidden';
  718. option.style.visibility = 'hidden';
  719. menu.style.visibility = 'hidden';
  720. resize_popup_flash($('#fv_popup_player'), width, height);
  721.  
  722. setTimeout(function(){
  723. set_flash_pos_no_reload();
  724. set_option_and_menu_pos_no_reload();
  725. flash.style.visibility = 'visible';
  726. fix_firefox_redraw_error(flash);
  727. option.style.visibility = 'visible';
  728. menu.style.visibility = 'visible';
  729. _setTransition(container, 'none');
  730. }, 500);
  731. }
  732. function popup_option_pin_click_hdlr(e){
  733. var li = e.target.parentNode;
  734. var i = find_item_index(li);
  735. var savedIndex = -1;
  736. if( i < (POPUP_FLASH_SIZE_LIST.length) ){ /* 预设值 */
  737. savedIndex = i;
  738. }
  739. else{
  740. if(_getStorageItem('fv_custom_size')){
  741. savedIndex = 255;
  742. }
  743. }
  744. if(savedIndex != -1 && _setStorageItem('fv_saved_idx', savedIndex) != false){
  745. set_default_popup_option_menu_item();
  746. }
  747. e.stopPropagation();
  748. }
  749. function popup_option_save_click_hdlr(e){
  750. var flash = $('#fv_popup_player');
  751. var customSize = {width: Math.round(flash.offsetWidth), height: Math.round(flash.offsetHeight)};
  752. if(_setStorageItem('fv_custom_size', customSize) != false){
  753. $('#fv_menu_item_custom .fv_popup_custom_text').textContent = '[' + customSize.width + ' x ' + customSize.height + ']';
  754. }
  755. e.stopPropagation();
  756. }
  757. function register_popup_option_menu(){
  758. var i = 0;
  759. var menu = $('#fv_popup_menu');
  760. if( (typeof menu) != 'undefined' ){
  761. var menu_item = menu.getElementsByTagName('li');
  762. for(i = 0; i < menu_item.length - 1; i++){
  763. var span = menu_item[i].getElementsByTagName('span');
  764. var pin = span[0], save = (span.length > 2) ? span[1] : null;
  765. menu_item[i].addEventListener('click', popup_option_click_hdlr, false);
  766. pin.addEventListener('click', popup_option_pin_click_hdlr, false);
  767. if(save){
  768. save.addEventListener('click', popup_option_save_click_hdlr, false);
  769. }
  770. }
  771. // “居中显示”菜单
  772. menu_item[i].addEventListener('click', move_popup_player_to_center, false);
  773. }
  774. }
  775. function init_popup_player_size(obj){
  776. var savedIndex = _getStorageItem('fv_saved_idx');
  777. var customSize = _getStorageItem('fv_custom_size');
  778. do{
  779. if(savedIndex){
  780. if(savedIndex == 255){ // custom
  781. resize_popup_flash(obj, customSize.width, customSize.height);
  782. return;
  783. }
  784. else if(savedIndex > 0){
  785. if(POPUP_FLASH_SIZE_LIST[savedIndex].width > _getMaxWidth()
  786. || POPUP_FLASH_SIZE_LIST[savedIndex].height > _getMaxHeight())
  787. {
  788. break;
  789. }
  790. resize_popup_flash(obj, POPUP_FLASH_SIZE_LIST[savedIndex].width, POPUP_FLASH_SIZE_LIST[savedIndex].height);
  791. return;
  792. }
  793. }
  794. }while(0);
  795. resize_popup_flash(obj, _getDefaultWidth(), _getDefaultHeight());
  796. }
  797. function save_original_style(obj, names){
  798. var i = 0;
  799. for(; i < names.length; i++){
  800. var name = names[i];
  801. if(!orgStyle[name]) orgStyle[name] = [];
  802. orgStyle[name].push(obj.style[name] || window.getComputedStyle(obj, null)[name]);
  803. }
  804. }
  805. function restore_original_style(obj, names){
  806. var i = 0;
  807. for(; i < names.length; i++){
  808. var name = names[i];
  809. obj.style.removeProperty(name);
  810. if(!orgStyle[name]) continue;
  811. obj.style[name] = orgStyle[name].shift();
  812. }
  813. }
  814.  
  815. function save_size_no_reload_no_reload(obj){
  816. save_original_style(obj, ['width', 'height', 'top', 'left']);
  817. var embed = obj.getElementsByTagName('embed');
  818. if(embed.length >= 1){
  819. embed = embed[0];
  820. save_size_no_reload_no_reload(embed);
  821. }
  822. }
  823. function restore_size_no_reload_no_reload(obj){
  824. restore_original_style(obj, ['width', 'height', 'top', 'left']);
  825. var embed = obj.getElementsByTagName('embed');
  826. if(embed.length >= 1){
  827. embed = embed[0];
  828. restore_size_no_reload_no_reload(embed);
  829. }
  830. }
  831. function save_and_hide_original_player_no_reload(obj){
  832. save_size_no_reload_no_reload(obj);
  833. _saveAndSetObjAttri(obj, 'id', 'fv_popup_player');
  834. _saveAndSetObjAttri(obj, 'class', 'noReload');
  835. }
  836. function recover_original_player_no_reload(obj){
  837. if(fix_firefox_redraw_timer != null){
  838. clearTimeout(fix_firefox_redraw_timer);
  839. fix_firefox_redraw_timer = null;
  840. }
  841. _restoreObjAttr(obj, 'id');
  842. _restoreObjAttr(obj, 'class');
  843. restore_size_no_reload_no_reload(obj);
  844. }
  845. function create_popup_option_no_reload(){
  846. var option = _createElement('span', 'fv_popup_option', 'noReload');
  847. var menu = _createElement('span', 'fv_popup_menu', 'noReload');
  848. option.setAttribute('title', '拖拽可移动');
  849. document.body.appendChild(option);
  850. document.body.appendChild(menu);
  851. }
  852. function get_popup_player_div_pos_no_reload(){
  853. var div = $('#fv_popup_container');
  854. var divPos = _getElementXY(div);
  855. divPos.x -= Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
  856. divPos.y -= Math.max(document.documentElement.scrollTop, document.body.scrollTop);
  857. return {x: divPos.x, y: divPos.y};
  858. }
  859. function set_option_and_menu_pos_no_reload(){
  860. var option = $('#fv_popup_option');
  861. var menu = $('#fv_popup_menu');
  862. if(option && option.className == 'noReload' && menu && menu.className == 'noReload'){
  863. var divPos = get_popup_player_div_pos_no_reload();
  864. option.style.left = divPos.x - 16 + 'px';
  865. option.style.top = divPos.y - 16 + 'px';
  866. menu.style.left = divPos.x + 3 + 'px';
  867. menu.style.top = divPos.y + 3 + 'px';
  868. }
  869. }
  870. function set_flash_pos_no_reload(){
  871. var flash = $('#fv_popup_player');
  872. if(flash && flash.className == 'noReload'){
  873. var divPos = get_popup_player_div_pos_no_reload();;
  874. flash.style.top = divPos.y + 11 + 'px';
  875. flash.style.left = divPos.x + 11 + 'px';
  876. }
  877. }
  878. function create_popup_player_no_reload(obj){
  879. if(!$('#fv_popup_container')){
  880. var embed = obj.getElementsByTagName('embed');
  881. var div = _createElement('div', 'fv_popup_container', 'noReload');
  882. var divPos = null;
  883. init_popup_player_size(obj);
  884.  
  885. div.style.width = parseInt(obj.width) + 'px';
  886. div.style.top = (window.innerHeight - parseInt(obj.height) - 11 * 2) / 2 + 'px';
  887. div.style.height = parseInt(obj.height) + 'px';
  888. div.style.visibility = 'hidden';
  889. $('#fv_PopupFlash').appendChild(div);
  890. set_flash_pos_no_reload();
  891.  
  892. create_popup_option_no_reload();
  893. $('#fv_popup_option').style.visibility = 'hidden';
  894. set_option_and_menu_pos_no_reload();
  895. fill_popup_option_menu();
  896. set_default_popup_option_menu_item();
  897. register_popup_option_menu();
  898. div.style.visibility = 'visible';
  899. obj.style.visibility = 'visible';
  900. if(embed[0]){
  901. embed[0].style.visibility = 'visible';
  902. }
  903. $('#fv_popup_option').style.visibility = 'visible';
  904. $('#fv_popup_option').addEventListener('click', function(){
  905. if(!closeLock){
  906. $('#fv_popup_container').removeEventListener('mousemove', fv_popup_container_mousemove_hdlr, false);
  907. $('#fv_popup_container').removeEventListener('mousedown', fv_popup_container_mousedown_hdlr, false);
  908. window.removeEventListener('mouseup', mouse_up_hdlr, false);
  909. window.removeEventListener('mousemove', move_popup_player, false);
  910. this.parentNode.removeChild(this.nextSibling);
  911. this.parentNode.removeChild(this);
  912. del_black_background(obj);
  913. playerMoving = false;
  914. playerMoved = false;
  915. }
  916. }, false);
  917. $('#fv_popup_option').addEventListener('mousedown', function(e){
  918. closeLock = false;
  919. mouseMoveCount = 0;
  920. window/*this*/.addEventListener('mousemove', move_popup_player, false);
  921. }, false);
  922. fix_firefox_redraw_error(obj);
  923. }
  924. }
  925. function change_popup_player_edge_cursor(div, e){
  926. var ret = 'IS_CHANGED';
  927. if(e.type != 'mousemove' || !div || resizeFlag == true){
  928. return 'NO_CHANGE';
  929. }
  930. var x = e.pageX, y = e.pageY;
  931. var edge_status = check_obj_edge(div, x, y);
  932. var pos = _getElementXY(div);
  933. var size = {w: div.offsetWidth, h: div.offsetHeight};
  934. var o = {x: (pos.x + size.w / 2), y: (pos.y + size.h / 2)};
  935. switch(edge_status){
  936. case 'EDGE_LEFT_RIGHT':
  937. x > o.x ? div.style.cursor = 'e-resize' : div.style.cursor = 'w-resize';
  938. break;
  939. case 'EDGE_TOP_BOTTOM':
  940. y > o.y ? div.style.cursor = 's-resize' : div.style.cursor = 'n-resize';
  941. break;
  942. case 'EDGE_CORNER':
  943. if(x > o.x && y > o.y){
  944. div.style.cursor = 'se-resize';
  945. }
  946. else if(x < o.x && y < o.y){
  947. div.style.cursor = 'default';
  948. }
  949. else if(x < o.x && y > o.y){
  950. div.style.cursor = 'sw-resize';
  951. }
  952. else{
  953. div.style.cursor = 'ne-resize';
  954. }
  955. break;
  956. default:
  957. div.style.cursor = 'default';
  958. ret = 'NO_CHANGE';
  959. break;
  960. }
  961. return ret;
  962. }
  963. function move_popup_player(e){
  964. var div = document.getElementById('fv_popup_container');
  965. var flash = $('#fv_popup_player');
  966. /* 清除拖动时会框选文字的副作用 */
  967. if(window.getSelection() !== ''){
  968. window.getSelection().removeAllRanges();
  969. }
  970. /* 过滤一部分鼠标事件以提高速度 */
  971. if(mouseMoveCount < PLAYER_MOUSE_MOVE_FILTER){
  972. mouseMoveCount++;
  973. return;
  974. }
  975. mouseMoveCount = 0;
  976. playerMoving = true;
  977. playerMoved = true;
  978. closeLock = true;
  979. if(flash.getElementsByTagName('embed').length != 0){
  980. flash = flash.getElementsByTagName('embed')[0];
  981. }
  982. flash.style.visibility = 'hidden';
  983. $('#fv_PopupFlash').setAttribute('class', 'move');
  984. div.style.left = e.clientX + 'px';
  985. div.style.top = e.clientY + 'px';
  986. set_option_and_menu_pos_no_reload();
  987. //set_flash_pos_no_reload(); // 不需移动 flash,mouseup 时再设置位置
  988. }
  989. function move_popup_player_to_center(e){
  990. if(playerMoved == true){
  991. var div = document.getElementById('fv_popup_container');
  992. playerMoved = false;
  993. div.style.left = '0px';
  994. div.style.top = (window.innerHeight - div.offsetHeight) / 2 + 'px';
  995. $('#fv_PopupFlash').removeAttribute('class');
  996. set_option_and_menu_pos_no_reload();
  997. set_flash_pos_no_reload();
  998. }
  999. }
  1000. function resize_popup_player(e){
  1001. if(resizeEdge == 'EDGE_NONE' || resizeFlag == false){
  1002. return;
  1003. }
  1004. var x = e.pageX, y = e.pageY;
  1005. var multi = playerMoved ? 1 : 2;
  1006. var adjustMode = e.shiftKey ? true : false;
  1007. /* 清除拖动时会框选文字的副作用 */
  1008. if(window.getSelection() !== ''){
  1009. window.getSelection().removeAllRanges();
  1010. }
  1011. /* 过滤一部分鼠标事件以提高速度 */
  1012. if(mouseMoveCount < PLAYER_MOUSE_MOVE_FILTER){
  1013. mouseMoveCount++;
  1014. return;
  1015. }
  1016. mouseMoveCount = 0;
  1017. var div = $('#fv_popup_container'), flash = $('#fv_popup_player');
  1018. var divPos = _getElementXY($('#fv_popup_container'));
  1019. var divSize = {w: div.offsetWidth, h: div.offsetHeight};
  1020. var dot = {x: (divPos.x + divSize.w / 2), y: (divPos.y + divSize.h / 2)};
  1021. var diff = {offsetW: Math.abs(resizeMouseDwn.x - dot.x), offsetH: Math.abs(resizeMouseDwn.y - dot.y)};
  1022. if(resizeBegin == true){
  1023. resizeBegin = false;
  1024. edgeLeft = (x < dot.x) ? 'EDGE_LEFT' : 'EDGE_RIGHT';
  1025. edgeTop = (y < dot.y) ? 'EDGE_TOP' : 'EDGE_BOTTOM';
  1026. }
  1027. if(adjustMode){
  1028. (edgeLeft == 'EDGE_LEFT') ? (x < adjustPreX ? ++adjustX : --adjustX) : adjustX;
  1029. (edgeLeft == 'EDGE_RIGHT') ? (x > adjustPreX ? ++adjustX : --adjustX) : adjustX;
  1030. (edgeTop == 'EDGE_TOP') ? (y < adjustPreY ? ++adjustY : --adjustY) : adjustY;
  1031. (edgeTop == 'EDGE_BOTTOM') ? (y > adjustPreY ? ++adjustY : --adjustY) : adjustY;
  1032. }
  1033. switch(resizeEdge){
  1034. case 'EDGE_LEFT_RIGHT':
  1035. resize_popup_flash_by_drag(flash, flashPreSize.w + (adjustMode ? adjustX : (Math.abs(x - dot.x) - diff.offsetW) * multi), 0, edgeLeft, 'EDGE_NONE');
  1036. break;
  1037. case 'EDGE_TOP_BOTTOM':
  1038. resize_popup_flash_by_drag(flash, 0, flashPreSize.h + (adjustMode ? adjustY : (Math.abs(y - dot.y) - diff.offsetH) * multi), 'EDGE_NONE', edgeTop);
  1039. break;
  1040. case 'EDGE_CORNER':
  1041. if(edgeLeft == 'EDGE_LEFT' && edgeTop == 'EDGE_TOP'){
  1042. break;
  1043. }
  1044. resize_popup_flash_by_drag(flash, flashPreSize.w + (adjustMode ? adjustX : (Math.abs(x - dot.x) - diff.offsetW) * multi), flashPreSize.h + (adjustMode ? adjustY : (Math.abs(y - dot.y) - diff.offsetH) * multi), edgeLeft, edgeTop);
  1045. break;
  1046. default:
  1047. break;
  1048. }
  1049. adjustPreX = x;
  1050. adjustPreY = y;
  1051. }
  1052. function fv_popup_container_mousemove_hdlr(e){
  1053. if(change_popup_player_edge_cursor(this, e) != 'NO_CHANGE'){
  1054. window.status = '拖拽边缘调整大小,按 Shift 拖拽可微调';
  1055. }
  1056. else{
  1057. window.status = '';
  1058. }
  1059. }
  1060. function fv_popup_container_mousedown_hdlr(e){
  1061. var x = e.pageX, y = e.pageY;
  1062. if( (resizeEdge = check_obj_edge(this, x, y)) != 'EDGE_NONE' ){
  1063. var flash = $('#fv_popup_player');
  1064. var embed = flash.getElementsByTagName('embed');
  1065. var option = $('#fv_popup_option');
  1066. resizeMouseDwn.x = x; resizeMouseDwn.y = y;
  1067. flashFinalSize.w = 0; flashFinalSize.h = 0;
  1068. flashPreSize = _getStyleSize(flash);
  1069. resizeFlag = true;
  1070. mouseMoveCount = 0;
  1071. embed = (embed.length != 0) ? embed[0] : null;
  1072. if(flash.style.visibility != 'hidden'){
  1073. flash.style.visibility = 'hidden';
  1074. }
  1075. if(embed && embed.style.visibility != 'hidden'){
  1076. embed.style.visibility = 'hidden';
  1077. }
  1078. if(option.style.visibility != 'hidden'){
  1079. option.style.visibility = 'hidden';
  1080. }
  1081. adjustX = adjustY = 0;
  1082. adjustPreX = e.pageX;
  1083. adjustPreY = e.pageY;
  1084. resizeBegin = true;
  1085. edgeLeft = edgeTop = 'EDGE_NONE';
  1086. window.addEventListener('mousemove', resize_popup_player, false);
  1087. }
  1088. }
  1089. function mouse_up_hdlr(e){
  1090. if(playerMoving == false && (resizeEdge == 'EDGE_NONE' || resizeFlag == false)){
  1091. return;
  1092. }
  1093. var flash = $('#fv_popup_player');
  1094. var embed = flash.getElementsByTagName('embed');
  1095. var option = $('#fv_popup_option');
  1096. _restoreTitle();
  1097. resizeEdge = 'EDGE_NONE';
  1098. if(resizeFlag == true){
  1099. resizeFlag = false;
  1100. resize_popup_flash(flash, flashFinalSize.w, flashFinalSize.h);
  1101. }
  1102. mouseMoveCount = 0;
  1103. embed = (embed.length != 0) ? embed[0] : null;
  1104. if(flash && flash.style.visibility == 'hidden'
  1105. || (embed && embed.style.visibility == 'hidden')){
  1106. set_flash_pos_no_reload();
  1107. flash.style.visibility = 'visible';
  1108. if(embed && embed.style.visibility == 'hidden'){
  1109. embed.style.visibility = 'visible';
  1110. }
  1111. }
  1112. if(option && option.style.visibility == 'hidden'){
  1113. set_option_and_menu_pos_no_reload();
  1114. option.style.visibility = 'visible';
  1115. }
  1116. fix_firefox_redraw_error(flash);
  1117. resizeBegin = false;
  1118. edgeLeft = edgeTop = 'EDGE_NONE';
  1119. window.removeEventListener('mousemove', resize_popup_player, false);
  1120. mouseMoveCount = 0;
  1121. window/*this*/.removeEventListener('mousemove', move_popup_player, false);
  1122. }
  1123. function register_popup_player_drag_hdlr(){
  1124. $('#fv_popup_container').addEventListener('mousemove', fv_popup_container_mousemove_hdlr, false);
  1125. $('#fv_popup_container').addEventListener('mousedown', fv_popup_container_mousedown_hdlr, false);
  1126. window.addEventListener('mouseup', mouse_up_hdlr, false);
  1127. }
  1128. var fv_hide_obj = null;
  1129. function hide_original_player(obj){
  1130. fv_hide_obj = obj.cloneNode(true);
  1131. var x = _createElement('fv_hide_obj', 'fv_hide_obj');
  1132. obj.parentNode.replaceChild(x, obj);
  1133. }
  1134. function recover_original_player(){
  1135. var x = $('fv_hide_obj');
  1136. if(x && fv_hide_obj){
  1137. x.parentNode.replaceChild(fv_hide_obj, x);
  1138. fv_hide_obj = null;
  1139. }
  1140. }
  1141. function create_popup_player(htmlText){
  1142. if(!$('#fv_popup_container')){
  1143. var bg = $('#fv_PopupFlash');
  1144. bg.style.backgroundImage = 'url("' + picData.loading +'")';
  1145. bg.style.backgroundRepeat = 'no-repeat';
  1146. bg.style.backgroundPosition = '50% 50%';
  1147. var div = _createElement('div', 'fv_popup_container');
  1148. var cloneObj = _createNodeByString(htmlText);
  1149. cloneObj.id = 'fv_popup_player';
  1150. //resize_popup_flash(cloneObj, _getDefaultWidth(), _getDefaultHeight());
  1151. init_popup_player_size(cloneObj);
  1152. cloneObj.setAttribute('align', 'middle');
  1153. div.innerHTML = '\
  1154. <span id="fv_popup_option" title="拖拽可移动"></span> \
  1155. <span id="fv_popup_menu"></span> \
  1156. ' + cloneObj.outerHTML + ' \
  1157. ';
  1158. bg.appendChild(div);
  1159. div.style.top = (window.innerHeight - parseInt(cloneObj.height)) / 2 + 'px';
  1160. div.style.visibility = 'hidden';
  1161. div.style.width = _getStyleSize(cloneObj).w + 'px'; div.style.height = _getStyleSize(cloneObj).h + 'px';
  1162. fill_popup_option_menu();
  1163. set_default_popup_option_menu_item();
  1164. register_popup_option_menu();
  1165. $('#fv_popup_option').addEventListener('click', function(){
  1166. if(!closeLock){
  1167. this.parentNode.parentNode.removeChild(this.parentNode);
  1168. del_black_background();
  1169. if(randomName == 'none'){
  1170. recover_original_player();
  1171. }
  1172. else{
  1173. var fv_data = {name: 'fv_popup_player', msg: 'MSG_ID_RECOVER_ORIGINAL_PLAYER', confirmName: randomName};
  1174. sendToAllFrames(JSON.stringify(fv_data));
  1175. restore_iframe_attr_name();
  1176. randomName = 'none';
  1177. }
  1178. }
  1179. }, false);
  1180. $('#fv_popup_option').addEventListener('mousedown', function(e){
  1181. closeLock = false;
  1182. mouseMoveCount = 0;
  1183. window/*this*/.addEventListener('mousemove', move_popup_player, false);
  1184. }, false);
  1185. //$('#fv_popup_player').addEventListener('PluginInitialized', function(e){}, false);
  1186. loadingTimer = setInterval(function(){
  1187. if($('#fv_popup_player').offsetHeight > 0){
  1188. clearInterval(loadingTimer);
  1189. $('#fv_PopupFlash').style.backgroundImage = 'none';
  1190. div.style.visibility = 'visible';
  1191. //此处避免选项按钮显示不完整
  1192. $('#fv_popup_option').style.visibility = 'hidden';
  1193. $('#fv_popup_option').style.visibility = 'visible';
  1194. }
  1195. }, 200);
  1196. }
  1197. }
  1198. function restore_iframe_attr_name(){
  1199. if(window.opera){
  1200. if(topSavedObj != null){ // in the top window
  1201. topSavedObj.name = topSavedIframeName;
  1202. topSavedIframeName = null;
  1203. topSavedObj = null;
  1204. }else if(savedIframeName != null){
  1205. var fv_data = {name: 'fv_popup_player', msg: 'MSG_ID_RESTORE_IFRAME_ATTR_NAME', saved_name: savedIframeName};
  1206. window.top.postMessage(JSON.stringify(fv_data), '*');
  1207. savedIframeName = null;
  1208. }
  1209. }
  1210. }
  1211. function check_need_reload(obj){
  1212. if(window == window.top
  1213. || (window != window.top && parentWndWidth * parentWndHeight != 0 && window.innerHeight > parentWndHeight * 0.8 && window.innerWidth > parentWndWidth * 0.8)){
  1214. return false;
  1215. }
  1216. else{
  1217. return true;
  1218. }
  1219. }
  1220. function convert_to_full_path_outerHTML(obj){
  1221. var tag = _getObjTag(obj);
  1222. if(tag != 'object' && tag != 'embed'){
  1223. return;
  1224. }
  1225. obj.data && (obj.data = obj.data);
  1226. obj.archive && (obj.archive = obj.archive);
  1227. obj.codebase && (obj.codebase = obj.codebase);
  1228. obj.usemap && (obj.usemap = obj.usemap);
  1229. obj.src && (obj.src = obj.src);
  1230. for(var i = 0; i < obj.childNodes.length; i++){
  1231. convert_to_full_path_outerHTML(obj.childNodes[i]);
  1232. }
  1233. }
  1234. function popup_icon_hdlr(obj){
  1235. if(check_need_reload(obj) == false){
  1236. create_black_background(obj);
  1237. create_popup_player_no_reload(obj);
  1238. register_popup_player_drag_hdlr();
  1239. }
  1240. else{
  1241. window.fv_name = Math.random().toString();
  1242. //避免相对路径
  1243. convert_to_full_path_outerHTML(obj);
  1244. var fv_data = {name: 'fv_popup_player', msg: 'MSG_ID_CREATE_POPUP_PLAYER', from: window.fv_name, content: obj.outerHTML};
  1245. window.top.postMessage(JSON.stringify(fv_data), '*');
  1246. hide_original_player(obj);
  1247. }
  1248. del_popup_icon();
  1249. }
  1250. function check_plugin_type_int(obj){
  1251. var keyword;
  1252. keyword = obj.getAttribute('type');
  1253. if(keyword && keyword.toLowerCase() == 'application/x-shockwave-flash'){
  1254. return true;
  1255. }
  1256. keyword = obj.getAttribute('classid');
  1257. if(keyword && keyword.toLowerCase() == 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000'){
  1258. return true;
  1259. }
  1260. keyword = obj.getAttribute('src');
  1261. if(keyword && keyword.toLowerCase().indexOf('.swf') != -1){
  1262. return true;
  1263. }
  1264. return false;
  1265. }
  1266. function check_plugin_type(obj){
  1267. var embed = null;
  1268. var ret = false;
  1269. if((ret = check_plugin_type_int(obj)) == false){
  1270. embed = obj.getElementsByTagName('embed');
  1271. if(embed.length != 0) embed = embed[0];
  1272. ret = check_plugin_type_int(embed);
  1273. }
  1274. return ret;
  1275. }
  1276. function get_attribute_str(obj, attr){
  1277. return obj.getAttribute(attr) ? obj.getAttribute(attr) : '';
  1278. }
  1279. function check_black_and_white_list(obj){
  1280. var i = 0;
  1281. var htmlText = get_attribute_str(obj, 'id') + get_attribute_str(obj, 'class') + get_attribute_str(obj, 'name')
  1282. + get_attribute_str(obj, 'src') + get_attribute_str(obj, 'data') + get_attribute_str(obj, 'flashvars');
  1283. var embed = obj.getElementsByTagName('embed');
  1284. var param = obj.getElementsByTagName('param');
  1285. var i = 0;
  1286. if(embed.length != 0){
  1287. embed = embed[0];
  1288. htmlText += get_attribute_str(embed, 'id') + get_attribute_str(embed, 'class') + get_attribute_str(embed, 'name')
  1289. + get_attribute_str(embed, 'src') + get_attribute_str(embed, 'data') + get_attribute_str(obj, 'flashvars');
  1290. }
  1291. if(param.length != 0){
  1292. for(i = 0; i < param.length; i++){
  1293. if(param[i].name.toLowerCase() == 'flashvars'){
  1294. htmlText += get_attribute_str(param[i], 'value');
  1295. }
  1296. }
  1297. }
  1298. for(i = 0; i < WHITE_LIST_KEYWORD_IMPORTANT.length; i++){
  1299. if(htmlText.toLowerCase().indexOf(WHITE_LIST_KEYWORD_IMPORTANT[i]) != -1){
  1300. return true;
  1301. }
  1302. }
  1303.  
  1304. for(i = 0; i < BLACK_LIST_KEYWORD.length; i++){
  1305. if(htmlText.toLowerCase().indexOf(BLACK_LIST_KEYWORD[i]) != -1){
  1306. return false;
  1307. }
  1308. }
  1309. for(i = 0; i < WHITE_LIST_KEYWORD.length; i++){
  1310. if(htmlText.toLowerCase().indexOf(WHITE_LIST_KEYWORD[i]) != -1){
  1311. return true;
  1312. }
  1313. }
  1314. return false;
  1315. }
  1316. function check_flash_size(obj){
  1317. var width = parseInt(window.getComputedStyle(obj, null).width) || obj.width;
  1318. var height = parseInt(window.getComputedStyle(obj, null).height) || obj.height;
  1319. if(width < FLASH_SIZE_FILTER.width && height < FLASH_SIZE_FILTER.height){
  1320. return false;
  1321. }
  1322. return true;
  1323. }
  1324. function show_popup_icon(obj){
  1325. if($('#fv_popup_icon')){
  1326. del_popup_icon();
  1327. }
  1328.  
  1329. var ele = obj;
  1330. var objTag = _getObjTag(obj);
  1331. var pos = null;
  1332. if(objTag == 'embed'){
  1333. while(ele.parentNode && _getObjTag(ele.parentNode) != 'body'){
  1334. ele = ele.parentNode;
  1335. if(_getObjTag(ele) == 'object') break;
  1336. }
  1337. if(_getObjTag(ele) != 'object'){
  1338. ele = obj;
  1339. }
  1340. }
  1341. /* 只处理 flash 插件*/
  1342. if(check_plugin_type(ele) == false){
  1343. return;
  1344. }
  1345.  
  1346. /* 已经打开 player 的则不再显示工具按钮*/
  1347. if(funcKeyPress == false){
  1348. if($('#fv_popup_container')){
  1349. return;
  1350. }
  1351. if(check_black_and_white_list(ele) == false){
  1352. return;
  1353. }
  1354. if(check_flash_size(ele) == false){
  1355. return;
  1356. }
  1357. }
  1358.  
  1359. var div = _createElement('div', 'fv_popup_icon');
  1360. //pos = _getElementXY(ele); //如果是 object,坐标可能会有问题?
  1361. pos = _getElementXY(obj);
  1362. div.style.left = pos.x + 'px';
  1363. div.style.top = pos.y + 'px';
  1364. document.body.appendChild(div);
  1365. div.addEventListener('click', function(e){ popup_icon_hdlr(ele); }, false);
  1366. if(check_need_reload(ele) == true){
  1367. div.className = 'reload';
  1368. window.fv_name = Math.random().toString();
  1369. var fv_data = {name: 'fv_popup_player', msg: 'MSG_ID_SAVE_RANDOM_NAME_2', from: window.fv_name};
  1370. window.top.postMessage(JSON.stringify(fv_data), '*');
  1371. }
  1372. }
  1373. function del_popup_icon(){
  1374. var obj = $('#fv_popup_icon');
  1375. if(obj){
  1376. obj.parentNode.removeChild(obj);
  1377. }
  1378. else if(randomName2 != 'none'){
  1379. var fv_data = {name: 'fv_popup_player', msg: 'MSG_ID_DELETE_POPUP_ICON', confirmName: randomName2};
  1380. sendToAllFrames(JSON.stringify(fv_data));
  1381. restore_iframe_attr_name();
  1382. randomName2 = 'none';
  1383. }
  1384. }
  1385. function popup_message_hdlr(e){
  1386. var fv_data = null;
  1387. try{
  1388. fv_data = JSON.parse(e.data);
  1389. }
  1390. catch(e){
  1391. return;
  1392. }
  1393. if(fv_data.name && fv_data.name == 'fv_popup_player'){
  1394. if(fv_data.confirmName){
  1395. if(!window.fv_name || fv_data.confirmName != window.fv_name){
  1396. sendToAllFrames(e.data);
  1397. return;
  1398. }
  1399. }
  1400. else if(fv_data.confirmIframe && fv_data.confirmIframe != window.name){
  1401. sendToAllFrames(e.data);
  1402. return;
  1403. }
  1404. switch(fv_data.msg){
  1405. /* ------ operation in parent window ------ */
  1406. case 'MSG_ID_GET_PARENT_WINDOW_SIZE_REQ':
  1407. sendToAllFrames(JSON.stringify({
  1408. name: 'fv_popup_player',
  1409. w: window.innerWidth,
  1410. h: window.innerHeight,
  1411. msg: 'MSG_ID_GET_PARENT_WINDOW_SIZE_RSP',
  1412. confirmName: fv_data.verifyName
  1413. }));
  1414. break;
  1415. case 'MSG_ID_CREATE_POPUP_PLAYER':
  1416. randomName = fv_data.from;
  1417. randomName2 = 'none'; //icon will be deleted after create popup player
  1418. create_black_background();
  1419. create_popup_player(fv_data.content);
  1420. register_popup_player_drag_hdlr();
  1421. break;
  1422. case 'MSG_ID_SAVE_RANDOM_NAME_2':
  1423. randomName2 = fv_data.from;
  1424. break;
  1425. case 'MSG_ID_RESTORE_IFRAME_ATTR_NAME':
  1426. restore_iframe_attr_name();
  1427. break;
  1428. /* ------ operation in iframes ------ */
  1429. case 'MSG_ID_GET_PARENT_WINDOW_SIZE_RSP':
  1430. parentWndWidth = fv_data.w;
  1431. parentWndHeight = fv_data.h;
  1432. if(parentWndHeight != 0 && parentWndWidth != 0){
  1433. hasFetchParentSize = true;
  1434. }
  1435. break;
  1436. case 'MSG_ID_RECOVER_ORIGINAL_PLAYER':
  1437. recover_original_player();
  1438. break;
  1439. case 'MSG_ID_DELETE_POPUP_ICON':
  1440. del_popup_icon();
  1441. break;
  1442. case 'MSG_ID_CHECK_IF_SHOW_POPUP_ICON_FOR_IFRAME':
  1443. savedIframeName = fv_data.saved_name;
  1444. var bodySize = _getStyleSize(document.body);
  1445. var obj = $$('embed') || $$('object');
  1446. var ret = false;
  1447. if(obj && obj.length == 1){
  1448. obj = obj[0];
  1449. var objSize = _getStyleSize(obj);
  1450. if(objSize.w >= bodySize.w * 0.95 && objSize.h >= bodySize.h * 0.95){
  1451. show_popup_icon(obj);
  1452. ret = true;
  1453. }
  1454. }
  1455. if(ret == false){
  1456. restore_iframe_attr_name();
  1457. }
  1458. break;
  1459. default:
  1460. break;
  1461. }
  1462. }
  1463. }
  1464. window.addEventListener('resize', function(e){
  1465. set_flash_pos_no_reload();
  1466. set_option_and_menu_pos_no_reload();
  1467. }, false);
  1468. window.addEventListener('message', popup_message_hdlr, false);
  1469. function mouseover_hdlr(e){
  1470. var obj = e.target;
  1471. var tag = _getObjTag(obj);
  1472. if(tag == 'embed' || tag == 'object'){
  1473. show_popup_icon(obj);
  1474. }
  1475. else if(tag == 'iframe' && window.opera){
  1476. var fv_data = {name: 'fv_popup_player', msg: 'MSG_ID_CHECK_IF_SHOW_POPUP_ICON_FOR_IFRAME', saved_name: obj.name};
  1477. topSavedIframeName = obj.name;
  1478. topSavedObj = obj;
  1479. obj.name = Math.random().toString();
  1480. fv_data.confirmIframe = obj.name;
  1481. sendToAllFrames(JSON.stringify(fv_data));
  1482. }
  1483. else if(obj == $('#fv_popup_icon')){
  1484. // do nothing
  1485. }
  1486. else{
  1487. del_popup_icon();
  1488. }
  1489. }
  1490. window.addEventListener('mouseover', mouseover_hdlr, false);
  1491. window.addEventListener('keydown', function(e){ funcKeyPress = (e.altKey || e.shiftKey || e.ctrlKey ) ? true : false; }, false);
  1492. window.addEventListener('keyup', function(e){ funcKeyPress = false; }, false);
  1493. window.addEventListener('blur', function(e){ funcKeyPress = false; }, false);
  1494. window.addEventListener('DOMContentLoaded', function(e) { _saveTitle(); } , false);
  1495. var hasFetchParentSize = false;
  1496. if(document.doctype && document.doctype.name == "wml"){
  1497. // thanks iZML
  1498. }
  1499. else{
  1500. _addStyle(styleText);
  1501. window.addEventListener('DOMNodeInserted', function(){
  1502. if(window != window.top && !hasFetchParentSize){
  1503. var objs = $$('object, embed');
  1504. if(objs.length > 0){
  1505. window.fv_name = Math.random().toString();
  1506. var fv_data = {name: 'fv_popup_player', msg: 'MSG_ID_GET_PARENT_WINDOW_SIZE_REQ', verifyName: window.fv_name};
  1507. window.top.postMessage(JSON.stringify(fv_data), '*');
  1508. }
  1509. }
  1510. }, false);
  1511. }
  1512. })(window.opera ? window.opera.scriptStorage : undefined);