
var boundElements = new Array();

/**
 * Create the XBL shadowtrees for the document that calls this function.
 * 
 * @author Mikko Pohja
 */

function runXBL()
{
    addDefaultStylesheet();
    
    evalScripts();
    
    // Add ElementXBL interface methods to all elements
    //addMethods();
    
    // Find all the bound elements from the bound document.
    findBoundElements()
    
    createShadowTrees();
}

function addMethods()
{
    var elems = document.getElementsByTagName("*");
    var count = elems.length;
    for (var i = 0; i < count; i++)
    {
        elems[i].addBinding = function (bindingURI)
        {
            alert("addBinding(), arg: " + bindingURI);
        }
        elems[i].removeBinding = function (bindingURI)
        {
            alert("removeBinding(), arg: " + bindingURI);
        }
        elems[i].hasBinding = function (bindingURI)
        {
            alert("hasBinding(), arg: " + bindingURI);
        }
    }
}

function findBoundElements()
{
    var bindings = document.getElementsByTagNameNS("http://www.w3.org/ns/xbl", "binding");
  
    // Find all the bound elements
    for (var i = 0; i < bindings.length; i++)
    {
        var binding = bindings.item(i);
      
        if (binding.hasAttribute("element"))
        {
            var selector = binding.getAttribute("element");
            //var bounds = getElementsBySelector(selector, null);
            var bounds = cssQuery(selector);
        
            for (var k = 0; k < bounds.length; k++)
            {
                addBoundElement(bounds[k], binding.cloneNode(true))
            }
        }
    }    
}

function createShadowTrees()
{
    // Apply bindings to the bound elements
    for (var i = 0; i < boundElements.length; i++)
    {
        var bound = boundElements[i];
        bound.applyBindings();
    }
}

function addBoundElement(bound, binding)
{
    var newBound = true;
    for (i = 0; i < boundElements.length; i++)
    {
        if (boundElements[i].getElement() == bound)
        {
            boundElements[i].addBinding(binding);
            newBound = false;
            break;
        }
    }
    
    if (newBound)
    {
        var boundElement = new BoundElement();
        boundElement.setElement(bound);
        boundElement.addBinding(binding);
        boundElements.push(boundElement);
    }
}

function evalScripts()
{
    var scriptElems = document.getElementsByTagNameNS("http://www.w3.org/ns/xbl", "script");
    for (var j = 0; j < scriptElems.length; j++)
    {
        var scriptElem = scriptElems.item(j);
        if (scriptElem.hasAttribute("src"))
        {
            var head = document.getElementsByTagName("head").item(0);
            var sElem = document.createElement("script");
            sElem.setAttribute("type", "text/javascript");
            sElem.setAttribute("src", scriptElem.getAttribute("src"));
            head.appendChild(sElem);
        }
        else
        {
            var head = document.getElementsByTagName("head").item(0);
            var sElem = document.createElement("script");
            sElem.setAttribute("type", "text/javascript");
            var textNode = document.createTextNode(scriptElem.textContent);
            sElem.appendChild(textNode);
            head.appendChild(sElem);
        }
    }
}

function addDefaultStylesheet()
{
    var headID = document.getElementsByTagName("head")[0];         
    var cssNode = document.createElement('style');
    
    var styles = document.createTextNode('\n @namespace xbl url(http://www.w3.org/ns/xbl); \n xbl|* { display: none; } \n xbl|div { display: block; } \n');
    cssNode.appendChild(styles);
    headID.appendChild(cssNode);
}

String.prototype.fulltrim = function()
{

return this.replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,"").replace(/\s+/g," ");

}


