Advertisement
Guest User

fg

a guest
May 27th, 2012
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name          FG
  3. // @namespace     http://fg.com
  4. // @description   FG
  5. // @include     http://boards.4chan.org/*/res/*
  6. // @match       http://boards.4chan.org/*/res/*
  7. // @require https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
  8. //
  9. // ==/UserScript==
  10. //
  11. // Notes:
  12. //   * is a wildcard character
  13. //   .tld is magic that matches all top-level domains (e.g. .com, .co.uk, .us, etc.)
  14.  
  15. // a function that loads jQuery and calls a callback function when jQuery has finished loading
  16.  
  17. var Intensities = [
  18.     'extremely light',
  19.     'very light',
  20.     'light',
  21.     'loose',
  22.     'medium',
  23.     'tight',
  24.     'hard',
  25.     'very hard',
  26.     'extremely hard'
  27. ];
  28.  
  29. var SpeedMap = {
  30.     'extremely slow': 0.25,
  31.     'very slow': 0.333,
  32.     'slow': 0.5,
  33.     'medium': 1.0,
  34.     'normal': 1.0,
  35.     'fast': 2.0,
  36.     'very fast': 3.0,
  37.     'extremely fast': 4.0
  38. };
  39.  
  40. var SameAsPicTexts = [ 'speed', 'pace', 'same as' ];
  41.  
  42. function isNumber(n) {
  43.   return !isNaN(parseFloat(n)) && isFinite(n);
  44. }
  45.  
  46. function isAnyItemIn(arr, s){
  47.     for (var i = 0; i < arr.length; i++){
  48.         if (s.indexOf(arr[i]) != -1){
  49.             return true;
  50.         }
  51.     }
  52.  
  53.     return false;
  54. }
  55.  
  56. function preload(arrayOfImages) {
  57.     $(arrayOfImages).each(function(){
  58.         (new Image()).src = this;
  59.     });
  60. }
  61.  
  62.  
  63. function translateSpeedText(t){
  64.     if (SpeedMap.hasOwnProperty(t)){
  65.         return SpeedMap[t];
  66.     }
  67.     else if (isAnyItemIn(SameAsPicTexts, t)){
  68.         //TODO speed of gif - is that even possible in JS?
  69.         return 1.0;
  70.     }
  71.  
  72.     return 1.0;
  73. }
  74.  
  75. function Random(){
  76.     var self = this;
  77.     self.next = function(max, min){
  78.         var minTmp = !min ? 0 : min;
  79.         return Math.floor(Math.random() * (max - minTmp + 1)) + minTmp;
  80.     }
  81.    
  82.     self.choice = function(list){
  83.         return list[self.next(list.length - 1)];
  84.     }
  85. }
  86.  
  87.  
  88. RandomGen = new Random();
  89.  
  90. function FgView(){
  91.  
  92.     function FgPost(postData){
  93.         var self = this;
  94.         self.imageSrc = postData.imageSrc;
  95.         self.message = jQuery.trim(postData.message);
  96.  
  97.         self.getRandomSpeed = function(){
  98.             var speedKeys = Object.keys(SpeedMap);
  99.             var speedKey = RandomGen.choice(speedKeys);
  100.             return SpeedMap[speedKey];
  101.         }
  102.  
  103.         self.getRandomCount = function(){
  104.             var speed = self.speed;
  105.             if (speed < 1){
  106.                 return RandomGen.next(20, 50);
  107.             }
  108.             else if (speed < 2){
  109.                 return RandomGen.next(10, 30);
  110.             }
  111.             else if (speed < 3){
  112.                 return RandomGen.next(5, 20);
  113.             }
  114.             else{
  115.                 return RandomGen.next(25, 15);
  116.             }
  117.         }
  118.  
  119.         var fgData = postData.message.split(",");
  120.         if (fgData.length == 3){
  121.  
  122.             self.count = parseInt(jQuery.trim(fgData[0]), 10);
  123.  
  124.             var speedTrim = jQuery.trim(fgData[1]);
  125.             self.speed = isNumber(speedTrim) ? parseFloat(speedTrim) : translateSpeedText(speedTrim);
  126.  
  127.             self.intensity = fgData[2];
  128.         }
  129.         else{
  130.             self.speed = self.getRandomSpeed();
  131.             self.count = self.getRandomCount();
  132.             self.intensity = RandomGen.choice(Intensities);
  133.         }
  134.  
  135.         self.isValid = function(){
  136.             return !isNaN(self.speed) && self.speed > 0 && self.count && self.count > 0 && self.intensity;
  137.         }
  138.  
  139.         self.hasImage = function(){ return self.imageSrc; }
  140.         self.isSpam = function(){ return !self.imageSrc || !self.isValid(); }
  141.         self.views = 0;
  142.     }
  143.  
  144.     function FgPostHistory(availablePosts, onGetNext){
  145.         var self = this;
  146.         self.availablePosts = availablePosts;
  147.         self.currentIdx = -1;
  148.         self.onGetNext = onGetNext;
  149.         self.history = [ ];
  150.  
  151.         self.loadNext = function(){
  152.             var nextPost = RandomGen.choice(self.availablePosts);
  153.             var current = self.current();
  154.             while (nextPost == current){
  155.                 nextPost = RandomGen.choice(self.availablePosts);
  156.             }
  157.            
  158.             self.history.push(nextPost);
  159.  
  160.             if (self.onGetNext){
  161.                 self.onGetNext(nextPost);
  162.             }
  163.         }
  164.  
  165.         self.current = function(){
  166.             return self.history[self.currentIdx];
  167.         }
  168.  
  169.         self.goBack = function(){
  170.             if (self.currentIdx == 0){
  171.                 return;
  172.             }
  173.  
  174.             self.currentIdx--;
  175.             return self.current();
  176.         }
  177.  
  178.         self.goForward = function(){
  179.             if (self.currentIdx == self.history.length - 2){ //load one in advance
  180.                 self.loadNext();
  181.             }
  182.  
  183.             self.currentIdx++;
  184.             return self.current();
  185.         }
  186.     }
  187.  
  188.     var self = this;
  189.  
  190.     self.posts = [];
  191.    
  192.     self.isRunning = false;
  193.  
  194.     self.imageContainer = null;
  195.  
  196.     self.history = null;
  197.  
  198.     self.counter = 0;
  199.  
  200.     self.initHistory = function(){
  201.         self.history = new FgPostHistory(self.posts, function(post){
  202.             (new Image()).src = post.imageSrc;
  203.         });
  204.     }
  205.  
  206.     self.loadPosts = function(){
  207.         var postElements = jQuery("div.postContainer");
  208.         var allPosts = jQuery.map(postElements, function(e, i){
  209.            var postData = {
  210.                 imageSrc: jQuery(e).find("a.fileThumb").attr('href'),
  211.                 message: jQuery.trim(jQuery(e).find(".postMessage").text()),
  212.             };
  213.  
  214.             return new FgPost(postData);
  215.         });
  216.  
  217.         self.posts.length = 0;
  218.         for (var j = 0; j < allPosts.length; j++){
  219.             var singlePost = allPosts[j];
  220.             if (!singlePost.isSpam()){
  221.                 self.posts.push(singlePost);
  222.             }
  223.         }
  224.     };
  225.  
  226.     self.run = function(){
  227.         if (self.posts.length > 1){
  228.             self.isRunning = true;
  229.             var b = jQuery('body');
  230.             var centeredContainer = jQuery("<div style='display: table-cell; vertical-align: middle; text-align: center;' />")
  231.                                 .css({ height: jQuery(window).height(), width: jQuery(window).width() });
  232.             var imgContainer = jQuery("<div style='position: relative; top: 0; left: 0; display: inline-block; margin: auto; padding: 0;' />")
  233.                                 .click(function(){ self.changePost(); return false; });
  234.             var imgElement = jQuery("<img id='fgImage' style='margin: auto; text-align: center;' />")
  235.                                 .attr('height', jQuery(window).height());
  236.  
  237.             var msgContainer = jQuery("<div style='position: absolute; top: 0; left: 0; height: 50px; width: 100%; font-size: x-large; color: White; background-color: rgba(0, 0, 0, 0.7);' />");
  238.             jQuery("<div id='fgCounter' style='width: 30px; padding: 10px; font-family: Arial; float:left; font-weight: bold;' />")
  239.                 .appendTo(msgContainer);
  240.             jQuery("<div id='fgMessage' style='margin: 0px auto 0px auto; padding: 10px; font-family: Arial; font-weight: bold;' />")
  241.                 .appendTo(msgContainer);
  242.  
  243.             imgElement.appendTo(imgContainer);
  244.             msgContainer.appendTo(imgContainer)
  245.             imgContainer.appendTo(centeredContainer);
  246.  
  247.             jQuery("<div id='fgLayer' style='position: fixed; z-index: 10000; top: 0; left: 0; text-align: center; width:100%; height: 100%; background-color: rgba(0, 0, 0, 0.9);' />")
  248.                 .click(function(){
  249.                     self.isRunning = false;
  250.                     self.hide();
  251.                 })
  252.                 .append(centeredContainer)
  253.                 .prependTo(b)
  254.                 .on('fgNextImage', function(){
  255.                     self.changePost();
  256.                 });
  257.  
  258.             $(document).bind('keydown', function(e){
  259.                 if (e.keyCode == 38 || e.keyCode == 39 || e.keyCode == 40 || e.keyCode == 13){ // arrows up down right, enter
  260.                     self.changePost();
  261.                 }
  262.                 else if (e.keyCode == 8 || e.keyCode == 37) // arrow left & backspace
  263.                 {
  264.                     self.history.goBack();
  265.                     self.changePost(self.history.current());
  266.                 }
  267.                 else if (e.keyCode == 27){ // escape
  268.                     self.hide();
  269.                 }
  270.  
  271.                 return false;
  272.             });
  273.            
  274.             self.changePost();
  275.  
  276.         } else {
  277.             alert("No posts to go.");
  278.         }
  279.     };
  280.  
  281.     self.changePost = function(featuredPost){
  282.         var post = null;
  283.         if (featuredPost){
  284.             post = featuredPost;    
  285.         }
  286.         else{
  287.             post = self.history.goForward();
  288.         }
  289.  
  290.         self.counter = post.count;
  291.         var img = jQuery('#fgImage').attr('src', post.imageSrc);
  292.  
  293.         var fgCounter = jQuery('#fgCounter');
  294.         fgCounter.stop();
  295.  
  296.         var fgMessage = jQuery('#fgMessage');
  297.         var duration = Math.round(1000.0 / post.speed);
  298.  
  299.         var animation = function(){
  300.  
  301.             fgMessage.text(post.intensity);
  302.             fgCounter.text(self.counter)
  303.                       .css('font-size', '320%')
  304.                       .animate({ fontSize: '10%' }, duration, 'linear', function(){
  305.  
  306.                             self.counter--;
  307.  
  308.                             if (!self.isRunning){
  309.                                 return;
  310.                             }
  311.  
  312.                             if (self.counter > 0){
  313.                                 animation();
  314.                             } else{
  315.                                 jQuery('#fgLayer').trigger('fgNextImage');
  316.                             }
  317.                         });
  318.         }
  319.         animation();        
  320.     }
  321.  
  322.     self.show = function(){
  323.         self.loadPosts();
  324.         self.initHistory();
  325.         self.history.loadNext();
  326.  
  327.         if (jQuery('#fgLayer').length == 0){
  328.             jQuery("<input type='button' style='width: 200px; height: 80px; font-size: large; font-weight: bold;' value='Start' />")
  329.                 .click(function(){
  330.                     self.run();
  331.                 })
  332.                 .appendTo(jQuery(".opContainer"));
  333.         }
  334.     };
  335.  
  336.     self.hide = function(){
  337.         jQuery("#fgLayer").hide();
  338.     };
  339. }
  340.  
  341. var view = new FgView();
  342. view.show();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement