User:Zocky/foolib.js
From Wikipedia
Note: After saving, you may have to bypass your browser's cache to see the changes. Mozilla / Firefox / Safari: hold down Shift while clicking Reload, or press Ctrl-Shift-R (Cmd-Shift-R on Apple Mac); IE: hold Ctrl while clicking Refresh, or press Ctrl-F5; Konqueror:: simply click the Reload button, or press F5; Opera users may need to completely clear their cache in Tools→Preferences.
/*
debug, >/dev/null for now, may be redefined
*/
var debug$=function(e,f){alert(e + f.toSource())};
/*
GENERAL SHORTCUTS
*/
/*
is el a dom element? - silly test, there must be better ways
*/
var $is = function (el) { return el && typeof el =='object' && 'nodeType' in el };
/*
if the argument is an element, return it, otherwise try to find the element with the given id
*/
var $ = function (idel)
{
return $is(idel) ? idel : document.getElementById(idel);
}
/*
if the argument is an element, return its id, otherwise return the string
*/
var $id = function (idel)
{
return $is(idel) ? idel : document.getElementById(idel);
}
/*
create new element
*/
var new$ = function (tag,doc)
{
return (doc||document).createElement(tag);
}
/*
create a div containing either an element or a piece of html code
*/
var wrap$ = function (elcode)
{
var f=document.createElement('div');
if ($is(elcode))
{
f.appendChild(elcode)
return f;
}
else try
{
f.innerHTML=elcode;
return f;
}
catch (e)
{
debug$(e,this);
return false;
}
}
/*
if the argument is an element, return its content, otherwise return the string
*/
var $code = function (elcode)
{
var wrap=wrap$(elcode);
return wrap.fistChild ? wrap.innerHTML : false;
}
/*
shortcuts for getting and setting attributes
*/
var $attr = function (idel,name)
{
return $(idel) && $(idel).getAttribute(name)
}
var attr$ = function (idel,name,value)
{
return $(idel) && $(idel).setAttribute(name,value)
}
/*
shortcuts for getting and setting values
*/
var $val = function (idel)
{
var el=idel;
if (!el) return false;
if ('value' in el) return el.value;
if ('textContent' in el) return el.textContent;
return false;
}
var val$ = function (idel,value)
{
var el=idel;
if (!el) return false;
if ('value' in el)
{
el.value = value;
return true;
}
else if ('textContent' in el)
{
el.textContent = value;
return true;
}
else return false;
}
/*
PLACEMENT SHORTCUTS
*/
/*
place elcode at the bottom of idel
*/
var bottom$ =function(idel,elcode)
{
var el=$(idel);
var wrap=wrap$(elcode);
try
{
el.innerHTML=el.innerHTML+wrap.innerHTML;
return true;
}
catch (e)
{
debug$(e,this);return false
}
}
/*
place elcode at the top of idel
*/
var top$ =function(idel,elcode)
{
var el=$(idel);
var wrap=wrap$(elcode);
try
{
el.innerHTML=wrap.innerHTML+el.innerHTML;
return true;
}
catch (e)
{
debug$(e,this);return false
}
}
/*
place elcode over the content of idel
*/
var over$=function(idel,elcode)
{
var el=$(idel);
var wrap=wrap$(elcode);
try
{
el.innerHTML=wrap.innerHTML;
return true;
}
catch (e)
{
debug$(e,this);return false
}
}
/*
place elcode before idel
*/
var before$=function(idel,elcode)
{
var el=$(idel);
var wrap=wrap$(elcode);
try
{
if (wrap.firstChild)
{
var i=wrap.firstChild;
do
{
el.parentNode.insertBefore(i.cloneNode(true),el);
} while (i=i.nextSibling)
}
return true;
}
catch (e)
{
debug$(e,this);return false
}
}
/*
place elcode after idel
*/
var after$=function(idel,elcode)
{
var el=$(idel);
var wrap=wrap$(elcode);
try
{
if (wrap.firstChild)
{
if (el.nextSibling)
{
for (var i=wrap.firstChild;i;i=i.nextSibling)
{
el.parentNode.insertBefore(i.cloneNode(true),el.nextSibling);
}
return true;
}
else return bottom$(el.parentNode,elcode);
}
return true;
}
catch (e)
{
debug$(e,this);return false
}
}
/*
replace elcode with idel
*/
var replace$=function(idel,elcode)
{
var el=$(idel);
try
{
return before$(idel,elcode) && $el.parent.removeChild(el);
return true;
}
catch (e)
{
debug$(e,this);return false
}
}
/*
place elcode at specified position relative to idel
*/
var insert$=function(elcode, where, idel)
{
switch(where)
{
case 'top' : return top$ (idel,elcode); break;
case 'before' : return before$ (idel,elcode); break;
case 'over' : return over$ (idel,elcode); break;
case 'replace' : return replace$ (idel,elcode); break;
case 'after' : return after$ (idel,elcode); break;
case 'bottom' :
default : return bottom$ (idel,elcode);
}
}
/*
load url and callback
*/
function load$(url,callback)
{
var x = new XMLHttpRequest();
x.onreadystatechange=function()
{
if (x.readyState==4)
{
if (x.status==200)
{
callback(x.responseText);
}
else callback(false);
}
}
x.open("GET",url,true);
x.setRequestHeader('Accept','text/*');
x.send(null);
return x;
}
/*
load and place into document
*/
var loadAndPlace$ = function (url,where,place)
{
load$
(
url,
function(t)
{
insert$(t,where,place)
}
);
}
/*
xPath shortcuts
*/
var $x = function (idel)
{
return "//*[id='" + $id(idel) + "']";
}
var x$nodes=function(x,ref)
{
try
{
return document.evaluate(x, $(ref)||document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
}
catch (e) {debug$(e,this);return false;}
};
var x$node=function(x,ref)
{
try
{
return document.evaluate(x, $(ref)||document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}
catch (e) {debug$(e,this);return false;}
};
var x$string=function(x,ref)
{
try
{
return document.evaluate(x, $(ref)||document, null, XPathResult.STRING_TYPE, null).stringValue;
}
catch (e) {debug$(e,this);return false;}
};
/*
iterate through a nodeset
*/
var x$doforeach=function(callback,x,ref)
{
try
{
var nodes=x$nodes(x,ref);
for ( var j=0 ; j < nodes.snapshotLength; j++ )
{
callback(nodes.snapshotItem(j));
}
}
catch (e)
{
debug$(e,this);return false
}
}
/*
create empty xml document
*/
var x$newDoc =function()
{
try { return document.implementation.createDocument("", "", null); }
catch (e) {debug$(e,this);return false;}
}
/*
create an xml document from code
*/
var x$doc=function(code)
{
var parser = new DOMParser();
return parser.parseFromString('<?xml version="1.0" encoding="UTF-8"?>'+code,"text/xml")
}
/*
create an xslt processor from code
*/
var x$proc=function(code)
{
var xslt = new XSLTProcessor();
xslt.importStylesheet
(
x$doc
(
'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">'
+ code
+ '</xsl:stylesheet>'
)
);
return xslt;
}
/*
process xml to document fragment
*/
var x$transform=function(xml,xslt,doc)
{
return xslt.transformToFragment(xml, doc || document)
}

