Greasy Fork

Greasy Fork is available in English.

dA_Channel_Footer

displays a channel as footer on all pages

目前为 2014-12-21 提交的版本,查看 最新版本

// ==UserScript==
// @name        dA_Channel_Footer
// @namespace   dA_Channel_Footer
// @description displays a channel as footer on all pages
// @match     *://*.deviantart.com/*
// @exclude   *.deviantart.com/submit/*
// @version     1.1
// @grant       GM_xmlhttpRequest
// @grant       GM_addStyle
// @grant       GM_getValue
// @grant       GM_setValue
// ==/UserScript==

/*
unevinout[t_, order_] := 
 If[2 t/d < 1, c/2*(2 t/d)^order + b, 
   c/2*((2 t/d - 2)^order + 2) + b] /. {d -> 1, c -> 5, b -> 0}
evinout[t_, order_] := 
 If[2 t/d < 1, 
   c/2*(2 t/d)^order + b, -c/2*((2 t/d - 2)^order - 2) + b] /. {d -> 
    1, c -> 5, b -> 0}
Plot[{unevinout[t, 3], evinout[t, 8]}, {t, 0, 1}]
*/
var disablescroll=false;
var step=1;
var scrolInt;
// var DelayPerScroll=30;
var DelayOnRow=3000;
var channel=3;
var el;

if(typeof GM_getValue("disablescroll")!="undefined")disablescroll=GM_getValue("disablescroll");
if(typeof GM_getValue("channel")!="undefined")channel=GM_getValue("channel");

var parrowright="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAfCAYAAABtYXSPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAANOgAADToBAyIehQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAZFSURBVFiFpZhNbFxXFYC%2Fc899b2zXceL4N%2FFfPBEtSpqUKNDUoQqFRIDaJl1EiVRBEbuwqCBig2CDWAEbiiLRBRUgVWKDQCigboB2ARGCqnHkuC41kImdNjEeN3bs2J6%2F9%2B5l8cbjGXsySZ0jjc79OfPON%2BeeufeeJ9576omcFW29yxlRXkLY74VBBMGACGCAshZZb9cZ8wg3MEwAry8u8lv%2FGx%2FX9VkPpvl5SVvPGxg%2BSfmh1liMMYgBjCACoommrMUIYhJNWTtx5EqrFUhveB%2FPc3de9Zn7wrSckkHr%2BKs3DKVcM52ulx12Jy2pJsIwJEwFhKmw%2FEnaqVT1%2BIb5MMSbmOsLGf4y%2BWem56dAmMZwbP6n%2Fka1b1MDclL6FN7yylBzqZW%2B5WG2xdtRtO5SPqg0BU08MfApvvPsd%2Fn03s%2BAMmQsb3V%2BW%2FrqwnQ8K21qeBPD3lSxmZ2LvQ8FUE%2BMGM597hsc2nMIL%2Bz1AW92%2FEDaNsGUAs6J8lhQCGnLdiFePrazOwuLfDQ739BGjfLNE%2BfZ178PUR4zRc7VwMhZUW95GYWmubYtgQBkpqb5x6XLzM3ebmgXaMBLR7%2BeJLTyspwVrcC0Ok6LMmhWAzQXbAkEwFoLz8Do6FXm5xYa2qY70%2Bzv348og10HOF2BEeW8KNhs85ZBANQqvg%2BWXlzh8ugYC7cXG9qffOLU2t50HsC0flUOiDJCwWAWwoeCsdYiGArdEdnn7nBldJylO3fvaf%2Fk4BF2t%2B8CZaT3x3LAqucgCrJgK0axjclToBRH5AsFbKRoQVFVrDUYtVib9FUNWm5LLPgU%2BAhyXUVuHMvS9M44R48epqNr5yYYEeGp9FF%2B%2F%2B7v8MpBiyUtAhTWtxwNle3fSyE9Ak7wDnDgfUwUx3gfU%2FCUxwUcOA%2FeQ6k5xsfgY7jbkeM%2Fhz6k%2BUoTIyOHCVObI9%2Fd1o0oIKStCMMYIL8OEwQB0m6gPXHoY%2FDOl7XgY5eMV%2BY26Kr2nR2rTDw6RfNYiiNPHSZM1f5Bult7QEGEYUNAWhTIr%2F%2Bdg9AmEYmTkCda8LGs96vmXARuTVe3Y8FFkG1dYnT3NcbGJsiv5jfAdCfnnZI2YkijQK4qMjbY4ESqHGx2WgtdBzyCW03zvL3931wdf59CvlADg5ZhMOwCIFqPjA0teKl68AZnFadshixHw9WZu25nydgZpqdvVny1BI%2BQCkPEsMuIMiMBEKyf3kEQ4J1p%2BOBKVB5gGdf03qiPx1NphocHKr5WSysUKYIyY1EyCAPS4iC%2FBlPOmWhDcm5IVFfpS%2F1krmqn3S6%2B3PQkj35imCBcT%2BLsanYtgTNGlIwo8EhVZMoJXBOFOpGpicY9ltHHMOx6eb5lhOGh%2FuSHVslcLoskZ1TGiiHjDdDqoHy%2B2SAgWArwkYAniZIHvJT3G8G7ZM676jHPoqzWRGiP9PJC69P0dnUmZ9cGyeZnQUGVjHWWjBGQba5ikLubo%2F9vPRjVqp1WUatYVdSaSl%2FVVnbhJpviT8FlptwsPoYh08PptmO0b2tDtf4FbS6fRRS8IWMFxjAgeyKYSAw%2BmLzJ7NRczRUyVb5CNrp2%2Bp0hKUJcBIPaw9n2z9MSNGFM%2FSuJ9563P%2Fo7KDjHmLn9Iz8hlktmh4OBYt0vPaisHZQD2s1XOr9AKJuXpVremf8n%2FyvMIIZLMy%2F6CQPgDa9gwO%2FPPRSMWmUg7OFr3V%2FEF8A519D%2BjVsXEQWxvALl%2B8ztfVwUZUp2lfAdpS3DWGv5bPvjFO4WiKKooe311f8yufIeKFMfRlyswPgzPvbKBRSiI0tg6xd295PVxVXms%2FMUC42Xu%2BgK%2FPrmr5JjQLjgzyRFXeVAkgKviWXC9xbJPZMF8%2FGBivki%2BVyhoU3kI1699ROu5ScRZaJY5LW1uQpM9vt%2BGctxlEnXn2f56RmQrUXoXuJw%2FHLuZ%2FwrPw6WycBxPHvGL2%2BCAZj9lp%2BNPccxXCsNrTB%2FYorc7kXisPH6309W%2FDITpTEuzP%2BQ8eIVMFzDcTxzys9W29Wttft%2BLoMO%2FggcXKuR1RlEzHphb9bq7OT6mIzVtjGCl5iSKbFWs4vhamw5efNEbWl7TxgAQWT3L3jBm%2BQtBMlbCLPuKHk4lPvVbyGkZswh3BDDBMLrH3yJP3jqO%2F0%2FRtYcbfQ6dMsAAAAASUVORK5CYII%3D";
var parrowleft="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAfCAYAAABtYXSPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAANOgAADToBAyIehQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAZWSURBVFiFrZhdbBxXFYC%2Fc%2B%2FMru04Thon%2FokTO96AgmKcpBUQkgCNFCNKIalElSCUVkK8hIcKIl4QT4gn4IWiSPSBCJAq8YKKIEDhoTQqJC39iQhJujRGzcZxflyv4%2F9d79%2FMPTzM7tgbrxNSc6XVOXt35pxPZ%2B6cnxVVpdGSY2Jb5zkqlmcRBlToRRAMiAAGqEqRRb3BniKMYkgDL87O8pL%2BRsOGPhvBNH9ZUp7yMoaPUTXqGQ9jDGIAI4iA2EhSlWIEMZGkKp04CpWFGFINV1G%2BNPOCZh4I03JEej3H39XQl3TNbHRdrPc20JJsIpFIkEj6JJKJ6sePZXLZXlVPJFATcn06w1%2BHX%2BHG1AgINzB8buqnOrrUt6kDOSw9Fs6qpa%2B50kpPrp%2B14TostuGj%2FF9Xk9%2FE7q17%2BO6T3%2BMT2z8Jlj7jcXbjd6SnIUz7k9JmDa9i2J4sN7NhtmtVAI2WEcOJx7%2FJo9seRYXt6vNq%2Bw%2BkbRlMxeeEWHb4pQRt2U2Iyn0N5%2BcXyOXzDw1kjeVbQyfZuWUnYtlhypyog5FjYtXjOSw0TbQ9EKRYKHHr1m0mJicfGgbAtz7P7v96dKAtz8kxsTFMq%2BNpsfSaBR9b8O9rKAhCpvOzcFDwvA9%2FllIbUwxsGUAsvZsGeTqGEctJseBlmx9opKQl8s8U0B5WBQNwePeRWm46CWBan5FBseyjZDDTiRVvtNZiWyyTT81T6ggQDNbzVgXzqd69bH6kGyz7un4sg55VdmFBplc2nEj4tHWsJbN%2FjMKmMhKAJiEshYzcHMU5h3MOdYpzjtA51DnCUHHqcGH03aniQsfAnh1848RxRIRPp%2Fbzu3d%2Fi1p2eXikRICSaQjS1JykO9XJ1d2jzLcXkADEQr67RPn4XUTA1EqB0ShDC4g4sLXSEe0bo8i48v7p67H9jrYOxAJCyhOhHwMUl8M0r2nmI7tSvPvR68ysX0ACwAIayUpTGKV%2FS72MdY33sNVyURZ8f%2FEl6WjtrEH3e%2FikBNBi%2Feu8prWFPQc%2BzsWea2Rb56oREUSrDnSJUwWzBBKt6VKVGv8mTvAT3hKYjmq9I%2BWJIYUABUMt67euXcOBJ%2Fbyzob%2FcKdp6p6IVB0YrYuSUxpCRlIQqxF0CJ7n18FgqzAYulEgkBhmz4FBxtbNMOJl4zMiy5zdEyUb8WHqH%2BWilOgCrY9Mi7%2BGZCJB2ZW7jVjGxAf8xer9r9ev0F%2FpJFXZjIagAfUy1gUNJP7uAnDhCjIAFwrqTN2ZWajkKVMGy5jBksGCtLj4gtx8nrO%2FP8fj4SD9YfcKhpdKifVl4EG9jhN8fzEy2YVsdJYsGSOWjFhgTX1fk5vL87c%2Fvc6QPMY219XQcP1eFKWGkVmic88BnihkkahGZTwxZNQArQ7uqXvzsznO%2F%2BVNvnj4AH%2BuvM1I8EHdGVkXtESvq2i1s9MoxxiN9xCNcw0C%2FoKHt%2BQxZYvjYMFaMp7zyBgBWetotOZm5nnzlQsceWIfZ4pvcCOIbu7TTj5ffoxipRRlX9U4EztVtJZ93dLsq6g6ulOLvdJEMYtYUEPGE7iEAdkWQLohD7PTc1x47Z98ZeizvJQ7x2gwTjKRoFgqMjM%2BF7edTckkiZblbWeyQasKoKq8ffeNKDU4LpnJH2laPM6b9Q62lhvTADNTc1w8d5mvrj%2FIVtuBYPBWWSgvTL3FB6UxxHB%2B7GuaNgBqeB4DOlC4780zk7Nc%2BUea4%2B1DbE10YlfZQrx850x0Bj2eh2o%2FM7mTM2IZke4K2l65r4HpuzO8985V9j8ysKrIXF94n%2BH8v8EycivgTAyjRzVUyyksBHvnwGs82NXW1N0ZLr%2BVJntz4kOBlF2JX9%2F%2BVZSZhVN6NBrq4lItJU6LR1q7yhQOZqu5feU1MzVHfn7hoUECDXjhzk%2B4VhxGLOlymdO132KY7Pc1h8chLMNuS5HcZ8aihPJ%2FXA7HLyd%2BxnvFK%2BAx7DsOZY9qbhkMwPi3dTxUDmG4VunLMzU0QmHzLGEiWBVEXnOkK5c4NfVDrpQvguEajkOZIzq%2B9LqGs3bPz6XXwR%2BBXbUZ2TqDiFkc7E1tzgaR2mxdr2MElZCKqVCb2cVwOfQ4fHuofrRdEQZAENn8C55SE%2F0LQfQvhFl0FBkH4lYz3pO6PYcwKoY0wos3v8AflMZO%2FwsjfeNAp4cpIwAAAABJRU5ErkJggg%3D%3D";

var aktpos=0;
var sscroll;
function shuffle(array) {
  var currentIndex = array.length, temporaryValue, randomIndex ;
  while (0 !== currentIndex) {
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;
    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }
  return array;
}
function scrollto(el,start,end,time){
	// el.scrollLeft=start;
	var t=0;
	var dt=(end-start)>0?1:(end==start)?0:-1;
	clearInterval(sscroll);
	
	sscroll=setInterval(function(){
		//LeftV[t_] := start + (1.1*ArcTan[(time - totaltime/2)/(totaltime/10)]/(0.78*\[Pi]/2) + 1)*(stop - start)/2
		// var fac1=( 0.78 * Math.PI / 2);
		// var fac2=Math.atan((t-time/2)/(time/5)*1.1);
		// var fac3=(end-start)/2;
		// el.scrollLeft=start+fac3*(fac2/fac1 +1);
		if(t<time){
			var fac1=(end-start)/2.0;
			var fac2=2.0*t/time;
			el.scrollLeft=fac1*(fac2<1?Math.pow(fac2,3):+1*(Math.pow(fac2-2,3)+2))+start;
			// If[2 t/d < 1, c/2*(2 t/d)^order + b, -c/2*((2 t/d - 2)^order - 2) + b]
			t++;
			// console.log(el.scrollLeft,start,end,t,time,dt,fac1,fac2);
		}
		// if(el.scrollLeft-start<Math.abs(end-start)/2)
			// el.scrollLeft=start+Math.sign(end-start)*Math.pow(t,2);
		// else
			// el.scrollLeft=start+Math.sign(end-start)*Math.pow(t-Math.abs(end+start),2);
			
			 // console.log(fac2,fac3*(fac2/fac1 +1),start,end);
		 // console.log(el.scrollLeft,start,Math.abs(end-start)/2);
		if(t>=time||(dt==1&&el.scrollLeft>=end)||(dt==-1&&el.scrollLeft<=end)){
			// console.log(el.scrollLeft,end,fac1,fac2,dt);
			clearInterval(sscroll);
		}
	},20);
}
function scroller(){
	if(disablescroll){return;};
	var ul = el.getElementsByClassName('tt-a');
	if(ul.length==0)return;
	scrollto(el,el.scrollLeft,ul[aktpos].offsetLeft,50);//50 ticks, 20ms per tick -> 1s per animation
	// console.log(aktpos,step,el.scrollLeft,ul[aktpos].offsetLeft);
	if(ul[aktpos-0].offsetLeft>=el.scrollWidth-el.clientWidth)step=-1;
	if(aktpos==0)step=1;
	aktpos+=step;
}

GM_addStyle("#dA_Channel_Footer {height: 220px; overflow-y: hidden; overflow-x: hidden;text-align:left;white-space: nowrap;}"+
"#dA_Channel_Wrapper img.buts{position:absolute;cursor:pointer;position: absolute;margin-top:10px;}"+
"#dA_Channel_Wrapper img.leftbut{left:10px;}"+
"#dA_Channel_Wrapper img.rightbut{right:10px;}"+
"#dA_Channel_Wrapper div.channelHeader>a, #dA_Channel_Wrapper div.channelHeader>div {display:inline-block;float:none;}"+
"#dA_Channel_Footer div.stream>div{width:200px;white-space: normal;}"+
"#dA_Channel_Footer a.thumb{margin:auto!important;}"+
"#dA_Channel_Footer_scrolling,#dA_Channel_Footer_Ch{cursor:pointer;}"+
"");
function start(data){	
	var text=data.responseText;
	var channels=[]; //0: garbage. after that: index
	var Pos=text.indexOf('<div class="channelHeader"');
	
	while(Pos!=-1){
		channels.push("<"+text.substring(0,Pos))
		text=text.substring(Pos+1);
		Pos=text.indexOf('<div class="channelHeader"');
	}
	Pos=text.indexOf('<div id="slots-preload"');
	channels.push("<"+text.substring(0,Pos));
		
	if(channel>channels.length-1)channel=channels.length-1;
		
	el=document.createElement("div");
	el.id="dA_Channel_Footer";		
	el.innerHTML=channels[channel];
	
	var ul = el.getElementsByClassName('tt-a');
	if(ul.length>0&&typeof ul[0].parentNode!="undefined")
		for (var i = ul.length; i >= 0; i--) {
			ul[0].parentNode.appendChild(ul[Math.floor(Math.random() * ul.length)]);
		}	
	
	var wel=document.createElement("div");
	wel.id="dA_Channel_Wrapper";
	var channelheader=el.getElementsByClassName("channelHeader")[0];
	var img;
	img=document.createElement("a");
	img.id="dA_Channel_Footer_scrolling";
	img.onclick="return false;";
	img.innerHTML=disablescroll?"enable scrolling":"disable scrolling";
    if(typeof channelheader=="undefined"){channelheader=document.createElement("div");channelheader.className="channelHeader";}
	channelheader.appendChild(img);
	img.addEventListener("click",function(){
			disablescroll=!disablescroll;
			GM_setValue("disablescroll",disablescroll);
			document.getElementById("dA_Channel_Footer_scrolling").innerHTML=disablescroll?"enable scrolling":"disable scrolling";
			if(disablescroll)clearInterval(scrolInt);else scrolInt=setInterval(scroller,DelayOnRow);
		},false);
	img=document.createElement("a");
	img.id="dA_Channel_Footer_Ch";
	img.onclick="return false;";
	img.innerHTML="Channel: "+channel;		
	channelheader.appendChild(img);
	img.addEventListener("click",function(){
			channel=parseInt(prompt("Insert the channel-Index you would like to display!\nTo display the first Channel, use 1, 4th: 4 etc.\nTo see or change your current channel-settings, visit http://www.deviantart.com/channels/"));
			if(channel<1||isNaN(channel))channel=1;
			if(channel>channels.length-1)channel=channels.length-1;	
			GM_setValue("channel",channel);
			disablescroll=true;
			aktpos=0;
			clearInterval(scrolInt);
			clearInterval(sscroll);
			var wel=document.getElementById("dA_Channel_Wrapper");
			wel.parentNode.removeChild(wel);
			start(data);
		},false);
	img=document.createElement("img");
	img.className='leftbut buts';
	img.src=parrowleft;
	channelheader.appendChild(img);
	img.addEventListener("click",function(){
			if(aktpos>0)aktpos--;
			if(typeof ul[aktpos]=="undefined")return;
			step=-1;
			disablescroll=true;
			GM_setValue("disablescroll",disablescroll);
			document.getElementById("dA_Channel_Footer_scrolling").innerHTML="enable scrolling";
			scrollto(el,el.scrollLeft,ul[aktpos].offsetLeft,25); //25 ticks, 20ms/tick = 0.5s animation
		},false);
	img=document.createElement("img");
	img.className='rightbut buts';
	img.src=parrowright;
	channelheader.appendChild(img);
	img.addEventListener("click",function(){
			console.log(aktpos,ul[aktpos],ul.length,ul[aktpos].offsetLeft,el,el.scrollWidth-el.clientWidth);
			if(aktpos<ul.length-1&&ul[aktpos].offsetLeft<el.scrollWidth-el.clientWidth)aktpos++;
			if(typeof ul[aktpos]=="undefined")return;
			step=1;
			disablescroll=true;
			GM_setValue("disablescroll",disablescroll);
			document.getElementById("dA_Channel_Footer_scrolling").innerHTML="enable scrolling";
			scrollto(el,el.scrollLeft,ul[aktpos].offsetLeft,25);
		},false);
	
	wel.appendChild(channelheader);		
	wel.appendChild(el);
	document.getElementById("depths").insertBefore(wel,document.getElementById("depths").firstChild);

	 scrolInt=setInterval(scroller,DelayOnRow);
}
GM_xmlhttpRequest({
	url:"http://www.deviantart.com/channels",
	method: "get",
	onload:start
});