YQ

By Jayanth Last update Dec 3, 2005 — Installed 8,863 times.

Add Syntax Highlighting (this will take a few seconds, probably freezing your browser while it works)

// ==UserScript==
// @name          YQ
// @namespace     http://yq.search.yahoo.com/
// @description   The power of Yahoo's YQ Search. Select text. Click on the icon. See Search Results.
// @include       *
// ==/UserScript==

var ogmYQOverlay = null;
var ogmYahoo = null;
var ogmYQLink = null;
var ogmYQImg = null;
var ogmSel = null;
var ogmX = null;
var ogmX1 = null;
var ogmX2 = null;
var ogmY = null;
var ogmY1 = null;
var ogmY2 = null;
var ogmTimeId = null;
var ogmInput = null;

var specialYDomains = new Array();
specialYDomains[specialYDomains.length] = "mail.yahoo.com";


if(!unsafeWindow.versionYQ || unsafeWindow.versionYQ() < "2.0") {
        window.addEventListener("mouseup",gmShowYQIconD,false);
        window.addEventListener("keydown",gmYQKeyDown,false);
}

function gmYQKeyDown(evt) {
        if(evt.keyCode == 65)
        {
		if(document.location)
		{
			if(document.location.toString().indexOf('http://yq.search.yahoo.com/yq/search?') != '-1') 
				return;
		}

                ogmX = self.pageXOffset + (self.innerWidth/2);
                ogmY = self.pageYOffset + (self.innerHeight/2);
                ogmX1 = self.innerWidth/2;
                ogmY1 = self.innerHeight/2;

                ogmYQLink = document.getElementById("yschyqlk");
               	if(ogmYQLink)
                       	window.setTimeout(gmShowYQIcon,0);
               	else
                       	window.setTimeout(gmShowYQIcon,500);
        }
	else if(evt.keyCode == 27)
	{
		var domainStr = document.domain;
                if(domainStr.indexOf('.yahoo.com.')=='-1' && (domainStr.indexOf('.yahoo.com')!='-1' || domainStr.indexOf('yahoo.com') == 0))
		{
		      ogmYahoo = null;
		      var isspydomain = false;
		      var ishttps = false;
		      for (var n in specialYDomains)
		      {
		          if(domainStr.indexOf(specialYDomains[n]) != '-1')
			  {
				isspydomain = true;
				break;
		          }
		      }

                      if(document.location.toString().indexOf('https://') == '0')
                        ishttps = true;

                      if(!isspydomain && !ishttps)
                      {
                        document.domain = 'yahoo.com';
                        ogmYahoo = 'yahoo.com';
                      }
		}

		if(ogmYahoo)
		{
			gmCloseYQ();
		}
	}

}

function gmCloseYQ() {
        if(!ogmYQOverlay)
	        ogmYQOverlay = parent.document.getElementById("yschyqifgm");

	if(ogmYQOverlay)
		parent.document.body.removeChild(ogmYQOverlay);
}

function gmOnloadYQOvl() {
		if(!ogmYQOverlay)	
			ogmYQOverlay = parent.document.getElementById("yschyqifgm");
                docHeight=ogmYQOverlay.contentWindow.document.getElementById('yschmarker').offsetTop;
                if(navigator.userAgent.indexOf("Firefox/1.5") != '-1')
                {
                        docHeight = docHeight + 2;
                }
                else
                {
                        docHeight = docHeight + 2;
                }

	        var moveX = ogmX;
		var moveY = ogmY;
                if((ogmY1 + docHeight) > parent.innerHeight - 30)
                {
                        moveY = ogmY - ogmY1 - docHeight + parent.innerHeight - 30;
			if(moveY < 25)
				moveY = 25;
                }

                if((ogmX1 + 354) > parent.innerWidth - 30)
                {
                        moveX = ogmX - ogmX1 - 354 + parent.innerWidth - 30;
                        if(moveX < 25)
                                moveX = 25;
                }
                ogmYQOverlay.style.top = moveY + "px";
                ogmYQOverlay.style.left = moveX + "px";
                ogmYQOverlay.setAttribute('height',docHeight);

		var oIcon = ogmYQOverlay.contentWindow.document.getElementById('yschyqresulticontb');
		oIcon.style.zIndex = 99999;
		// add moveability to open objects
		oIcon = ogmYQOverlay.contentWindow.document.getElementById('yschyqresulticontb');
		oIcon.addEventListener("mousedown",gmYQMouseDown,false);
		oIcon.addEventListener("mouseup",gmYQMouseUp,false);
		window.document.addEventListener("selectstart",function(){return false},false);
		oIcon.addEventListener("selectstart",function(){return false},false);
}

function gmYQMouseDown(evt) {
	if(!ogmYQOverlay)
        	ogmYQOverlay = parent.document.getElementById("yschyqifgm");
        var oIcon = ogmYQOverlay.contentWindow.document.getElementById('yschyqresulticontb');
	ogmX2=ogmYQOverlay.offsetLeft;
	ogmY2=ogmYQOverlay.offsetTop;
	ogmX1=evt.clientX;
	ogmY1=evt.clientY;
	oIcon.addEventListener("mousemove",gmYQMouseMove,false);
}

function gmYQMouseMove(evt) {
	if(!ogmYQOverlay)
        	ogmYQOverlay = parent.document.getElementById("yschyqifgm");
        ogmX2=evt.clientX+ogmX2-ogmX1;
        ogmY2=evt.clientY+ogmY2-ogmY1;
        ogmYQOverlay.style.left=ogmX2+"px"; // move it to new place
        ogmYQOverlay.style.top=ogmY2+"px";
	return false;
}

function gmYQMouseUp(evt) {
	if(!ogmYQOverlay)
        	ogmYQOverlay = parent.document.getElementById("yschyqifgm");
	ogmX2=evt.clientX+ogmX2-ogmX1;
	ogmY2=evt.clientY+ogmY2-ogmY1;
        ogmYQOverlay.style.left=ogmX2+"px"; // move it to new place
        ogmYQOverlay.style.top=ogmY2+"px";
	var oIcon = ogmYQOverlay.contentWindow.document.getElementById('yschyqresulticontb');
        oIcon.removeEventListener("mousemove",gmYQMouseMove,false);
}

function gmYQtextSelected(noesc) {
        var w=window;
        var str =null;
        var rng;
        if(w.getSelection) {
                str = w.getSelection(); 
        }
        else if(w.document.getSelection){
                str=w.document.getSelection();
        }
        else if(w.document.selection.type=="Text" ){
                rng=w.document.selection.createRange();
		str=rng.text;
        }

        if(str && str.toString().length > 512)
        {
	        str= str.toString().substring(0,512);
        }

        if(str && !noesc)
        {
                if(encodeURIComponent)
                        str = encodeURIComponent(str);
                else
                        str = escape(str);
        }

        return str;
}

function gmShowYQIconD(evt) {
	if(document.location)
	{
		if(document.location.toString().indexOf('http://yq.search.yahoo.com/yq/search?') != '-1')
			return;
	}

        ogmX = evt.pageX;
        ogmY = evt.pageY;
        ogmX1 = evt.clientX;
        ogmY1 = evt.clientY;

        ogmYQLink = document.getElementById("yschyqlk");
  	if(ogmYQLink)
		window.setTimeout(gmShowYQIcon,0);
	else
		window.setTimeout(gmShowYQIcon,500); 
}

function gmShowYQIcon() {
	if(document.location)
	{
		if(document.location.toString().indexOf('http://yq.search.yahoo.com/yq/search?') != '-1') 
			return;
	}

	var str = gmYQtextSelected(null);
        var searchStr = gmYQtextSelected('1');

        if(!str && ogmInput && document.getElementById('yschyqresult'))
        {
                return;
        }

	ogmYQLink = document.getElementById("yschyqlk");

	if(!str && !ogmInput)
	{
        	if(ogmYQLink)
        	{
                	document.body.removeChild(ogmYQLink);
                	if(ogmTimeId)
                        	window.clearTimeout(ogmTimeId);
        	}
		ogmSel = null;
	}

        if(!str && ogmInput)
        {
                if(ogmTimeId)
                        window.clearTimeout(ogmTimeId);
		if(ogmYQImg)
		{
                	ogmInput.removeChild(ogmYQImg);
			ogmYQImg = null;
		}
		ogmSel = null;
        }
	else if(str && (!ogmSel || str != ogmSel))
	{
	        if(ogmInput && document.getElementById('yschyqresult'))
        	{
                        if(!document.getElementById('yschyqlkold'))
                        {
                                ogmYQLink.id = 'yschyqlkold';
                                ogmYQLink = null;
                        }
        	}

		var strTitle = searchStr;
		if(strTitle.toString().length > 25)
			strTitle = strTitle.toString().substring(0,25) + '...';
                if(ogmYQLink)
                {
	                document.body.removeChild(ogmYQLink);
                	if(ogmTimeId)
                		window.clearTimeout(ogmTimeId);
                }

		ogmSel = str;
		//The text here seems to be UTF-8 encoded
		str = str + '&ei=UTF-8&sourceURL='+escape(document.location);
              	/* if(document.characterSet)
               	{
                       	str = str + '&ei='+escape(document.characterSet)+'&sourceURL='+escape(document.location);
               	}
               	else
               	{
                       	str = str + 'ei=UTF-8&sourceURL='+escape(document.location);
               	}*/

                var ogmYQEn = false;
                if(unsafeWindow.activateYQinl || unsafeWindow.activateYQ || unsafeWindow.versionYQ)
                        ogmYQEn = true;

		str = 'http://yq.search.yahoo.com/search?p='+str;

                var moveY = ogmY + 50;
                var moveX = ogmX + 50;

                if(ogmY1  > (self.innerHeight - 120))
                	moveY = ogmY - ogmY1 + self.innerHeight - 120;
                if(moveY < 0)
                        moveY = 0;

                if(ogmX1 > (self.innerWidth - 120))
                        moveX = ogmX - ogmX1 + self.innerWidth - 120;

                if(moveX < 0)
                        moveX = 0;
            
		if(ogmY1 < 0) 
			moveY = moveY - ogmY1;

                if(ogmX1 < 0) 
                        moveX = moveX - ogmX1;

		if(ogmYQEn)
		{
                        ogmYQLink = document.createElement("span");
                        ogmYQLink.id = 'yschyqlk';
                        ogmYQLink.className = 'yqlink';
                        ogmYQLink.name = 'yqlink';

                        ogmYQLink.setAttribute("style", "position:absolute;");

                        ogmYQLink.style.left = moveX + "px";
                        ogmYQLink.style.top = moveY + "px";

                        ogmYQLink.style.zIndex = 99998;
                        document.body.appendChild(ogmYQLink);

                        ogmYQForm = document.createElement('form');
                        ogmYQForm.id = 'yqin';
                        ogmYQForm.className='yqin';
                        ogmYQForm.name = 'yqin';
			ogmYQForm.action = 'http://yq.search.yahoo.com/search';
			ogmYQForm.method = 'post';
			ogmYQLink.appendChild(ogmYQForm);

                        ogmInput = document.createElement('input');
                        ogmInput.type = 'hidden';
                        ogmInput.name='p';
                        ogmInput.value=searchStr;
                        ogmYQForm.appendChild(ogmInput);

                        ogmInput = document.createElement('input');
                        ogmInput.type = 'hidden';
                        ogmInput.name='ei';
			if(document.characterSet)
				ogmInput.value=document.characterSet;
			else
				ogmInput.value='UTF-8';
                        ogmYQForm.appendChild(ogmInput);

                        ogmInput = document.createElement('input');
                        ogmInput.type = 'hidden';
                        ogmInput.name='eo';
                        if(document.characterSet)
                                ogmInput.value=document.characterSet;
                        else
                                ogmInput.value='UTF-8';
                        ogmYQForm.appendChild(ogmInput);

                        ogmInput = document.createElement('input');
                        ogmInput.type = 'hidden';
                        ogmInput.name='sourceOrder';
                        ogmInput.value='s,a,i,img,y,m';
                        ogmYQForm.appendChild(ogmInput);

                        ogmInput = document.createElement("a");
			ogmInput.href = str;
			ogmInput.title = "Yahoo! Search Results for " + strTitle;
			ogmInput.id = 'yschyqimglink';
			ogmInput.addEventListener("mousedown",function(event){ gmSubmitYQEn(event); } ,true);
			ogmInput.setAttribute('style','height:22px;width:36px;border:0;color:white;');

                        ogmYQImg = document.createElement("img");
                        ogmYQImg.id = 'yschyqimg';
                        ogmYQImg.className = 'yschyqimg';
                        ogmYQImg.name = 'yschyqimg';
                        ogmYQImg.src = "data:image/gif,GIF89a%1E%00%14%00%DD%00%00%D1%D1%D1%9A%00%B4%FE%FE%FE%DE%DE%DF%FD%FD%FD%E3%E3%E3%E0%E0%E1%F8%F8%F8%FB%FB%FB%DC%DC%DD%E9%E9%E9%F5%F5%F5%F3%F3%F3%EA%EA%EB%E5%E5%E5%F7%F7%F7%E7%E7%E7%ED%ED%EE%E8%D0%ED%F3%F3%EA%EE%EE%EF%D7%D7%D7%E9%E9%E2%F1%F1%F1%B5%B5%B5%AEP%C3%8E%8E%8E%D0%9E%DB%BDs%CC%A2%25%B8%C4%82%D1%EE%EE%E7%EE%EE%E6%EB%EB%E3%EE%E0%F3%B6c%C8%CA%92%D6%DB%B8%E4%F6%EE%F8%E2%C4%E8%A9%3D%BD%F0%F1%E8%F1%F3%E9%FF%00%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00!%F9%04%01%00%00%2B%00%2C%00%00%00%00%1E%00%14%00%00%06%FF%C0U%05%40%2C%1A%8FH%A4P!h%3A%9F%D0(T1%24X%AF%D8%ACvKDx%BF%E0%B0xL%3C%98%CF%E8%B4zM%7C%3C%26%13%89%A7%13%08t8%12%F8%A4%1Ep%FB%FF%0FD%0B%0B%13%25%7C%87%01%24p%7C%83%8D%8E%0BD%0C%0C%12%01%12M%12%19%87'%7B%01%23%92%9F%A0%0CD%17%17%1Cu%1E%02%1B%01%26%02%22%01%19*u%1B%A4%18%1A%B6%1A%18%A4D%14%14tu%25%02%1C%02%24%7C)%99%12%BC%14%B5%B8%C9D%11%11%BEu%22%A9%87%1F%23%01%1F%CF%CF%18%18%DA%11D%0D%0D%A6%7C%1B%02%87%19%1F%1E%E8%E1%EC%ED%0DD%0A%0A%94u%12%AC%22%AA%01'%20%FB%20%F1%FE%FF%0A%88%40%80%10%C2%10%A2%3A%24B%84%E8%14b%A0%C3%87%10%888p%60%C1%82%08%0F(%EA%DC%91P%D1%02%8A%0C%16%26%8A%1C%E9%80H%81%93(S%AA%5C%C9%92%88%81%970c%CA%9CI%93%C8%80%9B8s%EA%DC%C9%13%40%85%12%0A%09%82%0A%1DJ%B4(%D1%9FB%92(%5DZdE%10%00%3B";
			ogmYQImg.setAttribute("style", "border:none;");
                        ogmYQImg.style.zIndex = 99997;
			ogmYQLink.appendChild(ogmInput);
                        ogmInput.appendChild(ogmYQImg); 

                        ogmTimeId = window.setTimeout(gmRemoveYQIcon,5000);
		}
		else
		{
			//need onclick here, instead of event listeners, YQ popup has Javascript in it. set href for fallback
			ogmYQLink = document.createElement("a");
			ogmYQLink.id = 'yschyqlk';
			ogmYQLink.className = 'yschyqlk';
			ogmYQLink.name = 'yschyqlk';
			ogmYQLink.setAttribute('searchStr',searchStr);

			ogmYQLink.href=str;
			ogmYQLink.title = "Yahoo! Search Results for " + strTitle;
                        ogmYQLink.addEventListener("click",function(event){ gmSubmitYQ(event); return false; },true);
                	ogmYQLink.setAttribute("style", "position:absolute;");

                        ogmYQLink.style.left = moveX + "px";
                        ogmYQLink.style.top = moveY + "px";

			ogmYQLink.style.zIndex = 99998;

                	ogmYQImg = document.createElement("img");
                	ogmYQImg.id = 'yschyqimg';
                	ogmYQImg.className = 'yschyqimg';
                	ogmYQImg.name = 'yschyqimg';
			ogmYQImg.setAttribute("style", "border:none;");
                        ogmYQImg.src = "data:image/gif,GIF89a%1E%00%14%00%DD%00%00%D1%D1%D1%9A%00%B4%FE%FE%FE%DE%DE%DF%FD%FD%FD%E3%E3%E3%E0%E0%E1%F8%F8%F8%FB%FB%FB%DC%DC%DD%E9%E9%E9%F5%F5%F5%F3%F3%F3%EA%EA%EB%E5%E5%E5%F7%F7%F7%E7%E7%E7%ED%ED%EE%E8%D0%ED%F3%F3%EA%EE%EE%EF%D7%D7%D7%E9%E9%E2%F1%F1%F1%B5%B5%B5%AEP%C3%8E%8E%8E%D0%9E%DB%BDs%CC%A2%25%B8%C4%82%D1%EE%EE%E7%EE%EE%E6%EB%EB%E3%EE%E0%F3%B6c%C8%CA%92%D6%DB%B8%E4%F6%EE%F8%E2%C4%E8%A9%3D%BD%F0%F1%E8%F1%F3%E9%FF%00%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00!%F9%04%01%00%00%2B%00%2C%00%00%00%00%1E%00%14%00%00%06%FF%C0U%05%40%2C%1A%8FH%A4P!h%3A%9F%D0(T1%24X%AF%D8%ACvKDx%BF%E0%B0xL%3C%98%CF%E8%B4zM%7C%3C%26%13%89%A7%13%08t8%12%F8%A4%1Ep%FB%FF%0FD%0B%0B%13%25%7C%87%01%24p%7C%83%8D%8E%0BD%0C%0C%12%01%12M%12%19%87'%7B%01%23%92%9F%A0%0CD%17%17%1Cu%1E%02%1B%01%26%02%22%01%19*u%1B%A4%18%1A%B6%1A%18%A4D%14%14tu%25%02%1C%02%24%7C)%99%12%BC%14%B5%B8%C9D%11%11%BEu%22%A9%87%1F%23%01%1F%CF%CF%18%18%DA%11D%0D%0D%A6%7C%1B%02%87%19%1F%1E%E8%E1%EC%ED%0DD%0A%0A%94u%12%AC%22%AA%01'%20%FB%20%F1%FE%FF%0A%88%40%80%10%C2%10%A2%3A%24B%84%E8%14b%A0%C3%87%10%888p%60%C1%82%08%0F(%EA%DC%91P%D1%02%8A%0C%16%26%8A%1C%E9%80H%81%93(S%AA%5C%C9%92%88%81%970c%CA%9CI%93%C8%80%9B8s%EA%DC%C9%13%40%85%12%0A%09%82%0A%1DJ%B4(%D1%9FB%92(%5DZdE%10%00%3B";
                	ogmYQImg.style.zIndex = 99997;
                	ogmYQLink.appendChild(ogmYQImg);
			document.body.appendChild(ogmYQLink);
			ogmTimeId = window.setTimeout(gmRemoveYQIcon,5000);
		}
	}
} 

window.gmRemoveYQIcon = function() {
	ogmYQLink = document.getElementById("yschyqlk");
	if(ogmYQLink)
	{
		document.body.removeChild(ogmYQLink);
		ogmYQImg = null;
	}
	ogmSel = null;
}

function gmSubmitYQEn(evt) {
        if(ogmTimeId)
                window.clearTimeout(ogmTimeId);

	if(document.getElementById('yschyqlkold'))
		document.body.removeChild(document.getElementById('yschyqlkold'));

	if(ogmYQImg)
	{
		ogmInput.removeChild(ogmYQImg);
		ogmYQImg = null;
	}
	unsafeWindow.activateYQinl(ogmInput);
	return false;
}

function gmSubmitYQ(evt) {
	var ogmStr = null;
	var str;

        ogmYQLink = document.getElementById("yschyqlk");
        if(ogmYQLink)
        {
		ogmStr = ogmYQLink.getAttribute('searchStr');
		document.body.removeChild(ogmYQLink);
		if(ogmTimeId)
			window.clearTimeout(ogmTimeId);
        }

	if(ogmStr)
        {
                if(encodeURIComponent)
                        str = encodeURIComponent(ogmStr);
                else
                        str = escape(ogmStr);

	        ogmYahoo = null;

		var domainStr = document.domain;
        	if(domainStr.indexOf('.yahoo.com.')=='-1' && (domainStr.indexOf('.yahoo.com')!='-1' || domainStr.indexOf('yahoo.com') == 0))
        	{
		      var isspydomain = false;
                      var ishttps = false;

                      for (var n in specialYDomains)
                      {
                          if(domainStr.indexOf(specialYDomains[n]) != '-1')
				isspydomain = true;
                      }

                      if(document.location.toString().indexOf('https://') == '0')
                        ishttps = true;
			
		      if(!isspydomain && !ishttps)
		      { 
			document.domain = 'yahoo.com';
			ogmYahoo = 'yahoo.com';
		      }
        	}
		//The text here seems to be UTF-8 encoded
                str = str + '&_tb=gm&ei=UTF-8&sourceOrder='+escape('s,a,i,img,y,m')+ '&sourceURL='+escape(document.location);

                /*if(document.characterSet)
                {
                }
                else
                {
                        str = str + '&_tb=gm&ei=UTF-8&sourceOrder='+escape('s,a,i,img,y,m')+ '&sourceURL='+escape(document.location);
                }*/

		if(!ogmYahoo)
		{
	        	if(ogmYQOverlay)
                		ogmYQOverlay.close();

               		ogmYQOverlay = window.open('http://yq.search.yahoo.com/yq/search?_ext=1&p='+str,'_blank','width=353px,menubar=0,toolbar=0,personalbar=0,titlebar=1,status=1,height=329,location=0,resizable=1,scrollbars=0,directories=0,dependent=1,left='+ogmX+',top='+ogmY);
		}
		else
		{
			str = 'http://yq.search.yahoo.com/yq/search?p='+str;

                        ogmYQOverlay = window.document.getElementById("yschyqifgm")
                        if(ogmYQOverlay)
                                window.document.body.removeChild(ogmYQOverlay);

                        ogmYQOverlay = window.document.createElement('iframe');
                        ogmYQOverlay.id = 'yschyqifgm';
                        ogmYQOverlay.className = 'yschyqifgm';
                        ogmYQOverlay.name = 'yschyqifgm';
                        ogmYQOverlay.setAttribute('src',str);
                        ogmYQOverlay.setAttribute('scrolling','no');
                        ogmYQOverlay.setAttribute('frameBorder',0);
                        ogmYQOverlay.setAttribute('allowtransparency','true');
                        ogmYQOverlay.setAttribute('style','position:absolute;-moz-opacity:0.96;background-color:white;');
                        ogmYQOverlay.style.left = ogmX + "px";
                        ogmYQOverlay.style.top = ogmY + "px"; 
			ogmYQOverlay.setAttribute('height',316);
                        ogmYQOverlay.setAttribute('width',354);
                        ogmYQOverlay.style.zIndex = 999999;
                        ogmYQOverlay.addEventListener("load",gmOnloadYQOvl,false);
                        window.document.body.appendChild(ogmYQOverlay);
                        ogmYQOverlay.setAttribute('visibility','visible');
                }
	}
	return false;
}