2013-03-23 21:28:20 -05:00
/ *
The MIT License ( MIT )
Copyright ( c ) 2013 Calvin Montgomery
2013-03-28 18:51:08 -05:00
2013-03-23 21:28:20 -05:00
Permission is hereby granted , free of charge , to any person obtaining a copy of this software and associated documentation files ( the "Software" ) , to deal in the Software without restriction , including without limitation the rights to use , copy , modify , merge , publish , distribute , sublicense , and / or sell copies of the Software , and to permit persons to whom the Software is furnished to do so , subject to the following conditions :
2013-03-28 18:51:08 -05:00
2013-03-23 21:28:20 -05:00
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software .
2013-03-28 18:51:08 -05:00
2013-03-23 21:28:20 -05:00
THE SOFTWARE IS PROVIDED "AS IS" , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY , FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE .
* /
2013-02-16 11:19:59 -06:00
2013-04-19 14:50:08 -05:00
// Format a userlist entry based on a person's rank
function formatUserlistItem ( div , data ) {
2013-04-03 17:56:03 -05:00
var name = div . children [ 1 ] ;
2013-04-10 19:51:30 -05:00
$ ( name ) . removeClass ( ) ;
2013-04-19 14:50:08 -05:00
$ ( name ) . css ( "font-style" , "" ) ;
$ ( name ) . addClass ( getNameColor ( data . rank ) ) ;
2013-02-15 23:02:42 -06:00
2013-05-12 16:15:39 -04:00
var profile ;
$ ( name ) . mouseenter ( function ( ev ) {
profile = $ ( "<div/>" )
. addClass ( "profile-box" )
. css ( "top" , ( ev . pageY + 5 ) + "px" )
. css ( "left" , ev . pageX + "px" )
. appendTo ( $ ( "body" ) ) ;
$ ( "<img/>" ) . addClass ( "profile-image" )
. attr ( "src" , "http://i.imgur.com/P8MIHkc.jpg" )
. appendTo ( profile ) ;
$ ( "<p/>" ) . text ( "I'm calzoneman, the developer of this site. Feel free to contact me with queries, comments, or praise about the site." ) . appendTo ( profile ) ;
} ) ;
$ ( name ) . mousemove ( function ( ev ) {
profile . css ( "top" , ( ev . pageY + 5 ) + "px" )
. css ( "left" , ev . pageX + "px" )
} ) ;
$ ( name ) . mouseleave ( function ( ) {
profile . remove ( ) ;
} ) ;
2013-02-15 23:02:42 -06:00
var flair = div . children [ 0 ] ;
2013-04-19 14:50:08 -05:00
flair . innerHTML = "" ;
2013-04-03 18:02:14 -05:00
// denote current leader with a star
2013-04-19 14:50:08 -05:00
if ( data . leader ) {
2013-04-03 18:02:14 -05:00
$ ( "<i/>" ) . addClass ( "icon-star-empty" ) . appendTo ( flair ) ;
2013-02-15 23:02:42 -06:00
}
2013-04-19 14:56:00 -05:00
if ( data . meta && data . meta . afk ) {
2013-04-19 14:50:08 -05:00
$ ( name ) . css ( "font-style" , "italic" ) ;
$ ( "<i/>" ) . addClass ( "icon-time" ) . appendTo ( flair ) ;
2013-02-15 23:02:42 -06:00
}
}
2013-04-17 13:29:52 -05:00
function getNameColor ( rank ) {
if ( rank >= Rank . Siteadmin )
return "userlist_siteadmin" ;
else if ( rank >= Rank . Owner )
return "userlist_owner" ;
else if ( rank >= Rank . Moderator )
return "userlist_op" ;
else if ( rank == Rank . Guest )
return "userlist_guest" ;
else
return "" ;
}
2013-02-15 23:02:42 -06:00
// Adds a dropdown with user actions (promote/demote/leader)
function addUserDropdown ( entry , name ) {
2013-04-16 17:23:35 -05:00
$ ( entry ) . find ( ".dropdown" ) . remove ( ) ;
$ ( entry ) . unbind ( ) ;
2013-03-24 12:23:48 -05:00
var div = $ ( "<div />" ) . addClass ( "dropdown" ) . appendTo ( entry ) ;
var ul = $ ( "<ul />" ) . addClass ( "dropdown-menu" ) . appendTo ( div ) ;
2013-02-15 23:02:42 -06:00
ul . attr ( "role" , "menu" ) ;
ul . attr ( "aria-labelledby" , "dropdownMenu" ) ;
2013-04-11 12:51:08 -05:00
var ignore = $ ( "<li />" ) . appendTo ( ul ) ;
var a = $ ( "<a />" ) . attr ( "tabindex" , "-1" ) . attr ( "href" , "javascript:void(0);" ) . appendTo ( ignore ) ;
if ( IGNORED . indexOf ( name ) != - 1 ) {
a . text ( "Unignore User" ) ;
}
else {
a . text ( "Ignore User" ) ;
}
2013-02-15 23:02:42 -06:00
a . click ( function ( ) {
2013-04-11 12:51:08 -05:00
if ( IGNORED . indexOf ( name ) != - 1 ) {
IGNORED . splice ( IGNORED . indexOf ( name ) , 1 ) ;
2013-04-16 17:23:35 -05:00
this . text ( "Ignore User" ) ;
2013-04-11 12:51:08 -05:00
}
else {
IGNORED . push ( name ) ;
2013-04-16 17:23:35 -05:00
this . text ( "Unignore User" ) ;
2013-04-11 12:51:08 -05:00
}
2013-04-16 17:23:35 -05:00
} . bind ( a ) ) ;
2013-02-15 23:02:42 -06:00
2013-04-11 12:51:08 -05:00
if ( RANK >= Rank . Moderator ) {
$ ( "<li />" ) . addClass ( "divider" ) . appendTo ( ul ) ;
var makeLeader = $ ( "<li />" ) . appendTo ( ul ) ;
var a = $ ( "<a />" ) . attr ( "tabindex" , "-1" ) . attr ( "href" , "javascript:void(0);" ) . appendTo ( makeLeader ) ;
a . text ( "Make Leader" ) ;
a . click ( function ( ) {
socket . emit ( "assignLeader" , {
name : name
} ) ;
2013-02-15 23:02:42 -06:00
} ) ;
2013-04-11 12:51:08 -05:00
var takeLeader = $ ( "<li />" ) . appendTo ( ul ) ;
var a = $ ( "<a />" ) . attr ( "tabindex" , "-1" ) . attr ( "href" , "javascript:void(0);" ) . appendTo ( takeLeader ) ;
a . text ( "Take Leader" ) ;
a . click ( function ( ) {
socket . emit ( "assignLeader" , {
name : ""
} ) ;
2013-03-05 14:23:02 -06:00
} ) ;
2013-04-11 12:51:08 -05:00
var kick = $ ( "<li />" ) . appendTo ( ul ) ;
var a = $ ( "<a />" ) . attr ( "tabindex" , "-1" ) . attr ( "href" , "javascript:void(0);" ) . appendTo ( kick ) ;
a . text ( "Kick" ) ;
a . click ( function ( ) {
socket . emit ( "chatMsg" , {
msg : "/kick " + name
} ) ;
2013-03-23 22:01:37 -05:00
} ) ;
2013-04-11 12:51:08 -05:00
var ban = $ ( "<li />" ) . appendTo ( ul ) ;
var a = $ ( "<a />" ) . attr ( "tabindex" , "-1" ) . attr ( "href" , "javascript:void(0);" ) . appendTo ( ban ) ;
a . text ( "IP Ban" ) ;
a . click ( function ( ) {
socket . emit ( "chatMsg" , {
msg : "/ban " + name
} ) ;
} ) ;
2013-02-15 23:02:42 -06:00
2013-04-11 12:51:08 -05:00
$ ( "<li />" ) . addClass ( "divider" ) . appendTo ( ul ) ;
var promote = $ ( "<li />" ) . appendTo ( ul ) ;
var a = $ ( "<a />" ) . attr ( "tabindex" , "-1" ) . attr ( "href" , "javascript:void(0);" ) . appendTo ( promote ) ;
a . text ( "Promote" ) ;
a . click ( function ( ) {
socket . emit ( "promote" , {
name : name
} ) ;
2013-02-15 23:02:42 -06:00
} ) ;
2013-04-11 12:51:08 -05:00
var demote = $ ( "<li />" ) . appendTo ( ul ) ;
var a = $ ( "<a />" ) . attr ( "tabindex" , "-1" ) . attr ( "href" , "javascript:void(0);" ) . appendTo ( demote ) ;
a . text ( "Demote" ) ;
a . click ( function ( ) {
socket . emit ( "demote" , {
name : name
} ) ;
2013-02-15 23:02:42 -06:00
} ) ;
2013-04-11 12:51:08 -05:00
}
2013-02-15 23:02:42 -06:00
$ ( entry ) . click ( function ( ) {
if ( ul . css ( "display" ) == "none" ) {
2013-04-16 17:23:35 -05:00
// Hide others
$ ( "#userlist ul.dropdown-menu" ) . each ( function ( ) {
if ( this != ul ) {
$ ( this ) . css ( "display" , "none" ) ;
}
} ) ;
2013-02-15 23:02:42 -06:00
ul . css ( "display" , "block" ) ;
}
else {
ul . css ( "display" , "none" ) ;
}
} ) ;
2013-05-12 16:15:39 -04:00
2013-02-15 23:02:42 -06:00
return ul ;
}
2013-04-15 20:28:01 -05:00
function addChatMessage ( data ) {
if ( IGNORED . indexOf ( data . username ) != - 1 ) {
return ;
}
var div = formatChatMessage ( data ) ;
2013-05-11 15:12:51 -04:00
div . data ( "sender" , data . username ) ;
2013-04-15 20:28:01 -05:00
div . appendTo ( $ ( "#messagebuffer" ) ) ;
2013-05-11 15:12:51 -04:00
div . mouseover ( function ( ) {
$ ( "#messagebuffer" ) . children ( ) . each ( function ( ) {
var name = $ ( this ) . data ( "sender" ) ;
if ( name == data . username ) {
$ ( this ) . addClass ( "nick-hover" ) ;
}
} ) ;
} ) ;
div . mouseleave ( function ( ) {
$ ( "#messagebuffer" ) . children ( ) . each ( function ( ) {
$ ( this ) . removeClass ( "nick-hover" ) ;
} ) ;
} ) ;
2013-04-15 20:28:01 -05:00
// Cap chatbox at most recent 100 messages
if ( $ ( "#messagebuffer" ) . children ( ) . length > 100 ) {
$ ( $ ( "#messagebuffer" ) . children ( ) [ 0 ] ) . remove ( ) ;
}
if ( SCROLLCHAT )
$ ( "#messagebuffer" ) . scrollTop ( $ ( "#messagebuffer" ) . prop ( "scrollHeight" ) ) ;
2013-05-02 10:25:39 -05:00
if ( USEROPTS . blink _title && ! FOCUSED && ! TITLE _BLINK ) {
TITLE _BLINK = setInterval ( function ( ) {
if ( document . title == "*Chat*" )
document . title = PAGETITLE ;
else
document . title = "*Chat*" ;
} , 1000 ) ;
}
2013-04-06 20:56:47 -05:00
if ( uname ) {
if ( data . msg . toUpperCase ( ) . indexOf ( uname . toUpperCase ( ) ) != - 1 ) {
div . addClass ( "nick-highlight" ) ;
2013-05-01 13:39:01 -05:00
if ( ! FOCUSED && ! TITLE _BLINK ) {
2013-04-06 20:56:47 -05:00
TITLE _BLINK = setInterval ( function ( ) {
if ( document . title == "*Chat*" )
document . title = PAGETITLE ;
else
document . title = "*Chat*" ;
} , 1000 ) ;
}
2013-03-30 00:49:41 -05:00
}
}
2013-05-02 10:25:39 -05:00
}
function formatChatMessage ( data ) {
2013-05-09 17:59:02 -04:00
var skip = data . username == LASTCHATNAME ;
if ( data . msgclass == "drink" || data . msgclass == "shout" ) {
skip = false ;
}
LASTCHATNAME = data . username ;
LASTCHATTIME = data . time ;
2013-05-02 10:25:39 -05:00
var div = $ ( "<div/>" ) ;
2013-05-09 21:12:01 -04:00
if ( USEROPTS . show _timestamps ) {
2013-05-01 16:03:03 -05:00
var time = $ ( "<span/>" ) . addClass ( "timestamp" ) . appendTo ( div ) ;
var timestamp = new Date ( data . time ) . toTimeString ( ) . split ( " " ) [ 0 ] ;
time . text ( "[" + timestamp + "] " ) ;
}
2013-05-09 17:59:02 -04:00
var name = $ ( "<span/>" ) ;
if ( ! skip ) {
name . appendTo ( div ) ;
}
2013-05-11 15:12:51 -04:00
$ ( "<strong/>" ) . addClass ( "username" ) . text ( data . username + ": " ) . appendTo ( name ) ;
2013-04-17 13:29:52 -05:00
var message = $ ( "<span/>" ) . appendTo ( div ) ;
message [ 0 ] . innerHTML = data . msg ;
2013-04-28 13:04:15 -05:00
if ( data . modflair ) {
name . addClass ( getNameColor ( data . modflair ) ) ;
}
2013-03-05 14:07:21 -06:00
if ( data . msgclass == "action" ) {
2013-04-17 13:29:52 -05:00
name . remove ( ) ;
message . addClass ( "action" ) ;
2013-04-04 17:54:05 -05:00
message [ 0 ] . innerHTML = data . username + " " + data . msg ;
2013-03-05 14:07:21 -06:00
}
2013-04-17 23:24:37 -05:00
else if ( data . msgclass == "drink" ) {
2013-04-04 14:56:43 -05:00
div . addClass ( "drink" ) ;
}
2013-04-17 23:24:37 -05:00
else if ( data . msgclass == "shout" ) {
2013-04-17 13:29:52 -05:00
message . addClass ( "shout" ) ;
name . addClass ( "shout" ) ;
}
2013-04-17 23:24:37 -05:00
else {
message . addClass ( data . msgclass ) ;
}
2013-03-05 14:07:21 -06:00
return div ;
}
2013-02-15 23:02:42 -06:00
// Creates and formats a queue entry
function makeQueueEntry ( video ) {
2013-03-24 12:23:48 -05:00
var li = $ ( "<li />" ) ;
2013-02-15 23:02:42 -06:00
li . attr ( "class" , "well" ) ;
2013-04-04 11:39:43 -05:00
if ( video . thumb ) {
$ ( "<img/>" ) . attr ( "src" , video . thumb . url )
. css ( "float" , "left" )
. css ( "clear" , "both" )
. appendTo ( li ) ;
}
2013-05-12 11:41:14 -04:00
var title = $ ( "<a/>" ) . addClass ( "qe_title" ) . appendTo ( li )
. text ( video . title )
. attr ( "href" , idToURL ( video ) )
. attr ( "target" , "_blank" ) ;
2013-04-04 11:39:43 -05:00
var time = $ ( "<span />" ) . addClass ( "qe_time" ) . appendTo ( li ) ;
2013-02-15 23:02:42 -06:00
time . text ( video . duration ) ;
2013-04-04 11:39:43 -05:00
var clear = $ ( "<div />" ) . addClass ( "qe_clear" ) . appendTo ( li ) ;
2013-05-04 17:54:28 -05:00
if ( video . temp ) {
li . addClass ( "alert alert-error" ) ;
}
2013-02-15 23:02:42 -06:00
return li ;
}
// Add buttons to a queue list entry
function addQueueButtons ( li ) {
2013-04-11 12:51:08 -05:00
if ( RANK < Rank . Moderator && ! LEADER ) {
if ( ! CHANNELOPTS . qopen _allow _delete
&& ! CHANNELOPTS . qopen _allow _move
&& ! CHANNELOPTS . qopen _allow _qnext ) {
2013-02-15 23:02:42 -06:00
2013-04-11 12:51:08 -05:00
return ;
}
}
var fullperms = LEADER || RANK >= Rank . Moderator ;
2013-03-28 18:51:08 -05:00
2013-04-11 12:51:08 -05:00
var btnstrip = $ ( "<div />" ) . attr ( "class" , "btn-group qe_buttons" ) . prependTo ( li ) ;
2013-02-15 23:02:42 -06:00
2013-04-11 12:51:08 -05:00
if ( CHANNELOPTS . qopen _allow _move || fullperms ) {
var btnMove = $ ( "<button />" ) . addClass ( "btn qe_btn" ) . appendTo ( btnstrip ) ;
$ ( "<i />" ) . addClass ( "icon-resize-vertical" ) . appendTo ( btnMove ) ;
// Callback time
btnMove . mousedown ( function ( ) {
GRABBEDLI = li ;
OLDINDEX = $ ( "#queue" ) . children ( ) . index ( li ) ;
} ) ;
2013-02-15 23:02:42 -06:00
2013-04-11 12:51:08 -05:00
btnMove . mousemove ( function ( ) {
if ( GRABBEDLI != null ) {
var idx = $ ( "#queue" ) . children ( ) . index ( li ) ;
var lidx = $ ( "#queue" ) . children ( ) . index ( GRABBEDLI ) ;
if ( idx != lidx )
moveVideo ( lidx , idx , true ) ;
}
} ) ;
}
2013-02-15 23:02:42 -06:00
2013-04-11 12:51:08 -05:00
if ( CHANNELOPTS . qopen _allow _delete || fullperms ) {
var btnRemove = $ ( "<button />" ) . attr ( "class" , "btn btn-danger qe_btn" ) . appendTo ( btnstrip ) ;
$ ( "<i />" ) . attr ( "class" , "icon-remove" ) . appendTo ( btnRemove ) ;
$ ( btnRemove ) . click ( function ( ) {
btnstrip . remove ( ) ;
var idx = $ ( "#queue" ) . children ( ) . index ( li ) ;
socket . emit ( "unqueue" , { pos : idx } ) ;
} ) ;
}
2013-03-28 18:51:08 -05:00
2013-04-11 12:51:08 -05:00
if ( CHANNELOPTS . qopen _allow _playnext || fullperms ) {
var btnPlay = $ ( "<button />" ) . attr ( "class" , "btn btn-success qe_btn" ) . appendTo ( btnstrip ) ;
$ ( "<i />" ) . attr ( "class" , "icon-play" ) . appendTo ( btnPlay ) ;
$ ( btnPlay ) . click ( function ( ) {
var idx = $ ( "#queue" ) . children ( ) . index ( li ) ;
socket . emit ( "jumpTo" , {
pos : idx
} ) ;
} ) ;
}
2013-03-28 18:51:08 -05:00
2013-04-11 12:51:08 -05:00
if ( CHANNELOPTS . qopen _allow _qnext || fullperms ) {
var btnNext = $ ( "<button />" ) . attr ( "class" , "btn qe_btn" ) . appendTo ( btnstrip ) ;
2013-05-11 18:15:48 -04:00
$ ( "<i/>" ) . addClass ( "icon-share-alt" ) . appendTo ( btnNext ) ;
2013-04-11 12:51:08 -05:00
$ ( btnNext ) . click ( function ( ) {
2013-03-28 18:51:08 -05:00
var idx = $ ( "#queue" ) . children ( ) . index ( li ) ;
2013-04-11 12:51:08 -05:00
var dest = idx < POSITION ? POSITION : POSITION + 1 ;
socket . emit ( "moveMedia" , {
src : idx ,
dest : dest
} ) ;
} ) ;
}
2013-03-28 18:51:08 -05:00
2013-05-04 17:54:28 -05:00
if ( RANK >= Rank . Moderator ) {
var btnTemp = $ ( "<button />" ) . attr ( "class" , "btn qe_btn" ) . appendTo ( btnstrip ) ;
var temp = $ ( li ) . hasClass ( "alert-error" ) ;
2013-05-11 18:15:48 -04:00
$ ( "<i/>" ) . addClass ( "icon-flag" ) . appendTo ( btnTemp ) ;
2013-05-04 17:54:28 -05:00
if ( temp ) {
2013-05-11 18:15:48 -04:00
btnTemp . addClass ( "btn-success" ) ;
2013-05-04 17:54:28 -05:00
}
else {
2013-05-11 18:15:48 -04:00
btnTemp . addClass ( "btn-danger" ) ;
2013-05-04 17:54:28 -05:00
}
$ ( btnTemp ) . click ( function ( ) {
temp = $ ( li ) . hasClass ( "alert-error" ) ;
var idx = $ ( "#queue" ) . children ( ) . index ( li ) ;
socket . emit ( "setTemp" , {
idx : idx ,
temp : ! temp
} ) ;
} ) ;
}
2013-03-29 15:05:08 -05:00
$ ( document ) . mouseup ( function ( ) {
2013-03-28 18:51:08 -05:00
if ( GRABBEDLI != null ) {
var idx = $ ( "#queue" ) . children ( ) . index ( GRABBEDLI ) ;
GRABBEDLI = null ;
moveVideo ( idx , OLDINDEX , true ) ;
socket . emit ( "moveMedia" , {
src : OLDINDEX ,
dest : idx
} ) ;
}
} ) ;
2013-03-22 15:04:04 -05:00
}
function rebuildPlaylist ( ) {
2013-03-24 12:23:48 -05:00
$ ( "#queue li" ) . each ( function ( ) {
$ ( this ) . find ( ".btn-group" ) . remove ( ) ;
2013-03-22 15:04:04 -05:00
if ( RANK >= Rank . Moderator || LEADER || OPENQUEUE )
addQueueButtons ( this ) ;
} ) ;
2013-02-15 23:02:42 -06:00
}
// Add buttons to a list entry for the library search results
2013-04-04 15:55:43 -05:00
function addLibraryButtons ( li , id , yt ) {
2013-03-24 12:23:48 -05:00
var btnstrip = $ ( "<div />" ) . attr ( "class" , "btn-group qe_buttons" ) . prependTo ( li ) ;
2013-02-15 23:02:42 -06:00
2013-04-27 11:48:36 -05:00
if ( RANK >= Rank . Moderator || LEADER || ( OPENQUEUE && CHANNELOPTS . qopen _allow _qnext ) ) {
var btnNext = $ ( "<button />" ) . addClass ( "btn qe_btn" )
. text ( "Next" )
. appendTo ( btnstrip ) ;
btnNext . click ( function ( ) {
if ( yt ) {
socket . emit ( "queue" , {
id : id ,
pos : "next" ,
type : "yt"
} ) ;
}
else {
socket . emit ( "queue" , {
id : id ,
pos : "next"
} ) ;
}
} ) ;
}
2013-02-15 23:02:42 -06:00
2013-04-27 11:48:36 -05:00
var btnEnd = $ ( "<button />" ) . addClass ( "btn qe_btn" ) . text ( "End" ) . appendTo ( btnstrip ) ;
2013-02-15 23:02:42 -06:00
2013-04-27 11:48:36 -05:00
if ( RANK >= Rank . Moderator ) {
var btnDelete = $ ( "<button/>" ) . addClass ( "btn qe_btn btn-danger" ) . appendTo ( btnstrip ) ;
$ ( "<i/>" ) . addClass ( "icon-remove" ) . appendTo ( btnDelete ) ;
btnDelete . click ( function ( ) {
socket . emit ( "uncache" , {
id : id
2013-04-04 15:55:43 -05:00
} ) ;
2013-04-27 11:48:36 -05:00
$ ( li ) . hide ( "blind" , function ( ) {
$ ( li ) . remove ( ) ;
2013-04-04 15:55:43 -05:00
} ) ;
2013-04-27 11:48:36 -05:00
} ) ;
}
2013-02-15 23:02:42 -06:00
2013-04-27 11:48:36 -05:00
btnEnd . click ( function ( ) {
2013-04-04 15:55:43 -05:00
if ( yt ) {
socket . emit ( "queue" , {
id : id ,
pos : "end" ,
type : "yt"
} ) ;
}
else {
socket . emit ( "queue" , {
id : id ,
pos : "end"
} ) ;
}
2013-02-15 23:02:42 -06:00
} ) ;
2013-04-27 11:48:36 -05:00
2013-02-15 23:02:42 -06:00
}
// Rearranges the queue
2013-03-28 18:51:08 -05:00
function moveVideo ( src , dest , noanim ) {
2013-04-03 17:56:03 -05:00
var li = $ ( $ ( "#queue" ) . children ( ) [ src ] ) ;
2013-03-24 12:23:48 -05:00
var ul = $ ( "#queue" ) [ 0 ] ;
2013-03-28 18:51:08 -05:00
if ( noanim ) {
2013-04-03 17:56:03 -05:00
li . detach ( ) ;
2013-03-28 18:51:08 -05:00
if ( dest == ul . children . length ) {
2013-04-03 17:56:03 -05:00
li . appendTo ( ul ) ;
2013-03-28 18:51:08 -05:00
}
else {
2013-04-03 17:56:03 -05:00
li . insertBefore ( ul . getElementsByTagName ( "li" ) [ dest ] ) ;
2013-03-28 18:51:08 -05:00
}
}
2013-03-29 15:05:08 -05:00
else {
2013-04-03 17:56:03 -05:00
li . hide ( "blind" , function ( ) {
li . detach ( ) ;
2013-03-29 15:05:08 -05:00
if ( dest == ul . children . length ) {
2013-04-03 17:56:03 -05:00
li . appendTo ( ul ) ;
2013-03-29 15:05:08 -05:00
}
else {
2013-04-03 17:56:03 -05:00
li . insertBefore ( ul . getElementsByTagName ( "li" ) [ dest ] ) ;
2013-03-29 15:05:08 -05:00
}
$ ( li ) . show ( "blind" ) ;
} ) ;
}
if ( src < POSITION && dest >= POSITION )
2013-02-15 23:02:42 -06:00
POSITION -- ;
if ( src > POSITION && dest < POSITION )
POSITION ++ ;
}
function parseVideoURL ( url ) {
2013-04-03 11:39:51 -05:00
url = url . trim ( )
2013-02-15 23:02:42 -06:00
if ( typeof ( url ) != "string" )
return null ;
2013-04-28 17:06:58 -05:00
if ( url . indexOf ( "jw:" ) == 0 ) {
url = url . substring ( 3 ) ;
return [ url , "jw" ] ;
}
2013-04-07 14:38:50 -05:00
if ( url . indexOf ( "rtmp://" ) == 0 ) {
return [ url , "rt" ] ;
}
else if ( url . indexOf ( "youtu.be" ) != - 1 || url . indexOf ( "youtube.com" ) != - 1 ) {
2013-03-25 14:39:03 -05:00
if ( url . indexOf ( "playlist" ) != - 1 ) {
return [ parseYTPlaylist ( url ) , "yp" ] ;
}
2013-02-15 23:02:42 -06:00
return [ parseYTURL ( url ) , "yt" ] ;
2013-03-25 14:39:03 -05:00
}
2013-03-23 13:17:39 -05:00
else if ( url . indexOf ( "twitch.tv" ) != - 1 )
2013-02-15 23:02:42 -06:00
return [ parseTwitch ( url ) , "tw" ] ;
2013-03-23 13:17:39 -05:00
else if ( url . indexOf ( "livestream.com" ) != - 1 )
2013-03-16 17:17:36 -05:00
return [ parseLivestream ( url ) , "li" ] ;
2013-03-23 13:17:39 -05:00
else if ( url . indexOf ( "soundcloud.com" ) != - 1 )
2013-02-15 23:02:42 -06:00
return [ url , "sc" ] ;
2013-03-23 13:17:39 -05:00
else if ( url . indexOf ( "vimeo.com" ) != - 1 )
2013-02-15 23:02:42 -06:00
return [ parseVimeo ( url ) , "vi" ] ;
2013-03-23 13:17:39 -05:00
else if ( url . indexOf ( "dailymotion.com" ) != - 1 )
return [ parseDailymotion ( url ) , "dm" ] ;
2013-02-15 23:02:42 -06:00
}
function parseYTURL ( url ) {
2013-04-03 11:39:51 -05:00
var m = url . match ( /v=([^&#]+)/ ) ;
2013-02-15 23:02:42 -06:00
if ( m ) {
return m [ 1 ] ;
}
2013-04-03 11:39:51 -05:00
var m = url . match ( /youtu\.be\/([^&#]+)/ ) ;
2013-02-15 23:02:42 -06:00
if ( m ) {
return m [ 1 ] ;
}
2013-04-03 11:39:51 -05:00
var m = url . match ( /([^&#]*)/ ) ;
2013-02-15 23:02:42 -06:00
if ( m ) {
return m [ 1 ] ;
}
return null ;
}
2013-03-25 14:39:03 -05:00
function parseYTPlaylist ( url ) {
var m = url . match ( /youtube\.com\/playlist\?list=([^&]+)/ ) ;
if ( m ) {
return m [ 1 ] ;
}
return null ;
}
2013-02-15 23:02:42 -06:00
function parseTwitch ( url ) {
2013-03-25 14:39:03 -05:00
var m = url . match ( /twitch\.tv\/([a-zA-Z0-9]+)/ ) ;
2013-02-15 23:02:42 -06:00
if ( m ) {
return m [ 1 ] ;
}
return null ;
}
2013-03-16 17:17:36 -05:00
function parseLivestream ( url ) {
2013-03-25 14:39:03 -05:00
var m = url . match ( /livestream\.com\/([a-zA-Z0-9]+)/ ) ;
2013-03-16 17:17:36 -05:00
if ( m ) {
return m [ 1 ] ;
}
return null ;
}
2013-02-15 23:02:42 -06:00
function parseVimeo ( url ) {
var m = url . match ( /vimeo\.com\/([0-9]+)/ ) ;
if ( m ) {
return m [ 1 ] ;
}
return null ;
}
2013-03-23 13:17:39 -05:00
function parseDailymotion ( url ) {
var m = url . match ( /dailymotion\.com\/video\/([a-zA-Z0-9_-]+)/ ) ;
if ( m ) {
return m [ 1 ] ;
}
return null ;
}
2013-03-16 16:49:58 -05:00
function closePoll ( ) {
2013-03-24 12:23:48 -05:00
if ( $ ( "#pollcontainer .active" ) . length != 0 ) {
var poll = $ ( "#pollcontainer .active" ) ;
2013-03-16 16:49:58 -05:00
poll . removeClass ( "active" ) . addClass ( "muted" ) ;
2013-03-24 12:23:48 -05:00
poll . find ( ".option button" ) . each ( function ( ) {
$ ( this ) . attr ( "disabled" , "disabled" ) ;
2013-03-16 16:49:58 -05:00
} ) ;
2013-03-24 12:23:48 -05:00
poll . find ( ".btn-danger" ) . each ( function ( ) {
2013-03-16 16:49:58 -05:00
$ ( this ) . remove ( )
} ) ;
}
}
2013-03-25 13:54:18 -05:00
function handleRankChange ( ) {
rebuildPlaylist ( ) ;
if ( RANK >= Rank . Moderator || LEADER ) {
$ ( "#playlist_controls" ) . css ( "display" , "block" ) ;
$ ( "#playlist_controls button" ) . each ( function ( ) {
$ ( this ) . attr ( "disabled" , false ) ;
} ) ;
2013-04-16 10:43:53 -05:00
$ ( "#pollcontainer .active" ) . each ( function ( ) {
var btns = $ ( this ) . find ( ".btn-danger" ) ;
if ( btns . length == 0 ) {
$ ( "<button/>" ) . addClass ( "btn btn-danger pull-right" )
. text ( "End Poll" )
. insertAfter ( $ ( this ) . find ( ".close" ) )
. click ( function ( ) {
socket . emit ( "closePoll" )
} ) ;
}
} ) ;
2013-03-25 13:54:18 -05:00
}
if ( RANK >= Rank . Moderator ) {
$ ( "#qlockbtn" ) . css ( "display" , "block" ) ;
var users = $ ( "#userlist" ) . children ( ) ;
for ( var i = 0 ; i < users . length ; i ++ ) {
addUserDropdown ( users [ i ] , users [ i ] . children [ 1 ] . innerHTML ) ;
}
2013-04-27 12:55:17 -05:00
$ ( "#getplaylist" ) . css ( "width" , "34%" ) ;
$ ( "#clearplaylist" ) . css ( "display" , "" ) ;
$ ( "#shuffleplaylist" ) . css ( "display" , "" ) ;
2013-03-25 13:54:18 -05:00
$ ( "#modnav" ) . show ( ) ;
$ ( "#chancontrols" ) . show ( ) ;
2013-04-29 11:26:01 -05:00
var val = false ;
if ( RANK < Rank . Owner ) {
val = "disabled" ;
}
$ ( "#opt_pagetitle" ) . attr ( "disabled" , val ) ;
$ ( "#opt_customcss" ) . attr ( "disabled" , val ) ;
$ ( "#opt_customjs" ) . attr ( "disabled" , val ) ;
2013-05-01 17:49:34 -05:00
$ ( "#opt_show_public" ) . attr ( "disabled" , val ) ;
2013-04-29 11:26:01 -05:00
$ ( "#show_filtereditor" ) . attr ( "disabled" , val ) ;
$ ( "#show_acl" ) . attr ( "disabled" , val ) ;
2013-03-25 13:54:18 -05:00
}
2013-04-03 17:56:03 -05:00
else if ( ! LEADER ) {
2013-03-25 13:54:18 -05:00
if ( OPENQUEUE ) {
2013-04-03 17:56:03 -05:00
if ( CHANNELOPTS . qopen _allow _qnext )
2013-03-25 13:54:18 -05:00
$ ( "#queue_next" ) . attr ( "disabled" , false ) ;
else
$ ( "#queue_next" ) . attr ( "disabled" , true ) ;
2013-04-03 17:56:03 -05:00
if ( CHANNELOPTS . qopen _allow _playnext )
2013-03-25 13:54:18 -05:00
$ ( "#play_next" ) . attr ( "disabled" , false ) ;
else
$ ( "#play_next" ) . attr ( "disabled" , true ) ;
}
else {
$ ( "#playlist_controls" ) . css ( "display" , "none" ) ;
}
2013-04-16 10:43:53 -05:00
$ ( "#pollcontainer .active" ) . each ( function ( ) {
$ ( this ) . find ( ".btn-danger" ) . remove ( ) ;
} ) ;
2013-03-25 13:54:18 -05:00
}
2013-04-27 12:55:17 -05:00
if ( RANK < Rank . Moderator ) {
$ ( "#getplaylist" ) . css ( "width" , "100%" ) ;
$ ( "#clearplaylist" ) . css ( "display" , "none" ) ;
$ ( "#shuffleplaylist" ) . css ( "display" , "none" ) ;
}
2013-03-25 13:54:18 -05:00
}
2013-03-30 00:49:41 -05:00
function onWindowFocus ( ) {
clearInterval ( TITLE _BLINK ) ;
2013-05-01 13:39:01 -05:00
TITLE _BLINK = false ;
2013-03-30 00:49:41 -05:00
document . title = PAGETITLE ;
}
2013-04-15 20:28:01 -05:00
2013-04-18 11:42:07 -05:00
function newPollMenu ( ) {
2013-05-10 18:06:58 -04:00
$ ( "#ytapiplayer" ) . hide ( ) ;
2013-04-18 11:42:07 -05:00
var modal = $ ( "<div/>" ) . addClass ( "modal hide fade" )
. appendTo ( $ ( "body" ) ) ;
var head = $ ( "<div/>" ) . addClass ( "modal-header" )
. appendTo ( modal ) ;
$ ( "<button/>" ) . addClass ( "close" )
. attr ( "data-dismiss" , "modal" )
. attr ( "aria-hidden" , "true" )
. appendTo ( head ) [ 0 ] . innerHTML = "×" ;
$ ( "<h3/>" ) . text ( "New Poll" ) . appendTo ( head ) ;
var body = $ ( "<div/>" ) . addClass ( "modal-body" ) . appendTo ( modal ) ;
var form = $ ( "<form/>" ) . addClass ( "form-horizontal" )
. appendTo ( body ) ;
var tgroup = $ ( "<div/>" ) . addClass ( "control-group" ) . appendTo ( form ) ;
$ ( "<label/>" ) . text ( "Title" )
. addClass ( "control-label" )
. attr ( "for" , "polltitle" )
. appendTo ( tgroup ) ;
$ ( "<input/>" ) . attr ( "type" , "text" )
. attr ( "id" , "polltitle" )
. appendTo ( $ ( "<div/>" ) . addClass ( "controls" ) . appendTo ( tgroup ) )
function addPollOption ( ) {
var g = $ ( "<div/>" ) . addClass ( "control-group" ) . appendTo ( form ) ;
var c = $ ( "<div/>" ) . addClass ( "controls" ) . appendTo ( g ) ;
$ ( "<input/>" ) . attr ( "type" , "text" )
. appendTo ( c ) ;
}
addPollOption ( ) ;
var footer = $ ( "<div/>" ) . addClass ( "modal-footer" ) . appendTo ( modal ) ;
$ ( "<button/>" ) . addClass ( "btn pull-left" )
. text ( "Add Poll Option" )
. appendTo ( footer )
. click ( addPollOption ) ;
var submit = function ( ) {
var all = form . find ( "input[type=\"text\"]" ) ;
var title = $ ( all [ 0 ] ) . val ( ) ;
var opts = new Array ( all . length - 1 ) ;
for ( var i = 1 ; i < all . length ; i ++ ) {
opts [ i - 1 ] = $ ( all [ i ] ) . val ( ) ;
}
socket . emit ( "newPoll" , {
title : title ,
opts : opts
} ) ;
}
$ ( "<button/>" ) . addClass ( "btn btn-primary" )
. attr ( "data-dismiss" , "modal" )
. attr ( "aria-hidden" , "true" )
. text ( "Open Poll" )
. appendTo ( footer )
. click ( submit ) ;
modal . on ( "hidden" , function ( ) {
2013-05-10 18:06:58 -04:00
$ ( "#ytapiplayer" ) . show ( ) ;
2013-04-18 11:42:07 -05:00
modal . remove ( ) ;
} ) ;
modal . modal ( ) ;
}
2013-04-25 22:50:12 -05:00
function showLoginFrame ( ) {
2013-04-26 12:28:02 -05:00
$ ( "#ytapiplayer" ) . hide ( ) ;
2013-04-25 22:50:12 -05:00
var modal = $ ( "<div/>" ) . addClass ( "modal hide fade" )
. appendTo ( $ ( "body" ) ) ;
var head = $ ( "<div/>" ) . addClass ( "modal-header" )
. appendTo ( modal ) ;
$ ( "<button/>" ) . addClass ( "close" )
. attr ( "data-dismiss" , "modal" )
. attr ( "aria-hidden" , "true" )
. appendTo ( head ) [ 0 ] . innerHTML = "×" ;
$ ( "<h3/>" ) . text ( "Login" ) . appendTo ( head ) ;
var body = $ ( "<div/>" ) . addClass ( "modal-body" ) . appendTo ( modal ) ;
var frame = $ ( "<iframe/>" )
. attr ( "id" , "loginframe" )
. attr ( "src" , "login.html" )
. css ( "border" , "none" )
. css ( "width" , "100%" )
. css ( "height" , "300px" )
. css ( "margin" , "0" )
. appendTo ( body ) ;
2013-04-25 23:04:51 -05:00
var timer = setInterval ( function ( ) {
frame [ 0 ] . contentWindow . postMessage ( "cytube-syn" , document . location ) ;
} , 1000 ) ;
2013-04-25 22:50:12 -05:00
var respond = function ( e ) {
2013-04-25 23:04:51 -05:00
if ( e . data == "cytube-ack" ) {
clearInterval ( timer ) ;
}
2013-04-25 22:50:12 -05:00
if ( e . data . indexOf ( ":" ) == - 1 ) {
return ;
}
if ( e . data . substring ( 0 , e . data . indexOf ( ":" ) ) == "cytube-login" ) {
var data = e . data . substring ( e . data . indexOf ( ":" ) + 1 ) ;
data = JSON . parse ( data ) ;
if ( data . error ) {
2013-05-01 13:02:06 -05:00
// Since this is the login page, invalid session implies bad credentials
if ( data . error == "Invalid session" ) {
alert ( "Invalid username/password" ) ;
}
else {
alert ( data . error ) ;
}
2013-04-25 22:50:12 -05:00
}
else if ( data . success ) {
2013-04-25 23:04:51 -05:00
session = data . session || "" ;
uname = data . uname || "" ;
2013-04-25 22:50:12 -05:00
socket . emit ( "login" , {
name : uname ,
session : session
} ) ;
if ( window . removeEventListener ) {
window . removeEventListener ( "message" , respond , false ) ;
}
else if ( window . detachEvent ) {
// If an IE dev ever reads this, please tell your company
// to get their shit together
window . detachEvent ( "onmessage" , respond ) ;
}
modal . modal ( "hide" ) ;
}
}
2013-05-04 13:01:04 -05:00
else if ( e . data . substring ( 0 , e . data . indexOf ( ":" ) ) == "cytube-changepass" ) {
var data = e . data . substring ( e . data . indexOf ( ":" ) + 1 ) ;
data = JSON . parse ( data ) ;
if ( data . error ) {
alert ( data . error ) ;
}
else if ( data . success ) {
alert ( "Password changed" ) ;
}
}
2013-04-25 22:50:12 -05:00
}
if ( window . addEventListener ) {
window . addEventListener ( "message" , respond , false ) ;
}
else if ( window . attachEvent ) {
// If an IE dev ever reads this, please tell your company to get
// their shit together
window . attachEvent ( "onmessage" , respond ) ;
}
var footer = $ ( "<div/>" ) . addClass ( "modal-footer" ) . appendTo ( modal ) ;
modal . on ( "hidden" , function ( ) {
2013-04-26 12:28:02 -05:00
$ ( "#ytapiplayer" ) . show ( ) ;
2013-04-25 22:50:12 -05:00
modal . remove ( ) ;
} ) ;
modal . modal ( ) ;
}
2013-04-28 12:57:08 -05:00
function showUserOpts ( ) {
$ ( "#ytapiplayer" ) . hide ( ) ;
var modal = $ ( "<div/>" ) . addClass ( "modal hide fade" )
. appendTo ( $ ( "body" ) ) ;
var head = $ ( "<div/>" ) . addClass ( "modal-header" )
. appendTo ( modal ) ;
$ ( "<button/>" ) . addClass ( "close" )
. attr ( "data-dismiss" , "modal" )
. attr ( "aria-hidden" , "true" )
. appendTo ( head ) [ 0 ] . innerHTML = "×" ;
$ ( "<h3/>" ) . text ( "User Options" ) . appendTo ( head ) ;
var body = $ ( "<div/>" ) . addClass ( "modal-body" ) . appendTo ( modal ) ;
var form = $ ( "<form/>" ) . addClass ( "form-horizontal" )
. appendTo ( body ) ;
function addOption ( lbl , thing ) {
var g = $ ( "<div/>" ) . addClass ( "control-group" ) . appendTo ( form ) ;
$ ( "<label/>" ) . addClass ( "control-label" ) . text ( lbl ) . appendTo ( g ) ;
var c = $ ( "<div/>" ) . addClass ( "controls" ) . appendTo ( g ) ;
thing . appendTo ( c ) ;
}
var themeselect = $ ( "<select/>" ) ;
$ ( "<option/>" ) . attr ( "value" , "default" ) . text ( "Default" ) . appendTo ( themeselect ) ;
$ ( "<option/>" ) . attr ( "value" , "assets/css/darkstrap.css" ) . text ( "Dark" ) . appendTo ( themeselect ) ;
themeselect . val ( USEROPTS . theme ) ;
addOption ( "Theme" , themeselect ) ;
var usercss = $ ( "<input/>" ) . attr ( "type" , "text" )
. attr ( "placeholder" , "Stylesheet URL" ) ;
usercss . val ( USEROPTS . css ) ;
addOption ( "User CSS" , usercss ) ;
var layoutselect = $ ( "<select/>" ) ;
$ ( "<option/>" ) . attr ( "value" , "default" ) . text ( "Default" )
. appendTo ( layoutselect ) ;
$ ( "<option/>" ) . attr ( "value" , "large" ) . text ( "Large" )
. appendTo ( layoutselect ) ;
$ ( "<option/>" ) . attr ( "value" , "huge" ) . text ( "Huge" )
. appendTo ( layoutselect ) ;
$ ( "<option/>" ) . attr ( "value" , "single" ) . text ( "Single Column" )
. appendTo ( layoutselect ) ;
2013-04-28 13:48:22 -05:00
$ ( "<option/>" ) . attr ( "value" , "synchtube" ) . text ( "Synchtube" )
. appendTo ( layoutselect ) ;
2013-04-28 12:57:08 -05:00
layoutselect . val ( USEROPTS . layout ) ;
addOption ( "Layout" , layoutselect ) ;
2013-04-28 13:48:22 -05:00
var warn = $ ( "<p/>" ) . addClass ( "text-error" )
. text ( "Changing layouts may require a refresh" )
addOption ( "" , warn ) ;
2013-05-12 16:15:39 -04:00
$ ( "<hr>" ) . appendTo ( form ) ;
2013-04-28 12:57:08 -05:00
var synchcontainer = $ ( "<label/>" ) . addClass ( "checkbox" )
. text ( "Synchronize Media" ) ;
var synch = $ ( "<input/>" ) . attr ( "type" , "checkbox" ) . appendTo ( synchcontainer ) ;
synch . prop ( "checked" , USEROPTS . synch ) ;
addOption ( "Synch" , synchcontainer ) ;
2013-05-10 16:31:04 -04:00
var syncacc = $ ( "<input/>" ) . attr ( "type" , "text" )
. attr ( "placeholder" , "Seconds" ) ;
syncacc . val ( USEROPTS . sync _accuracy ) ;
addOption ( "Synch Accuracy" , syncacc ) ;
2013-05-01 13:39:01 -05:00
var vidcontainer = $ ( "<label/>" ) . addClass ( "checkbox" )
. text ( "Hide Video" ) ;
var hidevid = $ ( "<input/>" ) . attr ( "type" , "checkbox" ) . appendTo ( vidcontainer ) ;
hidevid . prop ( "checked" , USEROPTS . hidevid ) ;
addOption ( "Hide Video" , vidcontainer ) ;
2013-05-12 16:15:39 -04:00
$ ( "<hr>" ) . appendTo ( form ) ;
2013-05-01 13:39:01 -05:00
2013-05-01 16:03:03 -05:00
var tscontainer = $ ( "<label/>" ) . addClass ( "checkbox" )
. text ( "Show timestamps in chat" ) ;
var showts = $ ( "<input/>" ) . attr ( "type" , "checkbox" ) . appendTo ( tscontainer ) ;
showts . prop ( "checked" , USEROPTS . show _timestamps ) ;
addOption ( "Show timestamps" , tscontainer ) ;
2013-05-02 10:25:39 -05:00
var blinkcontainer = $ ( "<label/>" ) . addClass ( "checkbox" )
. text ( "Flash title on every incoming message" ) ;
var blink = $ ( "<input/>" ) . attr ( "type" , "checkbox" ) . appendTo ( blinkcontainer ) ;
blink . prop ( "checked" , USEROPTS . blink _title ) ;
addOption ( "Chat Notice" , blinkcontainer ) ;
2013-05-12 16:15:39 -04:00
var profimg = $ ( "<input/>" ) . attr ( "type" , "text" )
profimg . val ( PROFILE . image ) ;
addOption ( "Profile Image" , profimg ) ;
var profbio = $ ( "<textarea/>" ) ;
profbio . attr ( "rows" , 5 ) ;
profbio . val ( PROFILE . bio ) ;
addOption ( "Profile Bio" , profbio ) ;
2013-04-28 12:57:08 -05:00
if ( RANK >= Rank . Moderator ) {
$ ( "<hr>" ) . appendTo ( form ) ;
var modhatcontainer = $ ( "<label/>" ) . addClass ( "checkbox" )
. text ( "Show name color" ) ;
var modhat = $ ( "<input/>" ) . attr ( "type" , "checkbox" ) . appendTo ( modhatcontainer ) ;
modhat . prop ( "checked" , USEROPTS . modhat ) ;
addOption ( "Modflair" , modhatcontainer ) ;
}
var footer = $ ( "<div/>" ) . addClass ( "modal-footer" ) . appendTo ( modal ) ;
var submit = $ ( "<button/>" ) . addClass ( "btn btn-primary pull-right" )
. text ( "Save" )
. appendTo ( footer ) ;
submit . click ( function ( ) {
2013-05-01 16:03:03 -05:00
USEROPTS . theme = themeselect . val ( ) ;
USEROPTS . css = usercss . val ( ) ;
USEROPTS . layout = layoutselect . val ( ) ;
USEROPTS . synch = synch . prop ( "checked" ) ;
2013-05-10 16:31:04 -04:00
USEROPTS . sync _accuracy = parseFloat ( syncacc . val ( ) ) || 2 ;
2013-05-01 16:03:03 -05:00
USEROPTS . hidevid = hidevid . prop ( "checked" ) ;
USEROPTS . show _timestamps = showts . prop ( "checked" ) ;
2013-05-02 10:25:39 -05:00
USEROPTS . blink _title = blink . prop ( "checked" ) ;
2013-04-28 12:57:08 -05:00
if ( RANK >= Rank . Moderator ) {
USEROPTS . modhat = modhat . prop ( "checked" ) ;
}
saveOpts ( ) ;
applyOpts ( ) ;
modal . modal ( "hide" ) ;
} ) ;
modal . on ( "hidden" , function ( ) {
$ ( "#ytapiplayer" ) . show ( ) ;
modal . remove ( ) ;
} ) ;
modal . modal ( ) ;
}
function saveOpts ( ) {
for ( var key in USEROPTS ) {
createCookie ( "cytube_" + key , USEROPTS [ key ] , 100 ) ;
}
}
function applyOpts ( ) {
$ ( "#usertheme" ) . remove ( ) ;
if ( USEROPTS . theme != "default" ) {
$ ( "<link/>" ) . attr ( "rel" , "stylesheet" )
. attr ( "type" , "text/css" )
. attr ( "id" , "usertheme" )
. attr ( "href" , USEROPTS . theme )
. appendTo ( $ ( "head" ) ) ;
}
$ ( "#usercss" ) . remove ( ) ;
if ( USEROPTS . css ) {
$ ( "<link/>" ) . attr ( "rel" , "stylesheet" )
. attr ( "type" , "text/css" )
2013-05-02 21:56:31 -05:00
. attr ( "id" , "usercss" )
2013-04-28 12:57:08 -05:00
. attr ( "href" , USEROPTS . css )
. appendTo ( $ ( "head" ) ) ;
}
switch ( USEROPTS . layout ) {
case "large" :
largeLayout ( ) ;
break ;
case "huge" :
hugeLayout ( ) ;
break ;
case "single" :
singleColumnLayout ( ) ;
break ;
2013-04-28 13:48:22 -05:00
case "synchtube" :
synchtubeLayout ( ) ;
break ;
2013-04-28 12:57:08 -05:00
default :
break ;
}
2013-05-01 13:39:01 -05:00
if ( USEROPTS . hidevid ) {
$ ( "#videodiv" ) . remove ( ) ;
}
2013-04-28 12:57:08 -05:00
}
2013-05-12 11:41:14 -04:00
2013-05-12 16:15:39 -04:00
function showProfileModal ( data ) {
$ ( "#ytapiplayer" ) . hide ( ) ;
var modal = $ ( "<div/>" ) . addClass ( "modal hide fade" )
. appendTo ( $ ( "body" ) ) ;
var head = $ ( "<div/>" ) . addClass ( "modal-header" )
. appendTo ( modal ) ;
$ ( "<button/>" ) . addClass ( "close" )
. attr ( "data-dismiss" , "modal" )
. attr ( "aria-hidden" , "true" )
. appendTo ( head ) [ 0 ] . innerHTML = "×" ;
$ ( "<h3/>" ) . text ( data . name ) . appendTo ( head ) ;
var body = $ ( "<div/>" ) . addClass ( "modal-body" ) . appendTo ( modal ) ;
$ ( "<img/>" ) . attr ( "src" , data . image )
. css ( "width" , "80px" )
. css ( "height" , "80px" )
. appendTo ( body )
$ ( "<p/>" ) . addClass ( "profile-text" ) . appendTo ( body ) . text ( data . text ) ;
//var footer = $("<div/>").addClass("modal-footer").appendTo(modal);
modal . on ( "hidden" , function ( ) {
$ ( "#ytapiplayer" ) . show ( ) ;
modal . remove ( ) ;
} ) ;
modal . modal ( ) ;
}
2013-05-12 11:41:14 -04:00
function idToURL ( data ) {
var entry = "" ;
switch ( data . type ) {
case "yt" :
entry = "http://youtube.com/watch?v=" + data . id ;
break ;
case "vi" :
entry = "http://vimeo.com/" + data . id ;
break ;
case "dm" :
entry = "http://dailymotion.com/video/" + data . id ;
break ;
case "sc" :
entry = data . id ;
break ;
case "li" :
entry = "http://livestream.com/" + data . id ;
break ;
case "tw" :
entry = "http://twitch.tv/" + data . id ;
break ;
case "rt" :
case "jw" :
entry = data . id ;
break ;
default :
break ;
}
return entry ;
}