<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://classic.pgnrp.com/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACommon.js</id>
	<title>MediaWiki:Common.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://classic.pgnrp.com/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACommon.js"/>
	<link rel="alternate" type="text/html" href="https://classic.pgnrp.com/index.php?title=MediaWiki:Common.js&amp;action=history"/>
	<updated>2026-04-08T19:35:55Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://classic.pgnrp.com/index.php?title=MediaWiki:Common.js&amp;diff=116&amp;oldid=prev</id>
		<title>Maegnus: Created page with &quot;(function () {     var pageName = mw.config.get(&quot;wgPageName&quot;);     var skin = mw.config.get(&quot;skin&quot;);     var isMainPage = mw.config.get(&quot;wgIsMainPage&quot;);      function onMainPage() {         var searchTrigger = document.getElementById(             &quot;tg-mainpage-search-trigger&quot;         );         var searchInput = document.getElementById(&quot;searchInput&quot;);         var searchToggle;          function onSearchTriggerClick() {             if (skin === &quot;citizen&quot;) {...&quot;</title>
		<link rel="alternate" type="text/html" href="https://classic.pgnrp.com/index.php?title=MediaWiki:Common.js&amp;diff=116&amp;oldid=prev"/>
		<updated>2025-05-21T06:48:07Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;(function () {     var pageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);     var skin = mw.config.get(&amp;quot;skin&amp;quot;);     var isMainPage = mw.config.get(&amp;quot;wgIsMainPage&amp;quot;);      function onMainPage() {         var searchTrigger = document.getElementById(             &amp;quot;tg-mainpage-search-trigger&amp;quot;         );         var searchInput = document.getElementById(&amp;quot;searchInput&amp;quot;);         var searchToggle;          function onSearchTriggerClick() {             if (skin === &amp;quot;citizen&amp;quot;) {...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;(function () {&lt;br /&gt;
    var pageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
    var skin = mw.config.get(&amp;quot;skin&amp;quot;);&lt;br /&gt;
    var isMainPage = mw.config.get(&amp;quot;wgIsMainPage&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    function onMainPage() {&lt;br /&gt;
        var searchTrigger = document.getElementById(&lt;br /&gt;
            &amp;quot;tg-mainpage-search-trigger&amp;quot;&lt;br /&gt;
        );&lt;br /&gt;
        var searchInput = document.getElementById(&amp;quot;searchInput&amp;quot;);&lt;br /&gt;
        var searchToggle;&lt;br /&gt;
&lt;br /&gt;
        function onSearchTriggerClick() {&lt;br /&gt;
            if (skin === &amp;quot;citizen&amp;quot;) {&lt;br /&gt;
                // HACK: Force sticky header to be visible&lt;br /&gt;
                var isSearchHidden =&lt;br /&gt;
                    document.body.classList.contains(&amp;quot;citizen-scroll--down&amp;quot;) &amp;amp;&amp;amp;&lt;br /&gt;
                    window.matchMedia(&amp;quot;(max-width: 1119px)&amp;quot;);&lt;br /&gt;
                if (isSearchHidden) {&lt;br /&gt;
                    document.body.classList.remove(&amp;quot;citizen-scroll--down&amp;quot;);&lt;br /&gt;
                    document.body.classList.add(&amp;quot;citizen-scroll--up&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                // Citizen does not have a visible search bar, you need to expand the search card first&lt;br /&gt;
                // And Citizen will focus the input automatically&lt;br /&gt;
                searchToggle.open = true;&lt;br /&gt;
            } else {&lt;br /&gt;
                // This should work for all skins that has visible search bar&lt;br /&gt;
                searchInput.focus();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Attach click event listener to search button on the main page&lt;br /&gt;
        if (searchTrigger &amp;amp;&amp;amp; searchInput) {&lt;br /&gt;
            if (skin === &amp;quot;citizen&amp;quot;) {&lt;br /&gt;
                searchToggle = document.getElementById(&amp;quot;citizen-search-details&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            searchTrigger.addEventListener(&amp;quot;click&amp;quot;, onSearchTriggerClick);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function initSauronEye(container) {&lt;br /&gt;
        var Eye = {&lt;br /&gt;
            size: 250,&lt;br /&gt;
            point: 15,&lt;br /&gt;
            speed: 100,&lt;br /&gt;
            pupil: { x: 6, y: 36 },&lt;br /&gt;
            eye: { x: 100, y: 65 },&lt;br /&gt;
            data: [],&lt;br /&gt;
&lt;br /&gt;
            Add: function (val) {&lt;br /&gt;
                return val + Eye.size / 2;&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Interval: function (color, distance, value) {&lt;br /&gt;
                var s = Math.abs(&lt;br /&gt;
                    (color.a - color.b) / (distance.b - distance.a)&lt;br /&gt;
                );&lt;br /&gt;
                var v = value - distance.a;&lt;br /&gt;
                var c = color.a &amp;gt; color.b ? color.a - v * s : color.a + v * s;&lt;br /&gt;
                return Math.round(c);&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Color: function (percent) {&lt;br /&gt;
                if (percent &amp;lt; 5)&lt;br /&gt;
                    return Eye.Interval(&lt;br /&gt;
                        { a: 255, b: 180 },&lt;br /&gt;
                        { a: 0, b: 2 },&lt;br /&gt;
                        percent&lt;br /&gt;
                    );&lt;br /&gt;
                else if (percent &amp;lt; 10)&lt;br /&gt;
                    return Eye.Interval(&lt;br /&gt;
                        { a: 180, b: 100 },&lt;br /&gt;
                        { a: 2, b: 5 },&lt;br /&gt;
                        percent&lt;br /&gt;
                    );&lt;br /&gt;
                else if (percent &amp;lt; 40)&lt;br /&gt;
                    return Eye.Interval(&lt;br /&gt;
                        { a: 100, b: 0 },&lt;br /&gt;
                        { a: 5, b: 30 },&lt;br /&gt;
                        percent&lt;br /&gt;
                    );&lt;br /&gt;
                else if (percent &amp;lt; 70)&lt;br /&gt;
                    return Eye.Interval(&lt;br /&gt;
                        { a: 0, b: 100 },&lt;br /&gt;
                        { a: 30, b: 70 },&lt;br /&gt;
                        percent&lt;br /&gt;
                    );&lt;br /&gt;
                else if (percent &amp;lt; 75)&lt;br /&gt;
                    return Eye.Interval(&lt;br /&gt;
                        { a: 100, b: 180 },&lt;br /&gt;
                        { a: 70, b: 80 },&lt;br /&gt;
                        percent&lt;br /&gt;
                    );&lt;br /&gt;
                else&lt;br /&gt;
                    return Eye.Interval(&lt;br /&gt;
                        { a: 180, b: 255 },&lt;br /&gt;
                        { a: 80, b: 100 },&lt;br /&gt;
                        percent&lt;br /&gt;
                    );&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Pifagor: function (x, y) {&lt;br /&gt;
                return Math.sqrt(x * x + y * y);&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Remove: function (radius, max, i) {&lt;br /&gt;
                if (radius &amp;gt; max) {&lt;br /&gt;
                    Eye.data.splice(i, 1);&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Write: function (x, y, color, opacity) {&lt;br /&gt;
                Eye.ctx.fillStyle = &amp;quot;rgba(255,&amp;quot; + color + &amp;quot;,0,&amp;quot; + opacity + &amp;quot;)&amp;quot;;&lt;br /&gt;
                Eye.ctx.fillRect(Eye.Add(x), Eye.Add(y), 1, 1);&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Style: function (point, i) {&lt;br /&gt;
                var radius = Eye.Pifagor(point.x, point.y);&lt;br /&gt;
                var percent =&lt;br /&gt;
                    ((radius - point.min) / (point.max - point.min)) * 100;&lt;br /&gt;
                var color = Eye.Color(percent);&lt;br /&gt;
                var opacity = percent &amp;gt; 70 ? 1 - (percent - 70) / 30 : 1;&lt;br /&gt;
&lt;br /&gt;
                Eye.Write(point.x, point.y, color, opacity);&lt;br /&gt;
                Eye.Remove(radius, point.max, i);&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Move: function (i) {&lt;br /&gt;
                var point = Eye.data[i];&lt;br /&gt;
                point.x += point.X;&lt;br /&gt;
                point.y += point.Y;&lt;br /&gt;
                Eye.Style(point, i);&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Update: function () {&lt;br /&gt;
                Eye.Fill(0.02);&lt;br /&gt;
                for (var i = 0; i &amp;lt; Eye.point; i++) {&lt;br /&gt;
                    Eye.Point();&lt;br /&gt;
                }&lt;br /&gt;
                for (var j = 0; j &amp;lt; Eye.data.length; j++) {&lt;br /&gt;
                    Eye.Move(j);&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Draw: function () {&lt;br /&gt;
                Eye.Update();&lt;br /&gt;
                requestAnimationFrame(Eye.Draw, Eye.canvas);&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Noise: function (value) {&lt;br /&gt;
                return Math.random() * value - value / 2;&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Radius: function (start, end) {&lt;br /&gt;
                return {&lt;br /&gt;
                    max: Eye.Pifagor(end.x, end.y),&lt;br /&gt;
                    min: Eye.Pifagor(start.x, start.y),&lt;br /&gt;
                };&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Step: function (start, end) {&lt;br /&gt;
                return {&lt;br /&gt;
                    x: (end.x - start.x) / Eye.speed,&lt;br /&gt;
                    y: (end.y - start.y) / Eye.speed,&lt;br /&gt;
                };&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Position: function (type, angel, noise) {&lt;br /&gt;
                return {&lt;br /&gt;
                    x: Eye[type].x * Math.cos(angel) + Eye.Noise(noise),&lt;br /&gt;
                    y: Eye[type].y * Math.sin(angel) + Eye.Noise(noise),&lt;br /&gt;
                };&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Point: function () {&lt;br /&gt;
                var angel = Math.random() * 2 * Math.PI;&lt;br /&gt;
                var start = Eye.Position(&amp;quot;pupil&amp;quot;, angel, 5);&lt;br /&gt;
                var end = Eye.Position(&amp;quot;eye&amp;quot;, angel, 25);&lt;br /&gt;
                var radius = Eye.Radius(start, end);&lt;br /&gt;
                var step = Eye.Step(start, end);&lt;br /&gt;
&lt;br /&gt;
                Eye.data.push({&lt;br /&gt;
                    x: start.x,&lt;br /&gt;
                    y: start.y,&lt;br /&gt;
                    X: step.x,&lt;br /&gt;
                    Y: step.y,&lt;br /&gt;
                    min: radius.min,&lt;br /&gt;
                    max: radius.max,&lt;br /&gt;
                });&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Fill: function (a) {&lt;br /&gt;
                Eye.ctx.fillStyle = &amp;quot;rgba(0,0,0,&amp;quot; + a + &amp;quot;)&amp;quot;;&lt;br /&gt;
                Eye.ctx.fillRect(0, 0, Eye.size, Eye.size);&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Init: function () {&lt;br /&gt;
                Eye.Fill(1);&lt;br /&gt;
                for (var i = 0; i &amp;lt; Eye.point; i++) {&lt;br /&gt;
                    Eye.Point();&lt;br /&gt;
                }&lt;br /&gt;
                Eye.Draw();&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Watch: function () {&lt;br /&gt;
                Eye.canvas = document.getElementById(&amp;quot;tg-sauroneye&amp;quot;);&lt;br /&gt;
                Eye.canvas.width = Eye.size;&lt;br /&gt;
                Eye.canvas.height = Eye.size;&lt;br /&gt;
                Eye.ctx = Eye.canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
                Eye.Init();&lt;br /&gt;
            },&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var canvas = document.createElement(&amp;quot;canvas&amp;quot;);&lt;br /&gt;
        canvas.id = &amp;quot;tg-sauroneye&amp;quot;;&lt;br /&gt;
        container.append(canvas);&lt;br /&gt;
        Eye.Watch();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
        // Wait for page content to be fully loaded&lt;br /&gt;
        mw.hook(&amp;quot;wikipage.content&amp;quot;).add(function () {&lt;br /&gt;
            if (isMainPage) {&lt;br /&gt;
                onMainPage();&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var eyeContainer = document.getElementById(&lt;br /&gt;
                &amp;quot;tg-sauroneye-container&amp;quot;&lt;br /&gt;
            );&lt;br /&gt;
            if (eyeContainer) {&lt;br /&gt;
                initSauronEye(eyeContainer);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    init();&lt;br /&gt;
})();&lt;br /&gt;
/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
(function () {&lt;br /&gt;
    var pageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
    var skin = mw.config.get(&amp;quot;skin&amp;quot;);&lt;br /&gt;
    var isMainPage = mw.config.get(&amp;quot;wgIsMainPage&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    function onMainPage() {&lt;br /&gt;
        var searchTrigger = document.getElementById(&lt;br /&gt;
            &amp;quot;tg-mainpage-search-trigger&amp;quot;&lt;br /&gt;
        );&lt;br /&gt;
        var searchInput = document.getElementById(&amp;quot;searchInput&amp;quot;);&lt;br /&gt;
        var searchToggle;&lt;br /&gt;
&lt;br /&gt;
        function onSearchTriggerClick() {&lt;br /&gt;
            if (skin === &amp;quot;citizen&amp;quot;) {&lt;br /&gt;
                // HACK: Force sticky header to be visible&lt;br /&gt;
                var isSearchHidden =&lt;br /&gt;
                    document.body.classList.contains(&amp;quot;citizen-scroll--down&amp;quot;) &amp;amp;&amp;amp;&lt;br /&gt;
                    window.matchMedia(&amp;quot;(max-width: 1119px)&amp;quot;);&lt;br /&gt;
                if (isSearchHidden) {&lt;br /&gt;
                    document.body.classList.remove(&amp;quot;citizen-scroll--down&amp;quot;);&lt;br /&gt;
                    document.body.classList.add(&amp;quot;citizen-scroll--up&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                // Citizen does not have a visible search bar, you need to expand the search card first&lt;br /&gt;
                // And Citizen will focus the input automatically&lt;br /&gt;
                searchToggle.open = true;&lt;br /&gt;
            } else {&lt;br /&gt;
                // This should work for all skins that has visible search bar&lt;br /&gt;
                searchInput.focus();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Attach click event listener to search button on the main page&lt;br /&gt;
        if (searchTrigger &amp;amp;&amp;amp; searchInput) {&lt;br /&gt;
            if (skin === &amp;quot;citizen&amp;quot;) {&lt;br /&gt;
                searchToggle = document.getElementById(&amp;quot;citizen-search-details&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            searchTrigger.addEventListener(&amp;quot;click&amp;quot;, onSearchTriggerClick);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function initSauronEye(container) {&lt;br /&gt;
        var Eye = {&lt;br /&gt;
            size: 250,&lt;br /&gt;
            point: 15,&lt;br /&gt;
            speed: 100,&lt;br /&gt;
            pupil: { x: 6, y: 36 },&lt;br /&gt;
            eye: { x: 100, y: 65 },&lt;br /&gt;
            data: [],&lt;br /&gt;
&lt;br /&gt;
            Add: function (val) {&lt;br /&gt;
                return val + Eye.size / 2;&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Interval: function (color, distance, value) {&lt;br /&gt;
                var s = Math.abs(&lt;br /&gt;
                    (color.a - color.b) / (distance.b - distance.a)&lt;br /&gt;
                );&lt;br /&gt;
                var v = value - distance.a;&lt;br /&gt;
                var c = color.a &amp;gt; color.b ? color.a - v * s : color.a + v * s;&lt;br /&gt;
                return Math.round(c);&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Color: function (percent) {&lt;br /&gt;
                if (percent &amp;lt; 5)&lt;br /&gt;
                    return Eye.Interval(&lt;br /&gt;
                        { a: 255, b: 180 },&lt;br /&gt;
                        { a: 0, b: 2 },&lt;br /&gt;
                        percent&lt;br /&gt;
                    );&lt;br /&gt;
                else if (percent &amp;lt; 10)&lt;br /&gt;
                    return Eye.Interval(&lt;br /&gt;
                        { a: 180, b: 100 },&lt;br /&gt;
                        { a: 2, b: 5 },&lt;br /&gt;
                        percent&lt;br /&gt;
                    );&lt;br /&gt;
                else if (percent &amp;lt; 40)&lt;br /&gt;
                    return Eye.Interval(&lt;br /&gt;
                        { a: 100, b: 0 },&lt;br /&gt;
                        { a: 5, b: 30 },&lt;br /&gt;
                        percent&lt;br /&gt;
                    );&lt;br /&gt;
                else if (percent &amp;lt; 70)&lt;br /&gt;
                    return Eye.Interval(&lt;br /&gt;
                        { a: 0, b: 100 },&lt;br /&gt;
                        { a: 30, b: 70 },&lt;br /&gt;
                        percent&lt;br /&gt;
                    );&lt;br /&gt;
                else if (percent &amp;lt; 75)&lt;br /&gt;
                    return Eye.Interval(&lt;br /&gt;
                        { a: 100, b: 180 },&lt;br /&gt;
                        { a: 70, b: 80 },&lt;br /&gt;
                        percent&lt;br /&gt;
                    );&lt;br /&gt;
                else&lt;br /&gt;
                    return Eye.Interval(&lt;br /&gt;
                        { a: 180, b: 255 },&lt;br /&gt;
                        { a: 80, b: 100 },&lt;br /&gt;
                        percent&lt;br /&gt;
                    );&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Pifagor: function (x, y) {&lt;br /&gt;
                return Math.sqrt(x * x + y * y);&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Remove: function (radius, max, i) {&lt;br /&gt;
                if (radius &amp;gt; max) {&lt;br /&gt;
                    Eye.data.splice(i, 1);&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Write: function (x, y, color, opacity) {&lt;br /&gt;
                Eye.ctx.fillStyle = &amp;quot;rgba(255,&amp;quot; + color + &amp;quot;,0,&amp;quot; + opacity + &amp;quot;)&amp;quot;;&lt;br /&gt;
                Eye.ctx.fillRect(Eye.Add(x), Eye.Add(y), 1, 1);&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Style: function (point, i) {&lt;br /&gt;
                var radius = Eye.Pifagor(point.x, point.y);&lt;br /&gt;
                var percent =&lt;br /&gt;
                    ((radius - point.min) / (point.max - point.min)) * 100;&lt;br /&gt;
                var color = Eye.Color(percent);&lt;br /&gt;
                var opacity = percent &amp;gt; 70 ? 1 - (percent - 70) / 30 : 1;&lt;br /&gt;
&lt;br /&gt;
                Eye.Write(point.x, point.y, color, opacity);&lt;br /&gt;
                Eye.Remove(radius, point.max, i);&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Move: function (i) {&lt;br /&gt;
                var point = Eye.data[i];&lt;br /&gt;
                point.x += point.X;&lt;br /&gt;
                point.y += point.Y;&lt;br /&gt;
                Eye.Style(point, i);&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Update: function () {&lt;br /&gt;
                Eye.Fill(0.02);&lt;br /&gt;
                for (var i = 0; i &amp;lt; Eye.point; i++) {&lt;br /&gt;
                    Eye.Point();&lt;br /&gt;
                }&lt;br /&gt;
                for (var j = 0; j &amp;lt; Eye.data.length; j++) {&lt;br /&gt;
                    Eye.Move(j);&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Draw: function () {&lt;br /&gt;
                Eye.Update();&lt;br /&gt;
                requestAnimationFrame(Eye.Draw, Eye.canvas);&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Noise: function (value) {&lt;br /&gt;
                return Math.random() * value - value / 2;&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Radius: function (start, end) {&lt;br /&gt;
                return {&lt;br /&gt;
                    max: Eye.Pifagor(end.x, end.y),&lt;br /&gt;
                    min: Eye.Pifagor(start.x, start.y),&lt;br /&gt;
                };&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Step: function (start, end) {&lt;br /&gt;
                return {&lt;br /&gt;
                    x: (end.x - start.x) / Eye.speed,&lt;br /&gt;
                    y: (end.y - start.y) / Eye.speed,&lt;br /&gt;
                };&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Position: function (type, angel, noise) {&lt;br /&gt;
                return {&lt;br /&gt;
                    x: Eye[type].x * Math.cos(angel) + Eye.Noise(noise),&lt;br /&gt;
                    y: Eye[type].y * Math.sin(angel) + Eye.Noise(noise),&lt;br /&gt;
                };&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Point: function () {&lt;br /&gt;
                var angel = Math.random() * 2 * Math.PI;&lt;br /&gt;
                var start = Eye.Position(&amp;quot;pupil&amp;quot;, angel, 5);&lt;br /&gt;
                var end = Eye.Position(&amp;quot;eye&amp;quot;, angel, 25);&lt;br /&gt;
                var radius = Eye.Radius(start, end);&lt;br /&gt;
                var step = Eye.Step(start, end);&lt;br /&gt;
&lt;br /&gt;
                Eye.data.push({&lt;br /&gt;
                    x: start.x,&lt;br /&gt;
                    y: start.y,&lt;br /&gt;
                    X: step.x,&lt;br /&gt;
                    Y: step.y,&lt;br /&gt;
                    min: radius.min,&lt;br /&gt;
                    max: radius.max,&lt;br /&gt;
                });&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Fill: function (a) {&lt;br /&gt;
                Eye.ctx.fillStyle = &amp;quot;rgba(0,0,0,&amp;quot; + a + &amp;quot;)&amp;quot;;&lt;br /&gt;
                Eye.ctx.fillRect(0, 0, Eye.size, Eye.size);&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Init: function () {&lt;br /&gt;
                Eye.Fill(1);&lt;br /&gt;
                for (var i = 0; i &amp;lt; Eye.point; i++) {&lt;br /&gt;
                    Eye.Point();&lt;br /&gt;
                }&lt;br /&gt;
                Eye.Draw();&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            Watch: function () {&lt;br /&gt;
                Eye.canvas = document.getElementById(&amp;quot;tg-sauroneye&amp;quot;);&lt;br /&gt;
                Eye.canvas.width = Eye.size;&lt;br /&gt;
                Eye.canvas.height = Eye.size;&lt;br /&gt;
                Eye.ctx = Eye.canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
                Eye.Init();&lt;br /&gt;
            },&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var canvas = document.createElement(&amp;quot;canvas&amp;quot;);&lt;br /&gt;
        canvas.id = &amp;quot;tg-sauroneye&amp;quot;;&lt;br /&gt;
        container.append(canvas);&lt;br /&gt;
        Eye.Watch();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
        // Wait for page content to be fully loaded&lt;br /&gt;
        mw.hook(&amp;quot;wikipage.content&amp;quot;).add(function () {&lt;br /&gt;
            if (isMainPage) {&lt;br /&gt;
                onMainPage();&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var eyeContainer = document.getElementById(&lt;br /&gt;
                &amp;quot;tg-sauroneye-container&amp;quot;&lt;br /&gt;
            );&lt;br /&gt;
            if (eyeContainer) {&lt;br /&gt;
                initSauronEye(eyeContainer);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    init();&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Maegnus</name></author>
	</entry>
</feed>