﻿
function ContensisElement(htmlElement)
{
    if (!htmlElement) { return htmlElement; }  
    if (!htmlElement.nodeType) { return htmlElement; }
    if (htmlElement.nodeType != 1) { return htmlElement; }
         
    if (htmlElement.IsContensisElement) { return htmlElement; }    
    
    window.CCN.RegisterElement(htmlElement)
    window.CCN.RegisterExtension(htmlElement, 'IsContensisElement');
    htmlElement.IsContensisElement = true;
    
    window.CCN.RegisterExtension(htmlElement, 'get_ClassRegEx');
    htmlElement.get_ClassRegEx = function(className) { return "(^|\\s)" + className + "(\\s|$)"; };
    
    window.CCN.RegisterExtension(htmlElement, 'HasClass');
    htmlElement.HasClass = function(className){
        var elClass = this.className;
        if (elClass.length == 0) { return false; }
        if (elClass == className) { return true; }
        var reg = new RegExp(this.get_ClassRegEx(className));
        return reg.test(elClass);
    };
    
    window.CCN.RegisterExtension(htmlElement, 'AddClass');
    htmlElement.AddClass = function(className){
        if (!this.HasClass(className))
        {
            var elClass = this.className;
            if (elClass) { elClass += ' '; }
            elClass += className;
            this.className = elClass;                        
        }
    };
    
    window.CCN.RegisterExtension(htmlElement, 'RemoveClass');
    htmlElement.RemoveClass = function(className){
        if (this.HasClass(className))
        {
            var elClass = this.className;
            var reg = new RegExp(this.get_ClassRegEx(className));
            elClass = elClass.replace(reg, ' ');
            elClass = elClass.Trim();
            this.className = elClass;            
        }
    };
    
    window.CCN.RegisterExtension(htmlElement, 'ToggleClass');
    htmlElement.ToggleClass = function(className){
        if (this.HasClass(className))
        {
            this.RemoveClass(className);
        }
        else 
        {
            this.AddClass(className);
        }
    };
    //htmlElement.___getElementsByTagName = htmlElement.getElementsByTagName;
    
    window.CCN.RegisterExtension(htmlElement, 'getElementsByTag');
    htmlElement.getElementsByTag = function(tagName){
        var elements = this.getElementsByTagName(tagName);
        var result = [];
        for (var i=0; i<elements.length; i++)
        {
            result[result.length] = ContensisElement(elements[i]);
        }
        return result;
    };
    
    window.CCN.RegisterExtension(htmlElement, 'getParentByTagName');
    htmlElement.getParentByTagName = function(tagName){
        var el = this.parentNode;
        while (el)
        {
            if (!el.tagName) { return; }
            if (el.tagName.toUpperCase() == tagName.toUpperCase()) { break; }
            el = el.parentNode;
        }
        return ContensisElement(el);
    };   
    
    window.CCN.RegisterExtension(htmlElement, 'getParentElement');
    htmlElement.getParentElement = function(){
        return ContensisElement(this.parentNode);
    }; 
    
    window.CCN.RegisterExtension(htmlElement, 'getChildNodes');
    htmlElement.getChildNodes = function(){
        var children = this.childNodes;
        var result = [];
        for (var i=0; i<children.length; i++)
        {
            result[result.length] = ContensisElement(children[i]);
        }
        return result;
    };
    
    window.CCN.RegisterExtension(htmlElement, 'Clone');
    htmlElement.Clone = function(){
        return ContensisElement(this.cloneNode(true));
    };
    
    if (htmlElement.tagName == 'TABLE') { ContensisTable(htmlElement); }
    if (htmlElement.tagName == 'TBODY') { ContensisTableBody(htmlElement); }
    if (htmlElement.tagName == 'TR') { ContensisTableRow(htmlElement); }
    
    return htmlElement;
}

function ContensisTable(htmlTable)
{
    window.CCN.RegisterExtension(htmlTable, 'getRows');
    htmlTable.getRows = function(){
        var rows = this.rows;
        var result = [];
        for (var i=0; i<rows.length; i++)
        {
            result[result.length] = ContensisElement(rows[i]);
        }
        return result;
    };
    
    window.CCN.RegisterExtension(htmlTable, 'getBodies');
    htmlTable.getBodies = function(){
        var bodies = this.tBodies;
        var result = [];
        for (var i=0; i<bodies.length; i++)
        {
            result[result.length] = ContensisElement(bodies[i]);
        }
        return result;
    };
    
    window.CCN.RegisterExtension(htmlTable, 'getHead');
    htmlTable.getHead = function(){
        return ContensisElement(htmlTable.tHead);
    };
    
    window.CCN.RegisterExtension(htmlTable, 'getFoot');
    htmlTable.getFoot = function(){
        return ContensisElement(htmlTable.tFoot);
    };
}

function ContensisTableBody(htmlTable)
{
    window.CCN.RegisterExtension(htmlTable, 'getRows');
    htmlTable.getRows = function(){
        var rows = this.rows;
        var result = [];
        for (var i=0; i<rows.length; i++)
        {
            result[result.length] = ContensisElement(rows[i]);
        }
        return result;
    };
}    

function ContensisTableRow(htmlRow)
{
    window.CCN.RegisterExtension(htmlRow, 'getCells');
    htmlRow.getCells = function(){
        var cells = this.cells;
        var result = [];
        for (var i=0; i<cells.length; i++)
        {
            result[result.length] = ContensisElement(cells[i]);
        }
        return result;
    }
}
