// ==UserScript==
// @name          LightBox for Hyperlinks
// @version       2.0
// @description	  Lightbox for Hyperlinks is a Greasemonkey user scripts for Firefox. It is design to open a hyperlink within a current page instand of jumping to a new page or opening a new window. The script will embed an IFRAME on the center of the page with a lightbox effect. Below the lightbox, there are two links available for you to choose: 'Open in new window' and 'Open in current window'.
// @namespace     http://webdev.yuan.cc/
// @include       http://www.bloglines.com/myblogs_display*
// @include       http://bloglines.com/myblogs_display*
// @include       http://del.icio.us/*
// @include       http://*.hemidemi.com/*
// @include       http://hemidemi.com/*
// @include       http://digg.com/*
// @include       http://www.technorati.com/*
// @include       http://technorati.com/*

// v1.0	08/22/06	initial release
// v1.5 09/01/06	Add Technorati support
// v1.5	09/01/06	Preserve 'href' attribute and add middle-click to open in new tab
//			Credit: kudo@cna.ccu.edu.tw
// v1.6 10/27/06	Fix close lightbox bug
//			Credit: Goston
// v2.0 03/28/07	Add post to HEMiDEMi and del.icio.us
//
// Author: .CK ( http://www.flickr.com/photos/ckyuan/ )
// Web site: http://webdev.yuan.cc/
//           http://flickr.tw/
//
// ==/UserScript==

(function() {

var site = '';
var re = /http:\/\/(www\.)?bloglines\.com\/myblogs_display/;
if( re.test(document.location) ) var site = 'bloglines';
re = /http:\/\/del\.icio\.us/;
if( re.test(document.location) ) var site = 'delicious';
re = /http:\/\/(www\.)?hemidemi.com/;
if( re.test(document.location) ) var site = 'hemidemi';
re = /http:\/\/digg.com/;
if( re.test(document.location) ) var site = 'digg';
re = /http:\/\/(www\.)?technorati.com/;
if( re.test(document.location) ) var site = 'technorati';
if( site == '' ) return;


if(unsafeWindow) w = unsafeWindow;
else w = window;
var global_photos = w.global_photos;

var external = 'data:image/gif;base64,R0lGODlhCgAKAKIFAGaZzDOZzJnM/wBmzABm/////wAAAAAAACH5BAEAAAUALAAAAAAKAAoAAAMlWFrUvgEsNklYZOhBBB5KVwhXxnhCA5gCkIIXOBKFXE+3su1LAgA7';
var open_in = 'data:image/gif;base64,R0lGODlhCgAKAKEDAABmzDOZzJnM/////yH+FUNyZWF0ZWQgd2l0aCBUaGUgR0lNUAAh+QQBCgADACwAAAAACgAKAAACG4SPIMtrEqIUL4w7AlUW64plGyRFY8MYYZi0BQA7';
var hd = 'data:image/gif;base64,R0lGODlhCgAKAKECAGN4If9mAP///////yH5BAEKAAIALAAAAAAKAAoAAAIdjA2ZhwohjACivggpjdVOCnUaiE0mJ20TEzgP4xYAOw==';
var delicious = 'data:image/gif;base64,R0lGODlhCgAKAKIAAAAAAN3d3QAA/////////wAAAAAAAAAAACH5BAEHAAQALAAAAAAKAAoAAAMZOKrSvcwJOOSEllrAefhf54GBCJCliJpoAgA7';
var close = 'data:image/gif;base64,R0lGODlhCgAKAKECAABmzFaY2v///////yH+FUNyZWF0ZWQgd2l0aCBUaGUgR0lNUAAh+QQBAAACACwAAAAACgAKAAACGoSPIMtrEsKK4sUrH7xObVopGGVJW9g0yVoAADs=';

function _gt(e) { return document.getElementsByTagName(e); }
function _gi(e) { return document.getElementById(e); }
function _ce(e) { return document.createElement(e); }
function _ct(e) { return document.createTextNode(e); }

function lightBox(url,title) {

    var disabledZone = _ce('div');
    disabledZone.id = 'disabledZone';
    disabledZone.setAttribute('style', 'background-color: #000000; -moz-opacity: 0.7');
    disabledZone.style.position = 'absolute';
    disabledZone.style.zIndex = 2500000;
    disabledZone.style.left = '0px';
    disabledZone.style.top = '0px';
    disabledZone.style.width = '100%';
    if( document.body.clientHeight==0 ) disabledZone.style.height = '300%';
    else disabledZone.style.height = document.body.clientHeight + 'px';
    disabledZone.addEventListener('click', function() {
//        delete document.body.removeChild(_gi('imgZone'));	by Goston
//        document.body.removeChild(_gi('imgZone'));
//        delete document.body.removeChild(this);
	closeBox();
    }, true);
    document.body.appendChild(disabledZone);

    var imgZone = _ce('div');
    imgZone.id = 'imgZone';
    imgZone.style.position = 'fixed';
    imgZone.style.zIndex = 2500001;
    imgZone.style.top = '50px';
    imgZone.style.background = '#ffffff';
    imgZone.style.height = '80%';
//    imgZone.style.left = (document.body.clientWidth-875)/2 + 'px';
    imgZone.style.left = '50px';
    var w = document.body.clientWidth -100;
    var h = document.body.clientHeight-200;
    imgZone.innerHTML = '<div style="text-align:right;padding:4px;background:#ddd;font-size:11px"><span style="float:left"><a href="'+url+'" target="_blank" title="Open in new window"><img src="' +external+ '" border="0" /></a> <a href="'+url+'" title="Open in current window"><img src="' +open_in+ '" border="0" /></a> <a href="javascript:;" onclick="add_delicious(\'' +url+ '\', \'' +title+ '\')" title="Add to del.icio.us"><img src="' +delicious+ '" border="0" /></a> <a href="javascript:;" onclick="add_hemidemi(\'' +url+ '\', \'' +title+ '\')" title="Add to HEMiDEMi"><img src="' +hd+ '" border="0" /></a> <a href="javascript:;" onclick="closeBox()" title="Close lightbox"><img src="' +close+ '" border="0" /></a></span><a href="http://webdev.yuan.cc/greasemonkey/lightbox.html" target="_blank">Powered by Yuan.CC</a></div>';
    imgZone.innerHTML += '<iframe src="'+url+'" width="'+w+'" height="100%" frameborder="0"></iframe>';
    imgZone.innerHTML += '<br /><div style="color:#1393c0;width:'+w+'px;overflow:hidden;text-align:left;padding:4px 0px 4px 0px;background:#ddd;font-size:11px">&nbsp;&nbsp;<b>'+url+'</b></div>';
    document.body.appendChild(imgZone);
}

w.closeBox = function() {
    document.body.removeChild(_gi('imgZone'));
    document.body.removeChild(_gi('disabledZone'));
}
closeBox = w.closeBox;

if( site == 'bloglines' ) {
    re = /^siteItem\.\d+\.\d+$/;
    var bookmarks = _gt('div');
    for(var i=0; i<bookmarks.length; i++) {
	var m = re.exec(bookmarks[i].id);
	if( !m || m.length == 0 ) continue;
	var id = m[1];
	var links = bookmarks[i].getElementsByTagName('a');
	for(var j=0; j<links.length; j++) {
	    if( links[j].className != 'bl_itemtitle' ) continue;
	    url = links[j].href;
	    links[j].title = url;
	    links[j].addEventListener('click', function(e) { 
		if (e && e.stopPropagation && e.preventDefault) {
		    e.stopPropagation();
		    e.preventDefault();
		}
		lightBox(this.title, this.innerHTML);
	    }, true);
	    var ext = _ce('img');
	    ext.src = external;
	    ext.alt = url;
	    ext.title = url;
	    ext.style.cursor = 'pointer';
	    ext.addEventListener('click', function() { window.open(this.alt); }, true);
	    links[j].parentNode.insertBefore(ext, links[j]);
	    links[j].parentNode.insertBefore(_ct(' '), links[j]);
	}
    }
}

if( site == 'delicious' ) {
    re = /^post$/;
    var bookmarks = _gt('li');
    for(var i=0; i<bookmarks.length; i++) {
	if(bookmarks[i].className!='post') continue;
	var links = bookmarks[i].getElementsByTagName('h4').item(0).getElementsByTagName('a').item(0);
	url = links.href;
	links.title = url;
	links.addEventListener('click', function(e) { 
	    if (e && e.stopPropagation && e.preventDefault) {
		e.stopPropagation();
		e.preventDefault();
	    }
	    lightBox(this.title, this.innerHTML);
	}, true);
	var ext = _ce('img');
	ext.src = external;
	ext.alt = url;
	ext.title = url;
	ext.style.cursor = 'pointer';
	ext.addEventListener('click', function() { window.open(this.alt); }, true);
	links.parentNode.insertBefore(ext, links);
	links.parentNode.insertBefore(_ct(' '), links);
    }
}

if( site == 'hemidemi') {
    re = /^b_(\d+)$/;
    var bookmarks = _gt('div');
    for(var i=0; i<bookmarks.length; i++) {
	var m = re.exec(bookmarks[i].id);
	if( !m || m.length == 0 ) continue;
	var id = m[1];
	var links = bookmarks[i].getElementsByTagName('a');
	for(var j=0; j<links.length; j++) {
	    if( links[j].className != 'title' ) continue;
	    event = links[j].getAttribute('onmouseover');
	    re2 = /[^']+'([^']+)'/;
	    m2 = re2.exec(event);
	    if(!m2) continue;
	    url = m2[1];
	    links[j].title = url;
	    links[j].href = url;
	    links[j].addEventListener('click', function(e) { 
		if (e && e.stopPropagation && e.preventDefault) {
		    e.stopPropagation();
		    e.preventDefault();
		}
		lightBox(this.title, this.innerHTML);
	    }, true);
	    var ext = _ce('img');
	    ext.src = external;
	    ext.alt = url;
	    ext.title = url;
	    ext.style.cursor = 'pointer';
	    ext.addEventListener('click', function() { window.open(this.alt); }, true);
	    links[j].parentNode.insertBefore(ext, links[j]);
	    links[j].parentNode.insertBefore(_ct(' '), links[j]);
	}
    }
}

if( site == 'digg' ) {
    re = /^enclosure\d+$/;
    var bookmarks = _gt('div');
    for(var i=0; i<bookmarks.length; i++) {
	if( !re.test(bookmarks[i].id) ) continue;
	var links = bookmarks[i].getElementsByTagName('h3').item(0).getElementsByTagName('a').item(0);
	url = links.href;
	links.title = url;
	links.addEventListener('click', function(e) { 
	    if (e && e.stopPropagation && e.preventDefault) {
		e.stopPropagation();
		e.preventDefault();
	    }
	    lightBox(this.title, this.innerHTML);
	}, true);
	var ext = _ce('img');
	ext.src = external;
	ext.alt = url;
	ext.title = url;
	ext.style.cursor = 'pointer';
	ext.addEventListener('click', function() { window.open(this.alt); }, true);
	links.parentNode.insertBefore(ext, links);
	links.parentNode.insertBefore(_ct(' '), links);
    }
}

if( site == 'technorati' ) {
    re = /^post$/;
    if( !_gi('results') ) return;
    var bookmarks = _gi('results').getElementsByTagName('li');
    for(var i=0; i<bookmarks.length; i++) {
	if(bookmarks[i].getElementsByTagName('h3') && bookmarks[i].getElementsByTagName('h3').item(0)) 
	    var links = bookmarks[i].getElementsByTagName('h3').item(0).getElementsByTagName('a').item(0);
	else if(bookmarks[i].getElementsByTagName('h4') && bookmarks[i].getElementsByTagName('h4').item(0)) 
	    var links = bookmarks[i].getElementsByTagName('h4').item(0).getElementsByTagName('a').item(0);
	else continue;
	url = links.href;
	links.title = url;
	links.addEventListener('click', function(e) { 
	    if (e && e.stopPropagation && e.preventDefault) {
		e.stopPropagation();
		e.preventDefault();
	    }
	    lightBox(this.title, this.innerHTML);
	}, true);
	var ext = _ce('img');
	ext.src = external;
	ext.alt = url;
	ext.title = url;
	ext.style.cursor = 'pointer';
	ext.addEventListener('click', function() { window.open(this.alt); }, true);
	links.parentNode.insertBefore(ext, links);
	links.parentNode.insertBefore(_ct(' '), links);
    }
}

w.add_hemidemi = function(bookmark_url, title) {

    if( title=='' ) var title = prompt('HEMiDEMi: input title of this post');
    if( title=='' || title==null) {
        alert('Must input title of this page');
        return;
    }
    var tags = prompt('HEMiDEMi: input tags of this page');
    if( tags == null ) return;
    if( tags == '' ) tags = title;
    var desc='';
    if(w.getSelection) desc = w.getSelection();

    var url = 'http://www.hemidemi.com/user_bookmark/create';
    var data = 'user_bookmark[title]='+ encodeURIComponent(title) + '&user_bookmark[url]='+encodeURIComponent(bookmark_url) + '&user_bookmark[quotes]=' +encodeURIComponent(desc)+ '&user_bookmark[description]=&user_bookmark[tag_string]=' +tags+ '&user_bookmark[group_string]=&user_bookmark[permission]=public';
//  GM_log(data);
    var resturl = 'http://www.hemidemi.com/services/rest/hemidemi.bookmark.add?' + data;
    GM_xmlhttpRequest({
        method: 'GET',
        url: resturl,
        headers: {
            'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
            'Content-type': 'application/x-www-form-urlencoded',
            'Accept': 'application/atom+xml,application/xml,text/xml',
            'Referer': url
        },
        onload: function(responseDetails) {
//          alert(responseDetails.responseText);
            var parser = new w.DOMParser();
            var dom = parser.parseFromString(responseDetails.responseText, "application/xml");
            var stat = dom.getElementsByTagName('rsp').item(0).getAttribute('stat');
            if( stat == 'fail' ) {
                var err = dom.getElementsByTagName('err').item(0).getAttribute('msg');
                alert(err);
            }
            if( stat == 'ok' ) {
                alert('Bookmark added successfully!');
            }
        }
    });
}
add_hemidemi = w.add_hemidemi;

w.add_delicious = function(bookmark_url, title) {

    if( title=='' ) var title = prompt('del.icio.us: input title of this post');
    if( title=='' || title==null) {
        alert('Must input title of this page');
        return;
    }
    var tags = prompt('del.icio.us: input tags of this page');
    if( tags == null ) return;
    if( tags == '' ) tags = title;
    var desc='';
    if(w.getSelection) desc = w.getSelection();

    var data = 'description='+ encodeURIComponent(title) + '&url='+encodeURIComponent(bookmark_url) + '&extended=' +encodeURIComponent(desc)+ '&tags=' +tags;
//  GM_log(data);
    var resturl = 'https://api.del.icio.us/v1/posts/add?' + data;
    GM_xmlhttpRequest({
        method: 'GET',
        url: resturl,
        headers: {
            'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
            'Content-type': 'application/x-www-form-urlencoded',
            'Accept': 'application/atom+xml,application/xml,text/xml',
            'Referer': url
        },
        onload: function(responseDetails) {
//          alert(responseDetails.responseText);
            var parser = new w.DOMParser();
            var dom = parser.parseFromString(responseDetails.responseText, "application/xml");
            var stat = dom.getElementsByTagName('result').item(0).getAttribute('code');
            if( stat == 'done' ) {
                alert('Bookmark added successfully!');
            } else {
                alert(stat);
	    }
        }
    });
}
add_delicious = w.add_delicious;
})();

