Created
December 23, 2013 23:54
-
-
Save miya2000/8106812 to your computer and use it in GitHub Desktop.
nicovideo - wnp (Ginza Preview)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name nicovideo - wnp (Ginza Preview) | |
// @description windowised nicovideo player. | |
// @author miya2000 | |
// @namespace http://d.hatena.ne.jp/miya2000/ | |
// @version Ginza Preview | |
// @include http://*.nicovideo.jp/* | |
// @exclude http://www.nicovideo.jp/watch/* | |
// @exclude http://*http* | |
// @exclude http://ads.nicovideo.jp/* | |
// ==/UserScript== | |
/* | |
[usage] | |
Open http://www.nicovideo.jp/ | |
and you can start with the right-bottom button on the page. | |
@see http://d.hatena.ne.jp/kotas/20070925/playlist | |
http://abc.s65.xrea.com/prox/wiki/%A5%D5%A5%A3%A5%EB%A5%BF%A1%A2%A5%EA%A5%B9%A5%C8%B8%F8%B3%AB/nicovideo/#iroiro | |
http://blog.fulltext-search.biz/articles/2008/01/31/nico-nico-player-wrapper | |
http://blog.guron.net/2009/06/04/636.php | |
*/ | |
// ==== preparation ==== // | |
/*@cc_on //activate Conditional compilation. @*/ | |
(function(f) { | |
if (typeof unsafeWindow == "undefined" && !/Chrome[/]/.test(navigator.userAgent)) return f; | |
return function() { | |
var s = document.createElement('script'); | |
s.setAttribute('type', 'text/javascript'); | |
s.setAttribute('style', 'display: none;'); | |
s.textContent = '(' + f.toString() + ')()'; | |
(document.body || document.documentElement).appendChild(s); | |
}; | |
}) | |
// ==== wnp ==== // | |
(function() { | |
if (typeof window.wnp != 'undefined') return; | |
// Opera12 invokes user.js on window.open() document. | |
if (document.title == 'preparing WNP') return; | |
var WNP = {}; | |
// ==== Prefs ==== // | |
WNP.PREFS = { | |
/* | |
observe_interval : 500, // (ms) observe interval. | |
page_timeout : 80, // (sec) page load timeout. | |
video_timeout : 60, // (sec) video play timeout. | |
menu_width_ratio : 50, // (%) menu width ratio when showing menu. | |
loop : false, // "loop" on startup. | |
comment_off : false, // "comment-off" on startup. | |
always_on_top : false, // "always on top" on startup. | |
playlist_style_simple : false, // "playlist style simple" on startup. | |
remove_on_finish : true, // "remove on finish" on startup. | |
use_history : true, // "use history" on startup. | |
skip_deleted_video : true, // "skip deleted movie" on startup. | |
use_offtimer : true, // use offtimer or not. | |
offtimer_minute : 60, // (min) off timer. | |
use_loop_break : true, // use loop break or not. | |
loop_break_count : 3 // exit from the loop video by specified count. | |
cancel_jump : false // if the video page jumped to another page, go to next video. | |
*/ | |
}; | |
// ==== shortcut keys ==== // | |
WNP.SHOPRTCUT = [ | |
/* | |
{ command: 'PlayPause', key: 'Space' }, | |
{ command: 'PlayPrev', key: 'PageUp' }, | |
{ command: 'PlayNext', key: 'PageDown' }, | |
{ command: 'VolumeUp', key: 'Up' }, | |
{ command: 'VolumeUp+', key: 'Up Shift' }, | |
{ command: 'VolumeDown', key: 'Down' }, | |
{ command: 'VolumeDown-', key: 'Down Shift' }, | |
{ command: 'SeekForward', key: 'Right' }, | |
{ command: 'SeekForward+', key: 'Right Shift' }, | |
{ command: 'SeekBackward', key: 'Left' }, | |
{ command: 'SeekBackward-', key: 'Left Shift' }, | |
{ command: 'SeekBackward--', key: 'Left Ctrl' }, | |
{ command: 'SelectNextItem', key: 'j' }, | |
{ command: 'SelectNextItem', key: 'Enter' }, | |
{ command: 'SelectPrevItem', key: 'k' }, | |
{ command: 'PlaySelectedItem', key: 'o' }, | |
{ command: 'DeleteSelectedItem', key: 'DEL' }, | |
{ command: 'MenuNext', key: 's' }, | |
{ command: 'MenuPrev', key: 'a' }, | |
{ command: 'Playlist', key: 'n' }, | |
{ command: 'History', key: 'h' }, | |
{ command: 'Preference', key: 'p' }, | |
{ command: 'Comment', key: 'c' }, | |
{ command: 'Loop', key: 'l' }, | |
{ command: 'Repeat', key: 'r' }, | |
{ command: 'Mute', key: 'm' }, | |
{ command: 'Open', key: 'w' }, | |
{ command: 'View', key: 'v' } | |
*/ | |
]; | |
// ==== const ==== // | |
var Consts = { | |
WNP_TITLE : 'WNP', | |
WNP_GLOBAL_NAME : 'WNP', // global name of WNP entry object. | |
WNP_IMAGE_SAVE : 'data:image/gif;base64,R0lGODlhEAAQAIAAAAAAAPD4%2FyH5BAEAAAAALAAAAAAQABAAAAIhhI%2Bpq%2BEPHYo0zAovlscy4BnhMo7N9IHoV6Ytq23pTAMFADs%3D', | |
WNP_IMAGE_PLAY : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAAt0lEQVQ4y2NgoCL4%2F%2F8%2FXnnB0NBQFyAtQA0DJVatWtUPVHALRAP5kpQaqAmUvAzE%2F4D4OxDvB4rZAzE7uQZqASWvQA2EgSchISG5oKAgy4X%2F%2Fv27DMR%2Fgfg%2FDAPBm5UrV07AFQSkuvA%2FoSAgx0BkcAnkE3K8jAxgXn8CTFL56OFJjgvxxjipBr4BpskJ%2BNIkPgO1gV67geZFvEmGkIFKQMntQPyB2ERNTF6WAnoxjdhsR4yBZJU2AAcDLeBOG3M7AAAAAElFTkSuQmCC', | |
WNP_IMAGE_PAUSE : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAAe0lEQVQ4y2NgoCL4%2F%2F8%2FfgWhoaFuxIgRYyDLqlWrooAKfoJoEB%2BHGCOxBnIAJTf9h4BNID4OsYEzkP3fv38b%2F0HARhAfhxjDqJeHsJc5gN7aAdIJomEGYhEj2stsQMl2UGCBaBAfhxjRLgQDYBZrICBGmoG4NOISAxkIAIbuKTCbOZywAAAAAElFTkSuQmCC', | |
WNP_IMAGE_EMPTY : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQI12P4DwQACfsD%2FWMmxY8AAAAASUVORK5CYII%3D', | |
WNP_IMAGE_PREF : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAOUlEQVQoz2NgoCbg4uIC0x9%2B%2FP%2BPjInSTHVNeA3Bp4lojTCFRDkbXSNR%2Fh1YTSQHP20jm%2Bg4ohYAAAU6%2FYWVfvgIAAAAAElFTkSuQmCC', | |
WNP_IMAGE_OPEN : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAABKklEQVQ4y2NgoCL4%2F%2F8%2FYUWcnJwywcHBeQoKCmYUG8jFxcU3c%2BbMJUCF%2Fy9cuHBFTk5OnxIDuZcuXTrlPxI4e%2FbsQVkgIMdApoULF84BKvjx79%2B%2F%2F0D87%2B%2Ffv%2F9Ahp45c2YLIyOjPCkGMl%2B5cmUe0ICfQPwfZiDITBAbCH7fv3%2F%2FJFCdIkED%2Bfj4GC9evMjw9u3b%2F1jwP2T%2Bu3fvfsrIyOA30NHRkQFoO8ObN2%2BIws3NzYS9DLLV3d2dKEzQyyAXrlq1Kg1o%2B1MofoTEfgxjv3r16jmQvgVSS9CFK1euTANKfAeFPjQS%2FkPZ%2F5DYILwfpJaggSBbQXpA%2BC8omrGwoWZ%2FQHchVgB14WUQBmq8jIN9A0hvR3chVgC0FURpArEWEo3O1gZiJQZ6AAC9TX6jYSwl0gAAAABJRU5ErkJggg%3D%3D', | |
WNP_THUMB_PLACEHOLDER : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAAAyCAIAAACMIyF9AAAAVklEQVRo3u3PAQkAMAwDsPt3OQeXcAuDwhgnFdA2p3q5QSpIp%2F8wMDAwMDAwMDD8b1jyI9llYGBgYGBgYGBgYGBgYBg3LPmR7DIwMDAwMDAwMDAwzBgeCliYGam%2FHsoAAAAASUVORK5CYII%3D', | |
WNP_STORAGE_SWF : 'http://miya2000.github.io/storage/wnp.swf', | |
WNP_INITIAL_PLAYER_WIDTH : 628, | |
WNP_INITIAL_PLAYER_HEIGHT : 410, | |
// == ginza player == | |
ORG_PLAYER_GINZA_COMMENT_HEIGHT : 30, | |
ORG_PLAYER_GINZA_CONTROL_HEIGHT : 47, | |
// == zero player == | |
ORG_PLAYER_ZERO_VIEW_WIDTH : 908, | |
ORG_PLAYER_ZERO_VIEW_HEIGHT : 486, | |
ORG_PLAYER_ZERO_CONTROL_HEIGHT : 0, | |
ORG_PLAYER_ZERO_MINIMUM_WIDTH : 654, // 640 in case of Windows but 654 in Macintosh... | |
ORG_PLAYER_ZERO_4_3_WIDTH_ADJ : 0, | |
// == nicoplayer4 == | |
ORG_PLAYER4_VIEW_WIDTH : 672, | |
ORG_PLAYER4_VIEW_HEIGHT : 384, | |
ORG_PLAYER4_CONTROL_HEIGHT : 51, | |
ORG_PLAYER4_MINIMUM_WIDTH : 677, | |
ORG_PLAYER4_4_3_WIDTH_ADJ : 120, | |
// == nicoplayer3 (old player) == | |
ORG_PLAYER3_VIEW_WIDTH : 544, | |
ORG_PLAYER3_VIEW_HEIGHT : 384, | |
ORG_PLAYER3_CONTROL_HEIGHT : 63, | |
ORG_PLAYER3_MINIMUM_WIDTH : 561, | |
WNP_GATEWAY_URL : 'http://www.nicovideo.jp/mylist_add/', | |
WNP_LOGIN_PAGE : 'https://secure.nicovideo.jp/secure/login_form' | |
} | |
WNP.Consts = Consts; | |
Consts.svg_xml_base = [ | |
'<?xml version="1.0" encoding="utf-8" ?>', | |
'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 380 230">', | |
'<defs>', | |
' <linearGradient id="bgGrad" x1="0" y1="0" x2="1" y2="0">', | |
' <stop offset="0" stop-color="rgb(220,220,220)" />', | |
' <stop offset="0.06" stop-color="rgb(240,240,240)" />', | |
' <stop offset="0.5" stop-color="rgb(250,250,255)" />', | |
' <stop offset="0.85" stop-color="rgb(230,230,230)" />', | |
' <stop offset="1" stop-color="rgb(210,210,210)" />', | |
' </linearGradient>', | |
// http://kyle-in-jp.blogspot.jp/2008/11/librsvg.html | |
' <filter id="imgFilter">', | |
' <feGaussianBlur stdDeviation="2" in="SourceAlpha" />', | |
' <feOffset dx="3" dy="3" />', | |
' <feColorMatrix type="matrix" values="0 0 0 0 0.4, 0 0 0 0 0.4, 0 0 0 0 0.4, 0 0 0 1 0" result="shadow" />', | |
' <feComposite in="SourceGraphic" in2="shadow" operator="over"/>', | |
' </filter>', | |
' <mask id="imgMask" maskUnits="userSpaceOnUse" x="10" y="0" width="130" height="100">', | |
' <rect x="10" y="0" width="130" height="100" rx="3" ry="3" fill="#ffffff"/>', | |
' </mask>', | |
' <clipPath id="clip_txt">', | |
' <path d="m 0 0 h 220 v 150 h -220 v -150 z" />', | |
' </clipPath>', | |
'</defs>', | |
'<rect id="background" width="380" height="250" fill="url(#bgGrad)" />', | |
'<g transform="translate(0,50)" filter="url(#imgFilter)">', | |
' <image x="10" width="130" height="100" xlink:href="%u%" mask="url(#imgMask)" />', | |
'</g>', | |
'<g id="videoinfo_container" clip-path="url(#clip_txt)" transform="translate(150,50)" font-family="Verdana,sans-serif" font-weight="bold">', | |
' <text y="30" style="font-size: 15px;">%t%', | |
' <animate id="title_anim" attributeName="x" values="0;0;-300" keyTimes="0;0.25;1" dur="10s" repeatDur="indefinite" /> ', | |
' </text>', | |
' <text x="5" y="75" style="font-size: 12px;">%c%</text>', | |
' <g id="videoinfo" style="display: none">', | |
' <text x="5" y="110" style="font-size: 10px;">\u518D\u751F</text>', | |
' <text x="60" y="110" style="font-size: 10px;" id="count">%vp%</text>', | |
' <text x="5" y="120" style="font-size: 10px;">\u30DE\u30A4\u30EA\u30B9\u30C8</text>', | |
' <text x="60" y="120" style="font-size: 10px;">%vm%</text>', | |
' <text x="5" y="130" style="font-size: 10px;">\u30B3\u30E1\u30F3\u30C8</text>', | |
' <text x="60" y="130" style="font-size: 10px;">%vc%</text>', | |
' </g>', | |
'</g>', | |
'<script type="text/javascript">', | |
'<![CDATA[', | |
' if (navigator.userAgent.indexOf("Macintosh;") >= 0 && navigator.userAgent.indexOf("Opera/") >= 0) {', // Mac Opera cannot draw text in the element having "clip-path" attribute. | |
' document.getElementById("videoinfo_container").removeAttribute("clip-path");', | |
' document.getElementById("title_anim").parentNode.removeChild(document.getElementById("title_anim"));', | |
' }', | |
' if (document.getElementById("count").textContent.length > 0) {', | |
' document.getElementById("videoinfo").style.display = "";', | |
' }', | |
']]>', | |
'</script>', | |
'</svg>' | |
].join('\n'); | |
Consts.svg_mime_type = 'image/svg+xml'; | |
// ==== color settings ==== // | |
var Colors = { | |
item_hover: '#D7EBFF', | |
item_selected: '#B4DAFF', | |
item_dragging: '#FFCCCC', | |
status_error: 'red', | |
control_loop: 'yellow', | |
control_repeat: 'yellow', | |
control_comment_off: 'yellow', | |
control_mute: 'yellow', | |
control_always_on_top: 'yellow' | |
}; | |
WNP.Colors = Colors; | |
var Lang = { | |
COMMAND_PlayStop : '\u52D5\u753B\u306E\u518D\u751F\u3092\u958B\u59CB\uFF0F\u7D42\u4E86\u3057\u307E\u3059\u3002', | |
COMMAND_PlayPause : '\u52D5\u753B\u306E\u518D\u751F\u3092\u4E00\u6642\u505C\u6B62\uFF0F\u518D\u958B\u3057\u307E\u3059\u3002', | |
COMMAND_PlayPrev : '\u4E00\u3064\u524D\u306E\u52D5\u753B\u3092\u518D\u751F\u3057\u307E\u3059\u3002', | |
COMMAND_PlayNext : '\u4E00\u3064\u5F8C\u306E\u52D5\u753B\u3092\u518D\u751F\u3057\u307E\u3059\u3002', | |
CLICK_Volume : '\u30AF\u30EA\u30C3\u30AF\u3057\u305F\u4F4D\u7F6E\u306B\u97F3\u91CF\u3092\u8A2D\u5B9A\u3057\u307E\u3059\u3002', | |
COMMAND_VolumeUp : '\u97F3\u91CF\u3092\u4E0A\u3052\u307E\u3059\u3002', | |
COMMAND_VolumeUp_Plus : '\u97F3\u91CF\u3092\u5927\u304D\u304F\u4E0A\u3052\u307E\u3059\u3002', | |
COMMAND_VolumeDown : '\u97F3\u91CF\u3092\u4E0B\u3052\u307E\u3059\u3002', | |
COMMAND_VolumeDown_Minus : '\u97F3\u91CF\u3092\u5927\u304D\u304F\u4E0B\u3052\u307E\u3059\u3002', | |
CLICK_Seek : '\u30AF\u30EA\u30C3\u30AF\u3057\u305F\u7B87\u6240\u306B\u518D\u751F\u4F4D\u7F6E\u3092\u79FB\u52D5\u3057\u307E\u3059\u3002', | |
COMMAND_SeekForward : '\u518D\u751F\u4F4D\u7F6E\u3092\u524D\u65B9\u306B\u79FB\u52D5\u3057\u307E\u3059\u3002', | |
COMMAND_SeekForward_Plus : '\u518D\u751F\u4F4D\u7F6E\u3092\u524D\u65B9\u306B\u5927\u304D\u304F\u79FB\u52D5\u3057\u307E\u3059\u3002', | |
COMMAND_SeekBackward : '\u518D\u751F\u4F4D\u7F6E\u3092\u5F8C\u65B9\u306B\u79FB\u52D5\u3057\u307E\u3059\u3002', | |
COMMAND_SeekBackward_Minus : '\u518D\u751F\u4F4D\u7F6E\u3092\u5F8C\u65B9\u306B\u5927\u304D\u304F\u79FB\u52D5\u3057\u307E\u3059\u3002', | |
COMMAND_SeekBackward_MinusMinus : '\u518D\u751F\u4F4D\u7F6E\u3092\u52D5\u753B\u306E\u5148\u982D\u306B\u79FB\u52D5\u3057\u307E\u3059\u3002', | |
COMMAND_SelectNextItem : '\u4E00\u3064\u5F8C\u306E\u52D5\u753B\u3092\u9078\u629E\u72B6\u614B\u306B\u3057\u307E\u3059\u3002', | |
COMMAND_SelectPrevItem : '\u4E00\u3064\u524D\u306E\u52D5\u753B\u3092\u9078\u629E\u72B6\u614B\u306B\u3057\u307E\u3059\u3002', | |
COMMAND_PlaySelectedItem : '\u9078\u629E\u3055\u308C\u3066\u3044\u308B\u52D5\u753B\u3092\u518D\u751F\u3057\u307E\u3059\u3002', | |
COMMAND_DeleteSelectedItem : '\u9078\u629E\u3055\u308C\u3066\u3044\u308B\u52D5\u753B\u3092\u524A\u9664\u3057\u307E\u3059\u3002', | |
COMMAND_Menu : '\u30E1\u30CB\u30E5\u30FC\u306E\u8868\u793A\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', | |
COMMAND_MenuNext : '\u6B21\u306E\u30E1\u30CB\u30E5\u30FC\u3092\u8868\u793A\u3057\u307E\u3059\u3002', | |
COMMAND_MenuPrev : '\u524D\u306E\u30E1\u30CB\u30E5\u30FC\u3092\u8868\u793A\u3057\u307E\u3059\u3002', | |
COMMAND_Playlist : '\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u306E\u8868\u793A\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', | |
COMMAND_History : '\u8996\u8074\u5C65\u6B74\u306E\u8868\u793A\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', | |
COMMAND_Preference : '\u8A2D\u5B9A\u753B\u9762\u306E\u8868\u793A\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', | |
COMMAND_Comment : '\u30B3\u30E1\u30F3\u30C8\u306E\u8868\u793A\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', | |
COMMAND_Loop : '\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u3092\u7E70\u308A\u8FD4\u3057\u518D\u751F\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', | |
COMMAND_Repeat : '\u52D5\u753B\u3092\u7E70\u308A\u8FD4\u3057\u518D\u751F\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', | |
COMMAND_Mute : '\u52D5\u753B\u306E\u97F3\u58F0\u3092\u6D88\u3059\u304B\u3069\u3046\u304B\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', | |
COMMAND_Open : '\u5165\u529B\u3055\u308C\u305F\u52D5\u753B\u3092\u958B\u304D\u307E\u3059\u3002\u52D5\u753BID\u3084\u52D5\u753B\u306EURL\u3092\u5165\u529B\u3067\u304D\u307E\u3059\u3002', | |
COMMAND_View : '\u30D7\u30EC\u30A4\u30E4\u30FC\u306E\u8868\u793A\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', | |
COMMAND_NicoControl : '\u30CB\u30B3\u30CB\u30B3\u52D5\u753B\u30D7\u30EC\u30A4\u30E4\u30FC\u672C\u4F53\u306E\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u306E\u8868\u793A\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002', | |
COMMAND_AlwaysOnTop : '\u5E38\u306B\u5168\u753B\u9762\u8868\u793A\u3057\u307E\u3059\u3002\uFF08\u7C21\u6613\u5B9F\u88C5\u3067\u3059\uFF09', | |
COMMAND_Shuffle : '\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u306E\u518D\u751F\u9806\u3092\u30B7\u30E3\u30C3\u30D5\u30EB\u3057\u307E\u3059\u3002', | |
PREF_SIMPLE_PLAYLIST_VIEW : '\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u3092\u30B7\u30F3\u30D7\u30EB\u8868\u793A\u306B\u3059\u308B', | |
DESC_SIMPLE_PLAYLIST_VIEW : '\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u3092\u30B7\u30F3\u30D7\u30EB\u8868\u793A\u306B\u3057\u307E\u3059\u3002', | |
PREF_REMOVE_ON_FINISH : '\u518D\u751F\u304C\u7D42\u308F\u3063\u305F\u3089\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u304B\u3089\u524A\u9664\u3059\u308B', | |
DESC_REMOVE_ON_FINISH : '\u518D\u751F\u304C\u7D42\u308F\u3063\u305F\u3089\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u304B\u3089\u524A\u9664\u3057\u307E\u3059\u3002', | |
PREF_USE_HISTORY : '\u5C65\u6B74\u3092\u4F7F\u7528\u3059\u308B', | |
DESC_USE_HISTORY : '\u5C65\u6B74\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002', | |
PREF_SKIP_DELETED_VIDEO : '\u524A\u9664\u3055\u308C\u305F\u52D5\u753B\u3092\u30B9\u30AD\u30C3\u30D7\u3059\u308B', | |
PREF_USE_OFFTIMER : '\u30AA\u30D5\u30BF\u30A4\u30DE\u30FC\u3092\u4F7F\u7528\u3059\u308B', | |
PREF_MINUTE : '\u5206', | |
PREF_USE_LOOP_BREAK : '\u30EB\u30FC\u30D7\u3059\u308B\u52D5\u753B\u3092\u6307\u5B9A\u56DE\u6570\u3067\u6B62\u3081\u308B', | |
PREF_COUNT : '\u56DE', | |
PREF_CANCEL_JUMP : '\u5225\u306E\u52D5\u753B\u306B\u79FB\u52D5\u3057\u306A\u3044\u3088\u3046\u306B\u3059\u308B', | |
PREF_FORCE_VISIT_ON_OPERA : '\u518D\u751F\u6642\u306B\u300C\u8A2A\u554F\u6E08\u307F\u300D\u306B\u3059\u308B\u0028Opera\u306E\u307F\u0029', | |
PREF_DEFAULT : '\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u8A2D\u5B9A\u306B\u623B\u3057\u307E\u3059\u3002', | |
PLEASE_LOGIN : '\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044', | |
OVER_ACCESS : '\u77ED\u6642\u9593\u3067\u306E\u9023\u7D9A\u30A2\u30AF\u30BB\u30B9', | |
MISSING : '\u304A\u63A2\u3057\u306E\u52D5\u753B\u306F\u518D\u751F\u3067\u304D\u307E\u305B\u3093', | |
SAVE_PLAYLIST_USAGE : '\u3053\u306E\u30EA\u30F3\u30AF\u306F\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u30EC\u30C3\u30C8\u3067\u3059\u3002\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u306B\u767B\u9332\u3059\u308B\u3053\u3068\u3067\u3053\u306E\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u3092\u5FA9\u5143\u3067\u304D\u307E\u3059\u3002\n\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u30EC\u30C3\u30C8\u306F\u30CB\u30B3\u30CB\u30B3\u52D5\u753B(http://www.nicovideo.jp/)\u306E\u30C9\u30E1\u30A4\u30F3\u4E0A\u3067\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002', | |
PLEASE_INPUT_VIDEOID_OR_URL : '\u52D5\u753B\u306EID\u0028\u300Csm9\u300D\u306A\u3069\u0029\u3082\u3057\u304F\u306FURL\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002' | |
}; | |
WNP.Lang = Lang; | |
// ==== main ==== // | |
var fn = {}; | |
WNP.fn = fn; | |
BUILD_FUNC(fn); | |
var browser = fn.browser; | |
var ie = fn.ie; | |
var $e = fn.$e; | |
var isNative = fn.isNative; | |
var toJSON = fn.toJSON; | |
var getAbsolutePosition = fn.getAbsolutePosition; | |
var addStyle = fn.addStyle; | |
var getStyle = fn.getStyle; | |
var getValidCssPropertyName = fn.getValidCssPropertyName; | |
var $XS = fn.$XS; | |
var findVideoTitle = fn.findVideoTitle; | |
var getCanonicalVideoURL = fn.getCanonicalVideoURL; | |
var createPlayInfo = fn.createPlayInfo; | |
var postError = fn.postError; | |
function Extension(processor) { | |
this.processor = processor; | |
var lines = []; | |
this.add = function(line) { | |
lines.push(line); | |
}; | |
this.process = function() { | |
if (!this.processor) return lines.join('\n'); | |
else { | |
var results = []; | |
for (var i = 0, len = lines.length; i < len; i++) { | |
results.push(this.processor(lines[i])); | |
} | |
return results.join('\n'); | |
} | |
}; | |
} | |
function ExtensionPoint(name) { | |
this.name = name; | |
} | |
WNP.html = { | |
Extension: Extension, | |
ExtensionPoint: ExtensionPoint, | |
lines: null, | |
browser: browser, | |
extensions: { | |
'style': new Extension(function(s) { return '<style type="text/css">' + s + '</style>' }), | |
'playermenu.left.first': new Extension(), | |
'playermenu.left.last': new Extension(), | |
'playermenu.right.first': new Extension(), | |
'playermenu.right.last': new Extension(), | |
'controlmenu.right.first': new Extension(), | |
'controlmenu.right.last': new Extension(), | |
'panels.playlist.menu.last': new Extension(), | |
'panels.history.menu.last': new Extension(), | |
'panels.preference.normal.last': new Extension(), | |
'panels.preference.extend.last': new Extension(), | |
'panels.preference.last': new Extension(), | |
'panels.preference.menu.last': new Extension(), | |
'panels.last': new Extension(), | |
'script': new Extension(function(s) { return '<script type="text/javascript">' + s + '</script>'; }) | |
}, | |
build: function() { | |
var results = []; | |
var lines = this.lines; | |
for (var i = 0, len = lines.length; i < len; i++) { | |
var line = lines[i]; | |
if (line instanceof ExtensionPoint) { | |
if (this.extensions[line.name]) { | |
results.push(this.extensions[line.name].process()); | |
} | |
else { | |
postError("no extention. name: " + line.name); | |
} | |
} | |
else { | |
results.push(line); | |
} | |
} | |
return results.join('\n'); | |
} | |
}; | |
WNP.html.lines = (function() { | |
var boxSizing = getValidCssPropertyName('box-sizing'); | |
var backgroundSize = getValidCssPropertyName('background-size'); | |
return [ | |
'<!DOCTYPE html PUBLIC "-\/\/W3C\/\/DTD HTML 4.01 Transitional\/\/EN" "http:\/\/www.w3.org/TR/html4/loose.dtd">', | |
'<html>', | |
'<head>', | |
'<meta http-equiv="Content-Type" content="text/html; charset=utf-8">', | |
'<meta http-equiv="Content-Script-Type" content="text/javascript">', | |
'<meta http-equiv="Content-Style-Type" content="text/css">', | |
'<meta http-equiv="X-UA-Compatible" content="IE=8">', | |
'<title>preparing WNP</title>', | |
'<link rel="next" href="javascript:void(0)">', // avoid fast forward. | |
'<link rel="prev" href="javascript:void(0)">', | |
'<style type="text/css">', | |
'html, body, div, p, ul, dl, li, img { margin: 0; padding: 0; border: none; }', | |
'html, body {', | |
' width: 100%; height: 100%; background-color: black; overflow: hidden;', | |
'}', | |
'div.wnp_player { ', | |
' width: 100%; height: 100%;', | |
' position: relative;', | |
' overflow: hidden;', | |
' background-color: black;', | |
' line-height: 1.1em;', | |
' font-size: 12px;', | |
'}', | |
'div.wnp_header, div.wnp_footer {', | |
' ' + boxSizing + ': border-box;', | |
' width: 100%;', | |
' height: 20px;', | |
' color: #F0F8FF;', | |
' background-color: #050608;', | |
' font-family:\'\u30D2\u30E9\u30AE\u30CE\u89D2\u30B4\u0020Pro\u0020W3\',\'\u30E1\u30A4\u30EA\u30AA\',Meiryo,Verdana,sans-serif;', | |
' font-size: 14px;', | |
' font-weight: bold;', | |
' line-height: 20px;', | |
' padding: 0 5px;', | |
' position: relative;', | |
' z-index: 1;', | |
' overflow: hidden;', | |
'}', | |
'div.wnp_footer {', | |
' padding-top: 2px;', | |
'}', | |
'div.wnp_header div.header_left {', | |
' text-align: left;', | |
' position: absolute;', | |
'}', | |
'div.wnp_header div.header_right {', | |
' text-align: right;', | |
'}', | |
'div.wnp_header a, div.wnp_footer a {', | |
' color: inherit;', | |
' text-decoration: none;', | |
' margin: 0 0.4em;', | |
'}', | |
'div.wnp_header a:visited, div.wnp_footer a:visited {', | |
' color: inherit;', | |
'}', | |
'div.wnp_header button, div.wnp_footer button {', | |
' color: inherit;', | |
' font-family: inherit;', | |
' cursor: pointer;', | |
' background-color: transparent;', | |
' border: none;', | |
' margin: 0; padding: .25em 0 0;', | |
'}', | |
'div.wnp_header .control, div.wnp_footer .control {', | |
' visibility: hidden;', | |
'}', | |
'div.wnp_header:hover .control, div.wnp_footer:hover .control {', | |
' visibility: visible;', | |
' cursor: pointer;', | |
'}', | |
'div.wnp_footer:hover .wnp_control_panel {', | |
' visibility: visible;', | |
'}', | |
'div.wnp_view {', | |
' ' + boxSizing + ': border-box;', | |
' width: 100%; height: 100%;', | |
' margin: -20px 0;', | |
' border: #050608 solid;', | |
' border-width: 20px 0;', | |
' z-index: 0;', | |
'}', | |
'div.wnp_menu {', | |
' ' + boxSizing + ': border-box;', | |
' position: absolute;', | |
' z-index: 0;', | |
' top: 0px;', | |
' right: 0;', | |
' width: 0;', | |
' height: 100%;', | |
' padding: 20px 0;', | |
' border-right: #050608 solid 0px;', | |
' overflow: hidden;', | |
'}', | |
'div.wnp_menu .wnp_menu_slider {', | |
' clear: both;', | |
' width: 15px;', | |
' height: 100%;', | |
' position: absolute;', | |
' top: 0; left: 0;', | |
' background-color: #696969;', | |
' opacity: 0.05;', /*@ 'filter: alpha(opacity=5);', @*/ | |
' z-index: 2;', | |
' cursor: e-resize;', | |
'}', | |
'div.wnp_menu .wnp_menu_slider:hover {', | |
' opacity: 0.6;', /*@ 'filter: alpha(opacity=60);', @*/ | |
'}', | |
'div.wnp_menu_container {', | |
' width: 500%;', | |
' height: 100%;', | |
'}', | |
'div.wnp_menu_content {', | |
' width: 20%;', | |
' height: 100%;', | |
' float: left;', | |
'}', | |
'.wnp_menu_header {', | |
' height: 19px;', | |
' border-bottom: #CCC solid 1px;', | |
' padding: 0 5px 0;', | |
' position: relative;', | |
' z-index: 1;', | |
' overflow: hidden;', | |
' background-color: #5E95FF;', | |
' color: #F0F0F0;', | |
' line-height: 18px;', | |
' font-size: 12px;', | |
' font-weight: bold;', | |
'}', | |
'.wnp_history_header {', | |
' background-color: #EA7DB0;', | |
'}', | |
'.wnp_preference_header {', | |
' background-color: #5DCFA0;', | |
'}', | |
'.wnp_playlist_items {', | |
' ' + boxSizing + ': border-box;', | |
' background-color: #D0DAEF;', | |
' list-style: none;', | |
' height: 100%;', | |
' position: relative;', | |
' z-index: 0;', | |
' overflow: auto;', | |
' border-style: solid;', | |
' border-width: 20px 0 20px;', | |
' margin-top: -20px;', | |
' margin-bottom: -20px;', | |
' border-right: #CCC solid 1px;', | |
'}', | |
'.wnp_menu_footer {', | |
' height: 19px;', | |
' border-top: #CCC solid 1px;', | |
' padding: 0 5px 0 0;', | |
' position: relative;', | |
' z-index: 1;', | |
' overflow: hidden;', | |
' background-color: #E7E7EF;', | |
' color: #000;', | |
' line-height: 18px;', | |
' font-size: 12px;', | |
'}', | |
'.wnp_menu_footer input {', | |
' margin: 0 .2em 0 .5em;', | |
' vertical-align: middle;', | |
'}', | |
'ul.wnp_playlist_items li {', | |
' height: 50px;', | |
' line-height: 24px;', | |
' border: transparent solid;', | |
' border-width: 0 0 0 3px;', | |
' border-bottom: white solid 1px;', | |
' padding: 3px 0 2px;', | |
' overflow: hidden;', | |
backgroundSize + ': 130px auto;', | |
'}', | |
'ul.wnp_playlist_items li div.video_info {', | |
' width: 80px;', | |
' float: left;', | |
'}', | |
'ul.wnp_playlist_items li div.video_info .playmark {', | |
' margin-left: -0.7em;', | |
' margin-right: 3px;', | |
' visibility: hidden;', | |
' color: #3D7FEA;', | |
' font-size: 16px;', | |
'}', | |
'ul.wnp_playlist_items li div.video_info .thumbnail {', | |
' width: 65px;', | |
' height: 50px;', | |
' vertical-align: middle;', | |
'}', | |
'ul.wnp_playlist_items li div.video_desc {', | |
' white-space: nowrap;', | |
' overflow: hidden;', | |
' font-size: 12px;', | |
'}', | |
'ul.wnp_playlist_items li a {', | |
' color: #202923;', | |
' text-decoration: none;', | |
'}', | |
'ul.wnp_playlist_items li a:visited {', | |
' color: #595959;', | |
'}', | |
'ul.wnp_playlist_items li a[href]:hover {', | |
' background-color: #B0D0FF;', | |
'}', | |
'input, button {', | |
' font-size: 12px;', | |
' line-height: 1.1em;', | |
'}', | |
'div.wnp_footer span.wnp_status_bar {', | |
' color: white;', | |
' font-weight: normal;', | |
'}', | |
'div.wnp_player select.mylist {', | |
' margin-left: 5px;', | |
' width: 130px;', | |
'}', | |
'div.wnp_player button.default_button { }', | |
'div.wnp_player img.button { vertical-align: middle; }', | |
'div.wnp_player.playing #WNP_C_PLAY, div.wnp_player.loading #WNP_C_PLAY {', | |
' text-decoration: line-through;', | |
'}', | |
'div.wnp_player .loop {', | |
' color: yellow !important;', | |
'}', | |
'div.wnp_player ul.wnp_playlist_items li.playing {', | |
' background-color: #CAE5FF;', | |
'}', | |
'div.wnp_player ul.wnp_playlist_items li.playing .video_desc {', | |
' font-weight: bold;', | |
'}', | |
'div.wnp_player ul.wnp_playlist_items li.playing .playmark {', | |
' visibility: visible;', | |
'}', | |
'div.wnp_control_panel {', | |
' ' + boxSizing + ': border-box;', | |
' background-color: #050608;', | |
' margin-left: 20px;', | |
' visibility: hidden;', | |
' position: absolute;', | |
' top: 0; left: 0;', | |
' width: 100%;', | |
' height: 20px;', | |
'}', | |
'div.wnp_seekbar {', | |
' float: left;', | |
' width: 45%;', | |
' height: 100%;', | |
' cursor: pointer;', | |
' margin: 0 10px 0 5px;', | |
'}', | |
'div.wnp_seekbar > div {', | |
' width: 100%;', | |
' height: 5px;', | |
' margin-top: 8px;', | |
' background-color: #84AFCF;', | |
'}', | |
'div.wnp_seekbar > div > div {', | |
' height: 100%;', | |
' width: 0;', | |
' background-color: #548FCF;', | |
'}', | |
'div.wnp_volumebar {', | |
' float: left;', | |
' width: 55px;', | |
' height: 100%;', | |
' cursor: pointer;', | |
' margin: 0 10px 0 5px;', | |
' padding: 8px 0;', | |
'}', | |
'div.wnp_volumebar > div {', | |
' width: auto;', | |
' height: 5px;', | |
' background-color: #FFE4E1;', | |
'}', | |
'div.wnp_volumebar > div > div {', | |
' height: 100%;', | |
' width: 0%;', | |
' background-color: #F08080;', | |
'}', | |
'div.wnp_footer div.wnp_control_panel .control {', | |
' font-size: 14px;', | |
' margin: 2px 0.2em 0;', browser.mozilla ? 'font-size: 12px; margin: 0 0.2em; ' : '', | |
' padding: 0;', | |
' visibility: inherit;', | |
'}', | |
'div.wnp_etcbar {', | |
' float: left;', | |
' width: 40%;', | |
' overflow: visible;', | |
' height: 100%;', | |
'}', | |
'span.wnp_button_container {', | |
' float: left;', | |
' width: 20px;', | |
' text-align: right;', | |
'}', | |
/*@ | |
'ul.wnp_playlist_items > li {', | |
' overflow: hidden;', | |
'}', | |
'ul.wnp_playlist_items > li > div {', | |
' position: relative;', | |
'}', | |
'ul.wnp_playlist_items > li > img.wnp_iecover {', | |
' margin-top: -3px;', // [top: 0px] didn't work as iecover. | |
' left: 0;', | |
' cursor: default;', | |
' height: 56px;', | |
'}', | |
'div.wnp_volumebar {', | |
' position: relative;', | |
'}', | |
'div.wnp_volumebar img.wnp_iecover {', | |
' top: 0;', | |
'}', | |
@*/ | |
'ul.wnp_pref_list {', | |
' padding: 5px 0 0 15px; ', | |
' list-style: none;', | |
'}', | |
'ul.wnp_pref_list li {', | |
' padding: 3px; ', | |
' margin-left: 20px; ', | |
' line-height: 1.2; ', | |
' text-indent: -20px; ', | |
' color: #202923; ', | |
'}', | |
'ul.wnp_pref_list li input[type="checkbox"] {', | |
' margin-right: .5em; ', | |
'}', | |
'.wnp_pref_separator {', | |
' margin: 0.5em 10px 0.5em 15px; ', | |
'}', | |
'.alternative_view {', | |
//' box-shadow: 7px 7px 0px 0px rgba(10,10,10,1);', | |
'}', | |
'</style>', | |
new ExtensionPoint('style'), | |
'</head>', | |
'<body>', | |
'<div class="wnp_player" id="WNP_PLAYER">', | |
' <div class="wnp_header" id="WNP_HEADER">', | |
' <div class="header_left">', | |
new ExtensionPoint('playermenu.left.first'), | |
' <button class="control" id="WNP_C_SCREEN" title="' + Lang.COMMAND_View + '">\u25A0</button>', | |
' <button class="control" id="WNP_C_ALWAYS_ON_TOP" title="' + Lang.COMMAND_AlwaysOnTop + '">\u22BF</button>', | |
new ExtensionPoint('playermenu.left.last'), | |
' </div>', | |
' <div class="header_right">', | |
new ExtensionPoint('playermenu.right.first'), | |
' <a class="control" id="WNP_C_PREV" title="' + Lang.COMMAND_PlayPrev + '" href="about:blank"><</a>', | |
' <button class="control" id="WNP_C_PLAY" title="' + Lang.COMMAND_PlayStop + '">\u266A</button>', | |
' <a class="control" id="WNP_C_NEXT" title="' + Lang.COMMAND_PlayNext + '" href="about:blank">></a>', | |
' <button class="control" id="WNP_C_LOOP" title="' + Lang.COMMAND_Loop + '">\u221E</button>', | |
' <a class="control" id="WNP_C_PLAYLIST_URI" title="' + Lang.SAVE_PLAYLIST_USAGE + '" href="about:blank"><img class="button" src="' + Consts.WNP_IMAGE_SAVE + '" alt=""></a>', | |
' <button class="control default_button" id="WNP_C_PLAYLIST" title="' + Lang.COMMAND_Playlist + '">\u25BD</button>', | |
' <button class="control" id="WNP_C_HISTORY" title="' + Lang.COMMAND_History + '">\u25BC</button>', | |
' <button class="control" id="WNP_C_PREFERENCE" title="' + Lang.COMMAND_Preference + '"><img class="button" src="' + Consts.WNP_IMAGE_PREF + '" alt=""></button>', | |
new ExtensionPoint('playermenu.right.last'), | |
' </div>', | |
' </div>', | |
' <div class="wnp_view" id="WNP_VIEW"></div>', | |
' <div class="wnp_footer" id="WNP_FOOTER">', | |
' <button class="control default_button" title="' + Lang.COMMAND_NicoControl + '" id="WNP_C_NICO_MENU">\u25B3</button>', | |
' <span class="wnp_status_bar" id="WNP_STATUS_BAR"></span>', | |
' <div class="wnp_control_panel" id="WNP_CONTROL_PANEL">', | |
' <span class="wnp_button_container"><button class="control" title="' + Lang.COMMAND_Open + '" id="WNP_C_NICO_OPEN"><img src="' + Consts.WNP_IMAGE_OPEN + '"></button></span>', | |
' <span class="wnp_button_container"><button class="control" title="' + Lang.COMMAND_PlayPause + '" id="WNP_C_NICO_PAUSE"><img src="' + Consts.WNP_IMAGE_PLAY + '"></button></span>', | |
' <div class="wnp_seekbar" id="WNP_C_NICO_SEEKBAR" title="' + Lang.CLICK_Seek + '"><div><div id="WNP_C_NICO_SEEKBAR_BAR"></div></div></div>', | |
' <div class="wnp_etcbar">', | |
new ExtensionPoint('controlmenu.right.first'), | |
' <span class="wnp_button_container"><button class="control" id="WNP_C_NICO_MUTE" title="' + Lang.COMMAND_Mute + '">\u03BC</button></span>', | |
' <div class="wnp_volumebar" id="WNP_C_NICO_VOLUMEBAR" title="' + Lang.CLICK_Volume + '"><div><div id="WNP_C_NICO_VOLUMEBAR_BAR"></div></div></div>', | |
' <button class="control" id="WNP_C_NICO_COMM" title="' + Lang.COMMAND_Comment + '">\u24D2</button>', | |
' <button class="control" id="WNP_C_NICO_REPEAT" title="' + Lang.COMMAND_Repeat + '">\u03C3</button>', | |
new ExtensionPoint('controlmenu.right.last'), | |
' </div>', | |
' </div>', | |
' </div>', | |
' <div class="wnp_menu" id="WNP_MENU">', | |
' <div class="wnp_menu_slider" id="WNP_MENU_SLIDER"></div>', | |
' <div class="wnp_menu_container" id="WNP_MENU_CONTAINER">', | |
' <div class="wnp_menu_content" id="WNP_MENU_PLAYLIST">', | |
' <p class="wnp_menu_header">playlist</p>', | |
' <ul class="wnp_playlist_items" id="WNP_PLAYLIST_ITEMS"></ul>', | |
' <p class="wnp_menu_footer">', | |
' <input id="WNP_C_PLAYLIST_STYLE" type="checkbox" title="' + Lang.DESC_SIMPLE_PLAYLIST_VIEW + '"><label for="WNP_C_PLAYLIST_STYLE" title="' + Lang.DESC_SIMPLE_PLAYLIST_VIEW + '">simple</label>', | |
' <input id="WNP_C_REMOVE_ON_FINISH" type="checkbox" title="' + Lang.DESC_REMOVE_ON_FINISH + '"><label for="WNP_C_REMOVE_ON_FINISH" title="' + Lang.DESC_REMOVE_ON_FINISH + '">remove on finish</label>', | |
' <input id="WNP_C_SHUFFLE" type="button" title="' + Lang.COMMAND_Shuffle + '" value="shuffle">', | |
new ExtensionPoint('panels.playlist.menu.last'), | |
' </p>', | |
' </div>', | |
' <div class="wnp_menu_content" id="WNP_MENU_HISTORY">', | |
' <p class="wnp_menu_header wnp_history_header">history</p>', | |
' <ul class="wnp_playlist_items" id="WNP_HISTORY_ITEMS"></ul>', | |
' <p class="wnp_menu_footer">', | |
' <input id="WNP_C_USE_HISTORY" type="checkbox"><label for="WNP_C_USE_HISTORY" title="' + Lang.DESC_USE_HISTORY + '">use history</label>', | |
new ExtensionPoint('panels.history.menu.last'), | |
' </p>', | |
' </div>', | |
' <div class="wnp_menu_content" id="WNP_MENU_PREFERENCE">', | |
' <p class="wnp_menu_header wnp_preference_header">preference</p>', | |
' <div class="wnp_playlist_items" >', | |
' <ul class="wnp_pref_list">', | |
' <li><input id="WNP_C_PREF_PLAYLIST_STYLE" type="checkbox"><label for="WNP_C_PREF_PLAYLIST_STYLE">' + Lang.PREF_SIMPLE_PLAYLIST_VIEW + '</label></li>', | |
' <li><input id="WNP_C_PREF_REMOVE_ON_FINISH" type="checkbox" checked="checked"><label for="WNP_C_PREF_REMOVE_ON_FINISH">' + Lang.PREF_REMOVE_ON_FINISH + '</label></li>', | |
' <li><input id="WNP_C_PREF_USE_HISTORY" type="checkbox" checked="checked"><label for="WNP_C_PREF_USE_HISTORY">' + Lang.PREF_USE_HISTORY + '</label></li>', | |
' <li><input id="WNP_C_PREF_SKIP_DELETED_VIDEO" type="checkbox" checked="checked"><label for="WNP_C_PREF_SKIP_DELETED_VIDEO">' + Lang.PREF_SKIP_DELETED_VIDEO + '</label></li>', | |
' <li><input id="WNP_C_PREF_USE_OFFTIMER" type="checkbox" checked="checked"><label for="WNP_C_PREF_USE_OFFTIMER">' + Lang.PREF_USE_OFFTIMER + '</label> <select id="WNP_C_PREF_OFFTIMER_MINUTE"><option value="10">10<option value="30">30<option value="60" selected="selected">60<option value="120">120</select>' + Lang.PREF_MINUTE + '</li>', | |
' <li><input id="WNP_C_PREF_USE_LOOP_BREAK" type="checkbox" checked="checked"><label for="WNP_C_PREF_USE_LOOP_BREAK">' + Lang.PREF_USE_LOOP_BREAK + '</label> <select id="WNP_C_PREF_LOOP_BREAK_COUNT"><option value="0">0<option value="1">1<option value="2">2<option value="3" selected="selected">3<option value="10">10</select>' + Lang.PREF_COUNT + '</li>', | |
' <li><input id="WNP_C_PREF_CANCEL_JUMP" type="checkbox"><label for="WNP_C_PREF_CANCEL_JUMP">' + Lang.PREF_CANCEL_JUMP + '</label></li>', | |
new ExtensionPoint('panels.preference.normal.last'), | |
' </ul>', | |
' <hr class="wnp_pref_separator">', | |
' <ul class="wnp_pref_list">', | |
' <li><input id="WNP_C_PREF_FORCE_VISIT_ON_OPERA" type="checkbox"><label for="WNP_C_PREF_FORCE_VISIT_ON_OPERA">' + Lang.PREF_FORCE_VISIT_ON_OPERA + '</label></li>', | |
new ExtensionPoint('panels.preference.extend.last'), | |
' </ul>', | |
new ExtensionPoint('panels.preference.last'), | |
' </div>', | |
' <p class="wnp_menu_footer">', | |
' <input id="WNP_C_SET_DEFAULT" type="button" value="default" title="' + Lang.PREF_DEFAULT + '">', | |
new ExtensionPoint('panels.preference.menu.last'), | |
' </p>', | |
' </div>', | |
new ExtensionPoint('panels.last'), | |
' </div>', | |
' </div>', | |
'</div>', | |
'<script type="text/javascript">/*@cc_on //activate Conditional compilation. @*/</script>', | |
'<script type="text/javascript">' + BUILD_FUNC.toString() + '</script>', | |
'<script type="text/javascript">' + BUILD_WNP.toString() + '</script>', | |
'<script type="text/javascript">', | |
' var Consts = (' + toJSON(Consts) + ');', | |
' var Colors = (' + toJSON(Colors) + ');', | |
' var Lang = (' + toJSON(Lang) + ');', | |
' BUILD_FUNC();', | |
' BUILD_WNP();', | |
'</script>', | |
new ExtensionPoint('script'), | |
'</body>', | |
'</html>' | |
]; | |
})(); | |
// Chrome33: force cancel IME after window.open(). | |
if (browser.chrome) { | |
WNP.html.extensions['script'].add('(' + function() { | |
function fuckin_fuckin_bug_yo() { | |
var txt = document.body.appendChild(document.createElement('input')); | |
txt.style.width = txt.style.height = '0'; | |
txt.focus(); | |
setTimeout(function(){ txt.parentNode.removeChild(txt) }, 1); | |
} | |
window.addEventListener('focus', function _f() { | |
window.removeEventListener('focus', _f, false); | |
setTimeout(fuckin_fuckin_bug_yo, 1); | |
}, false); | |
// sometimes fails onfocus. | |
setTimeout(fuckin_fuckin_bug_yo, 2500); | |
}.toString() + ')()'); | |
} | |
WNP.pageStyle = function(pref) { | |
var boxSizing = getValidCssPropertyName('box-sizing'); | |
return [ | |
'.wnp_tooltip {', | |
' width: 168px;', | |
' opacity: 0.4; ', /*@ 'filter:alpha(opacity=40);', @*/ | |
' position: absolute; ', | |
' z-index: 999; ', | |
'}', | |
'.wnp_tooltip:hover {', | |
' opacity: 1; ', /*@ 'filter:alpha(opacity=100);', @*/ | |
'}', | |
'.wnp_tooltip a {', | |
' cursor: pointer;', | |
' display: block;', | |
' width: 54px;', | |
' height: 0;', | |
' line-height: 22px;', | |
' font-family: cursive;', | |
' font-size: 14px;', | |
' font-weight: bold;', | |
' text-align: left;', | |
' text-decoration: none;', | |
' color: #F0F0F0;', | |
' border-style: solid;', | |
' border-width: 15px 0;', /*@ 'border-width: 15px 0 16px;', @*/ | |
' border-top-color: #555;', | |
' border-bottom-color: #000;', | |
' padding: 0;', | |
' float: left;', | |
' margin-right: 2px;', | |
'}', | |
'.wnp_tooltip * span {', | |
' ' + boxSizing + ': border-box;', | |
' border: 1px solid #DDD;', | |
' display: inline-block;', | |
' width: 50px;', /*@ 'width: 48px;', @*/ | |
' height: 24px;', | |
' text-align: center;', | |
' position: absolute;', | |
' top: 0px;', | |
' margin-top: 3px;', | |
' margin-left: 2px;', | |
'}', | |
'.wnp_tooltip a:hover {', | |
' border-top-color: #666;', | |
'}', | |
'.wnp_tooltip a:hover span {', | |
' color: #FFF;', | |
' border-color: #FFF;', | |
'}', | |
'.wnp_tooltip a span:active { padding: 1px 0 0 2px; }', | |
].join('\n'); | |
}; | |
function BUILD_FUNC(T) { | |
if (T == null) T = window; | |
// -- utils -- | |
// browser | |
var browser = { | |
opera : (navigator.appName.indexOf("Opera") >= 0), | |
opera_version: window.opera ? parseFloat(window.opera.version()) : null, | |
mozilla : (navigator.userAgent.indexOf("Gecko/") >= 0), | |
webkit : (navigator.userAgent.indexOf("AppleWebKit/") >= 0), | |
chrome : (navigator.userAgent.indexOf("Chrome/") >= 0), | |
safari : (navigator.userAgent.indexOf("Safari/") >= 0 && navigator.userAgent.indexOf("Chrome/") < 0), | |
macos : (navigator.userAgent.indexOf("Macintosh;") >= 0), | |
ie : (navigator.userAgent.indexOf('msie') >= 0 || navigator.userAgent.indexOf('trident') >= 0), | |
ie_old : /*@!@*/false | |
}; | |
T.browser = browser; | |
var ie = {}; | |
ie.cssStandard = (document.compatMode && document.compatMode == 'CSS1Compat'); | |
ie.clientWidth = (function() { | |
return ie.cssStandard ? function(d) { return (d || document).documentElement.clientWidth } | |
: function(d) { return (d || document).body.clientWidth } | |
})(); | |
ie.clientHeight = (function() { | |
return ie.cssStandard ? function(d) { return (d || document).documentElement.clientHeight } | |
: function(d) { return (d || document).body.clientHeight } | |
})(); | |
ie.window = function(element) { | |
return element.parentWindow || element.ownerDocument.parentWindow || window; | |
}; | |
T.ie = ie; | |
// event. | |
var $e = (function() { | |
if ('addEventListener' in window) return function(element) { return element }; | |
function preventDefault() { this.returnValue = false; } | |
function stopPropagation() { this.cancelBubble = true; } | |
function compat(e, el) { | |
if (!('preventDefault' in e)) e.preventDefault = preventDefault; | |
if (!('stopPropagation' in e)) e.stopPropagation = stopPropagation; | |
if (!('target' in e)) e.target = e.srcElement; | |
if (!('relatedTarget' in e)) e.relatedTarget = (e.srcElement === e.toElement) ? e.fromElement : e.toElement; | |
if (!('currentTarget' in e)) e.currentTarget = el; | |
var d = el.ownerDocument || el.document || el; | |
if (!('pageX' in e)) e.pageX = (d.body.scrollLeft||d.documentElement.scrollLeft) + e.clientX; | |
if (!('pageY' in e)) e.pageY = (d.body.scrollTop ||d.documentElement.scrollTop ) + e.clientY; | |
if (!e.detail && e.wheelDelta) e.detail = -(e.wheelDelta/120)*4; | |
} | |
function indexOf(listeners, a, b, c) { | |
for (var i = 0, len = listeners.length; i < len; i++) { | |
var l = listeners[i]; | |
if (l.a === a && l.b === b && l.c === c) return i; | |
} | |
return -1; | |
} | |
if ('attachEvent' in window) { | |
return function $e(element) { | |
if ('addEventListener' in element) return element; | |
return (function(el) { | |
var listeners = []; | |
el.addEventListener = function(a, b, c) { | |
if (indexOf(listeners, a, b, c) >= 0) return; | |
var f = function(e) { compat(e, el); b.call(el, e); }; | |
el.attachEvent('on' + a, f); | |
listeners.push({ a: a, b: b, c: c, f: f}); | |
}; | |
el.removeEventListener = function(a, b, c) { | |
var index = indexOf(listeners, a, b, c); | |
if (index < 0) return; | |
el.detachEvent('on' + a, listeners[index].f); | |
listeners.splice(index, 1); | |
}; | |
return el; | |
})(element); | |
} | |
} | |
else { | |
return function(el) { | |
if (el.addEventListener) return el; | |
el.addEventListener = el.removeEventListener = function() {}; | |
throw 'Neither "addEventListener" nor "attachEvent" is supported on this browser.'; | |
} | |
} | |
})(); | |
T.$e = $e; | |
/** | |
* IECover (for drag & drop) | |
*/ | |
/*@ | |
var IECover = { | |
STYLE : [ | |
'.wnp_iecover {', | |
' position: absolute;', | |
' width: 100%;', | |
' height: 100%;', | |
' filter: alpha(opacity=0);', | |
'}' | |
].join('\n'), | |
initialize : function() { | |
addStyle(IECover.STYLE); | |
delete IECover.STYLE; | |
delete IECover.initialize; | |
}, | |
putCover: function(element) { | |
if (IECover.initialize) IECover.initialize(); | |
var img = element.ownerDocument.createElement('img'); | |
img.src = Consts.WNP_IMAGE_EMPTY; | |
img.className = 'wnp_iecover'; | |
element.insertBefore(img, element.firstChild); | |
}, | |
process : function(func) { | |
func(); | |
}, | |
processCover : function(element, func) { | |
var cover = element.querySelector('.wnp_iecover'); | |
if (!cover && hasClass(element, 'wnp_iecover')) { | |
cover = element; | |
} | |
if (cover) func(cover); | |
} | |
} | |
T.IECover = IECover; | |
@*/ | |
function cloneObj(obj, target) { | |
var o = target || {}; | |
for (var k in obj) { | |
o[k] = obj[k]; | |
} | |
return o; | |
} | |
T.cloneObj = cloneObj; | |
function isNative(func) { | |
return typeof func == 'function' && /^function\s+\w+\([^)]*?\)\s*\{\s*\[native code\]\s*\}$/.test(func.toString()); | |
} | |
T.isNative = isNative; | |
function uescape(s) { | |
return escape(s).replace(/%([0-9A-F]{2})/g, '\\u00$1').replace(/%u/g, '\\u'); | |
} | |
T.uescape = uescape; | |
function toJSON(o) { | |
if (o == null) return 'null'; | |
var c = o.constructor; | |
if (c === Boolean) return o.toString(); | |
if (c === Number ) return isNaN(o) ? '"NaN"' : !isFinite(o) ? '"Infinity"' : o.toString(10); | |
if (c === String ) return '"' + uescape(o) + '"'; | |
if (c === Array ) { | |
var tmp = []; | |
for (var i = 0; i < o.length; i++) { | |
tmp[i] = toJSON(o[i]); | |
} | |
return '[' + tmp.join(',') + ']'; | |
} | |
if (typeof o == 'object') { | |
var tmp = []; | |
for (var i in o) { | |
if (Object.prototype.hasOwnProperty.call(o, i)) { | |
tmp.push('"' + uescape(i) + '":' + toJSON(o[i])); | |
} | |
} | |
return '{' + tmp.join(',') + '}'; | |
} | |
return '\"' + uescape(o.toString()) + '\"'; | |
} | |
T.toJSON = toJSON; | |
var escapeHTML = (function() { | |
var dv; | |
return function escapeHTML(str, d) { | |
if (dv == null) { | |
dv = (d||document).createElement('div'); | |
setTimeout(function() { dv = null; }, 0); | |
} | |
dv.textContent = /*@ dv.innerText = @*/ str; | |
return dv.innerHTML; | |
}; | |
})(); | |
T.escapeHTML = escapeHTML; | |
function formatNumber(d) { | |
return d.toString().replace(/(\d{1,3})(?=(?:\d\d\d)+$)/g, "$1,"); //http://nanto.asablo.jp/blog/2007/12/07/2479257 | |
}; | |
T.formatNumber = formatNumber; | |
function getAbsolutePosition(el) { | |
var p = el.offsetParent, x = el.offsetLeft, y = el.offsetTop; | |
while (p) { | |
x += p.offsetLeft; y += p.offsetTop; | |
if (!browser.webkit) { x -= p.scrollLeft; y -= p.scrollTop; } | |
p = p.offsetParent; | |
} | |
return { x : x, y : y } | |
} | |
T.getAbsolutePosition = getAbsolutePosition; | |
function hasClass(el, className) { | |
//http://d.hatena.ne.jp/higeorange/20090613/1244821192 | |
return new RegExp('(?:^|\\s)' + className + '(?:\\s|$)').test(el.className); | |
} | |
T.hasClass = hasClass; | |
function appendClass(el, className) { | |
if (!el) return; | |
if (new RegExp('(?:^|\\s)' + className + '\\s*$').test(el.className)) return; | |
removeClass(el, className); | |
el.className += ' ' + className; | |
} | |
T.appendClass = appendClass; | |
function removeClass(el, className) { | |
if (!el) return; | |
var orgClassName = el.className; | |
var newClassName = orgClassName.replace(new RegExp('(?:^|\\s)' + className + '(?:\\s|$)', 'g'), '').replace(/\s+/g, ' ').replace(/^\s|\s$/, ''); | |
if (orgClassName != newClassName) { | |
el.className = newClassName; | |
} | |
} | |
T.removeClass = removeClass; | |
function addStyle(styleStr, doc) { | |
var document = doc || window.document; | |
var style = document.createElement('style'); | |
style.type = 'text/css'; | |
style.style.display = 'none'; | |
if (/*@ !@*/true) { style.textContent = styleStr; } else { style.styleSheet.cssText = styleStr; } | |
document.body.appendChild(style); | |
return style; | |
} | |
T.addStyle = addStyle; | |
function setStyleEnabled(style, enabled) { | |
style.disabled = !enabled; | |
if (style.sheet) style.sheet.disabled = !enabled; // Webkit. | |
} | |
T.setStyleEnabled = setStyleEnabled; | |
function getStyle(element, property, pseudo) { | |
return ( | |
element.currentStyle | |
|| | |
element.ownerDocument.defaultView.getComputedStyle(element, pseudo || '') | |
)[property]; | |
} | |
T.getStyle = getStyle; | |
var getValidCssPropertyName = (function() { | |
function camelize(str) { | |
return str.replace(/-([a-z])/g, function($0,$1) { return $1.toUpperCase() }); | |
} | |
function decamelize(str) { | |
return str.replace( /[A-Z]/g, function($0) { return "-" + $0.toLowerCase() }); | |
} | |
var tmpStyle = null; | |
function getValidCssPropertyName(cssProp, forJS) { | |
if (!cssProp) return ''; | |
if (cssProp == 'float') { | |
if (!forJS) return 'float'; | |
else return 'cssFloat'/*@cc_on && 'styleFloat' @*/; | |
} | |
var style = tmpStyle; | |
if (style == null) { | |
style = tmpStyle = document.createElement('div').style; | |
setTimeout(function() { tmpStyle = null; }, 0); | |
} | |
var jsname = camelize(cssProp); | |
if (jsname in style) return forJS ? jsname : decamelize(cssProp); | |
jsname = jsname.charAt(0).toUpperCase() + jsname.slice(1); | |
if (( 'O' + jsname) in style) return forJS ? ('O' + jsname) : ('-o-' + decamelize(cssProp)); | |
if (( 'Moz' + jsname) in style) return forJS ? ('Moz' + jsname) : ('-moz-' + decamelize(cssProp)); | |
if (('Webkit' + jsname) in style) return forJS ? ('Webkit' + jsname) : ('-webkit-' + decamelize(cssProp)); | |
postError('unknown css property. cssProp:[' + cssProp + ']'); | |
return ''; | |
} | |
return getValidCssPropertyName; | |
})(); | |
T.getValidCssPropertyName = getValidCssPropertyName; | |
function $XS(xpath, context) { | |
var doc = (context && context.ownerDocument) || (context && context.evaluate && context) || document; | |
return doc.evaluate(xpath,context||doc,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue; | |
} | |
T.$XS = $XS; | |
function replace (x, y) { | |
if (!y || x === y) { | |
var p = x.parentNode; | |
var n = x.nextSibling; | |
p.removeChild(x); | |
p.insertBefore(x, n); | |
} | |
else { | |
x.parentNode.replaceChild(y, x); | |
} | |
} | |
T.replace = replace; | |
var indexOf = (function() { | |
if (Array.prototype.indexOf) { | |
return function indexOf(array, element) { | |
return array.indexOf(element); | |
} | |
} | |
else { | |
return function indexOf(array, element) { | |
for (var i = 0, len = array.length; i < len; i++) { | |
if (element === array[i]) return i; | |
} | |
return -1; | |
} | |
} | |
})(); | |
T.indexOf = indexOf; | |
var lastIndexOf = (function() { | |
if (Array.prototype.lastIndexOf) { | |
return function lastIndexOf(array, element) { | |
return array.lastIndexOf(element); | |
} | |
} | |
else { | |
return function lastIndexOf(array, element) { | |
for (var i = array.length - 1; i >= 0; i--) { | |
if (element === array[i]) return i; | |
} | |
return -1; | |
} | |
} | |
})(); | |
T.lastIndexOf = lastIndexOf; | |
function getVideoTitleFromLink(a) { | |
var title = ''; | |
// process text link only. | |
if (a && !/<script|<img/i.test(a.innerHTML)) { | |
title = (a.textContent/*@ || a.innerText @*/ || '').replace(/^\s+|\s+$/g, '').replace(/^\u8996\u8074\u3059\u308B$/, ''); | |
} | |
return title; | |
} | |
T.getVideoTitleFromLink = getVideoTitleFromLink; | |
function findVideoTitle(a) { | |
var title = getVideoTitleFromLink(a); | |
if (!title) { | |
var img = a.getElementsByTagName('img')[0]; | |
if (img) title = img.alt || ''; | |
} | |
if (!title) { | |
var videoid = a.href.replace(/.*?watch\/(\w+).*/, '$1'); | |
var an = a.ownerDocument.querySelectorAll ? a.ownerDocument.querySelectorAll('a[href]') : a.ownerDocument.getElementsByTagName('a'); | |
var regHref = new RegExp('(?:watch/|cc_video_id=|video_id=|cc_id=)' + videoid + '(?:[?#&]|$)'); | |
for (var i = 0, len = an.length; i < len; i++) { | |
var aa = an[i]; | |
if (regHref.test(aa.getAttribute('href'))) { | |
title = getVideoTitleFromLink(aa); | |
if (title) break; | |
} | |
} | |
} | |
return title; | |
} | |
T.findVideoTitle = findVideoTitle; | |
function getCanonicalVideoURL(a) { | |
var baseURL = 'http://www.nicovideo.jp/watch/'; | |
var m; | |
var videoid; | |
if (m = /http:\/\/www\.nicovideo\.jp\/watch\/(\w+)/.exec(a.href)) { | |
videoid = m[1]; | |
} | |
else if (m = /http:\/\/rd\.nicovideo\.jp\/cc\/.*\/([a-z]{2}?\d+|\d{10})(?:[?#]|$)/.exec(a.href)) { | |
videoid = m[1]; | |
} | |
else if (m = /http:\/\/rd\.nicovideo\.jp\/cc\/.*[?&](?:cc_video_id|video_id|cc_id)=((?:[a-z]{2})?\d+)/.exec(a.href)) { | |
videoid = m[1]; | |
} | |
// skip niconama. | |
if (videoid && videoid.lastIndexOf('lv', 0) != 0) { | |
return baseURL + videoid; | |
} | |
return null; | |
} | |
T.getCanonicalVideoURL = getCanonicalVideoURL; | |
function createPlayInfo(el) { | |
var an = el.getElementsByTagName('a'); | |
if (an.length == 0 && el.nodeName == 'A') { | |
an = [el]; | |
} | |
var items = [], | |
video = {}, | |
title = {}, | |
image = {}; | |
for (var i = 0; i < an.length; i++) { | |
var a = an[i]; | |
if (a != el && /\bnofollow\b/.test(a.getAttribute('rel'))) continue; | |
var m; | |
if (m = /(http:\/\/www\.nicovideo\.jp\/watch\/(\w+))/.exec(getCanonicalVideoURL(a))) { | |
var videoid = m[2]; | |
if (!video[videoid]) { | |
items.push(videoid); | |
video[videoid] = m[1]; | |
} | |
if (/<script/i.test(a.innerHTML)) continue; | |
var img = a.getElementsByTagName('img')[0]; | |
if (img && /\/(_\.gif|noimage\.png)$/.test(img.src)) continue; // lazyimage. | |
if (img) { | |
title[videoid] = title[videoid] || img.alt; | |
image[videoid] = image[videoid] || img.src; | |
} | |
if (!title[videoid]) { | |
title[videoid] = getVideoTitleFromLink(a); | |
} | |
} | |
} | |
return { items: items, video: video, title: title, image: image } | |
} | |
T.createPlayInfo = createPlayInfo; | |
function createVideoInfo(playInfo, index) { | |
var videoid = playInfo.items[index || 0]; | |
return { | |
id : videoid, | |
url : playInfo.video ? playInfo.video[videoid] : null, | |
title : playInfo.title ? playInfo.title[videoid] : null, | |
thumbnail : playInfo.image ? playInfo.image[videoid] : null | |
}; | |
} | |
T.createVideoInfo = createVideoInfo; | |
function createPlayInfoFromUrl(url, callback) { | |
var loader = document.createElement('iframe'); | |
loader.src = url; | |
loader.style.display = 'none'; | |
$e(loader).addEventListener('load', function() { | |
var playlist = createPlayInfo(loader.contentWindow.document.documentElement); | |
loader.parentNode.removeChild(loader); | |
callback(playlist); | |
}, false); | |
document.getElementsByTagName('body')[0].appendChild(loader); | |
} | |
T.createPlayInfoFromUrl = createPlayInfoFromUrl; | |
function createVideoInfoFromUrl(url_or_id) { | |
var m = /((?:[a-z]{2})?\d+)([?#].*)?$/.exec(url_or_id); | |
if (!m) return null; | |
var video_id = m[1]; | |
return { | |
id : video_id, | |
url : 'http://www.nicovideo.jp/watch/' + video_id, | |
title : null, | |
thumbnail : 'http://tn-skr2.smilevideo.jp/smile?i=' + video_id.slice(2) | |
}; | |
} | |
T.createVideoInfoFromUrl = createVideoInfoFromUrl; | |
var makeNicoLinks = (function() { | |
var makeNicoReg = /(https?:\/\/[-_.!~*()a-zA-Z0-9;\/?:@&=+$,%#]+)|\b([a-z]{2}\d+)|(mylist\/\d+)|(^|\D)(\d{10})(?!\d)/mg; | |
return function makeNicoLinks(str) { | |
return str.replace(makeNicoReg, function(str, $1, $2, $3, $4, $5){ | |
if ($1) return ' <a href="' + $1 + '" target="_blank">' + $1 + '</a> '; | |
if ($2) { | |
if ($2 == 'mp3') return $2; | |
var co = $2.substring(0, 2) == 'co'; | |
if (co) return ' <a href="http://com.nicovideo.jp/community/' + $2 + '" target="_blank">'+ $2 + '</a> '; | |
else return ' <a href="http://www.nicovideo.jp/watch/' + $2 + '" target="_blank">'+ $2 + '</a> '; | |
} | |
if ($3) return ' <a href="http://www.nicovideo.jp/' + $3 + '" target="_blank">'+ $3 + '</a> '; | |
if ($5) return $4 + ' <a href="http://www.nicovideo.jp/watch/' + $5 + '" target="_blank">'+ $5 + '</a> '; | |
}); | |
}; | |
})(); | |
T.makeNicoLinks = makeNicoLinks; | |
function createPlayInfoFromText(text) { | |
var dv = document.createElement('div'); | |
if (text.indexOf('>') > 0) { | |
dv.innerHTML = text.replace(/<script(?:[ \t\r\n][^>]*)?>[\S\s]*?<\/script[ \t\r\n]*>|<\/?(?:i?frame|html|script|object)(?:[ \t\r\n][^<>]*)?>/gi, ' '); // from oAutoPagerize. | |
} | |
else { | |
dv.innerHTML = makeNicoLinks(text); | |
} | |
return createPlayInfo(dv); | |
} | |
T.createPlayInfoFromText = createPlayInfoFromText; | |
function extend(d, s) { | |
for (var p in s) d[p] = s[p]; | |
return d; | |
} | |
T.extend = extend; | |
function postError(e) { | |
if (window.opera) opera.postError(e); | |
else if (window.console) { | |
if (e.name != null && e.message != null) { | |
console.error('[Error:\nname: ' + e.name + '\nmessage: ' + e.message + '\n]'); | |
} | |
else { | |
console.error(e); | |
} | |
} | |
} | |
T.postError = postError; | |
/** | |
* EventDispatcher | |
* @see http://www.fladdict.net/blog-jp/archives/2005/06/javascript.php | |
* @see http://www.adobe.com/support/documentation/jp/flex/1/mixin/mixin3.html | |
*/ | |
var EventDispatcher = function() {}; | |
(function() { | |
var ec = '__ed_eventContainer'; | |
EventDispatcher.prototype.addEventListener = function(type, listener) { | |
if (this[ec] == null) this[ec] = new Object(); | |
if (this[ec][type] == null) this[ec][type] = new Array(); | |
this.removeEventListener(type, listener); | |
this[ec][type].push(listener); | |
}; | |
EventDispatcher.prototype.removeEventListener = function(type, listener) { | |
if (this[ec] == null || this[ec][type] == null) return; | |
var listeners = this[ec][type]; | |
for (var i = listeners.length - 1; i >= 0; i--) { | |
if ((listeners[i] === listener) ? listeners.splice(i, 1) : false) break; | |
} | |
}; | |
EventDispatcher.prototype.dispatchEvent = function(event) { | |
if (this[ec] == null || this[ec][event.type] == null) return; | |
if (event.target == null) event.target = this; | |
var listeners = this[ec][event.type]; | |
for (var i = 0, len = listeners.length; i < len; i++) { | |
try { | |
var l = listeners[i]; | |
if (typeof(l) == 'function') l.call(this, event); | |
else new Function(l).call(this, event); | |
} | |
catch(e) { | |
postError(e); | |
} | |
} | |
}; | |
})(); | |
EventDispatcher.initialize = function(obj) { | |
extend(obj, EventDispatcher.prototype); | |
}; | |
T.EventDispatcher = EventDispatcher; | |
/** | |
* class ListElementIterator | |
*/ | |
function ListElementIterator(listElement) { | |
this.initialize.apply(this, arguments); | |
} | |
ListElementIterator.prototype = { | |
initialize : function(listElement) { | |
this.listElement = listElement; | |
this.item = null; | |
}, | |
count : function() { | |
var n = 0, childs = this.listElement.childNodes; | |
for (var i = 0, len = childs.length; i < len; i++) { | |
if (childs[i].nodeType == 1) n++; | |
} | |
return n; | |
}, | |
indexOf : function(item) { | |
var n = 0, childs = this.listElement.childNodes; | |
for (var i = 0, len = childs.length; i < len; i++) { | |
if (childs[i].nodeType == 1) { | |
if (childs[i] === item) return n; | |
n++; | |
} | |
} | |
return -1; | |
}, | |
current : function(item) { | |
if (item && item.parentNode != this.listElement) throw 'illegal argument.'; | |
if (arguments.length > 0) this.item = item; | |
return this; | |
}, | |
first : function() { | |
var c = this.listElement.firstChild; | |
while (c && c.nodeType != 1) { c = c.nextSibling }; | |
return this.current(c); | |
}, | |
last : function() { | |
var c = this.listElement.lastChild; | |
while (c && c.nodeType != 1) { c = c.previousSibling }; | |
return this.current(c); | |
}, | |
index : function(index) { | |
var n = 0, c = this.listElement.firstChild; | |
while (c) { | |
if (c.nodeType == 1) { | |
if (n == index) break; | |
n++; | |
} | |
c = c.nextSibling; | |
} | |
return this.current(c); | |
}, | |
next : function(item) { | |
var c = item || this.item; | |
if (c) do { c = c.nextSibling } while (c && c.nodeType != 1); | |
return this.current(c); | |
}, | |
prev : function(item) { | |
var c = item || this.item; | |
if (c) do { c = c.previousSibling } while (c && c.nodeType != 1); | |
return this.current(c); | |
}, | |
isNullThenFirst : function() { | |
if (this.item == null) this.first(); | |
return this; | |
}, | |
isNullThenLast : function() { | |
if (this.item == null) this.last(); | |
return this; | |
} | |
}; | |
T.ListElementIterator = ListElementIterator; | |
/** | |
* class Soar | |
* increase(decrease) target's property value rapidly. | |
* -- public fields -- * | |
* [constructor] | |
* object - target object. | |
* option - (optional) | |
* dualation soaring time. | |
* delay soaring interval time. | |
* coe soaring ratio (0-1). | |
* [method] | |
* from(attr) - initial property values. | |
* to(attr) - last property values. | |
* go() - begin soaring. | |
* cancel() - cancel soaring. | |
* [propety] | |
* [event] | |
* finish - finish soaring. | |
* ------------------- * | |
* -- examples ------- * | |
* 1. | |
* var soar = new Soar(div); | |
* soar.to({scrollTop: 100}); | |
* soar.go(); | |
* 2. | |
* new Soar(div.style).from({width:'100px'}).to({width:'200px'}).go(); | |
* new Soar(div.style).from({marginLeft:'0'}).to({marginLeft:'-100.0%'}).go(); | |
*/ | |
function Soar(object, option) { | |
this.object = object; | |
var o = option || {}; | |
this.duration = o.duration || 500; | |
this.delay = o.delay || 10; | |
this.coe = (o.coe != null) ? o.coe : 0.15; | |
} | |
EventDispatcher.initialize(Soar.prototype); | |
Soar.prototype.from = function(attr) { | |
this._from = attr; | |
return this; | |
}; | |
Soar.prototype.to = function(attr) { | |
this._to = attr; | |
return this; | |
} | |
Soar.prototype.go = function (win) { | |
this.cancel(); | |
var obj = this.object; | |
this.window = win || (obj.ownerDocument ? (obj.ownerDocument.defaultView/*@ || ie.window(obj) @*/) : null) || window; | |
for (var p in this._from) { | |
obj[p] = this._from[p]; | |
} | |
var target = []; | |
for (var p in this._to) { | |
var start = parseFloat(obj[p]) || 0; | |
var m = /(-?[0-9]+\.?([0-9]*))(.*)/.exec(this._to[p]); | |
var dest = parseFloat(m[1]); | |
var scale = m[2].length; | |
var unit = m[3] || /[^0-9]*$/.exec(obj[p]); | |
target.push({ prop: p, cur: start, dest: dest, scale: scale, unit: unit }); | |
} | |
var n = Math.ceil(this.duration / this.delay); | |
var self = this; | |
var startTime = new Date().getTime(); | |
self.tid = this.window.setTimeout(function() { | |
var now = new Date().getTime(); | |
var nn = (self.duration - (now - startTime)) / self.delay; | |
while (n > nn && n > 0) { | |
for (var i = 0, len = target.length; i < len; i++) { | |
var t = target[i]; | |
t.cur = t.cur + (t.dest - t.cur) * (1/n + (1-1/n) * self.coe); | |
} | |
n--; | |
} | |
var finishCount = 0; | |
for (var i = 0, len = target.length; i < len; i++) { | |
var t = target[i]; | |
var next = t.cur.toFixed(t.scale); | |
obj[t.prop] = next + t.unit; | |
if (next == t.dest) finishCount++; | |
} | |
if (finishCount != target.length && n > 0) { | |
self.tid = self.window.setTimeout(arguments.callee, self.delay); | |
} | |
else { | |
self.isActive = false; | |
self.dispatchEvent({ type: 'finish' }); | |
} | |
}, 0); | |
this.isActive = true; | |
} | |
Soar.prototype.cancel = function() { | |
if (this.isActive) { | |
this.window.clearTimeout(this.tid); | |
this.isActive = false; | |
} | |
this._from = null; | |
return this; | |
} | |
T.Soar = Soar; | |
/// class iMarquee - very easy marquee impl. | |
function iMarquee(element) { | |
this.ele = element; | |
this.allowance = 20; | |
this.delay = 16; | |
this.step = 1; | |
this.restart = 2500; | |
} | |
(function(member) { member.apply(iMarquee.prototype) })(function() { | |
this.go = function(firstDelay) { | |
var self = this; | |
var tid = setTimeout(function() { | |
var dist = self.ele.offsetWidth + self.allowance; | |
var cur = parseFloat(self.ele.style.marginLeft) || 0; | |
(function run() { | |
cur += self.step; | |
if (cur <= dist) { | |
self.ele.style.marginLeft = -cur + 'px'; | |
tid = setTimeout(run, self.delay); | |
} | |
else { | |
self.restore(); | |
if (self.restart >= 0) self.go(self.restart); | |
} | |
})(); | |
}, firstDelay || 800); | |
this.activity = { | |
restore: function() { | |
clearTimeout(tid); | |
self.ele.style.marginLeft = ''; | |
} | |
}; | |
}; | |
this.restore = function() { | |
if (this.activity) { | |
this.activity.restore(); | |
this.activity = null; | |
} | |
}; | |
}); | |
T.iMarquee = iMarquee; | |
/** | |
* class ListUtil | |
* append useful features to list element. | |
* -- public fields -- * | |
* [constructor] | |
* listElement - target element. | |
* [method] | |
* select(item) - select item. | |
* cancel() - cancel drag. | |
* getSelectedItems() - get selected items. | |
* [propety] | |
* hoverColor - hover item's background-color. | |
* draggingColor - dragging item's background-color. | |
* selectedColor - selected item's background-color. | |
* [event] | |
* selectioncanged - fire event when select item. | |
* itemover - fire event when mouseover item(except dragging). | |
* itemout - fire event when mouseout item(except dragging). | |
* dragstart - fire event when drag start. | |
* dragging - fire event when dragging. | |
* dragover - fire event when drag over other draggable element. | |
* dragend - fire event when drag end. | |
* dragcancel - fire event when drag cancel. | |
* ------------------- * | |
*/ | |
function ListUtil() { | |
this.initialize.apply(this, arguments); | |
} | |
EventDispatcher.initialize(ListUtil.prototype); | |
ListUtil.prototype.initialize = function(listElement) { | |
this.listElement = listElement; | |
this.initEvents(); | |
this.hoverColor = '#D7EBFF'; | |
this.draggingColor = '#FFCCCC'; | |
this.selectedColor = '#B4DAFF'; | |
this.current = { | |
selectedItems : [], | |
isMouseDown : false, | |
mouseDownItem : null, | |
mouseDownPoint : null, | |
isDragging : false, | |
dragTargetItem : null, | |
dragTargetImage : null, | |
dropTargetItem : null, | |
hoveringItem : null | |
}; | |
}; | |
ListUtil.prototype.select = function(element, option) { | |
var opt = option || {}; | |
var items = this.current.selectedItems; | |
for (var i = 0, len = items.length; i < len; i++) { | |
var item = items[i]; | |
item.style.backgroundColor = ''; | |
if (item === this.current.hoveringItem) { | |
item.style.backgroundColor = this.hoverColor; | |
} | |
} | |
if (element) { | |
this.current.selectedItems = getSelection.call(this, element); | |
var items = this.current.selectedItems; | |
for (var i = 0, len = items.length; i < len; i++) { | |
var item = items[i]; | |
item.style.backgroundColor = this.selectedColor; | |
} | |
} | |
if (option) { // call from outer. | |
this.dispatchEvent({ type: 'selectioncanged', lastSelectedItem: (this.current.selectedItems.length > 0 ? this.current.lastSelectedItem : null) }); | |
} | |
function getSelection(element) { | |
// if no modifyer key pressed, select exclusive. | |
if (!opt.ctrl && !opt.shift) { | |
this.current.lastSelectedItem = element; | |
return [element]; | |
} | |
// toggle select. | |
if (opt.ctrl && !opt.shift) { | |
var next = cleanupSelection.call(this); | |
var li = lastIndexOf(next, element); | |
if (li < 0) next.push(element); | |
else next.splice(li, 1); | |
this.current.lastSelectedItem = element; | |
return next; | |
} | |
// range select | |
if (opt.shift) { | |
var lastSelectedItem = this.current.lastSelectedItem; | |
if (!lastSelectedItem || lastSelectedItem === element) { | |
return [element]; | |
} | |
var items = (opt.ctrl ? cleanupSelection.call(this) : []); | |
var next = items.concat(); | |
var itr = new ListElementIterator(this.listElement).first(); | |
var inRange = false, isEdge = false; | |
while (itr.item) { | |
var item = itr.item; | |
if (item == lastSelectedItem || item == element) { | |
isEdge = true; inRange = !inRange; | |
} | |
else { | |
isEdge = false; | |
} | |
if (inRange || isEdge) { | |
if (lastIndexOf(items, item) < 0) next.push(item); | |
} | |
itr.next(); | |
} | |
return next; | |
} | |
} | |
function cleanupSelection() { | |
var next = []; | |
var items = this.current.selectedItems; | |
for (var i = 0, len = items.length; i < len; i++) { | |
var item = items[i]; | |
if (item && item.parentNode === this.listElement) next.push(item); | |
} | |
return next; | |
}; | |
}; | |
ListUtil.prototype.selectAll = function() { | |
var itr = new ListElementIterator(this.listElement).first(); | |
var items = []; | |
while (itr.item) { | |
var item = itr.item; | |
items.push(item); | |
item.style.backgroundColor = this.selectedColor; | |
itr.next(); | |
} | |
this.current.selectedItems = items; | |
this.dispatchEvent({ type: 'selectioncanged', lastSelectedItem: this.current.selectedItems[0] }); | |
}; | |
ListUtil.prototype.isSelectedItem = function(element) { | |
var items = this.current.selectedItems; | |
for (var i = 0, len = items.length; i < len; i++) { | |
if (items[i] === element) return true; | |
} | |
return false; | |
}; | |
ListUtil.prototype.getSelectedItems = function() { | |
var next = []; | |
var items = this.current.selectedItems; | |
for (var i = 0, len = items.length; i < len; i++) { | |
var item = items[i]; | |
if (item && item.parentNode === this.listElement) next.push(item); | |
} | |
this.current.selectedItems = next; | |
if (next.length <= 1) return next.concat(); | |
// sort. (slow?) | |
var next = []; | |
var items = this.current.selectedItems; | |
var itr = new ListElementIterator(this.listElement).first(); | |
while (itr.item) { | |
if (indexOf(items, itr.item) >= 0) next.push(itr.item); | |
itr.next(); | |
} | |
this.current.selectedItems = next; | |
return next.concat(); | |
}; | |
ListUtil.prototype.itemOver = function(element) { | |
if (!this.isSelectedItem(element)) { | |
element.style.backgroundColor = this.hoverColor; | |
} | |
this.dispatchEvent({ type: 'itemover', item: element }); | |
}; | |
ListUtil.prototype.itemOut = function(element) { | |
if (this.isSelectedItem(element)) return; | |
element.style.backgroundColor = ''; | |
this.dispatchEvent({ type: 'itemout', item: element }); | |
}; | |
ListUtil.prototype.dragStart = function(element) { | |
if (this.current.dragTargetItem) { | |
this.current.dragTargetItem.style.backgroundColor = ''; | |
} | |
if (this.current.dropTargetItem) { | |
this.current.dropTargetItem.style.background = ''; | |
} | |
this.current.dragTargetItem = element; | |
this.current.dragTargetItem.style.backgroundColor = this.draggingColor; | |
this.current.dragTargetImage = this.current.dragTargetItem.querySelector('img.thumbnail').src; | |
this.listElement.style.cursor = 'move'; | |
// deselect Text. | |
if (typeof getSelection == 'function') { | |
var selection = getSelection(); | |
if (selection && typeof selection.removeAllRanges == 'function') { | |
selection.removeAllRanges(); | |
} | |
} | |
/*@ | |
document.selection.empty(); | |
IECover.processCover(this.current.dragTargetItem, function(cover) { | |
cover.style.cursor = 'move'; | |
}); @*/ | |
this.dispatchEvent({ type: 'dragstart' }); | |
}; | |
ListUtil.prototype.dragging = function() { | |
this.dispatchEvent({ type: 'dragging' }); | |
}; | |
ListUtil.prototype.dragOver = function(element) { | |
if (this.current.dropTargetItem && this.current.dropTargetItem !== this.current.dragTargetItem) { | |
this.current.dropTargetItem.style.backgroundImage = ''; | |
this.current.dropTargetItem.style.backgroundPosition = ''; | |
this.current.dropTargetItem.style.backgroundRepeat = ''; | |
} | |
this.current.dropTargetItem = element; | |
if (this.current.dropTargetItem !== this.current.dragTargetItem) { | |
this.current.dropTargetItem.style.backgroundImage = 'url("' + this.current.dragTargetImage + '")'; | |
this.current.dropTargetItem.style.backgroundPosition = 'center top'; | |
this.current.dropTargetItem.style.backgroundRepeat = 'no-repeat'; | |
} | |
this.dispatchEvent({ type: 'dragover', item: element }); | |
}; | |
ListUtil.prototype.dragEnd = function() { | |
var element = this.current.dragTargetItem; | |
this.current.dragTargetItem.style.backgroundColor = this.selectedColor; | |
if (this.current.dropTargetItem) { | |
if (this.current.dropTargetItem !== this.current.dragTargetItem) { | |
var document = this.listElement.ownerDocument; | |
for (var p = this.current.dropTargetItem; p && p !== this.current.dragTargetItem; p = p.previousSibling); | |
var downTo = !!p; | |
var items = this.getSelectedItems(); | |
var dropPlace; | |
if (indexOf(items, this.current.dropTargetItem) < 0) { | |
this.current.dropTargetItem.style.background = ''; | |
dropPlace = this.current.dropTargetItem; | |
} | |
else { | |
this.current.dropTargetItem.style.background = this.selectedColor; | |
dropPlace = document.createTextNode(''); | |
this.listElement.insertBefore(dropPlace, this.current.dropTargetItem); | |
} | |
var df = document.createDocumentFragment(); | |
for (var i = 0; i < items.length; i++) { | |
df.appendChild(items[i]); | |
} | |
this.listElement.insertBefore(df, downTo ? dropPlace.nextSibling : dropPlace); | |
if (dropPlace.nodeType == 3) dropPlace.parentNode.removeChild(dropPlace); | |
} | |
this.current.dropTargetItem = null; | |
} | |
this.current.dragTargetItem = null; | |
this.listElement.style.cursor = ''; | |
/*@ | |
IECover.processCover(element, function(cover) { | |
cover.style.cursor = ''; | |
}); @*/ | |
this.dispatchEvent({ type: 'dragend', item: element }); | |
}; | |
ListUtil.prototype.dragCancel = function() { | |
var element = this.current.dragTargetItem; | |
if (this.current.dropTargetItem) { | |
this.current.dropTargetItem.style.background = ''; | |
this.current.dropTargetItem = null; | |
} | |
this.current.dragTargetItem.style.backgroundColor = this.selectedColor; | |
this.current.dragTargetItem = null; | |
this.listElement.style.cursor = ''; | |
/*@ | |
IECover.processCover(element, function(cover) { | |
cover.style.cursor = ''; | |
}); @*/ | |
this.dispatchEvent({ type: 'dragcancel' }); | |
}; | |
ListUtil.prototype.createProxy = function(el) { | |
var proxy = el.cloneNode(true); | |
proxy.removeAttribute('id'); | |
var an = proxy.getElementsByTagName('a'); | |
for (var i = 0, len = an.length; i < len; i++) { | |
an[i].removeAttribute('href'); | |
} | |
return proxy; | |
}; | |
ListUtil.prototype.cancel = function() { | |
if (!this.current.isDragging) return; | |
this.current.isDragging = false; | |
this.scrollingCancel(); | |
this.dragCancel(); | |
}; | |
ListUtil.prototype.initEvents = function() { | |
var document = this.listElement.ownerDocument; | |
var window = document.defaultView/*@ || ie.window(document) @*/; | |
var self = this; | |
var scrollTid = null; | |
var direction = null; | |
var range = 60; | |
this.scrollingCancel = function() { | |
if (scrollTid) { | |
window.clearInterval(scrollTid); | |
scrollTid = direction = null; | |
} | |
}; | |
$e(document).addEventListener('keydown', this.event_keydown = function(e) { | |
if (e.keyCode === 27) { | |
self.current.isMouseDown = false; | |
self.current.mouseDownItem = null; | |
self.current.mouseDownPoint = null; | |
self.cancel(); | |
} | |
if (e.ctrlKey && String.fromCharCode(e.keyCode || e.charCode).toLowerCase() == 'a') { | |
if (getStyle(self.listElement, 'visibility') == 'hidden' || getStyle(self.listElement, 'display') == 'none') { | |
return; | |
} | |
self.selectAll(); | |
} | |
}, false); | |
$e(document).addEventListener('mouseup', this.event_document_mouseup = function(e) { | |
self.current.isMouseDown = false; | |
self.scrollingCancel(); | |
if (self.current.isDragging) { | |
self.current.isDragging = false; | |
var pos = getAbsolutePosition(self.listElement); | |
pos.x += self.listElement.clientLeft; | |
pos.y += self.listElement.clientTop; | |
if (e.clientX >= pos.x && e.clientX <= (pos.x + self.listElement.clientWidth) && e.clientY >= pos.y && e.clientY <= (pos.y + self.listElement.clientHeight)) { | |
self.dragEnd(); | |
} | |
else { | |
self.dragCancel(); | |
} | |
} | |
if (self.current.keyupSelect) { | |
self.current.keyupSelect = false; | |
self.select(self.current.mouseDownItem, { ctrl : false, shift : false }); | |
} | |
self.current.mouseDownItem = null; | |
self.current.mouseDownPoint = null; | |
}, false); | |
$e(document).addEventListener('mousemove', this.event_document_mousemove = function(e) { | |
if (!self.current.isDragging && self.current.isMouseDown && self.current.mouseDownItem) { | |
var point = self.current.mouseDownPoint; | |
var r = 2; | |
if (e.pageX < point.x - r || e.pageX > point.x + r || e.pageY < point.y - r || e.pageY > point.y + r) { | |
self.current.isDragging = true; | |
self.dragStart(self.current.mouseDownItem); | |
self.current.keyupSelect = false; | |
} | |
} | |
if (self.current.isDragging) { | |
e.preventDefault(); | |
if (e.clientY < (self.listElement.offsetTop + 25)) { | |
// scroll up | |
var sub = (self.listElement.offsetTop + 25) - e.clientY; | |
range = 50 * (Math.ceil(sub/20)); | |
if (scrollTid && direction != 1) { | |
window.clearInterval(scrollTid); | |
} | |
if (direction != 1) { | |
direction = 1; | |
scrollTid = window.setInterval(function() { | |
self.listElement.scrollTop -= range; | |
}, 100); | |
} | |
} | |
else if (e.clientY > (self.listElement.offsetTop + self.listElement.offsetHeight - 25)) { | |
// scroll down | |
var sub = e.clientY - (self.listElement.offsetTop + self.listElement.offsetHeight - 25); | |
range = 50 * (Math.ceil(sub/20)); | |
if (scrollTid && direction != 2) { | |
window.clearInterval(scrollTid); | |
} | |
if (direction != 2) { | |
direction = 2; | |
scrollTid = window.setInterval(function() { | |
self.listElement.scrollTop += range; | |
}, 100); | |
} | |
} | |
else { | |
self.scrollingCancel(); | |
} | |
self.dragging(); | |
} | |
}, false); | |
$e(this.listElement).addEventListener('mousedown', this.event_element_mousedown = function(e) { | |
if (e.target === e.currentTarget) return; | |
var item = e.target; | |
while (item.parentNode !== e.currentTarget) item = item.parentNode; | |
self.current.isMouseDown = true; | |
e.preventDefault(); | |
self.current.mouseDownItem = item; | |
self.current.mouseDownPoint = { x: e.pageX, y: e.pageY }; | |
if (self.current.selectedItems.length > 1 && !e.ctrlKey && !e.shiftKey && self.isSelectedItem(item)) { | |
self.current.keyupSelect = true; | |
} | |
else { | |
self.select(item, { ctrl : e.ctrlKey, shift : e.shiftKey }); | |
} | |
}, false); | |
$e(this.listElement).addEventListener('mouseover', this.event_element_mouseover = function(e) { | |
if (!self.current.isDragging) { | |
// disable mousedown event on an inline element. (and enable link drag on Opera) | |
if (e.target === e.currentTarget || /^(a|span|img|input|select|button|object|embed|iframe)$/i.test(e.target.nodeName)) { | |
$e(self.listElement).removeEventListener('mousedown', self.event_element_mousedown, false); | |
} | |
else { | |
$e(self.listElement).addEventListener('mousedown', self.event_element_mousedown, false); | |
} | |
/*@ | |
IECover.processCover(e.target, function(cover) { | |
$e(self.listElement).addEventListener('mousedown', self.event_element_mousedown, false); | |
});@*/ | |
} | |
/*@ IECover.process(function() { e.preventDefault() }); @*/ | |
if (e.target !== e.currentTarget) { | |
var item = e.target; | |
while (item && item.parentNode !== e.currentTarget) item = item.parentNode; | |
if (!item) return; | |
if (item !== self.current.hoveringItem) { | |
self.current.hoveringItem = item; | |
if (self.current.isDragging) { | |
self.dragOver(item); | |
} | |
else { | |
self.itemOver(item); | |
} | |
} | |
} | |
}, false); | |
$e(this.listElement).addEventListener('mouseout', this.event_element_mouseout = function(e) { | |
if (self.current.hoveringItem) { | |
var currentItem = self.current.hoveringItem; | |
var item = e.relatedTarget; | |
while (item && item !== self.current.hoveringItem) item = item.parentNode; | |
if (item !== self.current.hoveringItem) { | |
self.current.hoveringItem = null; | |
if (!self.current.isDragging) { | |
self.itemOut(currentItem); | |
} | |
} | |
} | |
}, false); | |
$e(this.listElement).addEventListener('click', this.event_element_click = function(e) { | |
if (e.ctrlKey || e.shiftKey) { | |
e.preventDefault(); | |
e.stopPropagation(); | |
} | |
}, true); | |
}; | |
T.ListUtil = ListUtil; | |
/** | |
* class TimerManager. | |
*/ | |
function TimerManager(win) { | |
this.win = win || window; | |
this.timeouts = {}; | |
this.intervals = {}; | |
} | |
TimerManager.prototype.setTimeout = function(name, func, delay) { | |
this.clear(name); | |
var self = this; | |
this.timeouts[name] = this.win.setTimeout(function() { | |
delete self.timeouts[name]; | |
func(); | |
}, delay); | |
}; | |
TimerManager.prototype.setInterval = function(name, func, delay) { | |
this.clear(name); | |
this.intervals[name] = this.win.setInterval(func, delay); | |
}; | |
TimerManager.prototype.clear = function(name) { | |
if (this.timeouts[name]) { | |
this.win.clearTimeout(this.timeouts[name]); | |
delete this.timeouts[name]; | |
} | |
if (this.intervals[name]) { | |
this.win.clearInterval(this.intervals[name]); | |
delete this.intervals[name]; | |
} | |
}; | |
T.TimerManager = TimerManager; | |
/** | |
* Cookie. | |
*/ | |
var Cookie = { | |
get : function(key) { | |
var m = new RegExp('(?: |^)' + key + '=([^;]*)').exec(document.cookie); | |
return m ? decodeURIComponent(m[1]) : ''; | |
}, | |
set : function(key, value, expires, path, domain) { | |
/*@ path = path.replace(/[^/]*$/, '') @*/ | |
document.cookie = key + '=' + encodeURIComponent(value) + | |
(expires ? ('; expires=' + new Date(expires).toGMTString()) : '') + | |
(path ? ('; path=' + path) : '') + | |
(domain ? ('; domain=' + domain) : ''); | |
}, | |
del : function(key) { | |
document.cookie = key + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT'; | |
} | |
}; | |
T.Cookie = Cookie; | |
/** | |
* class ListedKeyMap. | |
* Map implementation which has listed keys. | |
*/ | |
function ListedKeyMap() { | |
this._keys = []; | |
this._values = {}; | |
} | |
ListedKeyMap.prototype = { | |
has : function(key) { | |
return this._values.hasOwnProperty(key); | |
}, | |
get : function(key) { | |
return this._values[key]; | |
}, | |
getAt : function(index) { | |
return this._values[this._keys[index]]; | |
}, | |
add : function(key, value) { | |
if (this.has(key)) this.remove(key); | |
this._values[key] = value; | |
this._keys.push(key); | |
}, | |
insertAt : function(index, key, value) { | |
if (this.has(key)) return; | |
this._values[key] = value; | |
this._keys.splice(index, 0, key); | |
}, | |
remove : function(key) { | |
if (this.has(key)) { | |
this._keys.splice(this.indexOf(key), 1); | |
delete this._values[key]; | |
} | |
}, | |
removeAt : function(index) { | |
var key = this._keys[index]; | |
this._keys.splice(index, 1); | |
delete this._values[key]; | |
}, | |
indexOf : (function() { | |
if (Array.prototype.indexOf) { | |
return function(key) { return this._keys.indexOf(key); } | |
} | |
else { | |
return function(key) { | |
var keys = this._keys; | |
for (var i = 0, len = keys.length; i < len; i++) { | |
if (keys[i] === key) return i; | |
} | |
return -1; | |
} | |
} | |
})(), | |
keys : function() { | |
return this._keys.concat(); | |
}, | |
count : function() { | |
return this._keys.length; | |
} | |
}; | |
T.ListedKeyMap = ListedKeyMap; | |
/** | |
* class SwfStorage. | |
*/ | |
function SwfStorage(swfUrl) { | |
this.url = swfUrl; | |
this.isLoaded = false; | |
this.onload = null; | |
this.onerror = null; | |
this.timer = new TimerManager(); | |
this.load(); | |
} | |
SwfStorage.prototype = { | |
load : function() { | |
var swf = document.createElement('embed'); | |
swf.setAttribute('type', 'application/x-shockwave-flash'); | |
swf.setAttribute('allowScriptAccess', 'always'); | |
swf.setAttribute('wmode', 'transparent'); | |
swf.setAttribute('src', this.url); | |
swf.setAttribute('width', '1'); | |
swf.setAttribute('height', '1'); | |
swf.style.cssText = 'position: absolute; z-index: -1; top: 0; left: 0; width: 1px; height: 1px;'; | |
(document.body || document.documentElement).appendChild(swf); | |
this.swf = swf; | |
this.observeLoad(); | |
}, | |
observeLoad : function() { | |
var self = this; | |
var retry = 100; | |
this.timer.setInterval('observe', function() { | |
try { | |
if (test()) { | |
self.isLoaded = true; | |
self.timer.clear('observe'); | |
if (self.onload) try { self.onload(); } catch(ee) { postError(ee); } | |
} | |
} | |
catch (e) { | |
if (--retry == 0) { | |
self.timer.clear('observe'); | |
postError(e); | |
if (self.onerror) try { self.onerror(); } catch(ee) { postError(ee); } | |
} | |
} | |
}, 222); | |
function test() { | |
self.swf.setData('test', 'test', '_tmp'); | |
if (self.swf.getData('test', '_tmp') == 'test') { | |
self.swf.clear('_tmp'); | |
return true; | |
} | |
return false; | |
} | |
}, | |
getData : function(key, name) { | |
return this.swf.getData(key, name); | |
}, | |
setData : function(key, data, name) { | |
return this.swf.setData(key, data, name); | |
}, | |
clear : function(name) { | |
this.swf.clear(name); | |
} | |
}; | |
/** | |
* class LocalStorage. | |
*/ | |
function LocalStorage(category) { | |
this.isLoaded = (typeof window.localStorage != 'undefined'); | |
this.category = category || ''; | |
var self = this; | |
setTimeout(function() { | |
if (self.onload) try { self.onload(); } catch(e) {} | |
}, 10); | |
} | |
LocalStorage.prototype = { | |
getData : function(key, name) { | |
var keyName = (this.category ? (this.category + '/') : '') + (name != null ? (name + '.' + key) : key); | |
return localStorage.getItem(keyName); | |
}, | |
setData : function(key, data, name) { | |
var keyName = (this.category ? (this.category + '/') : '') + (name != null ? (name + '.' + key) : key); | |
if (data == null) { | |
return localStorage.removeItem(keyName); | |
} | |
else { | |
return localStorage.setItem(keyName, data); | |
} | |
}, | |
clear : function(name) { | |
var prefix = (this.category ? (this.category + '/') : '') + (name != null ? (name + '.') : ''); | |
var keys = []; | |
if (prefix) { | |
for (var i = 0, len = localStorage.length; i < len; i++) { | |
var key = localStorage.key(i); | |
if (key.indexOf(prefix) == 0) keys.push(key); | |
} | |
} | |
else { | |
for (var i = 0, len = localStorage.length; i < len; i++) { | |
var key = localStorage.key(i); | |
if (key.indexOf('/') < 0 && key.indexOf('.') < 0) keys.push(key); | |
} | |
} | |
for (var i = 0; i < keys.length; i++) { | |
localStorage.removeItem(keys[i]); | |
} | |
} | |
}; | |
var createStorage = (function() { | |
var storage = null; | |
if (window.localStorage) { | |
return function() { | |
return storage || (storage = new LocalStorage('wnp')); | |
} | |
} | |
else { | |
return function() { | |
return storage || (storage = new SwfStorage(Consts.WNP_STORAGE_SWF)); | |
} | |
} | |
})(); | |
T.createStorage = createStorage; | |
/** | |
* class KeyBind. | |
*/ | |
function KeyBind(target) { | |
this.target = target || document; | |
this.binds = []; | |
this.listeners = { | |
keydown: null, | |
keypress: null, | |
keyup: null | |
}; | |
this.allowFilter = []; | |
}; | |
KeyBind.KEY_MAP = { | |
'backspace' : 8, | |
'tab' : 9, | |
'enter' : 13, | |
'shift' : 16, | |
'ctrl' : 17, | |
'alt' : 18, | |
'pause' : 19, | |
'esc' : 27, | |
'space' : 32, | |
'pageup' : 33, | |
'pagedown' : 34, | |
'end' : 35, | |
'home' : 36, | |
'left' : 37, | |
'up' : 38, | |
'right' : 39, | |
'down' : 40, | |
'ins' : 45, | |
'del' : 46 | |
}; | |
KeyBind.prototype.start = function() { | |
var self = this; | |
var isControlKindKey = false; | |
var keydownCode = -1; | |
var keypressCode = -1; | |
$e(this.target).addEventListener('keydown', this.listeners.keydown = function(e) { | |
if (!(e.repeating = e.repeat)) { | |
// software key repeat check. (DOM3 KeyboardEvent.repeat is always false on my environment without Firefox Nightly). | |
if (keydownCode === e.keyCode) { | |
e.repeating = true; | |
} | |
} | |
keydownCode = e.keyCode; | |
isControlKindKey = checkControlKindKey(e); | |
if (!(browser.opera && browser.opera_version < 12.10)) { | |
if (!checkEventTarget(e) && !checkAllowFilter(e)) return; | |
if (isControlKindKey) { | |
processKey(e); | |
} | |
else if (browser.ie || browser.webkit) { | |
if (e.ctrlKey || e.altKey) { | |
processKey(e); | |
} | |
} | |
} | |
}, false); | |
$e(this.target).addEventListener('keypress', this.listeners.keypress = function(e) { | |
if (!(e.repeating = e.repeat)) { | |
// software key repeat check. (DOM3 KeyboardEvent.repeat is always false on my environment without Firefox Nightly). | |
if (keypressCode === e.keyCode) { | |
e.repeating = true; | |
} | |
} | |
keypressCode = e.keyCode; | |
if (!checkEventTarget(e) && !checkAllowFilter(e)) return; | |
if (!(browser.opera && browser.opera_version < 12.10)) { | |
if (!isControlKindKey) processKey(e); | |
} | |
else { | |
processKey(e); | |
} | |
}, false); | |
$e(this.target).addEventListener('keyup', this.listeners.keyup = function(e) { | |
keydownCode = -1; | |
keypressCode = -1; | |
}, false); | |
function processKey(e) { | |
for (var i = 0, binds = self.binds, len = binds.length; i < len; i++) { | |
var shortcut = binds[i]; | |
if (self.checkShortcut(shortcut, e, isControlKindKey)) { | |
e.preventDefault(); | |
shortcut.fn(e); | |
} | |
} | |
} | |
function checkControlKindKey(e) { | |
var keyCode = e.keyCode; | |
if (keyCode == KeyBind.KEY_MAP.space) return false; | |
if (keyCode == KeyBind.KEY_MAP.enter) return false; | |
if (keyCode >= 112 && keyCode <= 135) return true; // function keys. | |
for (var k in KeyBind.KEY_MAP) { | |
if (KeyBind.KEY_MAP[k] == keyCode) return true; | |
} | |
return false; | |
} | |
function checkEventTarget(e) { | |
if (e.currentTarget === e.target) return true; | |
var target = e.target; | |
var nodeName = target.nodeName.toLowerCase(); | |
var keyCode = e.keyCode || e.charCode; | |
var available = true; | |
// textarea -> no keys are available. | |
// textfield -> only up or dowm is available. | |
// select -> available excludes tab, enter, space, up, down, pageup, pagedown. | |
// other input(buttons) -> available excludes tab, enter, space. | |
// other (body, etc) -> all keys are available. | |
if (nodeName == 'textarea') { | |
available = false; | |
} | |
else if (nodeName == 'input' && _in(target.type, 'text', 'password', 'file')) { | |
available = isControlKindKey && _in(keyCode, KeyBind.KEY_MAP.up, KeyBind.KEY_MAP.down); | |
} | |
else if (nodeName == 'select') { | |
available = !_in(keyCode, KeyBind.KEY_MAP.space, KeyBind.KEY_MAP.enter) && !(isControlKindKey && _in(keyCode, KeyBind.KEY_MAP.tab, KeyBind.KEY_MAP.up, KeyBind.KEY_MAP.down, KeyBind.KEY_MAP.pageup, KeyBind.KEY_MAP.pagedown)); | |
} | |
else if (_in(nodeName, 'input', 'button')) { | |
available = !_in(keyCode, KeyBind.KEY_MAP.space, KeyBind.KEY_MAP.enter) && !(isControlKindKey && _in(keyCode, KeyBind.KEY_MAP.tab)); | |
} | |
// always available if target is hiding. | |
if (!available) { | |
if (getStyle(target, 'visibility') == 'hidden' || getStyle(target, 'display') == 'none') { | |
available = true; | |
} | |
} | |
return available; | |
} | |
function _in (val /*, n1, n2, ..*/) { | |
for (var i = 1; i < arguments.length; i++) { | |
if (val == arguments[i]) return true; | |
} | |
return false; | |
} | |
function checkAllowFilter(e) { | |
var filters = self.allowFilter; | |
for (var i = 0, len = filters.length; i < len; i++) { | |
if (filters[i](e)) return true; | |
} | |
return false; | |
} | |
}; | |
KeyBind.prototype.stop = function() { | |
this.target.removeEventListener('keydown', this.listeners.keydown, false); | |
this.target.removeEventListener('keypress', this.listeners.keypress, false); | |
this.target.removeEventListener('keyup', this.listeners.keyup, false); | |
this.listeners.keydown = null; | |
this.listeners.keypress = null; | |
this.listeners.keyup = null; | |
}; | |
KeyBind.prototype.clear = function() { | |
this.binds = []; | |
}; | |
KeyBind.prototype.dispose = function() { | |
this.stop(); | |
delete this.binds; | |
delete this.target; | |
}; | |
KeyBind.prototype.add = function(ch, fn) { | |
var shortcut = this.parseShortcut(ch); | |
shortcut.fn = fn; | |
this.binds.push(shortcut); | |
}; | |
KeyBind.prototype.remove = function(ch) { | |
var sha = this.parseShortcut(ch); | |
var newBinds = null; | |
for (var i = 0, binds = this.binds, len = binds.length; i < len; i++) { | |
var shb = binds[i]; | |
if (sha.ch === shb.ch && | |
sha.shift === shb.shift && | |
sha.alt === shb.alt && | |
sha.ctrl === shb.ctrl | |
) { | |
if (!newBinds) newBinds = binds.slice(0, i); | |
} | |
else { | |
if (newBinds) newBinds.push(shb); | |
} | |
} | |
if (newBinds != null) { | |
this.binds = newBinds; | |
} | |
}; | |
KeyBind.prototype.addAllowFilter = function(func) { | |
this.allowFilter.push(func); | |
}; | |
KeyBind.prototype.parseShortcut = function(str) { | |
var shortcut = {}; | |
var cmds = str.toLowerCase().split(/\s+/); | |
for(var i = 0, len = cmds.length; i < len; i++) { | |
var cmd = cmds[i]; | |
if (cmd === 'shift') shortcut.shift = true; | |
else if (cmd === 'alt' ) shortcut.alt = true; | |
else if (cmd === 'ctrl' ) shortcut.ctrl = true; | |
} | |
shortcut.ch = cmds[0]; | |
return shortcut; | |
}; | |
KeyBind.prototype.checkShortcut = function(shortcut, e, isControlKindKey) { | |
if (shortcut.ch == '*') return true; | |
if (/^(?:[0-9A-Za-z]|enter|space)$/.test(shortcut.ch)) { | |
if (!!shortcut.shift != e.shiftKey) return false; | |
} | |
else { | |
if (shortcut.shift && !e.shiftKey) return false; | |
} | |
if (!!shortcut.alt != e.altKey ) return false; | |
if (!!shortcut.ctrl != e.ctrlKey) return false; | |
var keyCode = e.keyCode || e.charCode; | |
if (shortcut.ch == 'space') return keyCode == KeyBind.KEY_MAP.space; | |
if (shortcut.ch == 'enter') return keyCode == KeyBind.KEY_MAP.enter; | |
if (KeyBind.KEY_MAP[shortcut.ch] != null) { | |
return keyCode == KeyBind.KEY_MAP[shortcut.ch] && isControlKindKey; | |
} | |
if (/^f\d+$/.test(shortcut.ch)) { | |
return shortcut.ch == ('f' + (keyCode - 111)) && isControlKindKey; // "f1" : 112 | |
} | |
return shortcut.ch == String.fromCharCode(keyCode).toLowerCase() && !isControlKindKey; | |
}; | |
T.KeyBind = KeyBind; | |
/** | |
* class Platform | |
*/ | |
function Platform() { | |
this.commands = new ListedKeyMap(); | |
this.currentMode = ''; | |
this.keyBinds = {}; | |
this.currentKeyBind = this.keyBinds[''] = new KeyBind(); | |
this.currentKeyBind.start(); | |
} | |
Platform.prototype.bindCommand = function(command) { | |
this.commands.add(command.name, command); | |
}; | |
Platform.prototype.doCommand = function(commandName) { | |
var cmd = this.commands.get(commandName); | |
if (cmd) { | |
cmd.fn.apply(this, Array.prototype.slice.call(arguments, 1)); | |
} | |
}; | |
Platform.prototype.bindShortcut = function(commandName, key, mode) { | |
var self = this; | |
var keyBind = this.keyBinds[mode || '']; | |
if (!keyBind) { | |
keyBind = this.keyBinds[mode] = new KeyBind(); | |
} | |
keyBind.add(key, function(e) { self.doCommand(commandName, e); }); | |
}; | |
Platform.prototype.unbindShortcut = function(key, mode) { | |
var keyBind = this.keyBinds[mode || '']; | |
if (!keyBind) return; | |
keyBind.remove(key); | |
}; | |
Platform.prototype.changeMode = function(mode) { | |
if (this.currentKeyBind) this.currentKeyBind.stop(); | |
this.currentKeyBind = this.keyBinds[mode || '']; | |
if (this.currentKeyBind) this.currentKeyBind.start(); | |
}; | |
Platform.prototype.clearMode = function(mode) { | |
this.changeMode(null); | |
}; | |
T.Platform = Platform; | |
/** | |
* class ClipboardReciever | |
* -- public fields -- * | |
* [constructor] | |
* doc - document object to observe. | |
* [property] | |
* text - pasted text. | |
* [event] | |
* onpaste - fire event when pasted text. | |
* ------------------- * | |
*/ | |
function ClipboardReciever(doc) { | |
this.build(doc || document); | |
this.onpaste = null; | |
} | |
ClipboardReciever.prototype.build = function(document) { | |
var txt = document.createElement('textarea'); | |
txt.style.cssText = 'position: absolute; top: -1px; left: -1px; width : 1px; height: 1px; '; | |
var self = this; | |
function attach() { | |
txt.value = ''; | |
document.body.appendChild(txt); | |
txt.focus(); | |
} | |
function detach() { | |
txt.blur(); | |
if (txt.parentNode) txt.parentNode.removeChild(txt); | |
} | |
function onpaste() { | |
self.text = txt.value; | |
txt.value = ''; | |
if (self.onpaste) self.onpaste(self); | |
self.text = null; | |
} | |
$e(document).addEventListener('keydown', function(e) { | |
if (e.keyCode == 17) { | |
attach(); | |
} | |
}, false); | |
$e(txt).addEventListener('blur', detach, false); | |
$e(txt).addEventListener('keyup', function(e) { | |
if (e.keyCode == 86) { | |
if (txt.value) onpaste(); | |
} | |
if (e.keyCode == 17) { | |
detach(); | |
} | |
}, false); | |
function observeKey(e) { | |
if (e.keyCode == 86) { | |
if (txt.value) onpaste(); | |
} | |
else { | |
//e.preventDefault(); | |
} | |
} | |
$e(txt).addEventListener('keydown', observeKey, false); | |
$e(txt).addEventListener('keypress', observeKey, false); | |
this.element = txt; | |
}; | |
T.ClipboardReciever = ClipboardReciever; | |
} | |
WNP.BUILD_FUNC = BUILD_FUNC; | |
function BUILD_WNP(T) { | |
if (!T) T = window; | |
/** | |
* class WNPCore | |
* nicovideo viewer. | |
* -- public fields -- * | |
* [method] | |
* play(videoid) - play the video of videoid(or url). | |
* stop() - stop playing video. | |
* fillView() - resize player to container size. | |
* restoreView() - cancel fill. | |
* alternativeView()- show alternative still image. | |
* setControlShowing(boolean) - show or hide control of flv player. | |
* [propety] | |
* element - player element. | |
* current - current statuses. | |
* videoinfo - set when video loaded. (has [videoid, url, thumb, title, desc] property.) | |
* style - current style. | |
* fill : fill view. | |
* restore : original page view. | |
* alternate : alternative still image. | |
* isPlaying - if playing video then true, else false. | |
* isControlShowing - if control showing then true else false. | |
* errorWhenDeleted - raise error when the movie has been deleted. | |
* [event] | |
* load - fire event when the video page loaded. | |
* start - fire event when the video started. | |
* error - fire event when could't load video. (deleted or other) | |
* finish - fire event when finished playing video. | |
* fatal - fire event when fatal error occured. (logout, overaccess) | |
* ------------------- * | |
*/ | |
function WNPCore() { | |
this.initialize.apply(this, arguments); | |
}; | |
WNPCore.STYLE_FILL = 'fill'; | |
WNPCore.STYLE_RESTORE = 'restore'; | |
WNPCore.STYLE_ALTERNATE = 'alternate'; | |
WNPCore.emptyFunc = new Function(); | |
EventDispatcher.initialize(WNPCore.prototype); | |
WNPCore.prototype.initialize = function(document, name) { | |
this.element = this.build(document || window.document, name); | |
this.current = { | |
videoinfo : null, | |
location : null, | |
isPlaying : false, | |
isPausing : false, | |
isLoading : false, | |
isHiding : false, | |
isMute : false, | |
isRepeat : false, | |
isCommentOff : false, | |
style : WNPCore.STYLE_FILL, | |
isControlShowing : false, | |
autoRelayout : true, | |
errorWhenDeleted : true, | |
alternativeElement : null, | |
alternativeElementSize : null, | |
videoLoaded: false, | |
videoStarted: false, | |
videoFinished: false, | |
viewSize: { | |
ORG_PLAYER_VIEW_WIDTH : Consts.ORG_PLAYER4_VIEW_WIDTH, | |
ORG_PLAYER_VIEW_HEIGHT : Consts.ORG_PLAYER4_VIEW_HEIGHT, | |
ORG_PLAYER_CONTROL_HEIGHT : Consts.ORG_PLAYER4_CONTROL_HEIGHT, | |
ORG_PLAYER_MINIMUM_WIDTH : Consts.ORG_PLAYER4_MINIMUM_WIDTH, | |
ORG_PLAYER_4_3_WIDTH_ADJ : 0 | |
} | |
}; | |
this.listeners = {} | |
this.observeInterval = 500; | |
this.emptyView(); | |
this.timer = new TimerManager(this.element.ownerDocument.defaultView || ie.window(this.element)); | |
} | |
WNPCore.prototype.build = function(document, name) { | |
this._ = {}; | |
var dv = document.createElement('div'); | |
var boxSizing = getValidCssPropertyName('box-sizing'); | |
dv.style.cssText = [ | |
boxSizing + ': border-box;', | |
'width: 100%; height: 100%;', | |
'color: white;', | |
'background-color: #202731;', | |
'margin: 0; padding: 0;', | |
'border-style: solid;', | |
'border-color: #050608 black;', | |
'border-width: 0;', | |
'overflow: hidden;', | |
'position: relative;', | |
// http://ie.microsoft.com/testdrive/Graphics/CSSGradientBackgroundMaker/ | |
'background-image: -ms-linear-gradient(top, #899AC2 0%, #202731 100%);', | |
'background-image: -moz-linear-gradient(top, #899AC2 0%, #202731 100%);', | |
'background-image: -o-linear-gradient(top, #899AC2 0%, #202731 100%);', | |
'background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #899AC2), color-stop(1, #202731));', | |
'background-image: -webkit-linear-gradient(top, #899AC2 0%, #202731 100%);', | |
'background-image: linear-gradient(to bottom, #899AC2 0%, #202731 100%);', | |
'-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=0,startcolorstr=#899AC2, endcolorstr=#202731))";' | |
].join(''); | |
dv.innerHTML = [ | |
'<div style="position: absolute; margin: 0; padding: 0; border: none; width: 100%; height: 100%; display: none; border-style: solid; ' + boxSizing + ': border-box; ', 'border-color: #050608 black;">', | |
' <img style="display: none">', | |
' <p style="position:absolute; right: 5px; bottom: 15px; font-size: 30px; font-weight: bold; color: #AAA;"></p>', | |
'</div>', | |
'<iframe name="' + (name || '') + '" class="wnp_nicoflame" style="margin: 0; padding: 0; border: none; " frameborder="0" scrolling="no" width="970" height="540" src="about:blank"></iframe>', | |
].join(''); | |
this._.container = dv; | |
this._.loadingbx = dv.childNodes[0]; | |
this._.loadimage = dv.childNodes[0].getElementsByTagName('img')[0]; | |
this._.caption = dv.childNodes[0].getElementsByTagName('p')[0]; | |
this._.nicoframe = dv.childNodes[1]; | |
return this._.container; | |
}; | |
WNPCore.prototype.show = function() { | |
this.current.isHiding = false; | |
this.element.style.width = '100%'; | |
this.element.style.height = '100%'; | |
this.layout(); | |
}; | |
WNPCore.prototype.hide = function() { | |
this.current.isHiding = true; | |
this.element.style.width = '0'; | |
this.element.style.height = '0'; | |
this.element.style.borderWidth = '0'; | |
this._.loadingbx.style.display = 'none'; | |
}; | |
WNPCore.prototype.detach = function() { | |
if (this.element && this.element.parentNode) { | |
this.element.parentNode.removeChild(this.element); | |
} | |
this.stop(); | |
}; | |
WNPCore.prototype.nico = (function() { | |
function getPlayer() { | |
return this.document && (this.document.getElementById('external_nicoplayer') || this.document.getElementById('flvplayer')); // for zero. | |
} | |
return function nico() { | |
var nicoWindow = (this._.nicoframe.parentNode) ? this._.nicoframe.contentWindow : null; // for ie. | |
var nicoDocument = (nicoWindow) ? nicoWindow.document : null; | |
return { | |
window : nicoWindow, | |
document : nicoDocument, | |
getPlayer : getPlayer | |
} | |
} | |
})(); | |
WNPCore.prototype.loadingStart = function() { | |
this.current.isLoading = true; | |
this._.caption.innerHTML = 'now loading.'; | |
this._.caption.style.display = ''; | |
}; | |
WNPCore.prototype.loadingEnd = function() { | |
this.current.isLoading = false; | |
this._.caption.style.display = 'none'; | |
}; | |
WNPCore.prototype.setAlternativeView = function(element, width, height) { | |
if (element == null) { | |
this.current.alternativeElement = null; | |
this.current.alternativeElementSize = null; | |
return; | |
} | |
this.current.alternativeElement = element; | |
this.current.alternativeElementSize = { width: width, height: height }; | |
if (this.current.style == WNPCore.STYLE_ALTERNATE) { | |
this.alternativeView(); | |
} | |
}; | |
WNPCore.prototype.play = function(videoinfo) { | |
// resume if 0 arguments. | |
if (!videoinfo && this.current.isPlaying) { | |
this.resume(); | |
return; | |
} | |
this._.container.style.backgroundColor = 'black'; | |
this.current.videoinfo = videoinfo; | |
var video_url = videoinfo.url || videoinfo.id || videoinfo; | |
if (!/^http:/.test(video_url)) video_url = 'http://www.nicovideo.jp/watch/' + video_url; | |
if (this._.nicoframe.parentNode === this._.container) { | |
this._.container.removeChild(this._.nicoframe); | |
} | |
this._.nicoframe.src = video_url; | |
this.current.isPlaying = true; | |
this.current.isPausing = false; | |
this.current.videoLoaded = false; | |
this.current.videoStarted = false; | |
this.current.videoFinished = false; | |
this.loadingStart(); | |
this.layout(); | |
this._.container.appendChild(this._.nicoframe); | |
this.current.location = this._.nicoframe.src; | |
this.current.loaded = 0; | |
this.current.playhead = 0; | |
this.startObserveLoad(); | |
}; | |
WNPCore.prototype.stop = function() { | |
this.current.isPlaying = false; | |
this.current.isPausing = false; | |
this.current.videoLoaded = false; | |
this.current.videoStarted = false; | |
this.current.videoFinished = false; | |
this.stopObserving(); | |
this.emptyView(); | |
this.current.videoinfo = null; | |
this.current.location = null; | |
this.current.loaded = 0; | |
this.current.playhead = 0; | |
this.current.alternativeElement = null; | |
}; | |
WNPCore.prototype.pause = function() { | |
this.current.isPausing = true; | |
var flvplayer = this.nico().getPlayer(); | |
if (!flvplayer) return; | |
try { | |
flvplayer.ext_play(0); | |
} | |
catch(e) { postError(e) } | |
}; | |
WNPCore.prototype.resume = function() { | |
this.current.isPausing = false; | |
this.startObserving(); | |
var flvplayer = this.nico().getPlayer(); | |
if (!flvplayer) return; | |
try { | |
flvplayer.ext_play(1); | |
} | |
catch(e) { } | |
}; | |
WNPCore.prototype.startPlaying = function() { | |
this.current.isPausing = false; | |
this.startObserving(); | |
var flvplayer = this.nico().getPlayer(); | |
if (!flvplayer) return; | |
flvplayer.ext_play(1); | |
}; | |
WNPCore.prototype.setStyle = function(style) { | |
if (this.current.style != style) { | |
this.current.style = style; | |
this.layout(); | |
} | |
}; | |
WNPCore.prototype.layoutIfNecessary = function() { | |
if (!this.current.autoRelayout) return; | |
var container = this._.container; | |
var containerSize = this._.containerSize; | |
if (containerSize.width != container.offsetWidth || containerSize.height != container.offsetHeight) { | |
this.layout(); | |
this.dispatchEvent({ type: 'resize' }); | |
} | |
}; | |
WNPCore.prototype.layout = function() { | |
if (this.current.isHiding) return; | |
if (!this.current.isPlaying) { | |
this.emptyView(); | |
return; | |
} | |
if (this.current.isLoading && this.current.style === WNPCore.STYLE_FILL) { | |
this.alternativeView(); | |
this.current.style = WNPCore.STYLE_FILL; | |
return; | |
} | |
switch (this.current.style) { | |
case WNPCore.STYLE_RESTORE: this.restoreView(); break; | |
case WNPCore.STYLE_ALTERNATE: this.alternativeView(); break; | |
default: this.fillView(); break; | |
} | |
this._.containerSize = { width: this._.container.offsetWidth, height: this._.container.offsetHeight }; | |
}; | |
WNPCore.prototype.sight = function() { | |
try { | |
var nico = this.nico(); | |
var flvplayer = nico.getPlayer(); | |
var p = getAbsolutePosition(flvplayer); | |
if (this.current.size) { | |
if (this.current.size.viewW && this.current.size.viewW < this.current.viewSize.ORG_PLAYER_MINIMUM_WIDTH) { | |
p.x += (this.current.viewSize.ORG_PLAYER_MINIMUM_WIDTH - this.current.size.viewW) / 2; | |
} | |
} | |
nico.window.scrollTo(p.x, p.y); | |
} | |
catch(e) { postError(e) } | |
}; | |
WNPCore.prototype.emptyView = function() { | |
this._.container.style.borderWidth = '0'; | |
this._.container.style.backgroundColor = '#4F586D'; | |
this._.loadingbx.style.display = 'none'; | |
if (this._.nicoframe.parentNode == this._.container) { | |
this._.container.removeChild(this._.nicoframe); | |
} | |
}; | |
WNPCore.prototype.fillView = function() { | |
if (!this.current.isPlaying) return; | |
this.current.style = WNPCore.STYLE_FILL; | |
this.current.isControlShowing = false; | |
var nico = this.nico(); | |
try { | |
// calculate player width, height. | |
var w = this._.container.parentNode.clientWidth; // parentNode's client box is the viewport of container element. | |
var h = this._.container.parentNode.clientHeight; | |
this._.nicoframe.style.display = 'none'; // for performance. | |
this._.nicoframe.style.visibility = 'hidden'; // for performance. | |
if (this._.nicoframe.getAttribute('scrolling') != 'no') this._.nicoframe.setAttribute('scrolling', 'no'); | |
this._.nicoframe.style.width = '100%'; | |
this._.nicoframe.style.height = '100%'; | |
var viewW = Math.max(w - 3, 0); // for zero (always show left-right border to hide menu by onmouseout.) | |
var viewH = Math.floor(viewW * this.current.viewSize.ORG_PLAYER_VIEW_HEIGHT / (this.current.viewSize.ORG_PLAYER_VIEW_WIDTH - this.current.viewSize.ORG_PLAYER_4_3_WIDTH_ADJ)); | |
if (viewH > h) { | |
viewH = h; | |
viewW = Math.floor(viewH * (this.current.viewSize.ORG_PLAYER_VIEW_WIDTH - this.current.viewSize.ORG_PLAYER_4_3_WIDTH_ADJ) / this.current.viewSize.ORG_PLAYER_VIEW_HEIGHT); | |
// minimum height of zero player. | |
if (viewH < 53) { | |
viewW = Math.floor(53 * (this.current.viewSize.ORG_PLAYER_VIEW_WIDTH - this.current.viewSize.ORG_PLAYER_4_3_WIDTH_ADJ) / this.current.viewSize.ORG_PLAYER_VIEW_HEIGHT); | |
} | |
} | |
var controlHeight = this.current.viewSize.ORG_PLAYER_CONTROL_HEIGHT; | |
if (nico.window.WatchApp) { | |
try { | |
var config = nico.window.WatchApp.ns.model.player.PlayerConfig.getInstance().get(); | |
if (config.oldTypeCommentInput) { | |
controlHeight += Consts.ORG_PLAYER_GINZA_COMMENT_HEIGHT; | |
} | |
if (config.oldTypeControlPanel) { | |
controlHeight += Consts.ORG_PLAYER_GINZA_CONTROL_HEIGHT; | |
} | |
} | |
catch (_) {} | |
} | |
var playerW = Math.max(viewW, this.current.viewSize.ORG_PLAYER_MINIMUM_WIDTH); | |
var playerH = viewH + controlHeight; | |
this.current.size = { viewW: viewW, viewH: viewH, playerW: playerW, playerH: playerH }; | |
var flvplayer = nico.getPlayer(); | |
if (flvplayer) { | |
if (browser.opera) { | |
nico.document.documentElement.style.overflow = 'hidden'; | |
} | |
// for zero. | |
if (nico.window.WatchApp) { | |
var style = nico.document.querySelector('style[title="__WNP_ZERO_PLAYER_FILLVIEW__"]'); | |
if (!style) { | |
style = addStyle([ | |
'body, #content, #playerContainerWrapper { overflow : visible !important } ', | |
'#siteHeader, #videoHeader, #textMarquee, #playlist, #searchResultExplorer, #outline, #playerCommentPanelOuter, #ichibaPanel, .oldTypeHandler, #footer, #chipWallList, #videoExplorerExpand, #playerTabWrapper { display : none !important } ', | |
'#content, #content div { position: static !important; } ', // never change "#content *" at chrome. | |
'#content #playerContainer { position: absolute !important; top: 0 !important; left: 0 !important; padding: 0 !important; } ', | |
'#content #playerContainer, #content #nicoplayerContainer, #content #playerContainerSlideArea .playerContainerSlideTarget { height: auto !important; } ' | |
].join(''), nico.document); | |
style.setAttribute('title', '__WNP_ZERO_PLAYER_FILLVIEW__'); | |
} | |
setStyleEnabled(style, true); | |
} | |
try { | |
flvplayer.ext_setVideoSize('fit'); | |
} | |
catch(e) {} | |
// necessary to set size by element.style because ... | |
// => body.full_with_browser #external_nicoplayer { width:100%!important; height:100%!important; } | |
removeClass(nico.document.body, 'full_with_browser'); | |
// force re-layout. | |
flvplayer.style.width = (playerW + 1) + 'px'; | |
flvplayer.style.height = (playerH + 1) + 'px'; | |
flvplayer.style.width = flvplayer.parentNode.style.width = playerW + 'px'; // for scroll. | |
flvplayer.style.height = flvplayer.parentNode.style.height = playerH + 'px'; | |
} | |
this._.loadingbx.style.display = 'none'; | |
// set container's border. | |
this._.container.style.borderWidth = | |
Math.ceil((h - viewH) / 2) + 'px ' + | |
Math.ceil((w - viewW) / 2 + 3) + 'px ' + // adjust for player4 // for zero (always show left-right border to hide menu by onmouseout.) | |
Math.floor((h - viewH) / 2) + 'px ' + | |
Math.floor((w - viewW) / 2 + 1) + 'px'; | |
// scroll to player top-left. | |
this._.nicoframe.style.display = ''; | |
this.sight(); | |
this._.nicoframe.style.visibility = 'visible'; | |
} | |
catch (e) { | |
postError(e); | |
this._.nicoframe.style.display = ''; | |
this._.nicoframe.style.visibility = 'visible'; | |
} | |
}; | |
WNPCore.prototype.restoreView = function() { | |
if (!this.current.isPlaying) return; | |
this.current.style = WNPCore.STYLE_RESTORE; | |
this.current.isControlShowing = false; | |
this._.nicoframe.style.display = 'none'; // for performance. | |
if (this._.nicoframe.getAttribute('scrolling') == 'no') this._.nicoframe.setAttribute('scrolling', 'yes'); | |
this._.nicoframe.style.width = '100%'; | |
this._.nicoframe.style.height = '100%'; | |
this._.container.style.borderWidth = '0'; | |
this._.loadingbx.style.display = 'none'; | |
try { | |
var nico = this.nico(); | |
if (browser.opera) { | |
nico.document.documentElement.style.overflow = 'scroll'; | |
} | |
// for zero. | |
if (nico.window.WatchApp) { | |
var style = nico.document.querySelector('style[title="__WNP_ZERO_PLAYER_FILLVIEW__"]'); | |
if (style) { | |
setStyleEnabled(style, false); | |
} | |
} | |
var flvplayer = nico.getPlayer(); | |
flvplayer.style.width = flvplayer.parentNode.style.width = ''; | |
flvplayer.style.height = flvplayer.parentNode.style.height = ''; | |
flvplayer.ext_setVideoSize('normal'); | |
} | |
catch(e) { postError(e) } | |
this._.nicoframe.style.display = ''; | |
}; | |
WNPCore.prototype.alternativeView = function() { | |
if (!this.current.isPlaying) return; | |
this.current.style = WNPCore.STYLE_ALTERNATE; | |
if (this._.nicoframe.getAttribute('scrolling') != 'no') this._.nicoframe.setAttribute('scrolling', 'no'); | |
this._.nicoframe.style.width = '1px'; // minimum viewing. | |
this._.nicoframe.style.height = '1px'; | |
if (browser.safari) { | |
this._.nicoframe.style.width = '30px'; // safari cannot load flash in 1px iframe. | |
} | |
this._.container.style.borderWidth = '0'; | |
this._.loadingbx.style.display = 'none'; | |
// set alternative element. | |
var alterElement = this.current.alternativeElement; | |
var alterSize = this.current.alternativeElementSize || {}; | |
if (!alterElement) { | |
alterElement = this._.container.ownerDocument.createElement('img'); | |
if (this.current.videoinfo && this.current.videoinfo.thumbnail) { | |
alterElement.src = this.current.videoinfo.thumbnail; | |
alterSize = { width: 130, height: 100 }; | |
} | |
else { | |
alterElement.src = 'http://ec1.images-amazon.com/images/G/09/nav2/dp/no-image-no-ciu.gif'; | |
alterSize = { width: 192, height: 192 }; | |
} | |
} | |
alterElement.style.width = alterElement.style.height = '100%'; | |
alterElement.style.margin = alterElement.style.padding = '0'; | |
alterElement.style.border = 'none'; | |
alterElement.style.backgroundColor = 'black'; | |
if (alterElement.parentNode != this._.loadingbx || alterElement != this._.loadimage || alterElement.src != this._.loadimage.src) { | |
this._.loadingbx.replaceChild(alterElement, this._.loadimage); | |
this._.loadimage = alterElement; | |
} | |
// set loadingbx border. | |
var imageW = alterSize.width || 130; | |
var imageH = alterSize.height || 100; | |
var w = this._.container.parentNode.clientWidth, h = this._.container.parentNode.clientHeight; | |
var viewW = Math.max(w - 30, 0); // fine adjustment. | |
var viewH = Math.floor(viewW * imageH / imageW); | |
if (viewH > (h -20)) { // always show top bottom border. | |
viewH = Math.max(h - 20, 0); | |
viewW = Math.floor(viewH * imageW / imageH); | |
} | |
this._.loadingbx.style.borderWidth = | |
Math.ceil((h - viewH) / 2) + 'px ' + | |
Math.floor((w - viewW) / 2) + 'px ' + | |
Math.floor((h - viewH) / 2) + 'px ' + | |
Math.ceil((w - viewW) / 2) + 'px'; | |
this._.loadingbx.style.display = 'block'; | |
if (this.current.videoStarted) { | |
// set normal except fill view for re-layout. | |
try { | |
var flvplayer = this.nico().getPlayer(); | |
if (flvplayer) flvplayer.ext_setVideoSize('normal'); | |
} catch(e) {} | |
} | |
}; | |
WNPCore.prototype.setControlShowing = function(show) { | |
if (!this.current.isPlaying || this.current.style != WNPCore.STYLE_FILL) return; | |
if (this.current.isControlShowing === !!show) return; | |
this.current.isControlShowing = !!show; | |
var nico = this.nico(); | |
var controlHeight = this.current.viewSize.ORG_PLAYER_CONTROL_HEIGHT; | |
if (nico.window.WatchApp) { | |
try { | |
var config = nico.window.WatchApp.ns.model.player.PlayerConfig.getInstance().get(); | |
if (config.oldTypeCommentInput) { | |
controlHeight += Consts.ORG_PLAYER_GINZA_COMMENT_HEIGHT; | |
} | |
if (config.oldTypeControlPanel) { | |
controlHeight += Consts.ORG_PLAYER_GINZA_CONTROL_HEIGHT; | |
} | |
} | |
catch (_) {} | |
} | |
nico.window.scrollBy(0, controlHeight * (show ? 1 : -1)); | |
}; | |
WNPCore.prototype.setCommentOff = function(off) { | |
this.current.isCommentOff = !!off; | |
if (!this.current.isPlaying) return; | |
var flvplayer = this.nico().getPlayer(); | |
if (!flvplayer) return; | |
try { | |
flvplayer.ext_setCommentVisible(!this.current.isCommentOff); | |
} | |
catch(e) { postError(e) } | |
}; | |
WNPCore.prototype.setRepeat = function(repeat) { | |
this.current.isRepeat = !!repeat; | |
if (!this.current.isPlaying) return; | |
var flvplayer = this.nico().getPlayer(); | |
if (!flvplayer) return; | |
try { | |
flvplayer.ext_setRepeat(this.current.isRepeat); | |
} | |
catch(e) { postError(e) } | |
}; | |
WNPCore.prototype.setMute = function(mute) { | |
this.current.isMute = !!mute; | |
if (!this.current.isPlaying) return; | |
var flvplayer = this.nico().getPlayer(); | |
if (!flvplayer) return; | |
try { | |
flvplayer.ext_setMute(this.current.isMute); | |
} | |
catch(e) { postError(e) } | |
}; | |
WNPCore.prototype.seek = function(time) { | |
if (!this.current.isPlaying) return; | |
var flvplayer = this.nico().getPlayer(); | |
if (!flvplayer) return; | |
try { | |
var len = Number(flvplayer.ext_getTotalTime()); | |
var cur = Number(flvplayer.ext_getPlayheadTime()); | |
if (this.nextSeekTo != null) { | |
if (time > 0 && cur < this.nextSeekTo) cur = this.nextSeekTo; | |
if (time < 0 && cur > this.nextSeekTo) cur = this.nextSeekTo; | |
} | |
var to = cur + Number(time) - 2.5; // fine adjustment. | |
if (isNaN(to)) return; | |
if (to > len) to = len; | |
if (to < 0 ) to = 0; | |
this.nextSeekTo = to; | |
flvplayer.ext_setPlayheadTime(to); | |
flvplayer.ext_setVolume(Number(flvplayer.ext_getVolume())-1e-14); // for silence after ext_setPlayheadTime. (2009/08/07) | |
var self = this; | |
this.timer.setTimeout('seek', function() { | |
var flvplayer = self.nico().getPlayer(); | |
if (!flvplayer) return; | |
self.nextSeekTo = null; | |
self.seekTid = null; | |
// for shotage of backward seek. | |
var cur = Number(flvplayer.ext_getPlayheadTime()); | |
if (time < 0 && cur - to > 7) { | |
flvplayer.ext_setPlayheadTime(Math.max(to - 10, 0)); | |
flvplayer.ext_setVolume(Number(flvplayer.ext_getVolume())+1e-14); | |
} | |
// for shotage of forward seek (for seekDisabled). | |
if (time > 0 && to - cur > 7) { | |
flvplayer.ext_setPlayheadTime(Math.min(to + 10, len)); | |
flvplayer.ext_setVolume(Number(flvplayer.ext_getVolume())+1e-14); | |
} | |
}, 100); | |
return to; | |
} | |
catch(e) { postError(e) } | |
}; | |
WNPCore.prototype.seekTo = function(sec) { | |
if (!this.current.isPlaying) return; | |
var flvplayer = this.nico().getPlayer(); | |
if (!flvplayer) return; | |
try { | |
var len = Number(flvplayer.ext_getTotalTime()); | |
var to = Number(sec); | |
if (isNaN(to)) return; | |
if (to > len) to = len; | |
if (to <= 0) to = 0; | |
flvplayer.ext_setPlayheadTime(to); | |
flvplayer.ext_setVolume(Number(flvplayer.ext_getVolume())-1e-14); | |
return to; | |
} | |
catch(e) { postError(e) } | |
}; | |
WNPCore.prototype.playhead = function() { | |
if (!this.current.isPlaying) return 0; | |
return this.current.playhead || 0; | |
}; | |
WNPCore.prototype.length = function() { | |
if (!this.current.isPlaying) return -1; | |
return this.current.videoinfo.length; | |
}; | |
WNPCore.prototype.volume = function(vol) { | |
if (vol == null || isNaN(vol)) return this.current.volume; | |
var cur = this.current.volume; | |
if (cur == null) cur = 50; | |
var to = cur + Number(vol); | |
return this.volumeTo(to); | |
}; | |
WNPCore.prototype.volumeTo = function(vol) { | |
if (isNaN(vol)) throw "invalid vol."; | |
var to = Number(vol); | |
if (to > 100) to = 100; | |
if (to < 0 ) to = 0; | |
this.current.volume = to; | |
var flvplayer = this.nico().getPlayer(); | |
if (flvplayer) { | |
try { | |
flvplayer.ext_setVolume(to); | |
} | |
catch(e) { | |
postError(e); | |
} | |
} | |
return to; | |
}; | |
WNPCore.prototype.loaded = function() { | |
if (!this.current.isPlaying) return 0; | |
return this.current.loaded || 0; | |
}; | |
WNPCore.prototype.commentNum = function() { | |
if (!this.current.isPlaying) return 0; | |
var watchInfo = this.getWatchInfo(); | |
if (watchInfo && watchInfo.commentCount != null) return watchInfo.commentCount; | |
var flvplayer = this.nico().getPlayer(); | |
if (!flvplayer) return 0; | |
var num = Number(flvplayer.GetVariable('last_resno')); | |
return num; | |
}; | |
WNPCore.prototype.getWatchInfo = function() { | |
var nico = this.nico(); | |
// zero player. | |
if (nico.window.WatchApp) { | |
try { | |
return nico.window.WatchApp.ns.model.WatchInfoModel.getInstance(); | |
} | |
catch (e) { | |
return null; | |
} | |
} | |
// harajuku compatible. | |
//return nico.window.Video; | |
try { | |
var vars = nico.window.so.variables; | |
var flvplayer = nico.getPlayer(); | |
return { | |
v: vars.v, | |
id: vars.videoId, | |
title: decodeURIComponent(vars.videoTitle), | |
thumbnail: decodeURIComponent(vars.thumbImage), | |
mylistCount: Number(vars.mylist_counter), | |
movieType: vars.movie_type, | |
isDeleted: vars.deleted == '1', | |
isWideScreenVideo: vars.isWide, | |
length: Number(flvplayer.ext_getTotalTime()) | |
}; | |
} | |
catch (e) { | |
return null; | |
} | |
}; | |
WNPCore.prototype.startObserveLoad = function() { | |
this.current.loaded = 0; | |
this.current.videoLoaded = false; | |
this.current.videoStarted = false; | |
this.current.videoFinished = false; | |
var self = this; | |
this._.containerSize = { width: this._.container.offsetWidth, height: this._.container.offsetHeight }; | |
var retry = 50; | |
var last_fit = -1; | |
this.timer.setInterval('observe', function() { | |
try { | |
var nico = self.nico(); | |
if (!nico.window) return; | |
if (!nico.document) return; | |
var location; | |
try { location = nico.window.location.href; } catch (e) { /* redirected to other domain. */ } | |
if (location == 'about:blank') return; | |
// unexpected redirect. | |
if (!/^http:\/\/www\.nicovideo\.jp\/watch\/.*/.test(location)) { | |
self.stop(); | |
var event = { type: 'error', message : 'unexpected redirect.' }; | |
self.dispatchEvent(event); | |
if (typeof self.onerror == 'function') try { self.onerror(event); } catch(e) { postError(e) } | |
return; | |
} | |
// logout check. | |
if (nico.window.User && !nico.window.User.id) { | |
var event = { type: 'fatal', message : Lang.PLEASE_LOGIN, logout : true }; | |
self.dispatchEvent(event); | |
if (typeof self.onfatal == 'function') try { self.onfatal(event); } catch(e) { postError(e) } | |
return; | |
} | |
var h1 = nico.document.getElementsByTagName('h1')[0]; | |
if (h1) { | |
// over access. | |
var h1Text = h1.textContent || h1.innerText; | |
if (h1Text.indexOf(Lang.OVER_ACCESS) >= 0 && nico.document.title.indexOf(h1Text) < 0) { | |
self.stop(); | |
var event = { type: 'fatal', message : h1Text }; | |
self.dispatchEvent(event); | |
if (typeof self.onfatal == 'function') try { self.onfatal(event); } catch(e) { postError(e) } | |
return; | |
} | |
// missing. | |
if (h1Text.indexOf(Lang.MISSING) >= 0 && nico.document.title.indexOf(h1Text) < 0) { | |
self.stop(); | |
var event = { type: 'error', message : h1Text }; | |
self.dispatchEvent(event); | |
if (typeof self.onerror == 'function') try { self.onerror(event); } catch(e) { postError(e) } | |
return; | |
} | |
//other | |
if (nico.document.readyState == 'complete' && !self.getWatchInfo()) { | |
self.stop(); | |
var event = { type: 'fatal', message : h1Text }; | |
self.dispatchEvent(event); | |
if (typeof self.onfatal == 'function') try { self.onfatal(event); } catch(e) { postError(e) } | |
return; | |
} | |
} | |
if (self.current.errorWhenDeleted) { | |
// delete check 1. | |
if (nico.document.getElementById('deleted_message_default')) { | |
self.stop(); | |
var event = { type: 'error', message : 'this video got deleted.' }; | |
self.dispatchEvent(event); | |
if (typeof self.onerror == 'function') try { self.onerror(event); } catch(e) { postError(e) } | |
return; | |
} | |
// delete check 2. | |
var watchInfo = self.getWatchInfo(); | |
if (watchInfo && watchInfo.isDeleted) { | |
self.stop(); | |
var event = { type: 'error', message : 'this video got deleted.' }; | |
self.dispatchEvent(event); | |
if (typeof self.onerror == 'function') try { self.onerror(event); } catch(e) { postError(e) } | |
return; | |
} | |
} | |
self.layoutIfNecessary(); | |
var flvplayer = nico.getPlayer(); | |
if (!flvplayer) return; | |
try { | |
// for load flash. | |
if (self.current.style != WNPCore.STYLE_RESTORE) { | |
var p = getAbsolutePosition(flvplayer); | |
nico.window.scrollTo(p.x, p.y); | |
// for zero | |
if (flvplayer.nodeName == 'OBJECT' && self.current.isHiding) { | |
self.element.style.width = '1px'; | |
self.element.style.height = '1px'; | |
if (browser.safari) { | |
self._.nicoframe.style.width = '30px'; // safari cannot load flash in 1px iframe. (Supports zero player only on Safari.) | |
} | |
} | |
} | |
if (!flvplayer.ext_isMute()) flvplayer.ext_setMute(1); | |
var loadedRatio = Number(flvplayer.ext_getLoadedRatio()); | |
var totalTime = Number(flvplayer.ext_getTotalTime()); | |
if (loadedRatio > 0.05 || loadedRatio * totalTime > 10) { | |
if (flvplayer.ext_getStatus() != 'playing') { | |
flvplayer.ext_play(1); | |
} | |
} | |
else { | |
return; | |
} | |
// set fullscrren preliminarily to hide "Full screen mode ...." | |
if (flvplayer.ext_getVideoSize() != 'fit') { | |
flvplayer.ext_setVideoSize('fit'); | |
last_fit = new Date().getTime(); | |
} | |
// video start check. | |
var headTime = Number(flvplayer.ext_getPlayheadTime()); | |
if (!(headTime > 0)) { | |
return; | |
} | |
} | |
catch(e) { | |
return; | |
} | |
// for redirect. | |
$e(nico.window).addEventListener('unload', self.listeners.unload || (self.listeners.unload = function() { | |
if (self.current.isPlaying) { | |
self.loadingStart(); | |
self.layout(); | |
self.startObserveLoad(); | |
} | |
}), false); | |
// stop page observing and go to next state. | |
self.stopObserving(); | |
self.current.videoLoaded = true; | |
self.seekTo(0); | |
self.nico().getPlayer().ext_play(0); | |
// delay to hide "Full screen mode ...." if fullscreen mode. | |
var delay = 222; | |
if (self.current.style == WNPCore.STYLE_FILL) { | |
delay = Math.max(3500 - (new Date().getTime() - last_fit), delay); | |
} | |
// wait for ext_setPlayheadTime method works. | |
self.timer.setTimeout('next_observe', function() { | |
// hack for cutting first noise. | |
self.seekTo(0); | |
self.nico().getPlayer().ext_play(0); | |
// wait for ext_setPlayheadTime method works. | |
self.timer.setTimeout('next_observe', function() { | |
self.nicoFrameLoaded(); | |
self.startObservePlay(); | |
// delay for first rendering. | |
if (!self.current.isPausing) { | |
self.timer.setTimeout('next_observe', function() { | |
self.startPlaying(); | |
}, 10); | |
} | |
var event = { type: 'load' }; | |
self.dispatchEvent(event); | |
if (self.onload) try { self.onload(event); } catch(e) { postError(e) } | |
}, delay); | |
}, 444); | |
} | |
catch (e) { | |
postError(e); | |
// on error(perhaps security error), quit observing. | |
if (--retry == 0) { | |
self.stop(); | |
throw e; | |
} | |
} | |
}, 250); | |
}; | |
WNPCore.prototype.startObservePlay = function() { | |
var self = this; | |
var prePos = 0; | |
var retry = 10; | |
this.timer.setInterval('observe', function() { | |
try { | |
var nico = self.nico(); | |
// reload if location changed. | |
if (!nico.window) { | |
self.stop(); | |
return; | |
} | |
var location; | |
try { location = nico.window.location.href; } catch (e) { /* redirected to other domain. */ } | |
// unexpected redirect. | |
if (!/^http:\/\/www\.nicovideo\.jp\/watch\/.*/.test(location)) { | |
self.stop(); | |
var event = { type: 'error', message : 'unexpected redirect.' }; | |
self.dispatchEvent(event); | |
if (typeof self.onerror == 'function') try { self.onerror(event); } catch(e) { postError(e) } | |
return; | |
} | |
if (self.current.location != location) { | |
var oldLocation = self.current.location; | |
self.current.location = location; | |
self.loadingStart(); | |
self.layout(); | |
self.startObserveLoad(); | |
var event = { type: 'jump', from: oldLocation, to: location }; | |
self.dispatchEvent(event); | |
if (typeof self.onjump == 'function') try { self.onjump(event); } catch(e) { postError(e) } | |
return; | |
} | |
self.layoutIfNecessary(); | |
var flvplayer = nico.getPlayer(); | |
if (!flvplayer) { | |
// reloaded. (player changed?) | |
self.startObserveLoad(); | |
return; | |
} | |
// start check. | |
if (!self.current.videoStarted) { | |
if (!self.current.isPausing) { | |
if (flvplayer.ext_getStatus() != 'playing') { | |
flvplayer.ext_play(1); | |
} | |
var move = Number(flvplayer.ext_getPlayheadTime()); | |
if (isNaN(move) || move < 2) return; | |
} | |
self.current.videoStarted = true; | |
self.dispatchEvent({ type: 'start' }); | |
if (self.onstart) try { self.onstart(self) } catch(e) { postError(e) } | |
} | |
if (!self.current.isHiding && self.current.style == WNPCore.STYLE_FILL && flvplayer.ext_getVideoSize() != 'fit') { // for nicowari | |
flvplayer.ext_setVideoSize('normal'); | |
self.current.style = WNPCore.STYLE_FILL; | |
if (!self.timer.timeouts['relayout']) { | |
self.timer.setTimeout('relayout', function() { | |
self.layout(); | |
}, 3000); | |
} | |
} | |
// save current status | |
var volume = flvplayer.ext_getVolume(); | |
if (volume != null) self.current.volume = Number(volume); | |
var playhead = flvplayer.ext_getPlayheadTime(); | |
if (playhead != null) self.current.playhead = Number(playhead); | |
if (self.current.loaded !== 1) { | |
var loaded = flvplayer.ext_getLoadedRatio(); | |
if (loaded != null) self.current.loaded = Number(loaded); | |
} | |
// backward seek event. | |
if (playhead < prePos) { | |
self.dispatchEvent({ type: 'back' }); | |
if (self.onback) try { self.onback(self) } catch(e) { postError(e) } | |
if (self.current.videoFinished) { | |
self.current.videoFinished = false; | |
} | |
} | |
prePos = playhead; | |
// finish check. | |
if (!self.current.videoFinished) { | |
if (flvplayer.ext_getStatus() == 'end' && !flvplayer.ext_isRepeat()) { | |
self.current.videoFinished = true; | |
self.dispatchEvent({ type: 'finish' }); | |
if (self.onfinish) try { self.onfinish(self) } catch(e) { postError(e) } | |
} | |
} | |
} | |
catch (e) { | |
postError(e); | |
// on error(maybe security error), quit observing. | |
if (--retry == 0) { | |
self.stopObserving(); | |
throw e; | |
} | |
} | |
}, this.observeInterval || 500); | |
}; | |
WNPCore.prototype.startObserving = function() { | |
if (this.current.videoLoaded) { | |
this.startObservePlay(); | |
} | |
else { | |
this.startObserveLoad(); | |
} | |
}; | |
WNPCore.prototype.stopObserving = function() { | |
this.timer.clear('observe'); | |
}; | |
WNPCore.prototype.nicoFrameLoaded = function() { | |
this.loadingEnd(); | |
try { | |
var nico = this.nico(); | |
postError('[nicoFrameLoaded] ' + nico.window.location.href); | |
this.current.location = nico.window.location.href; // for video redirect. | |
this.current.videoinfo = cloneObj(this.getWatchInfo()); | |
var flvplayer = nico.getPlayer(); | |
// transitional period. | |
if (nico.document.body.innerHTML.indexOf("Cookie.set('player4'") >= 0) { | |
this.current.viewSize.ORG_PLAYER_VIEW_WIDTH = Consts.ORG_PLAYER3_VIEW_WIDTH; | |
this.current.viewSize.ORG_PLAYER_VIEW_HEIGHT = Consts.ORG_PLAYER3_VIEW_HEIGHT; | |
this.current.viewSize.ORG_PLAYER_CONTROL_HEIGHT = Consts.ORG_PLAYER3_CONTROL_HEIGHT; | |
this.current.viewSize.ORG_PLAYER_MINIMUM_WIDTH = Consts.ORG_PLAYER3_MINIMUM_WIDTH; | |
this.current.viewSize.ORG_PLAYER_4_3_WIDTH_ADJ = 0; | |
} | |
else if (nico.document.body.innerHTML.indexOf("zero_lead") >= 0) { | |
this.current.viewSize.ORG_PLAYER_VIEW_WIDTH = Consts.ORG_PLAYER4_VIEW_WIDTH; | |
this.current.viewSize.ORG_PLAYER_VIEW_HEIGHT = Consts.ORG_PLAYER4_VIEW_HEIGHT; | |
this.current.viewSize.ORG_PLAYER_CONTROL_HEIGHT = Consts.ORG_PLAYER4_CONTROL_HEIGHT; | |
this.current.viewSize.ORG_PLAYER_MINIMUM_WIDTH = Consts.ORG_PLAYER4_MINIMUM_WIDTH; | |
if (flvplayer.ext_isWide()) { | |
this.current.viewSize.ORG_PLAYER_4_3_WIDTH_ADJ = 0; | |
} | |
else { | |
this.current.viewSize.ORG_PLAYER_4_3_WIDTH_ADJ = Consts.ORG_PLAYER4_4_3_WIDTH_ADJ; | |
} | |
} | |
else { | |
this.current.viewSize.ORG_PLAYER_VIEW_WIDTH = Consts.ORG_PLAYER_ZERO_VIEW_WIDTH; | |
this.current.viewSize.ORG_PLAYER_VIEW_HEIGHT = Consts.ORG_PLAYER_ZERO_VIEW_HEIGHT; | |
this.current.viewSize.ORG_PLAYER_CONTROL_HEIGHT = Consts.ORG_PLAYER_ZERO_CONTROL_HEIGHT; | |
this.current.viewSize.ORG_PLAYER_MINIMUM_WIDTH = Consts.ORG_PLAYER_ZERO_MINIMUM_WIDTH; | |
if (flvplayer.ext_isWide()) { | |
this.current.viewSize.ORG_PLAYER_4_3_WIDTH_ADJ = 0; | |
} | |
else { | |
this.current.viewSize.ORG_PLAYER_4_3_WIDTH_ADJ = Consts.ORG_PLAYER_ZERO_4_3_WIDTH_ADJ; | |
} | |
} | |
flvplayer.SetVariable('Overlay.onRelease', ''); // onPress | |
flvplayer.SetVariable('Overlay.hitArea', 0); | |
this.setCommentOff(this.current.isCommentOff); | |
this.setRepeat(this.current.isRepeat); | |
this.setMute(this.current.isMute); | |
if (this.current.volume != null) { | |
this.volumeTo(this.current.volume); | |
} | |
// fix header position. | |
var header = nico.document.querySelector('div.bg_headmenu, #siteHeader'); | |
if (header) { | |
header.style.position = 'static'; | |
header.style.width = '984px'; | |
nico.document.body.style.paddingTop = '0px'; | |
addStyle('body.mode_2 { padding-top: 0px !important; }', nico.document); | |
} | |
} | |
catch(e) { postError(e) } | |
this.layout(); | |
}; | |
T.WNPCore = WNPCore; | |
/** | |
* WMP | |
* main object. | |
*/ | |
function WNP(Prefs) { | |
this.initialize.apply(this, arguments); | |
}; | |
WNP.prototype.initialize = function() { | |
this.wnpWindow = window; | |
this.build(); | |
this.playlist = { items: [], video: {}, title: {}, image: {} }; | |
this.lastOperationTime = new Date(); | |
this.lastPlaylistUpdate = 0; | |
this.menuCount = new ListElementIterator(this.wnpWindow.document.getElementById('WNP_MENU_CONTAINER')).count(); | |
this.currentMenuIndex = null; | |
this.menuHide(); | |
}; | |
WNP.prototype.build = function() { | |
var d = this.wnpWindow.document; | |
this.wnpElement = d.getElementById('WNP_PLAYER'); | |
this.wnpCore = new WNPCore(d, 'nico_frame'); | |
d.getElementById('WNP_VIEW').appendChild(this.wnpCore.element); | |
var self = this; | |
var platform = new Platform(); | |
// bind commands. | |
platform.bindCommand({ name: 'PlayStop', fn: function() { self.playToggle(); }, desc: Lang.COMMAND_PlayStop }); | |
platform.bindCommand({ name: 'PlayPause', fn: function() { self.pauseToggle(); }, desc: Lang.COMMAND_PlayPause }); | |
platform.bindCommand({ name: 'PlayPrev', fn: function() { self.schedulePrev(); }, desc: Lang.COMMAND_PlayPrev }); | |
platform.bindCommand({ name: 'PlayNext', fn: function() { self.scheduleNext(); }, desc: Lang.COMMAND_PlayNext }); | |
platform.bindCommand({ name: 'VolumeUp', fn: function() { self.volume( 5); }, desc: Lang.COMMAND_VolumeUp }); | |
platform.bindCommand({ name: 'VolumeUp+', fn: function() { self.volume( 20); }, desc: Lang.COMMAND_VolumeUp_Plus }); | |
platform.bindCommand({ name: 'VolumeDown', fn: function() { self.volume( -5); }, desc: Lang.COMMAND_VolumeDown }); | |
platform.bindCommand({ name: 'VolumeDown-', fn: function() { self.volume(-20); }, desc: Lang.COMMAND_VolumeDown_Minus }); | |
platform.bindCommand({ name: 'SeekForward', fn: function() { self.seek( 15); }, desc: Lang.COMMAND_SeekForward }); | |
platform.bindCommand({ name: 'SeekForward+', fn: function() { self.seek( 60); }, desc: Lang.COMMAND_SeekForward_Plus }); | |
platform.bindCommand({ name: 'SeekBackward', fn: function() { self.seek(-15); }, desc: Lang.COMMAND_SeekBackward }); | |
platform.bindCommand({ name: 'SeekBackward-', fn: function() { self.seek(-65); }, desc: Lang.COMMAND_SeekBackward_Minus }); | |
platform.bindCommand({ name: 'SeekBackward--', fn: function() { self.seek(Number.NEGATIVE_INFINITY); }, desc: Lang.COMMAND_SeekBackward_MinusMinus }); | |
platform.bindCommand({ name: 'SelectNextItem', fn: function(e) { self.selectNextItem(e.repeating); }, desc: Lang.COMMAND_SelectNextItem }); | |
platform.bindCommand({ name: 'SelectPrevItem', fn: function(e) { self.selectPrevItem(e.repeating); }, desc: Lang.COMMAND_SelectPrevItem }); | |
platform.bindCommand({ name: 'PlaySelectedItem', fn: function() { self.playSelectedItem(); }, desc: Lang.COMMAND_PlaySelectedItem }); | |
platform.bindCommand({ name: 'DeleteSelectedItem', fn: function() { self.deleteSelectedItem(); }, desc: Lang.COMMAND_DeleteSelectedItem }); | |
platform.bindCommand({ name: 'Menu', fn: function() { self.menuToggle(); }, desc: Lang.COMMAND_Menu }); | |
platform.bindCommand({ name: 'MenuNext', fn: function() { self.scrollMenuItem(self.currentMenuIndex + 1); }, desc: Lang.COMMAND_MenuNext }); | |
platform.bindCommand({ name: 'MenuPrev', fn: function() { self.scrollMenuItem(self.currentMenuIndex - 1); }, desc: Lang.COMMAND_MenuPrev }); | |
platform.bindCommand({ name: 'Playlist', fn: function() { self.playlistToggle(); }, desc: Lang.COMMAND_Playlist }); | |
platform.bindCommand({ name: 'History', fn: function() { self.historyToggle(); }, desc: Lang.COMMAND_History }); | |
platform.bindCommand({ name: 'Preference', fn: function() { self.preferenceToggle(); }, desc: Lang.COMMAND_Preference }); | |
platform.bindCommand({ name: 'Comment', fn: function() { self.commentOnOff(); }, desc: Lang.COMMAND_Comment }); | |
platform.bindCommand({ name: 'Loop', fn: function() { self.loopOnOff(); }, desc: Lang.COMMAND_Loop }); | |
platform.bindCommand({ name: 'Repeat', fn: function() { self.repeatOnOff(); }, desc: Lang.COMMAND_Repeat }); | |
platform.bindCommand({ name: 'Mute', fn: function() { self.muteOnOff(); }, desc: Lang.COMMAND_Mute }); | |
platform.bindCommand({ name: 'Open', fn: function() { self.openPrompt(); }, desc: Lang.COMMAND_Open }); | |
platform.bindCommand({ name: 'View', fn: function() { self.layoutToggle(); }, desc: Lang.COMMAND_View }); | |
platform.bindCommand({ name: 'NicoControl', fn: function() { self.controlToggle(); }, desc: Lang.COMMAND_NicoControl }); | |
platform.bindCommand({ name: 'AlwaysOnTop', fn: function() { self.applyPreferences({ always_on_top: !self.prefs.always_on_top }); }, desc: Lang.COMMAND_AlwaysOnTop }); | |
platform.bindCommand({ name: 'Shuffle', fn: function() { self.shuffle(); }, desc: Lang.COMMAND_Shuffle }); | |
// bind default shortcut. | |
var shortcutList = this.getDefaultKeybordShortcut(); | |
for (var i = 0; i < shortcutList.length; i++) { | |
var item = shortcutList[i]; | |
platform.bindShortcut(item.command, item.key); | |
} | |
this.platform = platform; | |
// release focus by force. | |
this._blur = function () { | |
if (!self._blurInput) { | |
var input = d.createElement('input'); | |
input.type = 'radio'; | |
input.style.cssText = 'position:absolute; top: -1px; left: -1px; width: 1px; height: 1px; '; | |
var menu = d.getElementById('WNP_MENU'); | |
menu.parentNode.insertBefore(input, menu); | |
self._blurInput = input; | |
} | |
self._blurInput.focus(); | |
}; | |
function escapeKey(e) { | |
self._blur(); | |
self.restoreControlPanel(); | |
self.scheduleCancel(); | |
if (self.isSliding) { | |
self.isSliding = false; | |
d.getElementById('WNP_MENU_SLIDER').style.backgroundColor = ''; | |
d.body.style.cursor = ''; | |
} | |
if (self.isVolumeSliding) { | |
self.isVolumeSliding = false; | |
} | |
} | |
$e(d).addEventListener('keypress', function(e) { if (e.keyCode == 27) e.preventDefault(); }, false); // prevent restore fullscreen. (Please restore by F11.) | |
$e(d).addEventListener('keydown', function(e) { if (e.keyCode == 27) escapeKey(e); }, false); | |
this.wnpCore.addEventListener('load', this._wnp_load = function(e) { | |
var wnpCore = this; | |
var iframe = wnpCore.element.querySelector('.wnp_nicoflame'); | |
$e(iframe.contentWindow).addEventListener('focus', function(e) { | |
if (wnpCore.current.style != WNPCore.STYLE_RESTORE) { | |
// for zero player comment box. | |
if (iframe.contentWindow.WatchApp) { | |
return; | |
} | |
setTimeout(function() { self._blur(); wnpCore.sight(); }, 10); // for ie, firefox, chrome. | |
} | |
}, false); | |
}, false); | |
function bindEventCommand(el, type, command) { | |
$e(el).addEventListener(type, function(e) { | |
e.preventDefault(); | |
e.stopPropagation(); | |
platform.doCommand(command); | |
}, false); | |
} | |
function bindEventFunc(el, type, func, p, s, c) { | |
$e(el).addEventListener(type, function(e) { | |
if (p) e.preventDefault(); | |
if (s) e.stopPropagation(); | |
func(e); | |
}, !!c); | |
} | |
bindEventCommand(d.getElementById('WNP_C_PREV'), 'click', 'PlayPrev'); | |
bindEventCommand(d.getElementById('WNP_C_PLAY'), 'click', 'PlayStop'); | |
bindEventCommand(d.getElementById('WNP_C_NEXT'), 'click', 'PlayNext'); | |
bindEventCommand(d.getElementById('WNP_C_LOOP'), 'click', 'Loop'); | |
bindEventCommand(d.getElementById('WNP_C_NICO_REPEAT'), 'click', 'Repeat'); | |
bindEventCommand(d.getElementById('WNP_C_NICO_COMM'), 'click', 'Comment'); | |
bindEventCommand(d.getElementById('WNP_C_NICO_MUTE'), 'click', 'Mute'); | |
bindEventCommand(d.getElementById('WNP_C_NICO_OPEN'), 'click', 'Open'); | |
bindEventCommand(d.getElementById('WNP_C_PLAYLIST'), 'click', 'Playlist'); | |
bindEventCommand(d.getElementById('WNP_C_HISTORY'), 'click', 'History'); | |
bindEventCommand(d.getElementById('WNP_C_PREFERENCE'), 'click', 'Preference'); | |
bindEventCommand(d.getElementById('WNP_C_SCREEN'), 'click', 'View'); | |
bindEventCommand(d.getElementById('WNP_C_NICO_PAUSE'), 'click', 'PlayPause'); | |
bindEventCommand(d.getElementById('WNP_HEADER'), 'click', 'Menu'); | |
bindEventCommand(d.getElementById('WNP_FOOTER'), 'click', 'NicoControl'); | |
bindEventCommand(d.getElementById('WNP_C_ALWAYS_ON_TOP'), 'click', 'AlwaysOnTop'); | |
bindEventCommand(d.getElementById('WNP_C_SHUFFLE'), 'click', 'Shuffle'); | |
bindEventFunc(d.getElementById('WNP_C_PLAYLIST_URI'), 'click', function(e) { self.wnpWindow.alert(Lang.SAVE_PLAYLIST_USAGE); }, true, true); | |
bindEventFunc(d.getElementById('WNP_HEADER'), 'mousemove', function(e) { self.hideHeaderAfter(5000); }); | |
bindEventFunc(d.getElementById('WNP_FOOTER'), 'mouseover', function(e) { self.restoreControlPanel(); }); | |
bindEventFunc(d.getElementById('WNP_FOOTER'), 'mousemove', function(e) { self.hideFooterAfter(5000); }); | |
bindEventFunc(d.getElementById('WNP_C_PLAYLIST_STYLE'), 'click', function(e) { self.applyPreferences({ playlist_style_simple: e.currentTarget.checked }, true); }, false, true); | |
bindEventFunc(d.getElementById('WNP_C_REMOVE_ON_FINISH'), 'click', function(e) { self.applyPreferences({ remove_on_finish: e.currentTarget.checked }, true); }, false, true); | |
bindEventFunc(d.getElementById('WNP_C_USE_HISTORY'), 'click', function(e) { self.applyPreferences({ use_history: e.currentTarget.checked }, true); }, false, true); | |
bindEventFunc(d.getElementById('WNP_C_PREF_PLAYLIST_STYLE'), 'click', function(e) { self.applyPreferences({ playlist_style_simple: e.currentTarget.checked }, true); }, false, true); | |
bindEventFunc(d.getElementById('WNP_C_PREF_REMOVE_ON_FINISH'), 'click', function(e) { self.applyPreferences({ remove_on_finish: e.currentTarget.checked }, true); }, false, true); | |
bindEventFunc(d.getElementById('WNP_C_PREF_USE_HISTORY'), 'click', function(e) { self.applyPreferences({ use_history: e.currentTarget.checked }, true); }, false, true); | |
bindEventFunc(d.getElementById('WNP_C_PREF_SKIP_DELETED_VIDEO'), 'click', function(e) { self.applyPreferences({ skip_deleted_video: e.currentTarget.checked }, true); }, false, true); | |
bindEventFunc(d.getElementById('WNP_C_PREF_USE_OFFTIMER'), 'click', function(e) { self.applyPreferences({ use_offtimer: e.currentTarget.checked }, true); }, false, true); | |
bindEventFunc(d.getElementById('WNP_C_PREF_OFFTIMER_MINUTE'), 'change', function(e) { self.applyPreferences({ offtimer_minute: e.currentTarget.value }, true); }, false, true); | |
bindEventFunc(d.getElementById('WNP_C_PREF_USE_LOOP_BREAK'), 'click', function(e) { self.applyPreferences({ use_loop_break: e.currentTarget.checked }, true); }, false, true); | |
bindEventFunc(d.getElementById('WNP_C_PREF_LOOP_BREAK_COUNT'), 'change', function(e) { self.applyPreferences({ loop_break_count: e.currentTarget.value }, true); }, false, true); | |
bindEventFunc(d.getElementById('WNP_C_PREF_CANCEL_JUMP'), 'click', function(e) { self.applyPreferences({ cancel_jump: e.currentTarget.checked }, true); }, false, true); | |
bindEventFunc(d.getElementById('WNP_C_PREF_FORCE_VISIT_ON_OPERA'), 'click', function(e) { self.applyPreferences({ force_visit_on_opera: e.currentTarget.checked }, true); }, false, true); | |
bindEventFunc(d.getElementById('WNP_C_SET_DEFAULT'), 'click', function(e) { self.setDefaultPreferences(); }, false, true); | |
bindEventFunc(d.getElementById('WNP_C_NICO_SEEKBAR'), 'click', function(e) { | |
if (!self.wnpCore.current.isPlaying) return; | |
var seekbar = e.currentTarget; | |
var width = seekbar.offsetWidth; | |
var loc = (e.offsetX != null) ? e.offsetX : (e.layerX - seekbar.offsetLeft); | |
var len = self.wnpCore.length(); | |
if (len) { | |
self.wnpCore.seekTo(len * (loc / width)); | |
self.updateControlPanelStatus(); | |
} | |
}, false, true); | |
var volumeBar = d.getElementById('WNP_C_NICO_VOLUMEBAR'); | |
bindEventFunc(volumeBar, 'click', function() {}, false, true); | |
/*@ IECover.putCover(volumeBar); @*/ | |
bindEventFunc(volumeBar, 'mousedown', function(e) { | |
self.isDragging = true; | |
self.isVolumeSliding = true; | |
setVolume(e); | |
var controlPanel = self.wnpWindow.document.getElementById('WNP_CONTROL_PANEL'); | |
controlPanel.style.visibility = 'visible'; | |
}, true, true); | |
var menuSlider = d.getElementById('WNP_MENU_SLIDER'); | |
/*@ IECover.putCover(menuSlider); @*/ | |
bindEventFunc(menuSlider, 'mousedown', function(e) { | |
self.isDragging = true; | |
self.isSliding = true; | |
menuSlider.style.backgroundColor = '#696969'; | |
d.body.style.cursor = 'e-resize'; | |
}, true, true); | |
bindEventFunc(d, 'mousemove', function(e) { | |
/*@ | |
if (self.isDragging) e.preventDefault(); | |
@*/ | |
if (self.isVolumeSliding) { | |
setVolume(e); | |
} | |
}); | |
bindEventFunc(d, 'mouseup', function(e) { | |
if (self.isVolumeSliding) { | |
self.showControlPanel(); | |
} | |
if (self.isSliding) { | |
self.isSliding = false; | |
menuSlider.style.backgroundColor = ''; | |
d.body.style.cursor = ''; | |
var w = self.wnpWindow.innerWidth || ie.clientWidth(d); | |
var h = self.wnpWindow.innerHeight || ie.clientHeight(d); | |
var x = e.clientX; | |
var y = e.clientY; | |
if (y >= 0 && y <= h) { | |
var ratio = Math.ceil((1 - x / w) * 100); | |
if (ratio < 10 ) ratio = 10; | |
if (ratio > 100) ratio = 100; | |
self.prefs.menu_width_ratio = ratio; | |
self.menuShow(); | |
} | |
} | |
if (self.isVolumeSliding) { | |
self.isVolumeSliding = false; | |
} | |
if (self.isDragging) { | |
self.timer.setTimeout('slide_end', function() { // for ie's click event. | |
self.isDragging = false; | |
}, 100); | |
} | |
}); | |
function setVolume(e) { | |
var p = getAbsolutePosition(volumeBar); | |
var width = volumeBar.offsetWidth; | |
var loc = (e.clientX <= p.x) ? 0 : | |
(e.clientX >= p.x + width) ? 100 | |
: (e.clientX - p.x); | |
var len = 100; | |
self.wnpCore.volumeTo(len * (loc / width)); | |
self.updateControlPanelStatus(); | |
} | |
function updateLastOperationTime() { | |
self.lastOperationTime = new Date(); | |
} | |
bindEventFunc(d, 'keydown', updateLastOperationTime, false, false, true); | |
bindEventFunc(d, 'mousemove', updateLastOperationTime, false, false, true); | |
//bindEventFunc(this.wnpWindow, 'focus', updateLastOperationTime); | |
bindEventFunc(this.wnpWindow, 'resize', updateLastOperationTime); | |
bindEventFunc(this.wnpWindow, 'blur', function() { | |
if (self.prefs.always_on_top) { | |
self.timer.setTimeout('always_on_top', function() { | |
self.wnpWindow.focus(); | |
}, 500); | |
} | |
}, false); | |
var list = d.getElementById('WNP_PLAYLIST_ITEMS'); | |
var listUtil = new ListUtil(list); | |
listUtil.addEventListener('dragend', function() { | |
self.updatePlaylistURI(); | |
}); | |
listUtil.addEventListener('selectioncanged', function(e) { | |
self.selectionIterator.current(e.lastSelectedItem); | |
}); | |
listUtil.addEventListener('itemover', function(e) { | |
var videoInfo = createVideoInfo(createPlayInfo(e.item)); | |
self.showStatus(videoInfo.title, 5); | |
if (self.itemMarquee != null) self.itemMarquee.restore(); | |
var desc = e.item.querySelector('.video_desc'); | |
var title = e.item.querySelector('.video_desc a'); | |
if (!title) return; | |
if (desc.clientWidth >= title.offsetWidth) return; | |
self.itemMarquee = new iMarquee(title); | |
self.itemMarquee.go(); | |
}); | |
listUtil.addEventListener('itemout', function(e) { | |
self.clearStatus(); | |
if (self.itemMarquee != null) { | |
self.itemMarquee.restore(); | |
self.itemMarquee = null; | |
} | |
}); | |
listUtil.hoverColor = Colors.item_hover; | |
listUtil.selectedColor = Colors.item_selected; | |
listUtil.draggingColor = Colors.item_dragging; | |
this.listUtil = listUtil; | |
bindEventFunc(list, 'click', function(e) { | |
if (e.target === e.currentTarget) return; | |
var item = e.target; | |
var a = null; | |
while (item.parentNode !== e.currentTarget) { | |
if (item.nodeName == 'A') { a = item; } | |
item = item.parentNode; | |
} | |
if (e.target.getAttribute('name') == 'deleteButton') { | |
self.remove(item); | |
e.preventDefault(); | |
} | |
if (a) { | |
if (/(http:\/\/www\.nicovideo\.jp\/watch\/\w+)/.test(a.href)) { | |
self.play(self.playlistIterator.indexOf(item)); | |
e.preventDefault(); | |
} | |
} | |
}); | |
var histroy_list = d.getElementById('WNP_HISTORY_ITEMS'); | |
bindEventFunc(histroy_list, 'click', function(e) { | |
if (e.target === e.currentTarget) return; | |
var item = e.target; | |
var a = null; | |
while (item.parentNode !== e.currentTarget) { | |
if (item.nodeName == 'A') { a = item; } | |
item = item.parentNode; | |
} | |
if (e.target.getAttribute('name') == 'deleteButton') { | |
histroy_list.removeChild(item); | |
e.preventDefault(); | |
} | |
if (a) { | |
if (/(http:\/\/www\.nicovideo\.jp\/watch\/\w+)/.test(a.href)) { | |
var pl = createPlayInfo(item); | |
if (self.wnpCore.current.isPlaying) { | |
WNP.insert(pl); | |
} | |
else { | |
WNP.play(pl); | |
} | |
histroy_list.removeChild(item); | |
e.preventDefault(); | |
} | |
} | |
}); | |
this.thumbnailMap = {}; | |
var lazyLoad = function() { self.lazyloadThumbnailImagesLater(); }; | |
bindEventFunc(this.wnpWindow, 'resize', lazyLoad); | |
bindEventFunc(list, 'scroll', lazyLoad); | |
this.timer = new TimerManager(this.wnpWindow); | |
this.preloads = new ListedKeyMap(); | |
this.playlistIterator = new ListElementIterator(list); | |
this.selectionIterator = new ListElementIterator(list); | |
this.prefs = this.getDefaultPreferences(); | |
this.applyPreferences(); | |
this.storage = createStorage(); | |
this.storage.onload = function () { | |
self.loadPreferences(); | |
}; | |
// Clipboard Support. | |
var clipboard = new ClipboardReciever(d); | |
clipboard.onpaste = function() { | |
var playlist = createPlayInfoFromText(clipboard.text); | |
if (playlist.items.length > 0) { | |
self.addEx(playlist, { start: !self.wnpCore.current.isPlaying }); | |
} | |
}; | |
platform.keyBinds[''].addAllowFilter(function(e) { | |
return e.target === clipboard.element || e.target === self._blurInput; | |
}); | |
}; | |
WNP.prototype.openPrompt = function() { | |
var text = this.wnpWindow.prompt(Lang.PLEASE_INPUT_VIDEOID_OR_URL, ''); | |
if (text) { | |
var playlist = createPlayInfoFromText(text); | |
if (playlist.items.length > 0) { | |
this.addEx(playlist, { start: !this.wnpCore.current.isPlaying }); | |
} | |
} | |
}; | |
WNP.prototype.selectNextItem = function(isKeyRepeat) { | |
if (!this.selectionIterator.item) { | |
this.selectionIterator.current(this.playlistIterator.item); | |
} | |
this.selectionIterator.next(); | |
if (isKeyRepeat) { | |
this.selectionIterator.isNullThenLast(); | |
} | |
else { | |
this.selectionIterator.isNullThenFirst(); | |
} | |
if (this.selectionIterator.item == null) return; | |
this.listUtil.select(this.selectionIterator.item); | |
this.scrollPlaylistTo(this.selectionIterator.item); | |
}; | |
WNP.prototype.selectPrevItem = function(isKeyRepeat) { | |
if (!this.selectionIterator.item) { | |
this.selectionIterator.current(this.playlistIterator.item).isNullThenFirst(); | |
} | |
else { | |
this.selectionIterator.prev(); | |
if (isKeyRepeat) { | |
this.selectionIterator.isNullThenFirst(); | |
} | |
else { | |
this.selectionIterator.isNullThenLast(); | |
} | |
} | |
if (this.selectionIterator.item == null) return; | |
this.listUtil.select(this.selectionIterator.item); | |
this.scrollPlaylistTo(this.selectionIterator.item); | |
}; | |
WNP.prototype.playSelectedItem = function() { | |
this.scheduleItem(this.selectionIterator.item); | |
}; | |
WNP.prototype.deleteSelectedItem = function() { | |
if (!this.isMenuShowing || this.currentMenuIndex != 0) return; | |
var items = this.listUtil.getSelectedItems(); | |
for (var i = 0, len = items.length; i < len; i++) { | |
var item = items[i]; | |
if (this.selectionIterator.item === item) { | |
this.selectionIterator.next(); | |
} | |
this.remove(item); | |
} | |
this.selectionIterator.isNullThenLast(); | |
if (this.selectionIterator.item) { | |
this.listUtil.select(this.selectionIterator.item); | |
} | |
this.scrollPlaylistTo(this.selectionIterator.item); | |
}; | |
WNP.prototype.scrollPlaylistTo = function(item) { | |
if (!item) return; | |
if (item.nodeType != 1) return; | |
if (this.scrollSoar != null) { | |
this.scrollSoar.cancel(); | |
} | |
var list = this.wnpWindow.document.getElementById('WNP_PLAYLIST_ITEMS'); | |
this.scrollSoar = new Soar(list); | |
var allowance = item.offsetHeight; // 1row. | |
this.scrollSoar | |
.to({scrollTop: Math.min(Math.max(item.offsetTop - list.clientTop - allowance, 0), list.scrollHeight - list.clientHeight)}) | |
.go(this.wnpWindow); | |
var self = this; | |
this.scrollSoar.addEventListener('finish', function() { | |
self.scrollSoar = null; | |
}); | |
}; | |
WNP.prototype.seek = function(time) { | |
this.wnpCore.seek(time); | |
if (time != Number.NEGATIVE_INFINITY) { | |
this.showControlPanel(); | |
} | |
else { | |
// delay. | |
var self = this; | |
this.wnpWindow.setTimeout(function(){ self.showControlPanel(); }, 10); | |
} | |
}; | |
WNP.prototype.volume = function(vol) { | |
this.wnpCore.volume(vol); | |
this.showControlPanel(); | |
}; | |
WNP.prototype.showControlPanel = function() { | |
this.clearStatus(); | |
this.updateControlPanelStatus(); | |
var controlPanel = this.wnpWindow.document.getElementById('WNP_CONTROL_PANEL'); | |
controlPanel.style.visibility = 'visible'; | |
this.timer.setTimeout('controlPanel', function(){ | |
controlPanel.style.visibility = ''; | |
}, 3000); | |
}; | |
WNP.prototype.hideControlPanel = function() { | |
this.timer.clear('controlPanel'); | |
var controlPanel = this.wnpWindow.document.getElementById('WNP_CONTROL_PANEL'); | |
controlPanel.style.visibility = 'hidden'; | |
}; | |
WNP.prototype.updateControlPanelStatus = function() { | |
var cur = this.wnpCore.playhead(); | |
var len = this.wnpCore.length(); | |
this.wnpWindow.document.getElementById('WNP_C_NICO_SEEKBAR_BAR').style.width = (len ? (Math.ceil(cur / len * 100) + '%') : '0'); | |
var vol = this.wnpCore.volume(); | |
if (vol != null) { | |
this.wnpWindow.document.getElementById('WNP_C_NICO_VOLUMEBAR_BAR').style.width = Math.ceil(vol / 100 * 100) + '%'; | |
} | |
}; | |
WNP.prototype.observingVideoStart = function() { | |
var self = this; | |
this.timer.setInterval('observingVideo', function() { | |
self.updateControlPanelStatus(); | |
}, 1000); | |
}; | |
WNP.prototype.observingVideoStop = function() { | |
this.timer.clear('observingVideo'); | |
}; | |
WNP.prototype.restoreControlPanel = function() { | |
if (this.isDragging) return; | |
this.timer.clear('controlPanel'); | |
var controlPanel = this.wnpWindow.document.getElementById('WNP_CONTROL_PANEL'); | |
controlPanel.style.visibility = ''; | |
}; | |
WNP.prototype.hideHeaderAfter = function(sec) { | |
if (!this._hideHeaderStyle) { | |
var hide_style_str = [ | |
'div.wnp_header:hover .control { visibility: hidden; }' | |
].join('\n'); | |
this._hideHeaderStyle = addStyle(hide_style_str, this.wnpWindow.document); | |
} | |
var style = this._hideHeaderStyle; | |
setStyleEnabled(style, false); | |
var self = this; | |
this.timer.setTimeout('hideHeaderAfter', function() { | |
setStyleEnabled(style, true); | |
}, sec); | |
}; | |
WNP.prototype.hideFooterAfter = function(sec) { | |
if (!this._hideFooterStyle) { | |
var hide_style_str = [ | |
'div.wnp_footer:hover .control { visibility: hidden; }', | |
'div.wnp_footer:hover .wnp_control_panel { visibility: hidden; }' | |
].join('\n'); | |
this._hideFooterStyle = addStyle(hide_style_str, this.wnpWindow.document); | |
} | |
var style = this._hideFooterStyle; | |
setStyleEnabled(style, false); | |
var self = this; | |
this.timer.setTimeout('hideHeaderAfter', function() { | |
setStyleEnabled(style, true); | |
}, sec); | |
}; | |
WNP.prototype.controlToggle = function() { | |
if (this.isDragging) return; | |
this.wnpCore.setControlShowing(!this.wnpCore.current.isControlShowing); | |
}; | |
WNP.prototype.menuToggle = function() { | |
if (this.isMenuShowing) { | |
this.menuHide(); | |
} | |
else { | |
this.showMenuItem(this.currentMenuIndex); | |
} | |
}; | |
WNP.prototype.playlistToggle = function() { | |
this.toggleMenuItem(0); | |
}; | |
WNP.prototype.historyToggle = function() { | |
this.toggleMenuItem(1); | |
}; | |
WNP.prototype.preferenceToggle = function() { | |
this.toggleMenuItem(2); | |
}; | |
WNP.prototype.toggleMenuItem = function(index) { | |
if (this.currentMenuIndex === index) { | |
if (this.isMenuShowing) this.menuHide(); | |
else this.menuShow(); | |
} | |
else { | |
this.showMenuItem(index); | |
} | |
}; | |
WNP.prototype.scrollMenuItem = function(index) { | |
if (!this.isMenuShowing) { | |
if (index >= 0) { | |
this.showMenuItem(0); | |
} | |
else { | |
this.showMenuItem(this.menuCount - 1); | |
} | |
} | |
else { | |
if (this.menuSoar && this.menuSoar.isActive) { | |
this.menuSoar.cancel(); | |
} | |
if (this.isMenuShowing && (index < 0 || index >= this.menuCount)) { | |
this.menuHide(); | |
} | |
else { | |
var menuContainer = this.wnpWindow.document.getElementById('WNP_MENU_CONTAINER'); | |
var menus = menuContainer.querySelectorAll('.wnp_menu_content'); | |
for (var i = 0; i < menus.length; i++) { | |
menus[i].style.visibility = ''; | |
} | |
if (!this.menuSoar) { | |
this.menuSoar = new Soar(menuContainer.style); | |
this.menuSoar.from({marginLeft: '0.0%'}); | |
var self = this; | |
this.menuSoar.addEventListener('finish', function() { | |
self.showMenuItem(self.currentMenuIndex); | |
}, false); | |
} | |
this.menuSoar.to({marginLeft: -(100 * index) + '.0%'}).go(this.wnpWindow); | |
this.currentMenuIndex = index; | |
} | |
} | |
}; | |
WNP.prototype.showMenuItem = function(index) { | |
if (index == null) index = 0; | |
if (index < 0) index = 0; | |
if (index >= this.menuCount) index = this.menuCount - 1; | |
var menuContainer = this.wnpWindow.document.getElementById('WNP_MENU_CONTAINER'); | |
// hide other panel to avoid focus invisible controls. | |
var menus = menuContainer.querySelectorAll('.wnp_menu_content'); | |
for (var i = 0; i < menus.length; i++) { | |
if (i == index) { | |
menus[i].style.visibility = ''; | |
} | |
else { | |
menus[i].style.visibility = 'hidden'; | |
} | |
} | |
// for Opera10.10 bug (can't operate select element's index from script.) | |
if (index == 2) { | |
replace(document.getElementById('WNP_C_PREF_OFFTIMER_MINUTE')); | |
replace(document.getElementById('WNP_C_PREF_LOOP_BREAK_COUNT')); | |
} | |
menuContainer.style.marginLeft = -(100 * index) + '%'; | |
if (!this.isMenuShowing) this.menuShow(); | |
this.currentMenuIndex = index; | |
}; | |
WNP.prototype.menuShow = function() { | |
var menu = this.wnpWindow.document.getElementById('WNP_MENU'); | |
var view = this.wnpWindow.document.getElementById('WNP_VIEW'); | |
menu.style.borderRightWidth = '5px'; // for Opera9.5 | |
menu.style.visibility = ''; | |
menu.style.width = this.prefs.menu_width_ratio + '%'; | |
view.style.width = (100-this.prefs.menu_width_ratio) + '%'; | |
this.isMenuShowing = true; | |
}; | |
WNP.prototype.menuHide = function() { | |
var menu = this.wnpWindow.document.getElementById('WNP_MENU'); | |
var view = this.wnpWindow.document.getElementById('WNP_VIEW'); | |
menu.style.borderRightWidth = '0'; // for Opera9.5 | |
menu.style.visibility = 'hidden'; | |
menu.style.width = '0'; | |
view.style.width = '100%'; | |
this.isMenuShowing = false; | |
this.currentMenuIndex = null; | |
}; | |
WNP.prototype.playToggle = function() { | |
if (this.wnpCore.current.isPlaying) this.stop(); | |
else { | |
if (!this.playlistIterator.item) { | |
this.playlistIterator.first(); | |
} | |
this.play(); | |
} | |
}; | |
WNP.prototype.pauseToggle = function() { | |
if (!this.wnpCore.current.isPlaying) { | |
this.playToggle(); | |
return; | |
} | |
if (this.wnpCore.current.isPausing) { | |
this.wnpCore.resume(); | |
} | |
else { | |
this.wnpCore.pause(); | |
} | |
this.updatePauseButton(); | |
}; | |
WNP.prototype.updatePauseButton = function() { | |
var button = this.wnpWindow.document.getElementById('WNP_C_NICO_PAUSE'); | |
if (this.wnpCore.current.isPausing || !this.wnpCore.current.isPlaying) { | |
button.innerHTML = '<img src="' + Consts.WNP_IMAGE_PLAY + '">'; | |
} | |
else { | |
button.innerHTML = '<img src="' + Consts.WNP_IMAGE_PAUSE + '">'; | |
} | |
}; | |
WNP.prototype.commentOnOff = function() { | |
this.applyPreferences({ comment_off: !this.wnpCore.current.isCommentOff }); | |
this.showControlPanel(); | |
}; | |
WNP.prototype.loopOnOff = function() { | |
this.applyPreferences({ loop: !this.prefs.loop }); | |
}; | |
WNP.prototype.repeatOnOff = function() { | |
this.applyPreferences({ repeat: !this.wnpCore.current.isRepeat }); | |
this.showControlPanel(); | |
}; | |
WNP.prototype.muteOnOff = function() { | |
this.applyPreferences({ mute: !this.wnpCore.current.isMute }); | |
this.showControlPanel(); | |
}; | |
WNP.prototype.addEx = function(playlist, option) { | |
var opt = option || {}; | |
this.lastOperationTime = new Date(); | |
var start = opt.start && (new Date() - this.lastPlaylistUpdate >= 1000); // ignore start when last update within 1sec. | |
var startPoint = wnp.playlist.items.length; // add point. | |
var newList = null; | |
if (/^(?:http:\/\/www\.nicovideo\.jp\/watch\/)?((?:[a-z]{2})?[0-9]+)/.test(playlist.toString())) { | |
newList = {items: [RegExp.$1], video: {}, title: {}, image: {}}; | |
} | |
else if (/^http:\/\/www\.nicovideo\.jp\/.*/.test(playlist.toString())) { | |
var self = this; | |
createPlayInfoFromUrl(playlist.toString(), function(playlist) { | |
self.addEx(playlist, option); | |
}); | |
return; | |
} | |
else { | |
newList = playlist; | |
} | |
var document = this.wnpWindow.document; | |
var ul = document.getElementById('WNP_PLAYLIST_ITEMS'); | |
var df = document.createDocumentFragment(); | |
for (var i = 0, len = newList.items.length; i < len; i++) { | |
var videoinfo = createVideoInfo(newList, i); | |
var li = this.createPlaylistItem(videoinfo, i >= 10); | |
df.appendChild(li); | |
} | |
var firstItem = df.firstChild; | |
if (opt.type == 'insertBeforeCurrent') { | |
var target = this.playlistIterator.item || ul.firstChild; | |
ul.insertBefore(df, target); | |
} | |
else if (opt.type == 'insertAfterCurrent') { | |
var target = this.playlistIterator.item || ul.firstChild; | |
ul.insertBefore(df, target ? target.nextSibling : null); | |
} | |
else { | |
ul.appendChild(df); | |
} | |
if (start && firstItem) { | |
var self = this; | |
this.wnpWindow.setTimeout(function() { | |
self.lastOperationTime = 0; // scroll to start point by force. | |
self.play(self.playlistIterator.indexOf(firstItem)); | |
self.lastOperationTime = new Date(); | |
}, 0); // for firefox exception. | |
} | |
this.updatePlaylistURI(); | |
this.lazyloadThumbnailImagesLater(1000); | |
}; | |
WNP.prototype.addHistory = function(newList) { | |
if (!newList) return; | |
var document = this.wnpWindow.document; | |
var ul = document.getElementById('WNP_HISTORY_ITEMS'); | |
var df = document.createDocumentFragment(); | |
for (var i = 0, len = newList.items.length; i < len; i++) { | |
var videoInfo = createVideoInfo(newList, i); | |
var li = this.createPlaylistItem(videoInfo, false); | |
df.appendChild(li); | |
} | |
ul.appendChild(df); | |
}; | |
WNP.prototype.createPlaylistItem = function(info, suppressThumbnail) { | |
var wnpDocument = this.wnpWindow.document; | |
var li = wnpDocument.createElement('li'); | |
var url = info.url; | |
if (!url) url = 'http://www.nicovideo.jp/watch/' + info.id; | |
var title = info.title || info.id; | |
var thumbnail = info.thumbnail; | |
if (!thumbnail) { | |
if (/^[a-z]{2}/.test(info.id)) { | |
thumbnail = 'http:\/\/tn-skr2.smilevideo.jp/smile?i=' + info.id.slice(2); | |
} | |
else { | |
thumbnail = Consts.WNP_THUMB_PLACEHOLDER; | |
} | |
} | |
if (suppressThumbnail) { | |
this.thumbnailMap[info.id] = thumbnail; | |
thumbnail = Consts.WNP_THUMB_PLACEHOLDER; | |
} | |
li.innerHTML = [ | |
'<div class="video_info">', | |
' <span class="playmark">\u25C6</span>', | |
' <a href="' + url + '" title="' + title + '" target="nico_frame" class="video_link">', | |
' <img class="thumbnail ' + (suppressThumbnail ? 'lazyLoad' : '') + '" name="' + info.id + '" src="' + thumbnail + '" width="65" height="50" alt="' + title + '">', | |
' </a>', | |
'</div>', | |
'<div class="video_desc">', | |
' <span class="video_desc_title"><a href="' + url + '" name="' + info.id + '" title="' + title + '" target="nico_frame" class="video_link">' + title + '</a></span><br>', | |
' <button name="deleteButton">\u00D7</button>', | |
'</div>', | |
].join(''); | |
/*@ IECover.putCover(li); @*/ | |
return li; | |
}; | |
WNP.prototype.lazyloadThumbnailImagesLater = function(delay) { | |
this.timer.clear('lazyloadThumbnailImages'); | |
var self = this; | |
if (delay == null) { | |
delay = 200; | |
} | |
this.timer.setTimeout('lazyloadThumbnailImages', function() { | |
self.lazyloadThumbnailImages(); | |
}, delay); | |
}; | |
WNP.prototype.lazyloadThumbnailImages = function() { | |
var ul = this.wnpWindow.document.getElementById('WNP_PLAYLIST_ITEMS'); | |
var lazyImages = ul.querySelectorAll('img.lazyLoad'); | |
if (lazyImages.length == 0) { | |
this.thumbnailMap = {}; | |
return; | |
} | |
var allowance = Math.max(ul.clientHeight / 5, 150); | |
var topMargin = ul.clientTop; | |
var scrollTop = ul.scrollTop + topMargin; | |
var scrollBottom = ul.scrollTop + topMargin + ul.clientHeight + allowance; | |
for (var i = 0, len = lazyImages.length; i < len; i++) { | |
var img = lazyImages[i]; | |
var offsetTop = img.offsetTop; | |
var offsetHeight = img.offsetHeight; | |
/*@ | |
var rect = img.getBoundingClientRect(); | |
offsetTop = rect.top + ul.scrollTop - ul.offsetTop; | |
@*/ | |
if (offsetTop + offsetHeight < scrollTop) continue; | |
if (offsetTop > scrollBottom) break; | |
removeClass(img, 'lazyLoad'); | |
var thumbUrl = this.thumbnailMap[img.name]; | |
img.src = thumbUrl; | |
} | |
}; | |
WNP.prototype.clear = function() { | |
this.playlist = { items: [], video: {}, title: {}, image: {} }; | |
this.playlistIterator.current(null); | |
this.selectionIterator.current(null); | |
var ul = this.wnpWindow.document.getElementById('WNP_PLAYLIST_ITEMS'); | |
while(ul.lastChild) ul.removeChild(ul.lastChild); | |
this.updatePlaylistURI(); | |
}; | |
WNP.prototype.remove = function(item) { | |
var info = createVideoInfo(createPlayInfo(item)); | |
var ul = this.wnpWindow.document.getElementById('WNP_PLAYLIST_ITEMS'); | |
if (item.parentNode === ul) { | |
if (item === this.playlistIterator.item) { | |
// cutting corners. | |
var dummy = this.wnpWindow.document.createTextNode(''); | |
ul.insertBefore(dummy, item); | |
this.playlistIterator.current(dummy); | |
} | |
ul.removeChild(item); | |
} | |
if (this.wnpWindow.document.getElementsByName(info.id).length == 0) { | |
this.removePreload(info); | |
} | |
this.lazyloadThumbnailImagesLater(1000); | |
this.updatePlaylistURI(); | |
}; | |
WNP.prototype.shuffle = function() { | |
var document = this.wnpWindow.document; | |
var ul = document.getElementById('WNP_PLAYLIST_ITEMS'); | |
var childs = []; | |
for (var i = 0, len = ul.childNodes.length; i < len; i++) { | |
childs.push(ul.childNodes[i]); | |
} | |
// http://la.ma.la/blog/diary_200608300350.htm | |
var i = childs.length; | |
while(i) { | |
var j = Math.random() * i | 0; | |
var t = childs[--i]; | |
childs[i] = childs[j]; | |
childs[j] = t; | |
} | |
var df = document.createDocumentFragment(); | |
for (var i = 0, len = childs.length; i < len; i++) { | |
df.appendChild(childs[i]); | |
} | |
ul.appendChild(df); | |
if (this.wnpCore.current.isPlaying) { | |
this.scrollPlaylistTo(this.playlistIterator.item); | |
} | |
this.updatePlaylistURI(); | |
this.lazyloadThumbnailImagesLater(); | |
}; | |
WNP.prototype.updatePlaylistURI = function() { | |
this.timer.clear('updatePlaylistURI'); | |
var self = this; | |
this.timer.setTimeout('updatePlaylistURI', function() { | |
var document = self.wnpWindow.document; | |
var items = document.getElementById('WNP_PLAYLIST_ITEMS'); | |
var playlist = { items : [], video : {}, title : {}, image : {} }; | |
var itr = new ListElementIterator(items).first(); | |
while (itr.item) { | |
var playinfo = createPlayInfo(itr.item); | |
var videoid = playinfo.items[0]; | |
playlist.items.push(videoid); | |
playlist.title[videoid] = playinfo.title[videoid]; | |
if (/^http/.test(playinfo.image[videoid])) { | |
playlist.image[videoid] = playinfo.image[videoid]; | |
} | |
itr.next(); | |
} | |
self.playlist = playlist; | |
var save = document.getElementById('WNP_C_PLAYLIST_URI'); | |
save.href = 'javascript:' + encodeURIComponent(Consts.WNP_GLOBAL_NAME + '.open(' + toJSON(playlist) + ')'); | |
var date = new Date(); | |
save.title = [date.getFullYear(), date.getMonth() + 1, date.getDate()].join('-') + '.pls'; | |
save.firstChild.alt = save.title; | |
self.updatePrevAndNext(); | |
self.lastPlaylistUpdate = new Date(); | |
//self.updateAlternativeView(); | |
}, 2000); | |
}; | |
WNP.prototype.updatePrevAndNext = function() { | |
var document = this.wnpWindow.document; | |
var currentItem = this.playlistIterator.item; | |
var itr = new ListElementIterator(document.getElementById('WNP_PLAYLIST_ITEMS')); | |
var button = document.getElementById('WNP_C_PREV'); | |
if (itr.prev(currentItem).item) { | |
var playinfo = createPlayInfo(itr.item); | |
this.bindVideoInfo(button, playinfo.video[playinfo.items[0]], playinfo.title[playinfo.items[0]]); | |
} | |
else { | |
this.unbindVideoInfo(button); | |
} | |
var button = document.getElementById('WNP_C_NEXT'); | |
if (itr.next(currentItem).item) { | |
var playinfo = createPlayInfo(itr.item); | |
this.bindVideoInfo(button, playinfo.video[playinfo.items[0]], playinfo.title[playinfo.items[0]]); | |
} | |
else{ | |
this.unbindVideoInfo(button); | |
} | |
}; | |
WNP.prototype.bindVideoInfo = function(a, url, title) { | |
a.href = url; | |
var self = this; | |
a.onmouseover = function() { | |
self.showStatus(title, 5); | |
}; | |
a.onmouseout = function() { | |
self.clearStatus(); | |
}; | |
}; | |
WNP.prototype.unbindVideoInfo = function(a) { | |
a.href = 'about:blank'; | |
a.onmouseover = null; | |
a.onmouseout = null; | |
}; | |
WNP.prototype.play = function(index) { | |
if (this.playingItem) { | |
removeClass(this.playingItem, 'playing'); | |
this.playingItem = null; | |
} | |
var currentItem = this.playlistIterator.item; | |
if (arguments.length > 0) { | |
currentItem = this.playlistIterator.index(index).item; | |
} | |
if (!currentItem) { | |
this.stop(); | |
return; | |
} | |
var videoinfo = createVideoInfo(createPlayInfo(currentItem)); | |
var title = videoinfo.title; | |
this.scheduleCancel(); | |
this.observingVideoStop(); | |
this.timer.clear('preload'); | |
var self = this; | |
var preloaded = this.preloads.has(videoinfo.id); | |
if (preloaded) { | |
var oldCore = this.wnpCore; | |
var wnpCore = this.wnpCore = this.preloads.get(videoinfo.id); | |
this.preloads.remove(videoinfo.id); | |
wnpCore.setStyle(oldCore.current.style); | |
wnpCore.seekTo(0); | |
wnpCore.setCommentOff(oldCore.current.isCommentOff); | |
wnpCore.setMute(oldCore.current.isMute); | |
//wnpCore.setRepeat(oldCore.current.isRepeat); | |
wnpCore.volumeTo(oldCore.volume()); | |
wnpCore.observeInterval = this.prefs.observe_interval; | |
wnpCore.current.errorWhenDeleted = this.prefs.skip_deleted_video; | |
wnpCore.show(); | |
oldCore.pause(); | |
oldCore.hide(); | |
this.wnpWindow.setTimeout(function() { // for Opera 10 freeze. | |
oldCore.detach(); | |
}, 3000); | |
} | |
else { | |
var currentStyle = this.wnpCore.current.style; | |
if (!browser.ie_old) this.setAlternativeView(videoinfo); | |
this.wnpCore.setStyle(WNPCore.STYLE_ALTERNATE); | |
} | |
this.timer.setTimeout('play', function() { | |
if (preloaded) { | |
self.wnpCore.startPlaying(); | |
if (self.wnpCore.current.videoLoaded) { // already loaded. | |
self.wnpCore.onload(); | |
self.wnpCore.onstart(); | |
} | |
} | |
else { | |
//self.wnpCore.setStyle(currentStyle); // bad call order. | |
self.wnpCore.play(videoinfo); | |
self.wnpCore.setStyle(currentStyle); // best call order. | |
} | |
if (videoinfo.title) { | |
self.wnpWindow.document.title = title + ' - ' + Consts.WNP_TITLE; | |
self.showStatus(title, 5); | |
} | |
self.updatePauseButton(); | |
}, 400); // for smooth scroll. | |
// timeout, etc. | |
this.timer.setTimeout('playTimeout', function() { | |
self.showStatus("load timeout. go to next.", 5); | |
self.next(); | |
}, this.prefs.page_timeout * 1000 + 500); | |
this.wnpCore.onload = function() { | |
self.timer.setTimeout('playTimeout', function() { | |
self.showStatus("play timeout. go to next.", 5); | |
self.next(); | |
}, self.prefs.video_timeout * 1000); | |
// show actual title. | |
title = self.wnpCore.current.videoinfo.title; | |
self.wnpWindow.document.title = title + ' - ' + Consts.WNP_TITLE; | |
if (!title || title == videoinfo.id || self.wnpCore.current.videoinfo.id != videoinfo.id) { | |
self.showStatus(title, 5); | |
} | |
var video_id = self.wnpCore.current.videoinfo.id; | |
var thumbnail = self.wnpCore.current.videoinfo.thumbnail; | |
// jump. | |
if (self.wnpCore.current.videoinfo.id != videoinfo.id && self.wnpCore.current.videoinfo.v != videoinfo.id) { | |
var newInfo = self.wnpCore.current.videoinfo; | |
var elements = currentItem.querySelectorAll('.video_link, .thumbnail'); | |
for (var i = 0; i < elements.length; i++) { | |
var el = elements[i]; | |
if (el.hasAttribute('name')) el.setAttribute('name', newInfo.id); | |
if (el.nodeName == 'IMG') { | |
el.src = newInfo.thumbnail; | |
el.setAttribute('alt', newInfo.title); | |
} | |
if (el.nodeName == 'A') { | |
el.setAttribute('title', newInfo.title); | |
el.href = 'http://www.nicovideo.jp/watch/' + newInfo.id; | |
if (el.querySelectorAll('*').length == 0) { // has no elements. | |
el.textContent = /*@ el.innerText = @*/ newInfo.title; | |
} | |
} | |
} | |
} | |
// update title and thumbnail image. | |
var elements = self.wnpWindow.document.getElementsByName(video_id); | |
if (elements.length == 0 && self.wnpCore.current.videoinfo.v) { | |
elements = self.wnpWindow.document.getElementsByName(self.wnpCore.current.videoinfo.v); | |
} | |
for (var i = 0; i < elements.length; i++) { | |
var el = elements[i]; | |
if (el.nodeName == 'IMG') { | |
if (el.src != thumbnail) el.src = thumbnail; | |
el.setAttribute('alt', title); | |
} | |
if (el.nodeName == 'A') { | |
el.setAttribute('title', title); | |
el.textContent = /*@ el.innerText = @*/ title; | |
} | |
} | |
self.timer.setTimeout('update_playinfo', function() { | |
self.updateAlternativeView(); | |
self.updatePlaylistURI(); | |
}, 1000); | |
self.timer.setTimeout('preload', function() { | |
self.preloadNext(); | |
}, 30000); | |
}; | |
this.wnpCore.onstart = function() { | |
self.timer.clear('playTimeout'); | |
self.observingVideoStart(); | |
if (browser.opera && self.prefs.force_visit_on_opera) { | |
// force visit. | |
self.wnpWindow.setTimeout(function() { | |
if (self.wnpWindow.closed) return; | |
var w = self.wnpWindow.open(videoinfo.url, '', 'width=1,height=1,menubar=no,toolbar=no,scrollbars=no,top=0,left=10000'); | |
w.blur(); | |
self.wnpWindow.setTimeout(function() { w.close(); }, 800); | |
self.wnpWindow.setTimeout(function() { if (!w.closed) w.close(); }, 3000); | |
self.wnpWindow.setTimeout(function() { if (!w.closed) w.close(); }, 10000); | |
}, 5000); | |
} | |
}; | |
this.wnpCore.onerror = function(e) { | |
self.showStatus((e.message || 'error.') + ' go to next.', 5); | |
self.next(); | |
}; | |
this.wnpCore.onfatal = function(e) { | |
self.stop(); | |
self.wnpWindow.alert(e.message || 'fatal error.'); | |
self.showStatus((e.message || 'fatal error.'), 5, true); | |
if (e.logout) { | |
open(Consts.WNP_LOGIN_PAGE); | |
} | |
}; | |
this.wnpCore.onfinish = function() { | |
if (self.prefs.use_history) { | |
var playinfo = createPlayInfo(currentItem); | |
self.addHistory(playinfo); | |
} | |
if (self.prefs.remove_on_finish) { | |
self.remove(currentItem); | |
} | |
if (self.prefs.use_offtimer) { | |
if ((new Date() - (self.lastOperationTime || 0)) > self.prefs.offtimer_minute * 60 * 1000) { | |
self.stop(); | |
return; | |
} | |
} | |
self.next(); | |
}; | |
this.wnpCore.onback = (function() { | |
var backCount = 0; | |
return function() { | |
if (self.wnpCore.current.isRepeat) { | |
backCount = 0; | |
return; | |
} | |
if (new Date() - (self.lastOperationTime || 0) > 5000) { | |
backCount++; | |
} | |
else { | |
backCount = 0; | |
} | |
if (self.prefs.use_loop_break) { | |
if (backCount > self.prefs.loop_break_count) { | |
self.wnpCore.onfinish(); | |
} | |
} | |
} | |
})(); | |
this.wnpCore.onjump = function(e) { | |
title = null; // update when jumped video onload. | |
if (self.prefs.cancel_jump) { | |
self.wnpCore.onfinish(); | |
} | |
}; | |
appendClass(this.wnpElement, 'playing'); | |
appendClass(currentItem, 'playing'); | |
this.playingItem = currentItem; | |
this.updatePrevAndNext(); | |
if ((new Date() - (this.lastOperationTime || 0)) > 10000) { | |
this.scrollPlaylistTo(currentItem); | |
} | |
}; | |
WNP.prototype.stop = function() { | |
this.wnpCore.stop(); | |
this.scheduleCancel(); | |
this.observingVideoStop(); | |
var wnpDocument = this.wnpWindow.document; | |
wnpDocument.title = Consts.WNP_TITLE; | |
removeClass(this.wnpElement, 'playing'); | |
if (this.playingItem) removeClass(this.playingItem, 'playing'); | |
this.timer.clear('playTimeout'); | |
this.timer.clear('preload'); | |
this.updatePauseButton(); | |
this.wnpWindow.document.getElementById('WNP_C_NICO_SEEKBAR').firstChild.firstChild.style.width = '0'; | |
}; | |
WNP.prototype.prev = function() { | |
this.playlistIterator.prev(); | |
this.play(); | |
}; | |
WNP.prototype.next = function() { | |
if (this.prefs.loop) this.playlistIterator.next().isNullThenFirst(); | |
else this.playlistIterator.next(); | |
if (this.playlistIterator.item) { | |
this.play(); | |
} | |
else { | |
this.stop(); | |
} | |
}; | |
WNP.prototype.schedulePrev = function() { | |
if (!this.scheduleIterator) { | |
this.scheduleIterator = new ListElementIterator(this.wnpWindow.document.getElementById('WNP_PLAYLIST_ITEMS')); | |
this.scheduleIterator.current(this.playlistIterator.item); | |
} | |
this.scheduleIterator.prev().isNullThenFirst(); | |
this.schedulePlay(); | |
}; | |
WNP.prototype.scheduleNext = function() { | |
if (!this.scheduleIterator) { | |
this.scheduleIterator = new ListElementIterator(this.wnpWindow.document.getElementById('WNP_PLAYLIST_ITEMS')); | |
this.scheduleIterator.current(this.playlistIterator.item); | |
this.scheduleIterator.next().isNullThenFirst(); | |
} | |
else { | |
this.scheduleIterator.next().isNullThenLast(); | |
} | |
this.schedulePlay(); | |
}; | |
WNP.prototype.scheduleItem = function(item) { | |
if (!item) return; | |
if (!this.scheduleIterator) { | |
this.scheduleIterator = new ListElementIterator(this.wnpWindow.document.getElementById('WNP_PLAYLIST_ITEMS')); | |
} | |
this.scheduleIterator.current(item); | |
this.schedulePlay(); | |
}; | |
WNP.prototype.schedulePlay = function() { | |
if (!this.scheduleIterator) return; | |
var videoInfo = createVideoInfo(createPlayInfo(this.scheduleIterator.item)); | |
this.showStatus("next: " + videoInfo.title, 3); | |
var self = this; | |
this.timer.setTimeout('schedulePlay', function() { | |
self.timer.clear('schedulePlay'); | |
if (self.playlistIterator.item === self.scheduleIterator.item) { | |
self.scheduleIterator = null; | |
return; | |
} | |
self.playlistIterator.current(self.scheduleIterator.item); | |
self.scheduleIterator = null; | |
self.play(); | |
}, 3000); | |
}; | |
WNP.prototype.scheduleCancel = function() { | |
if (this.timer.timeouts['schedulePlay']) { | |
this.timer.clear('schedulePlay'); | |
this.showStatus("cancel.", 3); | |
} | |
this.scheduleIterator = null; | |
}; | |
WNP.prototype.preloadNext = function() { | |
var preloadIterator = new ListElementIterator(this.wnpWindow.document.getElementById('WNP_PLAYLIST_ITEMS')); | |
preloadIterator.current(this.playlistIterator.item).next(); | |
if (this.prefs.loop) preloadIterator.isNullThenFirst(); | |
var nextItem = preloadIterator.item; | |
this.timer.clear('preload'); | |
if (!nextItem || this.wnpCore.loaded() < 1) { | |
var self = this; | |
this.timer.setTimeout('preload', function() { | |
self.preloadNext(); | |
}, 3000); | |
return; | |
} | |
this.preload(nextItem); | |
}; | |
WNP.prototype.preload = function(preloadItem) { | |
var videoinfo = createVideoInfo(createPlayInfo(preloadItem)); | |
var preloads = this.preloads; | |
if (preloads.has(videoinfo.id)) return; | |
while (preloads.count() >= 2) { | |
preloads.getAt(0).detach(); | |
preloads.removeAt(0); | |
} | |
var wnpCore = new WNPCore(this.wnpWindow.document, 'nico_frame'); | |
preloads.add(videoinfo.id, wnpCore); | |
wnpCore.observeInterval = this.prefs.observe_interval; | |
wnpCore.current.errorWhenDeleted = this.prefs.skip_deleted_video; | |
if (!browser.ie_old) this.setAlternativeView(videoinfo, wnpCore); | |
wnpCore.hide(); | |
wnpCore.onerror = wnpCore.onfatal = function() { | |
wnpCore.detach(); | |
preloads.remove(videoinfo.id); | |
}; | |
wnpCore.addEventListener('load', this._wnp_load, false); | |
this.wnpWindow.document.getElementById('WNP_VIEW').appendChild(wnpCore.element); | |
wnpCore.play(videoinfo); | |
wnpCore.pause(); | |
wnpCore.alternativeView(); | |
wnpCore.setMute(true); | |
wnpCore.onload = function() { | |
wnpCore.stopObserving(); | |
// jump. | |
if (wnpCore.current.videoinfo.id != videoinfo.id && wnpCore.current.videoinfo.v != videoinfo.id) { | |
var newInfo = wnpCore.current.videoinfo; | |
var elements = preloadItem.querySelectorAll('.video_link, .thumbnail'); | |
for (var i = 0; i < elements.length; i++) { | |
var el = elements[i]; | |
if (el.hasAttribute('name')) el.setAttribute('name', newInfo.id); | |
if (el.nodeName == 'IMG') { | |
el.src = newInfo.thumbnail; | |
el.setAttribute('alt', newInfo.title); | |
} | |
if (el.nodeName == 'A') { | |
el.setAttribute('title', newInfo.title); | |
el.href = 'http://www.nicovideo.jp/watch/' + newInfo.id; | |
if (el.querySelectorAll('*').length == 0) { // has no elements. | |
el.textContent = /*@ el.innerText = @*/ newInfo.title; | |
} | |
} | |
} | |
} | |
}; | |
}; | |
WNP.prototype.removePreload = function(videoinfo) { | |
if (this.preloads.has(videoinfo.id)) { | |
this.preloads.get(videoinfo.id).detach(); | |
this.preloads.remove(videoinfo.id); | |
} | |
}; | |
WNP.prototype.clearPreloads = function() { | |
for (var i = 0, len = this.preloads.count(); i < len; i++) { | |
var wnpCore = this.preloads.getAt(i); | |
if (wnpCore !== this.wnpCore) { | |
wnpCore.detach(); | |
} | |
} | |
this.preloads = new ListedKeyMap(); | |
}; | |
WNP.prototype.layoutToggle = function() { | |
var nextStyle; | |
switch (this.wnpCore.current.style) { | |
case WNPCore.STYLE_FILL: nextStyle = WNPCore.STYLE_RESTORE; break; | |
case WNPCore.STYLE_RESTORE: nextStyle = WNPCore.STYLE_ALTERNATE; break; | |
default: nextStyle = WNPCore.STYLE_FILL; break; | |
} | |
this.wnpCore.setStyle(nextStyle); | |
}; | |
WNP.prototype.clearStatus = function() { | |
var statusBar = this.wnpWindow.document.getElementById('WNP_STATUS_BAR'); | |
statusBar.innerHTML = ''; | |
}; | |
WNP.prototype.showStatus = function(msg, sec, error) { | |
var statusBar = this.wnpWindow.document.getElementById('WNP_STATUS_BAR'); | |
this.timer.clear('clearStatusMessage'); | |
if (error) { | |
statusBar.style.backgroundColor = Colors.status_error; | |
statusBar.style.fontWeight = 'bold'; | |
} | |
else { | |
statusBar.style.backgroundColor = ''; | |
statusBar.style.fontWeight = ''; | |
} | |
this.hideControlPanel(); | |
statusBar.textContent = /*@ statusBar.innerText = @*/ msg; | |
if (sec) { | |
var self = this; | |
this.timer.setTimeout('clearStatusMessage', function(){ | |
self.clearStatus(); | |
self.restoreControlPanel(); | |
}, sec * 1000); | |
} | |
}; | |
WNP.prototype.setAlternativeView = function(info, wnpCore) { | |
var iframe = this.wnpWindow.document.createElement('iframe'); | |
iframe.setAttribute('scrolling', 'no'); | |
iframe.className = 'alternative_view'; | |
this.alternativeView = iframe; | |
this.updateAlternativeView(info); | |
(wnpCore || this.wnpCore).setAlternativeView(iframe, 380, 230); | |
}; | |
WNP.prototype.updateAlternativeView = function(info) { | |
if (!this.alternativeView) return; | |
var videoinfo = info || this.wnpCore.current.videoinfo; | |
if (!videoinfo) return; | |
var thumb_url = videoinfo.thumbnail || 'about:blank'; | |
var title = escapeHTML(videoinfo.title || videoinfo.id || '', this.wnpWindow.document); | |
var total = this.playlistIterator.count(); | |
var current = this.playlistIterator.indexOf(this.playlistIterator.item) + 1; | |
var video_play, video_comment, video_mylist; | |
if (videoinfo.viewCount != null) { | |
video_play = formatNumber(Number(videoinfo.viewCount)); | |
video_comment = formatNumber(this.wnpCore.commentNum()); | |
video_mylist = formatNumber(videoinfo.mylistCount); | |
} | |
else { | |
video_play = video_comment = video_mylist = ''; | |
} | |
var svg_xml = Consts.svg_xml_base.replace(/%.+?%/g, function(r) { | |
if (r == '%u%') return thumb_url; | |
if (r == '%t%') return title; | |
if (r == '%c%') return current + ' / ' + total; | |
if (r == '%vp%') return video_play; | |
if (r == '%vc%') return video_comment; | |
if (r == '%vm%') return video_mylist; | |
return ''; | |
}); | |
var svg_url = 'data:' + Consts.svg_mime_type + ';charset=utf-8,' + encodeURIComponent(svg_xml); | |
this.alternativeView.src = 'about:blank'; | |
this.alternativeView.src = svg_url; | |
}; | |
WNP.prototype.getDefaultPreferences = function() { | |
return { | |
observe_interval : 500, | |
page_timeout : 80, | |
video_timeout : 60, | |
menu_width_ratio : 50, | |
loop : false, | |
comment_off : false, | |
always_on_top : false, | |
playlist_style_simple : false, | |
remove_on_finish : true, | |
use_history : true, | |
skip_deleted_video : true, | |
use_offtimer : true, | |
offtimer_minute : 30, | |
use_loop_break : true, | |
loop_break_count : 3, | |
cancel_jump : false, | |
force_visit_on_opera : false | |
}; | |
}; | |
WNP.prototype.loadPreferences = function() { | |
if (!this.storage.isLoaded) return; | |
var prefKeys = [ | |
'playlist_style_simple', | |
'remove_on_finish', | |
'use_history', | |
'skip_deleted_video', | |
'use_offtimer', | |
'offtimer_minute', | |
'use_loop_break', | |
'loop_break_count', | |
'cancel_jump', | |
'force_visit_on_opera' | |
]; | |
var values = {}; | |
for (var i = 0; i < prefKeys.length; i++) { | |
var key = prefKeys[i]; | |
var value = this.storage.getData(key); | |
if (value != null) { | |
values[key] = value; | |
} | |
} | |
if (this._tmpPreferences) { | |
var t = this._tmpPreferences; | |
for (var i = 0; i < prefKeys.length; i++) { | |
var key = prefKeys[i]; | |
if (key in t && t[key] != null) { | |
this.storage.setData(key, t[key]); | |
values[key] = t[key]; | |
} | |
} | |
delete this._tmpPreferences; | |
} | |
this.applyPreferences(values); | |
}; | |
WNP.prototype.storePreference = function(key, value) { | |
if (!this.storage.isLoaded) { | |
if (!this._tmpPreferences) this._tmpPreferences = {}; | |
this._tmpPreferences.key = value; | |
} | |
else { | |
this.storage.setData(key, value.toString()); | |
} | |
}; | |
WNP.prototype.setDefaultPreferences = function() { | |
this.storage.clear(); | |
this.prefs = this.getDefaultPreferences(); | |
this.applyPreferences(); | |
}; | |
WNP.prototype.applyPreferences = function(prefs, save) { | |
var prefs = prefs || this.prefs; | |
var key; | |
key = 'observe_interval'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = Number(prefs[key]) || 500; | |
this.wnpCore.observeInterval = this.prefs[key]; | |
} | |
key = 'page_timeout'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = Number(prefs[key]) || 80; | |
} | |
key = 'video_timeout'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = Number(prefs[key]) || 60; | |
} | |
key = 'menu_width_ratio'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = Number(prefs[key]) || 50; | |
} | |
key = 'loop'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = (prefs[key] == true); | |
this.setPreferenceUI(key, this.prefs[key]); | |
} | |
key = 'comment_off'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = (prefs[key] == true); | |
this.setPreferenceUI(key, this.prefs[key]); | |
this.wnpCore.setCommentOff(this.prefs[key]); | |
} | |
key = 'mute'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = (prefs[key] == true); | |
this.setPreferenceUI(key, this.prefs[key]); | |
this.wnpCore.setMute(this.prefs[key]); | |
} | |
key = 'repeat'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = (prefs[key] == true); | |
this.setPreferenceUI(key, this.prefs[key]); | |
this.wnpCore.setRepeat(this.prefs[key]); | |
} | |
key = 'always_on_top'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = (prefs[key] == true); | |
this.setPreferenceUI(key, this.prefs[key]); | |
} | |
key = 'playlist_style_simple'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = (prefs[key] == true); | |
if (!this._simplePlaylistStyle) { | |
var simple_style_str = [ | |
'ul.wnp_playlist_items li div.video_info .thumbnail { display: none }', | |
'ul.wnp_playlist_items li div.video_info { width: 10px }', | |
'ul.wnp_playlist_items li { height: 25px }', | |
'ul.wnp_playlist_items li div.video_desc > * { display: none }', | |
'ul.wnp_playlist_items li div.video_desc .video_desc_title { display: inline }', | |
].join('\n'); | |
/*@ IECover.process(function() { simple_style_str += ' ul.wnp_playlist_items > li > img.wnp_iecover { height: 31px; } ' }); @*/ | |
var style = addStyle(simple_style_str, this.wnpWindow.document); | |
this._simplePlaylistStyle = style; | |
} | |
setStyleEnabled(this._simplePlaylistStyle, this.prefs[key]); | |
this.setPreferenceUI(key, this.prefs[key]); | |
if (save) this.storePreference(key, this.prefs[key] ? '1' : '0'); | |
if (!this.prefs[key]) { | |
this.lazyloadThumbnailImagesLater(1000); | |
} | |
} | |
key = 'remove_on_finish'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = (prefs[key] == true); | |
this.setPreferenceUI(key, this.prefs[key]); | |
if (save) this.storePreference(key, this.prefs[key] ? '1' : '0'); | |
} | |
key = 'use_history'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = (prefs[key] == true); | |
this.setPreferenceUI(key, this.prefs[key]); | |
if (save) this.storePreference(key, this.prefs[key] ? '1' : '0'); | |
} | |
key = 'skip_deleted_video'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = (prefs[key] == true); | |
this.setPreferenceUI(key, this.prefs[key]); | |
this.wnpCore.current.errorWhenDeleted = this.prefs[key]; | |
if (save) this.storePreference(key, this.prefs[key] ? '1' : '0'); | |
} | |
key = 'use_offtimer'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = (prefs[key] == true); | |
this.setPreferenceUI(key, this.prefs[key]); | |
if (save) this.storePreference(key, this.prefs[key] ? '1' : '0'); | |
} | |
key = 'offtimer_minute'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = Number(prefs[key]) || 60; | |
this.setPreferenceUI(key, this.prefs[key]); | |
if (save) this.storePreference(key, this.prefs[key].toString()); | |
} | |
key = 'use_loop_break'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = (prefs[key] == true); | |
this.setPreferenceUI(key, this.prefs[key]); | |
if (save) this.storePreference(key, this.prefs[key] ? '1' : '0'); | |
} | |
key = 'loop_break_count'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = (!isNaN(prefs[key])) ? Number(prefs[key]) : 3; | |
this.setPreferenceUI(key, this.prefs[key]); | |
if (save) this.storePreference(key, this.prefs[key].toString()); | |
} | |
key = 'cancel_jump'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = (prefs[key] == true); | |
this.setPreferenceUI(key, this.prefs[key]); | |
if (save) this.storePreference(key, this.prefs[key] ? '1' : '0'); | |
} | |
key = 'force_visit_on_opera'; | |
if (key in prefs && prefs[key] != null) { | |
this.prefs[key] = (prefs[key] == true); | |
this.setPreferenceUI(key, this.prefs[key]); | |
if (save) this.storePreference(key, this.prefs[key] ? '1' : '0'); | |
} | |
}; | |
WNP.prototype.setPreferenceUI = function(key, value) { | |
if (value == null) return; | |
var document = this.wnpWindow.document; | |
switch(key) { | |
case 'loop' : | |
var button = document.getElementById('WNP_C_LOOP'); | |
if (value == true) button.style.color = Colors.control_loop; | |
else button.style.color = ''; | |
break; | |
case 'comment_off' : | |
var button = document.getElementById('WNP_C_NICO_COMM'); | |
if (value == true) { | |
button.style.color = Colors.control_comment_off; | |
button.style.textDecoration = 'line-through'; | |
} | |
else { | |
button.style.color = ''; | |
button.style.textDecoration = ''; | |
} | |
break; | |
case 'mute' : | |
var button = document.getElementById('WNP_C_NICO_MUTE'); | |
if (value == true) { | |
button.style.color = Colors.control_mute; | |
button.style.textDecoration = 'line-through'; | |
} | |
else { | |
button.style.color = ''; | |
button.style.textDecoration = ''; | |
} | |
break; | |
case 'repeat' : | |
var button = document.getElementById('WNP_C_NICO_REPEAT'); | |
if (value == true) button.style.color = Colors.control_repeat; | |
else button.style.color = ''; | |
break; | |
case 'always_on_top' : | |
var button = document.getElementById('WNP_C_ALWAYS_ON_TOP'); | |
if (value == true) button.style.color = Colors.control_always_on_top; | |
else button.style.color = ''; | |
break; | |
case 'playlist_style_simple' : | |
document.getElementById('WNP_C_PREF_PLAYLIST_STYLE').checked = (value == true); | |
document.getElementById('WNP_C_PLAYLIST_STYLE').checked = (value == true); | |
break; | |
case 'remove_on_finish' : | |
document.getElementById('WNP_C_PREF_REMOVE_ON_FINISH').checked = (value == true); | |
document.getElementById('WNP_C_REMOVE_ON_FINISH').checked = (value == true); | |
break; | |
case 'use_history' : | |
document.getElementById('WNP_C_PREF_USE_HISTORY').checked = (value == true); | |
document.getElementById('WNP_C_USE_HISTORY').checked = (value == true); | |
break; | |
case 'skip_deleted_video' : | |
document.getElementById('WNP_C_PREF_SKIP_DELETED_VIDEO').checked = (value == true); | |
break; | |
case 'use_offtimer' : | |
document.getElementById('WNP_C_PREF_USE_OFFTIMER').checked = (value == true); | |
break; | |
case 'offtimer_minute' : | |
document.getElementById('WNP_C_PREF_OFFTIMER_MINUTE').value = value.toString(); | |
break; | |
case 'use_loop_break' : | |
document.getElementById('WNP_C_PREF_USE_LOOP_BREAK').checked = (value == true); | |
break; | |
case 'loop_break_count' : | |
document.getElementById('WNP_C_PREF_LOOP_BREAK_COUNT').value = value.toString(); | |
break; | |
case 'cancel_jump' : | |
document.getElementById('WNP_C_PREF_CANCEL_JUMP').checked = (value == true); | |
break; | |
case 'force_visit_on_opera' : | |
document.getElementById('WNP_C_PREF_FORCE_VISIT_ON_OPERA').checked = (value == true); | |
break; | |
default: | |
return; | |
} | |
}; | |
WNP.prototype.getDefaultKeybordShortcut = function() { | |
return [ | |
{ command: 'PlayPause', key: 'Space' }, | |
{ command: 'PlayPrev', key: 'PageUp' }, | |
{ command: 'PlayNext', key: 'PageDown' }, | |
{ command: 'VolumeUp', key: 'Up' }, | |
{ command: 'VolumeUp+', key: 'Up Shift' }, | |
{ command: 'VolumeDown', key: 'Down' }, | |
{ command: 'VolumeDown-', key: 'Down Shift' }, | |
{ command: 'SeekForward', key: 'Right' }, | |
{ command: 'SeekForward+', key: 'Right Shift' }, | |
{ command: 'SeekBackward', key: 'Left' }, | |
{ command: 'SeekBackward-', key: 'Left Shift' }, | |
{ command: 'SeekBackward--', key: 'Left Ctrl' }, | |
{ command: 'SelectNextItem', key: 'j' }, | |
{ command: 'SelectNextItem', key: 'Enter' }, | |
{ command: 'SelectPrevItem', key: 'k' }, | |
{ command: 'PlaySelectedItem', key: 'o' }, | |
{ command: 'DeleteSelectedItem', key: 'DEL' }, | |
{ command: 'MenuNext', key: 's' }, | |
{ command: 'MenuPrev', key: 'a' }, | |
{ command: 'Playlist', key: 'n' }, | |
{ command: 'History', key: 'h' }, | |
{ command: 'Preference', key: 'p' }, | |
{ command: 'Comment', key: 'c' }, | |
{ command: 'Loop', key: 'l' }, | |
{ command: 'Repeat', key: 'r' }, | |
{ command: 'Mute', key: 'm' }, | |
{ command: 'Open', key: 'w' }, | |
{ command: 'View', key: 'v' } | |
] | |
}; | |
WNP.prototype.applyKeybordShortcut = function(shortcutList) { | |
if (!shortcutList) return; | |
for (var i = 0; i < shortcutList.length; i++) { | |
var item = shortcutList[i]; | |
this.platform.unbindShortcut(item.key); | |
this.platform.bindShortcut(item.command, item.key); | |
} | |
}; | |
WNP.open = function(playlist) { | |
if (playlist) this.play(playlist); | |
}; | |
WNP.play = function(playlist) { | |
if (playlist) this.wnp().addEx(playlist, { start: true, type: 'insertBeforeCurrent' }); | |
}; | |
WNP.add = function(playlist, name, start) { | |
if (playlist) this.wnp().addEx(playlist); | |
}; | |
WNP.insert = function(playlist, name) { | |
if (playlist) this.wnp().addEx(playlist, { start: false, type: 'insertAfterCurrent' }); | |
}; | |
WNP.wnp = function() { | |
return window.wnp; | |
}; | |
T.WNP = WNP; | |
window[Consts.WNP_GLOBAL_NAME] = WNP; | |
window.wnp = new WNP(); | |
} | |
WNP.BUILD_WNP = BUILD_WNP; | |
// WNP entry point. | |
WNP.open = function(playlist, name) { | |
var wnpWindow = this.wnp(name); | |
if (playlist) { | |
wnpWindow.setTimeout(function() { | |
wnpWindow[Consts.WNP_GLOBAL_NAME].open(playlist); | |
}, 50); | |
} | |
}; | |
WNP.play = function(playlist, name) { | |
var wnpWindow = this.wnp(name); | |
if (!playlist) playlist = createPlayInfo(document.getElementsByTagName('body')[0]); | |
wnpWindow.setTimeout(function() { | |
wnpWindow[Consts.WNP_GLOBAL_NAME].play(playlist); | |
}, 50); | |
}; | |
WNP.add = function(playlist, name) { | |
var wnpWindow = this.wnp(name); | |
if (!playlist) playlist = createPlayInfo(document.getElementsByTagName('body')[0]); | |
wnpWindow.setTimeout(function() { | |
wnpWindow[Consts.WNP_GLOBAL_NAME].add(playlist); | |
}, 50); | |
}; | |
WNP.insert = function(playlist, name) { | |
var wnpWindow = this.wnp(name); | |
if (!playlist) playlist = createPlayInfo(document.getElementsByTagName('body')[0]); | |
wnpWindow.setTimeout(function() { | |
wnpWindow[Consts.WNP_GLOBAL_NAME].insert(playlist); | |
}, 50); | |
}; | |
WNP.calcPosition = function() { | |
if (browser.opera) { | |
return { top: 0, left: window.top.innerWidth - WNP.Consts.WNP_INITIAL_PLAYER_WIDTH }; | |
} | |
if (browser.webkit) { | |
var top = window.screenTop + 110; | |
var left = window.screenLeft + window.outerWidth - WNP.Consts.WNP_INITIAL_PLAYER_WIDTH - 25; | |
return { top: top, left: left }; | |
} | |
if (browser.mozilla) { | |
var top = window.screenY + 110; | |
var left = window.screenX + window.outerWidth - WNP.Consts.WNP_INITIAL_PLAYER_WIDTH - 25; | |
return { top: top, left: left }; | |
} | |
return { top: 0, left: (window.innerWidth || ie.clientWidth()) - WNP.Consts.WNP_INITIAL_PLAYER_WIDTH }; | |
}; | |
WNP.wnp = function(name) { | |
var loc = 'javascript:void(0)'; /*@ loc = ''; @*/; | |
var pos = this.calcPosition(); | |
var w = window.open(loc, name || 'wnp', 'top=' + pos.top + ',left=' + pos.left + ',width=' + WNP.Consts.WNP_INITIAL_PLAYER_WIDTH + ',height=' + WNP.Consts.WNP_INITIAL_PLAYER_HEIGHT + ',scrollbars=yes,resizable=yes,menubar=yes,status=no'); | |
var wnp = w.wnp; | |
if (wnp == null) { | |
var html = WNP.html.build(); | |
var d = w.document; | |
d.open(); | |
d.write(html); | |
try { d.close(); } catch(e) {} | |
d.title = WNP.Consts.WNP_TITLE; | |
w.wnp.applyPreferences(WNP.PREFS); | |
w.wnp.applyKeybordShortcut(WNP.SHOPRTCUT); | |
} | |
w.focus(); | |
return w; | |
}; | |
WNP.showToolTipIfNecessary = (function() { | |
var tooltip = null; | |
var tid = null; | |
var pls = null; | |
return function showToolTipIfNecessary(target) { | |
var a = target, aa; | |
while(a) { | |
if (a.nodeName == 'A') break; | |
a = a.parentNode; | |
} | |
if (!a) return; | |
var m; | |
if (m = /http:\/\/www\.nicovideo\.jp\/watch\/(\w+)/.exec(a.href)) { | |
pls = createPlayInfo(a); | |
} | |
else if (m = getCanonicalVideoURL(a)) { | |
aa = a.cloneNode(true); | |
aa.href = m; | |
pls = createPlayInfo(aa); | |
} | |
else if (/^http:\/\/www\.nicovideo\.jp\/.*/.test(a.href)) { | |
pls = a.href; | |
} | |
else { | |
return; | |
} | |
if (!tooltip) { | |
tooltip = document.createElement('div'); | |
tooltip.className = 'wnp_tooltip'; | |
var panel_html = [ | |
'<a href="javascript:void(0)" rel="nofollow"><span>play</span></a>', | |
'<a href="javascript:void(0)" rel="nofollow"><span>add</span></a>', | |
'<a href="javascript:void(0)" rel="nofollow"><span>insert</span></a>' | |
].join(''); | |
if (browser.mozilla) { | |
var bk = '<img src="about:blank" style="display:none"><br style="display:none">'; | |
panel_html = panel_html.replace(/<span>/g, bk + '<span>'); | |
} | |
tooltip.innerHTML = panel_html; | |
$e(window).addEventListener('mouseup', function(e) { tooltip.style.display = 'none'; }, false); | |
$e(window).addEventListener(browser.mozilla ? 'DOMMouseScroll' : 'mousewheel', function(e) { | |
tooltip.style.display = 'none'; | |
}, false); | |
var an = tooltip.getElementsByTagName('a'); | |
$e(an[0]).addEventListener('click', function(e) { e.preventDefault(); if (pls) WNP.play(pls); }, false); | |
$e(an[1]).addEventListener('click', function(e) { e.preventDefault(); if (pls) WNP.add(pls); }, false); | |
$e(an[2]).addEventListener('click', function(e) { e.preventDefault(); if (pls) WNP.insert(pls); }, false); | |
document.getElementsByTagName('body')[0].appendChild(tooltip); | |
} | |
else { | |
// refresh. | |
for (var i = 0, len = tooltip.childNodes.length; i < len; i++) { | |
var node = tooltip.childNodes[i]; | |
if (node.innerHTML) node.innerHTML = node.innerHTML; | |
} | |
} | |
var title = findVideoTitle(aa || a); | |
if (pls.title && !pls.title[pls.items[0]] && title) { | |
pls.title[pls.items[0]] = title; | |
} | |
var open_href = 'javascript:' + encodeURIComponent('void((window.' + Consts.WNP_GLOBAL_NAME + ')?' + Consts.WNP_GLOBAL_NAME + '.open(' + toJSON(pls) + '):location.href="' + a.href +'")'); | |
var an = tooltip.getElementsByTagName('a'); | |
for (var i = 0; i < an.length; i++) { | |
an[i].setAttribute('href', open_href); | |
an[i].setAttribute('title', title); | |
} | |
if (browser.mozilla) { | |
for (var i = 0; i < an.length; i++) { | |
an[i].firstChild.setAttribute('alt', title); | |
} | |
} | |
var p = getAbsolutePosition(a); | |
var x = p.x, y = p.y, | |
w = a.offsetWidth, h = a.offsetHeight, | |
width = 80, height = 25; | |
if (browser.mozilla || browser.webkit) { | |
var thumb = a.getElementsByTagName('img')[0]; | |
if (thumb) { | |
var p = getAbsolutePosition(thumb); | |
x = Math.min(x, p.x); | |
y = Math.min(y, p.y); | |
w = Math.max(w, thumb.offsetWidth); | |
h = Math.max(h, thumb.offsetHeight); | |
} | |
} | |
tooltip.style.left = Math.min(Math.max(x + Math.min(20, w-5), (x + w - width)), (window.innerWidth || ie.clientWidth()) - 190) + 'px'; | |
tooltip.style.top = Math.min(y - 10, y + (h / 2) - 15 - height) + 'px'; | |
tooltip.style.display = 'block'; | |
if (tid) clearTimeout(tid); | |
tid = setTimeout(function() { | |
if (getStyle(tooltip, 'opacity') == '1') { // why work on ie? | |
setTimeout(arguments.callee, 1000); | |
return; | |
} | |
tooltip.style.display = 'none'; | |
tid = null; | |
pls = null; | |
}, 2200); | |
} | |
})(); | |
WNP.showWnpControlPanel = function showWnpControlPanel() { | |
var controlPanel = document.createElement('div'); | |
controlPanel.id = 'WNP_CONTAROL_PANEL'; | |
controlPanel.className = 'wnp_tooltip'; | |
controlPanel.style.cssText = 'position: fixed; bottom: 5px; right: 5px; width: 228px; z-index: 998; '; | |
var open_href = 'javascript:' + encodeURIComponent('void((window.' + Consts.WNP_GLOBAL_NAME + ')?' + Consts.WNP_GLOBAL_NAME + '.open("' + location.href + '"):location.href="' + location.href + '")'); | |
var title = document.title; | |
var panel_html = [ | |
'<a href="' + open_href + '" title="open WNP" rel="nofollow"><span>open</span></a>', | |
'<a href="' + open_href + '" title="' + title + '" rel="nofollow"><span>play</span></a>', | |
'<a href="' + open_href + '" title="' + title + '" rel="nofollow"><span>add</span></a>', | |
'<a href="' + open_href + '" title="' + title + '" rel="nofollow"><span>insert</span></a>' | |
].join(''); | |
if (browser.mozilla) { | |
var bk = '<img src="about:blank" style="display:none" alt="' + title + '"><br style="display:none">'; | |
panel_html = panel_html.replace(/<span>/g, bk + '<span>'); | |
} | |
controlPanel.innerHTML = panel_html; | |
var an = controlPanel.getElementsByTagName('a'); | |
$e(an[0]).addEventListener('click', function(e) { e.preventDefault(); WNP.open(); }, false); | |
$e(an[1]).addEventListener('click', function(e) { e.preventDefault(); WNP.play(); }, false); | |
$e(an[2]).addEventListener('click', function(e) { e.preventDefault(); WNP.add(); }, false); | |
$e(an[3]).addEventListener('click', function(e) { e.preventDefault(); WNP.insert(); }, false); | |
// hide controlPanel on scrolling(for performance). | |
var scrollTid = null; | |
$e(window).addEventListener('scroll', function(e) { | |
if (e.target != window && e.target != document) return; | |
if (scrollTid) clearTimeout(scrollTid); | |
controlPanel.style.display = 'none'; | |
scrollTid = setTimeout(function() { | |
controlPanel.style.display = ''; | |
}, 200); | |
}, false); | |
document.getElementsByTagName('body')[0].appendChild(controlPanel); | |
}; | |
WNP.init = function init() { | |
addStyle(WNP.pageStyle(WNP.Prefs)); | |
WNP.showWnpControlPanel(); | |
$e(document).addEventListener('mouseover', function(e) { | |
WNP.showToolTipIfNecessary(e.target); | |
}, false); | |
} | |
var json = (typeof JSON != 'undefined' ? JSON : null); | |
WNP.parseRequest = function(str) { | |
var req; | |
if (json && isNative(json.parse)) { | |
req = json.parse(str); | |
} | |
else { | |
// not safe!! use this to the string from trusted domain only. | |
req = eval('(' + str + ')'); | |
} | |
return req; | |
}; | |
WNP.serializeRequest = function(command, playlist) { | |
var obj = { | |
command: command, | |
playlist: playlist | |
}; | |
// don't use native JSON.stringify for prototype.js (http://d.hatena.ne.jp/Gimite/20091129/1259495440) | |
return toJSON(obj); | |
}; | |
if (location.href == Consts.WNP_GATEWAY_URL) { | |
WNP.acceptDomain = function(url) { | |
if (/^http:\/\/\w*[.]?nicovideo\.jp/.test(url)) { | |
return true; | |
} | |
return false; | |
}; | |
WNP.receiveMessage = function(e) { | |
if (this.acceptDomain(e.origin)) { | |
var request = this.parseRequest(e.data); | |
if (request) { | |
switch(request.command) { | |
case 'open' : this.open(request.playlist); break; | |
case 'play' : this.play(request.playlist); break; | |
case 'add' : this.add(request.playlist); break; | |
case 'insert': this.insert(request.playlist); break; | |
} | |
} | |
} | |
}; | |
window.addEventListener("message", function(e) { | |
WNP.receiveMessage(e); | |
}, false); | |
} | |
if (location.href.indexOf('http://www.nicovideo.jp/') < 0) { | |
var gateway = document.createElement('iframe'); | |
gateway.src = Consts.WNP_GATEWAY_URL; | |
gateway.setAttribute('width', '1'); | |
gateway.setAttribute('height', '1'); | |
gateway.setAttribute('style', 'position: absolute; top: 0; right: 0; display: none;'); | |
ready(function() { document.body.appendChild(gateway); }); | |
WNP.open = function(playlist) { | |
gateway.contentWindow.postMessage(this.serializeRequest('open', playlist), Consts.WNP_GATEWAY_URL); | |
}; | |
WNP.play = function(playlist) { | |
if (!playlist) playlist = createPlayInfo(document.getElementsByTagName('body')[0]); | |
gateway.contentWindow.postMessage(this.serializeRequest('play', playlist), Consts.WNP_GATEWAY_URL); | |
}; | |
WNP.add = function(playlist) { | |
if (!playlist) playlist = createPlayInfo(document.getElementsByTagName('body')[0]); | |
gateway.contentWindow.postMessage(this.serializeRequest('add', playlist), Consts.WNP_GATEWAY_URL); | |
}; | |
WNP.insert = function(playlist) { | |
if (!playlist) playlist = createPlayInfo(document.getElementsByTagName('body')[0]); | |
gateway.contentWindow.postMessage(this.serializeRequest('insert', playlist), Consts.WNP_GATEWAY_URL); | |
}; | |
delete WNP.wnp; | |
} | |
window[Consts.WNP_GLOBAL_NAME] = WNP; | |
// entry point. | |
function main() { | |
setTimeout(function() { WNP.init(); }, 0); // delay for customize. | |
} | |
function ready(func) { | |
if (document.getElementsByTagName('body')[0]) func(); | |
else if (window.opera) document.addEventListener('DOMContentLoaded', func, false); | |
else $e(window).addEventListener('load', func, false); | |
} | |
if (location.href.indexOf('http://www.nicovideo.jp/wnp/') === 0) { | |
var videoid = location.hash.replace(/^#/, ''); | |
// delay for ie8. | |
setTimeout(function() { | |
var html = WNP.html.build(); | |
document.open(); | |
document.write(html); | |
try { document.close(); } catch(e) {} | |
window.wnp.applyPreferences(WNP.PREFS); | |
window.wnp.applyKeybordShortcut(WNP.SHOPRTCUT); | |
if (videoid) window.WNP.open(videoid); | |
}, 50); | |
} | |
else { | |
ready(main); | |
} | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment