2022-04-03 23:43:58 -07:00
// Copyright (c) 2022 Calder Young
var CHAR _WIDTHS = [ 1 , 9 , 9 , 8 , 8 , 8 , 8 , 7 , 9 , 8 , 9 , 9 , 8 , 9 , 9 , 9 , 8 , 8 , 8 , 8 , 9 , 9 , 8 , 9 , 8 , 8 , 8 , 8 , 8 , 9 , 9 , 9 , 4 , 2 , 5 , 6 , 6 , 6 , 6 , 3 , 5 , 5 , 5 , 6 , 2 , 6 , 2 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 2 , 2 , 5 , 6 , 5 , 6 , 7 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 4 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 4 , 6 , 4 , 6 , 6 , 3 , 6 , 6 , 6 , 6 , 6 , 5 , 6 , 6 , 2 , 6 , 5 , 3 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 4 , 6 , 6 , 6 , 6 , 6 , 6 , 5 , 2 , 5 , 7 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 4 , 6 , 3 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 4 , 6 , 6 , 3 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 7 , 6 , 6 , 6 , 2 , 6 , 6 , 8 , 9 , 9 , 6 , 6 , 6 , 8 , 8 , 6 , 8 , 8 , 8 , 8 , 8 , 6 , 6 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 6 , 9 , 9 , 9 , 5 , 9 , 9 , 8 , 7 , 7 , 8 , 7 , 8 , 8 , 8 , 7 , 8 , 8 , 7 , 9 , 9 , 6 , 7 , 7 , 7 ,
7 , 7 , 9 , 6 , 7 , 8 , 7 , 6 , 6 , 9 , 7 , 6 , 7 , 1 ] , CHAR _SHADOW _BRIGHTNESS = . 247 , SERVER _ASPECT _RATIO = . 1484375 , ServerEmbed = function ( a , c ) { this . containerTag = a ; a . style . width = c ; a . style . height = Math . floor ( a . clientWidth * SERVER _ASPECT _RATIO ) + "px" ; a . style . backgroundColor = "black" ; this . canvas = document . createElement ( "canvas" ) ; this . canvas . width = a . clientWidth ; this . canvas . height = a . clientHeight ; a . appendChild ( this . canvas ) ; this . ctx = this . canvas . getContext ( "2d" ) ; if ( ! this . ctx ) throw Error ( "CanvasRenderingContext2D is not supported in this browser" ) ;
this . ctx . imageSmoothingEnabled = ! 1 ; this . tmpCanvas = document . createElement ( "canvas" ) ; this . tmpCanvas . width = 64 ; this . tmpCanvas . height = 64 ; this . tmpCtx = this . tmpCanvas . getContext ( "2d" ) ; this . tmpCtx . imageSmoothingEnabled = ! 1 ; var b = this ; this . spriteSheet = document . createElement ( "img" ) ; this . spriteSheet . addEventListener ( "load" , function ( ) { b . isSpriteSheetLoaded = ! 0 ; setInterval ( function ( ) { return b . redraw ( ) } , 50 ) } ) ; this . spriteSheet . src = "icons.png" ; this . socket = null ; this . dirty = this . connected = ! 1 ; this . connecting = 0 ; this . currentStatus =
2022-04-21 13:30:35 -07:00
{ serverName : "" , serverCracked : ! 1 , pingSentTime : 0 , pingToServer : - 1 , motdLine1 : "" , motdLine2 : "" , onlineCount : 0 , maxCount : 0 , players : [ ] } ; this . showCracked = ! 0 ; this . tooltip = "" ; this . isShowingTooltip = ! 1 ; this . isTooltipEnabled = ! 0 ; this . tooltipCanvas = document . createElement ( "canvas" ) ; this . tooltipCanvas . width = 64 ; this . tooltipCanvas . height = 64 ; this . tooltipCanvas . style . display = "none" ; this . tooltipCanvas . style . position = "fixed" ; this . tooltipCanvas . style . zIndex = "100" ; this . tooltipCanvas . style . pointerEvents = "none" ; this . tooltipCtx =
this . tooltipCanvas . getContext ( "2d" ) ; this . tooltipCtx . imageSmoothingEnabled = ! 1 ; document . body . appendChild ( this . tooltipCanvas ) ; this . mouseOver = ! 1 ; this . mousePageY = this . mousePageX = this . mouseY = this . mouseX = 0 ; var g = function ( e ) { b . mouseOver = ! 0 ; b . mouseX = e . offsetX / b . canvas . width * 256 ; b . mouseY = e . offsetY / b . canvas . height * 38 ; b . mousePageX = e . clientX ; b . mousePageY = e . clientY } ; this . canvas . addEventListener ( "mouseover" , g ) ; this . canvas . addEventListener ( "mousemove" , g ) ; this . canvas . addEventListener ( "mouseout" , function ( e ) { b . mouseOver =
2022-04-03 23:43:58 -07:00
! 1 ; b . tooltipCanvas . style . display = "none" } ) ; this . redrawTimer = this . lastWidth = 0 } ; ServerEmbed . prototype . setShowCracked = function ( a ) { a != this . showCracked && ( this . showCracked = a , this . dirty = ! 0 ) } ; ServerEmbed . prototype . setShowTooltip = function ( a ) { this . isTooltipEnabled = a } ; ServerEmbed . prototype . getPixelX = function ( a ) { return a * this . canvas . width / 256 } ; ServerEmbed . prototype . getPixelY = function ( a ) { return a * this . canvas . height / 38 } ;
ServerEmbed . prototype . drawIcon = function ( a , c , b , g , e , y , f , w ) { this . isSpriteSheetLoaded && this . ctx . drawImage ( this . spriteSheet , a + . 05 , c + . 05 , b - . 1 , g - . 1 , this . getPixelX ( e ) , this . getPixelY ( y ) , this . getPixelX ( f || b ) , this . getPixelY ( w || g ) ) } ;
ServerEmbed . prototype . drawChar = function ( a , c , b , g ) { b >= CHAR _WIDTHS . length && ( b = 176 ) ; g ? this . isSpriteSheetLoaded && ( this . ctx . resetTransform ( ) , this . ctx . scale ( this . canvas . width / 256 , this . canvas . height / 38 ) , this . ctx . translate ( a + 1.1 , c ) , this . ctx . transform ( 1 , 0 , - . 35 , 1 , 0 , 0 ) , this . ctx . drawImage ( this . spriteSheet , b % 16 * 8 , 8 * Math . floor ( b / 16 ) , . 99 * CHAR _WIDTHS [ b ] , 7.92 , 0 , 0 , CHAR _WIDTHS [ b ] , 8 ) , this . ctx . resetTransform ( ) ) : this . drawIcon ( b % 16 * 8 , 8 * Math . floor ( b / 16 ) , CHAR _WIDTHS [ b ] , 8 , a , c ) ; return CHAR _WIDTHS [ b ] } ;
ServerEmbed . prototype . drawColoredChar = function ( a , c , b , g , e ) { b >= CHAR _WIDTHS . length && ( b = 176 ) ; if ( ! this . isSpriteSheetLoaded ) return CHAR _WIDTHS [ b ] ; this . tmpCtx . globalCompositeOperation = "source-over" ; this . tmpCtx . clearRect ( 0 , 0 , 8 , 8 ) ; this . tmpCtx . imageSmoothingEnabled = ! 1 ; this . tmpCtx . drawImage ( this . spriteSheet , b % 16 * 8 , 8 * Math . floor ( b / 16 ) , . 99 * CHAR _WIDTHS [ b ] , 7.92 , 0 , 0 , CHAR _WIDTHS [ b ] , 8 ) ; this . tmpCtx . globalCompositeOperation = "source-in" ; this . tmpCtx . fillStyle = g ; this . tmpCtx . fillRect ( 0 , 0 , CHAR _WIDTHS [ b ] , 8 ) ; e ? ( this . ctx . resetTransform ( ) ,
this . ctx . scale ( this . canvas . width / 256 , this . canvas . height / 38 ) , this . ctx . translate ( a + 1.1 , c ) , this . ctx . transform ( 1 , 0 , - . 35 , 1 , 0 , 0 ) , this . ctx . drawImage ( this . tmpCanvas , 0 , 0 , . 99 * CHAR _WIDTHS [ b ] , 7.92 , 0 , 0 , CHAR _WIDTHS [ b ] , 8 ) , this . ctx . resetTransform ( ) ) : this . ctx . drawImage ( this . tmpCanvas , 0 , 0 , . 99 * CHAR _WIDTHS [ b ] , 7.92 , this . getPixelX ( a ) , this . getPixelY ( c ) , this . getPixelX ( CHAR _WIDTHS [ b ] ) , this . getPixelY ( 8 ) ) ; return CHAR _WIDTHS [ b ] } ;
ServerEmbed . prototype . drawCharLine = function ( a , c , b , g ) { this . ctx . fillStyle = g ; this . ctx . fillRect ( this . getPixelX ( a ) , this . getPixelY ( c ) , this . getPixelX ( b + . 02 ) , this . getPixelY ( 1 ) ) } ; ServerEmbed . prototype . makeColor = function ( a , c , b ) { return "rgba(" + Math . floor ( a ) + "," + Math . floor ( c ) + "," + Math . floor ( b ) + ",1.0)" } ; ServerEmbed . prototype . getStringWidth = function ( a , c ) { c = c ? c . charCodeAt ( 0 ) : 167 ; for ( var b = 0 , g = 0 ; g < a . length ; ++ g ) { var e = a . charCodeAt ( g ) ; e == c ? g += 2 : b = e < CHAR _WIDTHS . length ? b + CHAR _WIDTHS [ e ] : b + 6 } return b } ;
ServerEmbed . prototype . drawString = function ( a , c , b , g , e , y , f , w , u ) { var A = u ; u = u ? u . charCodeAt ( 0 ) : 167 ; var B = a , D = c ; f && ( ++ a , ++ c ) ; w || ( w = 3492589035 ) ; for ( var h = ! 1 , p = g , q = e , r = y , t = ! 1 , k = ! 1 , m = ! 1 , n = ! 1 , l = ! 1 , C = 0 ; C < b . length ; ++ C ) { var d = b . charCodeAt ( C ) ; if ( d == u ) h = ! 0 ; else if ( h ) 48 == d ? ( p = q = r = 0 , h = t = k = m = n = l = ! 1 ) : 49 == d ? ( p = q = 0 , r = 170 , h = t = k = m = n = l = ! 1 ) : 50 == d ? ( p = r = 0 , q = 170 , h = t = k = m = n = l = ! 1 ) : 51 == d ? ( p = 0 , q = r = 170 , h = t = k = m = n = l = ! 1 ) : 52 == d ? ( p = 170 , q = r = 0 , h = t = k = m = n = l = ! 1 ) : 53 == d ? ( p = r = 170 , q = 0 , h = t = k = m = n = l = ! 1 ) : 54 == d ? ( p = 255 , q = 170 , r = 0 , h = t = k = m = n = l = ! 1 ) : 55 == d ?
( p = q = r = 170 , h = t = k = m = n = l = ! 1 ) : 56 == d ? ( p = q = r = 85 , h = t = k = m = n = l = ! 1 ) : 57 == d ? ( p = q = 85 , r = 255 , h = t = k = m = n = l = ! 1 ) : 97 == d ? ( p = r = 85 , q = 255 , h = t = k = m = n = l = ! 1 ) : 98 == d ? ( p = 85 , q = r = 255 , h = t = k = m = n = l = ! 1 ) : 99 == d ? ( q = r = 85 , p = 255 , h = t = k = m = n = l = ! 1 ) : 100 == d ? ( p = r = 255 , q = 85 , h = t = k = m = n = l = ! 1 ) : 101 == d ? ( p = q = 255 , r = 85 , h = t = k = m = n = l = ! 1 ) : 102 == d ? ( p = q = r = 255 , h = t = k = m = n = l = ! 1 ) : 107 == d ? ( h = ! 1 , t = ! 0 ) : 108 == d ? ( h = ! 1 , k = ! 0 ) : 109 == d ? ( h = ! 1 , m = ! 0 ) : 110 == d ? ( h = ! 1 , n = ! 0 ) : 111 == d ? ( h = ! 1 , l = ! 0 ) : 114 == d ? ( p = g , q = e , r = y , h = t = k = m = n = l = ! 1 ) : h = ! 1 ; else { if ( t ) { this . dirty = ! 0 ; var x = 6 ; d < CHAR _WIDTHS . length &&
2022-08-28 22:11:38 -07:00
( x = CHAR _WIDTHS [ d ] ) ; var z = 0 ; do { var v = w += 1831565813 ; v = Math . imul ( v ^ v >>> 15 , v | 1 ) ; v ^= v + Math . imul ( v ^ v >>> 7 , v | 61 ) ; v = ( ( v ^ v >>> 14 ) >>> 0 ) / 429496 & 255 } while ( ( v == d || CHAR _WIDTHS [ v ] != x ) && 1E3 > ++ z ) ; d = v } f ? ( x = this . makeColor ( p * CHAR _SHADOW _BRIGHTNESS , q * CHAR _SHADOW _BRIGHTNESS , r * CHAR _SHADOW _BRIGHTNESS ) , z = a , k && this . drawColoredChar ( a + 1 , c , d , x , l ) , a += d = this . drawColoredChar ( a , c , d , x , l ) , k && ( ++ a , ++ d ) , m && this . drawCharLine ( z , c + 4 , d , x ) , n && this . drawCharLine ( z , c + 8 , d , x ) ) : 250 <= p && 250 <= q && 250 <= r ? ( z = a , k && this . drawChar ( a + 1 , c , d , l ) , a += d = this . drawChar ( a ,
c , d , l ) , k && ( ++ a , ++ d ) , m && this . drawCharLine ( z , c + 4 , d , "#FFFFFF" ) , n && this . drawCharLine ( z , c + 8 , d , "#FFFFFF" ) ) : ( x = this . makeColor ( p , q , r ) , z = a , k && this . drawColoredChar ( a + 1 , c , d , x , l ) , a += d = this . drawColoredChar ( a , c , d , x , l ) , k && ( ++ a , ++ d ) , m && this . drawCharLine ( z , c + 4 , d , x ) , n && this . drawCharLine ( z , c + 8 , d , x ) ) ; if ( 250 < a ) break } } f && this . drawString ( B , D , b , g , e , y , ! 1 , w , A ) } ;
2022-04-21 13:30:35 -07:00
ServerEmbed . prototype . redraw = function ( ) { if ( this . dirty || this . mouseOver && 0 == ++ this . redrawTimer % 6 || this . canvas . width != this . containerTag . clientWidth ) { this . dirty = ! 1 ; this . canvas . width != this . containerTag . clientWidth && ( this . containerTag . style . height = Math . floor ( this . containerTag . clientWidth * SERVER _ASPECT _RATIO ) + "px" , this . canvas . width = this . containerTag . clientWidth , this . canvas . height = this . containerTag . clientHeight ) ; var a = [ ] ; this . ctx . imageSmoothingEnabled = ! 1 ; this . ctx . clearRect ( 0 , 0 , this . canvas . width , this . canvas . height ) ;
this . ctx . fillStyle = "#101010" ; this . ctx . fillRect ( 0 , 0 , this . canvas . width , this . canvas . height ) ; this . ctx . strokeStyle = "#808080" ; this . ctx . lineWidth = this . getPixelX ( 1 ) ; this . ctx . strokeRect ( this . ctx . lineWidth / 2 , this . ctx . lineWidth / 2 , this . canvas . width - this . ctx . lineWidth , this . canvas . height - this . ctx . lineWidth ) ; this . iconCanvas ? this . ctx . drawImage ( this . iconCanvas , 0 , 0 , 64 , 64 , this . getPixelX ( 4 ) , this . getPixelY ( 4 ) , this . getPixelX ( 30 ) , this . getPixelY ( 30 ) ) : this . drawIcon ( 128 , 0 , 64 , 64 , 4 , 4 , 30 , 30 ) ; var c = Date . now ( ) , b = ! 1 ; this . drawString ( 38 ,
4 , this . currentStatus . serverName , 255 , 255 , 255 , ! 0 , c ) ; 0 <= this . currentStatus . pingToServer ? ( 0 < this . currentStatus . motdLine1 . length && this . drawString ( 38 , 15 , "" + this . currentStatus . motdLine1 , 255 , 255 , 255 , ! 0 , c ) , 0 < this . currentStatus . motdLine2 . length ? this . drawString ( 38 , 27 , "" + this . currentStatus . motdLine2 , 255 , 255 , 255 , ! 0 , c ) : b = ! 0 ) : ( 7E3 > c - this . connecting ? ( this . dirty = ! 0 , b = Math . floor ( c / 300 ) % 4 , this . drawString ( 38 , 15 , "Connecting" + ( 0 < b ? "." : "" ) + ( 1 < b ? "." : "" ) + ( 2 < b ? "." : "" ) , 128 , 128 , 128 , ! 0 , c ) ) : this . drawString ( 38 , 15 , "No Connection" ,
96 , 96 , 96 , ! 0 , c ) , b = ! 0 ) ; b && this . showAddress && this . drawString ( 38 , 27 , this . originalAddress , 48 , 48 , 48 , ! 0 , c ) ; b = this . mouseOver && 233 <= this . mouseX && 256 >= this . mouseX && 1 <= this . mouseY && 11 >= this . mouseY ; var g = ! 1 ; if ( 0 <= this . currentStatus . pingToServer ) { b && ( a = [ "" + this . currentStatus . pingToServer + "ms" ] ) ; this . drawIcon ( 128 , 80 + 8 * ( 150 > this . currentStatus . pingToServer ? 0 : 300 > this . currentStatus . pingToServer ? 1 : 600 > this . currentStatus . pingToServer ? 2 : 1E3 > this . currentStatus . pingToServer ? 3 : 4 ) , 10 , 7 , 243 , 3 ) ; c = "" + this . currentStatus . onlineCount +
"/" + this . currentStatus . maxCount ; var e = 253 - this . getStringWidth ( c ) ; g = ! b && this . mouseOver && this . mouseX >= e - 5 && 256 >= this . mouseX && 12 <= this . mouseY && 23 >= this . mouseY ; this . drawString ( e , 14 , c , 128 , 128 , 128 , ! 0 ) ; g && ( a = this . currentStatus . players ) } else 7E3 > c - this . connecting || this . connected ? ( this . dirty = ! 0 , b && ( a = [ "Connecting..." ] ) , this . drawIcon ( 138 , 80 + 8 * Math . abs ( Math . floor ( c / 100 ) % 8 - 4 ) , 10 , 7 , 243 , 3 ) ) : ( b && ( a = [ "No Connection" ] ) , this . drawIcon ( 128 , 120 , 10 , 7 , 243 , 3 ) ) ; this . showCracked && 0 <= this . currentStatus . pingToServer && ( this . currentStatus . serverCracked ?
this . drawIcon ( 144 , 64 , 16 , 16 , 243 , 25 , 10 , 10 ) : this . drawIcon ( 176 , 96 , 16 , 16 , 243 , 25 , 11 , 11 ) , ! g && this . mouseOver && 239 <= this . mouseX && 256 >= this . mouseX && 22 <= this . mouseY && 36 >= this . mouseY && ( a = this . currentStatus . serverCracked ? [ "Server is cracked" ] : [ "Server has login" ] ) ) ; a && this . mouseOver && 0 != a . length ? this . showTooltip ( a ) : this . tooltipCanvas . style . display = "none" } } ;
2022-04-03 23:43:58 -07:00
ServerEmbed . prototype . ping = function ( a , c , b , g , e ) { var y = this ; c ? this . showQueryName = "undefined" !== typeof b && ! b : ( c = "Minecraft Server" , this . showQueryName = "undefined" === typeof b || ! b ) ; this . defaultName = c ; this . showAddress = ! g ; this . originalAddress = a ; "undefined" !== typeof e && ( this . showCracked = ! e ) ; 0 != a . indexOf ( "ws://" ) && 0 != a . indexOf ( "wss://" ) && ( a = ( 0 == window . location . href . indexOf ( "https:" ) ? "wss" : "ws" ) + "://" + a ) ; null != this . socket && this . connected && this . socket . close ( ) ; this . currentStatus = { serverName : c , serverCracked : ! 1 ,
pingSentTime : Date . now ( ) , pingToServer : - 1 , motdLine1 : "Connecting..." , motdLine2 : "" , onlineCount : 0 , maxCount : 0 , players : [ ] } ; this . dirty = ! 0 ; if ( this . connected || 0 < this . connecting ) this . socket . close ( ) , this . connected = ! 1 , this . connecting = 0 , this . redraw ( ) ; this . connecting = Date . now ( ) ; var f = this ; this . socket = new WebSocket ( a ) ; this . socket . binaryType = "arraybuffer" ; this . socket . onopen = function ( ) { f . socket . send ( "Accept: MOTD" ) ; f . connecting = 0 ; f . connected = ! 0 ; f . dirty = ! 0 } ; this . socket . onmessage = function ( w ) { if ( w . data ) if ( "string" ===
typeof w . data ) try { var u = JSON . parse ( w . data ) ; if ( "motd" === u . type . toLowerCase ( ) ) { f . dirty = ! 0 ; 0 < f . currentStatus . pingSentTime && ( f . currentStatus . pingToServer = Date . now ( ) - f . currentStatus . pingSentTime , f . currentStatus . pingSentTime = 0 ) ; f . currentStatus . serverName = y . showQueryName ? u . name : y . defaultName ; f . currentStatus . serverCracked = u . cracked ; var A = u . data . motd ; A && 0 < A . length && ( f . currentStatus . motdLine1 = A [ 0 ] , 1 < A . length && ( f . currentStatus . motdLine2 = A [ 1 ] ) ) ; f . currentStatus . onlineCount = u . data . online ; f . currentStatus . maxCount =
u . data . max ; f . currentStatus . players = u . data . players || [ ] } } catch ( B ) { f . currentStatus . motdLine1 = "ERROR: " + B } else u = new Uint8Array ( w . data ) , 16384 == u . length && ( y . updateIconFromBytes ( u ) , y . dirty = ! 0 ) } ; this . socket . onclose = function ( w ) { f . connecting = 0 ; f . connected = ! 1 ; f . dirty = ! 0 } ; this . socket . onerror = function ( w ) { ( f . connected || 0 < f . connecting ) && f . socket . close ( ) ; f . connecting = 0 ; f . connected = ! 1 ; f . dirty = ! 0 } } ; ServerEmbed . prototype . isActive = function ( ) { return 0 < self . connecting || self . connected } ;
ServerEmbed . prototype . setTooltip = function ( a ) { if ( this . isTooltipEnabled ) { var c = a . join ( ) ; if ( c !== this . tooltip || this . lastWidth !== this . canvas . width ) { for ( var b = 0 , g = 9 * a . length , e = 0 ; e < a . length ; ++ e ) b = Math . max ( b , this . getStringWidth ( a [ e ] ) ) ; g += 3 ; this . tooltipCanvas . width = this . getPixelX ( b + 6 ) ; this . tooltipCanvas . height = this . getPixelY ( g ) ; b = this . ctx ; this . ctx = this . tooltipCtx ; this . ctx . imageSmoothingEnabled = ! 1 ; this . ctx . clearRect ( 0 , 0 , this . tooltipCanvas . width , this . tooltipCanvas . height ) ; this . ctx . fillStyle = "#101010E0" ; this . ctx . fillRect ( 0 ,
0 , this . tooltipCanvas . width , this . tooltipCanvas . height ) ; for ( e = 0 ; e < a . length ; ++ e ) this . drawString ( 3 , 2 + 9 * e , a [ e ] , 256 , 256 , 256 , ! 0 ) ; this . ctx = b ; this . tooltip = c ; this . lastWidth = this . canvas . width } } } ;
ServerEmbed . prototype . showTooltip = function ( a ) { this . dirty = ! 0 ; if ( this . mouseOver ) { this . setTooltip ( a ) ; this . tooltipCanvas . style . display = "block" ; a = this . mousePageX + this . getPixelX ( 4 ) ; var c = this . mousePageY - this . getPixelY ( 9 ) ; this . mousePageX + this . tooltipCanvas . width + 2 > window . innerWidth && ( a = window . innerWidth - this . tooltipCanvas . width - 2 ) ; this . mousePageY + this . tooltipCanvas . height + 2 > window . innerHeight && ( c = window . innerHeight - this . tooltipCanvas . height - 2 , 0 > c && ( c = 0 ) ) ; this . tooltipCanvas . style . left = a + "px" ; this . tooltipCanvas . style . top =
c + "px" } else this . tooltipCanvas . style . display = "none" } ; ServerEmbed . prototype . updateIconFromBytes = function ( a ) { this . iconCanvas || ( this . iconCanvas = document . createElement ( "canvas" ) , this . iconCanvas . width = 64 , this . iconCanvas . height = 64 , this . iconContext = this . iconCanvas . getContext ( "2d" ) ) ; for ( var c = this . iconContext . createImageData ( 64 , 64 ) , b = 0 ; 16384 > b ; ++ b ) c . data [ b ] = a [ b ] ; this . iconContext . putImageData ( c , 0 , 0 ) } ;