ImageFap enhancer

By louis4233 Last update Jul 8, 2009 — Installed 6,387 times.

There are 11 previous versions of this script.

// ==UserScript==
// @name          ImageFap enhancer
// @description	  enlarges thumbs, alternate gallery view, enhanced 'my clubs' page on ImageFap
// @include       *imagefap.com/*
// @require       http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js
// @require       http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.1/jquery-ui.min.js
// @require       http://layout.jquery-dev.net/download/jquery.layout.min.js
// ==/UserScript==
// imageFapThumbSize.user.js

    var visits = GM_getObject('visits',{});
    var jqLayout; // jQuery Layout-Object

    var pageTracker;
    var threadTimeout = 3000;
    var numThreads = 6;
    var chunksize=100;
    var piccontainer;
    var preload = new Array();
    var pics = new Array();
    var showtimer;
    var idxOffset = 0;
    var debugging=false;
    var randompage=window.location.href.match(/\/random\.php/);
    var gallerypage=window.location.href.match(/\/random\.php|\/gallery\/(.*)|\/gallery\.php\?p?gid=(.*)/);
	if( gallerypage && gallerypage[0] ) gallerypage = gallerypage[0].match(/[0-9]+/);
	    if( gallerypage && gallerypage[0] ) gallerypage = gallerypage[0];
	    else gallerypage = false;
    var myclubspage=window.location.href.match(/\/clubs\/myclubs\.php/)?true:false;
    var clubspage=window.location.href.match(/\/clubs\/index\.php\?cid=(.*)/);
    if( clubspage )
	clubspage=clubspage[1];

    insertCSS();
    main();


    function main() {
	log('payload started');
        resize_thumbs();
        relative_dates();
        if( gallerypage || randompage )
            create_alternate_gallery();
        if( myclubspage )
            enhance_myclubs();
        if( clubspage )
	    save_clubvisit( clubspage );
    }
    function showimg( pic, replace ) {
	$('img',thumbholder).css({borderColor:'#fff'});
	piccontainer.children().css({position:'absolute'}).attr('showing',0);
	piccontainer.show();
	showpic = $('[src='+pic.url+']');
	showpic.css({position:'static'})
 	       .attr('showing',1)
	       .unbind('click')
               .click(function(){
		   window.open(this.src);
               });
	$('img[src="'+showpic.data('thumb')+'"]').css({borderColor:'#f00'});
    }
    function resize_thumbs() {
	$('img').each(function () {
		var s = this.src.search(/\/images\/mini\//);
		if( s != -1 ) {
			$(this).replaceWith('<img border="0" src="'+this.src.replace(/images\/mini\//, "images/thumb/")+'">');
		}
	});
    }
    function relative_dates() {
	dateTimeReg=/([0-9]{2}:[0-9]{2}:[0-9]{2})|([0-9]{4}-[0-9]{2}-[0-9]{2})/;
	dateELs = $('center,span,td').filter(function(){
	    return $(this).children().length==0 && dateTimeReg.test(this.textContent || this.innerText || $(this).text() || "");
	});

	dateELs.each(function(){
		var $this=$(this);
		var $thisText = $.trim($this.text());
	        var values;	
		var postdate = new Date();
		var has_time = $thisText.indexOf(':') !== -1;
		var has_date = $thisText.indexOf('-') !== -1;
		var date_values = $thisText.split('-');
		var time_values = $thisText.split(':');
		if( has_date && has_time ) {
			values = $thisText.split(" ");
			date_values = values[0].split('-');
			time_values = values[1].split(':');
		}
		if( has_date ) {
			postdate.setFullYear( date_values[0] );
			postdate.setMonth( date_values[1] - 1 );
			postdate.setDate( date_values[2] );
		}
		if ( has_time ){
			postdate.setHours( time_values[0] );
			postdate.setMinutes( time_values[1]);
			postdate.setSeconds( time_values[2] );
		}

		var relative_to = new Date();
		var delta = parseInt((relative_to.getTime() - postdate.getTime() ) / 1000 );
//		delta = delta + (relative_to.getTimezoneOffset() * 60);

		var r = '';
		  if (delta < 60) {
			r = delta + 'seconds ago';
		  } else if(delta < (60 * 60)) {
			r = (parseInt(delta / 60)).toString() + ' minutes ago';
		  } else if(delta < (24*60*60)) {
			r = '' + (parseInt(delta / 3600)).toString() + ' hours ago';
		  } else if(delta < (48*60*60)) {
			r = '1 day ago';
		  } else if(delta < (31 * 86400)) {
			r = (parseInt(delta / 86400)).toString() + ' days ago';
		  } else {
			r = '' + (parseInt(delta / (86400 * 30))).toString() + ' months ago';
		  }
		$this.html( r );
		$this.attr('title',$thisText);
	});
    }
    function save_clubvisit( clubid ) {
	log('club '+clubid+' visited');
	dt=new Date();
	visits['club_'+clubid] = dt.getTime();
	GM_setObject('visits', visits); 
    }
    function create_alternate_gallery() {
	var numfound=0;
	$('<div id="south-pane" class="ui-layout-south"></div>').appendTo('body');
	if( gallerypage ) {
	   favlink = $('#gallery').next('a').eq(0);
	   serverPaging=$('#gallery font').eq(0);
           $(':contains(next)',serverPaging).eq(1)
               .addClass('fg-button ui-state-default ui-priority-primary ui-corner-all ui-icon ui-icon-triangle-1-e')
               .replaceWith('').appendTo(serverPaging);
           $(':contains(prev)',serverPaging).eq(1)
                .addClass('fg-button ui-state-default ui-priority-primary ui-corner-all ui-icon ui-icon-triangle-1-w')
                .replaceWith('').prependTo(serverPaging);

           $('.fg-button').hover(function(){ $(this).addClass("ui-state-hover"); }, function(){ $(this).removeClass("ui-state-hover"); });
           $('span',serverPaging).addClass('fg-left');

	   profileLinks = $('#menubar').appendTo('body').append(favlink);
           profileLinks.addClass('ui-layout-north');
	   serverPaging.appendTo('#south-pane');
           $('<div id="pagingtype">paging:<a href="/gallery.php?gid='+gallerypage+'&view=1">server</a> | <a href="/gallery.php?gid='+gallerypage+'&view=2">client</a></div>').appendTo('#south-pane');
	}
	thumbholder = $('<div class="ui-layout-east" id="east-pane"></div>')
			.appendTo($('body'));

	piccontainer = $('<div class="ui-layout-center" id="center-pane"></div>').appendTo($('body'));
        jqLayout=initLayout();
        setInterval(function() {
	    saveOpts={
		east:{size: jqLayout.state.east.size}
	    };
	    GM_setObject('layout',saveOpts);
	}, 1000);
	piccontainer.bind('DOMMouseScroll',function(e){
		var idx = 0;
                var dir = 0;
		$.each(pics,function(i,item){
			lookfor = $('img[showing=1]',piccontainer).attr('src');
			if( item.url == lookfor ) idx=i;
                });

		if( e.detail > 0)
			dir=1;
                  
		else if( e.detail < 0 )
			dir=-1;

		if( showtimer ) {
			clearTimeout( showtimer );
			idxOffset+=dir;
		}
		idx = idx + dir + idxOffset;
		if( idx > pics.length-1)
			idx=pics.length-1;
		else if( idx < 0 )
			idx=0;

		showtimer=setTimeout(function(){
			idxOffset = 0;
			showimg( pics[idx] );
			showtimer = false;
		},25);
			
	        $('img[src="'+pics[idx].thumb+'"]').get(0).scrollIntoView(false);
        });
	
	$('a[href*=image.php?id=]').each(function(){
	    $(this).appendTo(thumbholder);
            $(this).addClass('thumb thumb_initial');
	    var pic = $(this).find('img').eq(0);
	    if( pic.attr && pic.attr('src') ) {
	        var picurl = pic.attr('src').replace(/thumb/,"full" );
                var picobj = {pic:pic,url:picurl,thumb:pic.attr('src')};
		preload.push(picobj);
		pics.push(picobj);
		$(this).mouseover(function(){ showimg(picobj); return false; });
		numfound++;
	    } 
	});
	$('body > center:first-child').remove();
	if( numfound > 0 ) {
		infodiv=$('<div id="infodiv"></div>')
                         .appendTo('#south-pane')
                         .progressbar({ value:0});

		var prev = false;
		var pos_in_chunk=0;
		loadfunction = function( event, timeout ) {
                    log( timeout );
		    try{
		        if( $(this).data('prev') && !timeout ) {
			    $(this).data('prev').pic.parent().addClass('thumb_done').removeClass('thumb_loading');
			}
			$(infodiv).progressbar('option','value',(numfound-preload.length)/numfound * 100);
			if( pos_in_chunk++ < chunksize ) {
			    if(preload[0]) {
				var next=preload.shift();
				next.pic.parent().addClass('thumb_loading').removeClass('thumb_initial');
				var newthread = $(this).clone(true).appendTo(piccontainer)
                                   .data('prev',next).data('thumb',next.thumb)
                                   .attr('src',next.url);
                                setTimeout( function() {
                                    newthread.trigger('load',[true]);
                                },threadTimeout);
			    } else {
//				infodiv.empty().append('done.');
				setTimeout(function(){infodiv.hide();},500);
			    }
			} else {
			    if( !infodiv.data('waiting') ){
				infodiv.append('<br/>continue').bind('click',startLoads);
				infodiv.data('waiting',true);
			    }
			}
		    } catch(e){};
		}
		startLoads = function() {
		    pos_in_chunk=0;
		    infodiv.data('waiting',false);
		    for( var i=0; i < numThreads; i++ ) {
			setTimeout(function(){
                          var thread=img.clone(true).trigger('load');
                          setTimeout(function(){
                              thread.trigger('load',[true]);
                          },threadTimeout);
                        },i*100);
                    }
		}
		try {
			var img = $('<img>')
				   .css({'position':'absolute','left':'-5000px'})
                                   .css({maxHeight:'100%',maxWidth:'100%',marginRight:'255px'})
			           .appendTo(piccontainer);
                             
					
			img.bind('load', loadfunction );
			startLoads();
		} catch(e){ log(e); }
	}
    }
    
    function enhance_myclubs() {
	log( 'i has myclubs' );
        $( "td[width='100%'][valign='top'] table" ).each( function() {
	    var glink=$( "tr:nth-child(2) ;a[href*='clubs/index.php?cid=']", this ).attr( 'href' );
	    if ( glink ) {
		var gid = glink.match( /cid=(.*)/ )[ 1 ];
		var td = $( "tr:nth-child(2) td:nth-child(2)", this );
		var display = $( "tr:nth-child(2) td:nth-child(3)", this );
		td.append( '<div id="club_'+gid+'">');
		var gdiv = $( '#club_' + gid );
		gdiv.data( 'lastvisit', visits[ 'club_'+gid ] );
		gdiv.hide().load( glink + ' font span', {}, function()
                {
		    $('span',this).each(function(){
			if( gdate=this.innerHTML.match(/([0-9]+)-([0-9]+)-([0-9]+) ([0-9]+):([0-9]+):([0-9]+)/) )
			{
			    var clubid = $(this).parent().attr('id');
                            var lastvisit = $(this).parent().data('lastvisit');
			    var lastmod= new Date(gdate[1], parseInt(gdate[2])-1, gdate[3],gdate[4],gdate[5],gdate[6]);
			    display =$(this).parent().parent().parent().children();
			    log( clubid+' lastmod:'+ lastmod.getTime()+ ' lastvisit:'+ lastvisit );
			    if( lastmod.getTime() > lastvisit || lastvisit == undefined )
				display.css({background:'#FFE2C5'});
			    else
				display.css({background:'#e2FFC5'});
				
			    console.log( clubid+' lastvisit: '+lastvisit);
			    console.log( clubid+' lastmod: '+lastmod);
			    $(this).parent().parent().next().append(lastmod.toLocaleString());
			    return false;
			}
		    });
		});
	    }
        });
    }
function initLayout() {
    layoutSettings = { 
        north: {
	    initClosed: true
        },
        south:{
	    size: "30"
        },
	center:{ },
	east:{
	    size: "150"
        }
    };
    savedLayout=GM_getObject('layout',{});
    $.extend( layoutSettings, savedLayout);

    return $('body').layout( layoutSettings );
}

function log( something ) {
    if( debugging )
	console.log( something );
}
function GM_getObject(key, defaultValue) {
        return (new Function('', 'return (' + GM_getValue(key, 'void 0') + ')'))() || defaultValue;
}

function GM_setObject(key, value) {
        GM_setValue(key, value.toSource());
}

function insertCSS() {
    $('head').append('<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.1/themes/humanity/jquery-ui.css" rel="stylesheet" type="text/css">');
    $('head').append('<style id="GM_fapCSS" type="text/css">'+
                     '.fg-button,.fg-left {float:left;} '+
                     '.fg-left .link3, .fg-left b { margin:0 -1px};'+
                     '.clear { clear: both; height:0; line-height:0}'+
                     '.ui-layout-pane {'+
		     '    background: #FFF;'+
		     '    border: 0px solid #BBB; }'+
		     '.ui-layout-pane-east{ overflow-y: scroll }'+
	             '.ui-layout-resizer { background: #DDD; }'+ 
                     '.ui-layout-toggler { background: #AAA; }'+
                     '#south-pane { padding: 5px; font-family: "Arial narrow"}'+
                     '#infodiv { float: right;color:#aaa;background:#fff;width:300px;height:10px;}'+
                     '#pagingtype { float: right;margin-left: 20px;}'+
                     '.thumb { display: block; float: left; border: 1px solid #eee;}'+
		     '.thumb img { border: 3px solid #fff; display:inline; opacity:0; '+
                     '             maxWidth:120px; maxHeight:120px }'+
                     '.thumb_initial { background: transparent url(data:image/gif;base64,'+
			'R0lGODlhEAAQAPEAAP///wAAADY2NgAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdp'+
			'dGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAACLYSPacLtvkA7U64qGb2C6gtyXmeJ'+
			'HIl+WYeuY7SSLozV6WvK9pfqWv8IKoaIAgAh+QQJCgAAACwAAAAAEAAQAAACLYSPacLtvhY7DYhY'+
			'5bV62xl9XvZJFCiGaReS1Xa5ICyP2jnS+M7drPgIKoaIAgAh+QQJCgAAACwAAAAAEAAQAAACLISP'+
			'acLtvk6TE4jF6L3WZsyFlcd1pEZhKBixYOie8FiJ39nS97f39gNUCBEFACH5BAkKAAAALAAAAAAQ'+
			'ABAAAAIshI9pwu2+xGmTrSqjBZlqfnnc1onmh44RxoIp5JpWN2b1Vdvn/ZbPb1MIAQUAIfkECQoA'+
			'AAAsAAAAABAAEAAAAi2Ej2nC7b7YaVPEamPOgOqtYd3SSeFYmul0rlcpnpyXgu4K0t6mq/wD5CiG'+
			'gAIAIfkECQoAAAAsAAAAABAAEAAAAiyEj2nC7b7akSuKyXDE11ZvdWLmiQB1kiOZdifYailHvzBk'+
			'o5Kpq+HzUAgRBQA7AAAAAAAAAAAA) no-repeat center center; }'+
                     '.thumb_loading { background: transparent url(data:image/gif;base64,'+
'R0lGODlhEAAQAPQAAP///wAAAPj4+Dg4OISEhAYGBiYmJtbW1qioqBYWFnZ2dmZmZuTk5JiYmMbGxkhISFZWVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05F'+
'VFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAAFUCAgjmRpnqUwFGwhKoRgqq2YFMaRGjWA8AbZiIBbjQQ8AmmFUJEQhQGJhaKOrCksgEla'+
'+KIkYvC6SJKQOISoNSYdeIk1ayA8ExTyeR3F749CACH5BAkKAAAALAAAAAAQABAAAAVoICCKR9KMaCoaxeCoqEAkRX3AwMHWxQIIjJSAZWgUEgzBwCBAEQpMwIDwY1FHgwJCtOW2UDWYIDyqNVVkUbYr'+
'6CK+o2eUMKgWrqKhj0FrEM8jQQALPFA3MAc8CQSAMA5ZBjgqDQmHIyEAIfkECQoAAAAsAAAAABAAEAAABWAgII4j85Ao2hRIKgrEUBQJLaSHMe8zgQo6Q8sxS7RIhILhBkgumCTZsXkACBC+0cwF2GoL'+
'LoFXREDcDlkAojBICRaFLDCOQtQKjmsQSubtDFU/NXcDBHwkaw1cKQ8MiyEAIfkECQoAAAAsAAAAABAAEAAABVIgII5kaZ6AIJQCMRTFQKiDQx4GrBfGa4uCnAEhQuRgPwCBtwK+kCNFgjh6QlFYgGO7'+
'baJ2CxIioSDpwqNggWCGDVVGphly3BkOpXDrKfNm/4AhACH5BAkKAAAALAAAAAAQABAAAAVgICCOZGmeqEAMRTEQwskYbV0Yx7kYSIzQhtgoBxCKBDQCIOcoLBimRiFhSABYU5gIgW01pLUBYkRItAYA'+
'qrlhYiwKjiWAcDMWY8QjsCf4DewiBzQ2N1AmKlgvgCiMjSQhACH5BAkKAAAALAAAAAAQABAAAAVfICCOZGmeqEgUxUAIpkA0AMKyxkEiSZEIsJqhYAg+boUFSTAkiBiNHks3sg1ILAfBiS10gyqCg0Ua'+
'FBCkwy3RYKiIYMAC+RAxiQgYsJdAjw5DN2gILzEEZgVcKYuMJiEAOwAAAAAAAAAAAA==) no-repeat center center; }'+
                     '.thumb_loading img { opacity:0.5; }'+
                     '.thumb_done { background: transparent}'+
                     '.thumb_done img { opacity:1; }'+
                     '</style>');
}