// from http://www.kryogenix.org

// by Scott Andrew - http://scottandrew.com

// add an eventlistener to browsers that can do it somehow.

function addEvent(obj, evType, fn)

	{

	if (obj.addEventListener)

		{

		obj.addEventListener(evType, fn, false);

		return true;

		}

	else if (obj.attachEvent)

		{

		var r = obj.attachEvent('on'+evType, fn);

		return r;

		}

	else

		{

		return false;

		}

	}



function floatImages()

	{

	// adapted from http://www.dithered.com/javascript/browser_detect/

	//**************************************************************//

	// sniff user agent

	var userAgent = navigator.userAgent.toLowerCase();



	// if Mozilla 1.4 then quit

	if ((userAgent.indexOf('gecko') != -1) && (userAgent.indexOf('gecko/') + 14 == userAgent.length) && (parseFloat(userAgent.substring(userAgent.indexOf('rv:') + 3)) == '1.4')) return;



	// if Opera then quit

	if (document.all && window.Event) return;

	//**************************************************************//



	// check this browser can cope with what we want to do

	if (!document.getElementById) return;

	var blogDiv = document.getElementById('blog');

	if (!blogDiv) return;

	if (!blogDiv.offsetWidth) return;



	blogDiv.className = (blogDiv.offsetWidth >= 500) ? "float-images" : "block-images";

	}



// Blockquote citations



// Simon Willison's work:

// http://simon.incutio.com/archive/2002/12/20/#blockquoteCitations



// Also Dunstan Orchard's work:

// http://1976design.com/blog/archive/2003/11/10/updates/

function blockquoteCite()

	{

	if (!document.createElementNS)

		{

		document.createElementNS = function(ns, elt)

			{

			return document.createElement(elt);

			}

		}

	quotes = document.getElementsByTagName('blockquote');

	for (i = 0; i < quotes.length; i++)

		{

		var cite = quotes[i].getAttribute('cite');

		// value of cite attribute should only contain URI, not any other

		if ((cite) && (cite != ''))

			{

			newlink = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');

			newlink.setAttribute('href', cite);

			newlink.className = 'cite-link';

			newlink.appendChild(document.createTextNode(cite));

			newdiv = document.createElementNS('http://www.w3.org/1999/xhtml', 'cite');

			newdiv.className = 'blockquote-cite';

			newdiv.appendChild(document.createTextNode('Source: '));

			newdiv.appendChild(newlink);

			quotes[i].appendChild(newdiv);

			quotes[i].removeAttribute('cite');

			}

		}

	}



// Ins and Del tags citations

function insdelCite()

	{

	if (!document.createElementNS)

		{

		document.createElementNS = function(ns, elt)

			{

			return document.createElement(elt);

			}

		}

	var insdel = new Array(2);

	insdel[0] = document.getElementsByTagName('ins');

	insdel[1] = document.getElementsByTagName('del');

	for (var i=0; i<insdel.length; i++)

		{

		if (insdel[i])

			{

			for (var id=0; id<insdel[i].length; id++)

				{

				var isdl = insdel[i][id].getAttribute('cite');

				if ((isdl) && (isdl != ""))

					{

					idlink = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');

					idlink.setAttribute('href', isdl);

					idlink.className = 'cite-link ' + (i == 0 ? 'ins-cite' : 'del-cite');

					idlink.setAttribute('title','citation of ' + (i == 0 ? 'added' : 'deleted') + ' text');

					idlink.appendChild(document.createTextNode('#'));

					insdel[i][id].appendChild(idlink);

					insdel[i][id].removeAttribute('cite');

					}

				}

			}

		}

	}



// Force IE not to show alternate text as tooltip

function noAltTooltip()

	{

	images = document.getElementsByTagName('img');

	for (var i = 0; i < images.length; i++)

		{

		var title = images[i].getAttribute('title');

		var alt = images[i].getAttribute('alt');

		if ((document.all) && (alt) && (!title))

			{

			images[i].setAttribute('title', '');

			}

		}

	}



// Nice Titles



// original code by Stuart Langridge 2003-11

// with additions to the code by other good people

// http://www.kryogenix.org/code/browser/nicetitle/

// thank you, sir



// modified by Peter Janes 2003-03-25

// http://peterjanes.ca/blog/archives/2003/03/25/nicetitles-for-ins-and-del

// added in ins and del tags



// modified by Dunstan Orchard 2003-11-18

// http://1976design.com/blog/

// added in accesskey information

// tried ever-so-hard, but couldn't work out how to do what Ethan did



// final genius touch by by Ethan Marcotte 2003-11-18

// http://www.sidesh0w.com/

// worked out how to delay showing the popups to make them more like the browser's own



// set the namespace

var XHTMLNS = 'http://www.w3.org/1999/xhtml';

var CURRENT_NICE_TITLE;



// browser sniff

var browser = new Browser();



// determine browser and version.

function Browser()

	{

	var ua, s, i;



	this.isIE = false;

	this.isNS = false;

	this.version = null;



	ua = navigator.userAgent;



	s = 'MSIE';

	if ((i = ua.indexOf(s)) >= 0)

		{

		this.isIE = true;

		this.version = parseFloat(ua.substr(i + s.length));

		return;

		}



	s = 'Netscape6/';

	if ((i = ua.indexOf(s)) >= 0)

		{

		this.isNS = true;

		this.version = parseFloat(ua.substr(i + s.length));

		return;

		}



	// treat any other 'Gecko' browser as NS 6.1.

	s = 'Gecko';

	if ((i = ua.indexOf(s)) >= 0)

		{

		this.isNS = true;

		this.version = 6.1;

		return;

		}

	}



// 2003-11-19 sidesh0w

// set delay vars to emulate normal hover delay

var delay;

var interval = 0.60;



// this function runs on window load

// it runs through all the links on the page as starts listening for actions

function makeNiceTitles()

	{

	if (!document.createElement || !document.getElementsByTagName) return;

	if (!document.createElementNS)

		{

		document.createElementNS = function(ns, elt)

			{

			return document.createElement(elt);

			}

		}



	// do regular links

	if (!document.links)

		{

		document.links = document.getElementsByTagName('a');

		}

	for (var ti=0; ti<document.links.length; ti++)

		{

		var lnk = document.links[ti];

		// * I added specific class names here..

		if (lnk.title)

			{

			lnk.setAttribute('nicetitle', lnk.title);

			lnk.removeAttribute('title');

			addEvent(lnk, 'mouseover', showDelay);

			addEvent(lnk, 'mouseout', hideNiceTitle);

			addEvent(lnk, 'focus', showDelay);

			addEvent(lnk, 'blur', hideNiceTitle);

			}

		}



	// 2003-03-25 Peter Janes

	// do ins and del tags

	var tags = new Array(2);

	tags[0] = document.getElementsByTagName('ins');

	tags[1] = document.getElementsByTagName('del');

	for (var tt=0; tt<tags.length; tt++)

		{

		if (tags[tt])

			{

			for (var ti=0; ti<tags[tt].length; ti++)

				{

				var tag = tags[tt][ti];

				if (tag.dateTime)

					{

					var strDate = tag.dateTime;

					// HTML/ISO8601 date: yyyy-mm-ddThh:mm:ssTZD (Z, -hh:mm, +hh:mm)

					var month = strDate.substring(5,7);

					var day = strDate.substring(8,10);

					if (month[0] == '0')

						{

						month = month[1];

						}

					if (day[0] == '0')

						{

						day = day[1];

						}

					var dtIns = new Date(strDate.substring(0,4), month-1, day, strDate.substring(11,13), strDate.substring(14,16), strDate.substring(17,19));

					tag.setAttribute('nicetitle', (tt == 0 ? 'Added' : 'Deleted') + ' on ' + dtIns.toString());

					addEvent(tag, 'mouseover', showDelay);

					addEvent(tag, 'mouseout', hideNiceTitle);

					addEvent(tag, 'focus', showDelay);

					addEvent(tag, 'blur', hideNiceTitle);

					}

				}

			}

		}

	}



function findPosition(oLink)

	{

	if (oLink.offsetParent)

		{

		for (var posX = 0, posY = 0; oLink.offsetParent; oLink = oLink.offsetParent)

			{

			posX += oLink.offsetLeft;

			posY += oLink.offsetTop;

			}

		return [posX, posY];

		}

	else

		{

		return [oLink.x, oLink.y];

		}

	}



function getParent(el, pTagName)

	{

	if (el == null)

		{

		return null;

		}

	// gecko bug, supposed to be uppercase

	else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())

		{

		return el;

		}

	else

		{

		return getParent(el.parentNode, pTagName);

		}

	}



// 2003-11-19 sidesh0w

// trailerpark wrapper function

function showDelay(e)

	{

    if (window.event && window.event.srcElement)

		{

        lnk = window.event.srcElement

		}

	else if (e && e.target)

		{

        lnk = e.target

		}

    if (!lnk) return;



	// lnk is a textnode or an elementnode that's not ins/del

    if (lnk.nodeType == 3 || (lnk.nodeType == 1 && lnk.tagName.toLowerCase() != 'ins' && lnk.tagName.toLowerCase() != 'del'))

		{

		// ascend parents until we hit a link

		lnk = getParent(lnk, 'a');

		}



	delay = setTimeout("showNiceTitle(lnk)", interval * 1000);

	}



// build and show the nice titles

function showNiceTitle(link)

	{

    if (CURRENT_NICE_TITLE) hideNiceTitle(CURRENT_NICE_TITLE);

    if (!document.getElementsByTagName) return;



    nicetitle = lnk.getAttribute('nicetitle');



    var d = document.createElementNS(XHTMLNS, 'div');

    d.className = 'nicetitle';

    var dc = document.createElementNS(XHTMLNS, 'div');

    dc.className = 'nicetitle-content';

    d.appendChild(dc);

    tnt = document.createTextNode(nicetitle);

    pat = document.createElementNS(XHTMLNS, 'p');

    pat.className = 'titletext';

    pat.appendChild(tnt);



	// 2003-11-18 Dunstan Orchard

	// added in accesskey info

	if (lnk.accessKey)

		{

        axs = document.createTextNode(' [' + lnk.accessKey + ']');

		axsk = document.createElementNS(XHTMLNS, 'span');

        axsk.className = 'accesskey';

        axsk.appendChild(axs);

		pat.appendChild(axsk);

		}

    dc.appendChild(pat);



    if (lnk.href)

		{

        tnd = document.createTextNode(lnk.href);

        pad = document.createElementNS(XHTMLNS, 'p');

        pad.className = 'destination';

        pad.appendChild(tnd);

        dc.appendChild(pad);

		}



    STD_WIDTH = 300;



	if (lnk.href)

		{

        h = lnk.href.length;

		}

	else

		{

		h = nicetitle.length;

		}



    if (nicetitle.length)

		{

		t = nicetitle.length;

		}



    h_pixels = h*6;

	t_pixels = t*10;



    if (h_pixels > STD_WIDTH)

		{

        w = h_pixels;

		}

	else if ((STD_WIDTH>t_pixels) && (t_pixels>h_pixels))

		{

        w = t_pixels;

		}

	else if ((STD_WIDTH>t_pixels) && (h_pixels>t_pixels))

		{

        w = h_pixels;

		}

	else

		{

        w = STD_WIDTH;

		}



    d.style.width = w + 'px';



    mpos = findPosition(lnk);

    mx = mpos[0];

    my = mpos[1];



    d.style.left = (mx+15) + 'px';

    d.style.top = (my+35) + 'px';



    if (window.innerWidth && ((mx+w) > window.innerWidth))

		{

        d.style.left = (window.innerWidth - w - 25) + 'px';

		}

    if (document.body.scrollWidth && ((mx+w) > document.body.scrollWidth))

		{

        d.style.left = (document.body.scrollWidth - w - 25) + 'px';

		}



    document.getElementsByTagName('body')[0].appendChild(d);



    CURRENT_NICE_TITLE = d;

	}



function hideNiceTitle(e)

	{

	// 2003-11-19 sidesh0w

	// clearTimeout

	if (delay) clearTimeout(delay);

	if (!document.getElementsByTagName) return;

	if (CURRENT_NICE_TITLE)

		{

		document.getElementsByTagName('body')[0].removeChild(CURRENT_NICE_TITLE);

		CURRENT_NICE_TITLE = null;

		}

	}



addEvent(window, "load", floatImages);

addEvent(window, "resize", floatImages);

addEvent(window, "load", blockquoteCite);

addEvent(window, "load", insdelCite);

addEvent(window, "load", noAltTooltip);

addEvent(window, "load", makeNiceTitles);



// I'm very poor in JavaScript. Please correct me if I'm wrong.
