/**
 * Document Object Model functions
 *
 * Copyright: (c)2007 CK Web Technologies - http://www.ckweb.com.au/
 * Author:    Chris Knowles <chris.knowles@ckweb.com.au>
 * Version:   $Id: DOM.js 2 2008-07-23 08:02:22Z Chris $
 */

if (!CKW) {
    var CKW = function(){};
}

CKW.DOM =
{
    id: function(id)
    {
        return document.getElementById(id);
    },
    
    appendClass: function(elm, className)
    {
        elm = CKW.DOM.getElement(elm);
        if (elm.className != undefined) {
            elm.className = elm.className + " " + className;
        }
    },
    
    removeClass: function(elm, className) 
    {
        elm = CKW.DOM.getElement(elm);
        if (elm.className != undefined) {
            elm.className = elm.className.replace(new RegExp(className + "\\b"), "");
        }
    },
    
    hasClass: function(elm, className)
    {
        elm = CKW.DOM.getElement(elm);
        if (elm.className == className) {
            return true;
        } else {
            var classes = elm.className.split(" ");
            for (var i = 0, len = classes.length; i < len; i++) {
                if (className == classes[i]) {
                    return true;
                }
            }
        }
        return false;
    },

    tags: function(tagName, elm)
    {
        if (!elm) {
            elm = document;
        } else {
            elm = CKW.DOM.getElement(elm);
        }
        return elm.getElementsByTagName(tagName);
    },

    className: function(className, root)
    {
        if (!root) {
            root = document;
        }
        var tags = [];
        for(var elm = root.firstChild; elm != null; elm = elm.nextSibling) {
            if (elm.nodeType == 1) {
                if (CKW.DOM.hasClass(elm, className)) {
                    tags.push(elm);
                } 
                if (elm.hasChildNodes()) {
                    var childTags = CKW.DOM.className(className, elm);
                    if (childTags) {
                        for (var i = 0; i < childTags.length; i++) {
                            tags.push(childTags[i]);
                        }
                    }
                }
            }
        }
        return tags;
    },
    
    classTags: function(tagName, className, root)
    {
        if (!root) {
            root = document;
        }
        var tagSet = CKW.DOM.tags(tagName, root);
        var tags = [];
        for (var i = 0; i < tagSet.length; i++) {
            if (CKW.DOM.hasClass(tagSet[i], className)) {
                tags.push(tagSet[i]);
            }
        }
        return tags;
    },

    setContent: function(elm, content)
    {
        elm = CKW.DOM.getElement(elm);
        if (elm != undefined && content != undefined) {
            elm.innerHTML = content;
            return true;
        }
        return false;
    },

    getContent: function(elm)
    {
        elm = CKW.DOM.getElement(elm);
        var content = elm.innerHTML;
        if (content != undefined) {
            return content;
        } else {
            return "";
        }
    },

    deleteContent: function(elm)
    {
        elm = CKW.DOM.getElement(elm);
        if (elm != undefined) {
            elm.innerHTML = false;
            return true;
        }
        return false;
    },
    
    reOrderElements: function(id, new_order)
    {
        var parent = document.getElementById(id);
        var children = [];
        for(var child = parent.firstChild; child != null; child = child.nextSibling) {
             if (child.nodeType == 1) {
                 children.push(child);
             }
        }
        for (var i = 0; i < new_order.length; i++) {
            parent.appendChild(children[new_order[i]]);
        }
    },
    
    getElement: function(elm)
    {
        if (typeof(elm) == 'string') {
            return CKW.DOM.id(elm);
        } else if (elm != undefined) {
            return elm;
        }
        return false;
    },
    
    remove: function(elm)
    {
        elm = CKW.DOM.getElement(elm);
        if (elm) {
            return elm.parentNode.removeChild(elm);
        }
        return false;
    },
    
    makeLastChild: function(elm)
    {
        elm = CKW.DOM.getElement(elm);
        if (elm) {
            return elm.parentNode.appendChild(elm);
        }
        return false;
    },
    
    insertBefore: function(before, elm)
    {
        before = CKW.DOM.getElement(before);
        elm = CKW.DOM.getElement(elm);
        if (before && elm) {
            return before.parentNode.insertBefore(elm, before);
        }
        return false;
    },
    
    replace: function(oldNode, newNode)
    {
        newNode = CKW.DOM.getElement(newNode);
        oldNode = CKW.DOM.getElement(oldNode);
        if (newNode && oldNode) {
            return oldNode.parentNode.replaceChild(newNode, oldNode);
        }
        return false;
    },
    
    create: function(tag, attributes)
    {
        var elm = document.createElement(tag);
        if (attributes) {
            for (att in attributes) {
                if (att == 'content') {
                    CKW.DOM.setContent(elm, attributes[att]);
                } else if (att == 'id') {
                    elm.id = attributes[att];
                } else if (att == 'className') {
                    elm.className = attributes[att];
                } else {
                    elm.style[att] = attributes[att];
                }
            }
        }
        return elm;
    }
    
}

var $D = CKW.DOM;