Skip to content

Instantly share code, notes, and snippets.

@miya2000
Created December 23, 2013 23:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save miya2000/8106812 to your computer and use it in GitHub Desktop.
Save miya2000/8106812 to your computer and use it in GitHub Desktop.
nicovideo - wnp (Ginza Preview)
// ==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">&lt;</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">&gt;</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