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) }