/**
    Common util functions
*/

lstrip = function (str, /* optional */chars) {
    str = str + "";
    if (typeof(str) != "string") {
        return null;
    }
    if (!chars) {
        return str.replace(/^\s+/, "");
    } else {
        return str.replace(new RegExp("^[" + chars + "]+"), "");
    }
};

rstrip = function (str, /* optional */chars) {
    str = str + "";
    if (typeof(str) != "string") {
        return null;
    }
    if (!chars) {
        return str.replace(/\s+$/, "");
    } else {
        return str.replace(new RegExp("[" + chars + "]+$"), "");
    }
};

strip = function (str, /* optional */chars) {
    return rstrip(lstrip(str, chars), chars);
};


if (!window.Node) {
   window.Node = {
      ELEMENT_NODE : 1,
      ATTRIBUTE_NODE : 2,
      TEXT_NODE : 3,
      CDATA_SECTION_NODE : 4,
      ENTITY_REFERENCE_NODE : 5,
      ENTITY_NODE : 6,
      PROCESSING_INSTRUCTIONS_NODE : 7,
      COMMENT_NODE : 8,
      DOCUMENT_NODE : 9,
      DOCUMENT_TYPE_NODE : 10,
      DOCUMENT_FRAGMENT_NODE : 11,
      NOTATION_NODE : 12
   }
}

// See: http://simon.incutio.com/archive/2003/06/15/javascriptWithXML
var XHTML_NS = 'http://www.w3.org/1999/xhtml';
function createElement(el) {
    var self = arguments.callee;
    if (!self.createElement) {
        if (typeof document.createElementNS != 'undefined') {
            self.createElement = function(el) { return document.createElementNS(XHTML_NS, el); };
        }
        if (typeof document.createElement != 'undefined') {
            self.createElement = function(el) { return document.createElement(el); };
        }
    }
    return self.createElement(el);
}

function appendChildNodes(parent, nodes) {
    for (var i=0; i<nodes.length; i++) {
        var node = nodes[i];
        if (node.nodeType) 
            parent.appendChild(node);
        else if ( (typeof(node) == 'object') && node.length)
            appendChildNodes(parent, node);
        else
            parent.appendChild(document.createTextNode(''+node));
    }
}

function createDOM(name, attrs, nodes) {
    var elem = createElement(name);
    if (attrs) for (k in attrs) {
        var v = attrs[k];

        if (k.substring(0, 2) == "on") {
            if (typeof(v) == "string") {
                v = new Function(v);
            }
            elem[k] = v;
        } else {
            elem.setAttribute(k, v);
        }

        switch(k) {
            // MSIE seems to want this.
            case 'class': elem.className = v; break;
        }
    }
    if (nodes) appendChildNodes(elem, nodes);
    return elem;
}
window.EL = createDOM;

function createDOMFunc(name) {
    return function(attrs) {
        var nodes = [];
        for (var i=1; i<arguments.length; i++) 
            nodes[nodes.length] = arguments[i];
        return createDOM(name, attrs, nodes);
    }
}

forEach([ 
    'A', 'BUTTON', 'BR', 'CANVAS', 'DIV', 'FIELDSET', 'FORM',
    'H1', 'H2', 'H3', 'HR', 'IMG', 'INPUT', 'LABEL', 'LEGEND', 'LI', 'OL',
    'OPTGROUP', 'OPTION', 'P', 'PRE', 'SELECT', 'SPAN', 'STRONG', 'TABLE', 'TBODY',
    'TD', 'TEXTAREA', 'TFOOT', 'TH', 'THEAD', 'TR', 'TT', 'UL' 
], function(n) { window[n] = createDOMFunc(n); });


