User:Techgeekmbg/sandbox

From Homestar Runner Wiki

< User:Techgeekmbg(Difference between revisions)
Jump to: navigation, search
(Creammonkey)
(Try that link)
 
(includes 10 intermediate revisions)
Line 1: Line 1:
-
This is a test to see if without the seek bar, the all in One script will work on Creammonkey.
+
<include<includeonly></includeonly>only></include<includeonly></includeonly>only>
-
 
+
-
 
+
-
// If you want to install this script, then (if you don't have them already) you'll need to install [http://www.mozilla.org/firefox/ Firefox] and [https://addons.mozilla.org/en-US/firefox/addon/748 Greasemonkey], then restart Firefox and return to this page.<br>
+
-
// Then, just click on <span class="plainlinks">[http://www.hrwiki.org/index.php?title=User:Techgeekmbg&action=raw&ctype=text/javascript&fakeextension=.user.js this link]</span> to install the script.<br>
+
-
// To upgrade a new version when it's updated, just click the install link again &ndash; it'll automagically replace the old version. If the option is enabled, the script will automatically check for updates for you. <pre>
+
-
<pre>
+
-
// Homestar All-In-One
+
-
// version 3.2
+
-
// 2006-09-27
+
-
// Copyright (c) Phillip Bradbury, Loafing, T Rice, Jesse Ruderman
+
-
//
+
-
// A combination of several useful scripts for Homestar Runner cartoons:
+
-
//  Homestar-Fullon, a greasemonkey script for making H*R cartoons fullscreen.
+
-
//  Seek Bar, a bookmarklet that adds a progress bar to flash cartoons
+
-
//  (with modifications).
+
-
//  Previous/Next buttons for Strong Bad Emails, TGS, Marzipan's
+
-
//  Answering Machine, Biz Cas Fri, Puppet Jams and main pages.
+
-
//  An HRWiki link on all pages.
+
-
//  The ability, if you turn on the "fullscreen" option, to keep the actual
+
-
//  stage the same size (so you can see "outside the frame").
+
-
//  Turning everything upside-down, like on April Fools Day, 2006.
+
-
//  A plain-HTML navbar, to replace the Flash one. This is mostly for me
+
-
//  as the navbar doesn't work right on my computer (font problems).
+
-
//  It could also be useful for others, letting you middle-click the navbar
+
-
//  to open things in new tabs.
+
-
//  Loading subtitles from the wiki and displaying them beneath the toon.
+
-
// All of these can easily be turned on or off with the "Preferences" box
+
-
//  in the top left.
+
-
//
+
-
// Released under the GPL.
+
-
//
+
-
// Homestar-Fullon written by T Rice <timgm@bcheck.net> and is
+
-
//  released under the GPL.
+
-
//  http://dana.ucc.nau.edu/~tsr22/apps/greasemonkey/
+
-
//
+
-
// Seek bar written by Jesse Ruderman <jruderman@hmc.edu> and is
+
-
//  distributed with permission ("You may modify and/or distribute
+
-
//  up to three bookmarklets from this site in any way you want.")
+
-
//  http://www.squarefree.com/bookmarklets/
+
-
//  Originally it was just the Pause button and the seek bar,
+
-
//  I modified it to add a frame counter, frame step buttons and zoom buttons.
+
-
//  I also modified it so the Pause button automatically updates when the flash
+
-
//  movie pauses itself (eg at the end of the toon).
+
-
//
+
-
// Previous/Next buttons written by Phillip Bradbury, but inspired by
+
-
//  StrongBad Emails: Prev & Next from http://userscripts.org/scripts/show/1015
+
-
//
+
-
// HRWiki link also written by Phillip Bradbury, but inspired by an attempt
+
-
//  by Tom Preuss to do the same thing - except it did the translation from
+
-
//  URL to Wiki page name in the script, this does it at the HRWiki server
+
-
//  so that when a new toon comes out, the script doesn't need to be changed.
+
-
//  http://www.hrwiki.org/index.php/User:Tom/Greasemonkey_Script
+
-
//
+
-
// Subtitles written in collaboration with "Loafing"
+
-
//  http://www.hrwiki.org/index.php/User:Loafing
+
-
//
+
-
// Direct any comments to
+
-
//  http://www.hrwiki.org/index.php/User_talk:Phlip/Greasemonkey
+
-
//
+
-
// --------------------------------------------------------------------
+
-
//
+
-
// WARNING: This script explicitly avoids use of one of Greasemonkey's security
+
-
//  features. THIS SCRIPT SHOULD NOT BE USED on ANY page where you do not trust
+
-
//  the page writer. Not that it would make sense to anyway, given it's rather
+
-
//  Homestar-specific. Your use of this script is stating that you trust
+
-
//  The Brothers Chaps to not insert malicious code into the Homestar Runner site,
+
-
//  and the HRWiki admins to not put any on the mirror.
+
-
//
+
-
// One of the security features of Greasemonkey, used to plug its holes in
+
-
//  previous versions, is Mozilla's XPCNativeWrapper, which is used to ensure
+
-
//  that you're calling the real functions of objects on the page, and not
+
-
//  weird and potentially hazardous ones written by the page designer. However
+
-
//  this also blocks functions like flashmovie.CurrentFrame() which are needed
+
-
//  by the seek bar. Thus to make the seek bar work, I needed to turn this off.
+
-
//
+
-
// --------------------------------------------------------------------
+
-
//
+
-
// This is a Greasemonkey user script.
+
-
//
+
-
// To install, you need Greasemonkey: http://greasemonkey.mozdev.org/
+
-
// Then restart Firefox and revisit this script.
+
-
// Under Tools, there will be a new menu item to "Install User Script".
+
-
// Accept the default configuration and install.
+
-
//
+
-
// To uninstall, go to Tools/Manage User Scripts,
+
-
// select "Homestar All-In-One", and click Uninstall.
+
-
//
+
-
// --------------------------------------------------------------------
+
-
//
+
-
// This program is free software; you can redistribute it and/or modify
+
-
// it under the terms of the GNU General Public License as published by
+
-
// the Free Software Foundation; either version 2 of the License, or
+
-
// (at your option) any later version.
+
-
//
+
-
// This program is distributed in the hope that it will be useful,
+
-
// but WITHOUT ANY WARRANTY; without even the implied warranty of
+
-
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+
-
// GNU General Public License for more details.
+
-
//
+
-
// You should have received a copy of the GNU General Public License
+
-
// along with this program; if not, write to the Free Software
+
-
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
-
//
+
-
// --------------------------------------------------------------------
+
-
//
+
-
// ==UserScript==
+
-
// @name          Homestar All-In-One
+
-
// @namespace    http://www.hrwiki.org/
+
-
// @description   Combination of many Homestar Runner scripts. Version 3.2.
+
-
// @include       http://homestarrunner.com/*
+
-
// @include      http://www.homestarrunner.com/*
+
-
// @include      http://podstar.homestarrunner.com/*
+
-
// @include      http://videlectrix.com/*
+
-
// @include      http://www.videlectrix.com/*
+
-
// @include      http://hrwiki.org/mirror/*
+
-
// @include      http://www.hrwiki.org/mirror/*
+
-
// @include      https://secure.homestarrunner.com/heythanks.html*
+
-
// ==/UserScript==
+
-
 
+
-
// Returned by Special:Getversion
+
-
// <versionstring>3.2.1=http://www.hrwiki.org/index.php?title=User:Phlip/Greasemonkey&action=raw&ctype=text/javascript&fakeextension=.user.js</versionstring>
+
-
var currentversion = [3,2,1];
+
-
 
+
-
// Podstar/Videlectrix (stock IIS), HRWiki and stock Apache error pages, respectively. Don't do anything on those pages.
+
-
if (document.title != "The page cannot be found" && document.title != "Homestar Runner Wiki - 404 Not Found" && document.title != "404 Not Found")
+
-
{
+
-
var whichsite = 0;
+
-
if (location.hostname.indexOf("podstar") >= 0) whichsite = 1;
+
-
if (location.hostname.indexOf("videlectrix") >= 0) whichsite = 2;
+
-
if (location.pathname.indexOf("/mirror/") >= 0) whichsite = 3;
+
-
+
-
// icons, as Base64-encoded PNG files.
+
-
// the hrwiki one used to hotlink http://www.hrwiki.org/favicon.ico but now
+
-
// use "data:" to avoid bandwidth-leeching (even this minor)
+
-
var image_hrwiki = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQ" +
+
-
"CAMAAAAoLQ9TAAAAzFBMVEXsFQgrPqLjBgDQDw7yAwA8PrbBGhr/AABCRcLfHBvTIiHBKy5" +
+
-
"OVKvCNTj/HRS8S1T/MzPgR0b2Q0Rcf611d7jSWGG9Ynd6fc5fkdPpZW5mmcybhaekgqK2fJ" +
+
-
"SWlXF4lctlnt3/ZmbbdXqFlMWSkbi5kkqVnIN9ncvYfIeToaqhmrCApNaolruNoc/Ij53/f" +
+
-
"Xy1p2eFqty1qX+Tr8/0jpSgsteftdDCr8q4ud3Wtanqq6qtweLrtMDVwszsxb3M1eLu59j7" +
+
-
"9PT///8lJce4h/WNAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAs" +
+
-
"TAQCanBgAAAAHdElNRQfWBRkTLxz1P7v8AAAAyklEQVQY02XP23aCMBAF0DQaIxUjBrCjEi" +
+
-
"9oRIWotRUrWC/w//9kIssn5+GsOXvNyyD0NnI/MqnnBTaRcrH+WS92FUmPzCMV5XEs/KfIV" +
+
-
"VkSL73nS2Z9GpGjsvk1uxdF1k96T5Ckmdp/xc0KYGUgGrhEefZH2g1c10YIklMylgd1Gl90" +
+
-
"bEADdxSKz3x4zc/MB33CqYDDlvoDNcW6Iwgo/84Yrqsj6xhA4LB/3l7S7BcPKxDMwUIxp96" +
+
-
"G6htguAWTkNbEC0KzgtUw/QHI7xdXgqr/KgAAAABJRU5ErkJggg==";
+
-
var image_prefs = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQC" +
+
-
"AMAAAAoLQ9TAAAAllBMVEUAGQASEhIfHx8fJy8pKSk2NjZBQUFJR0ZQUE9RUVFSUlJNX3No" +
+
-
"aGhsaWdramlycG1meY98fHx+fn5wgpV0iqKKh4R4jaR9jJx8kad9kad/mbONmaWEnrmEnrq" +
+
-
"koZy3t7fIx8bKyMHT0c3S0dDU09DV1NPP1t3W1dXY2Njb2tfe29bf3tzj4uHr6+js6+r39/" +
+
-
"f5+PgAAABrL3yvAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTA" +
+
-
"QCanBgAAAAHdElNRQfWBRoFKh31UQ8DAAAAgUlEQVQY022OxxLCMAwFRSc4BEIPJZQQ08v+" +
+
-
"/8+RsTExDDpIe3ijfSJ/hx9g62Dt4GaAI+8YT0t27+BxxvvE/no5pYT10lGFrE34Ja40W3g" +
+
-
"1oMGmW7YZ6hnCYexKTPVkXivuvWe1Cz1aKqPNI3N0slI2TNYZiARJX30qERc7wBPKC4WRDz" +
+
-
"WdWHfmAAAAAElFTkSuQmCC";
+
-
var image_close = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQC" +
+
-
"AQAAAC1+jfqAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfW" +
+
-
"BRkTNhxuPxLkAAAAHXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBUaGUgR0lNUO9kJW4AAAE" +
+
-
"KSURBVCjPhdGxSgNBFAXQMzpgYWwsLEQUDBJBQgqFIChZEPR7/DA/QCGQTgQtJE1ENoWohY" +
+
-
"UgbGKQyFjErNv52nObe19wqGWg7z0l5YVgVdOu+wUt507tqIVQ4Zodp861ooELe15M5KFI6" +
+
-
"Zfr9u25MIj6Jl4cmSIPBWrq2o5cufO4aOJDYSozNTa2pK4t03PtwUdMKRRykAmW0dTRcyNX" +
+
-
"pBQpI8GJDTR050zkNzK0bMMZLvUNZ8yCfy6Wvbc1NVyi4dloXjqWvds6uvp41pFmpVOKJWd" +
+
-
"6bgwxkmTMIotWKpwrfBkZl7uMonUHf5wSlV2+fUZrjnXdzrmyy7djD8GWTW9e51z557o1Tz" +
+
-
"85FH/WkOkaHQAAAABJRU5ErkJggg==";
+
-
var image_update = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEYAAABG" +
+
-
"CAMAAABG8BK2AAAC8VBMVEUAAAD/AAD+AQH/AQH/AgL+AwP/AwP+BAT/BAT/BQX+Bgb/Bgb" +
+
-
"/Bwf+CAj/CAj/CQn/Cgr+Cwv/Cwv+DAz/DAz/DQ3/Dg7+Dw//Dw//EBD+ERH/ERH/EhL/Ex" +
+
-
"P+FBT/FRX/Fhb/Fxf+GBj/GBj/GRn/Ghr/Gxv/HBz/HR3/Hh7/Hx//ICD+ISH/ISH/IiL/I" +
+
-
"yP/JCT/JSX/Jib/Jyf/KSn/Kyv/LCz/LS3/Ly//MDD/MTH+MjL/MjL/MzP/NDT/NTX/Njb+" +
+
-
"Nzf/Nzf/ODj+OTn/OTn/Ojr/PDz/Pj7/Pz//QUH/QkL+Q0P/RUX/Rkb/R0f/SEj/SUn/Skr" +
+
-
"/S0v/TEz/TU3/Tk7/T0//UFD/UVH/UlL/VFT/VVX/Vlb/WFj/WVn/Wlr/W1v/XFz/XV3/Xl" +
+
-
"7/X1//YGD/YWH/YmL/Y2P/ZWX/Zmb/Z2f/aGj/aWn/amr/a2v/bGz/bW3/bm7/b2//cHD/c" +
+
-
"XH/cnL/dHT/dnb/d3f/eHj/eXn/e3v/fX3/fn7/f3//gID/gYH/goL/g4P/hIT/hob/h4f/" +
+
-
"iIj/iYn/ior/i4v/jIz/jY3/jo7+kJD/kJD/kZH/kpL/lJT/lpb/l5f/mJj/mZn/mpr/m5v" +
+
-
"/nJz/nZ3/n5//oKD/oaH/oqL/o6P/pqb/p6f/qKj/qan/qqr/q6v/rKz/ra3/r6//sLD/sb" +
+
-
"H/srL/s7P/tLT/tbX/trb/t7f/uLj/urr/u7v/vLz/vb3/vr7/v7//wMD/wcH/wsL/w8P/x" +
+
-
"MT/xcX/xsb+x8f/x8f/yMj/ycn/ysr/y8v/zMz/zc3/zs7/z8//0ND/0dH/0tL/09P+1NT/" +
+
-
"1NT/1tb/19f+2Nj/2Nj/2dn/29v/3Nz/3d3/39//4OD/4eH/4uL/4+P/5OT/5eX/5ub/5+f" +
+
-
"/6Oj/6en/6ur/6+v/7Oz/7e3/7u7/7+/+8PD/8fH/8vL/8/P/9PT/9fX/9vb/9/f/+Pj/+f" +
+
-
"n/+vr/+/v//Pz//f3+/v7//v7////+AAA5GkRyAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFH" +
+
-
"UgAAAAJcEhZcwAADzoAAA+IAUHKF/gAAAAHdElNRQfXCRYICgxGxxkcAAAEL0lEQVRYw63X" +
+
-
"e1wURRwA8Pm1G0KcHdGBkKAYjxC0yLJITUl7cr7RUjAos4AuraCH2pWCVlZaRpD5AEXDwAe" +
+
-
"mQRFdmgQeCgWUPKTk4JJHomAq5PBXu/fC2zt2Z7fdf+Y38/nc9zPz+83M7iEQ9VBDjCNxSt" +
+
-
"KGG5xJSBSjWPV+c3m0nxNFDEP/XBf3ZkPLuvGOigiG2oLrhyvVJX26abdzFXKGWtrUPRXA5" +
+
-
"aasRjyD5ijkzJjd/2aMNkXqhCiKoxAzU9bg3nmDdXe1V4iZJIzTBnvhH9xrpxAzKbj1cYDY" +
+
-
"2Ww8AMuOL7NTiBg6koZX2rruhFhjLJsVP5iv8bFTSBj6xxo/CHqxXftwYxFTKwhY/aj9iog" +
+
-
"YOgfrRwCM/vr0qXOmpUQ0pXAVYYZa19tuymc8xqvY1u0nnOXCUQQZ6vnf/p5jiibpqgOYxq" +
+
-
"cctwRwFUEmqrD/1VvMYWppjGrUE7/ghkAHRYhxy8QdG6x79u2DBbru/mLHuQgyr+H9HYatC" +
+
-
"kvv2U3Hdmv9nSgCzKyW/MnBpW1HvSz9gRHsMUAiGe/1OA5A9XlX/TQv7pkmZtzB/Y1UNvBM" +
+
-
"P2NIDOVTeJjpT49lJNOjXHHq/Mb7eRQe5pnavAm2W3jRt33Fjw2t8C3qG3z8AWvsOnFba6Y" +
+
-
"bNZTCw9yYYsg2qkfabqpZPkPOhXc2ET2bk3FpAvDXSJBxbSsZ29O1fz2BwrtvVlzSNb60vX" +
+
-
"5ruEJI4WVUxxoTISSp46hWJaA4MtSw2dlVRXlq5jy6H65hRzw+XasSUBwYOu2rC4YO/bmWM" +
+
-
"0EesPRQsGnsZiGFy9AlVbmRzG9dQrMr1NSEE1OEs+uEoXbivUGW+EBrIGh3KYkUDuP7bu3J" +
+
-
"PZ7mOKSsgFr4ggeRwmE87/FfW9Pqbb74vqgOg3Ay5XqGmpRe9+U7vsvL/0oybZRE9rIhU65" +
+
-
"j6Az9tZL0ffn3jdtyadNdzEAaTiZVBhn6O9y+YBxAUw64fnR+hxoUVXg5qWJjqBzcFsbutY" +
+
-
"rDwwBWHvr9rUrc5E+q2JjQExceYduHruQqBgAe3NhvLBhDrNiYyD79agXzTtXg98xs9CIvc" +
+
-
"sXGRPzQc7F68R23NlxZQtk+pZEohnoyBuDuqI9P99Y244rhJPeLMyZQ90exJgyUU/dgfPEp" +
+
-
"KYp5UeHak83fT2Tf0pXX8hMlKMj6Znu57HIMcwjmZmCcI15BVICvWfLK7ExmKnzbPH3fJ6I" +
+
-
"V9NzZLG/LKo4Y49kmOHKUaAVB2T8h1pzGGMeLrrSVmX71iPUzaOafMyRk15Lios4EixONl0" +
+
-
"hU2ErldW82O5rOORIVU8ELDZ8xDq2sPRsmUTHvm8LuyvjFr/+Kc30kKpbtt6OuC+OefSOlK" +
+
-
"rYTHqf5MNVPsoLs/2QjGZj/oSB5FCSPguRRkDwKkkdB8ihIHgXJoyB5FCSPguRRkDzKf7Z6" +
+
-
"NUd33kmjAAAAAElFTkSuQmCC";
+
-
+
-
settingnames = [
+
-
{name: 'resize',    title: 'Resize flash to full-screen',            tooltip: 'Resizes the toon so it fills the entire window',                              def: 1},
+
-
{name: 'noscale',  title: ' Show outside-the-frame action',        tooltip: 'Lets you see what\'s happening beyond the frames',                            def: 0},
+
-
// {name: 'showmenu',  title: 'Enable right-click menu',                tooltip: 'Enables the right-click context menu',                                        def: 1},
+
-
{name: 'seekbar',  title: 'Show seek bar',                          tooltip: 'Lets you fast forward and rewind',                                            def: 1},
+
-
{name: 'frames',    title: ' Show frame counter on seek bar',        tooltip: 'Shows you exactly where you are',                                            def: 1},
+
-
{name: 'hrwiki',    title: 'Add HRWiki link',                        tooltip: 'Adds a link to the appropriate page on the Homestar Runner Wiki',            def: 1},
+
-
{name: 'prevnext',  title: 'Show previous/next buttons',            tooltip: 'Lets you easily move through SBEmails, TGS, etc',                            def: 1},
+
-
{name: 'checknext', title: ' Check if next exists',                  tooltip: 'Doesn\'t add a "next" link on the latest SBEmail, etc',                      def: 0},
+
-
{name: 'flipper',  title: 'Turn everything upside-down',            tooltip: 'Relive the mania of inverted April Fools Day Homestar Runner',                def: 0},
+
-
{name: 'navbar',    title: 'Plain HTML navbar',                      tooltip: 'Replaces the flash navbar with normal links... so you can open in tabs, etc', def: 0},
+
-
{name: 'randot',    title: ' Include Big Toons in rando',            tooltip: 'Limit the "rando" function to what you like to watch',                        def: 1},
+
-
{name: 'randosh',  title: ' Include Shorts in rando',              tooltip: 'Limit the "rando" function to what you like to watch',                        def: 1},
+
-
{name: 'randoho',  title: ' Include Holiday toons in rando',        tooltip: 'Limit the "rando" function to what you like to watch',                        def: 1},
+
-
{name: 'randop',    title: ' Include Puppet Stuff in rando',        tooltip: 'Limit the "rando" function to what you like to watch',                        def: 1},
+
-
{name: 'randoteh',  title: ' Include Powered by The Cheat in rando', tooltip: 'Limit the "rando" function to what you like to watch',                        def: 1},
+
-
{name: 'randosb',  title: ' Include Strong Bad Emails in rando',    tooltip: 'Limit the "rando" function to what you like to watch',                        def: 1},
+
-
{name: 'randoam',  title: ' Include Answering Machine in rando',    tooltip: 'Limit the "rando" function to what you like to watch',                        def: 1},
+
-
{name: 'randotgs',  title: ' Include Teen Girl Squad in rando',      tooltip: 'Limit the "rando" function to what you like to watch',                        def: 1},
+
-
{name: 'subtitles', title: 'Show subtitles',                        tooltip: 'Shows subtitles or captions below the toon, if any are available',            def: 0},
+
-
{name: 'captions',  title: ' Show captions',                        tooltip: 'Include sound effects in the subtitles',                                      def: 1},
+
-
{name: 'colours',  title: ' Use colours',                          tooltip: 'Distinguish characters by colour effects (turn off if colourblind)',          def: 1},
+
-
{name: 'testsubs',  title: ' Test subtitles script',                tooltip: 'Use this to test a subtitles script (copy/paste into a text box)',            def: 0},
+
-
{name: 'updates',  title: 'Check for updates',                      tooltip: 'Regularly check for updates to the All-in-one script',                        def: 1}
+
-
];
+
-
settings = {};
+
-
for (i = 0; i < settingnames.length; i++)
+
-
settings[settingnames[i].name] = GM_getValue(settingnames[i].name, settingnames[i].def) != 0;
+
-
settings['language'] = GM_getValue('language', 'en');
+
-
defaultxmlfile = escape('<?xml version="1.0" encoding="utf-8"?>\n<transcript xml:lang="en-us">\n<line start="" end="" speaker=""></line>\n</transcript>');
+
-
settings['testsubsdata'] = unescape(GM_getValue('testsubsdata', defaultxmlfile));
+
-
settings['names'] = GM_getValue('names', 0);
+
-
extrasettings = [];
+
-
+
-
addsettingsbox();
+
-
+
-
document.body.style.margin = "0px";
+
-
+
-
// find flash objects
+
-
switch (whichsite)
+
-
{
+
-
case 0: // www.homestarrunner.com
+
-
var objs = document.getElementsByTagName("EMBED");
+
-
if (objs && objs.length >= 2)
+
-
{
+
-
var flashmovie = objs[0];
+
-
var navbar = objs[1];
+
-
}
+
-
else if (objs && objs.length >= 1)
+
-
{
+
-
var flashmovie = objs[0];
+
-
var navbar = false;
+
-
}
+
-
else
+
-
{
+
-
var flashmovie = false;
+
-
var navbar = false;
+
-
}
+
-
if (!flashmovie)
+
-
{
+
-
objs = document.getElementsByTagName("OBJECT");
+
-
if (objs && objs.length >= 1)
+
-
var flashmovie = objs[0];
+
-
}
+
-
break;
+
-
case 1: // podstar.homestarrunner.com
+
-
var objs = document.getElementsByTagName("EMBED");
+
-
var flashmovie = false;
+
-
if (objs && objs.length >= 1)
+
-
var navbar = objs[0];
+
-
else
+
-
var navbar = false;
+
-
break;
+
-
case 2: // videlectrix
+
-
var objs = document.getElementsByTagName("EMBED");
+
-
var navbar = false;
+
-
if (objs && objs.length >= 1)
+
-
var flashmovie = objs[0];
+
-
else
+
-
var flashmovie = false;
+
-
settings.navbar = false;
+
-
break;
+
-
case 3: // mirror
+
-
var objs = document.getElementsByTagName("EMBED");
+
-
var flashmovie = false;
+
-
if (objs && objs.length >= 1)
+
-
var flashmovie = objs[0];
+
-
if (!flashmovie)
+
-
{
+
-
objs = document.getElementsByTagName("OBJECT");
+
-
if (objs && objs.length >= 1)
+
-
var flashmovie = objs[0];
+
-
}
+
-
navbar = document.getElementById('navbar');
+
-
if (!navbar)
+
-
settings.navbar = false;
+
-
var flashcontainer = document.getElementById('flash');
+
-
if (flashcontainer)
+
-
flashcontainer.style.width = "auto";
+
-
break;
+
-
}
+
-
if (flashmovie)
+
-
{
+
-
//expose Flash plugin-added methods
+
-
flashmovie = flashmovie.wrappedJSObject;
+
-
+
-
// confirm that this is really a flash file
+
-
// and not (for example) the embedded background sound on SB's website
+
-
if (flashmovie.nodeName.toLowerCase() == "object")
+
-
{
+
-
var src = flashmovie.getAttribute('src');
+
-
if (src)
+
-
{
+
-
if (src.substring(src.length - 4).toLowerCase() != ".swf")
+
-
flashmovie = false;
+
-
}
+
-
else
+
-
{
+
-
a = flashmovie.getElementsByTagName('param').namedItem("movie");
+
-
if (!a || a.value.substring(a.value.length - 4).toLowerCase() != ".swf")
+
-
flashmovie = false;
+
-
}
+
-
}
+
-
else if (flashmovie.nodeName.toLowerCase() == "embed")
+
-
{
+
-
var src = flashmovie.getAttribute('src');
+
-
if (!src || src.substring(src.length - 4).toLowerCase() != ".swf")
+
-
flashmovie = false;
+
-
}
+
-
}
+
-
+
-
if (!flashmovie)
+
-
settings.resize = settings.seekbar = settings.frames = settings.flipper = settings.noscale = settings.showmenu = settings.subtitles = false;
+
-
if (settings.flipper)
+
-
settings.seekbar = settings.subtitles = false;
+
-
+
-
// globals
+
-
var settingsbox;
+
-
var seekbar;
+
-
var isPercentage = false;
+
-
var aspect = 1.0;
+
-
var randolink;
+
-
var randourls = [];
+
-
var subtitleholder;
+
-
var transcript = [];
+
-
var nosubtitles = document.createComment("");
+
-
var currentsubtitles = nosubtitles;
+
-
var characters = {
+
-
"sfx": {
+
-
"color": "#FFF",
+
-
"sfx": true,
+
-
"name": {"en": ""}
+
-
}
+
-
};
+
-
var transcriptErrors;
+
-
var subtitleLoop = false;
+
-
+
-
// used by wikilink, prevnext, flipper... put it out here.
+
-
var filename = location.pathname.toLowerCase();
+
-
i = filename.lastIndexOf('/');
+
-
if (i >= 0)
+
-
filename = filename.substr(i + 1);
+
-
i = filename.lastIndexOf('.');
+
-
if (i >= 0)
+
-
filename = filename.substr(0,i);
+
-
+
-
// pull puppet stuff out of its background
+
-
if ((settings.flipper || settings.seekbar || settings.subtitles) && flashmovie.src=="puppet_background.swf")
+
-
{
+
-
var flashvars = getFlashVars();
+
-
if (flashvars.videoName)
+
-
replaceFlash(flashvars.videoName);
+
-
}
+
-
+
-
if (settings.navbar)
+
-
replacenavbar();
+
-
if (settings.subtitles)
+
-
setupSubtitles();
+
-
if (settings.seekbar)
+
-
addFlashControls(flashmovie);
+
-
if (settings.resize)
+
-
resize();
+
-
if (settings.resize && settings.noscale)
+
-
noscale();
+
-
//if (settings.showmenu)
+
-
// showmenu();
+
-
if (settings.hrwiki)
+
-
wikilink();
+
-
if (settings.prevnext)
+
-
prevnext();
+
-
if (settings.flipper && whichsite == 0)
+
-
flipper();
+
-
if (settings.updates)
+
-
checkupdates();
+
-
+
-
// mess with popup windows - make them bigger and resizeable
+
-
var oldopen = unsafeWindow.open;
+
-
unsafeWindow.open = function(a,b,c)
+
-
{
+
-
c = c.split(/,/);
+
-
var opts = {};
+
-
for (var i = 0; i < c.length; i++)
+
-
{
+
-
var d = c[i].split(/=/);
+
-
if (d.length == 2)
+
-
opts[d[0]] = d[1];
+
-
}
+
-
opts["width"] = window.screen.width * 0.8;
+
-
opts["height"] = window.screen.height * 0.8;
+
-
opts["resizeable"] = "yes";
+
-
c = "";
+
-
for (var i in opts)
+
-
{
+
-
c += i + "=" + opts[i] + ",";
+
-
}
+
-
return oldopen(a,b,c);
+
-
}
+
-
}
+
-
 
+
-
function replaceFlash(url)
+
-
{
+
-
where = flashmovie;
+
-
while (where && where.parentNode && where.parentNode.nodeName.toLowerCase() == "object")
+
-
where = where.parentNode;
+
-
var newFlash=document.createElement("object");
+
-
newFlash.setAttribute("width",flashmovie.width);
+
-
newFlash.setAttribute("height",flashmovie.height);
+
-
newFlash.setAttribute("type","application/x-shockwave-flash");
+
-
newFlash.setAttribute("bgcolor",flashmovie.bgcolor ? flashmovie.bgcolor : "#FFFFFF");
+
-
newFlash.setAttribute("data",url);
+
-
+
-
where.parentNode.replaceChild(newFlash,where);
+
-
+
-
flashmovie=newFlash.wrappedJSObject;
+
-
}
+
-
function getSWFFilename()
+
-
{
+
-
// try to find the filename
+
-
var a = flashmovie.src;
+
-
if (!a)
+
-
a = flashmovie.data;
+
-
if (!a)
+
-
{
+
-
a = flashmovie.getElementsByTagName('param').namedItem('movie');
+
-
if (a)
+
-
a = a.value;
+
-
}
+
-
return a;
+
-
}
+
-
function getFlashVars()
+
-
{
+
-
var flashvars = new Object();
+
-
var flashvarsstring = flashmovie.getAttribute("FlashVars");
+
-
if (!flashvarsstring)
+
-
{
+
-
flashvarsstring = flashmovie.getElementsByTagName('param').namedItem('FlashVars');
+
-
if (flashvarsstring)
+
-
flashvarsstring = flashvarsstring.value;
+
-
}
+
-
// parse the string
+
-
if (flashvarsstring)
+
-
{
+
-
var flashvarsparts = flashvarsstring.split('&');
+
-
for (var i = 0; i < flashvarsparts.length; i++)
+
-
{
+
-
var a = flashvarsparts[i].split('=');
+
-
if (a.length == 2)
+
-
flashvars[unescape(a[0])] = unescape(a[1]);
+
-
}
+
-
}
+
-
var filename = getSWFFilename();
+
-
var i = filename.indexOf('?');
+
-
if (i >= 0)
+
-
var flashvarsstring = filename.substring(i + 1);
+
-
if (flashvarsstring)
+
-
{
+
-
var flashvarsparts = flashvarsstring.split('&');
+
-
for (var i = 0; i < flashvarsparts.length; i++)
+
-
{
+
-
var a = flashvarsparts[i].split('=');
+
-
if (a.length == 2)
+
-
flashvars[unescape(a[0])] = unescape(a[1]);
+
-
}
+
-
}
+
-
return flashvars;
+
-
}
+
-
 
+
-
function addsettingsbox()
+
-
{
+
-
settingsbox = document.createElement('div');
+
-
settingsbox.style.borderRight = settingsbox.style.borderBottom = '1px solid #666';
+
-
settingsbox.style.background = '#EEE';
+
-
settingsbox.style.color = '#000';
+
-
settingsbox.style.position = 'fixed';
+
-
settingsbox.style.left = 0;
+
-
settingsbox.style.top = 0;
+
-
settingsbox.style.width = '350px';
+
-
settingsbox.style.font = '12px sans-serif';
+
-
settingsbox.style.textAlign = 'left';
+
-
settingsbox.style.display = 'none';
+
-
settingsbox.style.zIndex = 2;
+
-
document.body.appendChild(settingsbox);
+
-
var titlebar = document.createElement('div');
+
-
titlebar.style.fontWeight = "bolder";
+
-
titlebar.style.background = "#CCC";
+
-
titlebar.style.borderBottom = "1px solid #666";
+
-
titlebar.style.padding = '3px';
+
-
settingsbox.appendChild(titlebar);
+
-
var closebutton = document.createElement('img');
+
-
closebutton.src = image_close;
+
-
closebutton.title = "Click to hide preferences";
+
-
closebutton.style.cssFloat = "right";
+
-
closebutton.style.verticalAlign = "text-bottom";
+
-
closebutton.style.cursor = "pointer";
+
-
closebutton.style.display = "block";
+
-
closebutton.addEventListener('click', function(){settingsbox.style.display = "none"; settingslink.style.display = "block";}, false);
+
-
titlebar.appendChild(closebutton);
+
-
var prefslogo = document.createElement('img');
+
-
prefslogo.src = image_prefs;
+
-
prefslogo.style.verticalAlign = "text-bottom";
+
-
titlebar.appendChild(prefslogo);
+
-
titlebar.appendChild(document.createTextNode(" Preferences"));
+
-
var settingsform = document.createElement('form');
+
-
settingsform.style.margin = 0;
+
-
settingsform.style.padding = '3px';
+
-
settingsbox.appendChild(settingsform);
+
-
var settingslist = document.createElement('ul');
+
-
settingslist.style.listStyle = "none";
+
-
var a = window.innerHeight - 75;
+
-
if (a < 40) a = 40;
+
-
settingslist.style.maxHeight = a + 'px';
+
-
settingslist.style.overflow = 'auto'; // vertical scrollbar if needed
+
-
window.addEventListener('resize', function()
+
-
{
+
-
var a = window.innerHeight - 75;
+
-
if (a < 40) a = 40;
+
-
settingslist.style.maxHeight = a + 'px';
+
-
}, false);
+
-
settingslist.style.padding = settingslist.style.margin = 0;
+
-
settingsform.appendChild(settingslist);
+
-
for (i = 0; i < settingnames.length; i++)
+
-
{
+
-
var settingrow = document.createElement('li');
+
-
settingnames[i].li = settingrow;
+
-
var settingcheckbox = document.createElement('input');
+
-
settingcheckbox.type = "checkbox";
+
-
settingcheckbox.checked = settings[settingnames[i].name];
+
-
settingcheckbox.title = settingnames[i].tooltip;
+
-
settingcheckbox.id = "setting_" + settingnames[i].name;
+
-
settingcheckbox.addEventListener('click', enabledisable, false);
+
-
settingrow.appendChild(settingcheckbox);
+
-
settingnames[i].checkbox = settingcheckbox;
+
-
var settinglabel = document.createElement('label');
+
-
settinglabel.htmlFor = "setting_" + settingnames[i].name;
+
-
settinglabel.appendChild(document.createTextNode(' ' + settingnames[i].title));
+
-
settinglabel.title = settingnames[i].tooltip;
+
-
settingrow.appendChild(settinglabel);
+
-
settingnames[i].label = settinglabel;
+
-
+
-
if (settingnames[i].title.charAt(0) == ' ')
+
-
{
+
-
// get number of spaces;
+
-
var numspaces = 1;
+
-
while (settingnames[i].title.charAt(numspaces) == ' ') numspaces++;
+
-
var previousindex = i - 1;
+
-
while (previousindex > 0 && settingnames[previousindex].title.substring(0, numspaces).match(/^ +$/))
+
-
previousindex--;
+
-
if (previousindex >= 0)
+
-
{
+
-
settingnames[i].parent = settingnames[previousindex];
+
-
if (!settingnames[previousindex].ul)
+
-
{
+
-
settingnames[previousindex].ul = document.createElement('ul');
+
-
settingnames[previousindex].ul.style.listStyle = "none";
+
-
settingnames[previousindex].ul.style.padding = settingnames[previousindex].ul.style.margin = 0;
+
-
settingnames[previousindex].ul.style.marginLeft = "2em";
+
-
settingnames[previousindex].li.appendChild(settingnames[previousindex].ul);
+
-
}
+
-
settingnames[previousindex].ul.appendChild(settingrow);
+
-
}
+
-
else
+
-
settingslist.appendChild(settingrow);
+
-
}
+
-
else
+
-
settingslist.appendChild(settingrow);
+
-
}
+
-
var div = document.createElement('div');
+
-
div.style.textAlign = "center";
+
-
settingsform.appendChild(div);
+
-
var savebutton = document.createElement('input');
+
-
savebutton.type = "submit";
+
-
savebutton.value = "Save and Apply";
+
-
div.appendChild(savebutton);
+
-
var nocachebutton = document.createElement('input');
+
-
nocachebutton.type = "submit";
+
-
nocachebutton.value = "Clear subtitles cache";
+
-
nocachebutton.addEventListener("click", function(){GM_setValue("cachedodge", Math.random().toString())}, false);
+
-
div.appendChild(document.createTextNode(" "));
+
-
div.appendChild(nocachebutton);
+
-
settingsform.addEventListener("submit", savesettings, false);
+
-
+
-
var settingslink = document.createElement('div');
+
-
settingslink.style.borderRight = settingslink.style.borderBottom = '1px solid #666';
+
-
settingslink.style.background = '#EEE';
+
-
settingslink.style.display = "block";
+
-
settingslink.style.position = 'fixed';
+
-
settingslink.style.left = '0px';
+
-
settingslink.style.top = '0px';
+
-
settingslink.style.padding = '3px';
+
-
settingslink.style.zIndex = 2;
+
-
var settingslinkimage = document.createElement('img');
+
-
settingslinkimage.src = image_prefs;
+
-
settingslinkimage.title = "Click to show preferences";
+
-
settingslinkimage.style.cursor = "pointer";
+
-
settingslinkimage.style.display = "block";
+
-
settingslinkimage.addEventListener('click', function(){settingsbox.style.display = "block"; settingslink.style.display = "none";}, false);
+
-
settingslink.appendChild(settingslinkimage);
+
-
document.body.appendChild(settingslink);
+
-
+
-
// add some extra settings other than checkboxes that aren't handled in the structure above
+
-
extrasettings[0] = {'name': 'language'};
+
-
var settingrow = document.createElement('li');
+
-
extrasettings[0].li = settingrow;
+
-
var settinglabel = document.createElement('label');
+
-
settinglabel.htmlFor = "setting_language";
+
-
settinglabel.appendChild(document.createTextNode('Subtitle Language: '));
+
-
settinglabel.title = 'Display subtitles in this language, if any';
+
-
settingrow.appendChild(settinglabel);
+
-
extrasettings[0].label = settinglabel;
+
-
var settingselect = document.createElement('select');
+
-
settingselect.title = 'Display subtitles in this language, if any';
+
-
settingselect.id = "setting_language";
+
-
settingrow.appendChild(settingselect);
+
-
extrasettings[0].select = settingselect;
+
-
for (i = 0; i < settingnames.length; i++)
+
-
{
+
-
if (settingnames[i].name == "subtitles")
+
-
{
+
-
extrasettings[0].parent = settingnames[i];
+
-
settingnames[i].ul.insertBefore(settingrow, settingnames[i].ul.firstChild);
+
-
}
+
-
}
+
-
extrasettings[0].populated = false;
+
-
+
-
extrasettings[1] = {'name': 'testsubsdata'};
+
-
var div = document.createElement('div');
+
-
div.style.display = "block";
+
-
div.style.margin = "5px 10px 5px 2em";
+
-
div.style.textAlign = "center";
+
-
extrasettings[1].div = div;
+
-
var settingtextarea = document.createElement('textarea');
+
-
settingtextarea.title = 'Paste your XML data here';
+
-
settingtextarea.id = "setting_testsubsdata";
+
-
settingtextarea.rows = 10;
+
-
settingtextarea.style.width = "100%";
+
-
settingtextarea.style.fontSize = "10px";
+
-
settingtextarea.style.textAlign = "left";
+
-
settingtextarea.appendChild(document.createTextNode(settings['testsubsdata']));
+
-
div.appendChild(settingtextarea);
+
-
extrasettings[1].textarea = settingtextarea;
+
-
// only enable the refresh option if we're already set up for testing subtitles
+
-
//  - I'm not sure if it's robust otherwise.
+
-
//
+
-
// The interface for this thing is kinda confusing, so it's not in the script by default
+
-
// change the "false" to a "true" to include it.
+
-
if (settings.testsubs && false)
+
-
{
+
-
var settingbutton = document.createElement('input');
+
-
settingbutton.type = 'button';
+
-
settingbutton.title = 'Reload test XML data';
+
-
settingbutton.value = 'Reload Subtitles';
+
-
settingbutton.addEventListener('click', reloadSubtitles, false);
+
-
div.appendChild(settingbutton);
+
-
extrasettings[1].button = settingbutton;
+
-
}
+
-
for (i = 0; i < settingnames.length; i++)
+
-
{
+
-
if (settingnames[i].name == "testsubs")
+
-
{
+
-
extrasettings[1].parent = settingnames[i];
+
-
settingnames[i].li.appendChild(div);
+
-
}
+
-
}
+
-
+
-
extrasettings[2] = {'name': 'names'};
+
-
var settingrow = document.createElement('li');
+
-
extrasettings[2].li = settingrow;
+
-
var settinglabel = document.createElement('label');
+
-
settinglabel.htmlFor = "setting_names";
+
-
settinglabel.appendChild(document.createTextNode('Show speakers\' names: '));
+
-
settinglabel.title = 'Show the speakers\' names before their lines';
+
-
settingrow.appendChild(settinglabel);
+
-
extrasettings[2].label = settinglabel;
+
-
var settingselect = document.createElement('select');
+
-
settingselect.title = 'Show the speakers\' names before their lines';
+
-
settingselect.id = "setting_names";
+
-
settingrow.appendChild(settingselect);
+
-
extrasettings[2].select = settingselect;
+
-
var option = document.createElement('option');
+
-
option.value = "0";
+
-
option.appendChild(document.createTextNode("Never"));
+
-
if (settings['names'] == 0)
+
-
option.selected = true;
+
-
settingselect.appendChild(option);
+
-
var option = document.createElement('option');
+
-
option.value = "1";
+
-
option.appendChild(document.createTextNode("On voiceovers"));
+
-
if (settings['names'] == 1)
+
-
option.selected = true;
+
-
settingselect.appendChild(option);
+
-
var option = document.createElement('option');
+
-
option.value = "2";
+
-
option.appendChild(document.createTextNode("Always"));
+
-
if (settings['names'] == 2)
+
-
option.selected = true;
+
-
settingselect.appendChild(option);
+
-
for (i = 0; i < settingnames.length; i++)
+
-
{
+
-
if (settingnames[i].name == "colours")
+
-
{
+
-
extrasettings[2].parent = settingnames[i].parent;
+
-
settingnames[i].parent.ul.insertBefore(settingrow, settingnames[i].li.nextSibling);
+
-
}
+
-
}
+
-
+
-
enabledisable();
+
-
}
+
-
function enabledisable()
+
-
{
+
-
for (i = 0; i < settingnames.length; i++)
+
-
{
+
-
if (!settingnames[i].parent)
+
-
continue;
+
-
enabled = true;
+
-
p = settingnames[i].parent;
+
-
while(p)
+
-
{
+
-
if (!p.checkbox.checked)
+
-
{
+
-
enabled = false;
+
-
break;
+
-
}
+
-
p = p.parent;
+
-
}
+
-
settingnames[i].checkbox.disabled = !enabled;
+
-
settingnames[i].label.style.color = enabled ? "inherit" : "#666";
+
-
}
+
-
+
-
enabled = true;
+
-
p = extrasettings[0].parent;
+
-
while(p)
+
-
{
+
-
if (!p.checkbox.checked)
+
-
{
+
-
enabled = false;
+
-
break;
+
-
}
+
-
p = p.parent;
+
-
}
+
-
extrasettings[0].select.disabled = !enabled;
+
-
extrasettings[0].label.style.color = enabled ? "inherit" : "#666";
+
-
if (enabled && !extrasettings[0].populated)
+
-
downloadxmlfromwiki("Subtitles:Languages", populatelanguagelist);
+
-
 
+
-
+
-
enabled = true;
+
-
p = extrasettings[1].parent;
+
-
while(p)
+
-
{
+
-
if (!p.checkbox.checked)
+
-
{
+
-
enabled = false;
+
-
break;
+
-
}
+
-
p = p.parent;
+
-
}
+
-
extrasettings[1].textarea.disabled = !enabled;
+
-
if (extrasettings[1].button)
+
-
extrasettings[1].button.disabled = !enabled;
+
-
// hide it entirely if immediate parent is disabled
+
-
extrasettings[1].div.style.display = extrasettings[1].parent.checkbox.checked ? "block" : "none";
+
-
settingsbox.style.width = extrasettings[1].parent.checkbox.checked ? "500px" : "350px";
+
-
 
+
-
enabled = true;
+
-
p = extrasettings[2].parent;
+
-
while(p)
+
-
{
+
-
if (!p.checkbox.checked)
+
-
{
+
-
enabled = false;
+
-
break;
+
-
}
+
-
p = p.parent;
+
-
}
+
-
extrasettings[2].select.disabled = !enabled;
+
-
extrasettings[2].label.style.color = enabled ? "inherit" : "#666";
+
-
}
+
-
function savesettings(e)
+
-
{
+
-
for (i = 0; i < settingnames.length; i++)
+
-
{
+
-
settingbox = settingnames[i].checkbox;
+
-
if (settingbox)
+
-
{
+
-
settings[settingnames[i].name] = settingbox.checked;
+
-
GM_setValue(settingnames[i].name, settingbox.checked ? 1 : 0);
+
-
}
+
-
}
+
-
+
-
if (extrasettings[0].populated)
+
-
{
+
-
settings['language'] = extrasettings[0].select.value;
+
-
GM_setValue('language', extrasettings[0].select.value);
+
-
}
+
-
settings['testsubsdata'] = extrasettings[1].textarea.value;
+
-
GM_setValue('testsubsdata', escape(extrasettings[1].textarea.value));
+
-
// stop the form from actually being submitted
+
-
if (e && e.preventDefault)
+
-
{
+
-
location.reload();
+
-
e.preventDefault();
+
-
}
+
-
settings['names'] = extrasettings[2].select.value;
+
-
GM_setValue('names', extrasettings[2].select.value);
+
-
}
+
-
 
+
-
// modified from Homestar-Fullon
+
-
function doResize()
+
-
{
+
-
var dw = window.innerWidth;
+
-
var dh = window.innerHeight - 15; // things get weird sometimes... -15 to make sure we don't get scrollbars.
+
-
if (navbar)
+
-
{
+
-
// parseInt will take the number part at the start, turning eg "10px" into 10
+
-
a = document.defaultView.getComputedStyle(navbar, null);
+
-
dh -= parseInt(a.height,10);
+
-
dh -= parseInt(a.marginTop,10);
+
-
dh -= parseInt(a.marginBottom,10);
+
-
}
+
-
if (subtitleholder)
+
-
{
+
-
a = document.defaultView.getComputedStyle(subtitleholder, null)
+
-
dh -= parseInt(a.height,10);
+
-
dh -= parseInt(a.marginTop,10);
+
-
dh -= parseInt(a.marginBottom,10);
+
-
}
+
-
if (transcriptErrors)
+
-
{
+
-
a = document.defaultView.getComputedStyle(transcriptErrors, null)
+
-
dh -= parseInt(a.height,10);
+
-
dh -= parseInt(a.marginTop,10);
+
-
dh -= parseInt(a.marginBottom,10);
+
-
}
+
-
// enforce a (rather small) minimum size, regardless of how much crap is squeezed below the frame
+
-
if (dw < 100) dw = 100;
+
-
if (dh < 100) dh = 100;
+
-
// if it was a percentage size, or we're looking outside the frame, just fill the whole window.
+
-
// otherwise, keep the aspect ratio correct... "touch inside" style.
+
-
if (!isPercentage && !settings.noscale)
+
-
{
+
-
if(dw/aspect <= dh)
+
-
dh = Math.floor(dw / aspect);
+
-
else
+
-
dw = Math.floor(dh * aspect);
+
-
}
+
-
 
+
-
// set embed's size
+
-
flashmovie.width = dw;
+
-
flashmovie.height = dh;
+
-
if (seekbar)
+
-
seekbar.style.width = Math.max(dw, 450) + "px";
+
-
}
+
-
function resize()
+
-
{
+
-
if (flashmovie.width.toString().indexOf('%') >= 0 || flashmovie.width.toString().indexOf('%') >= 0)
+
-
isPercentage = true;
+
-
else
+
-
aspect = flashmovie.width/flashmovie.height;
+
-
window.addEventListener('resize', doResize, false);
+
-
doResize();
+
-
}
+
-
function noscale()
+
-
{
+
-
// have to wait until the Flash has loaded, otherwise SetVariable will fail.
+
-
// best way I have found to test this, is if the current frame is >= 0...
+
-
// before it's loaded, it's -1.
+
-
// Before Flash itself initialises, CurrentFrame doesn't exist, so check for that too.
+
-
var a = flashmovie.CurrentFrame;
+
-
if (typeof(a) == "function")
+
-
a = flashmovie.CurrentFrame();
+
-
if (typeof(a) == "number" && a >= 0 && flashmovie.SetVariable)
+
-
flashmovie.SetVariable("Stage.scaleMode", "noScale");
+
-
else
+
-
setTimeout(noscale, 10);
+
-
}
+
-
function showmenu()
+
-
{
+
-
var a = flashmovie.CurrentFrame;
+
-
if (typeof(a) == "function")
+
-
a = flashmovie.CurrentFrame();
+
-
if (typeof(a) == "number" && a >= 0 && flashmovie.SetVariable)
+
-
flashmovie.SetVariable("Stage.showMenu", 1);
+
-
else
+
-
setTimeout(showmenu, 10);
+
-
}
+
-
 
+
-
function addHRWikiLink(pagename, isurl)
+
-
{
+
-
div = document.createElement("div")
+
-
div.style.borderLeft = div.style.borderBottom = '1px solid #666';
+
-
div.style.background = '#EEE';
+
-
div.style.position = "fixed";
+
-
div.style.right = "0px";
+
-
div.style.top = "0px";
+
-
div.style.padding = "3px";
+
-
link = document.createElement("a");
+
-
if (isurl)
+
-
link.href = pagename;
+
-
else
+
-
link.href = "http://www.hrwiki.org/index.php/" + escape(pagename.replace(/ /g, '_'));
+
-
link.title = "See the HRWiki article for this page";
+
-
link.style.display = "block";
+
-
link.style.textDecoration = "none"
+
-
div.appendChild(link);
+
-
img=document.createElement("img");
+
-
img.style.border="0px";
+
-
img.style.display="block";
+
-
img.src=image_hrwiki;
+
-
link.appendChild(img);
+
-
if (settings.subtitles)
+
-
{
+
-
link = document.createElement("a");
+
-
link.href = "http://www.hrwiki.org/index.php/Subtitles:" + escape(filename.replace(/ /g, '_')) + "/" + escape(settings.language);
+
-
link.title = "See the HRWiki article for this page's subtitles";
+
-
link.style.display = "block";
+
-
link.style.textDecoration = "none"
+
-
link.style.textAlign = "center";
+
-
link.style.fontSize = link.style.lineHeight = "16px";
+
-
link.style.marginTop = "3px";
+
-
div.appendChild(link);
+
-
link.appendChild(document.createTextNode('S'));
+
-
}
+
-
document.body.appendChild(div);
+
-
}
+
-
function wikilink()
+
-
{
+
-
// many pages on the mirror have an "info" link in the navbar (thanks Tom!)... use that
+
-
if (whichsite == 3)
+
-
{
+
-
var a = document.getElementById("navbar");
+
-
if (a) a = a.getElementsByTagName("a");
+
-
if (a)
+
-
{
+
-
for (i = 0; i < a.length; i++)
+
-
{
+
-
if (a[i].firstChild.nodeType == 3 && a[i].firstChild.nodeValue == "info")
+
-
{
+
-
addHRWikiLink(a[i].href, true);
+
-
return;
+
-
}
+
-
}
+
-
}
+
-
}
+
-
+
-
// pull the filename from the url, use it as a link to HRWiki
+
-
// all the filenames except a couple of special-cases are
+
-
//  redirects to their articles
+
-
// don't link to certain pages, they aren't redirects, but already existing pages
+
-
// also detect a 404 error and special-case Strong Sad's Lament
+
-
    if (document.title == "Oops! You bwoke it.")
+
-
addHRWikiLink("404'd");
+
-
else if (filename == "interview")
+
-
addHRWikiLink("The_Interview");
+
-
else if (filename == "fhqwhgads")
+
-
addHRWikiLink("Everybody_to_the_Limit");
+
-
else if (filename == "trogdor")
+
-
addHRWikiLink("TROGDOR%21");
+
-
else if (filename == "marshie")
+
-
addHRWikiLink("Meet_Marshie");
+
-
else if (filename == "eggs")
+
-
addHRWikiLink("Eggs_(toon)");
+
-
else if (filename == "fireworks")
+
-
addHRWikiLink("Happy_Fireworks");
+
-
else if (location.pathname.substr(0, 12) == "/sadjournal/" && filename != "wonderyears" && filename != "super8")
+
-
addHRWikiLink("Strong_Sad%27s_Lament");
+
-
else if (location.pathname.substr(0,5) == "/vii/" && (filename == "" || filename == "index"))
+
-
addHRWikiLink("Viidelectrix");
+
-
else if (filename == "" || filename == "index")
+
-
{
+
-
    if (whichsite == 0)
+
-
addHRWikiLink("Index_Page");
+
-
else if (whichsite == 1)
+
-
addHRWikiLink("Podstar_Runner");
+
-
else if (whichsite == 2)
+
-
addHRWikiLink("Videlectrix");
+
-
else if (whichsite == 3)
+
-
; // this will be a 403 page - do nothing.
+
-
}
+
-
else
+
-
addHRWikiLink(filename);
+
-
}
+
-
 
+
-
// Prev/Next links
+
-
function addprevnextlinks(prefix,number)
+
-
{
+
-
if (number > 1)
+
-
{
+
-
var prevnum = (number - 1).toString();
+
-
var link = document.createElement("a");
+
-
if (prefix == "sbemail" && number == 101)
+
-
link.href="sbemailahundred.html";
+
-
else if (prefix == "sbemail" && number == 152)
+
-
link.href="kotpoptoon.html";
+
-
else
+
-
link.href=prefix+prevnum+".html";
+
-
link.style.position="fixed";
+
-
link.style.left="0px";
+
-
link.style.bottom="0px";
+
-
link.style.padding="3px";
+
-
link.style.background="white";
+
-
link.style.border="1px solid black";
+
-
link.style.textDecoration="none";
+
-
link.appendChild(document.createTextNode('<'));
+
-
document.body.appendChild(link);
+
-
}
+
-
 
+
-
var nextnum = (number + 1).toString();
+
-
var link = document.createElement("a");
+
-
if (prefix == "sbemail" && number == 99)
+
-
link.href="sbemailahundred.html";
+
-
else if (prefix == "sbemail" && number == 150)
+
-
link.href="kotpoptoon.html";
+
-
else
+
-
link.href=prefix+nextnum+".html";
+
-
link.style.position="fixed";
+
-
link.style.right="0px";
+
-
link.style.bottom="0px";
+
-
link.style.padding="3px";
+
-
link.style.background="white";
+
-
link.style.border="1px solid black";
+
-
link.style.textDecoration="none";
+
-
link.appendChild(document.createTextNode('>'));
+
-
if (settings['checknext'])
+
-
{
+
-
GM_xmlhttpRequest({
+
-
method: "HEAD",
+
-
url: link.href + "?cachedodge=" + GM_getValue('cachedodge', 0),
+
-
onload: function (results)
+
-
{
+
-
if (results.status == 200 && results.responseHeaders.indexOf("404error.html") < 0)
+
-
document.body.appendChild(link);
+
-
}
+
-
});
+
-
}
+
-
else
+
-
document.body.appendChild(link);
+
-
}
+
-
function prevnext()
+
-
{
+
-
// this is coded like this instead of just looking for /(\d+)/ so that it
+
-
// doesn't find pages like commandos3 or xmas04
+
-
var result;
+
-
if ((result = filename.match(/^(sbemail|tgs|answer|bizcasfri|puppetjam|main)(\d+)$/)))
+
-
{
+
-
// sbemail100 isn't actually a sbemail
+
-
if (result[1] != "sbemail" || result[2] != "100")
+
-
addprevnextlinks(result[1],parseInt(result[2],10));
+
-
}
+
-
else if (filename == "sbemailahundred")
+
-
addprevnextlinks("sbemail", 100);
+
-
else if (filename == "kotpoptoon")
+
-
addprevnextlinks("sbemail", 151);
+
-
else if (filename == "dween_tgs")
+
-
addprevnextlinks("tgs", 6);
+
-
}
+
-
 
+
-
function flipper()
+
-
{
+
-
a = getSWFFilename();
+
-
if (!a)
+
-
return;
+
-
    if (filename == "toons")
+
-
replaceFlash("theyCallHimFlipperToons.swf?contentURL=" + escape(a));
+
-
else if (filename == "games")
+
-
replaceFlash("theyCallHimFlipperGames.swf?contentURL=" + escape(a));
+
-
else if (filename == "payplus")
+
-
replaceFlash("theyCallHimFlipperPayPlus.swf?contentURL=" + escape(a));
+
-
else if (filename == "main22")
+
-
replaceFlash("theyCallHimFlipperVirusMain.swf?contentURL=" + escape(a));
+
-
else if (filename == "sbemail118")
+
-
// virus *wasn't* flipped correctly originally, but I think having it work is better than
+
-
// preserving the glitch.
+
-
replaceFlash("theyCallHimFlipperVirusMain.swf?contentURL=" + escape(a));
+
-
else if (filename == "sbemailahundred")
+
-
replaceFlash("theyCallHimFlipperHundred.swf?contentURL=" + escape(a));
+
-
else
+
-
replaceFlash("theyCallHimFlipper.swf?contentURL=" + escape(a));
+
-
}
+
-
 
+
-
function addnavbarlink(ul,href,title)
+
-
{
+
-
var li = document.createElement("li");
+
-
var link = document.createElement("a");
+
-
link.href = href;
+
-
link.appendChild(document.createTextNode(title));
+
-
li.appendChild(link);
+
-
ul.appendChild(li);
+
-
return link;
+
-
}
+
-
function replacenavbar()
+
-
{
+
-
// need to add the styles as a stylesheet, rather than inline styles
+
-
// so that we can use :hover
+
-
GM_addStyle(
+
-
"#newnavbar { margin: 0; padding: 0; text-align: center; text-transform: lowercase; } " +
+
-
"#newnavbar li { margin: 0; padding: 0; display: inline; } " +
+
-
"#newnavbar :link, #newnavbar :visited { color: #666; font-family: sans-serif; text-decoration: none; padding: 0 1em; } " +
+
-
"#newnavbar :link:hover, #newnavbar :visited:hover { color: #CCC; } " +
+
-
// for overriding podstar's settings:
+
-
"#newnavbar :link, #newnavbar :visited { font-weight: normal; } " +
+
-
"#newnavbar :link:hover, #newnavbar :visited:hover { background: transparent; font-weight: normal; } "
+
-
);
+
-
var newnavbar = document.createElement("ul");
+
-
newnavbar.id = "newnavbar";
+
-
newnavbar.style.height = newnavbar.style.fontSize = newnavbar.style.lineHeight = "10px";
+
-
if (!settings.seekbar)
+
-
newnavbar.style.marginTop = "10px";
+
-
if (navbar)
+
-
{
+
-
var where = navbar;
+
-
while(where.parentNode.tagName.toLowerCase() == "object")
+
-
where = where.parentNode;
+
-
where.parentNode.insertBefore(newnavbar, where);
+
-
if (whichsite == 3)
+
-
where.style.display = "none";
+
-
else
+
-
where.parentNode.removeChild(where);
+
-
}
+
-
else
+
-
document.body.appendChild(newnavbar);
+
-
mainlink = addnavbarlink(newnavbar, "http://www.homestarrunner.com/main" + Math.floor(Math.random() * 24 + 1) + ".html", "Main");
+
-
// just for fun, re-randomise on each mouse-over (for the status bar)
+
-
mainlink.addEventListener("mouseover",function(){mainlink.href="http://www.homestarrunner.com/main" + Math.floor(Math.random() * 24 + 1) + ".html"}, false);
+
-
addnavbarlink(newnavbar, "http://www.homestarrunner.com/toons.html", "Toons");
+
-
addnavbarlink(newnavbar, "http://www.homestarrunner.com/games.html", "Games");
+
-
addnavbarlink(newnavbar, "http://www.homestarrunner.com/characters2.html", "Characters");
+
-
addnavbarlink(newnavbar, "http://www.homestarrunner.com/downloads.html", "Downloads");
+
-
addnavbarlink(newnavbar, "http://homestarrunner.stores.yahoo.net/", "Store");
+
-
addnavbarlink(newnavbar, "http://www.homestarrunner.com/sbemail.html", "SB Emails");
+
-
addnavbarlink(newnavbar, "http://www.homestarrunner.com/email.html", "Contact");
+
-
addnavbarlink(newnavbar, "http://podstar.homestarrunner.com/", "Podcast");
+
-
addnavbarlink(newnavbar, "http://www.homestarrunner.com/legal.html", "Legal");
+
-
randolink = addnavbarlink(newnavbar, "javascript:alert('rando.xml not loaded yet... be patient')", "Rando");
+
-
// load rando.xml and handle all that jazz
+
-
GM_xmlhttpRequest({
+
-
method: "GET",
+
-
url: "http://www.homestarrunner.com/rando.xml?cachedodge=" + GM_getValue('cachedodge', 0),
+
-
onload: randoxml_loaded
+
-
});
+
-
+
-
navbar = newnavbar;
+
-
}
+
-
function randoxml_loaded(results)
+
-
{
+
-
// info on DOMParser stole from http://www.webreference.com/programming/javascript/domwrapper/3.html
+
-
// Greasemonkey workaround from http://greaseblog.blogspot.com/2005/12/workarounds-for-missing-xmlhttprequest.html
+
-
// (oh noes! unsafeWindow!)
+
-
var parser = new unsafeWindow.DOMParser();
+
-
// fix invalid XML...
+
-
// add missing root element
+
-
var doc = results.responseText.replace(/<\?xml.*?\?>/g, ""); // strip <?xml ?> tag
+
-
doc = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<rando>" + doc + "</rando>";
+
-
// fix bad ampersands
+
-
doc = doc.replace(/&(?!\w*;)/g, "&amp;");
+
-
doc = parser.parseFromString(doc, "application/xml");
+
-
var sbemailcounter = 0;
+
-
for (i = 0; i < doc.documentElement.childNodes.length; i++)
+
-
{
+
-
if (doc.documentElement.childNodes[i].nodeType == 1)
+
-
{
+
-
var type = doc.documentElement.childNodes[i].nodeName.toLowerCase();
+
-
if (settings['rando' + type] == false) // == false so that it's considered "true" for undefined... if they add a new toon type
+
-
continue;
+
-
var u = doc.documentElement.childNodes[i].getAttribute('u');
+
-
var n = doc.documentElement.childNodes[i].getAttribute('n');
+
-
if (!n) n = "Untitled";
+
-
if (type == "sb")
+
-
{
+
-
sbemailcounter++;
+
-
n = "SBEmail: " + n;
+
-
}
+
-
if (u)
+
-
randourls[randourls.length] = {u: "http://www.homestarrunner.com/" + u, n: n};
+
-
else
+
-
randourls[randourls.length] = {u: "http://www.homestarrunner.com/sbemail" + sbemailcounter + ".html", n: n};
+
-
}
+
-
}
+
-
newrandolink()
+
-
// just for fun, re-randomise on each mouse-over (for the status bar)
+
-
randolink.addEventListener('mouseover', newrandolink, false);
+
-
}
+
-
function newrandolink()
+
-
{
+
-
if (randourls.length > 0)
+
-
{
+
-
var r = randourls[Math.floor(Math.random() * randourls.length)];
+
-
randolink.href = r.u;
+
-
randolink.title = r.n;
+
-
}
+
-
else
+
-
{
+
-
randolink.href = "javascript:alert('Nothing to choose from')";
+
-
randolink.title = "Nothing to choose from";
+
-
}
+
-
}
+
-
 
+
-
function downloadxmlfromwiki(url, callback)
+
-
{
+
-
url = escape(url.replace(/ /g, '_'));
+
-
GM_xmlhttpRequest({
+
-
method: "GET",
+
-
url: "http://www.hrwiki.org/index.php?title=" + url + "&action=raw&cachedodge=" + GM_getValue('cachedodge', 0),
+
-
onload: function(x) { xmldownloaded(x, callback, false, false); }
+
-
});
+
-
}
+
-
function xmldownloaded(results, callback, redirected, showerrors)
+
-
{
+
-
var text = results.responseText;
+
-
// strip various things - templates and <pre> tags for wiki formatting, and <noinclude> sections...
+
-
// <includeonly> tags are stripped (but their contents kept) for consistancy.
+
-
text = text.replace(/{{.*?}}/g, "");
+
-
text = text.replace(/<\/?pre[^>]*>/g, "");
+
-
text = text.replace(/<noinclude[^>]*>.*?<\/noinclude[^>]*>/g, "");
+
-
text = text.replace(/<includeonly[^>]*>(.*?)<\/includeonly[^>]*>/g, "$1");
+
-
text = text.replace(/^\s+/g, "");
+
-
// check for redirects
+
-
var matches = text.match(/^#REDIRECT\s*\[\[(.*)\]\]/i);
+
-
if (matches)
+
-
{
+
-
if (redirected) // trap double-redirects
+
-
{
+
-
removeSubtitles();
+
-
return;
+
-
}
+
-
text = matches[1];
+
-
if (matches = text.match(/^(.*)\|/))
+
-
text = matches[1];
+
-
if (matches = text.match(/^(.*)\#/))
+
-
text = matches[1];
+
-
text = text.replace(/^\s+|\s+$/g, '');
+
-
text = text.replace(/ /g, '_');
+
-
GM_xmlhttpRequest({
+
-
method: "GET",
+
-
url: "http://www.hrwiki.org/index.php?title=" + escape(text) + "&action=raw&cachedodge=" + GM_getValue('cachedodge', 0),
+
-
onload: function(x) { xmldownloaded(x, callback, true, showerrors); }
+
-
});
+
-
return;
+
-
}
+
-
var parser = new unsafeWindow.DOMParser();
+
-
try
+
-
{
+
-
var doc = parser.parseFromString(text, "application/xml");
+
-
}
+
-
catch (e)
+
-
{
+
-
if (showerrors)
+
-
{
+
-
transcriptError("Error in test subtitles:");
+
-
var pre = document.createElement("pre");
+
-
pre.style.font = "inherit";
+
-
pre.style.margin = "0.5em 0 0";
+
-
pre.appendChild(document.createTextNode(e.toString()))
+
-
transcriptErrors.appendChild(pre);
+
-
}
+
-
removeSubtitles();
+
-
return;
+
-
}
+
-
// check if returned document is an error message
+
-
if (doc.documentElement.lastChild && doc.documentElement.lastChild.nodeName == 'sourcetext')
+
-
{
+
-
// the xml document looks like
+
-
// <parsererror>Error details<sourcetext>Source text</sourcetext></parsererror>
+
-
if (showerrors)
+
-
{
+
-
transcriptError("Error in test subtitles:");
+
-
var pre = document.createElement("pre");
+
-
pre.style.font = "inherit";
+
-
pre.style.margin = "0.5em 0 0";
+
-
pre.appendChild(document.createTextNode(doc.documentElement.firstChild.nodeValue.replace(/Location: .*\n/, "")))
+
-
transcriptErrors.appendChild(pre);
+
-
pre = document.createElement("pre");
+
-
pre.style.margin = "0.5em 0 0";
+
-
pre.appendChild(document.createTextNode(doc.documentElement.lastChild.firstChild.nodeValue))
+
-
transcriptErrors.appendChild(pre);
+
-
}
+
-
removeSubtitles();
+
-
return;
+
-
}
+
-
callback(doc);
+
-
}
+
-
 
+
-
function populatelanguagelist(xml)
+
-
{
+
-
while (extrasettings[0].select.firstChild)
+
-
extrasettings[0].select.removeChild(extrasettings[0].select.firstChild);
+
-
a = xml.getElementsByTagName('language');
+
-
for (i = 0; i < a.length; i++)
+
-
{
+
-
// sanity-check the node
+
-
if (a[i].hasAttribute('xml:lang') && a[i].firstChild && (a[i].firstChild.nodeType == xml.TEXT_NODE || a[i].firstChild.nodeType == xml.CDATA_SECTION_NODE))
+
-
{
+
-
option = document.createElement('option');
+
-
option.appendChild(document.createTextNode(a[i].firstChild.nodeValue));
+
-
option.lang = option.value = a[i].getAttribute('xml:lang');
+
-
if (option.lang == settings['language'])
+
-
option.selected = true;
+
-
option.dir = "ltr";
+
-
if (a[i].hasAttribute('dir'))
+
-
option.dir = a[i].getAttribute('dir');
+
-
extrasettings[0].select.appendChild(option);
+
-
}
+
-
}
+
-
extrasettings[0].populated = true;
+
-
}
+
-
 
+
-
function setupSubtitles()
+
-
{
+
-
subtitleholder = document.createElement('div');
+
-
subtitleholder.style.color = "white";
+
-
subtitleholder.style.font = "20px/25px sans-serif";
+
-
subtitleholder.style.backgroundColor = "black";
+
-
subtitleholder.style.height = "100px";
+
-
//subtitleholder.style.marginTop = "10px";
+
-
subtitleholder.style.textAlign = "center";
+
-
where = flashmovie;
+
-
while(where.parentNode.tagName.toLowerCase() == "object")
+
-
where = where.parentNode;
+
-
where.parentNode.insertBefore(subtitleholder, where.nextSibling);
+
-
+
-
GM_addStyle(
+
-
'.italic { font-style: italic; } ' +
+
-
'.italic em, .italic cite, .italic i { font-style: normal; }'
+
-
);
+
-
+
-
subtitleholder.appendChild(currentsubtitles = document.createTextNode("Loading subtitles..."));
+
-
+
-
downloadxmlfromwiki('Subtitles:Characters', charactersLoaded);
+
-
}
+
-
function removeSubtitles()
+
-
{
+
-
if (subtitleholder)
+
-
subtitleholder.parentNode.removeChild(subtitleholder);
+
-
subtitleholder = false;
+
-
if (settings.resize)
+
-
doResize();
+
-
}
+
-
function reloadSubtitles()
+
-
{
+
-
savesettings(false);
+
-
+
-
if (!subtitleholder)
+
-
{
+
-
subtitleholder = document.createElement('div');
+
-
subtitleholder.style.color = "white";
+
-
subtitleholder.style.font = "20px/25px sans-serif";
+
-
subtitleholder.style.backgroundColor = "black";
+
-
subtitleholder.style.height = "100px";
+
-
//subtitleholder.style.marginTop = "10px";
+
-
subtitleholder.style.textAlign = "center";
+
-
where = flashmovie;
+
-
while(where.parentNode.tagName.toLowerCase() == "object")
+
-
where = where.parentNode;
+
-
where.parentNode.insertBefore(subtitleholder, where.nextSibling);
+
-
subtitleholder.appendChild(currentsubtitles = nosubtitles);
+
-
}
+
-
if (transcriptErrors)
+
-
{
+
-
transcriptErrors.parentNode.removeChild(transcriptErrors);
+
-
transcriptErrors = false;
+
-
}
+
-
transcript = [];
+
-
if (subtitleLoop)
+
-
clearInterval(subtitleLoop);
+
-
subtitleLoop = false;
+
-
+
-
xmldownloaded({'responseText': settings.testsubsdata}, transcriptLoaded, false, true);
+
-
}
+
-
 
+
-
function charactersLoaded(doc)
+
-
{
+
-
var speakers = doc.getElementsByTagName("speaker");
+
-
for (var i = 0; i < speakers.length; i++)
+
-
{
+
-
var speakername = speakers[i].getAttribute("id");
+
-
characters[speakername] = {"color": speakers[i].getAttribute("color"), "sfx": speakers[i].hasAttribute("sfx"), "name": {"en": ""}};
+
-
var names = speakers[i].getElementsByTagName("name");
+
-
for (var j = 0; j < names.length; j++)
+
-
{
+
-
var lang = names[j].getAttribute("xml:lang");
+
-
if (names[j].firstChild && (names[j].firstChild.nodeType == doc.TEXT_NODE || names[j].firstChild.nodeType == doc.CDATA_SECTION_NODE))
+
-
characters[speakername].name[lang] = names[j].firstChild.nodeValue;
+
-
}
+
-
}
+
-
if (!settings.testsubs)
+
-
downloadxmlfromwiki('Subtitles:' + filename + '/' + settings.language, transcriptLoaded);
+
-
else
+
-
xmldownloaded({'responseText': settings.testsubsdata}, transcriptLoaded, false, true);
+
-
}
+
-
 
+
-
function transcriptLoaded(doc)
+
-
{
+
-
// set some defaults
+
-
if (!doc.documentElement.getAttribute("xml:lang")) doc.documentElement.setAttribute("xml:lang", "en");
+
-
if (!doc.documentElement.getAttribute("dir"))      doc.documentElement.setAttribute("dir",      "ltr");
+
-
// inherit languages to all subnodes
+
-
inheritLanguages(doc.documentElement);
+
-
// now parse the lines into divs and get start and end frames
+
-
var lines = doc.getElementsByTagName("line");
+
-
var previousEnd = NaN;
+
-
for (var i = 0; i < lines.length; i++)
+
-
{
+
-
var line = new Object();
+
-
// ignore lines with missing start/end values
+
-
// so you can add all the lines and not worry about timing them until later
+
-
if (!lines[i].getAttribute("start") || !lines[i].getAttribute("end"))
+
-
continue;
+
-
line.start = parseInt(lines[i].getAttribute("start"), 10);
+
-
line.end = parseInt(lines[i].getAttribute("end"), 10);
+
-
if (settings.testsubs)
+
-
{
+
-
if (isNaN(line.start))
+
-
transcriptError("Start value \"" + lines[i].getAttribute("start") + "\" is not a number");
+
-
if (isNaN(line.end))
+
-
transcriptError("End value \"" + lines[i].getAttribute("end") + "\" is not a number");
+
-
if (line.end < line.start)
+
-
transcriptError("Line beginning frame " + line.start + " ends before it begins.");
+
-
if (line.start < previousEnd)
+
-
transcriptError("Line beginning frame " + line.start + " starts before the previous frame ends.");
+
-
previousEnd = line.end;
+
-
}
+
-
line.text = importNodes(lines[i]);
+
-
transcript.push(line);
+
-
}
+
-
+
-
+
-
if (settings.resize)
+
-
doResize();
+
-
+
-
subtitleLoop = setInterval(refreshSubtitles, 50);
+
-
}
+
-
function inheritLanguages(node)
+
-
{
+
-
for (var i = node.firstChild; i; i = i.nextSibling)
+
-
{
+
-
if (i.nodeType == i.ELEMENT_NODE)
+
-
{
+
-
if (!i.hasAttribute("xml:lang")) i.setAttribute("xml:lang", node.getAttribute("xml:lang"));
+
-
if (!i.hasAttribute("dir"))      i.setAttribute("dir",      node.getAttribute("dir"));
+
-
inheritLanguages(i);
+
-
}
+
-
}
+
-
}
+
-
// replacement for document.importNode() that actually works properly
+
-
// turning eg <span> into an HTML span element, rather than an unknown element
+
-
// that happens to be called "span".
+
-
function importNodes(node)
+
-
{
+
-
var name = node.nodeName.toLowerCase();
+
-
if (characters[name])
+
-
{
+
-
node.setAttribute("speaker", name);
+
-
name = "speaker";
+
-
}
+
-
if (name == "line" || name == "speaker")
+
-
{
+
-
// format the speaker appropriately as a div
+
-
var speaker = node.getAttribute("speaker");
+
-
if (!settings.captions && (speaker == "sfx" || node.hasAttribute("sfx")))
+
-
return document.createComment(""); // return nothing
+
-
newNode = document.createElement("div");
+
-
var char = characters[speaker];
+
-
if (!char)
+
-
{
+
-
if (settings.testsubs && speaker)
+
-
{
+
-
line = node;
+
-
while (line && line.nodeName != "line")
+
-
line = line.parentNode;
+
-
if (line)
+
-
transcriptError("Line beginning frame " + line.getAttribute("start") + " has an unrecognised speaker name \"" + speaker + '"');
+
-
}
+
-
char = {"color": "#FFF", "name": {"en": ""}};
+
-
}
+
-
if (settings.colours)
+
-
newNode.style.color = char.color;
+
-
if (node.hasAttribute("voiceover"))
+
-
newNode.className = "italic";
+
-
if (node.hasAttribute("volume"))
+
-
{
+
-
newNode.style.fontSize = (node.getAttribute("volume") * 100) + "%";
+
-
newNode.style.lineHeight = "1.25em";
+
-
}
+
-
newNode.lang = node.getAttribute("xml:lang");
+
-
newNode.dir = node.getAttribute("dir");
+
-
var hasSpeakerChildren = false;
+
-
for (var i = node.firstChild; i; i = i.nextSibling)
+
-
{
+
-
if (i.nodeType == i.ELEMENT_NODE)
+
-
{
+
-
newNode.appendChild(importNodes(i));
+
-
var a = i.nodeName.toLowerCase();
+
-
if (i == "line" || i == "speaker" || characters[i])
+
-
hasSpeakerChildren = true;
+
-
}
+
-
else if (i.nodeType == i.TEXT_NODE || i.nodeType == i.CDATA_SECTION_NODE)
+
-
newNode.appendChild(document.importNode(i, true));
+
-
}
+
-
if (!hasSpeakerChildren)
+
-
{
+
-
// this is a normal text node - do some extra text stuff
+
-
if (char.sfx || node.hasAttribute("sfx"))
+
-
{
+
-
newNode.insertBefore(document.createTextNode('('), newNode.firstChild);
+
-
newNode.appendChild(document.createTextNode(')'))
+
-
newNode.className = "italic";
+
-
}
+
-
if (settings.names == 2 || (node.hasAttribute("voiceover") && settings.names == 1))
+
-
{
+
-
// find the language with the longest prefix match
+
-
// fall back to "en" if none found
+
-
var bestmatch = "en";
+
-
var langbits = node.getAttribute("xml:lang").split("-");
+
-
for (i = langbits.length; i >= 1; i--)
+
-
{
+
-
var lang = langbits.slice(0, i).join("-");
+
-
if (char.name[lang])
+
-
{
+
-
bestmatch = lang;
+
-
break;
+
-
}
+
-
}
+
-
if (char.name[bestmatch] != '')
+
-
newNode.insertBefore(document.createTextNode(char.name[bestmatch] + ": "), newNode.firstChild);
+
-
}
+
-
}
+
-
return newNode;
+
-
}
+
-
else
+
-
{
+
-
// check element blacklist
+
-
if (name == "script" ||
+
-
    name == "style"  ||
+
-
    name == "object" ||
+
-
    name == "param"  ||
+
-
    name == "embed"  ||
+
-
    name == "a"      ||
+
-
    name == "img"    ||
+
-
    name == "applet" ||
+
-
    name == "map"    ||
+
-
    name == "frame"  ||
+
-
    name == "iframe" ||
+
-
    name == "meta"  ||
+
-
    name == "link"  ||
+
-
    name == "form"  ||
+
-
    name == "input")
+
-
{
+
-
if (settings.testsubs)
+
-
transcriptError("Blacklisted element \"" + name + "\" stripped.");
+
-
return document.createComment(""); // return nothing
+
-
}
+
-
var newNode = document.createElement(name);
+
-
// copy across attributes
+
-
for (var i = 0; i < node.attributes.length; i++)
+
-
{
+
-
name = node.attributes[i].nodeName.toLowerCase();
+
-
// check attribute blacklist
+
-
// javascript, and anything that might load stuff from offsite
+
-
if (name != "href" && name != "src" && name.substring(0, 2) != "on")
+
-
{
+
-
if (name == "style")
+
-
{
+
-
// regex taken from MediaWiki Sanitizer.php
+
-
if (!node.attributes[i].nodeValue.match(/(expression|tps*:\/\/|url\\s*\()/i))
+
-
newNode.setAttribute("style", node.attributes[i].nodeValue);
+
-
}
+
-
else if (name == "xml:lang")
+
-
{
+
-
newNode.lang = node.attributes[i].nodeValue;
+
-
}
+
-
else
+
-
newNode.setAttribute(node.attributes[i].nodeName, node.attributes[i].nodeValue);
+
-
}
+
-
else if (settings.testsubs)
+
-
transcriptError("Blacklisted attribute \"" + name + "\" stripped.");
+
-
}
+
-
// copy across children
+
-
for (var i = node.firstChild; i; i = i.nextSibling)
+
-
{
+
-
if (i.nodeType == i.ELEMENT_NODE)
+
-
newNode.appendChild(importNodes(i));
+
-
else if (i.nodeType == i.TEXT_NODE || i.nodeType == i.CDATA_SECTION_NODE)
+
-
newNode.appendChild(document.importNode(i, true));
+
-
}
+
-
return newNode;
+
-
}
+
-
document.createComment(""); // fallthrough
+
-
}
+
-
 
+
-
function setSubtitles(node)
+
-
{
+
-
if (!node)
+
-
node = nosubtitles;
+
-
if (currentsubtitles != node)
+
-
{
+
-
subtitleholder.replaceChild(node, subtitleholder.firstChild);
+
-
currentsubtitles = node;
+
-
}
+
-
}
+
-
function refreshSubtitles()
+
-
{
+
-
var frame = false;
+
-
if (!flashmovie)
+
-
return;
+
-
if (typeof(flashmovie.CurrentFrame) == "function")
+
-
frame = flashmovie.CurrentFrame();
+
-
if (typeof(frame) == "number" && frame >= 0)
+
-
{
+
-
// change from native 0-based to more friendly 1-based
+
-
frame++;
+
-
// binary search to find the right transcript line
+
-
var first = 0;
+
-
var last = transcript.length;
+
-
while(first < (last - 1))
+
-
{
+
-
var mid = (first + last) >> 1;
+
-
if (frame >= transcript[mid].start)
+
-
first = mid;
+
-
else
+
-
last = mid;
+
-
}
+
-
// should we actually show the line?
+
-
if(transcript[first].start <= frame && transcript[first].end >= frame)
+
-
setSubtitles(transcript[first].text);
+
-
else
+
-
setSubtitles(false);
+
-
}
+
-
}
+
-
function transcriptError(str)
+
-
{
+
-
if (!transcriptErrors)
+
-
{
+
-
transcriptErrors = document.createElement('div')
+
-
transcriptErrors.style.color = "red";
+
-
transcriptErrors.style.background = "black";
+
-
transcriptErrors.style.font = "12pt sans-serif";
+
-
transcriptErrors.style.textAlign = "left";
+
-
transcriptErrors.style.margin = "0.5em";
+
-
document.body.appendChild(transcriptErrors);
+
-
}
+
-
else
+
-
transcriptErrors.appendChild(document.createElement('br'));
+
-
transcriptErrors.appendChild(document.createTextNode(str));
+
-
}
+
-
 
+
-
function checkupdates()
+
-
{
+
-
var now = new Date().getTime();
+
-
var then = new Number(GM_getValue('lastchecktime', 0));
+
-
if (now - then > 86400000) // only check at most once per day
+
-
{
+
-
GM_xmlhttpRequest({
+
-
method: "GET",
+
-
url: "http://www.hrwiki.org/index.php/Special:Getversion/User:Phlip/Greasemonkey?cachedodge=" + Math.random(),
+
-
onload: function(r){GM_setValue('lastchecktime', ""+now);GM_setValue('lastcheckstring', r.responseText);return updatesstr_loaded(r.responseText);}
+
-
});
+
-
}
+
-
else
+
-
updatesstr_loaded(GM_getValue('lastcheckstring', ''));
+
-
}
+
-
function updatesstr_loaded(str)
+
-
{
+
-
var parts = str.split("@@");
+
-
for (var i = 0; i < parts.length; i++)
+
-
{
+
-
var matches = parts[i].match(/^(\d+)\.(\d+)\.(\d+)=(.*)$/);
+
-
if (!matches) continue;
+
-
if (matches[1] > currentversion[0] ||
+
-
    (matches[1] == currentversion[0] && matches[2] > currentversion[1]) ||
+
-
    (matches[1] == currentversion[0] && matches[2] == currentversion[1] && matches[3] > currentversion[2]))
+
-
{
+
-
var updatelink = document.createElement('a');
+
-
updatelink.href=matches[4];
+
-
updatelink.style.display = "block";
+
-
updatelink.style.position = 'fixed';
+
-
updatelink.style.left = '0px';
+
-
updatelink.style.top = '0px';
+
-
updatelink.style.border = 'none';
+
-
updatelink.style.zIndex = 1;
+
-
var updatelinkimage = document.createElement('img');
+
-
updatelinkimage.src = image_update;
+
-
var oldversionstr = currentversion[0] + "." + currentversion[1] + "." + currentversion[2];
+
-
var newversionstr = matches[1] + "." + matches[2] + "." + matches[3];
+
-
updatelinkimage.title = "Click here to update from script version " + oldversionstr + " to " + newversionstr;
+
-
updatelinkimage.style.display = "block";
+
-
updatelinkimage.style.border = 'none';
+
-
updatelink.appendChild(updatelinkimage);
+
-
document.body.appendChild(updatelink);
+
-
return;
+
-
}
+
-
}
+
-
}
+
-
//</pre>
+
-
 
+
-
<noinclude>
+
-
Templates that have <includeonly> in them can't be tested by clicking preview. I would avoid saving the page in the Template namespace. This is what this is for.
+
-
</noinclude>
+

Current revision as of 02:35, 2 December 2007

<includeonly></includeonly>

Personal tools