All pastes #753465 Raw Edit

Ayush

public javascript v1 · immutable
#753465 ·published 2007-10-29 08:28 UTC
rendered paste body
// ==UserScript==// @name		-	Snap Links - for opera// @author		-	Ayush// @version		-	1.4.9// @description	-	Select the links by drawing a box around links then leave the mousebutton to open the links in that box/region.//					Hold -Shift- key to select all links in rectangle and hold down -Alt- key while dragging to move rectangle. Hold Ctrl to select duplicate urls//					You can change the tab opening behaviour(in background tab,in new window etc.) by changing the Middle-Click settings (Shift+Middle-Click in opera)// ==/UserScript==//code based on ff extension but improved(function(opera,getSelection,addEventListener,selNode,getBoundingClientRect,window){var //..//	showStatus=1 , // show # of selected links in status bar	selAllLinks=0, // select all links	dupLinks=0,  // select duplicate links (links with same href)	inSameTab=0, // open the first or last link in same tab: 1=first link in same tab , -1=last link in same tab , 0=open all in new tabs	reqAltKey=0, // run script only when alt key is pressed	rectBorder='2px dashed #1E90FF', rectBG='transparent', linksOutline='1px solid #ef0006'//..//	;var mdown,outRect,elms,mdElm,updateTimeout,visElms,x,y,x2,y2,ctKey,shKey,scrTm,visMinY=-1,visMaxY=-1,docMaxX,docMaxY,winFocused=1,	lastTp,	events={		mousedown:function(ev){			if(ev.dynamicEvent)return;			sl.clear(0,0,1);			if(ev.which!==1 || ev.altKey!=reqAltKey || selNode.call(ev.target,'ancestor-or-self::node()[contains(",input,textarea,img,button,select,a,",concat(",",local-name(),",")) and (local-name()!="a" or @href)]'))return;			x=x2=ev.pageX;y=y2=ev.pageY;			//docMaxX=getComputedStyle(document.documentElement).width;docMaxY=getComputedStyle(document.documentElement).height;			mdElm=[ev.srcElement];mdElm.push(mdElm[0].offsetLeft,mdElm[0].offsetTop,mdElm[0].offsetWidth,mdElm[0].offsetHeight);			var cSty,pos;if((mdElm[0].tagName!='BODY' && mdElm[0].tagName!='HTML') && ((cSty=getComputedStyle(mdElm[0],null)).overflow!='visible' && cSty.overflow!='hidden') && ((((pos=sl.getPos(mdElm[0])).x+parseInt(cSty.borderLeftWidth,10)+mdElm[0].clientWidth)<ev.pageX && (pos.x2-parseInt(cSty.borderRightWidth,10))>ev.pageX) || ((pos.y+parseInt(cSty.borderTopWidth,10)+mdElm[0].clientHeight)<ev.pageY && (pos.y2-parseInt(cSty.borderBottomWidth,10))>ev.pageY)))return;			mdown=1;		},		mousemove:function(ev){			if(!mdown)return;			if(reqAltKey!=ev.altKey)				if(!reqAltKey){					x+=ev.pageX-x2;					y+=ev.pageY-y2;				}else					return(sl.clear());			x2=ev.pageX;			y2=ev.pageY;						ctKey=ev.ctrlKey;shKey=ev.shiftKey;						var rect=sl.getRealXY([x,x2],[y,y2]);			if(!outRect){				if( reqAltKey || ((rect.x[1]-rect.x[0])>4 && (rect.y[1]-rect.y[0])>10 && !getSelection().rangeCount)){					if(winFocused && mdElm && mdElm[1]==mdElm[0].offsetLeft && mdElm[2]==mdElm[0].offsetTop && mdElm[3]==mdElm[0].offsetWidth && mdElm[4]==mdElm[0].offsetHeight)						sl.createRect();					else						return sl.clear(0,0,1);				}else					return;			};			if(getSelection().rangeCount)getSelection().removeAllRanges();						sl.setRectSize(rect,docMaxX,docMaxY)						if(!updateTimeout)			 updateTimeout=setTimeout(function(){updateTimeout=null;sl.selLinks()},66);		},		mouseup:function(ev){			if(ev.which===1 && mdown){			  var linksOpened;			  ev.preventDefault();//ev.stopPropagation();			  sl.selLinks();			  if(elms && (!reqAltKey || ev.altKey)){			  	var mEv=document.createEvent('MouseEvent');mEv.initMouseEvent('mousedown',0,0,document.defaultView,1,0,0,0,0,0,0,0,0,1,null);mEv.dynamicEvent=1;				for(var iX=0,elm,link=!inSameTab?0:(inSameTab==-1?elms.pop():elms.shift());elm=elms[iX];iX++){					elm.dispatchEvent(mEv);					elm.style.outline="none";				}				if(linksOpened=(iX && showStatus)){					window.status=iX+" link" + (iX>1?'s':'') + " opened";					setTimeout(function(){status=''},1456);				}				if(link){ sl.clear();location.href=link.href;return }			  }			  sl.clear(0,0,linksOpened);			}		},		keydown:function(ev){			if(!mdown)return			var kc=ev.keyCode;			if(kc==16)				shKey=1;			else if(kc==17)				ctKey=1;			else{			  if(kc==27)				sl.clear();				//ev.preventDefault();			  return			};			sl.selLinks();		},		keyup:function(ev){			if(!mdown)return;			var kc=ev.keyCode;			if(kc==16)				shKey=0;			else if(kc==17)				ctKey=0;			else return;			sl.selLinks();		},		scroll:function(){			if(mdown && outRect){			  if(scrTm)clearTimeout(scrTm);			  scrTm=setTimeout(function(){				if(mdown)sl.createRect(lastTp,0,0,visElms,1);				sl.selLinks()			  },66+6);			}		},		blur:function(){			winFocused=0;		},		focus:function(){			winFocused=1;		}	},	sl={		clear:function(noOutRect,noElms,noStat,noMDown){			if(!noOutRect){				if(outRect){					outRect.parentNode.removeChild(outRect);					outRect=null;				}				if(!noMDown)mdown=ctKey=shKey=mdElm=0;			};			if(!noElms && elms){				for(var iX=0;iX<elms.length;iX++)					elms[iX].style.outline="none";				elms=null;			}			if(!noStat)status='';		},		createRect:function(loopElms,minY,maxY,addToElms,noNewRect){			if(!noNewRect){			  outRect=document.createElementNS("http://www.w3.org/1999/xhtml","outRect");			  outRect.style='border:'+rectBorder+';background:'+rectBG+';opacity:1;margin:0;padding:0;position:absolute;z-index:999;left:'+x+'px;top:'+y+'px;';			  (document.documentElement||document).appendChild(outRect);			};						minY=minY||pageYOffset;			maxY=maxY||pageYOffset+(document.documentElement.clientHeight);			if(visMinY==-1 || visMaxY==-1){				visMinY=minY				visMaxY=maxY			}else if(minY<visMinY){				maxY=visMinY;				visMinY=minY;			}else if(maxY>visMaxY){				minY=visMaxY				visMaxY=maxY;			}else return;						var elms=loopElms||document.links,i=0,elm;visElms=addToElms||visElms||{sizes:[],elms:[],pos:[]};			var eSty,elFS,pos;			var iX=0,cLnk,vEls=visElms.elms;			wOLoop:while(elm=elms[i++]){				if(addToElms)while(cLnk=vEls[iX++])if(cLnk==elm)continue wOLoop;				eSty=getComputedStyle(elm,null);				if(eSty.visibility=="hidden")continue;				pos=sl.getPos(elm);				if( pos.y2<minY || pos.y>maxY || pos.y2==pos.y || pos.x2==pos.x)					continue;				if((eSty=eSty.fontSize).indexOf('px')!=-1)elFS=parseFloat(eSty);else elFS=0;				visElms.sizes.push(elFS);visElms.elms.push(elm);visElms.pos.push(pos);			};			lastTp=loopElms;		},		setRectSize:function(rect,maxX,maxY,oRect){			var tmpsty=(oRect||outRect).style;			if(!maxX || rect.x[1]<maxX){			  tmpsty.setProperty('left',rect.x[0]+"px",'important');			  tmpsty.setProperty('width',(rect.x[1]-rect.x[0])+"px",'important');			}			if(!maxY || rect.y[1]<maxY){			  tmpsty.setProperty('top',rect.y[0]+"px",'important');			  tmpsty.setProperty('height',(rect.y[1]-rect.y[0])+"px",'important');			}		},		getPos:function(el,arr){			var pos;			if(getBoundingClientRect){				pos = getBoundingClientRect.apply(el);				pos = {x:pos.left,y:pos.top,x2:pos.right,y2:pos.bottom}			}else{				pos = {x:0,y:0,x2:el.offsetWidth,y2:el.offsetHeight};				while (el) {					pos.x += el.offsetLeft;	pos.y += el.offsetTop;el = el.offsetParent;				}				pos.x2+=pos.x;pos.y2+=pos.y;			}			return (arr?[pos.x,pos.x2,pos.y,pos.y2]:pos);		},		getRealXY:function(x,y){			return {x:(x[0]<x[1]?x:x.reverse()),y:(y[0]<y[1]?y:y.reverse())};		},		selLinks:function(allLinks,DupLinks){			if(!outRect)return;			var allLinks=allLinks || (selAllLinks?!shKey:shKey),DupLinks=DupLinks||(dupLinks?!ctKey:ctKey),dLinkStr={};			var rect=sl.getRealXY([x,x2],[y,y2]),X=rect.x[0],X2=rect.x[1],Y=rect.y[0],Y2=rect.y[1],			iX=-1,Elms=visElms.elms,Elm,Poss=visElms.pos,Sizes=visElms.sizes,			ePos,eX,eWid,eY,eHeight,sz,elNotInRect,largSz=0;elms=[];			while(Elm=Elms[++iX]){				ePos=Poss[iX];eX=ePos.x;eX2=ePos.x2;eY=ePos.y;eY2=ePos.y2;sz=Sizes[iX];				elNotInRect=(eY > Y2 || eY2 < Y || eX2 < X ||eX > X2);				if(elNotInRect || (!DupLinks && (Elm.href in dLinkStr))){					Elm.style.outline="";				}else{					if(!allLinks){					  if(largSz>sz){						Elm.style.outline="";						continue					  }else if(largSz<sz){						sl.clear(1);elms=[];largSz=sz					  };					};					Elm.style.outline=linksOutline;					elms.push(Elm);					if(!DupLinks)dLinkStr[Elm.href]=001;				}			};			if(showStatus)window.status='Links in selection: '+ elms.length;		}	};	if(opera && opera.addEventListener){	 opera.addEventListener('BeforeEvent.mousedown',function(mdev){ return function(ujsev){ if(ujsev.event.dynamicEvent){ ujsev.preventDefault();return } mdev(ujsev.event) } }(events.mousedown),false);delete events.mousedown;	 opera.addEventListener('BeforeEvent.mouseup',function(mdev){ return function(ujsev){ mdev(ujsev.event) } }(events.mouseup),false);delete events.mouseup;	};	for(var i in events)addEventListener(i,events[i],true);})(opera,getSelection,addEventListener,Node.prototype.selectSingleNode,null/*Element.prototype.getBoundingClientRect*/,window)