﻿addEvent(window, "load", makeNiceTitles);

var XHTMLNS = "http://www.w3.org/1999/xhtml";
var CURRENT_NICE_TITLE;
var browser = new Browser();

function makeNiceTitles() {
    if (!document.createElement || !document.getElementsByTagName) return;
    // add namespace methods to HTML DOM; this makes the script work in both
    // HTML and XML contexts.
    if (!document.createElementNS) {
        document.createElementNS = function(ns, elt) {
            return document.createElement(elt);
        }
    }

    if (!document.links) {
        document.links = document.getElementsByTagName("a");
    }
    for (var ti = 0; ti < document.links.length; ti++) {
        var lnk = document.links[ti];
        if (lnk.title) {
            if (lnk.title.indexOf('{ANSWER}') > 0) {
                lnk.setAttribute("nicetitle", lnk.title);
                lnk.removeAttribute("title");
                addEvent(lnk, "mouseover", showNiceTitle);
                addEvent(lnk, "mouseout", hideNiceTitle);
                addEvent(lnk, "focus", showNiceTitle);
                addEvent(lnk, "blur", hideNiceTitle);
            }
        }
    }
    //    var instags = document.getElementsByTagName("ins");
    //    if (instags) {
    //    for (var ti=0;ti<instags.length;ti++) {
    //        var instag = instags[ti];
    //        if (instag.dateTime) {
    //            var strDate = instag.dateTime;
    //            var dtIns = new Date(strDate.substring(0,4),parseInt(strDate.substring(4,6)-1),strDate.substring(6,8),strDate.substring(9,11),strDate.substring(11,13),strDate.substring(13,15));
    //            instag.setAttribute("nicetitle","Added on "+dtIns.toString());
    //            addEvent(instag,"mouseover",showNiceTitle);
    //            addEvent(instag,"mouseout",hideNiceTitle);
    //            addEvent(instag,"focus",showNiceTitle);
    //            addEvent(instag,"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 showNiceTitle(e) {
    if (CURRENT_NICE_TITLE) hideNiceTitle(CURRENT_NICE_TITLE);
    if (!document.getElementsByTagName) return;
    if (window.event && window.event.srcElement) {
        lnk = window.event.srcElement
    } else if (e && e.target) {
        lnk = e.target
    }
    if (!lnk) return;
    if (lnk.nodeType == 3) {
        // lnk is a textnode -- ascend parents until we hit a link
        lnk = getParent(lnk, "A");
    }
    if (!lnk) return;
    nicetitle = lnk.getAttribute("nicetitle");

    var splitted = nicetitle.split("{ANSWER}");

    //    var dT = document.createElementNS(XHTMLNS,"div");
    //    dT.className = "panelt";
    //    var dB = document.createElementNS(XHTMLNS,"div");
    //    dB.className = "panelb";
    //    dT.appendChild(dB);
    //    var dL = document.createElementNS(XHTMLNS,"div");
    //    dL.className = "panell";
    //    dB.appendChild(dL);
    //    var dR = document.createElementNS(XHTMLNS,"div");
    //    dR.className = "panelr";
    //    dL.appendChild(dR);
    //    var dBL = document.createElementNS(XHTMLNS,"div");
    //    dBL.className = "panelbl";
    //    dR.appendChild(dBL);
    //    var dBR = document.createElementNS(XHTMLNS,"div");
    //    dBR.className = "panelbr";
    //    dBL.appendChild(dBR);
    //    var dTL = document.createElementNS(XHTMLNS,"div");
    //    dTL.className = "paneltl";
    //    dBL.appendChild(dTL);
    //    var dTR = document.createElementNS(XHTMLNS,"div");
    //    dTR.className = "paneltr";
    //    dTL.appendChild(dTR);

    var d = document.createElementNS(XHTMLNS, "div");
    d.className = "nicetitle";
    //    dTL.appendChild(d);

    tnt = document.createTextNode(splitted[0]);
    pat = document.createElementNS(XHTMLNS, "p");
    pat.className = "titletext";
    pat.appendChild(tnt);
    d.appendChild(pat);
    if (lnk.href) {
        tnd = document.createTextNode(splitted[1]);
        pad = document.createElementNS(XHTMLNS, "p");
        pad.className = "destination";
        pad.appendChild(tnd);
        d.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';

    /*
    mx = lnk.offsetLeft;
    my = lnk.offsetTop;
    */
    mpos = findPosition(lnk);
    mx = mpos[0];
    my = mpos[1];
    //xy = getMousePosition(e);
    //mx = xy[0]; my = xy[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) {
    if (!document.getElementsByTagName) return;
    if (CURRENT_NICE_TITLE) {
        document.getElementsByTagName("body")[0].removeChild(CURRENT_NICE_TITLE);
        CURRENT_NICE_TITLE = null;
    }
}

// Add an eventListener to browsers that can do it somehow.
// Originally by the amazing Scott Andrew.
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 getParent(el, pTagName) {
    if (el == null) return null;
    else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())	// Gecko bug, supposed to be uppercase
        return el;
    else
        return getParent(el.parentNode, pTagName);
}

function getMousePosition(event) {
    if (browser.isIE) {
        x = window.event.clientX + document.documentElement.scrollLeft
      + document.body.scrollLeft;
        y = window.event.clientY + document.documentElement.scrollTop
      + document.body.scrollTop;
    }
    if (browser.isNS) {
        x = event.clientX + window.scrollX;
        y = event.clientY + window.scrollY;
    }
    return [x, y];
}

// Determine browser and version.

function Browser() {
    // blah, browser detect, but mouse-position stuff doesn't work any other way
    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;
    }
}

