mirror of
https://github.com/e107inc/e107.git
synced 2025-01-18 05:09:05 +01:00
525 lines
13 KiB
JavaScript
525 lines
13 KiB
JavaScript
function setActiveStyleSheet(title) {
|
|
var i, a, main;
|
|
for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
|
|
if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
|
|
a.disabled = true;
|
|
if(a.getAttribute("title") == title) a.disabled = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
function getActiveStyleSheet() {
|
|
var i, a;
|
|
for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
|
|
if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled) return a.getAttribute("title");
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function getPreferredStyleSheet() {
|
|
var i, a;
|
|
for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
|
|
if(a.getAttribute("rel").indexOf("style") != -1
|
|
&& a.getAttribute("rel").indexOf("alt") == -1
|
|
&& a.getAttribute("title")
|
|
) return a.getAttribute("title");
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function createCookie(name,value,days) {
|
|
if (days) {
|
|
var date = new Date();
|
|
date.setTime(date.getTime()+(days*24*60*60*1000));
|
|
var expires = "; expires="+date.toGMTString();
|
|
}
|
|
else expires = "";
|
|
document.cookie = name+"="+value+expires+"; path=/";
|
|
}
|
|
|
|
function readCookie(name) {
|
|
var nameEQ = name + "=";
|
|
var ca = document.cookie.split(';');
|
|
for(var i=0;i < ca.length;i++) {
|
|
var c = ca[i];
|
|
while (c.charAt(0)==' ') c = c.substring(1,c.length);
|
|
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
window.onload = function(e) {
|
|
var cookie = readCookie("style");
|
|
var title = cookie ? cookie : getPreferredStyleSheet();
|
|
setActiveStyleSheet(title);
|
|
}
|
|
|
|
window.onunload = function(e) {
|
|
var title = getActiveStyleSheet();
|
|
createCookie("style", title, 365);
|
|
}
|
|
|
|
var cookie = readCookie("style");
|
|
var title = cookie ? cookie : getPreferredStyleSheet();
|
|
setActiveStyleSheet(title);
|
|
|
|
|
|
|
|
// 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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|